VirtualBox

Changeset 96394 in vbox


Ignore:
Timestamp:
Aug 22, 2022 11:00:24 AM (2 years ago)
Author:
vboxsync
Message:

VMM/IEM: Implement cvtpd2ps instruction, bugref:9898

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

Legend:

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

    r96392 r96394  
    47494749IEMIMPL_FP_F2_R64 cvtsd2ss
    47504750IEMIMPL_FP_F2_R64 sqrtsd
     4751
     4752
     4753;;
     4754; cvtpd2ps instruction.
     4755;
     4756; @param    A0      FPU context (FXSTATE or XSAVEAREA).
     4757; @param    A1      Where to return the result including the MXCSR value.
     4758; @param    A2      Pointer to the first media register size operand (input/output).
     4759; @param    A3      Pointer to the second media register size operand (input).
     4760;
     4761BEGINPROC_FASTCALL iemAImpl_cvtpd2ps_u128, 12
     4762        PROLOGUE_4_ARGS
     4763        IEMIMPL_SSE_PROLOGUE
     4764        SSE_LD_FXSTATE_MXCSR A0
     4765
     4766        movdqu   xmm0, [A2]
     4767        movdqu   xmm1, [A3]
     4768        cvtpd2ps xmm0, xmm1
     4769        movdqu   [A1 + IEMSSERESULT.uResult], xmm0
     4770
     4771        SSE_ST_FXSTATE_MXCSR A1, A0
     4772        IEMIMPL_SSE_PROLOGUE
     4773        EPILOGUE_4_ARGS
     4774ENDPROC iemAImpl_cvtpd2ps_u128
     4775
     4776BEGINPROC_FASTCALL iemAImpl_vcvtpd2ps_u128, 12
     4777        PROLOGUE_4_ARGS
     4778        IEMIMPL_AVX_PROLOGUE
     4779        AVX_LD_XSAVEAREA_MXCSR A0
     4780
     4781        vmovdqu   xmm0, [A2]
     4782        vmovdqu   xmm1, [A3]
     4783        vcvtpd2ps xmm0, xmm1
     4784        vmovdqu  [A1 + IEMAVX128RESULT.uResult], xmm0
     4785
     4786        AVX128_ST_XSAVEAREA_MXCSR A1
     4787        IEMIMPL_AVX_PROLOGUE
     4788        EPILOGUE_4_ARGS
     4789ENDPROC iemAImpl_vcvtpd2ps_u128
     4790
     4791BEGINPROC_FASTCALL iemAImpl_vcvtpd2ps_u256, 12
     4792        PROLOGUE_4_ARGS
     4793        IEMIMPL_AVX_PROLOGUE
     4794        AVX_LD_XSAVEAREA_MXCSR A0
     4795
     4796        vmovdqu    ymm0, [A2]
     4797        vmovdqu    ymm1, [A3]
     4798        vcvtpd2ps  xmm0, ymm1
     4799        vmovdqu    [A1 + IEMAVX256RESULT.uResult], ymm0
     4800
     4801        AVX256_ST_XSAVEAREA_MXCSR A1
     4802        IEMIMPL_AVX_PROLOGUE
     4803        EPILOGUE_4_ARGS
     4804ENDPROC iemAImpl_vcvtpd2ps_u256
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r96392 r96394  
    1500515005}
    1500615006#endif
     15007
     15008
     15009/**
     15010 * CVTPD2PS
     15011 */
     15012#ifdef IEM_WITHOUT_ASSEMBLY
     15013static uint32_t iemAImpl_cvtpd2ps_u128_worker(PRTFLOAT32U pr32Res, uint32_t fMxcsr, PCRTFLOAT64U pr64Val1)
     15014{
     15015    RTFLOAT64U r64Src1;
     15016    fMxcsr |= iemSsePrepareValueR64(&r64Src1, fMxcsr, pr64Val1);
     15017
     15018    softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(fMxcsr);
     15019    float32_t r32Result = f64_to_f32(iemFpSoftF64FromIprt(&r64Src1), &SoftState);
     15020    return iemSseSoftStateAndR32ToMxcsrAndIprtResult(&SoftState, r32Result, pr32Res, fMxcsr);
     15021}
     15022
     15023
     15024IEM_DECL_IMPL_DEF(void, iemAImpl_cvtpd2ps_u128,(PX86FXSTATE pFpuState, PIEMSSERESULT pResult, PCX86XMMREG puSrc1, PCX86XMMREG puSrc2))
     15025{
     15026    RT_NOREF(puSrc1);
     15027
     15028    pResult->MXCSR  = iemAImpl_cvtpd2ps_u128_worker(&pResult->uResult.ar32[0], pFpuState->MXCSR, &puSrc2->ar64[0]);
     15029    pResult->MXCSR |= iemAImpl_cvtpd2ps_u128_worker(&pResult->uResult.ar32[1], pFpuState->MXCSR, &puSrc2->ar64[1]);
     15030    pResult->uResult.au32[2] = 0;
     15031    pResult->uResult.au32[3] = 0;
     15032}
     15033#endif
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r96392 r96394  
    42084208/** Opcode      0x0f 0x5a - cvtps2pd Vpd, Wps */
    42094209FNIEMOP_STUB(iemOp_cvtps2pd_Vpd_Wps);
     4210
     4211
    42104212/** Opcode 0x66 0x0f 0x5a - cvtpd2ps Vps, Wpd */
    4211 FNIEMOP_STUB(iemOp_cvtpd2ps_Vps_Wpd);
     4213FNIEMOP_DEF(iemOp_cvtpd2ps_Vps_Wpd)
     4214{
     4215    IEMOP_MNEMONIC2(RM, CVTPD2PS, cvtpd2ps, Vps, Wpd, DISOPTYPE_HARMLESS, 0);
     4216    return FNIEMOP_CALL_1(iemOpCommonSse2Fp_FullFull_To_Full, iemAImpl_cvtpd2ps_u128);
     4217}
    42124218
    42134219
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r96392 r96394  
    24462446FNIEMAIMPLFPSSEF2U128 iemAImpl_addsubps_u128;
    24472447FNIEMAIMPLFPSSEF2U128 iemAImpl_addsubpd_u128;
     2448FNIEMAIMPLFPSSEF2U128 iemAImpl_cvtpd2ps_u128;
    24482449
    24492450FNIEMAIMPLFPSSEF2U128R32 iemAImpl_addss_u128_r32;
     
    24842485FNIEMAIMPLFPAVXF3U128 iemAImpl_vaddsubps_u128, iemAImpl_vaddsubps_u128_fallback;
    24852486FNIEMAIMPLFPAVXF3U128 iemAImpl_vaddsubpd_u128, iemAImpl_vaddsubpd_u128_fallback;
     2487FNIEMAIMPLFPAVXF3U128 iemAImpl_vcvtpd2ps_u128, iemAImpl_vcvtpd2ps_u128_fallback;
    24862488
    24872489FNIEMAIMPLFPAVXF3U128R32 iemAImpl_vaddss_u128_r32, iemAImpl_vaddss_u128_r32_fallback;
     
    25182520FNIEMAIMPLFPAVXF3U256 iemAImpl_vhaddsubps_u256, iemAImpl_vhaddsubps_u256_fallback;
    25192521FNIEMAIMPLFPAVXF3U256 iemAImpl_vhaddsubpd_u256, iemAImpl_vhaddsubpd_u256_fallback;
     2522FNIEMAIMPLFPAVXF3U256 iemAImpl_vcvtpd2ps_u256, iemAImpl_vcvtpd2ps_u256_fallback;
    25202523/** @} */
    25212524
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r96392 r96394  
    482482#define iemAImpl_addsubps_u128          NULL
    483483#define iemAImpl_addsubpd_u128          NULL
     484#define iemAImpl_cvtpd2ps_u128          NULL
    484485
    485486#define iemAImpl_addss_u128_r32         NULL
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