VirtualBox

Changeset 65756 in vbox


Ignore:
Timestamp:
Feb 13, 2017 9:23:35 AM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
113471
Message:

IEM: 0x0f 0xd7 split up.

File:
1 edited

Legend:

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

    r65755 r65756  
    77877787
    77887788
    7789 /** Opcode 0x0f 0xd7. */
    7790 FNIEMOP_DEF(iemOp_pmovmskb_Gd_Nq__pmovmskb_Gd_Udq)
    7791 {
    7792     /* Docs says register only. */
    7793     uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    7794     if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT)) /** @todo test that this is registers only. */
    7795         return IEMOP_RAISE_INVALID_OPCODE();
    7796 
     7789/** Opcode      0x0f 0xd7 - pmovmskb Gd, Nq */
     7790FNIEMOP_DEF(iemOp_pmovmskb_Gd_Nq)
     7791{
    77977792    /* Note! Taking the lazy approch here wrt the high 32-bits of the GREG. */
    77987793    /** @todo testcase: Check that the instruction implicitly clears the high
     
    78007795     *        and opcode modifications are made to work with the whole width (not
    78017796     *        just 128). */
    7802     switch (pVCpu->iem.s.fPrefixes & (IEM_OP_PRF_SIZE_OP | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ))
    7803     {
    7804         case IEM_OP_PRF_SIZE_OP: /* SSE */
    7805             IEMOP_MNEMONIC(pmovmskb_Gd_Nq, "pmovmskb Gd,Nq");
    7806             IEMOP_HLP_DECODED_NL_2(OP_PMOVMSKB, IEMOPFORM_RM_REG, OP_PARM_Gd, OP_PARM_Vdq, DISOPTYPE_SSE | DISOPTYPE_HARMLESS);
    7807             IEM_MC_BEGIN(2, 0);
    7808             IEM_MC_ARG(uint64_t *,           pDst, 0);
    7809             IEM_MC_ARG(uint128_t const *,    pSrc, 1);
    7810             IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
    7811             IEM_MC_PREPARE_SSE_USAGE();
    7812             IEM_MC_REF_GREG_U64(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    7813             IEM_MC_REF_XREG_U128_CONST(pSrc, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
    7814             IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_pmovmskb_u128, pDst, pSrc);
    7815             IEM_MC_ADVANCE_RIP();
    7816             IEM_MC_END();
    7817             return VINF_SUCCESS;
    7818 
    7819         case 0: /* MMX */
    7820             IEMOP_MNEMONIC(pmovmskb_Gd_Udq, "pmovmskb Gd,Udq");
    7821             IEMOP_HLP_DECODED_NL_2(OP_PMOVMSKB, IEMOPFORM_RM_REG, OP_PARM_Gd, OP_PARM_Vdq, DISOPTYPE_MMX | DISOPTYPE_HARMLESS);
    7822             IEM_MC_BEGIN(2, 0);
    7823             IEM_MC_ARG(uint64_t *,          pDst, 0);
    7824             IEM_MC_ARG(uint64_t const *,    pSrc, 1);
    7825             IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT();
    7826             IEM_MC_PREPARE_FPU_USAGE();
    7827             IEM_MC_REF_GREG_U64(pDst, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
    7828             IEM_MC_REF_MREG_U64_CONST(pSrc, bRm & X86_MODRM_RM_MASK);
    7829             IEM_MC_CALL_MMX_AIMPL_2(iemAImpl_pmovmskb_u64, pDst, pSrc);
    7830             IEM_MC_ADVANCE_RIP();
    7831             IEM_MC_END();
    7832             return VINF_SUCCESS;
    7833 
    7834         default:
    7835             return IEMOP_RAISE_INVALID_OPCODE();
    7836     }
    7837 }
     7797    IEMOP_MNEMONIC(pmovmskb_Gd_Udq, "pmovmskb Gd,Nq");
     7798    /* Docs says register only. */
     7799    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     7800    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT)) /** @todo test that this is registers only. */
     7801    {
     7802        IEMOP_HLP_DECODED_NL_2(OP_PMOVMSKB, IEMOPFORM_RM_REG, OP_PARM_Gd, OP_PARM_Vdq, DISOPTYPE_MMX | DISOPTYPE_HARMLESS);
     7803        IEM_MC_BEGIN(2, 0);
     7804        IEM_MC_ARG(uint64_t *,          pDst, 0);
     7805        IEM_MC_ARG(uint64_t const *,    pSrc, 1);
     7806        IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT();
     7807        IEM_MC_PREPARE_FPU_USAGE();
     7808        IEM_MC_REF_GREG_U64(pDst, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);
     7809        IEM_MC_REF_MREG_U64_CONST(pSrc, bRm & X86_MODRM_RM_MASK);
     7810        IEM_MC_CALL_MMX_AIMPL_2(iemAImpl_pmovmskb_u64, pDst, pSrc);
     7811        IEM_MC_ADVANCE_RIP();
     7812        IEM_MC_END();
     7813        return VINF_SUCCESS;
     7814    }
     7815    return IEMOP_RAISE_INVALID_OPCODE();
     7816}
     7817
     7818/** Opcode 0x66 0x0f 0xd7 -  */
     7819FNIEMOP_DEF(iemOp_vpmovmskb_Gd_Ux)
     7820{
     7821    /* Note! Taking the lazy approch here wrt the high 32-bits of the GREG. */
     7822    /** @todo testcase: Check that the instruction implicitly clears the high
     7823     *        bits in 64-bit mode.  The REX.W is first necessary when VLMAX > 256
     7824     *        and opcode modifications are made to work with the whole width (not
     7825     *        just 128). */
     7826    IEMOP_MNEMONIC(pmovmskb_Gd_Nq, "vpmovmskb Gd, Ux");
     7827    /* Docs says register only. */
     7828    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     7829    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT)) /** @todo test that this is registers only. */
     7830    {
     7831        IEMOP_HLP_DECODED_NL_2(OP_PMOVMSKB, IEMOPFORM_RM_REG, OP_PARM_Gd, OP_PARM_Vdq, DISOPTYPE_SSE | DISOPTYPE_HARMLESS);
     7832        IEM_MC_BEGIN(2, 0);
     7833        IEM_MC_ARG(uint64_t *,           pDst, 0);
     7834        IEM_MC_ARG(uint128_t const *,    pSrc, 1);
     7835        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     7836        IEM_MC_PREPARE_SSE_USAGE();
     7837        IEM_MC_REF_GREG_U64(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
     7838        IEM_MC_REF_XREG_U128_CONST(pSrc, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);
     7839        IEM_MC_CALL_SSE_AIMPL_2(iemAImpl_pmovmskb_u128, pDst, pSrc);
     7840        IEM_MC_ADVANCE_RIP();
     7841        IEM_MC_END();
     7842        return VINF_SUCCESS;
     7843    }
     7844    return IEMOP_RAISE_INVALID_OPCODE();
     7845}
     7846
     7847/*  Opcode 0xf3 0x0f 0xd7 - invalid */
     7848/*  Opcode 0xf2 0x0f 0xd7 - invalid */
    78387849
    78397850
     
    84178428    /* 0xd5 */  iemOp_pmullw_Pq_Qq,         iemOp_vpmullw_Vx_Hx_Wx,     iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    84188429    /* 0xd6 */  iemOp_InvalidNeedRM,        iemOp_vmovq_Wq_Vq,          iemOp_movq2dq_Vdq_Nq,       iemOp_movdq2q_Pq_Uq,
    8419     /* 0xd7 */  IEMOP_X4(iemOp_pmovmskb_Gd_Nq__pmovmskb_Gd_Udq),
     8430    /* 0xd7 */  iemOp_pmovmskb_Gd_Nq,       iemOp_vpmovmskb_Gd_Ux,      iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    84208431    /* 0xd8 */  iemOp_psubusb_Pq_Qq,        iemOp_vpsubusb_Vx_Hx_W,     iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
    84218432    /* 0xd9 */  iemOp_psubusw_Pq_Qq,        iemOp_vpsubusw_Vx_Hx_Wx,    iemOp_InvalidNeedRM,        iemOp_InvalidNeedRM,
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