Changeset 96335 in vbox
- Timestamp:
- Aug 19, 2022 12:07:40 PM (2 years ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm
r96333 r96335 4595 4595 IEMIMPL_FP_F2 divps 4596 4596 IEMIMPL_FP_F2 divpd 4597 IEMIMPL_FP_F2 maxps 4598 IEMIMPL_FP_F2 maxpd -
trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp
r96333 r96335 14491 14491 } 14492 14492 #endif 14493 14494 14495 /** 14496 * MAXPS 14497 */ 14498 #ifdef IEM_WITHOUT_ASSEMBLY 14499 static uint32_t iemAImpl_maxps_u128_worker(PRTFLOAT32U pr32Res, uint32_t fMxcsr, PCRTFLOAT32U pr32Val1, PCRTFLOAT32U pr32Val2) 14500 { 14501 RTFLOAT32U r32Src1, r32Src2; 14502 iemSsePrepareValueR32(&r32Src1, fMxcsr, pr32Val1); 14503 iemSsePrepareValueR32(&r32Src2, fMxcsr, pr32Val2); 14504 14505 if (RTFLOAT32U_IS_ZERO(&r32Src1) && RTFLOAT32U_IS_ZERO(&r32Src2)) 14506 { 14507 *pr32Res = r32Src2; 14508 return fMxcsr; 14509 } 14510 else if (RTFLOAT32U_IS_NAN(&r32Src1) || RTFLOAT32U_IS_NAN(&r32Src2)) 14511 { 14512 *pr32Res = r32Src2; 14513 return fMxcsr | X86_MXCSR_IE; 14514 } 14515 14516 softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(fMxcsr); 14517 bool fLe = f32_le(iemFpSoftF32FromIprt(&r32Src1), iemFpSoftF32FromIprt(&r32Src2), &SoftState); 14518 return iemSseSoftStateAndR32ToMxcsrAndIprtResultNoFz(&SoftState, 14519 fLe 14520 ? iemFpSoftF32FromIprt(&r32Src2) 14521 : iemFpSoftF32FromIprt(&r32Src1), 14522 pr32Res, fMxcsr, &r32Src1, &r32Src2); 14523 } 14524 14525 14526 IEM_DECL_IMPL_DEF(void, iemAImpl_maxps_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2)) 14527 { 14528 pResult->MXCSR |= iemAImpl_maxps_u128_worker(&pResult->uResult.ar32[0], pFpuState->MXCSR, &puSrc1->ar32[0], &puSrc2->ar32[0]); 14529 pResult->MXCSR |= iemAImpl_maxps_u128_worker(&pResult->uResult.ar32[1], pFpuState->MXCSR, &puSrc1->ar32[1], &puSrc2->ar32[1]); 14530 pResult->MXCSR |= iemAImpl_maxps_u128_worker(&pResult->uResult.ar32[2], pFpuState->MXCSR, &puSrc1->ar32[2], &puSrc2->ar32[2]); 14531 pResult->MXCSR |= iemAImpl_maxps_u128_worker(&pResult->uResult.ar32[3], pFpuState->MXCSR, &puSrc1->ar32[3], &puSrc2->ar32[3]); 14532 } 14533 #endif 14534 14535 14536 /** 14537 * MAXPD 14538 */ 14539 #ifdef IEM_WITHOUT_ASSEMBLY 14540 static uint32_t iemAImpl_maxpd_u128_worker(PRTFLOAT64U pr64Res, uint32_t fMxcsr, PCRTFLOAT64U pr64Val1, PCRTFLOAT64U pr64Val2) 14541 { 14542 RTFLOAT64U r64Src1, r64Src2; 14543 iemSsePrepareValueR64(&r64Src1, fMxcsr, pr64Val1); 14544 iemSsePrepareValueR64(&r64Src2, fMxcsr, pr64Val2); 14545 14546 if (RTFLOAT64U_IS_ZERO(&r64Src1) && RTFLOAT32U_IS_ZERO(&r64Src2)) 14547 { 14548 *pr64Res = r64Src2; 14549 return fMxcsr; 14550 } 14551 else if (RTFLOAT64U_IS_NAN(&r64Src1) || RTFLOAT64U_IS_NAN(&r64Src2)) 14552 { 14553 *pr64Res = r64Src2; 14554 return fMxcsr | X86_MXCSR_IE; 14555 } 14556 14557 softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(fMxcsr); 14558 bool fLe = f64_le(iemFpSoftF64FromIprt(&r64Src1), iemFpSoftF64FromIprt(&r64Src2), &SoftState); 14559 return iemSseSoftStateAndR64ToMxcsrAndIprtResultNoFz(&SoftState, 14560 fLe 14561 ? iemFpSoftF64FromIprt(&r64Src2) 14562 : iemFpSoftF64FromIprt(&r64Src1), 14563 pr64Res, fMxcsr, &r64Src1, &r64Src2); 14564 } 14565 14566 14567 IEM_DECL_IMPL_DEF(void, iemAImpl_maxpd_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2)) 14568 { 14569 pResult->MXCSR |= iemAImpl_maxpd_u128_worker(&pResult->uResult.ar64[0], pFpuState->MXCSR, &puSrc1->ar64[0], &puSrc2->ar64[0]); 14570 pResult->MXCSR |= iemAImpl_maxpd_u128_worker(&pResult->uResult.ar64[1], pFpuState->MXCSR, &puSrc1->ar64[1], &puSrc2->ar64[1]); 14571 } 14572 #endif -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h
r96333 r96335 4049 4049 FNIEMOP_STUB(iemOp_divsd_Vsd_Wsd); 4050 4050 4051 4051 4052 /** Opcode 0x0f 0x5f - maxps Vps, Wps */ 4052 FNIEMOP_STUB(iemOp_maxps_Vps_Wps); 4053 FNIEMOP_DEF(iemOp_maxps_Vps_Wps) 4054 { 4055 IEMOP_MNEMONIC2(RM, MAXPS, maxps, Vps, Wps, DISOPTYPE_HARMLESS, 0); 4056 return FNIEMOP_CALL_1(iemOpCommonSseFp_FullFull_To_Full, iemAImpl_maxps_u128); 4057 } 4058 4059 4053 4060 /** Opcode 0x66 0x0f 0x5f - maxpd Vpd, Wpd */ 4054 FNIEMOP_STUB(iemOp_maxpd_Vpd_Wpd); 4061 FNIEMOP_DEF(iemOp_maxpd_Vpd_Wpd) 4062 { 4063 IEMOP_MNEMONIC2(RM, MAXPD, maxpd, Vpd, Wpd, DISOPTYPE_HARMLESS, 0); 4064 return FNIEMOP_CALL_1(iemOpCommonSse2Fp_FullFull_To_Full, iemAImpl_maxpd_u128); 4065 } 4066 4067 4055 4068 /** Opcode 0xf3 0x0f 0x5f - maxss Vss, Wss */ 4056 4069 FNIEMOP_STUB(iemOp_maxss_Vss_Wss); -
trunk/src/VBox/VMM/include/IEMInternal.h
r96333 r96335 2426 2426 FNIEMAIMPLFPSSEF2U128 iemAImpl_divps_u128; 2427 2427 FNIEMAIMPLFPSSEF2U128 iemAImpl_divpd_u128; 2428 FNIEMAIMPLFPSSEF2U128 iemAImpl_maxps_u128; 2429 FNIEMAIMPLFPSSEF2U128 iemAImpl_maxpd_u128; 2428 2430 2429 2431 FNIEMAIMPLFPAVXF3U128 iemAImpl_vaddps_u128, iemAImpl_vaddps_u128_fallback; … … 2437 2439 FNIEMAIMPLFPAVXF3U128 iemAImpl_vdivps_u128, iemAImpl_vdivps_u128_fallback; 2438 2440 FNIEMAIMPLFPAVXF3U128 iemAImpl_vdivpd_u128, iemAImpl_vdivpd_u128_fallback; 2441 FNIEMAIMPLFPAVXF3U128 iemAImpl_vmaxps_u128, iemAImpl_vmaxps_u128_fallback; 2442 FNIEMAIMPLFPAVXF3U128 iemAImpl_vmaxpd_u128, iemAImpl_vmaxpd_u128_fallback; 2439 2443 2440 2444 FNIEMAIMPLFPAVXF3U256 iemAImpl_vaddps_u256, iemAImpl_vaddps_u256_fallback; … … 2448 2452 FNIEMAIMPLFPAVXF3U256 iemAImpl_vdivps_u256, iemAImpl_vdivps_u256_fallback; 2449 2453 FNIEMAIMPLFPAVXF3U256 iemAImpl_vdivpd_u256, iemAImpl_vdivpd_u256_fallback; 2454 FNIEMAIMPLFPAVXF3U256 iemAImpl_vmaxps_u256, iemAImpl_vmaxps_u256_fallback; 2455 FNIEMAIMPLFPAVXF3U256 iemAImpl_vmaxpd_u256, iemAImpl_vmaxpd_u256_fallback; 2450 2456 /** @} */ 2451 2457 -
trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp
r96333 r96335 472 472 #define iemAImpl_divps_u128 NULL 473 473 #define iemAImpl_divpd_u128 NULL 474 #define iemAImpl_maxps_u128 NULL 475 #define iemAImpl_maxpd_u128 NULL 474 476 475 477 /** @} */
Note:
See TracChangeset
for help on using the changeset viewer.