VirtualBox

Changeset 96335 in vbox


Ignore:
Timestamp:
Aug 19, 2022 12:07:40 PM (2 years ago)
Author:
vboxsync
Message:

VMM/IEM: Implement maxps/maxpd instructions, bugref:9898

Location:
trunk/src/VBox/VMM
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm

    r96333 r96335  
    45954595IEMIMPL_FP_F2 divps
    45964596IEMIMPL_FP_F2 divpd
     4597IEMIMPL_FP_F2 maxps
     4598IEMIMPL_FP_F2 maxpd
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r96333 r96335  
    1449114491}
    1449214492#endif
     14493
     14494
     14495/**
     14496 * MAXPS
     14497 */
     14498#ifdef IEM_WITHOUT_ASSEMBLY
     14499static 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
     14526IEM_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
     14540static 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
     14567IEM_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  
    40494049FNIEMOP_STUB(iemOp_divsd_Vsd_Wsd);
    40504050
     4051
    40514052/** Opcode      0x0f 0x5f - maxps Vps, Wps */
    4052 FNIEMOP_STUB(iemOp_maxps_Vps_Wps);
     4053FNIEMOP_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
    40534060/** Opcode 0x66 0x0f 0x5f - maxpd Vpd, Wpd */
    4054 FNIEMOP_STUB(iemOp_maxpd_Vpd_Wpd);
     4061FNIEMOP_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
    40554068/** Opcode 0xf3 0x0f 0x5f - maxss Vss, Wss */
    40564069FNIEMOP_STUB(iemOp_maxss_Vss_Wss);
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r96333 r96335  
    24262426FNIEMAIMPLFPSSEF2U128 iemAImpl_divps_u128;
    24272427FNIEMAIMPLFPSSEF2U128 iemAImpl_divpd_u128;
     2428FNIEMAIMPLFPSSEF2U128 iemAImpl_maxps_u128;
     2429FNIEMAIMPLFPSSEF2U128 iemAImpl_maxpd_u128;
    24282430
    24292431FNIEMAIMPLFPAVXF3U128 iemAImpl_vaddps_u128, iemAImpl_vaddps_u128_fallback;
     
    24372439FNIEMAIMPLFPAVXF3U128 iemAImpl_vdivps_u128, iemAImpl_vdivps_u128_fallback;
    24382440FNIEMAIMPLFPAVXF3U128 iemAImpl_vdivpd_u128, iemAImpl_vdivpd_u128_fallback;
     2441FNIEMAIMPLFPAVXF3U128 iemAImpl_vmaxps_u128, iemAImpl_vmaxps_u128_fallback;
     2442FNIEMAIMPLFPAVXF3U128 iemAImpl_vmaxpd_u128, iemAImpl_vmaxpd_u128_fallback;
    24392443
    24402444FNIEMAIMPLFPAVXF3U256 iemAImpl_vaddps_u256, iemAImpl_vaddps_u256_fallback;
     
    24482452FNIEMAIMPLFPAVXF3U256 iemAImpl_vdivps_u256, iemAImpl_vdivps_u256_fallback;
    24492453FNIEMAIMPLFPAVXF3U256 iemAImpl_vdivpd_u256, iemAImpl_vdivpd_u256_fallback;
     2454FNIEMAIMPLFPAVXF3U256 iemAImpl_vmaxps_u256, iemAImpl_vmaxps_u256_fallback;
     2455FNIEMAIMPLFPAVXF3U256 iemAImpl_vmaxpd_u256, iemAImpl_vmaxpd_u256_fallback;
    24502456/** @} */
    24512457
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r96333 r96335  
    472472#define iemAImpl_divps_u128             NULL
    473473#define iemAImpl_divpd_u128             NULL
     474#define iemAImpl_maxps_u128             NULL
     475#define iemAImpl_maxpd_u128             NULL
    474476
    475477/** @}  */
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette