VirtualBox

Changeset 66321 in vbox


Ignore:
Timestamp:
Mar 29, 2017 7:30:33 AM (8 years ago)
Author:
vboxsync
Message:

IEM: Implemented movddup Vdq,Wdq (f2 0f 12).

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

Legend:

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

    r66314 r66321  
    13811381}
    13821382
     1383IEM_DECL_IMPL_DEF(void, iemAImpl_movddup,(PCX86FXSTATE pFpuState, PRTUINT128U puDst, uint64_t uSrc))
     1384{
     1385    RT_NOREF(pFpuState);
     1386    puDst->au64[0] = uSrc;
     1387    puDst->au64[1] = uSrc;
     1388}
     1389
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r66315 r66321  
    14061406 * @optest      op1=-1 op2=0xdddddddd00000002eeeeeeee00000001 ->
    14071407 *              op1=0x00000002000000020000000100000001
    1408  * @oponlytest
    14091408 */
    14101409FNIEMOP_DEF(iemOp_vmovsldup_Vx_Wx)
     
    14561455    }
    14571456    return VINF_SUCCESS;
    1458 
    1459 }
    1460 
    1461 /** Opcode 0xf2 0x0f 0x12. */
    1462 FNIEMOP_STUB(iemOp_vmovddup_Vx_Wx);  //NEXT
     1457}
     1458
     1459
     1460/**
     1461 * @opcode      0x12
     1462 * @oppfx       0xf2
     1463 * @opcpuid     sse3
     1464 * @opgroup     og_sse3_pcksclr_datamove
     1465 * @opxcpttype  5
     1466 * @optest      op1=-1 op2=0xddddddddeeeeeeee2222222211111111 ->
     1467 *              op1=0x22222222111111112222222211111111
     1468 */
     1469FNIEMOP_DEF(iemOp_vmovddup_Vx_Wx)
     1470{
     1471    IEMOP_MNEMONIC2(RM, MOVDDUP, movddup, Vdq, Wdq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     1472    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     1473    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     1474    {
     1475        /*
     1476         * Register, register.
     1477         */
     1478        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     1479        IEM_MC_BEGIN(2, 0);
     1480        IEM_MC_ARG(PRTUINT128U,                 puDst, 0);
     1481        IEM_MC_ARG(uint64_t,                    uSrc, 1);
     1482
     1483        IEM_MC_MAYBE_RAISE_SSE3_RELATED_XCPT();
     1484        IEM_MC_PREPARE_SSE_USAGE();
     1485
     1486        IEM_MC_FETCH_XREG_U64(uSrc, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     1487        IEM_MC_REF_XREG_U128(puDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     1488        IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_movddup, puDst, uSrc);
     1489
     1490        IEM_MC_ADVANCE_RIP();
     1491        IEM_MC_END();
     1492    }
     1493    else
     1494    {
     1495        /*
     1496         * Register, memory.
     1497         */
     1498        IEM_MC_BEGIN(2, 2);
     1499        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     1500        IEM_MC_ARG(PRTUINT128U,                 puDst, 0);
     1501        IEM_MC_ARG(uint64_t,                    uSrc, 1);
     1502
     1503        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     1504        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     1505        IEM_MC_MAYBE_RAISE_SSE3_RELATED_XCPT();
     1506        IEM_MC_PREPARE_SSE_USAGE();
     1507
     1508        IEM_MC_FETCH_MEM_U64(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     1509        IEM_MC_REF_XREG_U128(puDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     1510        IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_movddup, puDst, uSrc);
     1511
     1512        IEM_MC_ADVANCE_RIP();
     1513        IEM_MC_END();
     1514    }
     1515    return VINF_SUCCESS;
     1516}
     1517
    14631518
    14641519/** Opcode      0x0f 0x13 - vmovlps Mq, Vq */
     
    74947549/*  Opcode      0x0f 0xd6 - invalid */
    74957550/** Opcode 0x66 0x0f 0xd6 - vmovq Wq, Vq */
    7496 FNIEMOP_STUB(iemOp_vmovq_Wq_Vq);
     7551FNIEMOP_STUB(iemOp_vmovq_Wq_Vq); // NEXT!
    74977552/** Opcode 0xf3 0x0f 0xd6 - movq2dq Vdq, Nq */
    74987553FNIEMOP_STUB(iemOp_movq2dq_Vdq_Nq);
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r66314 r66321  
    15521552 * @{ */
    15531553IEM_DECL_IMPL_DEF(void, iemAImpl_movsldup,(PCX86FXSTATE pFpuState, PRTUINT128U puDst, PCRTUINT128U puSrc));
     1554IEM_DECL_IMPL_DEF(void, iemAImpl_movddup,(PCX86FXSTATE pFpuState, PRTUINT128U puDst, uint64_t uSrc));
    15541555/** @} */
    15551556
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