VirtualBox

Changeset 103643 in vbox


Ignore:
Timestamp:
Mar 2, 2024 1:38:31 AM (12 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
162003
Message:

VMM/IEM: Use native emitter for both variants in IEMOP_BODY_BINARY_r8_rm and for the reg/reg variant in IEMOP_BODY_BINARY_rm_r8_RO & IEMOP_BODY_BINARY_rm_r8_RW. bugref:10376

File:
1 edited

Legend:

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

    r103640 r103643  
    6161 * memory/register as the destination.
    6262 */
    63 #define IEMOP_BODY_BINARY_rm_r8_RW(a_fnNormalU8, a_fnLockedU8) \
     63#define IEMOP_BODY_BINARY_rm_r8_RW(a_fnNormalU8, a_fnLockedU8, a_EmitterBasename, a_fRegRegNativeArchs, a_fMemRegNativeArchs) \
    6464    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); \
    6565    \
     
    7070    { \
    7171        IEM_MC_BEGIN(3, 0, 0, 0); \
    72         IEM_MC_ARG(uint8_t *,  pu8Dst,  0); \
    73         IEM_MC_ARG(uint8_t,    u8Src,   1); \
    74         IEM_MC_ARG(uint32_t *, pEFlags, 2); \
    75          \
    7672        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     73        IEM_MC_ARG(uint8_t,         u8Src,   1); \
    7774        IEM_MC_FETCH_GREG_U8(u8Src, IEM_GET_MODRM_REG(pVCpu, bRm)); \
    78         IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    79         IEM_MC_REF_EFLAGS(pEFlags); \
    80         IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU8, pu8Dst, u8Src, pEFlags); \
    81          \
     75        IEM_MC_NATIVE_IF(a_fRegRegNativeArchs) { \
     76            IEM_MC_LOCAL(uint8_t,   u8Dst); \
     77            IEM_MC_FETCH_GREG_U8(u8Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
     78            /** @todo IEM_MC_LOCAL_EFLAGS(uEFlags); */ \
     79            IEM_MC_LOCAL(uint32_t,  uEFlags); \
     80            IEM_MC_FETCH_EFLAGS(uEFlags); \
     81            IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_EmitterBasename,_r_r_efl), u8Dst, u8Src, uEFlags, 8); \
     82            IEM_MC_STORE_GREG_U8(IEM_GET_MODRM_RM(pVCpu, bRm), u8Dst); \
     83            IEM_MC_COMMIT_EFLAGS(uEFlags); \
     84        } IEM_MC_NATIVE_ELSE() { \
     85            IEM_MC_ARG(uint8_t *,   pu8Dst,  0); \
     86            IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
     87            IEM_MC_ARG(uint32_t *,  pEFlags, 2); \
     88            IEM_MC_REF_EFLAGS(pEFlags); \
     89            IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU8, pu8Dst, u8Src, pEFlags); \
     90        } IEM_MC_NATIVE_ENDIF(); \
    8291        IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    8392        IEM_MC_END(); \
     
    139148 * operands.
    140149 */
    141 #define IEMOP_BODY_BINARY_rm_r8_RO(a_fnNormalU8) \
     150#define IEMOP_BODY_BINARY_rm_r8_RO(a_fnNormalU8, a_EmitterBasename, a_fRegRegNativeArchs, a_fMemRegNativeArchs) \
    142151    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); \
    143152    \
     
    148157    { \
    149158        IEM_MC_BEGIN(3, 0, 0, 0); \
    150         IEM_MC_ARG(uint8_t *,  pu8Dst,  0); \
    151         IEM_MC_ARG(uint8_t,    u8Src,   1); \
    152         IEM_MC_ARG(uint32_t *, pEFlags, 2); \
    153          \
    154159        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     160        IEM_MC_ARG(uint8_t,         u8Src,   1); \
    155161        IEM_MC_FETCH_GREG_U8(u8Src, IEM_GET_MODRM_REG(pVCpu, bRm)); \
    156         IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    157         IEM_MC_REF_EFLAGS(pEFlags); \
    158         IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU8, pu8Dst, u8Src, pEFlags); \
    159          \
     162        IEM_MC_NATIVE_IF(a_fRegRegNativeArchs) { \
     163            IEM_MC_LOCAL(uint8_t,   u8Dst); \
     164            IEM_MC_FETCH_GREG_U8(u8Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
     165            /** @todo IEM_MC_LOCAL_EFLAGS(uEFlags); */ \
     166            IEM_MC_LOCAL(uint32_t,  uEFlags); \
     167            IEM_MC_FETCH_EFLAGS(uEFlags); \
     168            IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_EmitterBasename,_r_r_efl), u8Dst, u8Src, uEFlags, 8); \
     169            IEM_MC_STORE_GREG_U8(IEM_GET_MODRM_RM(pVCpu, bRm), u8Dst); \
     170            IEM_MC_COMMIT_EFLAGS(uEFlags); \
     171        } IEM_MC_NATIVE_ELSE() { \
     172            IEM_MC_ARG(uint8_t *,   pu8Dst,  0); \
     173            IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); \
     174            IEM_MC_ARG(uint32_t *,  pEFlags, 2); \
     175            IEM_MC_REF_EFLAGS(pEFlags); \
     176            IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU8, pu8Dst, u8Src, pEFlags); \
     177        } IEM_MC_NATIVE_ENDIF(); \
    160178        IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    161179        IEM_MC_END(); \
     
    171189        { \
    172190            IEM_MC_BEGIN(3, 3, 0, 0); \
    173             IEM_MC_ARG(uint8_t const *, pu8Dst,          0); \
    174             IEM_MC_ARG(uint8_t,         u8Src,           1); \
    175             IEM_MC_ARG_LOCAL_EFLAGS(    pEFlags, EFlags, 2); \
    176191            IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
    177             IEM_MC_LOCAL(uint8_t, bUnmapInfo); \
    178             \
    179192            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
    180193            IEMOP_HLP_DONE_DECODING(); \
     194            \
     195            IEM_MC_LOCAL(uint8_t,       bUnmapInfo); \
     196            IEM_MC_ARG(uint8_t const *, pu8Dst,          0); \
    181197            IEM_MC_MEM_MAP_U8_RO(pu8Dst, bUnmapInfo, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     198            IEM_MC_ARG(uint8_t,         u8Src,           1); \
    182199            IEM_MC_FETCH_GREG_U8(u8Src, IEM_GET_MODRM_REG(pVCpu, bRm)); \
     200            IEM_MC_ARG_LOCAL_EFLAGS(    pEFlags, EFlags, 2); \
    183201            IEM_MC_FETCH_EFLAGS(EFlags); \
    184202            IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU8, pu8Dst, u8Src, pEFlags); \
     
    191209        else \
    192210        { \
     211            /** @todo we should probably decode the address first. */ \
    193212            IEMOP_HLP_DONE_DECODING(); \
    194213            IEMOP_RAISE_INVALID_LOCK_PREFIX_RET(); \
     
    201220 * destination.
    202221 */
    203 #define IEMOP_BODY_BINARY_r8_rm(a_fnNormalU8) \
     222#define IEMOP_BODY_BINARY_r8_rm(a_fnNormalU8, a_EmitterBasename, a_fNativeArchs) \
    204223    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); \
    205224    \
     
    211230        IEM_MC_BEGIN(3, 0, 0, 0); \
    212231        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
    213         IEM_MC_ARG(uint8_t *,  pu8Dst,  0); \
    214         IEM_MC_ARG(uint8_t,    u8Src,   1); \
    215         IEM_MC_ARG(uint32_t *, pEFlags, 2); \
    216         \
     232        IEM_MC_ARG(uint8_t,         u8Src,   1); \
    217233        IEM_MC_FETCH_GREG_U8(u8Src, IEM_GET_MODRM_RM(pVCpu, bRm)); \
    218         IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
    219         IEM_MC_REF_EFLAGS(pEFlags); \
    220         IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU8, pu8Dst, u8Src, pEFlags); \
    221         \
     234        IEM_MC_NATIVE_IF(a_fNativeArchs) { \
     235            IEM_MC_LOCAL(uint8_t,   u8Dst); \
     236            IEM_MC_FETCH_GREG_U8(u8Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
     237            /** @todo IEM_MC_LOCAL_EFLAGS(uEFlags); */ \
     238            IEM_MC_LOCAL(uint32_t,  uEFlags); \
     239            IEM_MC_FETCH_EFLAGS(uEFlags); \
     240            IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_EmitterBasename,_r_r_efl), u8Dst, u8Src, uEFlags, 8); \
     241            IEM_MC_STORE_GREG_U8(IEM_GET_MODRM_REG(pVCpu, bRm), u8Dst); \
     242            IEM_MC_COMMIT_EFLAGS(uEFlags); \
     243        } IEM_MC_NATIVE_ELSE() { \
     244            IEM_MC_ARG(uint8_t *,   pu8Dst,  0); \
     245            IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
     246            IEM_MC_ARG(uint32_t *,  pEFlags, 2); \
     247            IEM_MC_REF_EFLAGS(pEFlags); \
     248            IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU8, pu8Dst, u8Src, pEFlags); \
     249        } IEM_MC_NATIVE_ENDIF(); \
    222250        IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    223251        IEM_MC_END(); \
     
    229257         */ \
    230258        IEM_MC_BEGIN(3, 1, 0, 0); \
    231         IEM_MC_ARG(uint8_t *,  pu8Dst,  0); \
    232         IEM_MC_ARG(uint8_t,    u8Src,   1); \
    233         IEM_MC_ARG(uint32_t *, pEFlags, 2); \
    234259        IEM_MC_LOCAL(RTGCPTR,  GCPtrEffDst); \
    235         \
    236260        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \
    237261        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     262        IEM_MC_ARG(uint8_t,         u8Src,   1); \
    238263        IEM_MC_FETCH_MEM_U8(u8Src, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
    239         IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
    240         IEM_MC_REF_EFLAGS(pEFlags); \
    241         IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU8, pu8Dst, u8Src, pEFlags); \
    242         \
     264        IEM_MC_NATIVE_IF(a_fNativeArchs) { \
     265            IEM_MC_LOCAL(uint8_t,   u8Dst); \
     266            IEM_MC_FETCH_GREG_U8(u8Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
     267            /** @todo IEM_MC_LOCAL_EFLAGS(uEFlags); */ \
     268            IEM_MC_LOCAL(uint32_t,  uEFlags); \
     269            IEM_MC_FETCH_EFLAGS(uEFlags); \
     270            IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_EmitterBasename,_r_r_efl), u8Dst, u8Src, uEFlags, 8); \
     271            IEM_MC_STORE_GREG_U8(IEM_GET_MODRM_REG(pVCpu, bRm), u8Dst); \
     272            IEM_MC_COMMIT_EFLAGS(uEFlags); \
     273        } IEM_MC_NATIVE_ELSE() { \
     274            IEM_MC_ARG(uint8_t *,   pu8Dst,  0); \
     275            IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_REG(pVCpu, bRm)); \
     276            IEM_MC_ARG(uint32_t *,  pEFlags, 2); \
     277            IEM_MC_REF_EFLAGS(pEFlags); \
     278            IEM_MC_CALL_VOID_AIMPL_3(a_fnNormalU8, pu8Dst, u8Src, pEFlags); \
     279        } IEM_MC_NATIVE_ENDIF(); \
    243280        IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    244281        IEM_MC_END(); \
     
    727764{
    728765    IEMOP_MNEMONIC2(MR, ADD, add, Eb, Gb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_LOCK_ALLOWED);
    729     IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_add_u8, iemAImpl_add_u8_locked);
     766    IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_add_u8, iemAImpl_add_u8_locked, add, 0, 0);
    730767}
    731768
     
    757794{
    758795    IEMOP_MNEMONIC2(RM, ADD, add, Gb, Eb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
    759     IEMOP_BODY_BINARY_r8_rm(iemAImpl_add_u8);
     796    IEMOP_BODY_BINARY_r8_rm(iemAImpl_add_u8, add, 0);
    760797}
    761798
     
    848885    IEMOP_MNEMONIC2(MR, OR, or, Eb, Gb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_LOCK_ALLOWED);
    849886    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
    850     IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_or_u8, iemAImpl_or_u8_locked);
     887    IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_or_u8, iemAImpl_or_u8_locked, or, 0, 0);
    851888}
    852889
     
    883920    IEMOP_MNEMONIC2(RM, OR, or, Gb, Eb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_LOCK_ALLOWED);
    884921    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
    885     IEMOP_BODY_BINARY_r8_rm(iemAImpl_or_u8);
     922    IEMOP_BODY_BINARY_r8_rm(iemAImpl_or_u8, or, 0);
    886923}
    887924
     
    10071044{
    10081045    IEMOP_MNEMONIC2(MR, ADC, adc, Eb, Gb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_LOCK_ALLOWED);
    1009     IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_adc_u8, iemAImpl_adc_u8_locked);
     1046    IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_adc_u8, iemAImpl_adc_u8_locked, adc, 0, 0);
    10101047}
    10111048
     
    10381075{
    10391076    IEMOP_MNEMONIC2(RM, ADC, adc, Gb, Eb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
    1040     IEMOP_BODY_BINARY_r8_rm(iemAImpl_adc_u8);
     1077    IEMOP_BODY_BINARY_r8_rm(iemAImpl_adc_u8, adc, 0);
    10411078}
    10421079
     
    11191156{
    11201157    IEMOP_MNEMONIC2(MR, SBB, sbb, Eb, Gb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_LOCK_ALLOWED);
    1121     IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_sbb_u8, iemAImpl_sbb_u8_locked);
     1158    IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_sbb_u8, iemAImpl_sbb_u8_locked, sbb, 0, 0);
    11221159}
    11231160
     
    11441181{
    11451182    IEMOP_MNEMONIC2(RM, SBB, sbb, Gb, Eb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
    1146     IEMOP_BODY_BINARY_r8_rm(iemAImpl_sbb_u8);
     1183    IEMOP_BODY_BINARY_r8_rm(iemAImpl_sbb_u8, sbb, 0);
    11471184}
    11481185
     
    12251262    IEMOP_MNEMONIC2(MR, AND, and, Eb, Gb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_LOCK_ALLOWED);
    12261263    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
    1227     IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_and_u8, iemAImpl_and_u8_locked);
     1264    IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_and_u8, iemAImpl_and_u8_locked, and, 0, 0);
    12281265}
    12291266
     
    12521289    IEMOP_MNEMONIC2(RM, AND, and, Gb, Eb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
    12531290    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
    1254     IEMOP_BODY_BINARY_r8_rm(iemAImpl_and_u8);
     1291    IEMOP_BODY_BINARY_r8_rm(iemAImpl_and_u8, and, 0);
    12551292}
    12561293
     
    13401377{
    13411378    IEMOP_MNEMONIC2(MR, SUB, sub, Eb, Gb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_LOCK_ALLOWED);
    1342     IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_sub_u8, iemAImpl_sub_u8_locked);
     1379    IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_sub_u8, iemAImpl_sub_u8_locked, sub, 0, 0);
    13431380}
    13441381
     
    13651402{
    13661403    IEMOP_MNEMONIC2(RM, SUB, sub, Gb, Eb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
    1367     IEMOP_BODY_BINARY_r8_rm(iemAImpl_sub_u8);
     1404    IEMOP_BODY_BINARY_r8_rm(iemAImpl_sub_u8, sub, 0);
    13681405}
    13691406
     
    14511488    IEMOP_MNEMONIC2(MR, XOR, xor, Eb, Gb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_LOCK_ALLOWED);
    14521489    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
    1453     IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_xor_u8, iemAImpl_xor_u8_locked);
     1490    IEMOP_BODY_BINARY_rm_r8_RW(iemAImpl_xor_u8, iemAImpl_xor_u8_locked, xor, RT_ARCH_VAL_AMD64 | RT_ARCH_VAL_ARM64, 0);
    14541491}
    14551492
     
    14781515    IEMOP_MNEMONIC2(RM, XOR, xor, Gb, Eb, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
    14791516    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
    1480     IEMOP_BODY_BINARY_r8_rm(iemAImpl_xor_u8);
     1517    /** @todo xor al,al optimization   */
     1518    IEMOP_BODY_BINARY_r8_rm(iemAImpl_xor_u8, xor, RT_ARCH_VAL_AMD64 | RT_ARCH_VAL_ARM64);
    14811519}
    14821520
     
    16511689{
    16521690    IEMOP_MNEMONIC(cmp_Eb_Gb, "cmp Eb,Gb");
    1653     IEMOP_BODY_BINARY_rm_r8_RO(iemAImpl_cmp_u8);
     1691    IEMOP_BODY_BINARY_rm_r8_RO(iemAImpl_cmp_u8, cmp, 0, 0);
    16541692}
    16551693
     
    16731711{
    16741712    IEMOP_MNEMONIC(cmp_Gb_Eb, "cmp Gb,Eb");
    1675     IEMOP_BODY_BINARY_r8_rm(iemAImpl_cmp_u8);
     1713    IEMOP_BODY_BINARY_r8_rm(iemAImpl_cmp_u8, cmp, 0);
    16761714}
    16771715
     
    52335271    IEMOP_MNEMONIC(test_Eb_Gb, "test Eb,Gb");
    52345272    IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_AF);
    5235     IEMOP_BODY_BINARY_rm_r8_RO(iemAImpl_test_u8);
     5273    IEMOP_BODY_BINARY_rm_r8_RO(iemAImpl_test_u8, test, 0, 0);
    52365274}
    52375275
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