VirtualBox

Changeset 66978 in vbox for trunk/src/VBox


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

IEM: Implemented vmovapd Wpd,Vpd (VEX.66.0F 29).

File:
1 edited

Legend:

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

    r66977 r66978  
    13431343}
    13441344
    1345 /** Opcode VEX.66.0F 0x29 - vmovapd Wpd,Vpd */
    1346 FNIEMOP_STUB(iemOp_vmovapd_Wpd_Vpd);
    1347 //FNIEMOP_DEF(iemOp_vmovapd_Wpd_Vpd)
    1348 //{
    1349 //    IEMOP_MNEMONIC(vmovapd_Wpd_Vpd, "movapd Wpd,Vpd");
    1350 //    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    1351 //    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    1352 //    {
    1353 //        /*
    1354 //         * Register, register.
    1355 //         */
    1356 //        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1357 //        IEM_MC_BEGIN(0, 0);
    1358 //        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    1359 //        IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
    1360 //        IEM_MC_COPY_XREG_U128((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB,
    1361 //                              ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    1362 //        IEM_MC_ADVANCE_RIP();
    1363 //        IEM_MC_END();
    1364 //    }
    1365 //    else
    1366 //    {
    1367 //        /*
    1368 //         * Memory, register.
    1369 //         */
    1370 //        IEM_MC_BEGIN(0, 2);
    1371 //        IEM_MC_LOCAL(RTUINT128U,                uSrc); /** @todo optimize this one day... */
    1372 //        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
    1373 //
    1374 //        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
    1375 //        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    1376 //        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    1377 //        IEM_MC_ACTUALIZE_SSE_STATE_FOR_READ();
    1378 //
    1379 //        IEM_MC_FETCH_XREG_U128(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    1380 //        IEM_MC_STORE_MEM_U128_ALIGN_SSE(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc);
    1381 //
    1382 //        IEM_MC_ADVANCE_RIP();
    1383 //        IEM_MC_END();
    1384 //    }
    1385 //    return VINF_SUCCESS;
    1386 //}
    1387 
    1388 /*  Opcode VEX.F3.0F 0x29 - invalid */
    1389 /*  Opcode VEX.F2.0F 0x29 - invalid */
     1345/**
     1346 * @opcode      0x29
     1347 * @oppfx       66
     1348 * @opcpuid     avx
     1349 * @opgroup     og_avx_pcksclr_datamove
     1350 * @opxcpttype  1
     1351 * @optest      op1=1 op2=2 -> op1=2
     1352 * @optest      op1=0 op2=-42 -> op1=-42
     1353 * @note        Almost identical to vmovaps
     1354 */
     1355FNIEMOP_DEF(iemOp_vmovapd_Wpd_Vpd)
     1356{
     1357    IEMOP_MNEMONIC2(VEX_MR, VMOVAPD, vmovapd, Wpd_WO, Vpd, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     1358    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     1359    Assert(pVCpu->iem.s.uVexLength <= 1);
     1360    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     1361    {
     1362        /*
     1363         * Register, register.
     1364         */
     1365        IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     1366        IEM_MC_BEGIN(1, 0);
     1367
     1368        IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     1369        IEM_MC_ACTUALIZE_AVX_STATE_FOR_CHANGE();
     1370        if (pVCpu->iem.s.uVexLength == 0)
     1371            IEM_MC_COPY_YREG_U128_ZX_VLMAX((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB,
     1372                ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     1373        else
     1374            IEM_MC_COPY_YREG_U256_ZX_VLMAX((bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB,
     1375                                           ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     1376        IEM_MC_ADVANCE_RIP();
     1377        IEM_MC_END();
     1378    }
     1379    else
     1380    {
     1381        /*
     1382         * Register, memory.
     1383         */
     1384        if (pVCpu->iem.s.uVexLength == 0)
     1385        {
     1386            IEM_MC_BEGIN(0, 2);
     1387            IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     1388            IEM_MC_LOCAL(RTUINT128U,                uSrc);
     1389
     1390            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     1391            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     1392            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     1393            IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     1394
     1395            IEM_MC_FETCH_YREG_U128(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     1396            IEM_MC_STORE_MEM_U128_ALIGN_SSE(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc);
     1397
     1398            IEM_MC_ADVANCE_RIP();
     1399            IEM_MC_END();
     1400        }
     1401        else
     1402        {
     1403            IEM_MC_BEGIN(0, 2);
     1404            IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     1405            IEM_MC_LOCAL(RTUINT256U,                uSrc);
     1406
     1407            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     1408            IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV();
     1409            IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT();
     1410            IEM_MC_ACTUALIZE_AVX_STATE_FOR_READ();
     1411
     1412            IEM_MC_FETCH_YREG_U256(uSrc, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     1413            IEM_MC_STORE_MEM_U256_ALIGN_AVX(pVCpu->iem.s.iEffSeg, GCPtrEffSrc, uSrc);
     1414
     1415            IEM_MC_ADVANCE_RIP();
     1416            IEM_MC_END();
     1417        }
     1418    }
     1419    return VINF_SUCCESS;
     1420}
     1421
     1422
     1423/**
     1424 * @opmnemonic  udvexf30f29
     1425 * @opcode      0x29
     1426 * @oppfx       0xf3
     1427 * @opunused    vex.modrm
     1428 * @opcpuid     avx
     1429 * @optest      ->
     1430 * @opdone
     1431 */
     1432
     1433/**
     1434 * @opmnemonic  udvexf20f29
     1435 * @opcode      0x29
     1436 * @oppfx       0xf2
     1437 * @opunused    vex.modrm
     1438 * @opcpuid     avx
     1439 * @optest      ->
     1440 * @opdone
     1441 */
    13901442
    13911443
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