VirtualBox

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


Ignore:
Timestamp:
May 18, 2017 4:21:24 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
115498
Message:

IEM: Some VEX related regression fixes and cleanups.

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

Legend:

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

    r66950 r66957  
    369369 */
    370370#define IEM_IS_CANONICAL(a_u64Addr)         X86_IS_CANONICAL(a_u64Addr)
     371
     372/**
     373 * Gets the effective VEX.VVVV value.
     374 *
     375 * The 4th bit is ignored if not 64-bit code.
     376 * @returns effective V-register value.
     377 * @param   a_pVCpu         The cross context virtual CPU structure of the calling thread.
     378 */
     379#define IEM_GET_EFFECTIVE_VVVV(a_pVCpu) \
     380    ((a_pVCpu)->iem.s.enmCpuMode == IEMMODE_64BIT ? (a_pVCpu)->iem.s.uVex3rdReg : (a_pVCpu)->iem.s.uVex3rdReg & 7)
    371381
    372382/** @def IEM_USE_UNALIGNED_DATA_ACCESS
     
    1271512725 * repnz or size prefixes are present, or if in real or v8086 mode.
    1271612726 */
    12717 #define IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX() \
     12727#define IEMOP_HLP_DONE_VEX_DECODING() \
    1271812728    do \
    1271912729    { \
     
    1273012740 * repnz or size prefixes are present, or if in real or v8086 mode.
    1273112741 */
    12732 #define IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_L0() \
     12742#define IEMOP_HLP_DONE_VEX_DECODING_L0() \
    1273312743    do \
    1273412744    { \
     
    1274812758 * register 0, or if in real or v8086 mode.
    1274912759 */
    12750 #define IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV() \
     12760#define IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV() \
    1275112761    do \
    1275212762    { \
     
    1275812768        else \
    1275912769            return IEMOP_RAISE_INVALID_LOCK_PREFIX(); \
     12770    } while (0)
     12771
     12772/**
     12773 * Done decoding VEX, no V, L=0.
     12774 * Raises \#UD exception if rex, rep, opsize or lock prefixes are present, if
     12775 * we're in real or v8086 mode, if VEX.V!=0xf, or if VEX.L!=0.
     12776 */
     12777#define IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV() \
     12778    do \
     12779    { \
     12780        if (RT_LIKELY(   !(  pVCpu->iem.s.fPrefixes \
     12781                           & (IEM_OP_PRF_LOCK | IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REX)) \
     12782                      && pVCpu->iem.s.uVexLength == 0 \
     12783                      && pVCpu->iem.s.uVex3rdReg == 0 \
     12784                      && !IEM_IS_REAL_OR_V86_MODE(pVCpu))) \
     12785        { /* likely */ } \
     12786        else \
     12787            return IEMOP_RAISE_INVALID_OPCODE(); \
    1276012788    } while (0)
    1276112789
     
    1279712825
    1279812826
    12799 /**
    12800  * Done decoding VEX.
    12801  * Raises \#UD exception if rex, rep, opsize or lock prefixes are present, or if
    12802  * we're in real or v8086 mode.
    12803  */
    12804 #define IEMOP_HLP_DONE_VEX_DECODING() \
    12805     do \
    12806     { \
    12807         if (RT_LIKELY(   !(  pVCpu->iem.s.fPrefixes \
    12808                            & (IEM_OP_PRF_LOCK | IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REX)) \
    12809                       && !IEM_IS_REAL_OR_V86_MODE(pVCpu) )) \
    12810         { /* likely */ } \
    12811         else \
    12812             return IEMOP_RAISE_INVALID_OPCODE(); \
    12813     } while (0)
    12814 
    12815 /**
    12816  * Done decoding VEX, no V, no L.
    12817  * Raises \#UD exception if rex, rep, opsize or lock prefixes are present, if
    12818  * we're in real or v8086 mode, if VEX.V!=0xf, or if VEX.L!=0.
    12819  */
    12820 #define IEMOP_HLP_DONE_VEX_DECODING_L_ZERO_NO_VVV() \
    12821     do \
    12822     { \
    12823         if (RT_LIKELY(   !(  pVCpu->iem.s.fPrefixes \
    12824                            & (IEM_OP_PRF_LOCK | IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REX)) \
    12825                       && pVCpu->iem.s.uVexLength == 0 \
    12826                       && pVCpu->iem.s.uVex3rdReg == 0 \
    12827                       && !IEM_IS_REAL_OR_V86_MODE(pVCpu))) \
    12828         { /* likely */ } \
    12829         else \
    12830             return IEMOP_RAISE_INVALID_OPCODE(); \
    12831     } while (0)
    12832 
    1283312827#ifdef VBOX_WITH_NESTED_HWVIRT
    1283412828/** Check and handles SVM nested-guest control & instruction intercept. */
     
    1284812842    } while (0)
    1284912843
    12850 #else
     12844#else  /* !VBOX_WITH_NESTED_HWVIRT */
    1285112845# define IEMOP_HLP_SVM_CTRL_INTERCEPT(a_pVCpu, a_Intercept, a_uExitCode, a_uExitInfo1, a_uExitInfo2)    do { } while (0)
    1285212846# define IEMOP_HLP_SVM_READ_CR_INTERCEPT(a_pVCpu, a_uCr, a_uExitInfo1, a_uExitInfo2)                    do { } while (0)
    12853 
    12854 #endif /* VBOX_WITH_NESTED_HWVIRT */
     12847#endif /* !VBOX_WITH_NESTED_HWVIRT */
    1285512848
    1285612849
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsOneByte.cpp.h

    r66901 r66957  
    43574357            pVCpu->iem.s.uRexIndex  = (~bRm >> (6 - 3)) & 0x8;
    43584358            pVCpu->iem.s.uRexB      = (~bRm >> (5 - 3)) & 0x8;
    4359             pVCpu->iem.s.uVex3rdReg = (~bXop2 >> 3) & (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT ? 0xf : 0x7);
     4359            pVCpu->iem.s.uVex3rdReg = (~bXop2 >> 3) & 0xf;
    43604360            pVCpu->iem.s.uVexLength = (bXop2 >> 2) & 1;
    43614361            pVCpu->iem.s.idxPrefix  = bXop2 & 0x3;
     
    62326232            pVCpu->iem.s.uRexIndex  = (~bRm >> (6 - 3)) & 0x8;
    62336233            pVCpu->iem.s.uRexB      = (~bRm >> (5 - 3)) & 0x8;
    6234             pVCpu->iem.s.uVex3rdReg = (~bVex2 >> 3) & (pVCpu->iem.s.enmCpuMode == IEMMODE_64BIT ? 0xf : 0x7);
     6234            pVCpu->iem.s.uVex3rdReg = (~bVex2 >> 3) & 0xf;
    62356235            pVCpu->iem.s.uVexLength = (bVex2 >> 2) & 1;
    62366236            pVCpu->iem.s.idxPrefix  = bVex2 & 0x3;
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsPython.py

    r66950 r66957  
    481481    'mmx':                   'DISOPTYPE_MMX',                   ##< MMX,MMXExt,3DNow,++ instruction. Not implemented yet!
    482482    'fpu':                   'DISOPTYPE_FPU',                   ##< FPU instruction. Not implemented yet!
    483     'ignores_op_size':       '',                                ##< Ignores both operand size prefixes.
     483    'ignores_op_size':       '',                                ##< Ignores both operand size prefixes (66h + REX.W).
     484    'ignores_vex_l':         '',                                ##< Ignores VEX.L.
    484485    'lock_allowed':          '',                                ##< Lock prefix allowed.
    485486};
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap1.cpp.h

    r66950 r66957  
    6969         * Register, register.
    7070         */
    71         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     71        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    7272        IEM_MC_BEGIN(0, 0);
    7373        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     
    9292
    9393        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    94         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     94        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    9595        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    9696        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    112112
    113113        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    114         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     114        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    115115        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    116116        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    145145         * Register, register.
    146146         */
    147         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     147        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    148148        IEM_MC_BEGIN(0, 0);
    149149        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     
    168168
    169169        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    170         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     170        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    171171        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    172172        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    188188
    189189        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    190         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     190        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    191191        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    192192        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    221221         * @note        HssHi refers to bits 127:32.
    222222         */
    223         IEMOP_MNEMONIC3(VEX_RVM, VMOVSS, vmovss, Vss_WO, HssHi, Uss, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
    224         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX();
     223        IEMOP_MNEMONIC3(VEX_RVM, VMOVSS, vmovss, Vss_WO, HssHi, Uss, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE | IEMOPHINT_IGNORES_VEX_L);
     224        IEMOP_HLP_DONE_VEX_DECODING();
    225225        IEM_MC_BEGIN(0, 0);
    226226
     
    229229        IEM_MC_MERGE_YREG_U32_U96_ZX_VLMAX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
    230230                                           (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB /*U32*/,
    231                                            pVCpu->iem.s.uVex3rdReg /*Hss*/);
     231                                            IEM_GET_EFFECTIVE_VVVV(pVCpu) /*Hss*/);
    232232        IEM_MC_ADVANCE_RIP();
    233233        IEM_MC_END();
     
    247247         * @optest      op1=0 op2=-22 -> op1=-22
    248248         */
    249         IEMOP_MNEMONIC2(VEX_XM, VMOVSS, vmovss, VssZx_WO, Md, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     249        IEMOP_MNEMONIC2(VEX_XM, VMOVSS, vmovss, VssZx_WO, Md, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE | IEMOPHINT_IGNORES_VEX_L);
    250250        IEM_MC_BEGIN(0, 2);
    251251        IEM_MC_LOCAL(uint32_t,                  uSrc);
     
    253253
    254254        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    255         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     255        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    256256        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    257257        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    287287         * @optest      op1=3 op2=0x42 op3=0x77 -> op1=0x420000000000000077
    288288         */
    289         IEMOP_MNEMONIC3(VEX_RVM, VMOVSD, vmovsd, Vsd_WO, HsdHi, Usd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
    290         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX();
     289        IEMOP_MNEMONIC3(VEX_RVM, VMOVSD, vmovsd, Vsd_WO, HsdHi, Usd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE | IEMOPHINT_IGNORES_VEX_L);
     290        IEMOP_HLP_DONE_VEX_DECODING();
    291291        IEM_MC_BEGIN(0, 0);
    292292
     
    295295        IEM_MC_MERGE_YREG_U64_U64_ZX_VLMAX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
    296296                                           (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB /*U32*/,
    297                                            pVCpu->iem.s.uVex3rdReg /*Hss*/);
     297                                           IEM_GET_EFFECTIVE_VVVV(pVCpu) /*Hss*/);
    298298        IEM_MC_ADVANCE_RIP();
    299299        IEM_MC_END();
     
    313313         * @optest      op1=0 op2=-22 -> op1=-22
    314314         */
    315         IEMOP_MNEMONIC2(VEX_XM, VMOVSD, vmovsd, VsdZx_WO, Mq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     315        IEMOP_MNEMONIC2(VEX_XM, VMOVSD, vmovsd, VsdZx_WO, Mq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE | IEMOPHINT_IGNORES_VEX_L);
    316316        IEM_MC_BEGIN(0, 2);
    317317        IEM_MC_LOCAL(uint64_t,                  uSrc);
     
    319319
    320320        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    321         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     321        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    322322        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    323323        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    353353         * Register, register.
    354354         */
    355         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     355        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    356356        IEM_MC_BEGIN(0, 0);
    357357        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     
    376376
    377377        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    378         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     378        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    379379        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    380380        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    396396
    397397        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    398         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     398        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    399399        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    400400        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    429429         * Register, register.
    430430         */
    431         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     431        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    432432        IEM_MC_BEGIN(0, 0);
    433433        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     
    452452
    453453        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    454         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     454        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    455455        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    456456        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    472472
    473473        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    474         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     474        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    475475        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    476476        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    504504         * @optest      op1=3 op2=0x42 op3=0x77 -> op1=0x4200000077
    505505         */
    506         IEMOP_MNEMONIC3(VEX_MVR, VMOVSS, vmovss, Uss_WO, HssHi, Vss, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
    507         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX();
     506        IEMOP_MNEMONIC3(VEX_MVR, VMOVSS, vmovss, Uss_WO, HssHi, Vss, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE | IEMOPHINT_IGNORES_VEX_L);
     507        IEMOP_HLP_DONE_VEX_DECODING();
    508508        IEM_MC_BEGIN(0, 0);
    509509
     
    512512        IEM_MC_MERGE_YREG_U32_U96_ZX_VLMAX((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB /*U32*/,
    513513                                           ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
    514                                            pVCpu->iem.s.uVex3rdReg /*Hss*/);
     514                                           IEM_GET_EFFECTIVE_VVVV(pVCpu) /*Hss*/);
    515515        IEM_MC_ADVANCE_RIP();
    516516        IEM_MC_END();
     
    530530         * @optest      op1=0 op2=-22 -> op1=-22
    531531         */
    532         IEMOP_MNEMONIC2(VEX_MR, VMOVSS, vmovss, Md_WO, Vss, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     532        IEMOP_MNEMONIC2(VEX_MR, VMOVSS, vmovss, Md_WO, Vss, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE | IEMOPHINT_IGNORES_VEX_L);
    533533        IEM_MC_BEGIN(0, 2);
    534534        IEM_MC_LOCAL(uint32_t,                  uSrc);
     
    536536
    537537        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    538         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     538        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    539539        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    540540        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    570570         * @optest      op2=0x42 op3=0x77 -> op1=0x420000000000000077
    571571         */
    572         IEMOP_MNEMONIC3(VEX_MVR, VMOVSD, vmovsd, Usd_WO, HsdHi, Vsd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
    573         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX();
     572        IEMOP_MNEMONIC3(VEX_MVR, VMOVSD, vmovsd, Usd_WO, HsdHi, Vsd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE | IEMOPHINT_IGNORES_VEX_L);
     573        IEMOP_HLP_DONE_VEX_DECODING();
    574574        IEM_MC_BEGIN(0, 0);
    575575
     
    578578        IEM_MC_MERGE_YREG_U64_U64_ZX_VLMAX((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB,
    579579                                           ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
    580                                            pVCpu->iem.s.uVex3rdReg /*Hss*/);
     580                                           IEM_GET_EFFECTIVE_VVVV(pVCpu) /*Hss*/);
    581581        IEM_MC_ADVANCE_RIP();
    582582        IEM_MC_END();
     
    596596         * @optest      op1=0 op2=-22 -> op1=-22
    597597         */
    598         IEMOP_MNEMONIC2(VEX_MR, VMOVSD, vmovsd, Mq_WO, Vsd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     598        IEMOP_MNEMONIC2(VEX_MR, VMOVSD, vmovsd, Mq_WO, Vsd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE | IEMOPHINT_IGNORES_VEX_L);
    599599        IEM_MC_BEGIN(0, 2);
    600600        IEM_MC_LOCAL(uint64_t,                  uSrc);
     
    602602
    603603        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    604         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     604        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    605605        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    606606        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    637637        IEMOP_MNEMONIC3(VEX_RVM, VMOVHLPS, vmovhlps, Vq_WO, HqHi, UqHi, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
    638638
    639         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_L0();
     639        IEMOP_HLP_DONE_VEX_DECODING_L0();
    640640        IEM_MC_BEGIN(0, 0);
    641641
     
    644644        IEM_MC_MERGE_YREG_U64HI_U64_ZX_VLMAX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
    645645                                             (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB,
    646                                              pVCpu->iem.s.uVex3rdReg /*Hq*/);
     646                                             IEM_GET_EFFECTIVE_VVVV(pVCpu) /*Hq*/);
    647647
    648648        IEM_MC_ADVANCE_RIP();
     
    672672
    673673        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    674         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_L0();
     674        IEMOP_HLP_DONE_VEX_DECODING_L0();
    675675        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    676676        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    679679        IEM_MC_MERGE_YREG_U64LOCAL_U64_ZX_VLMAX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
    680680                                                uSrc,
    681                                                 pVCpu->iem.s.uVex3rdReg /*Hq*/);
     681                                                IEM_GET_EFFECTIVE_VVVV(pVCpu) /*Hq*/);
    682682
    683683        IEM_MC_ADVANCE_RIP();
     
    712712
    713713        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    714         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_L0();
     714        IEMOP_HLP_DONE_VEX_DECODING_L0();
    715715        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    716716        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    719719        IEM_MC_MERGE_YREG_U64LOCAL_U64_ZX_VLMAX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
    720720                                                uSrc,
    721                                                 pVCpu->iem.s.uVex3rdReg /*Hq*/);
     721                                                IEM_GET_EFFECTIVE_VVVV(pVCpu) /*Hq*/);
    722722
    723723        IEM_MC_ADVANCE_RIP();
     
    751751 *                 op2=0xbbbbbbbb00000004cccccccc00000003dddddddd00000002eeeeeeee00000001
    752752 *              -> op1=0x0000000400000004000000030000000300000002000000020000000100000001
    753  * @oponly
    754753 */
    755754FNIEMOP_DEF(iemOp_vmovsldup_Vx_Wx)
     
    763762         * Register, register.
    764763         */
    765         IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     764        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    766765        if (pVCpu->iem.s.uVexLength == 0)
    767766        {
     
    810809
    811810            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    812             IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     811            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    813812            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    814813            IEM_MC_PREPARE_AVX_USAGE();
     
    832831
    833832            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    834             IEMOP_HLP_DONE_DECODING_NO_AVX_PREFIX_AND_NO_VVVV();
     833            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    835834            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    836835            IEM_MC_PREPARE_AVX_USAGE();
     
    25702569{
    25712570    IEMOP_MNEMONIC1(VEX_M_MEM, VSTMXCSR, vstmxcsr, Md_WO, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
    2572     if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fAvx)
    2573         return IEMOP_RAISE_INVALID_OPCODE();
    2574 
    25752571    IEM_MC_BEGIN(2, 0);
    25762572    IEM_MC_ARG(uint8_t,         iEffSeg,                                 0);
    25772573    IEM_MC_ARG(RTGCPTR,         GCPtrEff,                                1);
    25782574    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEff, bRm, 0);
    2579     IEMOP_HLP_DONE_VEX_DECODING_L_ZERO_NO_VVV();
     2575    IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
    25802576    IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
    25812577    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
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