VirtualBox

Changeset 66976 in vbox for trunk


Ignore:
Timestamp:
May 19, 2017 12:23:32 PM (8 years ago)
Author:
vboxsync
Message:

IEM: Implemented vmovapd Vpd,Wpd (VEX.66.28).

Location:
trunk/src/VBox
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsPython.py

    r66966 r66976  
    384384    'ModR/M':       [ 'BS3CG1ENC_MODRM', ],     ##< ModR/M
    385385    'VEX.ModR/M':   [ 'BS3CG1ENC_VEX_MODRM', ], ##< VEX...ModR/M
    386     'fixed':        [ 'BS3CG1ENC_FIXED', ],     ##< Fixed encoding (address, registers, etc).
     386    'fixed':        [ 'BS3CG1ENC_FIXED', ],     ##< Fixed encoding (address, registers, unused, etc).
     387    'VEX.fixed':    [ 'BS3CG1ENC_VEX_FIXED', ], ##< VEX + fixed encoding (address, registers, unused, etc).
    387388    'prefix':       [ None, ],                  ##< Prefix
    388389};
     
    391392g_kdInvalidStyles = {
    392393    'immediate':                [], ##< CPU stops decoding immediately after the opcode.
     394    'vex.modrm':                [], ##< VEX+ModR/M, everyone.
    393395    'intel-modrm':              [], ##< Intel decodes ModR/M.
    394396    'intel-modrm-imm8':         [], ##< Intel decodes ModR/M and an 8-byte immediate.
     
    17781780                    oInstr.sEncoding = 'VEX.ModR/M' if oInstr.onlyInVexMaps() else 'ModR/M';
    17791781                else:
    1780                     oInstr.sEncoding = 'fixed';
     1782                    oInstr.sEncoding = 'VEX.fixed' if oInstr.onlyInVexMaps() else 'fixed';
    17811783            elif oInstr.aoOperands[0].usesModRM():
    17821784                if     (len(oInstr.aoOperands) >= 2 and oInstr.aoOperands[1].sWhere == 'vvvv') \
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap1.cpp.h

    r66972 r66976  
    10991099 * @optest      op1=1 op2=2 -> op1=2
    11001100 * @optest      op1=0 op2=-42 -> op1=-42
     1101 * @note        Almost identical to vmovapd.
    11011102 */
    11021103FNIEMOP_DEF(iemOp_vmovaps_Vps_Wps)
     
    11681169
    11691170
    1170 
    1171 /** Opcode VEX.66.0F 0x28 - vmovapd Vpd, Wpd */
    1172 FNIEMOP_STUB(iemOp_vmovapd_Vpd_Wpd);
    1173 //FNIEMOP_DEF(iemOp_vmovapd_Vpd_Wpd)
    1174 //{
    1175 //    IEMOP_MNEMONIC(vmovapd_Wpd_Wpd, "vmovapd Wpd,Wpd");
    1176 //    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    1177 //    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    1178 //    {
    1179 //        /*
    1180 //         * Register, register.
    1181 //         */
    1182 //        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1183 //        IEM_MC_BEGIN(0, 0);
    1184 //        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    1185 //        IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
    1186 //        IEM_MC_COPY_XREG_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
    1187 //                              (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    1188 //        IEM_MC_ADVANCE_RIP();
    1189 //        IEM_MC_END();
    1190 //    }
    1191 //    else
    1192 //    {
    1193 //        /*
    1194 //         * Register, memory.
    1195 //         */
    1196 //        IEM_MC_BEGIN(0, 2);
    1197 //        IEM_MC_LOCAL(RTUINT128U,                uSrc); /** @todo optimize this one day... */
    1198 //        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
    1199 //
    1200 //        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1201 //        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1202 //        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    1203 //        IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
    1204 //
    1205 //        IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    1206 //        IEM_MC_STORE_XREG_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, uSrc);
    1207 //
    1208 //        IEM_MC_ADVANCE_RIP();
    1209 //        IEM_MC_END();
    1210 //    }
    1211 //    return VINF_SUCCESS;
    1212 //}
    1213 
    1214 /*  Opcode VEX.F3.0F 0x28 - invalid */
    1215 /*  Opcode VEX.F2.0F 0x28 - invalid */
     1171/**
     1172 * @opcode      0x28
     1173 * @oppfx       66
     1174 * @opcpuid     avx
     1175 * @opgroup     og_avx_pcksclr_datamove
     1176 * @opxcpttype  1
     1177 * @optest      op1=1 op2=2 -> op1=2
     1178 * @optest      op1=0 op2=-42 -> op1=-42
     1179 * @note        Almost identical to vmovaps
     1180 */
     1181FNIEMOP_DEF(iemOp_vmovapd_Vpd_Wpd)
     1182{
     1183    IEMOP_MNEMONIC2(VEX_RM, VMOVAPD, vmovapd, Vpd_WO, Wpd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     1184    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     1185    Assert(pVCpu->iem.s.uVexLength <= 1);
     1186    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     1187    {
     1188        /*
     1189         * Register, register.
     1190         */
     1191        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     1192        IEM_MC_BEGIN(1, 0);
     1193
     1194        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     1195        IEM_MC_PREPARE_AVX_USAGE();
     1196        if (pVCpu->iem.s.uVexLength == 0)
     1197            IEM_MC_COPY_YREG_U128_ZX_VLMAX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
     1198                                           (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     1199        else
     1200            IEM_MC_COPY_YREG_U256_ZX_VLMAX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg,
     1201                                           (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     1202        IEM_MC_ADVANCE_RIP();
     1203        IEM_MC_END();
     1204    }
     1205    else
     1206    {
     1207        /*
     1208         * Register, memory.
     1209         */
     1210        if (pVCpu->iem.s.uVexLength == 0)
     1211        {
     1212            IEM_MC_BEGIN(0, 2);
     1213            IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     1214            IEM_MC_LOCAL(RTUINT128U,                uSrc);
     1215
     1216            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     1217            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     1218            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     1219            IEM_MC_PREPARE_AVX_USAGE();
     1220
     1221            IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     1222            IEM_MC_STORE_YREG_U128_ZX_VLMAX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, uSrc);
     1223
     1224            IEM_MC_ADVANCE_RIP();
     1225            IEM_MC_END();
     1226        }
     1227        else
     1228        {
     1229            IEM_MC_BEGIN(0, 2);
     1230            IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     1231            IEM_MC_LOCAL(RTUINT256U,                uSrc);
     1232
     1233            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     1234            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     1235            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     1236            IEM_MC_PREPARE_AVX_USAGE();
     1237
     1238            IEM_MC_FETCH_MEM_U256_ALIGN_AVX(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     1239            IEM_MC_STORE_YREG_U256_ZX_VLMAX(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, uSrc);
     1240
     1241            IEM_MC_ADVANCE_RIP();
     1242            IEM_MC_END();
     1243        }
     1244    }
     1245    return VINF_SUCCESS;
     1246}
     1247
     1248/**
     1249 * @opmnemonic  udvexf30f28
     1250 * @opcode      0x28
     1251 * @oppfx       0xf3
     1252 * @opunused    vex.modrm
     1253 * @opcpuid     avx
     1254 * @optest      ->
     1255 * @opdone
     1256 */
     1257
     1258/**
     1259 * @opmnemonic  udvexf20f28
     1260 * @opcode      0x28
     1261 * @oppfx       0xf2
     1262 * @opunused    vex.modrm
     1263 * @opcpuid     avx
     1264 * @optest      ->
     1265 * @opdone
     1266 */
    12161267
    12171268/** Opcode VEX.0F 0x29 - vmovaps Wps, Vps */
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1-data.py

    r66968 r66976  
    317317                else:
    318318                    raise Exception('Unhandled sSubOpcode=%s for sInvalidStyle=%s' % (oInstr.sSubOpcode, oInstr.sInvalidStyle));
     319            elif oInstr.sInvalidStyle == 'vex.modrm':
     320                self.sEncoding = 'BS3CG1ENC_VEX_MODRM';
    319321
    320322        self.asFlags            = [];
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1-template.c

    r66974 r66976  
    20492049        off = Bs3Cg1InsertOpcodes(pThis, Bs3Cg1InsertReqPrefix(pThis, 0));
    20502050        pThis->cbCurInstr = off;
    2051         iEncoding++;
    20522051    }
    20532052    else
     
    33433342
    33443343
     3344//static unsigned BS3_NEAR_CODE Bs3Cg1EncodeNext_VEX_FIXED(PBS3CG1STATE pThis, unsigned iEncoding)
     3345//{
     3346//    unsigned off;
     3347//    if (iEncoding == 0)
     3348//        off = Bs3Cg1InsertVex2bPrefix(pThis, 0 /*offDst*/, 0xf /*~V*/, 0 /*L*/, 1 /*~R*/);
     3349//    else if (iEncoding == 0)
     3350//        off = Bs3Cg1InsertVex3bPrefix(pThis, 0 /*offDst*/, 0xf /*~V*/, 0 /*L*/, 1 /*~R*/, 1 /*~X*/, 1 /*~B*/, 0 /*W*/);
     3351//    else
     3352//        return 0;
     3353//    pThis->cbCurInstr = off;
     3354//    return iEncoding + 1;
     3355//}
     3356
     3357
    33453358static unsigned BS3_NEAR_CODE Bs3Cg1EncodeNext_VEX_MODRM_MOD_EQ_3(PBS3CG1STATE pThis, unsigned iEncoding)
    33463359{
     
    34203433    pThis->cbCurInstr = off;
    34213434    return iEncoding + 1;
     3435}
     3436
     3437
     3438static unsigned BS3_NEAR_CODE Bs3Cg1EncodeNext_VEX_MODRM(PBS3CG1STATE pThis, unsigned iEncoding)
     3439{
     3440    const unsigned cFirstEncodings = 32;
     3441    if (iEncoding < cFirstEncodings)
     3442    {
     3443        unsigned iRet = Bs3Cg1EncodeNext_VEX_MODRM_MOD_EQ_3(pThis, iEncoding);
     3444        BS3_ASSERT(iRet > iEncoding);
     3445        return iRet;
     3446    }
     3447    return Bs3Cg1EncodeNext_VEX_MODRM_MOD_NE_3(pThis, iEncoding - cFirstEncodings) + cFirstEncodings;
    34223448}
    34233449
     
    39583984
    39593985            /* Unused or invalid instructions mostly. */
     3986        //case BS3CG1ENC_VEX_FIXED:
     3987        //    pThis->pfnEncoder = Bs3Cg1EncodeNext_VEX_FIXED;
     3988        //    break;
    39603989        case BS3CG1ENC_VEX_MODRM_MOD_EQ_3:
    39613990            pThis->pfnEncoder = Bs3Cg1EncodeNext_VEX_MODRM_MOD_EQ_3;
     
    39633992        case BS3CG1ENC_VEX_MODRM_MOD_NE_3:
    39643993            pThis->pfnEncoder = Bs3Cg1EncodeNext_VEX_MODRM_MOD_NE_3;
     3994            break;
     3995        case BS3CG1ENC_VEX_MODRM:
     3996            pThis->pfnEncoder = Bs3Cg1EncodeNext_VEX_MODRM;
    39653997            break;
    39663998
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1.h

    r66968 r66976  
    176176    BS3CG1ENC_MODRM_MOD_EQ_3, /**< Unused or invalid instruction. */
    177177    BS3CG1ENC_MODRM_MOD_NE_3, /**< Unused or invalid instruction. */
     178    //BS3CG1ENC_VEX_FIXED,          /**< Unused or invalid instruction. */
    178179    BS3CG1ENC_VEX_MODRM_MOD_EQ_3, /**< Unused or invalid instruction. */
    179180    BS3CG1ENC_VEX_MODRM_MOD_NE_3, /**< Unused or invalid instruction. */
     181    BS3CG1ENC_VEX_MODRM,          /**< Unused or invalid instruction. */
    180182
    181183    BS3CG1ENC_END
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