VirtualBox

Changeset 103642 in vbox


Ignore:
Timestamp:
Mar 2, 2024 1:01:44 AM (13 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
162002
Message:

VMM/IEM: Use native emitter for the memory variants in IEMOP_BODY_BINARY_rv_rm when available. bugref:10376

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstCommonBodyMacros.h

    r103640 r103642  
    136136            case IEMMODE_16BIT: \
    137137                IEM_MC_BEGIN(3, 1, a_f16BitMcFlag, 0); \
    138                 IEM_MC_ARG(uint16_t *, pu16Dst, 0); \
     138                IEM_MC_LOCAL(RTGCPTR,  GCPtrEffDst); \
     139                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \
     140                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    139141                IEM_MC_ARG(uint16_t,   u16Src,  1); \
    140                 IEM_MC_ARG(uint32_t *, pEFlags, 2); \
    141                 IEM_MC_LOCAL(RTGCPTR,  GCPtrEffDst); \
    142                 \
    143                 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \
    144                 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    145142                IEM_MC_FETCH_MEM_U16(u16Src, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    146                 IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    147                 IEM_MC_REF_EFLAGS(pEFlags); \
    148                 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU16, pu16Dst, u16Src, pEFlags); \
    149                 \
     143                IEM_MC_NATIVE_IF(a_fNativeArchs) { \
     144                    IEM_MC_LOCAL(uint16_t,  u16Dst); \
     145                    IEM_MC_FETCH_GREG_U16(u16Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
     146                    /** @todo IEM_MC_LOCAL_EFLAGS(uEFlags); */ \
     147                    IEM_MC_LOCAL(uint32_t,  uEFlags); \
     148                    IEM_MC_FETCH_EFLAGS(uEFlags); \
     149                    IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_EmitterBasename,_r_r_efl), u16Dst, u16Src, uEFlags, 16); \
     150                    IEM_MC_STORE_GREG_U16(IEM_GET_MODRM_REG(pVCpu, bRm), u16Dst); \
     151                    IEM_MC_COMMIT_EFLAGS(uEFlags); \
     152                } IEM_MC_NATIVE_ELSE() { \
     153                    IEM_MC_ARG(uint16_t *, pu16Dst, 0); \
     154                    IEM_MC_REF_GREG_U16(pu16Dst, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
     155                    IEM_MC_ARG(uint32_t *, pEFlags, 2); \
     156                    IEM_MC_REF_EFLAGS(pEFlags); \
     157                    IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU16, pu16Dst, u16Src, pEFlags); \
     158                } IEM_MC_NATIVE_ENDIF(); \
    150159                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    151160                IEM_MC_END(); \
     
    154163            case IEMMODE_32BIT: \
    155164                IEM_MC_BEGIN(3, 1, IEM_MC_F_MIN_386, 0); \
    156                 IEM_MC_ARG(uint32_t *, pu32Dst, 0); \
     165                IEM_MC_LOCAL(RTGCPTR,  GCPtrEffDst); \
     166                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \
     167                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    157168                IEM_MC_ARG(uint32_t,   u32Src,  1); \
    158                 IEM_MC_ARG(uint32_t *, pEFlags, 2); \
    159                 IEM_MC_LOCAL(RTGCPTR,  GCPtrEffDst); \
    160                 \
    161                 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \
    162                 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    163169                IEM_MC_FETCH_MEM_U32(u32Src, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    164                 IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    165                 IEM_MC_REF_EFLAGS(pEFlags); \
    166                 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU32, pu32Dst, u32Src, pEFlags); \
    167                 \
    168                 if (a_fModifiesDstReg) \
    169                     IEM_MC_CLEAR_HIGH_GREG_U64(IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
     170                IEM_MC_NATIVE_IF(a_fNativeArchs) { \
     171                    IEM_MC_LOCAL(uint32_t,  u32Dst); \
     172                    IEM_MC_FETCH_GREG_U32(u32Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
     173                    /** @todo IEM_MC_LOCAL_EFLAGS(uEFlags); */ \
     174                    IEM_MC_LOCAL(uint32_t,  uEFlags); \
     175                    IEM_MC_FETCH_EFLAGS(uEFlags); \
     176                    IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_EmitterBasename,_r_r_efl), u32Dst, u32Src, uEFlags, 32); \
     177                    IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u32Dst); \
     178                    IEM_MC_COMMIT_EFLAGS(uEFlags); \
     179                } IEM_MC_NATIVE_ELSE() { \
     180                    IEM_MC_ARG(uint32_t *, pu32Dst, 0); \
     181                    IEM_MC_ARG(uint32_t *, pEFlags, 2); \
     182                    IEM_MC_REF_GREG_U32(pu32Dst, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
     183                    IEM_MC_REF_EFLAGS(pEFlags); \
     184                    IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU32, pu32Dst, u32Src, pEFlags); \
     185                    if (a_fModifiesDstReg) \
     186                        IEM_MC_CLEAR_HIGH_GREG_U64(IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
     187                } IEM_MC_NATIVE_ENDIF(); \
    170188                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    171189                IEM_MC_END(); \
     
    174192            case IEMMODE_64BIT: \
    175193                IEM_MC_BEGIN(3, 1, IEM_MC_F_64BIT, 0); \
    176                 IEM_MC_ARG(uint64_t *, pu64Dst, 0); \
     194                IEM_MC_LOCAL(RTGCPTR,  GCPtrEffDst); \
     195                IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \
     196                IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    177197                IEM_MC_ARG(uint64_t,   u64Src,  1); \
    178                 IEM_MC_ARG(uint32_t *, pEFlags, 2); \
    179                 IEM_MC_LOCAL(RTGCPTR,  GCPtrEffDst); \
    180                 \
    181                 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \
    182                 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    183198                IEM_MC_FETCH_MEM_U64(u64Src, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    184                 IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
    185                 IEM_MC_REF_EFLAGS(pEFlags); \
    186                 IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU64, pu64Dst, u64Src, pEFlags); \
    187                 \
     199                IEM_MC_NATIVE_IF(a_fNativeArchs) { \
     200                    IEM_MC_LOCAL(uint64_t,  u64Dst); \
     201                    IEM_MC_FETCH_GREG_U64(u64Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
     202                    /** @todo IEM_MC_LOCAL_EFLAGS(uEFlags); */ \
     203                    IEM_MC_LOCAL(uint32_t,  uEFlags); \
     204                    IEM_MC_FETCH_EFLAGS(uEFlags); \
     205                    IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_EmitterBasename,_r_r_efl), u64Dst, u64Src, uEFlags, 64); \
     206                    IEM_MC_STORE_GREG_U64(IEM_GET_MODRM_REG(pVCpu, bRm), u64Dst); \
     207                    IEM_MC_COMMIT_EFLAGS(uEFlags); \
     208                } IEM_MC_NATIVE_ELSE() { \
     209                    IEM_MC_ARG(uint64_t *, pu64Dst, 0); \
     210                    IEM_MC_ARG(uint32_t *, pEFlags, 2); \
     211                    IEM_MC_REF_GREG_U64(pu64Dst, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
     212                    IEM_MC_REF_EFLAGS(pEFlags); \
     213                    IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU64, pu64Dst, u64Src, pEFlags); \
     214                } IEM_MC_NATIVE_ENDIF(); \
    188215                IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    189216                IEM_MC_END(); \
Note: See TracChangeset for help on using the changeset viewer.

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