VirtualBox

Changeset 66789 in vbox for trunk/src/VBox/VMM/VMMAll


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

IEM: Implemented movshdup Vdq,Wdq (f3 0f 16).

Location:
trunk/src/VBox/VMM/VMMAll
Files:
2 edited

Legend:

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

    r66321 r66789  
    13811381}
    13821382
     1383
     1384IEM_DECL_IMPL_DEF(void, iemAImpl_movshdup,(PCX86FXSTATE pFpuState, PRTUINT128U puDst, PCRTUINT128U puSrc))
     1385{
     1386    RT_NOREF(pFpuState);
     1387    puDst->au32[0] = puSrc->au32[1];
     1388    puDst->au32[1] = puSrc->au32[1];
     1389    puDst->au32[2] = puSrc->au32[3];
     1390    puDst->au32[3] = puSrc->au32[3];
     1391}
     1392
     1393
    13831394IEM_DECL_IMPL_DEF(void, iemAImpl_movddup,(PCX86FXSTATE pFpuState, PRTUINT128U puDst, uint64_t uSrc))
    13841395{
     
    13881399}
    13891400
     1401
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r66787 r66789  
    19221922
    19231923
    1924 /** Opcode 0xf3 0x0f 0x16 - movshdup Vx, Wx   */
    1925 FNIEMOP_STUB(iemOp_movshdup_Vx_Wx); //NEXT
     1924/**
     1925 * @opcode      0x16
     1926 * @oppfx       0xf3
     1927 * @opcpuid     sse3
     1928 * @opgroup     og_sse3_pcksclr_datamove
     1929 * @opxcpttype  4
     1930 * @optest      op1=-1 op2=0x00000002dddddddd00000001eeeeeeee ->
     1931 *              op1=0x00000002000000020000000100000001
     1932 * @oponly
     1933 */
     1934FNIEMOP_DEF(iemOp_movshdup_Vdq_Wdq)
     1935{
     1936    IEMOP_MNEMONIC2(RM, MOVSHDUP, movshdup, Vdq, Wdq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     1937    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     1938    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     1939    {
     1940        /*
     1941         * Register, register.
     1942         */
     1943        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     1944        IEM_MC_BEGIN(2, 0);
     1945        IEM_MC_ARG(PRTUINT128U,                 puDst, 0);
     1946        IEM_MC_ARG(PCRTUINT128U,                puSrc, 1);
     1947
     1948        IEM_MC_MAYBE_RAISE_SSE3_RELATED_XCPT();
     1949        IEM_MC_PREPARE_SSE_USAGE();
     1950
     1951        IEM_MC_REF_XREG_U128_CONST(puSrc, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     1952        IEM_MC_REF_XREG_U128(puDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     1953        IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_movshdup, puDst, puSrc);
     1954
     1955        IEM_MC_ADVANCE_RIP();
     1956        IEM_MC_END();
     1957    }
     1958    else
     1959    {
     1960        /*
     1961         * Register, memory.
     1962         */
     1963        IEM_MC_BEGIN(2, 2);
     1964        IEM_MC_LOCAL(RTUINT128U,                uSrc);
     1965        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     1966        IEM_MC_ARG(PRTUINT128U,                 puDst, 0);
     1967        IEM_MC_ARG_LOCAL_REF(PCRTUINT128U,      puSrc, uSrc, 1);
     1968
     1969        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     1970        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     1971        IEM_MC_MAYBE_RAISE_SSE3_RELATED_XCPT();
     1972        IEM_MC_PREPARE_SSE_USAGE();
     1973
     1974        IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     1975        IEM_MC_REF_XREG_U128(puDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     1976        IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_movshdup, puDst, puSrc);
     1977
     1978        IEM_MC_ADVANCE_RIP();
     1979        IEM_MC_END();
     1980    }
     1981    return VINF_SUCCESS;
     1982}
    19261983
    19271984/**
     
    86718728    /* 0x14 */  iemOp_unpcklps_Vx_Wx,       iemOp_unpcklpd_Vx_Wx,       iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    86728729    /* 0x15 */  iemOp_unpckhps_Vx_Wx,       iemOp_unpckhpd_Vx_Wx,       iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    8673     /* 0x16 */  iemOp_movhps_Vdq_Mq__movlhps_Vdq_Uq, iemOp_movhpd_Vdq_Mq, iemOp_movshdup_Vx_Wx,     iemOp_InvalidNeedRM,
     8730    /* 0x16 */  iemOp_movhps_Vdq_Mq__movlhps_Vdq_Uq, iemOp_movhpd_Vdq_Mq, iemOp_movshdup_Vdq_Wdq,   iemOp_InvalidNeedRM,
    86748731    /* 0x17 */  iemOp_movhps_Mq_Vq,         iemOp_movhpd_Mq_Vq,         iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    86758732    /* 0x18 */  IEMOP_X4(iemOp_prefetch_Grp16),
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