VirtualBox

Changeset 103955 in vbox


Ignore:
Timestamp:
Mar 20, 2024 1:09:35 PM (8 months ago)
Author:
vboxsync
Message:

VMM/IEM,DIS: Another mnemonic todo in vex map 3. bugref:9898

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/disopcode-x86-amd64.h

    r103927 r103955  
    14551455#define OP_PARM_Eq              (OP_PARM_E+OP_PARM_q)
    14561456#define OP_PARM_Eq_WO           OP_PARM_Eq              /**< Annotates write only operand. */
     1457#define OP_PARM_Ey_WO           OP_PARM_Ey              /**< Annotates write only operand. */
    14571458#define OP_PARM_Gv_RO           OP_PARM_Gv              /**< Annotates read only first operand (default is readwrite). */
    14581459#define OP_PARM_HssHi           OP_PARM_Hx              /**< Register referenced by VEX.vvvv, bits [127:32]. */
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstPython.py

    r103953 r103955  
    243243    'Ev':           ( 'IDX_UseModRM',       'rm',     '%Ev',  'Ev',      'RM',    ),
    244244    'Ey':           ( 'IDX_UseModRM',       'rm',     '%Ey',  'Ey',      'RM',    ),
     245    'Ey_WO':        ( 'IDX_UseModRM',       'rm',     '%Ey',  'Ey',      'RM',    ),
    245246    'Qd':           ( 'IDX_UseModRM',       'rm',     '%Qd',  'Qd',      'RM',    ),
    246247    'Qq':           ( 'IDX_UseModRM',       'rm',     '%Qq',  'Qq',      'RM',    ),
     
    613614    'vex_l_ignored':         '',                                        ##< VEX.L is ignored.
    614615    'vex_v_zero':            '',                                        ##< VEX.V must be 0. (generate sub-table?)
     616    'vex_w_zero':            '',                                        ##< REX.W/VEX.W must be 0.
     617    'vex_w_one':             '',                                        ##< REX.W/VEX.W must be 1.
     618    'rex_w_zero':            '',                                        ##< REX.W/VEX.W must be 0.
     619    'rex_w_one':             '',                                        ##< REX.W/VEX.W must be 1.
    615620    'lock_allowed':          '',                                        ##< Lock prefix allowed.
    616621};
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstVexMap3.cpp.h

    r103931 r103955  
    587587FNIEMOP_DEF(iemOp_vpextrw_Ew_Vdq_Ib)
    588588{
    589     IEMOP_MNEMONIC3(VEX_MRI, VPEXTRW, vpextrw, Ew_WO, Vdq, Ib, DISOPTYPE_HARMLESS, IEMOPHINT_VEX_L_ZERO | IEMOPHINT_VEX_V_ZERO);
     589    /** @todo testcase: check that this ignores VEX.W. */
     590    IEMOP_MNEMONIC3(VEX_MRI, VPEXTRW, vpextrw, Ew_WO, Vdq, Ib, DISOPTYPE_HARMLESS, IEMOPHINT_VEX_L_ZERO | IEMOPHINT_VEX_V_ZERO | IEMOPHINT_IGNORES_REXW);
    590591    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    591592    if (IEM_IS_MODRM_REG_MODE(bRm))
     
    636637    if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W)
    637638    {
    638         IEMOP_MNEMONIC3(VEX_MRI, VPEXTRQ, vpextrq, Eq_WO, Vdq, Ib, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_ZERO); /** @todo */
     639        IEMOP_MNEMONIC3(VEX_MRI, VPEXTRQ, vpextrq, Eq_WO, Vdq, Ib, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_ZERO | IEMOPHINT_VEX_W_ONE);
    639640        if (IEM_IS_MODRM_REG_MODE(bRm))
    640641        {
     
    681682         * @opdone
    682683         */
    683         IEMOP_MNEMONIC3(VEX_MRI, VPEXTRD, vpextrd, Ey, Vdq, Ib, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_ZERO); /** @todo */
     684        IEMOP_MNEMONIC3(VEX_MRI, VPEXTRD, vpextrd, Ey_WO, Vdq, Ib, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES | IEMOPHINT_VEX_L_ZERO | IEMOPHINT_VEX_W_ZERO);
    684685        if (IEM_IS_MODRM_REG_MODE(bRm))
    685686        {
     
    11791180 *
    11801181 * Exceptions type 4. AVX cpuid check for 128-bit operation, AVX2 for 256-bit.
     1182 * Additionally, both VEX.W and VEX.L must be zero.
    11811183 */
    11821184FNIEMOP_DEF_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Lx, PCIEMOPBLENDOP, pImpl)
     
    11931195            IEM_MC_BEGIN(4, 4, IEM_MC_F_NOT_286_OR_OLDER, 0);
    11941196            IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx2);
     1197            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     1198            IEM_MC_PREPARE_AVX_USAGE();
     1199
     1200            IEM_MC_LOCAL(RTUINT256U,            uSrc1);
     1201            IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc1, uSrc1, 1);
     1202            IEM_MC_FETCH_YREG_U256(uSrc1,   IEM_GET_EFFECTIVE_VVVV(pVCpu));
     1203
     1204            IEM_MC_LOCAL(RTUINT256U,            uSrc2);
     1205            IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc2, uSrc2, 2);
     1206            IEM_MC_FETCH_YREG_U256(uSrc2,   IEM_GET_MODRM_RM(pVCpu, bRm));
     1207
     1208            IEM_MC_LOCAL(RTUINT256U,            uSrc3);
     1209            IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc3, uSrc3, 3);
     1210            IEM_MC_FETCH_YREG_U256(uSrc3,   IEM_GET_IMM8_REG(pVCpu, bOp4));
     1211
    11951212            IEM_MC_LOCAL(RTUINT256U,            uDst);
    1196             IEM_MC_LOCAL(RTUINT256U,            uSrc1);
    1197             IEM_MC_LOCAL(RTUINT256U,            uSrc2);
    1198             IEM_MC_LOCAL(RTUINT256U,            uSrc3);
    11991213            IEM_MC_ARG_LOCAL_REF(PRTUINT256U,   puDst,  uDst,  0);
    1200             IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc1, uSrc1, 1);
    1201             IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc2, uSrc2, 2);
    1202             IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc3, uSrc3, 3);
    1203             IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    1204             IEM_MC_PREPARE_AVX_USAGE();
    1205             IEM_MC_FETCH_YREG_U256(uSrc1,   IEM_GET_EFFECTIVE_VVVV(pVCpu));
    1206             IEM_MC_FETCH_YREG_U256(uSrc2,   IEM_GET_MODRM_RM(pVCpu, bRm));
    1207             IEM_MC_FETCH_YREG_U256(uSrc3,   bOp4 >> 4); /** @todo Ignore MSB in 32-bit mode. */
     1214
    12081215            IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnU256, puDst, puSrc1, puSrc2, puSrc3);
     1216
    12091217            IEM_MC_STORE_YREG_U256_ZX_VLMAX(IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
    12101218            IEM_MC_ADVANCE_RIP_AND_FINISH();
     
    12151223            IEM_MC_BEGIN(4, 0, IEM_MC_F_NOT_286_OR_OLDER, 0);
    12161224            IEMOP_HLP_DONE_VEX_DECODING_EX(fAvx);
    1217             IEM_MC_ARG(PRTUINT128U,          puDst,  0);
    1218             IEM_MC_ARG(PCRTUINT128U,         puSrc1, 1);
    1219             IEM_MC_ARG(PCRTUINT128U,         puSrc2, 2);
    1220             IEM_MC_ARG(PCRTUINT128U,         puSrc3, 3);
    1221             IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
    1222             IEM_MC_PREPARE_AVX_USAGE();
    1223             IEM_MC_REF_XREG_U128(puDst,        IEM_GET_MODRM_REG(pVCpu, bRm));
    1224             IEM_MC_REF_XREG_U128_CONST(puSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu));
    1225             IEM_MC_REF_XREG_U128_CONST(puSrc2, IEM_GET_MODRM_RM(pVCpu, bRm));
    1226             IEM_MC_REF_XREG_U128_CONST(puSrc3, bOp4 >> 4); /** @todo Ignore MSB in 32-bit mode. */
     1225            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     1226            IEM_MC_PREPARE_AVX_USAGE();
     1227            IEM_MC_ARG(PRTUINT128U,             puDst,  0);
     1228            IEM_MC_REF_XREG_U128(puDst,         IEM_GET_MODRM_REG(pVCpu, bRm));
     1229            IEM_MC_ARG(PCRTUINT128U,            puSrc1, 1);
     1230            IEM_MC_REF_XREG_U128_CONST(puSrc1,  IEM_GET_EFFECTIVE_VVVV(pVCpu));
     1231            IEM_MC_ARG(PCRTUINT128U,            puSrc2, 2);
     1232            IEM_MC_REF_XREG_U128_CONST(puSrc2,  IEM_GET_MODRM_RM(pVCpu, bRm));
     1233            IEM_MC_ARG(PCRTUINT128U,            puSrc3, 3);
     1234            IEM_MC_REF_XREG_U128_CONST(puSrc3,  IEM_GET_IMM8_REG(pVCpu, bOp4));
    12271235            IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnU128, puDst, puSrc1, puSrc2, puSrc3);
    1228             IEM_MC_CLEAR_YREG_128_UP(          IEM_GET_MODRM_REG(pVCpu, bRm));
     1236            IEM_MC_CLEAR_YREG_128_UP(           IEM_GET_MODRM_REG(pVCpu, bRm));
    12291237            IEM_MC_ADVANCE_RIP_AND_FINISH();
    12301238            IEM_MC_END();
     
    12391247        {
    12401248            IEM_MC_BEGIN(4, 5, IEM_MC_F_NOT_286_OR_OLDER, 0);
    1241             IEM_MC_LOCAL(RTUINT256U,            uDst);
    1242             IEM_MC_LOCAL(RTUINT256U,            uSrc1);
    1243             IEM_MC_LOCAL(RTUINT256U,            uSrc2);
    1244             IEM_MC_LOCAL(RTUINT256U,            uSrc3);
    12451249            IEM_MC_LOCAL(RTGCPTR,               GCPtrEffSrc);
    1246             IEM_MC_ARG_LOCAL_REF(PRTUINT256U,   puDst,  uDst,  0);
    1247             IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc1, uSrc1, 1);
    1248             IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc2, uSrc2, 2);
    1249             IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc3, uSrc3, 3);
    12501250
    12511251            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     
    12561256            IEM_MC_PREPARE_AVX_USAGE();
    12571257
     1258            IEM_MC_LOCAL(RTUINT256U,            uSrc2);
     1259            IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc2, uSrc2, 2);
    12581260            IEM_MC_FETCH_MEM_U256_NO_AC(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1259             IEM_MC_FETCH_YREG_U256(uSrc1,      IEM_GET_EFFECTIVE_VVVV(pVCpu));
    1260             IEM_MC_FETCH_YREG_U256(uSrc3,      IEM_GET_EFFECTIVE_VVVV(pVCpu));
    1261             IEM_MC_FETCH_YREG_U256(uSrc3,      bOp4 >> 4); /** @todo Ignore MSB in 32-bit mode. */
     1261
     1262            IEM_MC_LOCAL(RTUINT256U,            uSrc1);
     1263            IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc1, uSrc1, 1);
     1264            IEM_MC_FETCH_YREG_U256(uSrc1,       IEM_GET_EFFECTIVE_VVVV(pVCpu));
     1265
     1266            IEM_MC_LOCAL(RTUINT256U,            uSrc3);
     1267            IEM_MC_ARG_LOCAL_REF(PCRTUINT256U,  puSrc3, uSrc3, 3);
     1268            IEM_MC_FETCH_YREG_U256(uSrc3,       IEM_GET_IMM8_REG(pVCpu, bOp4));
     1269
     1270            IEM_MC_LOCAL(RTUINT256U,            uDst);
     1271            IEM_MC_ARG_LOCAL_REF(PRTUINT256U,   puDst,  uDst,  0);
     1272
    12621273            IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnU256, puDst, puSrc1, puSrc2, puSrc3);
    1263             IEM_MC_STORE_YREG_U256_ZX_VLMAX(   IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
    1264 
     1274
     1275            IEM_MC_STORE_YREG_U256_ZX_VLMAX(    IEM_GET_MODRM_REG(pVCpu, bRm), uDst);
    12651276            IEM_MC_ADVANCE_RIP_AND_FINISH();
    12661277            IEM_MC_END();
     
    12691280        {
    12701281            IEM_MC_BEGIN(4, 2, IEM_MC_F_NOT_286_OR_OLDER, 0);
    1271             IEM_MC_LOCAL(RTUINT128U,                uSrc2);
    1272             IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
    1273             IEM_MC_ARG(PRTUINT128U,                 puDst,         0);
    1274             IEM_MC_ARG(PCRTUINT128U,                puSrc1,        1);
    1275             IEM_MC_ARG_LOCAL_REF(PCRTUINT128U,      puSrc2, uSrc2, 2);
    1276             IEM_MC_ARG(PCRTUINT128U,                puSrc3,        3);
    1277 
     1282            IEM_MC_LOCAL(RTGCPTR,               GCPtrEffSrc);
    12781283            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    12791284            uint8_t bOp4; IEM_OPCODE_GET_NEXT_U8(&bOp4);
     
    12831288            IEM_MC_PREPARE_AVX_USAGE();
    12841289
     1290            IEM_MC_LOCAL(RTUINT128U,            uSrc2);
     1291            IEM_MC_ARG_LOCAL_REF(PCRTUINT128U,  puSrc2, uSrc2, 2);
    12851292            IEM_MC_FETCH_MEM_U128_NO_AC(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     1293
     1294            IEM_MC_ARG(PRTUINT128U,             puDst,         0);
    12861295            IEM_MC_REF_XREG_U128(puDst,         IEM_GET_MODRM_REG(pVCpu, bRm));
     1296            IEM_MC_ARG(PCRTUINT128U,            puSrc1,        1);
    12871297            IEM_MC_REF_XREG_U128_CONST(puSrc1,  IEM_GET_EFFECTIVE_VVVV(pVCpu));
    1288             IEM_MC_REF_XREG_U128_CONST(puSrc3, bOp4 >> 4); /** @todo Ignore MSB in 32-bit mode. */
     1298            IEM_MC_ARG(PCRTUINT128U,            puSrc3,        3);
     1299            IEM_MC_REF_XREG_U128_CONST(puSrc3,  IEM_GET_IMM8_REG(pVCpu, bOp4));
    12891300            IEM_MC_CALL_VOID_AIMPL_4(pImpl->pfnU128, puDst, puSrc1, puSrc2, puSrc3);
    12901301            IEM_MC_CLEAR_YREG_128_UP(           IEM_GET_MODRM_REG(pVCpu, bRm));
     
    13011312FNIEMOP_DEF(iemOp_vpblendvb_Vx_Hx_Wx_Lx)
    13021313{
    1303     //IEMOP_MNEMONIC4(VEX_RVM, VPBLENDVB, vpblendvb, Vx, Hx, Wx, Lx, DISOPTYPE_HARMLESS, 0); @todo
     1314    IEMOP_MNEMONIC4(VEX_RVMR, VPBLENDVB, vpblendvb, Vx_WO, Hx, Wx, Lx, DISOPTYPE_HARMLESS, IEMOPHINT_VEX_L_ZERO | IEMOPHINT_VEX_W_ZERO);
    13041315    IEMOPBLENDOP_INIT_VARS(vpblendvb);
    13051316    return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Hx_Wx_Lx, IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &s_Host, &s_Fallback));
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r103951 r103955  
    23892389/** The VEX.V value must be zero. */
    23902390#define IEMOPHINT_VEX_V_ZERO        RT_BIT_32(15)
     2391/** The REX.W/VEX.V value must be zero. */
     2392#define IEMOPHINT_REX_W_ZERO        RT_BIT_32(16)
     2393#define IEMOPHINT_VEX_W_ZERO        IEMOPHINT_REX_W_ZERO
     2394/** The REX.W/VEX.V value must be one. */
     2395#define IEMOPHINT_REX_W_ONE         RT_BIT_32(17)
     2396#define IEMOPHINT_VEX_W_ONE         IEMOPHINT_REX_W_ONE
    23912397
    23922398/** Hint to IEMAllInstructionPython.py that this macro should be skipped.  */
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