Changeset 95403 in vbox for trunk/src/VBox
- Timestamp:
- Jun 27, 2022 11:38:38 PM (3 years ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/Config.kmk
r94934 r95403 49 49 endif 50 50 endif 51 ifdef IEM_WITHOUT_ASSEMBLY 52 VMM_COMMON_DEFS += IEM_WITHOUT_ASSEMBLY 53 endif 51 54 # part of global DEFS 52 55 ifdef VBOX_WITH_MULTI_CORE -
trunk/src/VBox/VMM/Makefile.kmk
r94955 r95403 299 299 300 300 301 #302 # This'll apply to both VBoxVMM and VMMR0.303 #304 ifdef IEM_WITHOUT_ASSEMBLY305 VMMAll/IEMAllAImplC.cpp_DEFS = IEM_WITHOUT_ASSEMBLY306 endif307 308 301 309 302 # -
trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm
r95360 r95403 3553 3553 %endmacro 3554 3554 3555 ;; @todo what do we need to do for AVX? 3556 %macro IEMIMPL_AVX_PROLOGUE 0 3557 %endmacro 3558 %macro IEMIMPL_AVX_EPILOGUE 0 3559 %endmacro 3560 3555 3561 3556 3562 ;; … … 3788 3794 ENDPROC iemAImpl_pmovmskb_u128 3789 3795 3796 3797 ;; 3798 ; Media instruction working on two full sized source registers and one destination (AVX). 3799 ; 3800 ; @param 1 The instruction 3801 ; 3802 ; @param A0 Pointer to the extended CPU/FPU state (X86XSAVEAREA). 3803 ; @param A1 Pointer to the destination media register size operand (output). 3804 ; @param A2 Pointer to the first source media register size operand (input). 3805 ; @param A3 Pointer to the second source media register size operand (input). 3806 ; 3807 %macro IEMIMPL_MEDIA_F3 1 3808 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u128, 16 3809 PROLOGUE_4_ARGS 3810 IEMIMPL_AVX_PROLOGUE 3811 3812 vmovdqu xmm0, [A2] 3813 vmovdqu xmm1, [A3] 3814 %1 xmm0, xmm0, xmm1 3815 vmovdqu [A1], xmm0 3816 3817 IEMIMPL_AVX_PROLOGUE 3818 EPILOGUE_4_ARGS 3819 ENDPROC iemAImpl_ %+ %1 %+ _u128 3820 3821 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u256, 16 3822 PROLOGUE_4_ARGS 3823 IEMIMPL_SSE_PROLOGUE 3824 3825 vmovdqu ymm0, [A2] 3826 vmovdqu ymm1, [A3] 3827 %1 ymm0, ymm0, ymm1 3828 vmovdqu [A1], ymm0 3829 3830 IEMIMPL_AVX_PROLOGUE 3831 EPILOGUE_4_ARGS 3832 ENDPROC iemAImpl_ %+ %1 %+ _u256 3833 %endmacro 3834 3835 IEMIMPL_MEDIA_F3 vpxor 3836 -
trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp
r95360 r95403 7072 7072 7073 7073 7074 IEM_DECL_IMPL_DEF(void, iemAImpl_pxor_u64,(PCX86FXSTATE pFpuState, uint64_t *pu64Dst, uint64_t const *pu64Src)) 7074 /* 7075 * PXOR / VPXOR / PXORPS / VPXORPS / PXORPD / VPXORPD 7076 */ 7077 7078 IEM_DECL_IMPL_DEF(void, iemAImpl_pxor_u64,(PCX86FXSTATE pFpuState, uint64_t *puDst, uint64_t const *puSrc)) 7079 { 7080 RT_NOREF(pFpuState); 7081 *puDst ^= *puSrc; 7082 } 7083 7084 7085 IEM_DECL_IMPL_DEF(void, iemAImpl_pxor_u128,(PCX86FXSTATE pFpuState, PRTUINT128U puDst, PCRTUINT128U puSrc)) 7086 { 7087 RT_NOREF(pFpuState); 7088 puDst->au64[0] ^= puSrc->au64[0]; 7089 puDst->au64[1] ^= puSrc->au64[1]; 7090 } 7091 7092 #endif /* IEM_WITHOUT_ASSEMBLY */ 7093 7094 IEM_DECL_IMPL_DEF(void, iemAImpl_vpxor_u128_fallback,(PX86XSAVEAREA pExtState, PRTUINT128U puDst, 7095 PCRTUINT128U puSrc1, PCRTUINT128U puSrc2)) 7096 { 7097 RT_NOREF(pExtState); 7098 puDst->au64[0] = puSrc1->au64[0] ^ puSrc2->au64[0]; 7099 puDst->au64[1] = puSrc1->au64[1] ^ puSrc2->au64[1]; 7100 } 7101 7102 7103 IEM_DECL_IMPL_DEF(void, iemAImpl_vpxor_u256_fallback,(PX86XSAVEAREA pExtState, PRTUINT256U puDst, 7104 PCRTUINT256U puSrc1, PCRTUINT256U puSrc2)) 7105 { 7106 RT_NOREF(pExtState); 7107 puDst->au64[0] = puSrc1->au64[0] ^ puSrc2->au64[0]; 7108 puDst->au64[1] = puSrc1->au64[1] ^ puSrc2->au64[1]; 7109 puDst->au64[2] = puSrc1->au64[2] ^ puSrc2->au64[2]; 7110 puDst->au64[3] = puSrc1->au64[3] ^ puSrc2->au64[3]; 7111 } 7112 7113 #ifdef IEM_WITHOUT_ASSEMBLY 7114 7115 IEM_DECL_IMPL_DEF(void, iemAImpl_pmovmskb_u64,(PCX86FXSTATE pFpuState, uint64_t *pu64Dst, uint64_t const *pu64Src)) 7075 7116 { 7076 7117 RT_NOREF(pFpuState, pu64Dst, pu64Src); 7077 7118 AssertReleaseFailed(); 7078 } 7079 7080 7081 IEM_DECL_IMPL_DEF(void, iemAImpl_pxor_u128,(PCX86FXSTATE pFpuState, PRTUINT128U pu128Dst, PCRTUINT128U pu128Src)) 7119 7120 } 7121 7122 7123 IEM_DECL_IMPL_DEF(void, iemAImpl_pmovmskb_u128,(PCX86FXSTATE pFpuState, uint64_t *pu64Dst, PCRTUINT128U pu128Src)) 7124 { 7125 RT_NOREF(pFpuState, pu64Dst, pu128Src); 7126 AssertReleaseFailed(); 7127 } 7128 7129 7130 IEM_DECL_IMPL_DEF(void, iemAImpl_pshufw,(PCX86FXSTATE pFpuState, uint64_t *pu64Dst, uint64_t const *pu64Src, uint8_t bEvil)) 7131 { 7132 RT_NOREF(pFpuState, pu64Dst, pu64Src, bEvil); 7133 AssertReleaseFailed(); 7134 } 7135 7136 7137 IEM_DECL_IMPL_DEF(void, iemAImpl_pshufhw,(PCX86FXSTATE pFpuState, PRTUINT128U pu128Dst, PCRTUINT128U pu128Src, uint8_t bEvil)) 7138 { 7139 RT_NOREF(pFpuState, pu128Dst, pu128Src, bEvil); 7140 AssertReleaseFailed(); 7141 } 7142 7143 7144 IEM_DECL_IMPL_DEF(void, iemAImpl_pshuflw,(PCX86FXSTATE pFpuState, PRTUINT128U pu128Dst, PCRTUINT128U pu128Src, uint8_t bEvil)) 7145 { 7146 RT_NOREF(pFpuState, pu128Dst, pu128Src, bEvil); 7147 AssertReleaseFailed(); 7148 } 7149 7150 7151 IEM_DECL_IMPL_DEF(void, iemAImpl_pshufd,(PCX86FXSTATE pFpuState, PRTUINT128U pu128Dst, PCRTUINT128U pu128Src, uint8_t bEvil)) 7152 { 7153 RT_NOREF(pFpuState, pu128Dst, pu128Src, bEvil); 7154 AssertReleaseFailed(); 7155 } 7156 7157 /* PUNPCKHxxx */ 7158 7159 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckhbw_u64,(PCX86FXSTATE pFpuState, uint64_t *pu64Dst, uint64_t const *pu64Src)) 7160 { 7161 RT_NOREF(pFpuState, pu64Dst, pu64Src); 7162 AssertReleaseFailed(); 7163 } 7164 7165 7166 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckhbw_u128,(PCX86FXSTATE pFpuState, PRTUINT128U pu128Dst, PCRTUINT128U pu128Src)) 7082 7167 { 7083 7168 RT_NOREF(pFpuState, pu128Dst, pu128Src); … … 7086 7171 7087 7172 7088 IEM_DECL_IMPL_DEF(void, iemAImpl_p movmskb_u64,(PCX86FXSTATE pFpuState, uint64_t *pu64Dst, uint64_t const *pu64Src))7173 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckhwd_u64,(PCX86FXSTATE pFpuState, uint64_t *pu64Dst, uint64_t const *pu64Src)) 7089 7174 { 7090 7175 RT_NOREF(pFpuState, pu64Dst, pu64Src); 7091 7176 AssertReleaseFailed(); 7092 7093 } 7094 7095 7096 IEM_DECL_IMPL_DEF(void, iemAImpl_pmovmskb_u128,(PCX86FXSTATE pFpuState, uint64_t *pu64Dst, PCRTUINT128U pu128Src)) 7097 { 7098 RT_NOREF(pFpuState, pu64Dst, pu128Src); 7177 } 7178 7179 7180 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckhwd_u128,(PCX86FXSTATE pFpuState, PRTUINT128U pu128Dst, PCRTUINT128U pu128Src)) 7181 { 7182 RT_NOREF(pFpuState, pu128Dst, pu128Src); 7099 7183 AssertReleaseFailed(); 7100 7184 } 7101 7185 7102 7186 7103 IEM_DECL_IMPL_DEF(void, iemAImpl_pshufw,(PCX86FXSTATE pFpuState, uint64_t *pu64Dst, uint64_t const *pu64Src, uint8_t bEvil)) 7104 { 7105 RT_NOREF(pFpuState, pu64Dst, pu64Src, bEvil); 7106 AssertReleaseFailed(); 7107 } 7108 7109 7110 IEM_DECL_IMPL_DEF(void, iemAImpl_pshufhw,(PCX86FXSTATE pFpuState, PRTUINT128U pu128Dst, PCRTUINT128U pu128Src, uint8_t bEvil)) 7111 { 7112 RT_NOREF(pFpuState, pu128Dst, pu128Src, bEvil); 7113 AssertReleaseFailed(); 7114 } 7115 7116 7117 IEM_DECL_IMPL_DEF(void, iemAImpl_pshuflw,(PCX86FXSTATE pFpuState, PRTUINT128U pu128Dst, PCRTUINT128U pu128Src, uint8_t bEvil)) 7118 { 7119 RT_NOREF(pFpuState, pu128Dst, pu128Src, bEvil); 7120 AssertReleaseFailed(); 7121 } 7122 7123 7124 IEM_DECL_IMPL_DEF(void, iemAImpl_pshufd,(PCX86FXSTATE pFpuState, PRTUINT128U pu128Dst, PCRTUINT128U pu128Src, uint8_t bEvil)) 7125 { 7126 RT_NOREF(pFpuState, pu128Dst, pu128Src, bEvil); 7127 AssertReleaseFailed(); 7128 } 7129 7130 /* PUNPCKHxxx */ 7131 7132 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckhbw_u64,(PCX86FXSTATE pFpuState, uint64_t *pu64Dst, uint64_t const *pu64Src)) 7187 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckhdq_u64,(PCX86FXSTATE pFpuState, uint64_t *pu64Dst, uint64_t const *pu64Src)) 7133 7188 { 7134 7189 RT_NOREF(pFpuState, pu64Dst, pu64Src); … … 7137 7192 7138 7193 7139 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckh bw_u128,(PCX86FXSTATE pFpuState, PRTUINT128U pu128Dst, PCRTUINT128U pu128Src))7194 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckhdq_u128,(PCX86FXSTATE pFpuState, PRTUINT128U pu128Dst, PCRTUINT128U pu128Src)) 7140 7195 { 7141 7196 RT_NOREF(pFpuState, pu128Dst, pu128Src); … … 7144 7199 7145 7200 7146 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckhwd_u64,(PCX86FXSTATE pFpuState, uint64_t *pu64Dst, uint64_t const *pu64Src)) 7147 { 7148 RT_NOREF(pFpuState, pu64Dst, pu64Src); 7149 AssertReleaseFailed(); 7150 } 7151 7152 7153 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckhwd_u128,(PCX86FXSTATE pFpuState, PRTUINT128U pu128Dst, PCRTUINT128U pu128Src)) 7201 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckhqdq_u128,(PCX86FXSTATE pFpuState, PRTUINT128U pu128Dst, PCRTUINT128U pu128Src)) 7154 7202 { 7155 7203 RT_NOREF(pFpuState, pu128Dst, pu128Src); … … 7157 7205 } 7158 7206 7159 7160 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckhdq_u64,(PCX86FXSTATE pFpuState, uint64_t *pu64Dst, uint64_t const *pu64Src))7161 {7162 RT_NOREF(pFpuState, pu64Dst, pu64Src);7163 AssertReleaseFailed();7164 }7165 7166 7167 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckhdq_u128,(PCX86FXSTATE pFpuState, PRTUINT128U pu128Dst, PCRTUINT128U pu128Src))7168 {7169 RT_NOREF(pFpuState, pu128Dst, pu128Src);7170 AssertReleaseFailed();7171 }7172 7173 7174 IEM_DECL_IMPL_DEF(void, iemAImpl_punpckhqdq_u128,(PCX86FXSTATE pFpuState, PRTUINT128U pu128Dst, PCRTUINT128U pu128Src))7175 {7176 RT_NOREF(pFpuState, pu128Dst, pu128Src);7177 AssertReleaseFailed();7178 }7179 7180 7207 /* PUNPCKLxxx */ 7181 7208 -
trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp
r95248 r95403 8370 8370 pDst->Rsrvd1 = pSrc->Rsrvd1; 8371 8371 pDst->Rsrvd2 = pSrc->Rsrvd2; 8372 pDst->au32RsrvdForSoftware[0] = 0;8373 8372 } 8374 8373 else … … 8376 8375 pDst->Rsrvd1 = 0; 8377 8376 pDst->Rsrvd2 = 0; 8378 pDst->au32RsrvdForSoftware[0] = X86_FXSTATE_RSVD_32BIT_MAGIC;8379 8377 } 8380 8378 … … 8601 8599 pDst->Rsrvd1 = pSrc->Rsrvd1; 8602 8600 pDst->Rsrvd2 = pSrc->Rsrvd2; 8603 pDst->au32RsrvdForSoftware[0] = 0;8604 8601 } 8605 8602 else … … 8607 8604 pDst->Rsrvd1 = 0; 8608 8605 pDst->Rsrvd2 = 0; 8609 pDst->au32RsrvdForSoftware[0] = X86_FXSTATE_RSVD_32BIT_MAGIC;8610 8606 } 8611 8607 for (uint32_t i = 0; i < RT_ELEMENTS(pDst->aRegs); i++) -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsInterpretOnly.cpp
r94768 r95403 919 919 IEM_STATIC const IEMOPMEDIAF2 g_iemAImpl_pcmpeqd = { iemAImpl_pcmpeqd_u64, iemAImpl_pcmpeqd_u128 }; 920 920 921 # ifndef IEM_WITHOUT_ASSEMBLY 922 /** Function table for the VPXOR instruction */ 923 IEM_STATIC const IEMOPMEDIAF3 g_iemAImpl_vpxor = { iemAImpl_vpxor_u128, iemAImpl_vpxor_u256 }; 924 # endif 925 /** Function table for the VPXOR instruction, software fallback. */ 926 IEM_STATIC const IEMOPMEDIAF3 g_iemAImpl_vpxor_fallback = { iemAImpl_vpxor_u128_fallback, iemAImpl_vpxor_u256_fallback }; 927 921 928 #endif /* !TST_IEM_CHECK_MC */ 922 929 -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsPython.py
r95347 r95403 302 302 # VEX.vvvv 303 303 'By': ( 'IDX_UseModRM', 'vvvv', '%By', 'By', 'V', ), 304 'Hps': ( 'IDX_UseModRM', 'vvvv', '%Hps', 'Hps', 'V', ), 305 'Hpd': ( 'IDX_UseModRM', 'vvvv', '%Hpd', 'Hpd', 'V', ), 304 306 'HssHi': ( 'IDX_UseModRM', 'vvvv', '%Hx', 'HssHi', 'V', ), 305 307 'HsdHi': ( 'IDX_UseModRM', 'vvvv', '%Hx', 'HsdHi', 'V', ), 306 308 'HqHi': ( 'IDX_UseModRM', 'vvvv', '%Hq', 'HqHi', 'V', ), 309 'Hx': ( 'IDX_UseModRM', 'vvvv', '%Hx', 'Hx', 'V', ), 307 310 308 311 # Immediate values. -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h
r95360 r95403 24 24 * @{ 25 25 */ 26 27 28 /** 29 * Common worker for MMX instructions on the form: 30 * pxxx mm1, mm2/mem64 31 */ 32 FNIEMOP_DEF_1(iemOpCommonMmx_FullFull_To_Full, PCIEMOPMEDIAF2, pImpl) 33 { 34 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 35 if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT)) 36 { 37 /* 38 * Register, register. 39 */ 40 /** @todo testcase: REX.B / REX.R and MMX register indexing. Ignored? */ 41 /** @todo testcase: REX.B / REX.R and segment register indexing. Ignored? */ 42 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 43 IEM_MC_BEGIN(2, 0); 44 IEM_MC_ARG(uint64_t *, pDst, 0); 45 IEM_MC_ARG(uint64_t const *, pSrc, 1); 46 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT(); 47 IEM_MC_PREPARE_FPU_USAGE(); 48 IEM_MC_REF_MREG_U64(pDst, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK); 49 IEM_MC_REF_MREG_U64_CONST(pSrc, bRm & X86_MODRM_RM_MASK); 50 IEM_MC_CALL_MMX_AIMPL_2(pImpl->pfnU64, pDst, pSrc); 51 IEM_MC_FPU_TO_MMX_MODE(); 52 IEM_MC_ADVANCE_RIP(); 53 IEM_MC_END(); 54 } 55 else 56 { 57 /* 58 * Register, memory. 59 */ 60 IEM_MC_BEGIN(2, 2); 61 IEM_MC_ARG(uint64_t *, pDst, 0); 62 IEM_MC_LOCAL(uint64_t, uSrc); 63 IEM_MC_ARG_LOCAL_REF(uint64_t const *, pSrc, uSrc, 1); 64 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 65 66 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); 67 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 68 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT(); 69 IEM_MC_FETCH_MEM_U64(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 70 71 IEM_MC_PREPARE_FPU_USAGE(); 72 IEM_MC_REF_MREG_U64(pDst, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK); 73 IEM_MC_CALL_MMX_AIMPL_2(pImpl->pfnU64, pDst, pSrc); 74 IEM_MC_FPU_TO_MMX_MODE(); 75 76 IEM_MC_ADVANCE_RIP(); 77 IEM_MC_END(); 78 } 79 return VINF_SUCCESS; 80 } 81 82 83 /** 84 * Common worker for SSE2 instructions on the forms: 85 * pxxx xmm1, xmm2/mem128 86 * 87 * Proper alignment of the 128-bit operand is enforced. 88 * Exceptions type 4. SSE2 cpuid checks. 89 */ 90 FNIEMOP_DEF_1(iemOpCommonSse2_FullFull_To_Full, PCIEMOPMEDIAF2, pImpl) 91 { 92 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 93 if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT)) 94 { 95 /* 96 * Register, register. 97 */ 98 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 99 IEM_MC_BEGIN(2, 0); 100 IEM_MC_ARG(PRTUINT128U, pDst, 0); 101 IEM_MC_ARG(PCRTUINT128U, pSrc, 1); 102 IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT(); 103 IEM_MC_PREPARE_SSE_USAGE(); 104 IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg); 105 IEM_MC_REF_XREG_U128_CONST(pSrc, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB); 106 IEM_MC_CALL_SSE_AIMPL_2(pImpl->pfnU128, pDst, pSrc); 107 IEM_MC_ADVANCE_RIP(); 108 IEM_MC_END(); 109 } 110 else 111 { 112 /* 113 * Register, memory. 114 */ 115 IEM_MC_BEGIN(2, 2); 116 IEM_MC_ARG(PRTUINT128U, pDst, 0); 117 IEM_MC_LOCAL(RTUINT128U, uSrc); 118 IEM_MC_ARG_LOCAL_REF(PCRTUINT128U, pSrc, uSrc, 1); 119 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 120 121 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); 122 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 123 IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT(); 124 IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 125 126 IEM_MC_PREPARE_SSE_USAGE(); 127 IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg); 128 IEM_MC_CALL_SSE_AIMPL_2(pImpl->pfnU128, pDst, pSrc); 129 130 IEM_MC_ADVANCE_RIP(); 131 IEM_MC_END(); 132 } 133 return VINF_SUCCESS; 134 } 135 26 136 27 137 /** Opcode 0x0f 0x00 /0. */ … … 2939 3049 /* Opcode 0xf2 0x0f 0x56 - invalid */ 2940 3050 3051 2941 3052 /** Opcode 0x0f 0x57 - xorps Vps, Wps */ 2942 FNIEMOP_STUB(iemOp_xorps_Vps_Wps); 3053 FNIEMOP_DEF(iemOp_xorps_Vps_Wps) 3054 { 3055 IEMOP_MNEMONIC2(RM, XORPS, xorps, Vps, Wps, DISOPTYPE_HARMLESS, 0); 3056 return FNIEMOP_CALL_1(iemOpCommonSse2_FullFull_To_Full, &g_iemAImpl_pxor); 3057 } 3058 3059 2943 3060 /** Opcode 0x66 0x0f 0x57 - xorpd Vpd, Wpd */ 2944 FNIEMOP_STUB(iemOp_xorpd_Vpd_Wpd); 3061 FNIEMOP_DEF(iemOp_xorpd_Vpd_Wpd) 3062 { 3063 IEMOP_MNEMONIC2(RM, XORPD, xorpd, Vpd, Wpd, DISOPTYPE_HARMLESS, 0); 3064 return FNIEMOP_CALL_1(iemOpCommonSse2_FullFull_To_Full, &g_iemAImpl_pxor); 3065 } 3066 3067 2945 3068 /* Opcode 0xf3 0x0f 0x57 - invalid */ 2946 3069 /* Opcode 0xf2 0x0f 0x57 - invalid */ … … 4144 4267 4145 4268 4146 /**4147 * Common worker for MMX instructions on the form:4148 * pxxx mm1, mm2/mem644149 */4150 FNIEMOP_DEF_1(iemOpCommonMmx_FullFull_To_Full, PCIEMOPMEDIAF2, pImpl)4151 {4152 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);4153 if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))4154 {4155 /*4156 * Register, register.4157 */4158 /** @todo testcase: REX.B / REX.R and MMX register indexing. Ignored? */4159 /** @todo testcase: REX.B / REX.R and segment register indexing. Ignored? */4160 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();4161 IEM_MC_BEGIN(2, 0);4162 IEM_MC_ARG(uint64_t *, pDst, 0);4163 IEM_MC_ARG(uint64_t const *, pSrc, 1);4164 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();4165 IEM_MC_PREPARE_FPU_USAGE();4166 IEM_MC_REF_MREG_U64(pDst, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);4167 IEM_MC_REF_MREG_U64_CONST(pSrc, bRm & X86_MODRM_RM_MASK);4168 IEM_MC_CALL_MMX_AIMPL_2(pImpl->pfnU64, pDst, pSrc);4169 IEM_MC_ADVANCE_RIP();4170 IEM_MC_END();4171 }4172 else4173 {4174 /*4175 * Register, memory.4176 */4177 IEM_MC_BEGIN(2, 2);4178 IEM_MC_ARG(uint64_t *, pDst, 0);4179 IEM_MC_LOCAL(uint64_t, uSrc);4180 IEM_MC_ARG_LOCAL_REF(uint64_t const *, pSrc, uSrc, 1);4181 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);4182 4183 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);4184 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();4185 IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT();4186 IEM_MC_FETCH_MEM_U64(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);4187 4188 IEM_MC_PREPARE_FPU_USAGE();4189 IEM_MC_REF_MREG_U64(pDst, (bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK);4190 IEM_MC_CALL_MMX_AIMPL_2(pImpl->pfnU64, pDst, pSrc);4191 4192 IEM_MC_ADVANCE_RIP();4193 IEM_MC_END();4194 }4195 return VINF_SUCCESS;4196 }4197 4198 4199 /**4200 * Common worker for SSE2 instructions on the forms:4201 * pxxx xmm1, xmm2/mem1284202 *4203 * Proper alignment of the 128-bit operand is enforced.4204 * Exceptions type 4. SSE2 cpuid checks.4205 */4206 FNIEMOP_DEF_1(iemOpCommonSse2_FullFull_To_Full, PCIEMOPMEDIAF2, pImpl)4207 {4208 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);4209 if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))4210 {4211 /*4212 * Register, register.4213 */4214 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();4215 IEM_MC_BEGIN(2, 0);4216 IEM_MC_ARG(PRTUINT128U, pDst, 0);4217 IEM_MC_ARG(PCRTUINT128U, pSrc, 1);4218 IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();4219 IEM_MC_PREPARE_SSE_USAGE();4220 IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);4221 IEM_MC_REF_XREG_U128_CONST(pSrc, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);4222 IEM_MC_CALL_SSE_AIMPL_2(pImpl->pfnU128, pDst, pSrc);4223 IEM_MC_ADVANCE_RIP();4224 IEM_MC_END();4225 }4226 else4227 {4228 /*4229 * Register, memory.4230 */4231 IEM_MC_BEGIN(2, 2);4232 IEM_MC_ARG(PRTUINT128U, pDst, 0);4233 IEM_MC_LOCAL(RTUINT128U, uSrc);4234 IEM_MC_ARG_LOCAL_REF(PCRTUINT128U, pSrc, uSrc, 1);4235 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);4236 4237 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);4238 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();4239 IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();4240 IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);4241 4242 IEM_MC_PREPARE_SSE_USAGE();4243 IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);4244 IEM_MC_CALL_SSE_AIMPL_2(pImpl->pfnU128, pDst, pSrc);4245 4246 IEM_MC_ADVANCE_RIP();4247 IEM_MC_END();4248 }4249 return VINF_SUCCESS;4250 }4251 4252 4253 4269 /** Opcode 0x0f 0x74 - pcmpeqb Pq, Qq */ 4254 4270 FNIEMOP_DEF(iemOp_pcmpeqb_Pq_Qq) … … 4261 4277 FNIEMOP_DEF(iemOp_pcmpeqb_Vx_Wx) 4262 4278 { 4263 IEMOP_MNEMONIC( vpcmpeqb_Vx_Wx, "pcmpeqb");4279 IEMOP_MNEMONIC(pcmpeqb_Vx_Wx, "pcmpeqb"); 4264 4280 return FNIEMOP_CALL_1(iemOpCommonSse2_FullFull_To_Full, &g_iemAImpl_pcmpeqb); 4265 4281 } … … 4297 4313 FNIEMOP_DEF(iemOp_pcmpeqd_Vx_Wx) 4298 4314 { 4299 IEMOP_MNEMONIC(pcmpeqd_Vx_Wx, " vpcmpeqd");4315 IEMOP_MNEMONIC(pcmpeqd_Vx_Wx, "pcmpeqd"); 4300 4316 return FNIEMOP_CALL_1(iemOpCommonSse2_FullFull_To_Full, &g_iemAImpl_pcmpeqd); 4301 4317 } … … 7810 7826 return iemOp_InvalidNeedRM(pVCpu); 7811 7827 #ifndef TST_IEM_CHECK_MC 7812 # if defined(RT_ARCH_X86) || defined(RT_ARCH_AMD64)7828 # if (defined(RT_ARCH_X86) || defined(RT_ARCH_AMD64)) && !defined(IEM_WITHOUT_ASSEMBLY) 7813 7829 static const IEMOPBINSIZES s_Native = 7814 7830 { NULL, NULL, iemAImpl_popcnt_u16, NULL, iemAImpl_popcnt_u32, NULL, iemAImpl_popcnt_u64, NULL }; … … 9608 9624 } 9609 9625 9626 9610 9627 /** Opcode 0x66 0x0f 0xef - pxor Vx, Wx */ 9611 9628 FNIEMOP_DEF(iemOp_pxor_Vx_Wx) -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsVexMap1.cpp.h
r93115 r95403 23 23 * @{ 24 24 */ 25 26 /** 27 * Common worker for AVX2 instructions on the forms: 28 * - vpxxx xmm0, xmm1, xmm2/mem128 29 * - vpxxx ymm0, ymm1, ymm2/mem256 30 * 31 * Exceptions type 4. AVX2 cpuid checks. 32 */ 33 FNIEMOP_DEF_1(iemOpCommonAvx2_Vx_Hx_Wx, PCIEMOPMEDIAF3, pImpl) 34 { 35 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 36 if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT)) 37 { 38 /* 39 * Register, register. 40 */ 41 IEMOP_HLP_DONE_VEX_DECODING(); 42 if (pVCpu->iem.s.uVexLength) 43 { 44 IEM_MC_BEGIN(4, 3); 45 IEM_MC_LOCAL(RTUINT256U, uDst); 46 IEM_MC_LOCAL(RTUINT256U, uSrc1); 47 IEM_MC_LOCAL(RTUINT256U, uSrc2); 48 IEM_MC_IMPLICIT_AVX_AIMPL_ARGS(); 49 IEM_MC_ARG_LOCAL_REF(PRTUINT256U, puDst, uDst, 1); 50 IEM_MC_ARG_LOCAL_REF(PCRTUINT256U, puSrc1, uSrc1, 2); 51 IEM_MC_ARG_LOCAL_REF(PCRTUINT256U, puSrc2, uSrc2, 3); 52 IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT(); 53 IEM_MC_PREPARE_AVX_USAGE(); 54 IEM_MC_FETCH_YREG_U256(uSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu)); 55 IEM_MC_FETCH_YREG_U256(uSrc2, IEM_GET_MODRM_RM(pVCpu, bRm)); 56 IEM_MC_CALL_AVX_AIMPL_3(pImpl->pfnU256, puDst, puSrc1, puSrc2); 57 IEM_MC_STORE_YREG_U256_ZX_VLMAX(IEM_GET_MODRM_REG(pVCpu, bRm), uDst); 58 IEM_MC_ADVANCE_RIP(); 59 IEM_MC_END(); 60 } 61 else 62 { 63 IEM_MC_BEGIN(4, 0); 64 IEM_MC_IMPLICIT_AVX_AIMPL_ARGS(); 65 IEM_MC_ARG(PRTUINT128U, puDst, 1); 66 IEM_MC_ARG(PCRTUINT128U, puSrc1, 2); 67 IEM_MC_ARG(PCRTUINT128U, puSrc2, 3); 68 IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT(); 69 IEM_MC_PREPARE_AVX_USAGE(); 70 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm)); 71 IEM_MC_REF_XREG_U128_CONST(puSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu)); 72 IEM_MC_REF_XREG_U128_CONST(puSrc2, IEM_GET_MODRM_RM(pVCpu, bRm)); 73 IEM_MC_CALL_AVX_AIMPL_3(pImpl->pfnU128, puDst, puSrc1, puSrc2); 74 IEM_MC_CLEAR_YREG_128_UP( IEM_GET_MODRM_REG(pVCpu, bRm)); 75 IEM_MC_ADVANCE_RIP(); 76 IEM_MC_END(); 77 } 78 } 79 else 80 { 81 /* 82 * Register, memory. 83 */ 84 if (pVCpu->iem.s.uVexLength) 85 { 86 IEM_MC_BEGIN(4, 4); 87 IEM_MC_LOCAL(RTUINT256U, uDst); 88 IEM_MC_LOCAL(RTUINT256U, uSrc1); 89 IEM_MC_LOCAL(RTUINT256U, uSrc2); 90 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 91 IEM_MC_IMPLICIT_AVX_AIMPL_ARGS(); 92 IEM_MC_ARG_LOCAL_REF(PRTUINT256U, puDst, uDst, 1); 93 IEM_MC_ARG_LOCAL_REF(PCRTUINT256U, puSrc1, uSrc1, 2); 94 IEM_MC_ARG_LOCAL_REF(PCRTUINT256U, puSrc2, uSrc2, 3); 95 96 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); 97 IEMOP_HLP_DONE_VEX_DECODING(); 98 IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT(); 99 IEM_MC_PREPARE_AVX_USAGE(); 100 101 IEM_MC_FETCH_MEM_U256_NO_AC(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 102 IEM_MC_FETCH_YREG_U256(uSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu)); 103 IEM_MC_CALL_AVX_AIMPL_3(pImpl->pfnU256, puDst, puSrc1, puSrc2); 104 IEM_MC_STORE_YREG_U256_ZX_VLMAX( IEM_GET_MODRM_REG(pVCpu, bRm), uDst); 105 106 IEM_MC_ADVANCE_RIP(); 107 IEM_MC_END(); 108 } 109 else 110 { 111 IEM_MC_BEGIN(4, 2); 112 IEM_MC_LOCAL(RTUINT128U, uSrc2); 113 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 114 IEM_MC_IMPLICIT_AVX_AIMPL_ARGS(); 115 IEM_MC_ARG(PRTUINT128U, puDst, 1); 116 IEM_MC_ARG(PCRTUINT128U, puSrc1, 2); 117 IEM_MC_ARG_LOCAL_REF(PCRTUINT128U, puSrc2, uSrc2, 3); 118 119 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); 120 IEMOP_HLP_DONE_VEX_DECODING(); 121 IEM_MC_MAYBE_RAISE_AVX2_RELATED_XCPT(); 122 IEM_MC_PREPARE_AVX_USAGE(); 123 124 IEM_MC_FETCH_MEM_U128_NO_AC(uSrc2, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 125 IEM_MC_REF_XREG_U128(puDst, IEM_GET_MODRM_REG(pVCpu, bRm)); 126 IEM_MC_REF_XREG_U128_CONST(puSrc1, IEM_GET_EFFECTIVE_VVVV(pVCpu)); 127 IEM_MC_CALL_AVX_AIMPL_3(pImpl->pfnU128, puDst, puSrc1, puSrc2); 128 IEM_MC_CLEAR_YREG_128_UP( IEM_GET_MODRM_REG(pVCpu, bRm)); 129 130 IEM_MC_ADVANCE_RIP(); 131 IEM_MC_END(); 132 } 133 } 134 return VINF_SUCCESS; 135 } 136 25 137 26 138 … … 1707 1819 /* Opcode VEX.F2.0F 0x56 - invalid */ 1708 1820 1821 1709 1822 /** Opcode VEX.0F 0x57 - vxorps Vps, Hps, Wps */ 1710 FNIEMOP_STUB(iemOp_vxorps_Vps_Hps_Wps); 1823 FNIEMOP_DEF(iemOp_vxorps_Vps_Hps_Wps) 1824 { 1825 IEMOP_MNEMONIC3(VEX_RVM, VXORPS, vxorps, Vps, Hps, Wps, DISOPTYPE_HARMLESS, 0); 1826 return FNIEMOP_CALL_1(iemOpCommonAvx2_Vx_Hx_Wx, 1827 IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &g_iemAImpl_vpxor, &g_iemAImpl_vpxor_fallback)); 1828 } 1829 1830 1711 1831 /** Opcode VEX.66.0F 0x57 - vxorpd Vpd, Hpd, Wpd */ 1712 FNIEMOP_STUB(iemOp_vxorpd_Vpd_Hpd_Wpd); 1832 FNIEMOP_DEF(iemOp_vxorpd_Vpd_Hpd_Wpd) 1833 { 1834 IEMOP_MNEMONIC3(VEX_RVM, VXORPD, vxorpd, Vpd, Hpd, Wpd, DISOPTYPE_HARMLESS, 0); 1835 return FNIEMOP_CALL_1(iemOpCommonAvx2_Vx_Hx_Wx, 1836 IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &g_iemAImpl_vpxor, &g_iemAImpl_vpxor_fallback)); 1837 } 1838 1839 1713 1840 /* Opcode VEX.F3.0F 0x57 - invalid */ 1714 1841 /* Opcode VEX.F2.0F 0x57 - invalid */ … … 2596 2723 2597 2724 2598 ///**2599 // * Common worker for SSE2 instructions on the forms:2600 // * pxxx xmm1, xmm2/mem1282601 // *2602 // * Proper alignment of the 128-bit operand is enforced.2603 // * Exceptions type 4. SSE2 cpuid checks.2604 // */2605 //FNIEMOP_DEF_1(iemOpCommonSse2_FullFull_To_Full, PCIEMOPMEDIAF2, pImpl)2606 //{2607 // uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);2608 // if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))2609 // {2610 // /*2611 // * Register, register.2612 // */2613 // IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();2614 // IEM_MC_BEGIN(2, 0);2615 // IEM_MC_ARG(PRTUINT128U, pDst, 0);2616 // IEM_MC_ARG(PCRTUINT128U, pSrc, 1);2617 // IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();2618 // IEM_MC_PREPARE_SSE_USAGE();2619 // IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);2620 // IEM_MC_REF_XREG_U128_CONST(pSrc, (bRm & X86_MODRM_RM_MASK) | pVCpu->iem.s.uRexB);2621 // IEM_MC_CALL_SSE_AIMPL_2(pImpl->pfnU128, pDst, pSrc);2622 // IEM_MC_ADVANCE_RIP();2623 // IEM_MC_END();2624 // }2625 // else2626 // {2627 // /*2628 // * Register, memory.2629 // */2630 // IEM_MC_BEGIN(2, 2);2631 // IEM_MC_ARG(PRTUINT128U, pDst, 0);2632 // IEM_MC_LOCAL(RTUINT128U, uSrc);2633 // IEM_MC_ARG_LOCAL_REF(PCRTUINT128U, pSrc, uSrc, 1);2634 // IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc);2635 //2636 // IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);2637 // IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();2638 // IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();2639 // IEM_MC_FETCH_MEM_U128_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);2640 //2641 // IEM_MC_PREPARE_SSE_USAGE();2642 // IEM_MC_REF_XREG_U128(pDst, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);2643 // IEM_MC_CALL_SSE_AIMPL_2(pImpl->pfnU128, pDst, pSrc);2644 //2645 // IEM_MC_ADVANCE_RIP();2646 // IEM_MC_END();2647 // }2648 // return VINF_SUCCESS;2649 //}2650 2651 2652 2725 /* Opcode VEX.0F 0x74 - invalid */ 2653 2726 … … 3667 3740 FNIEMOP_DEF(iemOp_vpxor_Vx_Hx_Wx) 3668 3741 { 3669 IEMOP_MNEMONIC(vpxor, "vpxor"); 3670 return FNIEMOP_CALL_1(iemOpCommonSse2_FullFull_To_Full, &g_iemAImpl_pxor); 3742 IEMOP_MNEMONIC3(VEX_RVM, VPXOR, vpxor, Vx, Hx, Wx, DISOPTYPE_HARMLESS, 0); 3743 return FNIEMOP_CALL_1(iemOpCommonAvx2_Vx_Hx_Wx, 3744 IEM_SELECT_HOST_OR_FALLBACK(fAvx2, &g_iemAImpl_vpxor, &g_iemAImpl_vpxor_fallback)); 3671 3745 } 3672 3746 -
trunk/src/VBox/VMM/include/IEMInternal.h
r95360 r95403 152 152 * @sa IEMTARGETCPU_EFL_BEHAVIOR_SELECT_EX 153 153 */ 154 #if defined(RT_ARCH_X86) || defined(RT_ARCH_AMD64)154 #if (defined(RT_ARCH_X86) || defined(RT_ARCH_AMD64)) && !defined(IEM_WITHOUT_ASSEMBLY) 155 155 # define IEM_SELECT_HOST_OR_FALLBACK(a_fCpumFeatureMember, a_pfnNative, a_pfnFallback) \ 156 156 (g_CpumHostFeatures.s.a_fCpumFeatureMember ? a_pfnNative : a_pfnFallback) … … 1736 1736 /** @name Media (SSE/MMX/AVX) operations: full1 + full2 -> full1. 1737 1737 * @{ */ 1738 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLMEDIAF2U64,(PCX86FXSTATE pFpuState, uint64_t *pu 64Dst, uint64_t const *pu64Src));1738 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLMEDIAF2U64,(PCX86FXSTATE pFpuState, uint64_t *puDst, uint64_t const *puSrc)); 1739 1739 typedef FNIEMAIMPLMEDIAF2U64 *PFNIEMAIMPLMEDIAF2U64; 1740 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLMEDIAF2U128,(PCX86FXSTATE pFpuState, PRTUINT128U pu 128Dst, PCRTUINT128U pu128Src));1740 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLMEDIAF2U128,(PCX86FXSTATE pFpuState, PRTUINT128U puDst, PCRTUINT128U puSrc)); 1741 1741 typedef FNIEMAIMPLMEDIAF2U128 *PFNIEMAIMPLMEDIAF2U128; 1742 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLMEDIAF3U128,(PX86XSAVEAREA pExtState, PRTUINT128U puDst, PCRTUINT128U puSrc1, PCRTUINT128U puSrc2)); 1743 typedef FNIEMAIMPLMEDIAF3U128 *PFNIEMAIMPLMEDIAF3U128; 1744 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLMEDIAF3U256,(PX86XSAVEAREA pExtState, PRTUINT256U puDst, PCRTUINT256U puSrc1, PCRTUINT256U puSrc2)); 1745 typedef FNIEMAIMPLMEDIAF3U256 *PFNIEMAIMPLMEDIAF3U256; 1742 1746 FNIEMAIMPLMEDIAF2U64 iemAImpl_pxor_u64, iemAImpl_pcmpeqb_u64, iemAImpl_pcmpeqw_u64, iemAImpl_pcmpeqd_u64; 1743 1747 FNIEMAIMPLMEDIAF2U128 iemAImpl_pxor_u128, iemAImpl_pcmpeqb_u128, iemAImpl_pcmpeqw_u128, iemAImpl_pcmpeqd_u128; 1748 FNIEMAIMPLMEDIAF3U128 iemAImpl_vpxor_u128, iemAImpl_vpxor_u128_fallback; 1749 FNIEMAIMPLMEDIAF3U256 iemAImpl_vpxor_u256, iemAImpl_vpxor_u256_fallback; 1744 1750 /** @} */ 1745 1751 … … 1905 1911 /** Pointer to a media operation function table for hihalf+hihalf -> full. */ 1906 1912 typedef IEMOPMEDIAF1H1 const *PCIEMOPMEDIAF1H1; 1913 1914 1915 /** 1916 * Function table for media instruction taking two full sized media source 1917 * registers and one full sized destination register (AVX). 1918 */ 1919 typedef struct IEMOPMEDIAF3 1920 { 1921 PFNIEMAIMPLMEDIAF3U128 pfnU128; 1922 PFNIEMAIMPLMEDIAF3U256 pfnU256; 1923 } IEMOPMEDIAF3; 1924 /** Pointer to a media operation function table for 3 full sized ops (AVX). */ 1925 typedef IEMOPMEDIAF3 const *PCIEMOPMEDIAF3; 1907 1926 1908 1927 -
trunk/src/VBox/VMM/include/IEMMc.h
r94768 r95403 129 129 if (pVCpu->cpum.GstCtx.cr0 & X86_CR0_TS) \ 130 130 return iemRaiseDeviceNotAvailable(pVCpu); \ 131 if (pVCpu->cpum.GstCtx.XState.x87.FSW & X86_FSW_ES) \ 132 return iemRaiseMathFault(pVCpu); \ 131 133 } while (0) 132 134 #define IEM_MC_MAYBE_RAISE_MMX_RELATED_XCPT_CHECK_SSE_OR_MMXEXT() \ … … 643 645 # define IEM_MC_FETCH_MEM_U128(a_u128Dst, a_iSeg, a_GCPtrMem) \ 644 646 IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU128(pVCpu, &(a_u128Dst), (a_iSeg), (a_GCPtrMem))) 647 # define IEM_MC_FETCH_MEM_U128_NO_AC(a_u128Dst, a_iSeg, a_GCPtrMem) \ 648 IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU128(pVCpu, &(a_u128Dst), (a_iSeg), (a_GCPtrMem))) 645 649 # define IEM_MC_FETCH_MEM_U128_ALIGN_SSE(a_u128Dst, a_iSeg, a_GCPtrMem) \ 646 650 IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU128AlignedSse(pVCpu, &(a_u128Dst), (a_iSeg), (a_GCPtrMem))) … … 648 652 # define IEM_MC_FETCH_MEM_U128(a_u128Dst, a_iSeg, a_GCPtrMem) \ 649 653 iemMemFetchDataU128Jmp(pVCpu, &(a_u128Dst), (a_iSeg), (a_GCPtrMem)) 654 # define IEM_MC_FETCH_MEM_U128_NO_AC(a_u128Dst, a_iSeg, a_GCPtrMem) \ 655 iemMemFetchDataU128Jmp(pVCpu, &(a_u128Dst), (a_iSeg), (a_GCPtrMem)) 650 656 # define IEM_MC_FETCH_MEM_U128_ALIGN_SSE(a_u128Dst, a_iSeg, a_GCPtrMem) \ 651 657 iemMemFetchDataU128AlignedSseJmp(pVCpu, &(a_u128Dst), (a_iSeg), (a_GCPtrMem)) … … 654 660 #ifndef IEM_WITH_SETJMP 655 661 # define IEM_MC_FETCH_MEM_U256(a_u256Dst, a_iSeg, a_GCPtrMem) \ 662 IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU256(pVCpu, &(a_u256Dst), (a_iSeg), (a_GCPtrMem))) 663 # define IEM_MC_FETCH_MEM_U256_NO_AC(a_u256Dst, a_iSeg, a_GCPtrMem) \ 656 664 IEM_MC_RETURN_ON_FAILURE(iemMemFetchDataU256(pVCpu, &(a_u256Dst), (a_iSeg), (a_GCPtrMem))) 657 665 # define IEM_MC_FETCH_MEM_U256_ALIGN_AVX(a_u256Dst, a_iSeg, a_GCPtrMem) \ … … 659 667 #else 660 668 # define IEM_MC_FETCH_MEM_U256(a_u256Dst, a_iSeg, a_GCPtrMem) \ 669 iemMemFetchDataU256Jmp(pVCpu, &(a_u256Dst), (a_iSeg), (a_GCPtrMem)) 670 # define IEM_MC_FETCH_MEM_U256_NO_AC(a_u256Dst, a_iSeg, a_GCPtrMem) \ 661 671 iemMemFetchDataU256Jmp(pVCpu, &(a_u256Dst), (a_iSeg), (a_GCPtrMem)) 662 672 # define IEM_MC_FETCH_MEM_U256_ALIGN_AVX(a_u256Dst, a_iSeg, a_GCPtrMem) \ -
trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp
r95360 r95403 596 596 #define IEM_MC_FETCH_MEM_D80(a_d80Dst, a_iSeg, a_GCPtrMem) do { CHK_GCPTR(a_GCPtrMem); CHK_TYPE(RTPBCD80U, a_d80Dst); (void)fMcBegin; } while (0) 597 597 #define IEM_MC_FETCH_MEM_U128(a_u128Dst, a_iSeg, a_GCPtrMem) do { CHK_GCPTR(a_GCPtrMem); CHK_TYPE(RTUINT128U, a_u128Dst); (void)fMcBegin; } while (0) 598 #define IEM_MC_FETCH_MEM_U128_NO_AC(a_u128Dst, a_iSeg, a_GCPtrMem) do { CHK_GCPTR(a_GCPtrMem); CHK_TYPE(RTUINT128U, a_u128Dst); (void)fMcBegin; } while (0) 598 599 #define IEM_MC_FETCH_MEM_U128_ALIGN_SSE(a_u128Dst, a_iSeg, a_GCPtrMem) do { CHK_GCPTR(a_GCPtrMem); CHK_TYPE(RTUINT128U, a_u128Dst); (void)fMcBegin; } while (0) 599 600 #define IEM_MC_FETCH_MEM_U256(a_u256Dst, a_iSeg, a_GCPtrMem) do { CHK_GCPTR(a_GCPtrMem); CHK_TYPE(RTUINT256U, a_u256Dst); (void)fMcBegin; } while (0) 601 #define IEM_MC_FETCH_MEM_U256_NO_AC(a_u256Dst, a_iSeg, a_GCPtrMem) do { CHK_GCPTR(a_GCPtrMem); CHK_TYPE(RTUINT256U, a_u256Dst); (void)fMcBegin; } while (0) 600 602 #define IEM_MC_FETCH_MEM_U256_ALIGN_AVX(a_u256Dst, a_iSeg, a_GCPtrMem) do { CHK_GCPTR(a_GCPtrMem); CHK_TYPE(RTUINT256U, a_u256Dst); (void)fMcBegin; } while (0) 601 603
Note:
See TracChangeset
for help on using the changeset viewer.