VirtualBox

Changeset 66811 in vbox


Ignore:
Timestamp:
May 5, 2017 2:56:34 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
115232
Message:

IEM: Implemented movdq2q Pq,Uq (f2 0f d6)

Location:
trunk/src/VBox
Files:
5 edited

Legend:

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

    r66810 r66811  
    1114811148#define IEM_MC_FETCH_MREG_U32(a_u32Value, a_iMReg) \
    1114911149    do { (a_u32Value) = IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].au32[0]; } while (0)
    11150 #define IEM_MC_STORE_MREG_U64(a_iMReg, a_u64Value) \
    11151     do { IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx = (a_u64Value); } while (0)
    11152 #define IEM_MC_STORE_MREG_U32_ZX_U64(a_iMReg, a_u32Value) \
    11153     do { IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx = (uint32_t)(a_u32Value); } while (0)
    11154 #define IEM_MC_REF_MREG_U64(a_pu64Dst, a_iMReg)         \
     11150#define IEM_MC_STORE_MREG_U64(a_iMReg, a_u64Value) do { \
     11151        IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx = (a_u64Value); \
     11152        IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].au32[2] = 0xffff; \
     11153    } while (0)
     11154#define IEM_MC_STORE_MREG_U32_ZX_U64(a_iMReg, a_u32Value) do { \
     11155        IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx = (uint32_t)(a_u32Value); \
     11156        IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].au32[2] = 0xffff; \
     11157    } while (0)
     11158#define IEM_MC_REF_MREG_U64(a_pu64Dst, a_iMReg) /** @todo need to set high word to 0xffff on commit (see IEM_MC_STORE_MREG_U64) */ \
    1115511159        (a_pu64Dst) = (&IEM_GET_CTX(pVCpu)->CTX_SUFF(pXState)->x87.aRegs[(a_iMReg)].mmx)
    1115611160#define IEM_MC_REF_MREG_U64_CONST(a_pu64Dst, a_iMReg) \
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsPython.py

    r66810 r66811  
    243243    'Gw':   ( 'IDX_UseModRM',       'reg',    '%Gw',  'Gw',      ),
    244244    'Gv':   ( 'IDX_UseModRM',       'reg',    '%Gv',  'Gv',      ),
     245    'Pq':   ( 'IDX_UseModRM',       'reg',    '%Pq',  'Pq',      ),
    245246    'Vss':  ( 'IDX_UseModRM',       'reg',    '%Vss', 'Vss',     ),
    246247    'VssZxReg': ( 'IDX_UseModRM',   'reg',    '%Vss', 'Vss',     ),
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r66810 r66811  
    84048404        IEMOP_MNEMONIC2(RM_REG, MOVQ2DQ, movq2dq, VqZxReg, Nq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
    84058405        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    8406         IEM_MC_BEGIN(0, 2);
     8406        IEM_MC_BEGIN(0, 1);
    84078407        IEM_MC_LOCAL(uint64_t,                  uSrc);
    84088408
     
    84108410        IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
    84118411
    8412         IEM_MC_FETCH_MREG_U64(uSrc, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     8412        IEM_MC_FETCH_MREG_U64(uSrc, bRm & X86_MODRM_RM_MASK);
    84138413        IEM_MC_STORE_XREG_U64_ZX_U128(((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg, uSrc);
    84148414        IEM_MC_FPU_TO_MMX_MODE();
     
    84328432}
    84338433
    8434 /** Opcode 0xf2 0x0f 0xd6 - movdq2q Pq, Uq */
    8435 FNIEMOP_STUB(iemOp_movdq2q_Pq_Uq);
    8436 #if 0
    8437 FNIEMOP_DEF(iemOp_movq_Wq_Vq__movq2dq_Vdq_Nq__movdq2q_Pq_Uq)
    8438 {
    8439     /* Docs says register only. */
    8440     uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    8441 
    8442     switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
    8443     {
    8444         case IEM_OP_PRF_SIZE_OP: /* SSE */
    8445             I E M O P _ M N E M O N I C(movq_Wq_Vq, "movq Wq,Vq");
    8446             IEMOP_HLP_DECODED_NL_2(OP_PMOVMSKB, IEMOPFORM_RM_REG, OP_PARM_Gd, OP_PARM_Vdq, DISOPTYPE_SSE | DISOPTYPE_HARMLESS);
    8447             IEM_MC_BEGIN(2, 0);
    8448             IEM_MC_ARG(uint64_t *,           pDst, 0);
    8449             IEM_MC_ARG(PCRTUINT128U,         pSrc, 1);
    8450             IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    8451             IEM_MC_PREPARE_SSE_USAGE();
    8452             IEM_MC_REF_GREG_U64(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    8453             IEM_MC_REF_XREG_U128_CONST(pSrc, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    8454             IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_pmovmskb_u128, pDst, pSrc);
    8455             IEM_MC_ADVANCE_RIP();
    8456             IEM_MC_END();
    8457             return VINF_SUCCESS;
    8458 
    8459         case 0: /* MMX */
    8460             I E M O P _ M N E M O N I C(pmovmskb_Gd_Udq, "pmovmskb Gd,Udq");
    8461             IEMOP_HLP_DECODED_NL_2(OP_PMOVMSKB, IEMOPFORM_RM_REG, OP_PARM_Gd, OP_PARM_Vdq, DISOPTYPE_MMX | DISOPTYPE_HARMLESS);
    8462             IEM_MC_BEGIN(2, 0);
    8463             IEM_MC_ARG(uint64_t *,          pDst, 0);
    8464             IEM_MC_ARG(uint64_t const *,    pSrc, 1);
    8465             IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT();
    8466             IEM_MC_PREPARE_FPU_USAGE();
    8467             IEM_MC_REF_GREG_U64(pDst, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
    8468             IEM_MC_REF_MREG_U64_CONST(pSrc, bRm & X86_MODRM_RM_MASK);
    8469             IEM_MC_CALL_MMX_AIMPL_2(iemAImpl_pmovmskb_u64, pDst, pSrc);
    8470             IEM_MC_ADVANCE_RIP();
    8471             IEM_MC_END();
    8472             return VINF_SUCCESS;
    8473 
    8474         default:
    8475             return IEMOP_RAISE_INVALID_OPCODE();
    8476     }
    8477 }
    8478 #endif
    8479 
     8434
     8435/**
     8436 * @opcode      0xd6
     8437 * @opcodesub   11 mr/reg
     8438 * @oppfx       f2
     8439 * @opcpuid     sse2
     8440 * @opgroup     og_sse2_simdint_datamove
     8441 * @optest      op1=1 op2=2   -> op1=2   ftw=0xff
     8442 * @optest      op1=0 op2=-42 -> op1=-42 ftw=0xff
     8443 * @optest      op1=0 op2=0x1123456789abcdef -> op1=0x1123456789abcdef ftw=0xff
     8444 * @optest      op1=0 op2=0xfedcba9876543210 -> op1=0xfedcba9876543210 ftw=0xff
     8445 * @optest      op1=-42 op2=0xfedcba9876543210
     8446 *                  ->  op1=0xfedcba9876543210 ftw=0xff
     8447 */
     8448FNIEMOP_DEF(iemOp_movdq2q_Pq_Uq)
     8449{
     8450    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     8451    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     8452    {
     8453        /*
     8454         * Register, register.
     8455         */
     8456        IEMOP_MNEMONIC2(RM_REG, MOVDQ2Q, movdq2q, Pq, Uq, DISOPTYPE_HARMLESS, IEMOPHINT_IGNORES_OP_SIZE);
     8457        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     8458        IEM_MC_BEGIN(0, 1);
     8459        IEM_MC_LOCAL(uint64_t,                  uSrc);
     8460
     8461        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     8462        IEM_MC_ACTUALIZE_FPU_STATE_FOR_CHANGE();
     8463
     8464        IEM_MC_FETCH_XREG_U64(uSrc, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     8465        IEM_MC_STORE_MREG_U64((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK, uSrc);
     8466        IEM_MC_FPU_TO_MMX_MODE();
     8467
     8468        IEM_MC_ADVANCE_RIP();
     8469        IEM_MC_END();
     8470        return VINF_SUCCESS;
     8471    }
     8472
     8473    /**
     8474     * @opdone
     8475     * @opmnemonic  udf20fd6mem
     8476     * @opcode      0xd6
     8477     * @opcodesub   !11 mr/reg
     8478     * @oppfx       f2
     8479     * @opunused    intel-modrm
     8480     * @opcpuid     sse
     8481     * @optest      ->
     8482     */
     8483    return FNIEMOP_CALL_1(iemOp_InvalidWithRMNeedDecode, bRm);
     8484}
    84808485
    84818486/** Opcode      0x0f 0xd7 - pmovmskb Gd, Nq */
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1-template.c

    r66810 r66811  
    15831583
    15841584
     1585static unsigned BS3_NEAR_CODE Bs3Cg1EncodeNext_BS3CG1ENC_MODRM_Pq_Uq(PBS3CG1STATE pThis, unsigned iEncoding)
     1586{
     1587    unsigned off;
     1588    if (iEncoding == 0)
     1589    {
     1590        off = Bs3Cg1InsertOpcodes(pThis, Bs3Cg1InsertReqPrefix(pThis, 0));
     1591        pThis->abCurInstr[off++] = X86_MODRM_MAKE(3, 1, 0);
     1592        pThis->aOperands[pThis->iRmOp ].idxField = BS3CG1DST_XMM0_LO;
     1593        pThis->aOperands[pThis->iRegOp].idxField = BS3CG1DST_MM1;
     1594    }
     1595    else if (iEncoding == 1)
     1596    {
     1597        off = Bs3Cg1InsertOpcodes(pThis, Bs3Cg1InsertReqPrefix(pThis, 0));
     1598        pThis->abCurInstr[off++] = X86_MODRM_MAKE(3, 6, 2);
     1599        pThis->aOperands[pThis->iRmOp ].idxField = BS3CG1DST_XMM2_LO;
     1600        pThis->aOperands[pThis->iRegOp].idxField = BS3CG1DST_MM6;
     1601    }
     1602    else
     1603        return 0;
     1604    pThis->cbCurInstr = off;
     1605    return iEncoding + 1;
     1606}
     1607
     1608
    15851609static unsigned BS3_NEAR_CODE Bs3Cg1EncodeNext_BS3CG1ENC_MODRM_Vq_UqHi(PBS3CG1STATE pThis, unsigned iEncoding)
    15861610{
     
    22382262        case BS3CG1ENC_MODRM_WqZxReg_Vq:
    22392263            return Bs3Cg1EncodeNext_BS3CG1ENC_MODRM_WqZxReg_Vq(pThis, iEncoding);
     2264
     2265        case BS3CG1ENC_MODRM_Pq_Uq:
     2266            return Bs3Cg1EncodeNext_BS3CG1ENC_MODRM_Pq_Uq(pThis, iEncoding);
    22402267
    22412268        case BS3CG1ENC_MODRM_Vq_UqHi:
     
    24192446            break;
    24202447
     2448        case BS3CG1ENC_MODRM_Pq_Uq:
    24212449        case BS3CG1ENC_MODRM_Vq_UqHi:
    24222450        case BS3CG1ENC_MODRM_VqHi_Uq:
     
    31193147                    if ((unsigned)(idxField - BS3CG1DST_XMM0_LO_ZX) <= (unsigned)(BS3CG1DST_XMM15_LO_ZX - BS3CG1DST_XMM0_LO_ZX))
    31203148                        PtrField.pu64[1] = 0;
     3149                    else if ((unsigned)(idxField - BS3CG1DST_MM0) <= (unsigned)(BS3CG1DST_MM7 - BS3CG1DST_MM0))
     3150                        PtrField.pu32[2] = 0xffff; /* observed on skylake */
     3151
    31213152                    switch (bOpcode & BS3CG1_CTXOP_OPERATOR_MASK)
    31223153                    {
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1.h

    r66810 r66811  
    5555    BS3CG1OP_Gv,
    5656    BS3CG1OP_Nq,
     57    BS3CG1OP_Pq,
    5758    BS3CG1OP_Uq,
    5859    BS3CG1OP_UqHi,
     
    108109    BS3CG1ENC_MODRM_Gv_Ev,
    109110    BS3CG1ENC_MODRM_Gv_Ma, /**< bound instruction */
     111    BS3CG1ENC_MODRM_Pq_Uq,
    110112    BS3CG1ENC_MODRM_Vq_UqHi,
    111113    BS3CG1ENC_MODRM_Vq_Mq,
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