Changeset 105235 in vbox
- Timestamp:
- Jul 9, 2024 12:30:38 PM (9 months ago)
- svn:sync-xref-src-repo-rev:
- 163881
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp
r105234 r105235 16979 16979 16980 16980 /** 16981 * SQRTPS 16982 */ 16983 #ifdef IEM_WITHOUT_ASSEMBLY 16981 * [V]SQRTPS 16982 */ 16984 16983 static uint32_t iemAImpl_sqrtps_u128_worker(PRTFLOAT32U pr32Res, uint32_t fMxcsr, PCRTFLOAT32U pr32Val) 16985 16984 { … … 17006 17005 17007 17006 17007 #ifdef IEM_WITHOUT_ASSEMBLY 17008 17008 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_sqrtps_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2)) 17009 17009 { … … 17018 17018 17019 17019 17020 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vsqrtps_u128_fallback,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc)) 17021 { 17022 return iemAImpl_sqrtps_u128_worker(&pResult->ar32[0], uMxCsrIn, &puSrc->ar32[0]) 17023 | iemAImpl_sqrtps_u128_worker(&pResult->ar32[1], uMxCsrIn, &puSrc->ar32[1]) 17024 | iemAImpl_sqrtps_u128_worker(&pResult->ar32[2], uMxCsrIn, &puSrc->ar32[2]) 17025 | iemAImpl_sqrtps_u128_worker(&pResult->ar32[3], uMxCsrIn, &puSrc->ar32[3]); 17026 } 17027 17028 17029 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vsqrtps_u256_fallback,(uint32_t uMxCsrIn, PX86YMMREG pResult, PCX86YMMREG puSrc)) 17030 { 17031 return iemAImpl_sqrtps_u128_worker(&pResult->ar32[0], uMxCsrIn, &puSrc->ar32[0]) 17032 | iemAImpl_sqrtps_u128_worker(&pResult->ar32[1], uMxCsrIn, &puSrc->ar32[1]) 17033 | iemAImpl_sqrtps_u128_worker(&pResult->ar32[2], uMxCsrIn, &puSrc->ar32[2]) 17034 | iemAImpl_sqrtps_u128_worker(&pResult->ar32[3], uMxCsrIn, &puSrc->ar32[3]) 17035 | iemAImpl_sqrtps_u128_worker(&pResult->ar32[4], uMxCsrIn, &puSrc->ar32[4]) 17036 | iemAImpl_sqrtps_u128_worker(&pResult->ar32[5], uMxCsrIn, &puSrc->ar32[5]) 17037 | iemAImpl_sqrtps_u128_worker(&pResult->ar32[6], uMxCsrIn, &puSrc->ar32[6]) 17038 | iemAImpl_sqrtps_u128_worker(&pResult->ar32[7], uMxCsrIn, &puSrc->ar32[7]); 17039 } 17040 17041 17020 17042 /** 17021 17043 * SQRTSS … … 17033 17055 17034 17056 /** 17035 * SQRTPD 17036 */ 17037 #ifdef IEM_WITHOUT_ASSEMBLY 17057 * [V]SQRTPD 17058 */ 17038 17059 static uint32_t iemAImpl_sqrtpd_u128_worker(PRTFLOAT64U pr64Res, uint32_t fMxcsr, PCRTFLOAT64U pr64Val) 17039 17060 { … … 17060 17081 17061 17082 17083 #ifdef IEM_WITHOUT_ASSEMBLY 17062 17084 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_sqrtpd_u128,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2)) 17063 17085 { … … 17068 17090 } 17069 17091 #endif 17092 17093 17094 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vsqrtpd_u128_fallback,(uint32_t uMxCsrIn, PX86XMMREG pResult, PCX86XMMREG puSrc)) 17095 { 17096 return iemAImpl_sqrtpd_u128_worker(&pResult->ar64[0], uMxCsrIn, &puSrc->ar64[0]) 17097 | iemAImpl_sqrtpd_u128_worker(&pResult->ar64[1], uMxCsrIn, &puSrc->ar64[1]); 17098 } 17099 17100 17101 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vsqrtpd_u256_fallback,(uint32_t uMxCsrIn, PX86YMMREG pResult, PCX86YMMREG puSrc)) 17102 { 17103 return iemAImpl_sqrtpd_u128_worker(&pResult->ar64[0], uMxCsrIn, &puSrc->ar64[0]) 17104 | iemAImpl_sqrtpd_u128_worker(&pResult->ar64[1], uMxCsrIn, &puSrc->ar64[1]) 17105 | iemAImpl_sqrtpd_u128_worker(&pResult->ar64[2], uMxCsrIn, &puSrc->ar64[2]) 17106 | iemAImpl_sqrtpd_u128_worker(&pResult->ar64[3], uMxCsrIn, &puSrc->ar64[3]); 17107 } 17070 17108 17071 17109 -
trunk/src/VBox/VMM/VMMAll/IEMAllInstVexMap1.cpp.h
r105234 r105235 519 519 520 520 521 /** 522 * Common worker for AVX/AVX2 instructions on the forms: 523 * - vpxxx xmm0, xmm1/mem128 524 * - vpxxx ymm0, ymm1/mem256 525 * 526 * Exceptions type 4. AVX cpuid check for 128-bit operation, AVX2 for 256-bit. 527 */ 528 FNIEMOP_DEF_1(iemOpCommonAvxAvx2_Vx_Wx, PCIEMOPMEDIAF2, pImpl) 529 { 530 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 531 if (IEM_IS_MODRM_REG_MODE(bRm)) 532 { 533 /* 534 * Register, register. 535 */ 536 if (pVCpu->iem.s.uVexLength) 537 { 538 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 539 IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx2); 540 IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); 541 IEM_MC_PREPARE_AVX_USAGE(); 542 543 IEM_MC_LOCAL(X86YMMREG, uSrc); 544 IEM_MC_ARG_LOCAL_REF(PCX86YMMREG, puSrc, uSrc, 1); 545 IEM_MC_FETCH_YREG_YMM(uSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); 546 IEM_MC_LOCAL(X86YMMREG, uDst); 547 IEM_MC_ARG_LOCAL_REF(PX86YMMREG, puDst, uDst, 0); 548 IEM_MC_CALL_AVX_AIMPL_2(pImpl->pfnU256, puDst, puSrc); 549 IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT(); 550 IEM_MC_STORE_YREG_YMM_ZX_VLMAX( IEM_GET_MODRM_REG(pVCpu, bRm), uDst); 551 IEM_MC_ADVANCE_RIP_AND_FINISH(); 552 IEM_MC_END(); 553 } 554 else 555 { 556 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 557 IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx); 558 IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); 559 IEM_MC_PREPARE_AVX_USAGE(); 560 561 IEM_MC_LOCAL(X86XMMREG, uDst); 562 IEM_MC_ARG_LOCAL_REF(PX86XMMREG, puDst, uDst, 0); 563 IEM_MC_ARG(PCX86XMMREG, puSrc, 1); 564 IEM_MC_REF_XREG_XMM_CONST(puSrc, IEM_GET_MODRM_RM(pVCpu, bRm)); 565 IEM_MC_CALL_AVX_AIMPL_2(pImpl->pfnU128, puDst, puSrc); 566 IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT(); 567 IEM_MC_STORE_XREG_XMM( IEM_GET_MODRM_REG(pVCpu, bRm), uDst); 568 IEM_MC_CLEAR_YREG_128_UP( IEM_GET_MODRM_REG(pVCpu, bRm)); 569 IEM_MC_ADVANCE_RIP_AND_FINISH(); 570 IEM_MC_END(); 571 } 572 } 573 else 574 { 575 /* 576 * Register, memory. 577 */ 578 if (pVCpu->iem.s.uVexLength) 579 { 580 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 581 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 582 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); 583 IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx2); 584 IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); 585 IEM_MC_PREPARE_AVX_USAGE(); 586 587 IEM_MC_LOCAL(X86YMMREG, uSrc); 588 IEM_MC_ARG_LOCAL_REF(PCX86YMMREG, puSrc, uSrc, 1); 589 IEM_MC_FETCH_MEM_YMM_NO_AC(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 590 IEM_MC_LOCAL(X86YMMREG, uDst); 591 IEM_MC_ARG_LOCAL_REF(PX86YMMREG, puDst, uDst, 0); 592 IEM_MC_CALL_AVX_AIMPL_2(pImpl->pfnU256, puDst, puSrc); 593 IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT(); 594 IEM_MC_STORE_YREG_YMM_ZX_VLMAX( IEM_GET_MODRM_REG(pVCpu, bRm), uDst); 595 IEM_MC_ADVANCE_RIP_AND_FINISH(); 596 IEM_MC_END(); 597 } 598 else 599 { 600 IEM_MC_BEGIN(IEM_MC_F_NOT_286_OR_OLDER, 0); 601 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 602 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); 603 IEMOP_HLP_DONE_VEX_DECODING_NO_VVVV_EX(fAvx); 604 IEM_MC_MAYBE_RAISE_AVX_RELATED_XCPT(); 605 IEM_MC_PREPARE_AVX_USAGE(); 606 607 IEM_MC_LOCAL(X86XMMREG, uDst); 608 IEM_MC_ARG_LOCAL_REF(PX86XMMREG, puDst, uDst, 0); 609 IEM_MC_LOCAL(X86XMMREG, uSrc); 610 IEM_MC_ARG_LOCAL_REF(PCX86XMMREG, puSrc, uSrc, 1); 611 IEM_MC_FETCH_MEM_XMM_NO_AC(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 612 IEM_MC_CALL_AVX_AIMPL_2(pImpl->pfnU128, puDst, puSrc); 613 IEM_MC_MAYBE_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT(); 614 IEM_MC_STORE_XREG_XMM( IEM_GET_MODRM_REG(pVCpu, bRm), uDst); 615 IEM_MC_CLEAR_YREG_128_UP( IEM_GET_MODRM_REG(pVCpu, bRm)); 616 IEM_MC_ADVANCE_RIP_AND_FINISH(); 617 IEM_MC_END(); 618 } 619 } 620 } 621 622 623 521 624 /* Opcode VEX.0F 0x00 - invalid */ 522 625 /* Opcode VEX.0F 0x01 - invalid */ … … 2848 2951 2849 2952 /** Opcode VEX.0F 0x51 - vsqrtps Vps, Wps */ 2850 FNIEMOP_STUB(iemOp_vsqrtps_Vps_Wps); 2953 FNIEMOP_DEF(iemOp_vsqrtps_Vps_Wps) 2954 { 2955 IEMOP_MNEMONIC2(VEX_RM, VSQRTPS, vsqrtps, Vps, Wps, DISOPTYPE_HARMLESS | DISOPTYPE_X86_AVX, 0); 2956 IEMOPMEDIAF2_INIT_VARS( vsqrtps); 2957 return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Wx, IEM_SELECT_HOST_OR_FALLBACK(fAvx, &s_Host, &s_Fallback)); 2958 } 2959 2960 2851 2961 /** Opcode VEX.66.0F 0x51 - vsqrtpd Vpd, Wpd */ 2852 FNIEMOP_STUB(iemOp_vsqrtpd_Vpd_Wpd); 2962 FNIEMOP_DEF(iemOp_vsqrtpd_Vpd_Wpd) 2963 { 2964 IEMOP_MNEMONIC2(VEX_RM, VSQRTPD, vsqrtpd, Vpd, Wpd, DISOPTYPE_HARMLESS | DISOPTYPE_X86_AVX, 0); 2965 IEMOPMEDIAF2_INIT_VARS( vsqrtpd); 2966 return FNIEMOP_CALL_1(iemOpCommonAvxAvx2_Vx_Wx, IEM_SELECT_HOST_OR_FALLBACK(fAvx, &s_Host, &s_Fallback)); 2967 } 2968 2969 2853 2970 /** Opcode VEX.F3.0F 0x51 - vsqrtss Vss, Hss, Wss */ 2854 2971 FNIEMOP_STUB(iemOp_vsqrtss_Vss_Hss_Wss); -
trunk/src/VBox/VMM/VMMAll/IEMAllThrdPython.py
r105183 r105235 779 779 if sBaseType == 'PCIEMOPSHIFTDBLSIZES': return 'PFNIEMAIMPLSHIFTDBLU' + sMember[offBits:]; 780 780 if sBaseType == 'PCIEMOPMULDIVSIZES': return 'PFNIEMAIMPLMULDIVU' + sMember[offBits:]; 781 if sBaseType == 'PCIEMOPMEDIAF2': return 'PFNIEMAIMPLMEDIAF2U' + sMember[offBits:]; 781 782 if sBaseType == 'PCIEMOPMEDIAF3': return 'PFNIEMAIMPLMEDIAF3U' + sMember[offBits:]; 782 783 if sBaseType == 'PCIEMOPMEDIAOPTF2': return 'PFNIEMAIMPLMEDIAOPTF2U' + sMember[offBits:]; -
trunk/src/VBox/VMM/include/IEMInternal.h
r105234 r105235 3434 3434 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLMEDIAF2U64,(PCX86FXSTATE pFpuState, uint64_t *puDst, uint64_t const *puSrc)); 3435 3435 typedef FNIEMAIMPLMEDIAF2U64 *PFNIEMAIMPLMEDIAF2U64; 3436 typedef IEM_DECL_IMPL_TYPE( void, FNIEMAIMPLMEDIAF2U128,(PCX86FXSTATE pFpuState, PRTUINT128U puDst, PCRTUINT128UpuSrc));3436 typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLMEDIAF2U128,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCX86XMMREG puSrc)); 3437 3437 typedef FNIEMAIMPLMEDIAF2U128 *PFNIEMAIMPLMEDIAF2U128; 3438 typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLMEDIAF2U256,(uint32_t uMxCsrIn, PX86YMMREG puDst, PCX86YMMREG puSrc)); 3439 typedef FNIEMAIMPLMEDIAF2U256 *PFNIEMAIMPLMEDIAF2U256; 3438 3440 typedef IEM_DECL_IMPL_TYPE(uint32_t, FNIEMAIMPLMEDIAF3U128,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2)); 3439 3441 typedef FNIEMAIMPLMEDIAF3U128 *PFNIEMAIMPLMEDIAF3U128; … … 4301 4303 RT_CONCAT3(iemAImpl_,a_InstrNm,_u128_fallback), RT_CONCAT3(iemAImpl_,a_InstrNm,_u256_fallback)) 4302 4304 4305 4306 /** 4307 * Function table for media instruction taking one full sized media source 4308 * registers and one full sized destination register (AVX). 4309 */ 4310 typedef struct IEMOPMEDIAF2 4311 { 4312 PFNIEMAIMPLMEDIAF2U128 pfnU128; 4313 PFNIEMAIMPLMEDIAF2U256 pfnU256; 4314 } IEMOPMEDIAF2; 4315 /** Pointer to a media operation function table for 2 full sized ops (AVX). */ 4316 typedef IEMOPMEDIAF2 const *PCIEMOPMEDIAF2; 4317 4318 /** @def IEMOPMEDIAF2_INIT_VARS_EX 4319 * Declares a s_Host (x86 & amd64 only) and a s_Fallback variable with the 4320 * given functions as initializers. For use in AVX functions where a pair of 4321 * functions are only used once and the function table need not be public. */ 4322 #ifndef TST_IEM_CHECK_MC 4323 # if (defined(RT_ARCH_X86) || defined(RT_ARCH_AMD64)) && !defined(IEM_WITHOUT_ASSEMBLY) 4324 # define IEMOPMEDIAF2_INIT_VARS_EX(a_pfnHostU128, a_pfnHostU256, a_pfnFallbackU128, a_pfnFallbackU256) \ 4325 static IEMOPMEDIAF2 const s_Host = { a_pfnHostU128, a_pfnHostU256 }; \ 4326 static IEMOPMEDIAF2 const s_Fallback = { a_pfnFallbackU128, a_pfnFallbackU256 } 4327 # else 4328 # define IEMOPMEDIAF2_INIT_VARS_EX(a_pfnU128, a_pfnU256, a_pfnFallbackU128, a_pfnFallbackU256) \ 4329 static IEMOPMEDIAF2 const s_Fallback = { a_pfnFallbackU128, a_pfnFallbackU256 } 4330 # endif 4331 #else 4332 # define IEMOPMEDIAF2_INIT_VARS_EX(a_pfnU128, a_pfnU256, a_pfnFallbackU128, a_pfnFallbackU256) (void)0 4333 #endif 4334 /** @def IEMOPMEDIAF2_INIT_VARS 4335 * Generate AVX function tables for the @a a_InstrNm instruction. 4336 * @sa IEMOPMEDIAF2_INIT_VARS_EX */ 4337 #define IEMOPMEDIAF2_INIT_VARS(a_InstrNm) \ 4338 IEMOPMEDIAF2_INIT_VARS_EX(RT_CONCAT3(iemAImpl_,a_InstrNm,_u128), RT_CONCAT3(iemAImpl_,a_InstrNm,_u256),\ 4339 RT_CONCAT3(iemAImpl_,a_InstrNm,_u128_fallback), RT_CONCAT3(iemAImpl_,a_InstrNm,_u256_fallback)) 4340 4341 4303 4342 /** 4304 4343 * Function table for media instruction taking two full sized media source … … 4571 4610 FNIEMAIMPLMEDIAF3U128 iemAImpl_vhsubps_u128, iemAImpl_vhsubps_u128_fallback; 4572 4611 FNIEMAIMPLMEDIAF3U128 iemAImpl_vhsubpd_u128, iemAImpl_vhsubpd_u128_fallback; 4573 FNIEMAIMPL FPAVXF3U128 iemAImpl_vsqrtps_u128, iemAImpl_vsqrtps_u128_fallback;4574 FNIEMAIMPL FPAVXF3U128 iemAImpl_vsqrtpd_u128, iemAImpl_vsqrtpd_u128_fallback;4612 FNIEMAIMPLMEDIAF2U128 iemAImpl_vsqrtps_u128, iemAImpl_vsqrtps_u128_fallback; 4613 FNIEMAIMPLMEDIAF2U128 iemAImpl_vsqrtpd_u128, iemAImpl_vsqrtpd_u128_fallback; 4575 4614 FNIEMAIMPLMEDIAF3U128 iemAImpl_vaddsubps_u128, iemAImpl_vaddsubps_u128_fallback; 4576 4615 FNIEMAIMPLMEDIAF3U128 iemAImpl_vaddsubpd_u128, iemAImpl_vaddsubpd_u128_fallback; … … 4613 4652 FNIEMAIMPLFPAVXF3U256 iemAImpl_vcvtpd2ps_u256, iemAImpl_vcvtpd2ps_u256_fallback; 4614 4653 FNIEMAIMPLFPAVXF3U256 iemAImpl_vcvtps2pd_u256, iemAImpl_vcvtps2pd_u256_fallback; 4654 FNIEMAIMPLMEDIAF2U256 iemAImpl_vsqrtps_u256, iemAImpl_vsqrtps_u256_fallback; 4655 FNIEMAIMPLMEDIAF2U256 iemAImpl_vsqrtpd_u256, iemAImpl_vsqrtpd_u256_fallback; 4615 4656 /** @} */ 4616 4657
Note:
See TracChangeset
for help on using the changeset viewer.