Changeset 65756 in vbox
- Timestamp:
- Feb 13, 2017 9:23:35 AM (8 years ago)
- svn:sync-xref-src-repo-rev:
- 113471
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h
r65755 r65756 7787 7787 7788 7788 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 */ 7790 FNIEMOP_DEF(iemOp_pmovmskb_Gd_Nq) 7791 { 7797 7792 /* Note! Taking the lazy approch here wrt the high 32-bits of the GREG. */ 7798 7793 /** @todo testcase: Check that the instruction implicitly clears the high … … 7800 7795 * and opcode modifications are made to work with the whole width (not 7801 7796 * 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 - */ 7819 FNIEMOP_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 */ 7838 7849 7839 7850 … … 8417 8428 /* 0xd5 */ iemOp_pmullw_Pq_Qq, iemOp_vpmullw_Vx_Hx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM, 8418 8429 /* 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, 8420 8431 /* 0xd8 */ iemOp_psubusb_Pq_Qq, iemOp_vpsubusb_Vx_Hx_W, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM, 8421 8432 /* 0xd9 */ iemOp_psubusw_Pq_Qq, iemOp_vpsubusw_Vx_Hx_Wx, iemOp_InvalidNeedRM, iemOp_InvalidNeedRM,
Note:
See TracChangeset
for help on using the changeset viewer.