Changeset 105274 in vbox
- Timestamp:
- Jul 11, 2024 3:07:58 PM (5 months ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm
r104521 r105274 6597 6597 6598 6598 6599 struc IEMMEDIAF2YMMSRC 6600 .uSrc1 resd 8 6601 .uSrc2 resd 8 6602 endstruc 6603 6604 6599 6605 ; 6600 6606 ; CMPPS (SSE) … … 6676 6682 IEMIMPL_MEDIA_SSE_INSN_IMM8_MXCSR_5 cmpsd 6677 6683 6678 ;; 6679 ; SSE instructions with 8-bit immediates of the form 6684 6685 ;; 6686 ; SSE/AVX instructions with 2 full sized perands and an 8-bit immediate of the form 6680 6687 ; xxx xmm1, xmm2, imm8. 6688 ; vxxx xmm1, xmm2, imm8 6681 6689 ; where the instruction encoding takes up 6 bytes and we need to load and save the MXCSR 6682 6690 ; register. … … 6687 6695 ; @param A0_32 The guest's MXCSR register value to use (input). 6688 6696 ; @param A1 Pointer to the first media register size operand (output). 6689 ; @param A2 Pointer to the two media register sized inputs - IEMMEDIAF2XMMSRC(input).6697 ; @param A2 Pointer to the second media register size operand (input). 6690 6698 ; @param A3 The 8-bit immediate (input). 6691 6699 ; 6692 %macro IEMIMPL_MEDIA_SSE_ INSN_IMM8_MXCSR_6 16700 %macro IEMIMPL_MEDIA_SSE_AVX_INSN_F2_IMM8_MXCSR_6 1 6693 6701 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u128, 16 6694 6702 PROLOGUE_4_ARGS … … 6697 6705 6698 6706 movzx A3, A3_8 ; must clear top bits 6699 movdqu xmm0, [A2 + IEMMEDIAF2XMMSRC.uSrc1] 6700 movdqu xmm1, [A2 + IEMMEDIAF2XMMSRC.uSrc2] 6707 movdqu xmm1, [A2] 6701 6708 IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A3, 8 6702 6709 movdqu [A1], xmm0 … … 6716 6723 .immEnd: 6717 6724 ENDPROC iemAImpl_ %+ %1 %+ _u128 6718 %endmacro 6719 6720 IEMIMPL_MEDIA_SSE_INSN_IMM8_MXCSR_6 roundps 6721 IEMIMPL_MEDIA_SSE_INSN_IMM8_MXCSR_6 roundpd 6722 IEMIMPL_MEDIA_SSE_INSN_IMM8_MXCSR_6 roundss 6723 IEMIMPL_MEDIA_SSE_INSN_IMM8_MXCSR_6 roundsd 6724 IEMIMPL_MEDIA_SSE_INSN_IMM8_MXCSR_6 dpps 6725 IEMIMPL_MEDIA_SSE_INSN_IMM8_MXCSR_6 dppd 6725 6726 BEGINPROC_FASTCALL iemAImpl_v %+ %1 %+ _u128, 16 6727 PROLOGUE_4_ARGS 6728 IEMIMPL_SSE_PROLOGUE 6729 SSE_AVX_LD_MXCSR A0_32 6730 6731 movzx A3, A3_8 ; must clear top bits 6732 movdqu xmm1, [A2] 6733 IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A3, 8 6734 movdqu [A1], xmm0 6735 6736 SSE_AVX_ST_MXCSR R0_32, A0_32 6737 IEMIMPL_SSE_EPILOGUE 6738 EPILOGUE_4_ARGS 6739 %assign bImm 0 6740 %rep 256 6741 .imm %+ bImm: 6742 IBT_ENDBRxx_WITHOUT_NOTRACK 6743 v%1 xmm0, xmm1, bImm 6744 ret 6745 int3 6746 %assign bImm bImm + 1 6747 %endrep 6748 .immEnd: 6749 ENDPROC iemAImpl_v %+ %1 %+ _u128 6750 6751 BEGINPROC_FASTCALL iemAImpl_v %+ %1 %+ _u256, 16 6752 PROLOGUE_4_ARGS 6753 IEMIMPL_SSE_PROLOGUE 6754 SSE_AVX_LD_MXCSR A0_32 6755 6756 movzx A3, A3_8 ; must clear top bits 6757 vmovdqu ymm1, [A2] 6758 IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A3, 8 6759 vmovdqu [A1], ymm0 6760 6761 SSE_AVX_ST_MXCSR R0_32, A0_32 6762 IEMIMPL_SSE_EPILOGUE 6763 EPILOGUE_4_ARGS 6764 %assign bImm 0 6765 %rep 256 6766 .imm %+ bImm: 6767 IBT_ENDBRxx_WITHOUT_NOTRACK 6768 v%1 ymm0, ymm1, bImm 6769 ret 6770 int3 6771 %assign bImm bImm + 1 6772 %endrep 6773 .immEnd: 6774 ENDPROC iemAImpl_v %+ %1 %+ _u256 6775 %endmacro 6776 6777 IEMIMPL_MEDIA_SSE_AVX_INSN_F2_IMM8_MXCSR_6 roundps 6778 IEMIMPL_MEDIA_SSE_AVX_INSN_F2_IMM8_MXCSR_6 roundpd 6779 6780 6781 ;; 6782 ; SSE/AVX instructions with 3 full sized perands and an 8-bit immediate of the form 6783 ; xxx xmm1, xmm2, imm8. 6784 ; vxxx xmm1, xmm2, xmm3, imm8 6785 ; where the instruction encoding takes up 6 bytes and we need to load and save the MXCSR 6786 ; register. 6787 ; 6788 ; @param 1 The instruction name. 6789 ; 6790 ; @return R0_32 The new MXCSR value of the guest. 6791 ; @param A0_32 The guest's MXCSR register value to use (input). 6792 ; @param A1 Pointer to the first media register size operand (output). 6793 ; @param A2 Pointer to the two media register sized inputs - IEMMEDIAF2XMMSRC/IEMMEDIAF2YMMSRC (input). 6794 ; @param A3 The 8-bit immediate (input). 6795 ; 6796 %macro IEMIMPL_MEDIA_SSE_AVX_INSN_F3_IMM8_MXCSR_6 1 6797 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u128, 16 6798 PROLOGUE_4_ARGS 6799 IEMIMPL_SSE_PROLOGUE 6800 SSE_AVX_LD_MXCSR A0_32 6801 6802 movzx A3, A3_8 ; must clear top bits 6803 movdqu xmm0, [A2 + IEMMEDIAF2XMMSRC.uSrc1] 6804 movdqu xmm1, [A2 + IEMMEDIAF2XMMSRC.uSrc2] 6805 IEMIMPL_CALL_JUMP_TABLE_TARGET T1, A3, 8 6806 movdqu [A1], xmm0 6807 6808 SSE_AVX_ST_MXCSR R0_32, A0_32 6809 IEMIMPL_SSE_EPILOGUE 6810 EPILOGUE_4_ARGS 6811 %assign bImm 0 6812 %rep 256 6813 .imm %+ bImm: 6814 IBT_ENDBRxx_WITHOUT_NOTRACK 6815 %1 xmm0, xmm1, bImm 6816 ret 6817 int3 6818 %assign bImm bImm + 1 6819 %endrep 6820 .immEnd: 6821 ENDPROC iemAImpl_ %+ %1 %+ _u128 6822 %endmacro 6823 6824 IEMIMPL_MEDIA_SSE_AVX_INSN_F3_IMM8_MXCSR_6 roundss 6825 IEMIMPL_MEDIA_SSE_AVX_INSN_F3_IMM8_MXCSR_6 roundsd 6826 IEMIMPL_MEDIA_SSE_AVX_INSN_F3_IMM8_MXCSR_6 dpps 6827 IEMIMPL_MEDIA_SSE_AVX_INSN_F3_IMM8_MXCSR_6 dppd 6726 6828 6727 6829 -
trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp
r105253 r105274 19400 19400 19401 19401 /** 19402 * ROUNDPS /ROUNDPD / ROUNDSS / ROUNDSD19402 * [V]ROUNDPS / [V]ROUNDPD / ROUNDSS / ROUNDSD 19403 19403 */ 19404 19404 … … 19447 19447 } 19448 19448 19449 19449 19450 #ifdef IEM_WITHOUT_ASSEMBLY 19450 19451 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_roundss_u128,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCIEMMEDIAF2XMMSRC pSrc, uint8_t bImm)) … … 19465 19466 #endif 19466 19467 19467 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_roundps_u128_fallback,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCIEMMEDIAF2XMMSRC pSrc, uint8_t bImm)) 19468 19469 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_roundps_u128_fallback,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCX86XMMREG puSrc, uint8_t bImm)) 19468 19470 { 19469 19471 for (uint8_t i = 0; i < RT_ELEMENTS(puDst->ar32); i++) 19470 19472 { 19471 puDst->ar32[i] = iemAImpl_round_worker_r32(&uMxCsrIn, &p Src->uSrc2.ar32[i], bImm & X86_SSE_ROUNDXX_IMM_MASK);19473 puDst->ar32[i] = iemAImpl_round_worker_r32(&uMxCsrIn, &puSrc->ar32[i], bImm & X86_SSE_ROUNDXX_IMM_MASK); 19472 19474 } 19473 19475 … … 19476 19478 19477 19479 19478 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_roundpd_u128_fallback,(uint32_t uMxCsrIn, PX86XMMREG puDst, PC IEMMEDIAF2XMMSRC pSrc, uint8_t bImm))19480 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_roundpd_u128_fallback,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCX86XMMREG puSrc, uint8_t bImm)) 19479 19481 { 19480 19482 for (uint8_t i = 0; i < RT_ELEMENTS(puDst->ar64); i++) 19481 19483 { 19482 puDst->ar64[i] = iemAImpl_round_worker_r64(&uMxCsrIn, &p Src->uSrc2.ar64[i], bImm & X86_SSE_ROUNDXX_IMM_MASK);19484 puDst->ar64[i] = iemAImpl_round_worker_r64(&uMxCsrIn, &puSrc->ar64[i], bImm & X86_SSE_ROUNDXX_IMM_MASK); 19483 19485 } 19484 19486 19485 19487 return uMxCsrIn; 19486 19488 } 19489 19490 19491 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vroundps_u128_fallback,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCX86XMMREG puSrc, uint8_t bImm)) 19492 { 19493 for (uint8_t i = 0; i < RT_ELEMENTS(puDst->ar32); i++) 19494 { 19495 puDst->ar32[i] = iemAImpl_round_worker_r32(&uMxCsrIn, &puSrc->ar32[i], bImm & X86_SSE_ROUNDXX_IMM_MASK); 19496 } 19497 19498 return uMxCsrIn; 19499 } 19500 19501 19502 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vroundpd_u128_fallback,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCX86XMMREG puSrc, uint8_t bImm)) 19503 { 19504 for (uint8_t i = 0; i < RT_ELEMENTS(puDst->ar64); i++) 19505 { 19506 puDst->ar64[i] = iemAImpl_round_worker_r64(&uMxCsrIn, &puSrc->ar64[i], bImm & X86_SSE_ROUNDXX_IMM_MASK); 19507 } 19508 19509 return uMxCsrIn; 19510 } 19511 19512 19513 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vroundps_u256_fallback,(uint32_t uMxCsrIn, PX86YMMREG puDst, PCX86YMMREG puSrc, uint8_t bImm)) 19514 { 19515 for (uint8_t i = 0; i < RT_ELEMENTS(puDst->ar32); i++) 19516 { 19517 puDst->ar32[i] = iemAImpl_round_worker_r32(&uMxCsrIn, &puSrc->ar32[i], bImm & X86_SSE_ROUNDXX_IMM_MASK); 19518 } 19519 19520 return uMxCsrIn; 19521 } 19522 19523 19524 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vroundpd_u256_fallback,(uint32_t uMxCsrIn, PX86YMMREG puDst, PCX86YMMREG puSrc, uint8_t bImm)) 19525 { 19526 for (uint8_t i = 0; i < RT_ELEMENTS(puDst->ar64); i++) 19527 { 19528 puDst->ar64[i] = iemAImpl_round_worker_r64(&uMxCsrIn, &puSrc->ar64[i], bImm & X86_SSE_ROUNDXX_IMM_MASK); 19529 } 19530 19531 return uMxCsrIn; 19532 } 19533 19534 19487 19535 19488 19536 /** -
trunk/src/VBox/VMM/VMMAll/IEMAllInstThree0f3a.cpp.h
r104368 r105274 162 162 * @sa iemOpCommonSse41_FullFullImm8_To_Full 163 163 */ 164 FNIEMOP_DEF_1(iemOpCommonSse41Fp_FullFullImm8_To_Full, PFNIEMAIMPLM XCSRF2XMMIMM8, pfnU128)164 FNIEMOP_DEF_1(iemOpCommonSse41Fp_FullFullImm8_To_Full, PFNIEMAIMPLMEDIAF3XMMIMM8, pfnU128) 165 165 { 166 166 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); … … 213 213 IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_REG(pVCpu, bRm), Dst); 214 214 215 IEM_MC_ADVANCE_RIP_AND_FINISH(); 216 IEM_MC_END(); 217 } 218 } 219 220 221 /** 222 * Common worker for SSE 4.1 instructions of the form: 223 * xxx xmm1, xmm2/mem128, imm8 224 * 225 * Proper alignment of the 128-bit operand is enforced. 226 * MXCSR is used as input and output. 227 * Exceptions type 4. SSE 4.1 cpuid checks. 228 * 229 * @sa iemOpCommonSse41_FullFullImm8_To_Full 230 */ 231 FNIEMOP_DEF_1(iemOpCommonSse41Fp_FullImm8_To_Full, PFNIEMAIMPLMEDIAF2XMMIMM8, pfnU128) 232 { 233 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 234 if (IEM_IS_MODRM_REG_MODE(bRm)) 235 { 236 /* 237 * XMM, XMM, imm8. 238 */ 239 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 240 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 241 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse41); 242 IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT(); 243 IEM_MC_PREPARE_SSE_USAGE(); 244 IEM_MC_LOCAL(X86XMMREG, uDst); 245 IEM_MC_ARG_LOCAL_REF(PX86XMMREG, puDst, uDst, 0); 246 IEM_MC_ARG( PCX86XMMREG, puSrc, 1); 247 IEM_MC_REF_XREG_XMM_CONST(puSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); 248 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 2); 249 IEM_MC_CALL_SSE_AIMPL_3(pfnU128, puDst, puSrc, bImmArg); 250 IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT(); 251 IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_REG(pVCpu, bRm), uDst); 252 IEM_MC_ADVANCE_RIP_AND_FINISH(); 253 IEM_MC_END(); 254 } 255 else 256 { 257 /* 258 * XMM, [mem128], imm8. 259 */ 260 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 261 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 262 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1); 263 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 264 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 2); 265 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX_EX(fSse41); 266 IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT(); 267 IEM_MC_PREPARE_SSE_USAGE(); 268 IEM_MC_LOCAL(X86XMMREG, uSrc); 269 IEM_MC_FETCH_MEM_XMM_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 270 IEM_MC_LOCAL(X86XMMREG, uDst); 271 IEM_MC_ARG_LOCAL_REF(PX86XMMREG, puDst, uDst, 0); 272 IEM_MC_ARG_LOCAL_REF(PCX86XMMREG, puSrc, uSrc, 1); 273 IEM_MC_CALL_SSE_AIMPL_3(pfnU128, puDst, puSrc, bImmArg); 274 IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT(); 275 IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_REG(pVCpu, bRm), uDst); 215 276 IEM_MC_ADVANCE_RIP_AND_FINISH(); 216 277 IEM_MC_END(); … … 291 352 { 292 353 IEMOP_MNEMONIC3(RMI, ROUNDPS, roundps, Vx, Wx, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_X86_SSE, 0); 293 return FNIEMOP_CALL_1(iemOpCommonSse41Fp_Full FullImm8_To_Full,354 return FNIEMOP_CALL_1(iemOpCommonSse41Fp_FullImm8_To_Full, 294 355 IEM_SELECT_HOST_OR_FALLBACK(fSse41, iemAImpl_roundps_u128, iemAImpl_roundps_u128_fallback)); 295 356 } … … 300 361 { 301 362 IEMOP_MNEMONIC3(RMI, ROUNDPD, roundpd, Vx, Wx, Ib, DISOPTYPE_HARMLESS | DISOPTYPE_X86_SSE, 0); 302 return FNIEMOP_CALL_1(iemOpCommonSse41Fp_Full FullImm8_To_Full,363 return FNIEMOP_CALL_1(iemOpCommonSse41Fp_FullImm8_To_Full, 303 364 IEM_SELECT_HOST_OR_FALLBACK(fSse41, iemAImpl_roundpd_u128, iemAImpl_roundpd_u128_fallback)); 304 365 } -
trunk/src/VBox/VMM/VMMAll/IEMAllInstVexMap3.cpp.h
r104784 r105274 155 155 /** 156 156 * Common worker for AVX instructions on the forms: 157 * - vxxxp{s,d} xmm0, xmm1/mem128, imm8 158 * - vxxxp{s,d} ymm0, ymm1/mem256, imm8 159 * 160 * Exceptions type 4. AVX cpuid check for both 128-bit and 256-bit operation. 161 */ 162 FNIEMOP_DEF_1(iemOpCommonAvxAvx_Vx_Wx_Ib, PCIEMOPMEDIAF2IMM8, pImpl) 163 { 164 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 165 if (IEM_IS_MODRM_REG_MODE(bRm)) 166 { 167 /* 168 * Register, register. 169 */ 170 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 171 if (pVCpu->iem.s.uVexLength) 172 { 173 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 174 IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx); 175 IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); 176 IEM_MC_PREPARE_AVX_USAGE(); 177 IEM_MC_LOCAL(X86YMMREG, uDst); 178 IEM_MC_ARG_LOCAL_REF(PX86YMMREG, puDst, uDst, 0); 179 IEM_MC_LOCAL(X86YMMREG, uSrc); 180 IEM_MC_ARG_LOCAL_REF(PCX86YMMREG, puSrc, uSrc, 1); 181 IEM_MC_FETCH_YREG_YMM(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); 182 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 2); 183 IEM_MC_CALL_AVX_AIMPL_3(pImpl->pfnU256, puDst, puSrc, bImmArg); 184 IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT(); 185 IEM_MC_STORE_YREG_YMM_ZX_VLMAX( IEM_GET_MODRM_REG(pVCpu, bRm), uDst); 186 IEM_MC_ADVANCE_RIP_AND_FINISH(); 187 IEM_MC_END(); 188 } 189 else 190 { 191 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 192 IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx); 193 IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); 194 IEM_MC_PREPARE_AVX_USAGE(); 195 IEM_MC_LOCAL(X86XMMREG, uDst); 196 IEM_MC_ARG_LOCAL_REF(PX86XMMREG, puDst, uDst, 0); 197 IEM_MC_ARG(PCX86XMMREG, puSrc, 1); 198 IEM_MC_REF_XREG_XMM_CONST(puSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); 199 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 2); 200 IEM_MC_CALL_AVX_AIMPL_3(pImpl->pfnU128, puDst, puSrc, bImmArg); 201 IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT(); 202 IEM_MC_STORE_XREG_XMM( IEM_GET_MODRM_REG(pVCpu, bRm), uDst); 203 IEM_MC_CLEAR_YREG_128_UP( IEM_GET_MODRM_REG(pVCpu, bRm)); 204 IEM_MC_ADVANCE_RIP_AND_FINISH(); 205 IEM_MC_END(); 206 } 207 } 208 else 209 { 210 /* 211 * Register, memory. 212 */ 213 if (pVCpu->iem.s.uVexLength) 214 { 215 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 216 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 217 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1); 218 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 219 IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx); 220 IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); 221 IEM_MC_PREPARE_AVX_USAGE(); 222 IEM_MC_LOCAL(X86YMMREG, uDst); 223 IEM_MC_ARG_LOCAL_REF(PX86YMMREG, puDst, uDst, 0); 224 IEM_MC_LOCAL(X86YMMREG, uSrc); 225 IEM_MC_ARG_LOCAL_REF(PCX86YMMREG, puSrc, uSrc, 1); 226 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 2); 227 IEM_MC_FETCH_MEM_YMM_NO_AC(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 228 IEM_MC_CALL_AVX_AIMPL_3(pImpl->pfnU256, puDst, puSrc, bImmArg); 229 IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT(); 230 IEM_MC_STORE_YREG_YMM_ZX_VLMAX( IEM_GET_MODRM_REG(pVCpu, bRm), uDst); 231 IEM_MC_ADVANCE_RIP_AND_FINISH(); 232 IEM_MC_END(); 233 } 234 else 235 { 236 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 237 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 238 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 1); 239 uint8_t bImm; IEM_OPCODE_GET_NEXT_U8(&bImm); 240 IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx); 241 IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); 242 IEM_MC_PREPARE_AVX_USAGE(); 243 IEM_MC_LOCAL(X86XMMREG, uDst); 244 IEM_MC_ARG_LOCAL_REF(PX86XMMREG, puDst, uDst, 0); 245 IEM_MC_LOCAL(X86XMMREG, uSrc); 246 IEM_MC_ARG_LOCAL_REF(PCX86XMMREG, puSrc, uSrc, 1); 247 IEM_MC_ARG_CONST(uint8_t, bImmArg, /*=*/ bImm, 2); 248 IEM_MC_FETCH_MEM_XMM_NO_AC(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 249 IEM_MC_CALL_AVX_AIMPL_3(pImpl->pfnU128, puDst, puSrc, bImmArg); 250 IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT(); 251 IEM_MC_STORE_XREG_XMM( IEM_GET_MODRM_REG(pVCpu, bRm), uDst); 252 IEM_MC_CLEAR_YREG_128_UP( IEM_GET_MODRM_REG(pVCpu, bRm)); 253 IEM_MC_ADVANCE_RIP_AND_FINISH(); 254 IEM_MC_END(); 255 } 256 } 257 } 258 259 260 /** 261 * Common worker for AVX instructions on the forms: 157 262 * - vpermilps/d xmm0, xmm1/mem128, imm8 158 263 * - vpermilps/d ymm0, ymm1/mem256, imm8 … … 480 585 481 586 /* Opcode VEX.66.0F3A 0x07 - invalid */ 587 588 482 589 /** Opcode VEX.66.0F3A 0x08. */ 483 FNIEMOP_STUB(iemOp_vroundps_Vx_Wx_Ib); 590 FNIEMOP_DEF(iemOp_vroundps_Vx_Wx_Ib) 591 { 592 IEMOP_MNEMONIC3(VEX_RMI, VROUNDPS, vroundps, Vx_WO, Wx, Ib, DISOPTYPE_HARMLESS, IEMOPHINT_VEX_V_ZERO); 593 IEMOPMEDIAF2IMM8_INIT_VARS( vroundps); 594 return FNIEMOP_CALL_1(iemOpCommonAvxAvx_Vx_Wx_Ib, IEM_SELECT_HOST_OR_FALLBACK(fAvx, &s_Host, &s_Fallback)); 595 } 596 597 484 598 /** Opcode VEX.66.0F3A 0x09. */ 485 FNIEMOP_STUB(iemOp_vroundpd_Vx_Wx_Ib); 599 FNIEMOP_DEF(iemOp_vroundpd_Vx_Wx_Ib) 600 { 601 IEMOP_MNEMONIC3(VEX_RMI, VROUNDPD, vroundpd, Vx_WO, Wx, Ib, DISOPTYPE_HARMLESS, IEMOPHINT_VEX_V_ZERO); 602 IEMOPMEDIAF2IMM8_INIT_VARS( vroundpd); 603 return FNIEMOP_CALL_1(iemOpCommonAvxAvx_Vx_Wx_Ib, IEM_SELECT_HOST_OR_FALLBACK(fAvx, &s_Host, &s_Fallback)); 604 } 605 606 486 607 /** Opcode VEX.66.0F3A 0x0a. */ 487 608 FNIEMOP_STUB(iemOp_vroundss_Vss_Wss_Ib); -
trunk/src/VBox/VMM/include/IEMInternal.h
r105261 r105274 4154 4154 typedef const IEMMEDIAF2XMMSRC *PCIEMMEDIAF2XMMSRC; 4155 4155 4156 typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLMXCSRF2XMMIMM8,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCIEMMEDIAF2XMMSRC puSrc, uint8_t bEvil)); 4157 typedef FNIEMAIMPLMXCSRF2XMMIMM8 *PFNIEMAIMPLMXCSRF2XMMIMM8; 4158 4159 FNIEMAIMPLMXCSRF2XMMIMM8 iemAImpl_cmpps_u128; 4160 FNIEMAIMPLMXCSRF2XMMIMM8 iemAImpl_cmppd_u128; 4161 FNIEMAIMPLMXCSRF2XMMIMM8 iemAImpl_cmpss_u128; 4162 FNIEMAIMPLMXCSRF2XMMIMM8 iemAImpl_cmpsd_u128; 4163 FNIEMAIMPLMXCSRF2XMMIMM8 iemAImpl_roundss_u128; 4164 FNIEMAIMPLMXCSRF2XMMIMM8 iemAImpl_roundsd_u128; 4165 4166 FNIEMAIMPLMXCSRF2XMMIMM8 iemAImpl_roundps_u128, iemAImpl_roundps_u128_fallback; 4167 FNIEMAIMPLMXCSRF2XMMIMM8 iemAImpl_roundpd_u128, iemAImpl_roundpd_u128_fallback; 4168 4169 FNIEMAIMPLMXCSRF2XMMIMM8 iemAImpl_dpps_u128, iemAImpl_dpps_u128_fallback; 4170 FNIEMAIMPLMXCSRF2XMMIMM8 iemAImpl_dppd_u128, iemAImpl_dppd_u128_fallback; 4156 typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLMEDIAF3XMMIMM8,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCIEMMEDIAF2XMMSRC puSrc, uint8_t bEvil)); 4157 typedef FNIEMAIMPLMEDIAF3XMMIMM8 *PFNIEMAIMPLMEDIAF3XMMIMM8; 4158 4159 4160 FNIEMAIMPLMEDIAF3XMMIMM8 iemAImpl_cmpps_u128; 4161 FNIEMAIMPLMEDIAF3XMMIMM8 iemAImpl_cmppd_u128; 4162 FNIEMAIMPLMEDIAF3XMMIMM8 iemAImpl_cmpss_u128; 4163 FNIEMAIMPLMEDIAF3XMMIMM8 iemAImpl_cmpsd_u128; 4164 FNIEMAIMPLMEDIAF3XMMIMM8 iemAImpl_roundss_u128; 4165 FNIEMAIMPLMEDIAF3XMMIMM8 iemAImpl_roundsd_u128; 4166 4167 FNIEMAIMPLMEDIAF3XMMIMM8 iemAImpl_dpps_u128, iemAImpl_dpps_u128_fallback; 4168 FNIEMAIMPLMEDIAF3XMMIMM8 iemAImpl_dppd_u128, iemAImpl_dppd_u128_fallback; 4169 4170 4171 typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLMEDIAF2XMMIMM8,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCX86XMMREG puSrc, uint8_t bEvil)); 4172 typedef FNIEMAIMPLMEDIAF2XMMIMM8 *PFNIEMAIMPLMEDIAF2XMMIMM8; 4173 4174 4175 typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLMEDIAF2YMMIMM8,(uint32_t uMxCsrIn, PX86YMMREG puDst, PCX86YMMREG puSrc, uint8_t bEvil)); 4176 typedef FNIEMAIMPLMEDIAF2YMMIMM8 *PFNIEMAIMPLMEDIAF2YMMIMM8; 4177 4178 4179 FNIEMAIMPLMEDIAF2XMMIMM8 iemAImpl_roundps_u128, iemAImpl_roundps_u128_fallback; 4180 FNIEMAIMPLMEDIAF2XMMIMM8 iemAImpl_roundpd_u128, iemAImpl_roundpd_u128_fallback; 4181 4182 FNIEMAIMPLMEDIAF2XMMIMM8 iemAImpl_vroundps_u128, iemAImpl_vroundps_u128_fallback; 4183 FNIEMAIMPLMEDIAF2XMMIMM8 iemAImpl_vroundpd_u128, iemAImpl_vroundpd_u128_fallback; 4184 4185 FNIEMAIMPLMEDIAF2YMMIMM8 iemAImpl_vroundps_u256, iemAImpl_vroundps_u256_fallback; 4186 FNIEMAIMPLMEDIAF2YMMIMM8 iemAImpl_vroundpd_u256, iemAImpl_vroundpd_u256_fallback; 4187 4171 4188 4172 4189 typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLMXCSRU64U128,(uint32_t fMxCsrIn, uint64_t *pu64Dst, PCX86XMMREG pSrc)); … … 4411 4428 IEMOPMEDIAOPTF2_INIT_VARS_EX(RT_CONCAT3(iemAImpl_,a_InstrNm,_u128), RT_CONCAT3(iemAImpl_,a_InstrNm,_u256),\ 4412 4429 RT_CONCAT3(iemAImpl_,a_InstrNm,_u128_fallback), RT_CONCAT3(iemAImpl_,a_InstrNm,_u256_fallback)) 4430 4431 4432 /** 4433 * Function table for media instruction taking one full sized media source 4434 * register and one full sized destination register and an 8-bit immediate (AVX). 4435 */ 4436 typedef struct IEMOPMEDIAF2IMM8 4437 { 4438 PFNIEMAIMPLMEDIAF2XMMIMM8 pfnU128; 4439 PFNIEMAIMPLMEDIAF2YMMIMM8 pfnU256; 4440 } IEMOPMEDIAF2IMM8; 4441 /** Pointer to a media operation function table for 2 full sized ops (AVX). */ 4442 typedef IEMOPMEDIAF2IMM8 const *PCIEMOPMEDIAF2IMM8; 4443 4444 /** @def IEMOPMEDIAF2IMM8_INIT_VARS_EX 4445 * Declares a s_Host (x86 & amd64 only) and a s_Fallback variable with the 4446 * given functions as initializers. For use in AVX functions where a pair of 4447 * functions are only used once and the function table need not be public. */ 4448 #ifndef TST_IEM_CHECK_MC 4449 # if (defined(RT_ARCH_X86) || defined(RT_ARCH_AMD64)) && !defined(IEM_WITHOUT_ASSEMBLY) 4450 # define IEMOPMEDIAF2IMM8_INIT_VARS_EX(a_pfnHostU128, a_pfnHostU256, a_pfnFallbackU128, a_pfnFallbackU256) \ 4451 static IEMOPMEDIAF2IMM8 const s_Host = { a_pfnHostU128, a_pfnHostU256 }; \ 4452 static IEMOPMEDIAF2IMM8 const s_Fallback = { a_pfnFallbackU128, a_pfnFallbackU256 } 4453 # else 4454 # define IEMOPMEDIAF2IMM8_INIT_VARS_EX(a_pfnU128, a_pfnU256, a_pfnFallbackU128, a_pfnFallbackU256) \ 4455 static IEMOPMEDIAF2IMM8 const s_Fallback = { a_pfnFallbackU128, a_pfnFallbackU256 } 4456 # endif 4457 #else 4458 # define IEMOPMEDIAF2IMM8_INIT_VARS_EX(a_pfnU128, a_pfnU256, a_pfnFallbackU128, a_pfnFallbackU256) (void)0 4459 #endif 4460 /** @def IEMOPMEDIAF2IMM8_INIT_VARS 4461 * Generate AVX function tables for the @a a_InstrNm instruction. 4462 * @sa IEMOPMEDIAF2IMM8_INIT_VARS_EX */ 4463 #define IEMOPMEDIAF2IMM8_INIT_VARS(a_InstrNm) \ 4464 IEMOPMEDIAF2IMM8_INIT_VARS_EX(RT_CONCAT3(iemAImpl_,a_InstrNm,_u128), RT_CONCAT3(iemAImpl_,a_InstrNm,_u256),\ 4465 RT_CONCAT3(iemAImpl_,a_InstrNm,_u128_fallback), RT_CONCAT3(iemAImpl_,a_InstrNm,_u256_fallback)) 4466 4413 4467 4414 4468 /** -
trunk/src/VBox/VMM/testcase/tstIEMAImpl.cpp
r104521 r105274 7837 7837 #define SSE_COMPARE_F2_XMM_IMM8_MAX 0x1f 7838 7838 7839 TYPEDEF_SUBTEST_TYPE(SSE_COMPARE_F 2_XMM_IMM8_T, SSE_COMPARE_F2_XMM_IMM8_TEST_T, PFNIEMAIMPLMXCSRF2XMMIMM8);7840 7841 static SSE_COMPARE_F 2_XMM_IMM8_T g_aSseCompareF2XmmR32Imm8[] =7839 TYPEDEF_SUBTEST_TYPE(SSE_COMPARE_F3_XMM_IMM8_T, SSE_COMPARE_F3_XMM_IMM8_TEST_T, PFNIEMAIMPLMEDIAF3XMMIMM8); 7840 7841 static SSE_COMPARE_F3_XMM_IMM8_T g_aSseCompareF3XmmR32Imm8[] = 7842 7842 { 7843 7843 ENTRY_BIN(cmpps_u128), … … 7846 7846 7847 7847 #ifdef TSTIEMAIMPL_WITH_GENERATOR 7848 DUMP_ALL_FN(SseCompareF 2XmmR32Imm8, g_aSseCompareF2XmmR32Imm8)7849 static RTEXITCODE SseCompareF 2XmmR32Imm8Generate(uint32_t cTests, const char * const *papszNameFmts)7848 DUMP_ALL_FN(SseCompareF3XmmR32Imm8, g_aSseCompareF3XmmR32Imm8) 7849 static RTEXITCODE SseCompareF3XmmR32Imm8Generate(uint32_t cTests, const char * const *papszNameFmts) 7850 7850 { 7851 7851 cTests = RT_MAX(192, cTests); /* there are 144 standard input variations */ … … 7865 7865 7866 7866 uint32_t cMinNormalPairs = (cTests - 144) / 4; 7867 for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseCompareF 2XmmR32Imm8); iFn++)7868 { 7869 PFNIEMAIMPLM XCSRF2XMMIMM8 const pfn = g_aSseCompareF2XmmR32Imm8[iFn].pfnNative ? g_aSseCompareF2XmmR32Imm8[iFn].pfnNative : g_aSseCompareF2XmmR32Imm8[iFn].pfn;7867 for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseCompareF3XmmR32Imm8); iFn++) 7868 { 7869 PFNIEMAIMPLMEDIAF3XMMIMM8 const pfn = g_aSseCompareF3XmmR32Imm8[iFn].pfnNative ? g_aSseCompareF3XmmR32Imm8[iFn].pfnNative : g_aSseCompareF3XmmR32Imm8[iFn].pfn; 7870 7870 7871 7871 IEMBINARYOUTPUT BinOut; 7872 AssertReturn(GENERATE_BINARY_OPEN(&BinOut, papszNameFmts, g_aSseCompareF 2XmmR32Imm8[iFn]), RTEXITCODE_FAILURE);7872 AssertReturn(GENERATE_BINARY_OPEN(&BinOut, papszNameFmts, g_aSseCompareF3XmmR32Imm8[iFn]), RTEXITCODE_FAILURE); 7873 7873 7874 7874 uint32_t cNormalInputPairs = 0; 7875 7875 for (uint32_t iTest = 0; iTest < cTests + RT_ELEMENTS(s_aSpecials); iTest += 1) 7876 7876 { 7877 SSE_COMPARE_F 2_XMM_IMM8_TEST_T TestData; RT_ZERO(TestData);7877 SSE_COMPARE_F3_XMM_IMM8_TEST_T TestData; RT_ZERO(TestData); 7878 7878 7879 7879 TestData.InVal1.ar32[0] = iTest < cTests ? RandR32Src(iTest) : s_aSpecials[iTest - cTests].Val1; … … 7980 7980 #endif 7981 7981 7982 static void SseCompareF 2XmmR32Imm8Test(void)7983 { 7984 for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseCompareF 2XmmR32Imm8); iFn++)7985 { 7986 if (!SUBTEST_CHECK_IF_ENABLED_AND_DECOMPRESS(g_aSseCompareF 2XmmR32Imm8[iFn]))7982 static void SseCompareF3XmmR32Imm8Test(void) 7983 { 7984 for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseCompareF3XmmR32Imm8); iFn++) 7985 { 7986 if (!SUBTEST_CHECK_IF_ENABLED_AND_DECOMPRESS(g_aSseCompareF3XmmR32Imm8[iFn])) 7987 7987 continue; 7988 7988 7989 SSE_COMPARE_F 2_XMM_IMM8_TEST_T const * const paTests = g_aSseCompareF2XmmR32Imm8[iFn].paTests;7990 uint32_t const cTests = g_aSseCompareF 2XmmR32Imm8[iFn].cTests;7991 PFNIEMAIMPLM XCSRF2XMMIMM8 pfn = g_aSseCompareF2XmmR32Imm8[iFn].pfn;7992 uint32_t const cVars = COUNT_VARIATIONS(g_aSseCompareF 2XmmR32Imm8[iFn]);7989 SSE_COMPARE_F3_XMM_IMM8_TEST_T const * const paTests = g_aSseCompareF3XmmR32Imm8[iFn].paTests; 7990 uint32_t const cTests = g_aSseCompareF3XmmR32Imm8[iFn].cTests; 7991 PFNIEMAIMPLMEDIAF3XMMIMM8 pfn = g_aSseCompareF3XmmR32Imm8[iFn].pfn; 7992 uint32_t const cVars = COUNT_VARIATIONS(g_aSseCompareF3XmmR32Imm8[iFn]); 7993 7993 if (!cTests) RTTestSkipped(g_hTest, "no tests"); 7994 7994 for (uint32_t iVar = 0; iVar < cVars; iVar++) … … 8030 8030 } 8031 8031 8032 FREE_DECOMPRESSED_TESTS(g_aSseCompareF 2XmmR32Imm8[iFn]);8032 FREE_DECOMPRESSED_TESTS(g_aSseCompareF3XmmR32Imm8[iFn]); 8033 8033 } 8034 8034 } … … 8038 8038 * Compare SSE operations on packed and single double-precision floating point values - outputting a mask. 8039 8039 */ 8040 static SSE_COMPARE_F 2_XMM_IMM8_T g_aSseCompareF2XmmR64Imm8[] =8040 static SSE_COMPARE_F3_XMM_IMM8_T g_aSseCompareF3XmmR64Imm8[] = 8041 8041 { 8042 8042 ENTRY_BIN(cmppd_u128), … … 8045 8045 8046 8046 #ifdef TSTIEMAIMPL_WITH_GENERATOR 8047 DUMP_ALL_FN(SseCompareF 2XmmR64Imm8, g_aSseCompareF2XmmR64Imm8)8048 static RTEXITCODE SseCompareF 2XmmR64Imm8Generate(uint32_t cTests, const char * const *papszNameFmts)8047 DUMP_ALL_FN(SseCompareF3XmmR64Imm8, g_aSseCompareF3XmmR64Imm8) 8048 static RTEXITCODE SseCompareF3XmmR64Imm8Generate(uint32_t cTests, const char * const *papszNameFmts) 8049 8049 { 8050 8050 cTests = RT_MAX(192, cTests); /* there are 144 standard input variations */ … … 8064 8064 8065 8065 uint32_t cMinNormalPairs = (cTests - 144) / 4; 8066 for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseCompareF 2XmmR64Imm8); iFn++)8067 { 8068 PFNIEMAIMPLM XCSRF2XMMIMM8 const pfn = g_aSseCompareF2XmmR64Imm8[iFn].pfnNative ? g_aSseCompareF2XmmR64Imm8[iFn].pfnNative : g_aSseCompareF2XmmR64Imm8[iFn].pfn;8066 for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseCompareF3XmmR64Imm8); iFn++) 8067 { 8068 PFNIEMAIMPLMEDIAF3XMMIMM8 const pfn = g_aSseCompareF3XmmR64Imm8[iFn].pfnNative ? g_aSseCompareF3XmmR64Imm8[iFn].pfnNative : g_aSseCompareF3XmmR64Imm8[iFn].pfn; 8069 8069 8070 8070 IEMBINARYOUTPUT BinOut; 8071 AssertReturn(GENERATE_BINARY_OPEN(&BinOut, papszNameFmts, g_aSseCompareF 2XmmR64Imm8[iFn]), RTEXITCODE_FAILURE);8071 AssertReturn(GENERATE_BINARY_OPEN(&BinOut, papszNameFmts, g_aSseCompareF3XmmR64Imm8[iFn]), RTEXITCODE_FAILURE); 8072 8072 8073 8073 uint32_t cNormalInputPairs = 0; 8074 8074 for (uint32_t iTest = 0; iTest < cTests + RT_ELEMENTS(s_aSpecials); iTest += 1) 8075 8075 { 8076 SSE_COMPARE_F 2_XMM_IMM8_TEST_T TestData; RT_ZERO(TestData);8076 SSE_COMPARE_F3_XMM_IMM8_TEST_T TestData; RT_ZERO(TestData); 8077 8077 8078 8078 TestData.InVal1.ar64[0] = iTest < cTests ? RandR64Src(iTest) : s_aSpecials[iTest - cTests].Val1; … … 8171 8171 #endif 8172 8172 8173 static void SseCompareF 2XmmR64Imm8Test(void)8174 { 8175 for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseCompareF 2XmmR64Imm8); iFn++)8176 { 8177 if (!SUBTEST_CHECK_IF_ENABLED_AND_DECOMPRESS(g_aSseCompareF 2XmmR64Imm8[iFn]))8173 static void SseCompareF3XmmR64Imm8Test(void) 8174 { 8175 for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseCompareF3XmmR64Imm8); iFn++) 8176 { 8177 if (!SUBTEST_CHECK_IF_ENABLED_AND_DECOMPRESS(g_aSseCompareF3XmmR64Imm8[iFn])) 8178 8178 continue; 8179 8179 8180 SSE_COMPARE_F 2_XMM_IMM8_TEST_T const * const paTests = g_aSseCompareF2XmmR64Imm8[iFn].paTests;8181 uint32_t const cTests = g_aSseCompareF 2XmmR64Imm8[iFn].cTests;8182 PFNIEMAIMPLM XCSRF2XMMIMM8 pfn = g_aSseCompareF2XmmR64Imm8[iFn].pfn;8183 uint32_t const cVars = COUNT_VARIATIONS(g_aSseCompareF 2XmmR64Imm8[iFn]);8180 SSE_COMPARE_F3_XMM_IMM8_TEST_T const * const paTests = g_aSseCompareF3XmmR64Imm8[iFn].paTests; 8181 uint32_t const cTests = g_aSseCompareF3XmmR64Imm8[iFn].cTests; 8182 PFNIEMAIMPLMEDIAF3XMMIMM8 pfn = g_aSseCompareF3XmmR64Imm8[iFn].pfn; 8183 uint32_t const cVars = COUNT_VARIATIONS(g_aSseCompareF3XmmR64Imm8[iFn]); 8184 8184 if (!cTests) RTTestSkipped(g_hTest, "no tests"); 8185 8185 for (uint32_t iVar = 0; iVar < cVars; iVar++) … … 8214 8214 } 8215 8215 8216 FREE_DECOMPRESSED_TESTS(g_aSseCompareF 2XmmR64Imm8[iFn]);8216 FREE_DECOMPRESSED_TESTS(g_aSseCompareF3XmmR64Imm8[iFn]); 8217 8217 } 8218 8218 } … … 10237 10237 GROUP_ENTRY(CATEGORY_SSE_FP_OTHER, SseCompareEflR32R32, "tstIEMAImplDataSseCompare-%s.bin.gz", 0), 10238 10238 GROUP_ENTRY(CATEGORY_SSE_FP_OTHER, SseCompareEflR64R64, "tstIEMAImplDataSseCompare-%s.bin.gz", 0), 10239 GROUP_ENTRY(CATEGORY_SSE_FP_OTHER, SseCompareF 2XmmR32Imm8, "tstIEMAImplDataSseCompare-%s.bin.gz", 0),10240 GROUP_ENTRY(CATEGORY_SSE_FP_OTHER, SseCompareF 2XmmR64Imm8, "tstIEMAImplDataSseCompare-%s.bin.gz", 0),10239 GROUP_ENTRY(CATEGORY_SSE_FP_OTHER, SseCompareF3XmmR32Imm8, "tstIEMAImplDataSseCompare-%s.bin.gz", 0), 10240 GROUP_ENTRY(CATEGORY_SSE_FP_OTHER, SseCompareF3XmmR64Imm8, "tstIEMAImplDataSseCompare-%s.bin.gz", 0), 10241 10241 10242 10242 GROUP_ENTRY(CATEGORY_SSE_FP_OTHER, SseConvertXmmI32R32, "tstIEMAImplDataSseConvert-%s.bin.gz", 0), -
trunk/src/VBox/VMM/testcase/tstIEMAImpl.h
r104521 r105274 473 473 } SSE_COMPARE_EFL_R64_R64_TEST_T; 474 474 475 typedef struct SSE_COMPARE_F 2_XMM_IMM8_TEST_T475 typedef struct SSE_COMPARE_F3_XMM_IMM8_TEST_T 476 476 { 477 477 uint32_t fMxcsrIn; … … 483 483 X86XMMREG InVal2; 484 484 X86XMMREG OutVal; 485 } SSE_COMPARE_F 2_XMM_IMM8_TEST_T;485 } SSE_COMPARE_F3_XMM_IMM8_TEST_T; 486 486 487 487 typedef struct SSE_CONVERT_XMM_TEST_T … … 1004 1004 TSTIEM_DECLARE_TEST_ARRAY_BIN(SseCompare, SSE_COMPARE_EFL_R64_R64_TEST_T, vcomisd_u128 ); 1005 1005 1006 TSTIEM_DECLARE_TEST_ARRAY_BIN(SseCompare, SSE_COMPARE_F 2_XMM_IMM8_TEST_T, cmpps_u128 );1007 TSTIEM_DECLARE_TEST_ARRAY_BIN(SseCompare, SSE_COMPARE_F 2_XMM_IMM8_TEST_T, cmppd_u128 );1008 TSTIEM_DECLARE_TEST_ARRAY_BIN(SseCompare, SSE_COMPARE_F 2_XMM_IMM8_TEST_T, cmpss_u128 );1009 TSTIEM_DECLARE_TEST_ARRAY_BIN(SseCompare, SSE_COMPARE_F 2_XMM_IMM8_TEST_T, cmpsd_u128 );1006 TSTIEM_DECLARE_TEST_ARRAY_BIN(SseCompare, SSE_COMPARE_F3_XMM_IMM8_TEST_T, cmpps_u128 ); 1007 TSTIEM_DECLARE_TEST_ARRAY_BIN(SseCompare, SSE_COMPARE_F3_XMM_IMM8_TEST_T, cmppd_u128 ); 1008 TSTIEM_DECLARE_TEST_ARRAY_BIN(SseCompare, SSE_COMPARE_F3_XMM_IMM8_TEST_T, cmpss_u128 ); 1009 TSTIEM_DECLARE_TEST_ARRAY_BIN(SseCompare, SSE_COMPARE_F3_XMM_IMM8_TEST_T, cmpsd_u128 ); 1010 1010 1011 1011 TSTIEM_DECLARE_TEST_ARRAY_BIN(SseConvert, SSE_CONVERT_XMM_TEST_T, cvtdq2ps_u128 );
Note:
See TracChangeset
for help on using the changeset viewer.