VirtualBox

Changeset 66785 in vbox


Ignore:
Timestamp:
May 4, 2017 11:48:37 AM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
115197
Message:

IEM: Implemented movlhps Vdq,Uq and movhps Vdq,Mq (0f 16).

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/disopcode.h

    r66747 r66785  
    183183    OP_UNPCKLPS,
    184184    OP_MOVHPS,
     185    OP_MOVLHPS = OP_MOVHPS, /**< @todo OP_MOVLHPS */
    185186    OP_UNPCKHPS,
    186187    OP_PREFETCH_GRP16,
     
    10641065/* For making IEM / bs3-cpu-generated-1 happy: */
    10651066#define OP_PARM_Uq              (OP_PARM_U+OP_PARM_q)
    1066 #define OP_PARM_UqHi            OP_PARM_Uq
     1067#define OP_PARM_UqHi            (OP_PARM_U+OP_PARM_dq)
    10671068#define OP_PARM_WqZxReg         OP_PARM_Wq              /**< Annotates that register targets get their upper bits cleared. */
    10681069#define OP_PARM_VssZxReg        OP_PARM_Vss             /**< Annotates that register targets get their upper bits cleared. */
    10691070#define OP_PARM_VsdZxReg        OP_PARM_Vsd             /**< Annotates that register targets get their upper bits cleared. */
     1071#define OP_PARM_VqHi            OP_PARM_Vdq             /**< Annotates that only YMM/XMM[127:64] are accessed. */
    10701072#define OP_PARM_MbRO            OP_PARM_Mb              /**< Annotates read only memory byte operand. */
    10711073#define OP_PARM_MdRO            OP_PARM_Md              /**< Annotates read only memory byte operand. */
  • trunk/src/VBox/VMM/VMMAll/IEMAll.cpp

    r66712 r66785  
    1118011180         IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[1] = 0; \
    1118111181    } while (0)
     11182#define IEM_MC_STORE_XREG_HI_U64(a_iXReg, a_u64Value) \
     11183    do { IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].au64[1] = (a_u64Value); } while (0)
    1118211184#define IEM_MC_REF_XREG_U128(a_pu128Dst, a_iXReg)       \
    1118311185    (a_pu128Dst) = (&IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aXMM[(a_iXReg)].uXmm)
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsPython.py

    r66747 r66785  
    248248    'Vpd':  ( 'IDX_UseModRM',       'reg',    '%Vpd', 'Vpd',     ),
    249249    'Vq':   ( 'IDX_UseModRM',       'reg',    '%Vq',  'Vq',      ),
    250     'Vdq':  ( 'IDX_UseModRM',       'reg',    '%Vpd', 'Vpd',     ),
     250    'Vdq':  ( 'IDX_UseModRM',       'reg',    '%Vdq', 'Vdq',     ),
     251    'VqHi': ( 'IDX_UseModRM',       'reg',    '%Vdq', 'VdqHi',   ),
    251252
    252253    # Immediate values.
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r66748 r66785  
    18111811 */
    18121812
    1813 /** Opcode      0x0f 0x16 - movhpsv1 Vdq, Mq movlhps Vdq, Uq   */
    1814 FNIEMOP_STUB(iemOp_movhpsv1_Vdq_Mq__movlhps_Vdq_Uq);  //NEXT
     1813FNIEMOP_DEF(iemOp_movhps_Vdq_Mq__movlhps_Vdq_Uq)
     1814{
     1815    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     1816    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     1817    {
     1818        /**
     1819         * @opcode      0x16
     1820         * @opcodesub   11 mr/reg
     1821         * @oppfx       none
     1822         * @opcpuid     sse
     1823         * @opgroup     og_sse_simdfp_datamove
     1824         * @opxcpttype  5
     1825         * @optest      op1=1 op2=2 -> op1=2
     1826         * @optest      op1=0 op2=-42 -> op1=-42
     1827         */
     1828        IEMOP_MNEMONIC2(RM_REG, MOVLHPS, movlhps, VqHi, Uq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     1829
     1830        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     1831        IEM_MC_BEGIN(0, 1);
     1832        IEM_MC_LOCAL(uint64_t,                  uSrc);
     1833
     1834        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     1835        IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
     1836        IEM_MC_FETCH_XREG_U64(uSrc, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     1837        IEM_MC_STORE_XREG_HI_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, uSrc);
     1838
     1839        IEM_MC_ADVANCE_RIP();
     1840        IEM_MC_END();
     1841    }
     1842    else
     1843    {
     1844        /**
     1845         * @opdone
     1846         * @opcode      0x16
     1847         * @opcodesub   !11 mr/reg
     1848         * @oppfx       none
     1849         * @opcpuid     sse
     1850         * @opgroup     og_sse_simdfp_datamove
     1851         * @opxcpttype  5
     1852         * @optest      op1=1 op2=2 -> op1=2
     1853         * @optest      op1=0 op2=-42 -> op1=-42
     1854         * @opfunction  iemOp_movhps_Vdq_Mq__movlhps_Vdq_Uq
     1855         */
     1856        IEMOP_MNEMONIC2(RM_MEM, MOVHPS, movhps, VqHi, Mq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     1857
     1858        IEM_MC_BEGIN(0, 2);
     1859        IEM_MC_LOCAL(uint64_t,                  uSrc);
     1860        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     1861
     1862        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     1863        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     1864        IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     1865        IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
     1866
     1867        IEM_MC_FETCH_MEM_U64(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     1868        IEM_MC_STORE_XREG_HI_U64(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, uSrc);
     1869
     1870        IEM_MC_ADVANCE_RIP();
     1871        IEM_MC_END();
     1872    }
     1873    return VINF_SUCCESS;
     1874}
     1875
    18151876/** Opcode 0x66 0x0f 0x16 - movhpdv1 Vdq, Mq   */
    1816 FNIEMOP_STUB(iemOp_movhpdv1_Vdq_Mq);  //NEXT
     1877FNIEMOP_STUB(iemOp_movhpd_Vdq_Mq);  //NEXT
    18171878/** Opcode 0xf3 0x0f 0x16 - movshdup Vx, Wx   */
    18181879FNIEMOP_STUB(iemOp_movshdup_Vx_Wx); //NEXT
     
    18301891
    18311892/** Opcode      0x0f 0x17 - movhpsv1 Mq, Vq   */
    1832 FNIEMOP_STUB(iemOp_movhpsv1_Mq_Vq);  //NEXT
     1893FNIEMOP_STUB(iemOp_movhps_Mq_Vq);  //NEXT
    18331894/** Opcode 0x66 0x0f 0x17 - movhpdv1 Mq, Vq   */
    1834 FNIEMOP_STUB(iemOp_movhpdv1_Mq_Vq);  //NEXT
     1895FNIEMOP_STUB(iemOp_movhpd_Mq_Vq);  //NEXT
    18351896
    18361897/**
     
    85588619    /* 0x0f */  IEMOP_X4(iemOp_3Dnow),
    85598620
    8560     /* 0x10 */  iemOp_movups_Vps_Wps,       iemOp_movupd_Vpd_Wpd,      iemOp_movss_Vss_Wss,        iemOp_movsd_Vsd_Wsd,
    8561     /* 0x11 */  iemOp_movups_Wps_Vps,       iemOp_movupd_Wpd_Vpd,      iemOp_movss_Wss_Vss,        iemOp_movsd_Wsd_Vsd,
    8562     /* 0x12 */  iemOp_movlps_Vq_Mq__movhlps, iemOp_movlpd_Vq_Mq,       iemOp_movsldup_Vdq_Wdq,     iemOp_movddup_Vdq_Wdq,
    8563     /* 0x13 */  iemOp_movlps_Mq_Vq,         iemOp_movlpd_Mq_Vq,        iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    8564     /* 0x14 */  iemOp_unpcklps_Vx_Wx,       iemOp_unpcklpd_Vx_Wx,      iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    8565     /* 0x15 */  iemOp_unpckhps_Vx_Wx,       iemOp_unpckhpd_Vx_Wx,      iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    8566     /* 0x16 */  iemOp_movhpsv1_Vdq_Mq__movlhps_Vdq_Uq,  iemOp_movhpdv1_Vdq_Mq, iemOp_movshdup_Vx_Wx, iemOp_InvalidNeedRM,
    8567     /* 0x17 */  iemOp_movhpsv1_Mq_Vq,       iemOp_movhpdv1_Mq_Vq,      iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
     8621    /* 0x10 */  iemOp_movups_Vps_Wps,       iemOp_movupd_Vpd_Wpd,       iemOp_movss_Vss_Wss,        iemOp_movsd_Vsd_Wsd,
     8622    /* 0x11 */  iemOp_movups_Wps_Vps,       iemOp_movupd_Wpd_Vpd,       iemOp_movss_Wss_Vss,        iemOp_movsd_Wsd_Vsd,
     8623    /* 0x12 */  iemOp_movlps_Vq_Mq__movhlps, iemOp_movlpd_Vq_Mq,        iemOp_movsldup_Vdq_Wdq,     iemOp_movddup_Vdq_Wdq,
     8624    /* 0x13 */  iemOp_movlps_Mq_Vq,         iemOp_movlpd_Mq_Vq,         iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
     8625    /* 0x14 */  iemOp_unpcklps_Vx_Wx,       iemOp_unpcklpd_Vx_Wx,       iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
     8626    /* 0x15 */  iemOp_unpckhps_Vx_Wx,       iemOp_unpckhpd_Vx_Wx,       iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
     8627    /* 0x16 */  iemOp_movhps_Vdq_Mq__movlhps_Vdq_Uq, iemOp_movhpd_Vdq_Mq, iemOp_movshdup_Vx_Wx,    iemOp_InvalidNeedRM,
     8628    /* 0x17 */  iemOp_movhps_Mq_Vq,         iemOp_movhpd_Mq_Vq,         iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    85688629    /* 0x18 */  IEMOP_X4(iemOp_prefetch_Grp16),
    85698630    /* 0x19 */  IEMOP_X4(iemOp_nop_Ev),
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r66581 r66785  
    511511#define IEM_MC_STORE_XREG_U32(a_iXReg, a_u32Value)          do { CHK_TYPE(uint32_t,  a_u32Value);  (void)fSseWrite; } while (0)
    512512#define IEM_MC_STORE_XREG_U32_ZX_U128(a_iXReg, a_u32Value)  do { CHK_TYPE(uint32_t,  a_u32Value);  (void)fSseWrite; } while (0)
     513#define IEM_MC_STORE_XREG_HI_U64(a_iXReg, a_u64Value)       do { CHK_TYPE(uint64_t,  a_u64Value);  (void)fSseWrite; } while (0)
    513514#define IEM_MC_REF_XREG_U128(a_pu128Dst, a_iXReg)           do { (a_pu128Dst) = (PRTUINT128U)((uintptr_t)0);        CHK_PTYPE(PRTUINT128U, a_pu128Dst);       (void)fSseWrite; } while (0)
    514515#define IEM_MC_REF_XREG_U128_CONST(a_pu128Dst, a_iXReg)     do { (a_pu128Dst) = (PCRTUINT128U)((uintptr_t)0);  CHK_PTYPE(PCRTUINT128U, a_pu128Dst); (void)fSseWrite; } while (0)
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1-template.c

    r66747 r66785  
    16291629
    16301630
     1631static unsigned BS3_NEAR_CODE Bs3Cg1EncodeNext_BS3CG1ENC_MODRM_VqHi_Uq(PBS3CG1STATE pThis, unsigned iEncoding)
     1632{
     1633    unsigned off;
     1634    if (iEncoding == 0)
     1635    {
     1636        off = Bs3Cg1InsertOpcodes(pThis, Bs3Cg1InsertReqPrefix(pThis, 0));
     1637        pThis->abCurInstr[off++] = X86_MODRM_MAKE(3, 1, 0);
     1638        pThis->aOperands[pThis->iRmOp ].idxField = BS3CG1DST_XMM0_LO;
     1639        pThis->aOperands[pThis->iRegOp].idxField = BS3CG1DST_XMM1_HI;
     1640    }
     1641    else if (iEncoding == 1)
     1642    {
     1643        off = Bs3Cg1InsertOpcodes(pThis, Bs3Cg1InsertReqPrefix(pThis, 0));
     1644        pThis->abCurInstr[off++] = X86_MODRM_MAKE(3, 2, 2);
     1645        pThis->aOperands[pThis->iRmOp ].idxField = BS3CG1DST_XMM2_LO;
     1646        pThis->aOperands[pThis->iRegOp].idxField = BS3CG1DST_XMM2_HI;
     1647    }
     1648    else
     1649        return 0;
     1650    pThis->cbCurInstr = off;
     1651    return iEncoding + 1;
     1652}
     1653
     1654
     1655static unsigned BS3_NEAR_CODE Bs3Cg1EncodeNext_BS3CG1ENC_MODRM_VqHi_Mq(PBS3CG1STATE pThis, unsigned iEncoding)
     1656{
     1657    unsigned off;
     1658    if (iEncoding == 0)
     1659    {
     1660        pThis->aOperands[pThis->iRegOp].idxField = BS3CG1DST_XMM2_HI;
     1661        off = Bs3Cg1InsertOpcodes(pThis, Bs3Cg1InsertReqPrefix(pThis, 0));
     1662        off = Bs3Cfg1EncodeMemMod0Disp(pThis, false, off, 2 /*iReg*/, 8, 0, BS3CG1OPLOC_MEM);
     1663    }
     1664    else if (iEncoding == 1)
     1665    {
     1666        pThis->aOperands[pThis->iRegOp].idxField = BS3CG1DST_XMM3_HI;
     1667        off = Bs3Cg1InsertOpcodes(pThis, Bs3Cg1InsertReqPrefix(pThis, 0));
     1668        off = Bs3Cfg1EncodeMemMod0Disp(pThis, false, off, 3 /*iReg*/, 8, 1 /*cbMissalign*/, BS3CG1OPLOC_MEM);
     1669    }
     1670    else
     1671        return 0;
     1672    pThis->cbCurInstr = off;
     1673    return iEncoding + 1;
     1674}
     1675
     1676
    16311677static unsigned BS3_NEAR_CODE Bs3Cg1EncodeNext_BS3CG1ENC_MODRM_Vdq_Wdq(PBS3CG1STATE pThis, unsigned iEncoding)
    16321678{
     
    21502196        case BS3CG1ENC_MODRM_Vq_Mq:
    21512197            return Bs3Cg1EncodeNext_BS3CG1ENC_MODRM_Vq_Mq(pThis, iEncoding);
     2198        case BS3CG1ENC_MODRM_VqHi_Uq:
     2199            return Bs3Cg1EncodeNext_BS3CG1ENC_MODRM_VqHi_Uq(pThis, iEncoding);
     2200        case BS3CG1ENC_MODRM_VqHi_Mq:
     2201            return Bs3Cg1EncodeNext_BS3CG1ENC_MODRM_VqHi_Mq(pThis, iEncoding);
    21522202        case BS3CG1ENC_MODRM_Vdq_Wdq:
    21532203            return Bs3Cg1EncodeNext_BS3CG1ENC_MODRM_Vdq_Wdq(pThis, iEncoding);
     
    23182368
    23192369        case BS3CG1ENC_MODRM_Vq_UqHi:
     2370        case BS3CG1ENC_MODRM_VqHi_Uq:
    23202371            pThis->iRmOp             = 1;
    23212372            pThis->iRegOp            = 0;
     
    23272378
    23282379        case BS3CG1ENC_MODRM_Vq_Mq:
     2380        case BS3CG1ENC_MODRM_VqHi_Mq:
    23292381            pThis->iRmOp             = 1;
    23302382            pThis->iRegOp            = 0;
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1.h

    r66747 r66785  
    6363    BS3CG1OP_Vq,
    6464    BS3CG1OP_Vdq,
     65    BS3CG1OP_VqHi,
    6566
    6667    BS3CG1OP_Ib,
     
    106107    BS3CG1ENC_MODRM_Vq_UqHi,
    107108    BS3CG1ENC_MODRM_Vq_Mq,
     109    BS3CG1ENC_MODRM_VqHi_Uq,
     110    BS3CG1ENC_MODRM_VqHi_Mq,
    108111    BS3CG1ENC_MODRM_Vdq_Wdq,
    109112    BS3CG1ENC_MODRM_Vpd_Wpd,
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette