VirtualBox

Changeset 99324 in vbox


Ignore:
Timestamp:
Apr 6, 2023 11:34:00 PM (20 months ago)
Author:
vboxsync
Message:

VMM/IEM: Use IEMOP_HLP_DONE_VEX_DECODING_*() rather than IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT or IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT to check for AVX and AVX2 cpuid bits, since the latter two are for runtime checks while the former for the decoding stage. OTOH, the AVX CPUID check is unnecessary in the VexMap files, since the VEX prefixes already checks for it - but that can be optimized some other time. Fixed a number of AVX2/AVX mixups resulting from copy&paste or laziness. bugref:10369

Location:
trunk/src/VBox/VMM
Files:
6 edited

Legend:

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

    r99220 r99324  
    7777            IEM_MC_ARG(PCRTUINT128U,         puSrc1, 2);
    7878            IEM_MC_ARG(PCRTUINT128U,         puSrc2, 3);
    79             IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT();
     79            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    8080            IEM_MC_PREPARE_AVX_USAGE();
    8181            IEM_MC_REF_XREG_U128(puDst,        IEM_GET_MODRM_REG(pVCpu, bRm));
     
    130130            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    131131            IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx);
    132             IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT();
     132            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    133133            IEM_MC_PREPARE_AVX_USAGE();
    134134
     
    189189            IEM_MC_ARG(PCRTUINT128U,         puSrc1, 1);
    190190            IEM_MC_ARG(PCRTUINT128U,         puSrc2, 2);
    191             IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT();
     191            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    192192            IEM_MC_PREPARE_AVX_USAGE();
    193193            IEM_MC_REF_XREG_U128(puDst,        IEM_GET_MODRM_REG(pVCpu, bRm));
     
    240240            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    241241            IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx);
    242             IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT();
     242            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    243243            IEM_MC_PREPARE_AVX_USAGE();
    244244
     
    327327            IEM_MC_ARG(PRTUINT128U,          puDst,  0);
    328328            IEM_MC_ARG(PCRTUINT128U,         puSrc,  1);
    329             IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT();
     329            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    330330            IEM_MC_PREPARE_AVX_USAGE();
    331331            IEM_MC_REF_XREG_U128(puDst,        IEM_GET_MODRM_REG(pVCpu, bRm));
     
    373373            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    374374            IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx);
    375             IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT();
     375            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    376376            IEM_MC_PREPARE_AVX_USAGE();
    377377
     
    432432         * Register, register.
    433433         */
    434         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     434        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    435435        IEM_MC_BEGIN(0, 0);
    436436        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     
    455455
    456456        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    457         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     457        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    458458        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    459459        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    475475
    476476        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    477         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     477        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    478478        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    479479        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    507507         * Register, register.
    508508         */
    509         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     509        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    510510        IEM_MC_BEGIN(0, 0);
    511511        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     
    530530
    531531        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    532         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     532        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    533533        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    534534        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    550550
    551551        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    552         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     552        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    553553        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    554554        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    583583         */
    584584        IEMOP_MNEMONIC3(VEX_RVM_REG, VMOVSS, vmovss, Vss_WO, HssHi, Uss, DISOPTYPE_HARMLESS | DISOPTYPE_X86_AVX, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_IGNORED);
    585         IEMOP_HLP_DONE_VEX_DECODING();
     585        IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx);
    586586        IEM_MC_BEGIN(0, 0);
    587 
    588587        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    589588        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    614613
    615614        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    616         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     615        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    617616        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    618617        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    647646         */
    648647        IEMOP_MNEMONIC3(VEX_RVM_REG, VMOVSD, vmovsd, Vsd_WO, HsdHi, Usd, DISOPTYPE_HARMLESS | DISOPTYPE_X86_AVX, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_IGNORED);
    649         IEMOP_HLP_DONE_VEX_DECODING();
     648        IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx);
    650649        IEM_MC_BEGIN(0, 0);
    651650
     
    678677
    679678        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    680         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     679        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    681680        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    682681        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    710709         * Register, register.
    711710         */
    712         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     711        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    713712        IEM_MC_BEGIN(0, 0);
    714713        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     
    733732
    734733        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    735         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     734        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    736735        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    737736        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    753752
    754753        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    755         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     754        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    756755        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    757756        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    785784         * Register, register.
    786785         */
    787         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     786        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    788787        IEM_MC_BEGIN(0, 0);
    789788        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     
    808807
    809808        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    810         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     809        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    811810        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    812811        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    828827
    829828        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    830         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     829        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    831830        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    832831        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    860859         */
    861860        IEMOP_MNEMONIC3(VEX_MVR_REG, VMOVSS, vmovss, Uss_WO, HssHi, Vss, DISOPTYPE_HARMLESS | DISOPTYPE_X86_AVX, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_IGNORED);
    862         IEMOP_HLP_DONE_VEX_DECODING();
     861        IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx);
    863862        IEM_MC_BEGIN(0, 0);
    864863
     
    891890
    892891        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    893         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     892        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    894893        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    895894        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    924923         */
    925924        IEMOP_MNEMONIC3(VEX_MVR_REG, VMOVSD, vmovsd, Usd_WO, HsdHi, Vsd, DISOPTYPE_HARMLESS | DISOPTYPE_X86_AVX, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_IGNORED);
    926         IEMOP_HLP_DONE_VEX_DECODING();
     925        IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx);
    927926        IEM_MC_BEGIN(0, 0);
    928927
     
    955954
    956955        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    957         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     956        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    958957        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    959958        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    988987        IEMOP_MNEMONIC3(VEX_RVM_REG, VMOVHLPS, vmovhlps, Vq_WO, HqHi, UqHi, DISOPTYPE_HARMLESS | DISOPTYPE_X86_AVX, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_ZERO);
    989988
    990         IEMOP_HLP_DONE_VEX_DECODING_L0();
     989        IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fAvx);
    991990        IEM_MC_BEGIN(0, 0);
    992991
     
    10231022
    10241023        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1025         IEMOP_HLP_DONE_VEX_DECODING_L0();
     1024        IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fAvx);
    10261025        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    10271026        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    10621061
    10631062        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1064         IEMOP_HLP_DONE_VEX_DECODING_L0();
     1063        IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fAvx);
    10651064        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    10661065        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    11121111         * Register, register.
    11131112         */
    1114         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     1113        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    11151114        if (pVCpu->iem.s.uVexLength == 0)
    11161115        {
     
    11581157
    11591158            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1160             IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     1159            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    11611160            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    11621161            IEM_MC_PREPARE_AVX_USAGE();
     
    11821181
    11831182            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1184             IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     1183            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    11851184            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    11861185            IEM_MC_PREPARE_AVX_USAGE();
     
    12161215         * Register, register.
    12171216         */
    1218         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     1217        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    12191218        if (pVCpu->iem.s.uVexLength == 0)
    12201219        {
     
    12601259
    12611260            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1262             IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     1261            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    12631262            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    12641263            IEM_MC_PREPARE_AVX_USAGE();
     
    12821281
    12831282            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1284             IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     1283            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    12851284            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    12861285            IEM_MC_PREPARE_AVX_USAGE();
     
    13181317
    13191318        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1320         IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     1319        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    13211320        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    13221321        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    13651364
    13661365        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1367         IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     1366        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    13681367        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    13691368        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    14521451        IEMOP_MNEMONIC3(VEX_RVM_REG, VMOVLHPS, vmovlhps, Vq_WO, Hq, Uq, DISOPTYPE_HARMLESS | DISOPTYPE_X86_AVX, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_ZERO);
    14531452
    1454         IEMOP_HLP_DONE_VEX_DECODING_L0();
     1453        IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fAvx);
    14551454        IEM_MC_BEGIN(0, 0);
    14561455
     
    14831482
    14841483        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1485         IEMOP_HLP_DONE_VEX_DECODING_L0();
     1484        IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fAvx);
    14861485        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    14871486        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    15181517
    15191518        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1520         IEMOP_HLP_DONE_VEX_DECODING_L0();
     1519        IEMOP_HLP_DONE_VEX_DECODING_L0_EX(fAvx);
    15211520        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    15221521        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    15641563         * Register, register.
    15651564         */
    1566         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     1565        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    15671566        if (pVCpu->iem.s.uVexLength == 0)
    15681567        {
     
    16101609
    16111610            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1612             IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     1611            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    16131612            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    16141613            IEM_MC_PREPARE_AVX_USAGE();
     
    16341633
    16351634            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1636             IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     1635            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    16371636            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    16381637            IEM_MC_PREPARE_AVX_USAGE();
     
    16711670
    16721671        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1673         IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     1672        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    16741673        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    16751674        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    17161715
    17171716        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1718         IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     1717        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    17191718        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    17201719        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    17841783         * Register, register.
    17851784         */
    1786         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     1785        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    17871786        IEM_MC_BEGIN(1, 0);
    17881787
     
    18101809
    18111810            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1812             IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     1811            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    18131812            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    18141813            IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    18271826
    18281827            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1829             IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     1828            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    18301829            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    18311830            IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    18611860         * Register, register.
    18621861         */
    1863         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     1862        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    18641863        IEM_MC_BEGIN(1, 0);
    18651864
     
    18871886
    18881887            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1889             IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     1888            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    18901889            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    18911890            IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    19041903
    19051904            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1906             IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     1905            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    19071906            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    19081907            IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    19571956         * Register, register.
    19581957         */
    1959         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     1958        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    19601959        IEM_MC_BEGIN(1, 0);
    19611960
     
    19831982
    19841983            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1985             IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     1984            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    19861985            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    19871986            IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    20001999
    20012000            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    2002             IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     2001            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    20032002            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    20042003            IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    20332032         * Register, register.
    20342033         */
    2035         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     2034        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    20362035        IEM_MC_BEGIN(1, 0);
    20372036
     
    20592058
    20602059            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    2061             IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     2060            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    20622061            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    20632062            IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    20762075
    20772076            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    2078             IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     2077            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    20792078            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    20802079            IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    21472146
    21482147            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    2149             IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     2148            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    21502149            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    21512150            IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    21642163
    21652164            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    2166             IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     2165            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    21672166            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    21682167            IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    22082207
    22092208            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    2210             IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     2209            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    22112210            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    22122211            IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    22252224
    22262225            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    2227             IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     2226            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    22282227            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    22292228            IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    22872286         * Register, register.
    22882287         */
    2289         IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     2288        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    22902289        IEM_MC_BEGIN(4, 1);
    22912290        IEM_MC_LOCAL(uint32_t, fEFlags);
     
    23262325
    23272326        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    2328         IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     2327        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    23292328        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    23302329        IEM_MC_FETCH_MEM_XMM_U32(uSrc2, 0 /*a_DWord*/, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     
    23582357         * Register, register.
    23592358         */
    2360         IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     2359        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    23612360        IEM_MC_BEGIN(4, 1);
    23622361        IEM_MC_LOCAL(uint32_t, fEFlags);
     
    23972396
    23982397        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    2399         IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     2398        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    24002399        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    24012400        IEM_MC_FETCH_MEM_XMM_U32(uSrc2, 0 /*a_DWord*/, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     
    24322431         * Register, register.
    24332432         */
    2434         IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     2433        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    24352434        IEM_MC_BEGIN(4, 1);
    24362435        IEM_MC_LOCAL(uint32_t, fEFlags);
     
    24712470
    24722471        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    2473         IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     2472        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    24742473        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    24752474        IEM_MC_FETCH_MEM_XMM_U32(uSrc2, 0 /*a_DWord*/, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     
    25032502         * Register, register.
    25042503         */
    2505         IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     2504        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    25062505        IEM_MC_BEGIN(4, 1);
    25072506        IEM_MC_LOCAL(uint32_t, fEFlags);
     
    25422541
    25432542        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    2544         IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     2543        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    25452544        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    25462545        IEM_MC_FETCH_MEM_XMM_U32(uSrc2, 0 /*a_DWord*/, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     
    26132612        if (pVCpu->iem.s.uVexLength == 0)
    26142613        {
    2615             IEMOP_HLP_DONE_VEX_DECODING();
     2614            IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx);
    26162615            IEM_MC_BEGIN(2, 1);
    26172616            IEM_MC_LOCAL(uint8_t,           u8Dst);
     
    26292628        else
    26302629        {
    2631             IEMOP_HLP_DONE_VEX_DECODING();
     2630            IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx2);
    26322631            IEM_MC_BEGIN(2, 2);
    26332632            IEM_MC_LOCAL(uint8_t,               u8Dst);
     
    26642663        if (pVCpu->iem.s.uVexLength == 0)
    26652664        {
    2666             IEMOP_HLP_DONE_VEX_DECODING();
     2665            IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx);
    26672666            IEM_MC_BEGIN(2, 1);
    26682667            IEM_MC_LOCAL(uint8_t,           u8Dst);
     
    26802679        else
    26812680        {
    2682             IEMOP_HLP_DONE_VEX_DECODING();
     2681            IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx2);
    26832682            IEM_MC_BEGIN(2, 2);
    26842683            IEM_MC_LOCAL(uint8_t,               u8Dst);
     
    31723171        {
    31733172            /* XMM, greg64 */
    3174             IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     3173            IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    31753174            IEM_MC_BEGIN(0, 1);
    31763175            IEM_MC_LOCAL(uint64_t, u64Tmp);
     
    31933192
    31943193            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    3195             IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     3194            IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    31963195            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    31973196            IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    32223221        {
    32233222            /* XMM, greg32 */
    3224             IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     3223            IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    32253224            IEM_MC_BEGIN(0, 1);
    32263225            IEM_MC_LOCAL(uint32_t, u32Tmp);
     
    32433242
    32443243            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    3245             IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     3244            IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    32463245            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    32473246            IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    32813280         * Register, register.
    32823281         */
    3283         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     3282        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    32843283        IEM_MC_BEGIN(0, 0);
    32853284
     
    33053304
    33063305        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    3307         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     3306        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    33083307        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    33093308        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    33253324
    33263325        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    3327         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     3326        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    33283327        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    33293328        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    33563355         * Register, register.
    33573356         */
    3358         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     3357        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    33593358        IEM_MC_BEGIN(0, 0);
    33603359
     
    33803379
    33813380        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    3382         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     3381        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    33833382        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    33843383        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    34003399
    34013400        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    3402         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     3401        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    34033402        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    34043403        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    34563455            IEM_MC_ARG(PCRTUINT128U,            puSrc,                 1);
    34573456            IEM_MC_ARG_CONST(uint8_t,           bImmArg, /*=*/ bImm, 2);
    3458             IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT();
     3457            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    34593458            IEM_MC_PREPARE_AVX_USAGE();
    34603459            IEM_MC_REF_XREG_U128(puDst,         IEM_GET_MODRM_REG(pVCpu, bRm));
     
    35063505            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    35073506            IEM_MC_ARG_CONST(uint8_t,           bImmArg, /*=*/ bImm, 2);
    3508             IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT();
     3507            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    35093508            IEM_MC_PREPARE_AVX_USAGE();
    35103509
     
    37353734        IEM_MC_BEGIN(0, 0);
    37363735
    3737         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     3736        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    37383737        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    37393738        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    37723771        IEM_MC_LOCAL(uint32_t,  uZero);
    37733772
    3774         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     3773        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    37753774        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    37763775        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    38643863        {
    38653864            /* greg64, XMM */
    3866             IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     3865            IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    38673866            IEM_MC_BEGIN(0, 1);
    38683867            IEM_MC_LOCAL(uint64_t, u64Tmp);
     
    38853884
    38863885            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    3887             IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     3886            IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    38883887            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    38893888            IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    39143913        {
    39153914            /* greg32, XMM */
    3916             IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     3915            IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    39173916            IEM_MC_BEGIN(0, 1);
    39183917            IEM_MC_LOCAL(uint32_t, u32Tmp);
     
    39353934
    39363935            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    3937             IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     3936            IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    39383937            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    39393938            IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    39673966         * Register, register.
    39683967         */
    3969         IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     3968        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    39703969        IEM_MC_BEGIN(0, 0);
    39713970
     
    39883987
    39893988        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    3990         IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     3989        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    39913990        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    39923991        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    40244023         * Register, register.
    40254024         */
    4026         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     4025        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    40274026        IEM_MC_BEGIN(0, 0);
    40284027
     
    40484047
    40494048        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    4050         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     4049        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    40514050        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    40524051        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    40684067
    40694068        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    4070         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     4069        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    40714070        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    40724071        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    41004099         * Register, register.
    41014100         */
    4102         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     4101        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    41034102        IEM_MC_BEGIN(0, 0);
    41044103
     
    41244123
    41254124        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    4126         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     4125        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    41274126        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    41284127        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    41444143
    41454144        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    4146         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     4145        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    41474146        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    41484147        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    42334232//{
    42344233//    IEMOP_MNEMONIC1(M_MEM, VLDMXCSR, vldmxcsr, MdRO, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
    4235 //    if (!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSse)
    4236 //        return IEMOP_RAISE_INVALID_OPCODE();
    4237 //
    42384234//    IEM_MC_BEGIN(2, 0);
    42394235//    IEM_MC_ARG(uint8_t,         iEffSeg,                                 0);
    42404236//    IEM_MC_ARG(RTGCPTR,         GCPtrEff,                                1);
    42414237//    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEff, bRm, 0);
    4242 //    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     4238//    IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    42434239//    IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
    42444240//    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
     
    42944290    IEM_MC_ARG(RTGCPTR,         GCPtrEff,                                1);
    42954291    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEff, bRm, 0);
    4296     IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     4292    IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    42974293    IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
    42984294    IEM_MC_ASSIGN(iEffSeg, pVCpu->iem.s.iEffSeg);
     
    45324528            IEM_MC_ARG(PCRTUINT128U,         puSrc2,                2); \
    45334529            IEM_MC_ARG_CONST(uint8_t,        bImmArg, /*=*/ bImm,   3); \
    4534             IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT(); \
     4530            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); \
    45354531            IEM_MC_PREPARE_AVX_USAGE(); \
    45364532            IEM_MC_REF_XREG_U128(puDst,        IEM_GET_MODRM_REG(pVCpu, bRm)); \
     
    45854581            IEM_MC_ARG_CONST(uint8_t,               bImmArg, /*=*/  bImm,  3); \
    45864582            IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx); \
    4587             IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT(); \
     4583            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); \
    45884584            IEM_MC_PREPARE_AVX_USAGE(); \
    45894585            IEM_MC_FETCH_MEM_U128_NO_AC(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); \
     
    47094705         * Register, register.
    47104706         */
    4711         IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     4707        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    47124708        IEM_MC_BEGIN(0, 0);
    47134709
     
    47304726
    47314727        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    4732         IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV();
     4728        IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(fAvx);
    47334729        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    47344730        IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    47574753        /* Note! Taking the lazy approch here wrt the high 32-bits of the GREG. */
    47584754        IEMOP_MNEMONIC2(VEX_RM_REG, VPMOVMSKB, vpmovmskb, Gd, Ux, DISOPTYPE_X86_SSE | DISOPTYPE_HARMLESS, 0);
    4759         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
    47604755        if (pVCpu->iem.s.uVexLength)
    47614756        {
     4757            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx2);
    47624758            IEM_MC_BEGIN(2, 1);
    47634759            IEM_MC_ARG(uint64_t *,              puDst, 0);
     
    47754771        else
    47764772        {
     4773            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    47774774            IEM_MC_BEGIN(2, 0);
    47784775            IEM_MC_ARG(uint64_t *,              puDst, 0);
    47794776            IEM_MC_ARG(PCRTUINT128U,            puSrc, 1);
    4780             IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT();
     4777            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    47814778            IEM_MC_PREPARE_AVX_USAGE();
    47824779            IEM_MC_REF_GREG_U64(puDst,          IEM_GET_MODRM_REG(pVCpu, bRm));
     
    49904987
    49914988            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    4992             IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     4989            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    49934990            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    49944991            IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    50105007
    50115008            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    5012             IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     5009            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    50135010            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    50145011            IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     
    51525149
    51535150        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    5154         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     5151        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    51555152        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    51565153        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    51725169
    51735170        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    5174         IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     5171        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    51755172        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    51765173        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap2.cpp.h

    r99220 r99324  
    391391            IEM_MC_ARG(PRTUINT128U,          puDst,  0); \
    392392            IEM_MC_ARG(uint64_t,             uSrc,   1); \
    393             IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT(); \
     393            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); \
    394394            IEM_MC_PREPARE_AVX_USAGE(); \
    395395            IEM_MC_REF_XREG_U128(puDst,  IEM_GET_MODRM_REG(pVCpu, bRm)); \
     
    436436            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); \
    437437            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx); \
    438             IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT(); \
     438            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); \
    439439            IEM_MC_PREPARE_AVX_USAGE(); \
    440440            IEM_MC_REF_XREG_U128(puDst,  IEM_GET_MODRM_REG(pVCpu, bRm)); \
     
    552552
    553553            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    554             IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     554            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx);
    555555            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    556556            IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    583583
    584584            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    585             IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     585            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx2);
    586586            IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT();
    587587            IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     
    791791        IEM_MC_ARG(PRTUINT128U,          puDst,  0);
    792792        IEM_MC_ARG(PCRTUINT128U,         puSrc,  1);
    793         IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT();
     793        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    794794        IEM_MC_PREPARE_AVX_USAGE();
    795795        IEM_MC_REF_XREG_U128(puDst,        IEM_GET_MODRM_REG(pVCpu, bRm));
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap3.cpp.h

    r98103 r99324  
    8181            IEM_MC_ARG(PCRTUINT128U,         puSrc2, 2);
    8282            IEM_MC_ARG_CONST(uint8_t,        bImmArg, /*=*/ bImm, 3);
    83             IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT();
     83            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    8484            IEM_MC_PREPARE_AVX_USAGE();
    8585            IEM_MC_REF_XREG_U128(puDst,        IEM_GET_MODRM_REG(pVCpu, bRm));
     
    136136            IEM_MC_ARG_CONST(uint8_t,               bImmArg, /*=*/ bImm, 3);
    137137            IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx);
    138             IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT();
     138            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     139            IEM_MC_PREPARE_AVX_USAGE();
     140
     141            IEM_MC_FETCH_MEM_U128_NO_AC(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     142            IEM_MC_REF_XREG_U128(puDst,         IEM_GET_MODRM_REG(pVCpu, bRm));
     143            IEM_MC_REF_XREG_U128_CONST(puSrc1,  IEM_GET_EFFECTIVE_VVVV(pVCpu));
     144            IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnU128, puDst, puSrc1, puSrc2, bImmArg);
     145            IEM_MC_CLEAR_YREG_128_UP(           IEM_GET_MODRM_REG(pVCpu, bRm));
     146
     147            IEM_MC_ADVANCE_RIP_AND_FINISH();
     148            IEM_MC_END();
     149        }
     150    }
     151}
     152
     153
     154/**
     155 * Common worker for AVX instructions on the forms:
     156 *     - vblendps/d    xmm0, xmm1, xmm2/mem128, imm8
     157 *     - vblendps/d    ymm0, ymm1, ymm2/mem256, imm8
     158 *
     159 * Takes function table for function w/o implicit state parameter.
     160 *
     161 * Exceptions type 4. AVX cpuid check for both 128-bit and 256-bit operation.
     162 */
     163FNIEMOP_DEF_1(iemOpCommonAvxAvx_Vx_Hx_Wx_Ib_Opt, PCIEMOPMEDIAOPTF3IMM8, pImpl)
     164{
     165    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     166    if (IEM_IS_MODRM_REG_MODE(bRm))
     167    {
     168        /*
     169         * Register, register.
     170         */
     171        uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     172        IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx);
     173        if (pVCpu->iem.s.uVexLength)
     174        {
     175            IEM_MC_BEGIN(4, 3);
     176            IEM_MC_LOCAL(RTUINT256U,            uDst);
     177            IEM_MC_LOCAL(RTUINT256U,            uSrc1);
     178            IEM_MC_LOCAL(RTUINT256U,            uSrc2);
     179            IEM_MC_ARG_LOCAL_REF(PRTUINT256U,   puDst,  uDst,  0);
     180            IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc1, uSrc1, 1);
     181            IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc2, uSrc2, 2);
     182            IEM_MC_ARG_CONST(uint8_t,           bImmArg, /*=*/ bImm, 3);
     183            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     184            IEM_MC_PREPARE_AVX_USAGE();
     185            IEM_MC_FETCH_YREG_U256(uSrc1,   IEM_GET_EFFECTIVE_VVVV(pVCpu));
     186            IEM_MC_FETCH_YREG_U256(uSrc2,   IEM_GET_MODRM_RM(pVCpu, bRm));
     187            IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnU256, puDst, puSrc1, puSrc2, bImmArg);
     188            IEM_MC_STORE_YREG_U256_ZX_VLMAX(IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
     189            IEM_MC_ADVANCE_RIP_AND_FINISH();
     190            IEM_MC_END();
     191        }
     192        else
     193        {
     194            IEM_MC_BEGIN(4, 0);
     195            IEM_MC_ARG(PRTUINT128U,          puDst,  0);
     196            IEM_MC_ARG(PCRTUINT128U,         puSrc1, 1);
     197            IEM_MC_ARG(PCRTUINT128U,         puSrc2, 2);
     198            IEM_MC_ARG_CONST(uint8_t,        bImmArg, /*=*/ bImm, 3);
     199            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     200            IEM_MC_PREPARE_AVX_USAGE();
     201            IEM_MC_REF_XREG_U128(puDst,        IEM_GET_MODRM_REG(pVCpu, bRm));
     202            IEM_MC_REF_XREG_U128_CONST(puSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu));
     203            IEM_MC_REF_XREG_U128_CONST(puSrc2, IEM_GET_MODRM_RM(pVCpu, bRm));
     204            IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnU128, puDst, puSrc1, puSrc2, bImmArg);
     205            IEM_MC_CLEAR_YREG_128_UP(          IEM_GET_MODRM_REG(pVCpu, bRm));
     206            IEM_MC_ADVANCE_RIP_AND_FINISH();
     207            IEM_MC_END();
     208        }
     209    }
     210    else
     211    {
     212        /*
     213         * Register, memory.
     214         */
     215        if (pVCpu->iem.s.uVexLength)
     216        {
     217            IEM_MC_BEGIN(4, 4);
     218            IEM_MC_LOCAL(RTUINT256U,            uDst);
     219            IEM_MC_LOCAL(RTUINT256U,            uSrc1);
     220            IEM_MC_LOCAL(RTUINT256U,            uSrc2);
     221            IEM_MC_LOCAL(RTGCPTR,               GCPtrEffSrc);
     222            IEM_MC_ARG_LOCAL_REF(PRTUINT256U,   puDst,  uDst,  0);
     223            IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc1, uSrc1, 1);
     224            IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc2, uSrc2, 2);
     225
     226            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     227            uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     228            IEM_MC_ARG_CONST(uint8_t,           bImmArg, /*=*/ bImm, 3);
     229            IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx);
     230            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     231            IEM_MC_PREPARE_AVX_USAGE();
     232
     233            IEM_MC_FETCH_MEM_U256_NO_AC(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     234            IEM_MC_FETCH_YREG_U256(uSrc1,      IEM_GET_EFFECTIVE_VVVV(pVCpu));
     235            IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnU256, puDst, puSrc1, puSrc2, bImmArg);
     236            IEM_MC_STORE_YREG_U256_ZX_VLMAX(   IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
     237
     238            IEM_MC_ADVANCE_RIP_AND_FINISH();
     239            IEM_MC_END();
     240        }
     241        else
     242        {
     243            IEM_MC_BEGIN(4, 2);
     244            IEM_MC_LOCAL(RTUINT128U,                uSrc2);
     245            IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     246            IEM_MC_ARG(PRTUINT128U,                 puDst,         0);
     247            IEM_MC_ARG(PCRTUINT128U,                puSrc1,        1);
     248            IEM_MC_ARG_LOCAL_REF(PCRTUINT128U,      puSrc2, uSrc2, 2);
     249
     250            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     251            uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm);
     252            IEM_MC_ARG_CONST(uint8_t,               bImmArg, /*=*/ bImm, 3);
     253            IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx);
     254            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    139255            IEM_MC_PREPARE_AVX_USAGE();
    140256
     
    176292
    177293
    178 /** Opcode VEX.66.0F3A 0x0c. */
     294/** Opcode VEX.66.0F3A 0x0c.
     295 * AVX,AVX  */
    179296FNIEMOP_DEF(iemOp_vblendps_Vx_Hx_Wx_Ib)
    180297{
    181298    IEMOP_MNEMONIC3(VEX_RVM, VBLENDPS, vblendps, Vx, Hx, Wx, DISOPTYPE_HARMLESS, 0); /* @todo */
    182299    IEMOPMEDIAOPTF3IMM8_INIT_VARS(vblendps);
    183     return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Ib_Opt, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback));
     300    return FNIEMOP_CALL_1(iemOpCommonAvxAvx_Vx_Hx_Wx_Ib_Opt, IEM_SELECT_HOST_OR_FALLBACK(fAvx, &s_Host, &s_Fallback));
    184301}
    185302
    186303
    187 /** Opcode VEX.66.0F3A 0x0d. */
     304/** Opcode VEX.66.0F3A 0x0d.
     305 * AVX,AVX  */
    188306FNIEMOP_DEF(iemOp_vblendpd_Vx_Hx_Wx_Ib)
    189307{
    190308    IEMOP_MNEMONIC3(VEX_RVM, VBLENDPD, vblendpd, Vx, Hx, Wx, DISOPTYPE_HARMLESS, 0); /* @todo */
    191309    IEMOPMEDIAOPTF3IMM8_INIT_VARS(vblendpd);
    192     return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Ib_Opt, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback));
     310    return FNIEMOP_CALL_1(iemOpCommonAvxAvx_Vx_Hx_Wx_Ib_Opt, IEM_SELECT_HOST_OR_FALLBACK(fAvx, &s_Host, &s_Fallback));
    193311}
    194312
    195313
    196 /** Opcode VEX.66.0F3A 0x0e. */
     314/** Opcode VEX.66.0F3A 0x0e.
     315 * AVX,AVX2  */
    197316FNIEMOP_DEF(iemOp_vpblendw_Vx_Hx_Wx_Ib)
    198317{
     
    206325
    207326
    208 /** Opcode VEX.66.0F3A 0x0f. */
     327/** Opcode VEX.66.0F3A 0x0f.
     328 * AVX,AVX2  */
    209329FNIEMOP_DEF(iemOp_vpalignr_Vx_Hx_Wx_Ib)
    210330{
     
    363483/**
    364484 * Common worker for AVX2 instructions on the forms:
     485 *     - vblendvps/d    xmm0, xmm1, xmm2/mem128, xmm4
     486 *     - vblendvps/d    ymm0, ymm1, ymm2/mem256, ymm4
     487 *
     488 * Exceptions type 4. AVX cpuid check for both 128-bit and 256-bit operations.
     489 */
     490FNIEMOP_DEF_1(iemOpCommonAvxAvx_Vx_Hx_Wx_Lx, PCIEMOPBLENDOP, pImpl)
     491{
     492    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     493    if (IEM_IS_MODRM_REG_MODE(bRm))
     494    {
     495        /*
     496         * Register, register.
     497         */
     498        uint8_t bOp4; IEM_OPCODE_GET_NEXT_U8(&bOp4);
     499        IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx);
     500        if (pVCpu->iem.s.uVexLength)
     501        {
     502            IEM_MC_BEGIN(4, 4);
     503            IEM_MC_LOCAL(RTUINT256U,            uDst);
     504            IEM_MC_LOCAL(RTUINT256U,            uSrc1);
     505            IEM_MC_LOCAL(RTUINT256U,            uSrc2);
     506            IEM_MC_LOCAL(RTUINT256U,            uSrc3);
     507            IEM_MC_ARG_LOCAL_REF(PRTUINT256U,   puDst,  uDst,  0);
     508            IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc1, uSrc1, 1);
     509            IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc2, uSrc2, 2);
     510            IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc3, uSrc3, 3);
     511            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     512            IEM_MC_PREPARE_AVX_USAGE();
     513            IEM_MC_FETCH_YREG_U256(uSrc1,   IEM_GET_EFFECTIVE_VVVV(pVCpu));
     514            IEM_MC_FETCH_YREG_U256(uSrc2,   IEM_GET_MODRM_RM(pVCpu, bRm));
     515            IEM_MC_FETCH_YREG_U256(uSrc3,   bOp4 >> 4); /** @todo Ignore MSB in 32-bit mode. */
     516            IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnU256, puDst, puSrc1, puSrc2, puSrc3);
     517            IEM_MC_STORE_YREG_U256_ZX_VLMAX(IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
     518            IEM_MC_ADVANCE_RIP_AND_FINISH();
     519            IEM_MC_END();
     520        }
     521        else
     522        {
     523            IEM_MC_BEGIN(4, 0);
     524            IEM_MC_ARG(PRTUINT128U,          puDst,  0);
     525            IEM_MC_ARG(PCRTUINT128U,         puSrc1, 1);
     526            IEM_MC_ARG(PCRTUINT128U,         puSrc2, 2);
     527            IEM_MC_ARG(PCRTUINT128U,         puSrc3, 3);
     528            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     529            IEM_MC_PREPARE_AVX_USAGE();
     530            IEM_MC_REF_XREG_U128(puDst,        IEM_GET_MODRM_REG(pVCpu, bRm));
     531            IEM_MC_REF_XREG_U128_CONST(puSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu));
     532            IEM_MC_REF_XREG_U128_CONST(puSrc2, IEM_GET_MODRM_RM(pVCpu, bRm));
     533            IEM_MC_REF_XREG_U128_CONST(puSrc3, bOp4 >> 4); /** @todo Ignore MSB in 32-bit mode. */
     534            IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnU128, puDst, puSrc1, puSrc2, puSrc3);
     535            IEM_MC_CLEAR_YREG_128_UP(          IEM_GET_MODRM_REG(pVCpu, bRm));
     536            IEM_MC_ADVANCE_RIP_AND_FINISH();
     537            IEM_MC_END();
     538        }
     539    }
     540    else
     541    {
     542        /*
     543         * Register, memory.
     544         */
     545        if (pVCpu->iem.s.uVexLength)
     546        {
     547            IEM_MC_BEGIN(4, 5);
     548            IEM_MC_LOCAL(RTUINT256U,            uDst);
     549            IEM_MC_LOCAL(RTUINT256U,            uSrc1);
     550            IEM_MC_LOCAL(RTUINT256U,            uSrc2);
     551            IEM_MC_LOCAL(RTUINT256U,            uSrc3);
     552            IEM_MC_LOCAL(RTGCPTR,               GCPtrEffSrc);
     553            IEM_MC_ARG_LOCAL_REF(PRTUINT256U,   puDst,  uDst,  0);
     554            IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc1, uSrc1, 1);
     555            IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc2, uSrc2, 2);
     556            IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc3, uSrc3, 3);
     557
     558            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     559            uint8_t bOp4; IEM_OPCODE_GET_NEXT_U8(&bOp4);
     560
     561            IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx);
     562            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     563            IEM_MC_PREPARE_AVX_USAGE();
     564
     565            IEM_MC_FETCH_MEM_U256_NO_AC(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     566            IEM_MC_FETCH_YREG_U256(uSrc1,      IEM_GET_EFFECTIVE_VVVV(pVCpu));
     567            IEM_MC_FETCH_YREG_U256(uSrc3,      IEM_GET_EFFECTIVE_VVVV(pVCpu));
     568            IEM_MC_FETCH_YREG_U256(uSrc3,      bOp4 >> 4); /** @todo Ignore MSB in 32-bit mode. */
     569            IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnU256, puDst, puSrc1, puSrc2, puSrc3);
     570            IEM_MC_STORE_YREG_U256_ZX_VLMAX(   IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
     571
     572            IEM_MC_ADVANCE_RIP_AND_FINISH();
     573            IEM_MC_END();
     574        }
     575        else
     576        {
     577            IEM_MC_BEGIN(4, 2);
     578            IEM_MC_LOCAL(RTUINT128U,                uSrc2);
     579            IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     580            IEM_MC_ARG(PRTUINT128U,                 puDst,         0);
     581            IEM_MC_ARG(PCRTUINT128U,                puSrc1,        1);
     582            IEM_MC_ARG_LOCAL_REF(PCRTUINT128U,      puSrc2, uSrc2, 2);
     583            IEM_MC_ARG(PCRTUINT128U,                puSrc3,        3);
     584
     585            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     586            uint8_t bOp4; IEM_OPCODE_GET_NEXT_U8(&bOp4);
     587
     588            IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx);
     589            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     590            IEM_MC_PREPARE_AVX_USAGE();
     591
     592            IEM_MC_FETCH_MEM_U128_NO_AC(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     593            IEM_MC_REF_XREG_U128(puDst,         IEM_GET_MODRM_REG(pVCpu, bRm));
     594            IEM_MC_REF_XREG_U128_CONST(puSrc1,  IEM_GET_EFFECTIVE_VVVV(pVCpu));
     595            IEM_MC_REF_XREG_U128_CONST(puSrc3, bOp4 >> 4); /** @todo Ignore MSB in 32-bit mode. */
     596            IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnU128, puDst, puSrc1, puSrc2, puSrc3);
     597            IEM_MC_CLEAR_YREG_128_UP(           IEM_GET_MODRM_REG(pVCpu, bRm));
     598
     599            IEM_MC_ADVANCE_RIP_AND_FINISH();
     600            IEM_MC_END();
     601        }
     602    }
     603}
     604
     605
     606/** Opcode VEX.66.0F3A 0x4a (vex only).
     607 * AVX, AVX  */
     608FNIEMOP_DEF(iemOp_vblendvps_Vx_Hx_Wx_Lx)
     609{
     610    //IEMOP_MNEMONIC4(VEX_RVM, VBLENDVPS, vpblendvps, Vx, Hx, Wx, Lx, DISOPTYPE_HARMLESS, 0); @todo
     611    IEMOPBLENDOP_INIT_VARS(vblendvps);
     612    return FNIEMOP_CALL_1(iemOpCommonAvxAvx_Vx_Hx_Wx_Lx, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback));
     613}
     614
     615
     616/** Opcode VEX.66.0F3A 0x4b (vex only).
     617 * AVX, AVX  */
     618FNIEMOP_DEF(iemOp_vblendvpd_Vx_Hx_Wx_Lx)
     619{
     620    //IEMOP_MNEMONIC4(VEX_RVM, VPBLENDVPD, blendvpd, Vx, Hx, Wx, Lx, DISOPTYPE_HARMLESS, 0); @todo
     621    IEMOPBLENDOP_INIT_VARS(vblendvpd);
     622    return FNIEMOP_CALL_1(iemOpCommonAvxAvx_Vx_Hx_Wx_Lx, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback));
     623}
     624
     625
     626/**
     627 * Common worker for AVX2 instructions on the forms:
    365628 *     - vpxxx    xmm0, xmm1, xmm2/mem128, xmm4
    366629 *     - vpxxx    ymm0, ymm1, ymm2/mem256, ymm4
     
    488751
    489752
    490 /** Opcode VEX.66.0F3A 0x4a (vex only). */
    491 FNIEMOP_DEF(iemOp_vblendvps_Vx_Hx_Wx_Lx)
    492 {
    493     //IEMOP_MNEMONIC4(VEX_RVM, VBLENDVPS, vpblendvps, Vx, Hx, Wx, Lx, DISOPTYPE_HARMLESS, 0); @todo
    494     IEMOPBLENDOP_INIT_VARS(vblendvps);
    495     return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Lx, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback));
    496 }
    497 
    498 
    499 /** Opcode VEX.66.0F3A 0x4b (vex only). */
    500 FNIEMOP_DEF(iemOp_vblendvpd_Vx_Hx_Wx_Lx)
    501 {
    502     //IEMOP_MNEMONIC4(VEX_RVM, VPBLENDVPD, blendvpd, Vx, Hx, Wx, Lx, DISOPTYPE_HARMLESS, 0); @todo
    503     IEMOPBLENDOP_INIT_VARS(vblendvpd);
    504     return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Lx, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback));
    505 }
    506 
    507 
    508 /** Opcode VEX.66.0F3A 0x4c (vex only). */
     753/** Opcode VEX.66.0F3A 0x4c (vex only).
     754 * AVX, AVX2  */
    509755FNIEMOP_DEF(iemOp_vpblendvb_Vx_Hx_Wx_Lx)
    510756{
  • trunk/src/VBox/VMM/include/IEMMc.h

    r99304 r99324  
    7676#define IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE()       \
    7777    do { \
    78         if (pVCpu->cpum.GstCtx.cr0 & (X86_CR0_EM | X86_CR0_TS)) \
     78        if (!(pVCpu->cpum.GstCtx.cr0 & (X86_CR0_EM | X86_CR0_TS))) \
     79        { } else return iemRaiseDeviceNotAvailable(pVCpu); \
     80    } while (0)
     81#define IEM_MC_MAYBE_RAISE_WAIT_DEVICE_NOT_AVAILABLE()  \
     82    do { \
     83        if (!((pVCpu->cpum.GstCtx.cr0 & (X86_CR0_MP | X86_CR0_TS)) == (X86_CR0_MP | X86_CR0_TS))) \
     84        { } else return iemRaiseDeviceNotAvailable(pVCpu); \
     85    } while (0)
     86#define IEM_MC_MAYBE_RAISE_FPU_XCPT() \
     87    do { \
     88        if (!(pVCpu->cpum.GstCtx.XState.x87.FSW & X86_FSW_ES)) \
     89        { } else return iemRaiseMathFault(pVCpu); \
     90    } while (0)
     91#define IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT() \
     92    do { \
     93        if (   (pVCpu->cpum.GstCtx.aXcr[0] & (XSAVE_C_YMM | XSAVE_C_SSE)) != (XSAVE_C_YMM | XSAVE_C_SSE) \
     94            || !(pVCpu->cpum.GstCtx.cr4 & X86_CR4_OSXSAVE) \
     95            || !IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fAvx) \
     96            return iemRaiseUndefinedOpcode(pVCpu); \
     97        if (pVCpu->cpum.GstCtx.cr0 & X86_CR0_TS) \
    7998            return iemRaiseDeviceNotAvailable(pVCpu); \
    80     } while (0)
    81 #define IEM_MC_MAYBE_RAISE_WAIT_DEVICE_NOT_AVAILABLE()  \
    82     do { \
    83         if ((pVCpu->cpum.GstCtx.cr0 & (X86_CR0_MP | X86_CR0_TS)) == (X86_CR0_MP | X86_CR0_TS)) \
    84             return iemRaiseDeviceNotAvailable(pVCpu); \
    85     } while (0)
    86 #define IEM_MC_MAYBE_RAISE_FPU_XCPT() \
    87     do { \
    88         if (pVCpu->cpum.GstCtx.XState.x87.FSW & X86_FSW_ES) \
    89             return iemRaiseMathFault(pVCpu); \
    9099    } while (0)
    91100#define IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT() \
     
    94103            || !(pVCpu->cpum.GstCtx.cr4 & X86_CR4_OSXSAVE) \
    95104            || !IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fAvx2) \
    96             return iemRaiseUndefinedOpcode(pVCpu); \
    97         if (pVCpu->cpum.GstCtx.cr0 & X86_CR0_TS) \
    98             return iemRaiseDeviceNotAvailable(pVCpu); \
    99     } while (0)
    100 #define IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT() \
    101     do { \
    102         if (   (pVCpu->cpum.GstCtx.aXcr[0] & (XSAVE_C_YMM | XSAVE_C_SSE)) != (XSAVE_C_YMM | XSAVE_C_SSE) \
    103             || !(pVCpu->cpum.GstCtx.cr4 & X86_CR4_OSXSAVE) \
    104             || !IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fAvx) \
    105105            return iemRaiseUndefinedOpcode(pVCpu); \
    106106        if (pVCpu->cpum.GstCtx.cr0 & X86_CR0_TS) \
  • trunk/src/VBox/VMM/include/IEMOpHlp.h

    r98910 r99324  
    508508 * Done decoding VEX instruction, raise \#UD exception if any lock, rex, repz,
    509509 * repnz or size prefixes are present, or if the VEX.VVVV field doesn't indicate
    510  * register 0, if in real or v8086 mode, or if the a_fFeature is present in the
    511  * guest CPU.
     510 * register 0, if in real or v8086 mode, or if the a_fFeature is not present in
     511 * the guest CPU.
    512512 */
    513513#define IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(a_fFeature) \
     
    542542    } while (0)
    543543
     544/**
     545 * Done decoding VEX, no V, L=0.
     546 * Raises \#UD exception if rex, rep, opsize or lock prefixes are present, if
     547 * we're in real or v8086 mode, if VEX.V!=0xf, if VEX.L!=0, or if the a_fFeature
     548 * is not present in the guest CPU.
     549 */
     550#define IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(a_fFeature) \
     551    do \
     552    { \
     553        if (RT_LIKELY(   !(  pVCpu->iem.s.fPrefixes \
     554                           & (IEM_OP_PRF_LOCK | IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REX)) \
     555                      && pVCpu->iem.s.uVexLength == 0 \
     556                      && pVCpu->iem.s.uVex3rdReg == 0 \
     557                      && !IEM_IS_REAL_OR_V86_MODE(pVCpu) \
     558                      && IEM_GET_GUEST_CPU_FEATURES(pVCpu)->a_fFeature )) \
     559        { /* likely */ } \
     560        else \
     561            return IEMOP_RAISE_INVALID_OPCODE(); \
     562    } while (0)
     563
    544564#define IEMOP_HLP_DECODED_NL_1(a_uDisOpNo, a_fIemOpFlags, a_uDisParam0, a_fDisOpType) \
    545565    do \
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r99309 r99324  
    167167#define IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(a_fFeature)  do { } while (0)
    168168#define IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV()        do { } while (0)
     169#define IEMOP_HLP_DONE_VEX_DECODING_L0_AND_NO_VVVV_EX(a_fFeature)                                   do { } while (0)
    169170#define IEMOP_HLP_DONE_DECODING_NO_LOCK_REPZ_OR_REPNZ_PREFIXES()                                    do { } while (0)
    170171#define IEMOP_HLP_DONE_DECODING_NO_SIZE_OP_REPZ_OR_REPNZ_PREFIXES()                                 do { } while (0)
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