VirtualBox

Changeset 67004 in vbox for trunk/src/VBox


Ignore:
Timestamp:
May 22, 2017 10:20:28 AM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
115562
Message:

IEM: movq Vq,Eq & movd Vd,Ed docs+tests+fixes.

Location:
trunk/src/VBox
Files:
4 edited

Legend:

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

    r67003 r67004  
    263263    'Pq':           ( 'IDX_UseModRM',       'reg',    '%Pq',  'Pq',      ),
    264264    'Pq_WO':        ( 'IDX_UseModRM',       'reg',    '%Pq',  'Pq',      ),
     265    'VdZx_WO':      ( 'IDX_UseModRM',       'reg',    '%Vd',  'Vd',      ),
    265266    'Vss':          ( 'IDX_UseModRM',       'reg',    '%Vss', 'Vss',     ),
    266267    'Vss_WO':       ( 'IDX_UseModRM',       'reg',    '%Vss', 'Vss',     ),
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r67003 r67004  
    34653465         * @optest      64-bit / op1=0 op2=-42 -> op1=-42 ftw=0xff
    34663466         */
    3467         IEMOP_MNEMONIC2(RM, MOVQ, movq, Pq_WO, Eq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
     3467        IEMOP_MNEMONIC2(RM, MOVQ, movq, Pq_WO, Eq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OZ_PFX);
    34683468        if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    34693469        {
     
    35173517         * @optest      op1=0 op2=-42 -> op1=-42 ftw=0xff
    35183518         */
    3519         IEMOP_MNEMONIC2(RM, MOVD, movd, PdZx_WO, Ed, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
     3519        IEMOP_MNEMONIC2(RM, MOVD, movd, PdZx_WO, Ed, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OZ_PFX);
    35203520        if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    35213521        {
     
    35633563    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    35643564    if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W)
    3565         IEMOP_MNEMONIC(movdq_Wq_Eq, "movq Wq,Eq");
    3566     else
    3567         IEMOP_MNEMONIC(movdq_Wd_Ed, "movd Wd,Ed");
    3568     if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    3569     {
    3570         /* XMM, greg*/
    3571         IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    3572         IEM_MC_BEGIN(0, 1);
    3573         IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    3574         IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
    3575         if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W)
     3565    {
     3566        /**
     3567         * @opcode      0x6e
     3568         * @opcodesub   rex.w=1
     3569         * @oppfx       0x66
     3570         * @opcpuid     sse2
     3571         * @opgroup     og_sse2_simdint_datamov
     3572         * @opxcpttype  5
     3573         * @optest      64-bit / op1=1 op2=2   -> op1=2
     3574         * @optest      64-bit / op1=0 op2=-42 -> op1=-42
     3575        * @oponly
     3576         */
     3577        IEMOP_MNEMONIC2(RM, MOVQ, movq, VqZx_WO, Eq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OZ_PFX);
     3578        if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    35763579        {
     3580            /* XMM, greg64 */
     3581            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     3582            IEM_MC_BEGIN(0, 1);
    35773583            IEM_MC_LOCAL(uint64_t, u64Tmp);
     3584
     3585            IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     3586            IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
     3587
    35783588            IEM_MC_FETCH_GREG_U64(u64Tmp, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    35793589            IEM_MC_STORE_XREG_U64_ZX_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u64Tmp);
     3590
     3591            IEM_MC_ADVANCE_RIP();
     3592            IEM_MC_END();
    35803593        }
    35813594        else
    35823595        {
     3596            /* XMM, [mem64] */
     3597            IEM_MC_BEGIN(0, 2);
     3598            IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
     3599            IEM_MC_LOCAL(uint64_t, u64Tmp);
     3600
     3601            IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT(); /** @todo order */
     3602            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     3603            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     3604            IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
     3605
     3606            IEM_MC_FETCH_MEM_U64(u64Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     3607            IEM_MC_STORE_XREG_U64_ZX_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u64Tmp);
     3608
     3609            IEM_MC_ADVANCE_RIP();
     3610            IEM_MC_END();
     3611        }
     3612    }
     3613    else
     3614    {
     3615        /**
     3616         * @opdone
     3617         * @opcode      0x6e
     3618         * @opcodesub   rex.w=0
     3619         * @oppfx       0x66
     3620         * @opcpuid     sse2
     3621         * @opgroup     og_sse2_simdint_datamov
     3622         * @opxcpttype  5
     3623         * @opfunction  iemOp_movd_q_Vy_Ey
     3624         * @optest      op1=1 op2=2   -> op1=2
     3625         * @optest      op1=0 op2=-42 -> op1=-42
     3626         * @oponly
     3627         */
     3628        IEMOP_MNEMONIC2(RM, MOVD, movd, VdZx_WO, Ed, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OZ_PFX);
     3629        if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     3630        {
     3631            /* XMM, greg32 */
     3632            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     3633            IEM_MC_BEGIN(0, 1);
    35833634            IEM_MC_LOCAL(uint32_t, u32Tmp);
     3635
     3636            IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     3637            IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
     3638
    35843639            IEM_MC_FETCH_GREG_U32(u32Tmp, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    35853640            IEM_MC_STORE_XREG_U32_ZX_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u32Tmp);
    3586         }
    3587         IEM_MC_ADVANCE_RIP();
    3588         IEM_MC_END();
    3589     }
    3590     else
    3591     {
    3592         /* XMM, [mem] */
    3593         IEM_MC_BEGIN(0, 2);
    3594         IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
    3595         IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT(); /** @todo order */
    3596         IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1);
    3597         IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    3598         IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
    3599         if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W)
    3600         {
    3601             IEM_MC_LOCAL(uint64_t, u64Tmp);
    3602             IEM_MC_FETCH_MEM_U64(u64Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    3603             IEM_MC_STORE_XREG_U64_ZX_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u64Tmp);
     3641
     3642            IEM_MC_ADVANCE_RIP();
     3643            IEM_MC_END();
    36043644        }
    36053645        else
    36063646        {
     3647            /* XMM, [mem32] */
     3648            IEM_MC_BEGIN(0, 2);
     3649            IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);
    36073650            IEM_MC_LOCAL(uint32_t, u32Tmp);
     3651
     3652            IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT(); /** @todo order */
     3653            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     3654            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     3655            IEM_MC_ACTUALIZE_SSE_STATE_FOR_CHANGE();
     3656
    36083657            IEM_MC_FETCH_MEM_U32(u32Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    36093658            IEM_MC_STORE_XREG_U32_ZX_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, u32Tmp);
     3659
     3660            IEM_MC_ADVANCE_RIP();
     3661            IEM_MC_END();
    36103662        }
    3611         IEM_MC_ADVANCE_RIP();
    3612         IEM_MC_END();
    36133663    }
    36143664    return VINF_SUCCESS;
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1-template.c

    r67003 r67004  
    17871787
    17881788
     1789/* Differs from Bs3Cg1EncodeNext_MODRM_PdZx_WO_Ed_WZ in that REX.R isn't ignored. */
     1790static unsigned BS3_NEAR_CODE Bs3Cg1EncodeNext_MODRM_Vd_WO_Ed_WZ(PBS3CG1STATE pThis, unsigned iEncoding)
     1791{
     1792    unsigned off;
     1793    switch (iEncoding)
     1794    {
     1795        case 0:
     1796            pThis->aOperands[pThis->iRmOp ].enmLocation = pThis->aOperands[pThis->iRmOp].enmLocationReg;
     1797            off = Bs3Cg1InsertOpcodes(pThis, Bs3Cg1InsertReqPrefix(pThis, 0));
     1798            pThis->abCurInstr[off++] = X86_MODRM_MAKE(3, 1, 0);
     1799            pThis->aOperands[pThis->iRmOp ].idxField = pThis->aOperands[pThis->iRmOp ].idxFieldBase + 0;
     1800            pThis->aOperands[pThis->iRegOp].idxField = pThis->aOperands[pThis->iRegOp].idxFieldBase + 1;
     1801            break;
     1802        case 1:
     1803            off = Bs3Cg1InsertOpcodes(pThis, Bs3Cg1InsertReqPrefix(pThis, 0));
     1804            pThis->abCurInstr[off++] = X86_MODRM_MAKE(3, 6, 2);
     1805            pThis->aOperands[pThis->iRmOp ].idxField = pThis->aOperands[pThis->iRmOp ].idxFieldBase + 2;
     1806            pThis->aOperands[pThis->iRegOp].idxField = pThis->aOperands[pThis->iRegOp].idxFieldBase + 6;
     1807            break;
     1808        case 2:
     1809            pThis->aOperands[pThis->iRmOp ].enmLocation = pThis->aOperands[pThis->iRmOp].enmLocationMem;
     1810            off = Bs3Cg1InsertOpcodes(pThis, Bs3Cg1InsertReqPrefix(pThis, 0));
     1811            off = Bs3Cfg1EncodeMemMod0DispWithRegFieldAndDefaults(pThis, false, off, 4 /*iReg*/, 0 /*cbMisalign*/);
     1812            break;
     1813        case 3:
     1814            off = Bs3Cg1InsertOpcodes(pThis, Bs3Cg1InsertReqPrefix(pThis, 0));
     1815            off = Bs3Cfg1EncodeMemMod0DispWithRegFieldAndDefaults(pThis, false, off, 7 /*iReg*/, 1 /*cbMisalign*/);
     1816            break;
     1817
     1818        default:
     1819            return 0;
     1820    }
     1821    pThis->cbCurInstr = off;
     1822    return iEncoding + 1;
     1823}
     1824
     1825
     1826/* Differs from Bs3Cg1EncodeNext_MODRM_Pq_WO_Eq_WNZ in that REX.R isn't ignored. */
     1827static unsigned BS3_NEAR_CODE Bs3Cg1EncodeNext_MODRM_Vq_WO_Eq_WNZ(PBS3CG1STATE pThis, unsigned iEncoding)
     1828{
     1829#if ARCH_BITS == 64
     1830    if (BS3CG1_IS_64BIT_TARGET(pThis))
     1831    {
     1832        unsigned off;
     1833        switch (iEncoding)
     1834        {
     1835            case 0:
     1836                pThis->aOperands[pThis->iRmOp ].enmLocation = pThis->aOperands[pThis->iRmOp].enmLocationReg;
     1837                off = Bs3Cg1InsertReqPrefix(pThis, 0);
     1838                pThis->abCurInstr[off++] = REX_W___;
     1839                off = Bs3Cg1InsertOpcodes(pThis, off);
     1840                pThis->abCurInstr[off++] = X86_MODRM_MAKE(3, 1, 0);
     1841                pThis->aOperands[pThis->iRmOp ].idxField = pThis->aOperands[pThis->iRmOp ].idxFieldBase + 0;
     1842                pThis->aOperands[pThis->iRegOp].idxField = pThis->aOperands[pThis->iRegOp].idxFieldBase + 1;
     1843                break;
     1844            case 1:
     1845                off = Bs3Cg1InsertReqPrefix(pThis, 0);
     1846                pThis->abCurInstr[off++] = REX_W___;
     1847                off = Bs3Cg1InsertOpcodes(pThis, off);
     1848                pThis->abCurInstr[off++] = X86_MODRM_MAKE(3, 6, 2);
     1849                pThis->aOperands[pThis->iRmOp ].idxField = pThis->aOperands[pThis->iRmOp ].idxFieldBase + 2;
     1850                pThis->aOperands[pThis->iRegOp].idxField = pThis->aOperands[pThis->iRegOp].idxFieldBase + 6;
     1851                break;
     1852            case 2:
     1853                pThis->aOperands[pThis->iRmOp ].enmLocation = pThis->aOperands[pThis->iRmOp].enmLocationMem;
     1854                off = Bs3Cg1InsertReqPrefix(pThis, 0);
     1855                pThis->abCurInstr[off++] = REX_W___;
     1856                off = Bs3Cg1InsertOpcodes(pThis, off);
     1857                off = Bs3Cfg1EncodeMemMod0DispWithRegFieldAndDefaults(pThis, false, off, 4 /*iReg*/, 0 /*cbMisalign*/);
     1858                break;
     1859            case 3:
     1860                off = Bs3Cg1InsertReqPrefix(pThis, 0);
     1861                pThis->abCurInstr[off++] = REX_W___;
     1862                off = Bs3Cg1InsertOpcodes(pThis, off);
     1863                off = Bs3Cfg1EncodeMemMod0DispWithRegFieldAndDefaults(pThis, false, off, 7 /*iReg*/, 1 /*cbMisalign*/);
     1864                break;
     1865
     1866            default:
     1867                return 0;
     1868        }
     1869        pThis->cbCurInstr = off;
     1870        return iEncoding + 1;
     1871    }
     1872#endif
     1873    return 0;
     1874}
     1875
     1876
    17891877static unsigned BS3_NEAR_CODE Bs3Cg1EncodeNext_MODRM_Vq_WO_UqHi(PBS3CG1STATE pThis, unsigned iEncoding)
    17901878{
     
    39013989            pThis->aOperands[1].cbOp = 8;
    39023990            pThis->aOperands[0].idxFieldBase   = BS3CG1DST_MM0;
     3991            pThis->aOperands[1].idxFieldBase   = BS3CG1DST_RAX;
     3992            pThis->aOperands[0].enmLocation    = BS3CG1OPLOC_CTX;
     3993            pThis->aOperands[1].enmLocation    = BS3CG1OPLOC_CTX;
     3994            pThis->aOperands[1].enmLocationReg = BS3CG1OPLOC_CTX;
     3995            pThis->aOperands[1].enmLocationMem = BS3CG1OPLOC_MEM;
     3996            break;
     3997
     3998        case BS3CG1ENC_MODRM_VdZx_WO_Ed_WZ:
     3999            pThis->pfnEncoder        = Bs3Cg1EncodeNext_MODRM_Vd_WO_Ed_WZ;
     4000            pThis->iRegOp            = 0;
     4001            pThis->iRmOp             = 1;
     4002            pThis->aOperands[0].cbOp = 4;
     4003            pThis->aOperands[1].cbOp = 4;
     4004            pThis->aOperands[0].idxFieldBase   = BS3CG1DST_XMM0_DW0_ZX;
     4005            pThis->aOperands[1].idxFieldBase   = BS3CG1DST_EAX;
     4006            pThis->aOperands[0].enmLocation    = BS3CG1OPLOC_CTX;
     4007            pThis->aOperands[1].enmLocation    = BS3CG1OPLOC_CTX;
     4008            pThis->aOperands[1].enmLocationReg = BS3CG1OPLOC_CTX;
     4009            pThis->aOperands[1].enmLocationMem = BS3CG1OPLOC_MEM;
     4010            break;
     4011
     4012        case BS3CG1ENC_MODRM_VqZx_WO_Eq_WNZ:
     4013            pThis->pfnEncoder        = Bs3Cg1EncodeNext_MODRM_Vq_WO_Eq_WNZ;
     4014            pThis->iRegOp            = 0;
     4015            pThis->iRmOp             = 1;
     4016            pThis->aOperands[0].cbOp = 8;
     4017            pThis->aOperands[1].cbOp = 8;
     4018            pThis->aOperands[0].idxFieldBase   = BS3CG1DST_XMM0_LO_ZX;
    39034019            pThis->aOperands[1].idxFieldBase   = BS3CG1DST_RAX;
    39044020            pThis->aOperands[0].enmLocation    = BS3CG1OPLOC_CTX;
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1.h

    r67003 r67004  
    7878    BS3CG1OP_Usd,
    7979    BS3CG1OP_Usd_WO,
     80    BS3CG1OP_VdZx_WO,
    8081    BS3CG1OP_Vss,
    8182    BS3CG1OP_Vss_WO,
     
    143144    BS3CG1ENC_MODRM_PdZx_WO_Ed_WZ,
    144145    BS3CG1ENC_MODRM_Pq_WO_Eq_WNZ,
     146    BS3CG1ENC_MODRM_VdZx_WO_Ed_WZ,
    145147    BS3CG1ENC_MODRM_Vq_WO_UqHi,
    146148    BS3CG1ENC_MODRM_Vq_WO_Mq,
    147149    BS3CG1ENC_MODRM_VqHi_WO_Uq,
    148150    BS3CG1ENC_MODRM_VqHi_WO_Mq,
     151    BS3CG1ENC_MODRM_VqZx_WO_Eq_WNZ,
    149152    BS3CG1ENC_MODRM_Vdq_WO_Wdq,
    150153    BS3CG1ENC_MODRM_Vpd_WO_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