Changeset 46486 in vbox for trunk/src/VBox/VMM/VMMAll
- Timestamp:
- Jun 10, 2013 10:14:40 PM (12 years ago)
- Location:
- trunk/src/VBox/VMM/VMMAll
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAll.cpp
r46420 r46486 127 127 typedef VBOXSTRICTRC (__attribute__((__fastcall__)) * PFNIEMOP)(PIEMCPU pIemCpu); 128 128 # define FNIEMOP_DEF(a_Name) \ 129 static VBOXSTRICTRC __attribute__((__fastcall__, __nothrow__)) a_Name 129 static VBOXSTRICTRC __attribute__((__fastcall__, __nothrow__)) a_Name(PIEMCPU pIemCpu) 130 130 # define FNIEMOP_DEF_1(a_Name, a_Type0, a_Name0) \ 131 131 static VBOXSTRICTRC __attribute__((__fastcall__, __nothrow__)) a_Name(PIEMCPU pIemCpu, a_Type0 a_Name0) … … 8477 8477 #endif 8478 8478 #ifdef IN_RC 8479 rcStrict = iemRCRawMaybeReenter(pIemCpu, pVCpu, p Ctx, rcStrict);8479 rcStrict = iemRCRawMaybeReenter(pIemCpu, pVCpu, pIemCpu->CTX_SUFF(pCtx), rcStrict); 8480 8480 #endif 8481 8481 if (rcStrict != VINF_SUCCESS) -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h
r46389 r46486 6809 6809 /** Opcode 0x62. */ 6810 6810 FNIEMOP_STUB(iemOp_bound_Gv_Ma); 6811 /** Opcode 0x63. */ 6812 FNIEMOP_STUB(iemOp_arpl_Ew_Gw); /** @todo up next. */ 6811 6812 /** Opcode 0x63 - non-64-bit modes. */ 6813 FNIEMOP_STUB(iemOp_arpl_Ew_Gw); 6814 6815 6816 /** Opcode 0x63. 6817 * @note This is a weird one. It works like a regular move instruction if 6818 * REX.W isn't set, at least according to AMD docs (rev 3.15, 2009-11). */ 6819 FNIEMOP_DEF(iemOp_movsxd_Gv_Ev) 6820 { 6821 Assert(pIemCpu->enmEffOpSize == IEMMODE_64BIT); /* Caller branched already . */ 6822 6823 IEMOP_MNEMONIC("movsxd Gv,Ev"); 6824 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 6825 6826 if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT)) 6827 { 6828 /* 6829 * Register to register. 6830 */ 6831 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 6832 IEM_MC_BEGIN(0, 1); 6833 IEM_MC_LOCAL(uint64_t, u64Value); 6834 IEM_MC_FETCH_GREG_U32_SX_U64(u64Value, (bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB); 6835 IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Value); 6836 IEM_MC_ADVANCE_RIP(); 6837 IEM_MC_END(); 6838 } 6839 else 6840 { 6841 /* 6842 * We're loading a register from memory. 6843 */ 6844 IEM_MC_BEGIN(0, 2); 6845 IEM_MC_LOCAL(uint64_t, u64Value); 6846 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); 6847 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm); 6848 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 6849 IEM_MC_FETCH_MEM_U32_SX_U64(u64Value, pIemCpu->iEffSeg, GCPtrEffDst); 6850 IEM_MC_STORE_GREG_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pIemCpu->uRexReg, u64Value); 6851 IEM_MC_ADVANCE_RIP(); 6852 IEM_MC_END(); 6853 } 6854 return VINF_SUCCESS; 6855 } 6813 6856 6814 6857 … … 8578 8621 } 8579 8622 return VINF_SUCCESS; 8623 } 8624 8625 8626 /** Opcode 0x63. */ 8627 FNIEMOP_DEF(iemOp_arpl_Ew_Gw_movsx_Gv_Ev) 8628 { 8629 if (pIemCpu->enmCpuMode != IEMMODE_64BIT) 8630 return FNIEMOP_CALL(iemOp_arpl_Ew_Gw); 8631 if (pIemCpu->enmEffOpSize != IEMMODE_64BIT) 8632 return FNIEMOP_CALL(iemOp_mov_Gv_Ev); 8633 return FNIEMOP_CALL(iemOp_movsxd_Gv_Ev); 8580 8634 } 8581 8635 … … 15728 15782 /* 0x58 */ iemOp_pop_eAX, iemOp_pop_eCX, iemOp_pop_eDX, iemOp_pop_eBX, 15729 15783 /* 0x5c */ iemOp_pop_eSP, iemOp_pop_eBP, iemOp_pop_eSI, iemOp_pop_eDI, 15730 /* 0x60 */ iemOp_pusha, iemOp_popa, iemOp_bound_Gv_Ma, iemOp_arpl_Ew_Gw ,15784 /* 0x60 */ iemOp_pusha, iemOp_popa, iemOp_bound_Gv_Ma, iemOp_arpl_Ew_Gw_movsx_Gv_Ev, 15731 15785 /* 0x64 */ iemOp_seg_FS, iemOp_seg_GS, iemOp_op_size, iemOp_addr_size, 15732 15786 /* 0x68 */ iemOp_push_Iz, iemOp_imul_Gv_Ev_Iz, iemOp_push_Ib, iemOp_imul_Gv_Ev_Ib,
Note:
See TracChangeset
for help on using the changeset viewer.