VirtualBox

Changeset 46486 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Jun 10, 2013 10:14:40 PM (12 years ago)
Author:
vboxsync
Message:

IEM: movsxd

Location:
trunk/src/VBox/VMM/VMMAll
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAll.cpp

    r46420 r46486  
    127127typedef VBOXSTRICTRC (__attribute__((__fastcall__)) * PFNIEMOP)(PIEMCPU pIemCpu);
    128128# define FNIEMOP_DEF(a_Name) \
    129     static VBOXSTRICTRC __attribute__((__fastcall__, __nothrow__)) a_Name (PIEMCPU pIemCpu)
     129    static VBOXSTRICTRC __attribute__((__fastcall__, __nothrow__)) a_Name(PIEMCPU pIemCpu)
    130130# define FNIEMOP_DEF_1(a_Name, a_Type0, a_Name0) \
    131131    static VBOXSTRICTRC __attribute__((__fastcall__, __nothrow__)) a_Name(PIEMCPU pIemCpu, a_Type0 a_Name0)
     
    84778477#endif
    84788478#ifdef IN_RC
    8479     rcStrict = iemRCRawMaybeReenter(pIemCpu, pVCpu, pCtx, rcStrict);
     8479    rcStrict = iemRCRawMaybeReenter(pIemCpu, pVCpu, pIemCpu->CTX_SUFF(pCtx), rcStrict);
    84808480#endif
    84818481    if (rcStrict != VINF_SUCCESS)
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h

    r46389 r46486  
    68096809/** Opcode 0x62. */
    68106810FNIEMOP_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. */
     6813FNIEMOP_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). */
     6819FNIEMOP_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}
    68136856
    68146857
     
    85788621    }
    85798622    return VINF_SUCCESS;
     8623}
     8624
     8625
     8626/** Opcode 0x63. */
     8627FNIEMOP_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);
    85808634}
    85818635
     
    1572815782    /* 0x58 */  iemOp_pop_eAX,          iemOp_pop_eCX,          iemOp_pop_eDX,          iemOp_pop_eBX,
    1572915783    /* 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,
    1573115785    /* 0x64 */  iemOp_seg_FS,           iemOp_seg_GS,           iemOp_op_size,          iemOp_addr_size,
    1573215786    /* 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.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette