VirtualBox

Changeset 67007 in vbox


Ignore:
Timestamp:
May 22, 2017 11:52:13 AM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
115569
Message:

IEM: Tested and adjusted movq Pq,Qq (0x0f 0x6f).

Location:
trunk
Files:
6 edited

Legend:

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

    r67006 r67007  
    10951095#define OP_PARM_PdZx_WO         OP_PARM_Pd              /**< Annotates write only operand and zero extends to 64-bit. */
    10961096#define OP_PARM_Pq_WO           OP_PARM_Pq              /**< Annotates write only operand. */
     1097#define OP_PARM_Qq_WO           OP_PARM_Qq              /**< Annotates write only operand. */
    10971098#define OP_PARM_Nq              OP_PARM_Qq              /**< Missing 'N' class (MMX reg selected by modrm.mem) in disasm. */
    10981099#define OP_PARM_Uq              (OP_PARM_U+OP_PARM_q)
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsPython.py

    r67006 r67007  
    218218    'Ew':           ( 'IDX_UseModRM',       'rm',     '%Ew',  'Ew',      ),
    219219    'Ev':           ( 'IDX_UseModRM',       'rm',     '%Ev',  'Ev',      ),
     220    'Qq':           ( 'IDX_UseModRM',       'rm',     '%Qq',  'Qq',      ),
     221    'Qq_WO':        ( 'IDX_UseModRM',       'rm',     '%Qq',  'Qq',      ),
    220222    'Wss':          ( 'IDX_UseModRM',       'rm',     '%Wss', 'Wss',     ),
    221223    'Wss_WO':       ( 'IDX_UseModRM',       'rm',     '%Wss', 'Wss',     ),
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r67006 r67007  
    36663666
    36673667
    3668 /** Opcode      0x0f 0x6f - movq Pq, Qq */
     3668/**
     3669 * @opcode      0x6f
     3670 * @oppfx       none
     3671 * @opcpuid     sse2
     3672 * @opgroup     og_mmx_datamove
     3673 * @opxcpttype  5
     3674 * @optest      op1=1 op2=2   -> op1=2   ftw=0xff
     3675 * @optest      op1=0 op2=-42 -> op1=-42 ftw=0xff
     3676 * @oponly
     3677 */
    36693678FNIEMOP_DEF(iemOp_movq_Pq_Qq)
    36703679{
    36713680    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    3672     IEMOP_MNEMONIC(movq_Pq_Qq, "movq Pq,Qq");
     3681    IEMOP_MNEMONIC2(RM, MOVD, movd, Pq_WO, Qq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZES);
    36733682    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
    36743683    {
     
    36763685         * Register, register.
    36773686         */
    3678         /** @todo testcase: REX.B / REX.R and MMX register indexing. Ignored? */
    3679         /** @todo testcase: REX.B / REX.R and segment register indexing. Ignored? */
    36803687        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    36813688        IEM_MC_BEGIN(0, 1);
    36823689        IEM_MC_LOCAL(uint64_t, u64Tmp);
     3690
    36833691        IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    36843692        IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
     3693
    36853694        IEM_MC_FETCH_MREG_U64(u64Tmp, bRm & X86_MODRM_RM_MASK);
    36863695        IEM_MC_STORE_MREG_U64((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK, u64Tmp);
     3696        IEM_MC_FPU_TO_MMX_MODE();
     3697
    36873698        IEM_MC_ADVANCE_RIP();
    36883699        IEM_MC_END();
     
    37013712        IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();
    37023713        IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
     3714
    37033715        IEM_MC_FETCH_MEM_U64(u64Tmp, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
    37043716        IEM_MC_STORE_MREG_U64((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK, u64Tmp);
     3717        IEM_MC_FPU_TO_MMX_MODE();
    37053718
    37063719        IEM_MC_ADVANCE_RIP();
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap1.cpp.h

    r67006 r67007  
    20562056         * @optest      64-bit / op1=1 op2=2   -> op1=2
    20572057         * @optest      64-bit / op1=0 op2=-42 -> op1=-42
    2058         * @oponly
    20592058         */
    20602059        IEMOP_MNEMONIC2(VEX_RM, VMOVQ, vmovq, Vq_WO, Eq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OZ_PFX);
     
    21072106         * @optest      op1=1 op2=2   -> op1=2
    21082107         * @optest      op1=0 op2=-42 -> op1=-42
    2109          * @oponly
    21102108         */
    21112109        IEMOP_MNEMONIC2(VEX_RM, VMOVD, vmovd, Vd_WO, Ed, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OZ_PFX);
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1-template.c

    r67006 r67007  
    16771677
    16781678
     1679static unsigned BS3_NEAR_CODE Bs3Cg1EncodeNext_MODRM_Pq_WO_Qq(PBS3CG1STATE pThis, unsigned iEncoding)
     1680{
     1681    unsigned off;
     1682    switch (iEncoding)
     1683    {
     1684        case 0:
     1685            pThis->aOperands[pThis->iRmOp ].enmLocation = pThis->aOperands[pThis->iRmOp].enmLocationReg;
     1686            off = Bs3Cg1InsertOpcodes(pThis, Bs3Cg1InsertReqPrefix(pThis, 0));
     1687            pThis->abCurInstr[off++] = X86_MODRM_MAKE(3, 1, 0);
     1688            pThis->aOperands[pThis->iRmOp ].idxField = pThis->aOperands[pThis->iRmOp ].idxFieldBase + 0;
     1689            pThis->aOperands[pThis->iRegOp].idxField = pThis->aOperands[pThis->iRegOp].idxFieldBase + 1;
     1690            break;
     1691        case 1:
     1692            pThis->aOperands[pThis->iRmOp ].enmLocation = pThis->aOperands[pThis->iRmOp].enmLocationReg;
     1693            off = Bs3Cg1InsertOpcodes(pThis, Bs3Cg1InsertReqPrefix(pThis, 0));
     1694            pThis->abCurInstr[off++] = X86_MODRM_MAKE(3, 4, 7);
     1695            pThis->aOperands[pThis->iRmOp ].idxField = pThis->aOperands[pThis->iRmOp ].idxFieldBase + 7;
     1696            pThis->aOperands[pThis->iRegOp].idxField = pThis->aOperands[pThis->iRegOp].idxFieldBase + 4;
     1697            iEncoding += !BS3CG1_IS_64BIT_TARGET(pThis) ? 1 : 0;
     1698            break;
     1699#if ARCH_BITS == 64
     1700        case 2:
     1701            off = Bs3Cg1InsertReqPrefix(pThis, 0);
     1702            pThis->abCurInstr[off++] = REX__RBX;
     1703            off = Bs3Cg1InsertOpcodes(pThis, off);
     1704            pThis->abCurInstr[off++] = X86_MODRM_MAKE(3, 6, 2);
     1705            pThis->aOperands[pThis->iRmOp ].idxField = pThis->aOperands[pThis->iRmOp ].idxFieldBase + 2; /* no +8*/
     1706            pThis->aOperands[pThis->iRegOp].idxField = pThis->aOperands[pThis->iRegOp].idxFieldBase + 6; /* no +8*/
     1707            break;
     1708#endif
     1709        case 3:
     1710            pThis->aOperands[pThis->iRmOp ].enmLocation = pThis->aOperands[pThis->iRmOp].enmLocationMem;
     1711            off = Bs3Cg1InsertOpcodes(pThis, Bs3Cg1InsertReqPrefix(pThis, 0));
     1712            off = Bs3Cfg1EncodeMemMod0DispWithRegFieldAndDefaults(pThis, false, off, 4 /*iReg*/, 0 /*cbMisalign*/);
     1713            break;
     1714        case 4:
     1715            off = Bs3Cg1InsertOpcodes(pThis, Bs3Cg1InsertReqPrefix(pThis, 0));
     1716            off = Bs3Cfg1EncodeMemMod0DispWithRegFieldAndDefaults(pThis, false, off, 7 /*iReg*/, 1 /*cbMisalign*/);
     1717            iEncoding += !BS3CG1_IS_64BIT_TARGET(pThis) ? 1 : 0;
     1718            break;
     1719#if ARCH_BITS == 64
     1720        case 5:
     1721            off = Bs3Cg1InsertReqPrefix(pThis, 0);
     1722            pThis->abCurInstr[off++] = REX__RBX;
     1723            off = Bs3Cg1InsertOpcodes(pThis, off);
     1724            off = Bs3Cfg1EncodeMemMod0DispWithRegFieldAndDefaults(pThis, false, off, 7 /*iReg - no +8*/, 0 /*cbMisalign*/);
     1725            break;
     1726#endif
     1727
     1728        default:
     1729            return 0;
     1730    }
     1731
     1732    pThis->cbCurInstr = off;
     1733    return iEncoding + 1;
     1734}
     1735
     1736
    16791737static unsigned BS3_NEAR_CODE Bs3Cg1EncodeNext_MODRM_Pq_WO_Uq(PBS3CG1STATE pThis, unsigned iEncoding)
    16801738{
     
    41844242            pThis->aOperands[0].enmLocation = BS3CG1OPLOC_CTX;
    41854243            pThis->aOperands[1].enmLocation = BS3CG1OPLOC_CTX;
     4244            break;
     4245
     4246        case BS3CG1ENC_MODRM_Pq_WO_Qq:
     4247            pThis->pfnEncoder        = Bs3Cg1EncodeNext_MODRM_Pq_WO_Qq;
     4248            pThis->iRegOp            = 0;
     4249            pThis->iRmOp             = 1;
     4250            pThis->aOperands[0].cbOp = 8;
     4251            pThis->aOperands[1].cbOp = 8;
     4252            pThis->aOperands[0].idxFieldBase   = BS3CG1DST_MM0;
     4253            pThis->aOperands[1].idxFieldBase   = BS3CG1DST_MM0;
     4254            pThis->aOperands[0].enmLocation    = BS3CG1OPLOC_CTX;
     4255            pThis->aOperands[1].enmLocation    = BS3CG1OPLOC_CTX;
     4256            pThis->aOperands[1].enmLocationReg = BS3CG1OPLOC_CTX;
     4257            pThis->aOperands[1].enmLocationMem = BS3CG1OPLOC_MEM;
    41864258            break;
    41874259
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1.h

    r67006 r67007  
    4646    BS3CG1OP_Eq,
    4747    BS3CG1OP_Ev,
     48    BS3CG1OP_Qq,
     49    BS3CG1OP_Qq_WO,
    4850    BS3CG1OP_Wss,
    4951    BS3CG1OP_Wss_WO,
     
    133135    BS3CG1ENC_MODRM_Eb_Gb,
    134136    BS3CG1ENC_MODRM_Ev_Gv,
     137    BS3CG1ENC_MODRM_Pq_WO_Qq,
    135138    BS3CG1ENC_MODRM_Wss_WO_Vss,
    136139    BS3CG1ENC_MODRM_Wsd_WO_Vsd,
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