VirtualBox

Changeset 96921 in vbox


Ignore:
Timestamp:
Sep 28, 2022 7:22:51 PM (2 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
153832
Message:

VMM/IEM: Implement cvtpi2ps/cvtpi2pd instructions, bugref:9898

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

Legend:

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

    r96916 r96921  
    60906090IEMIMPL_MEDIA_SSE_MXCSR_I64_U128 cvtpd2pi
    60916091IEMIMPL_MEDIA_SSE_MXCSR_I64_U128 cvttpd2pi
     6092
     6093;;
     6094; SSE instructions of the form
     6095;    xxx mm, xmm/m64.
     6096; and we need to load and save the MXCSR register.
     6097;
     6098; @param    1       The instruction name.
     6099;
     6100; @param    A0      Pointer to the MXCSR value (input/output).
     6101; @param    A1      Pointer to the first media register sized operand (input/output).
     6102; @param    A2      The 64bit source value from a MMX media register (input)
     6103;
     6104%macro IEMIMPL_MEDIA_SSE_MXCSR_U128_U64 1
     6105BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u128, 16
     6106        PROLOGUE_3_ARGS
     6107        IEMIMPL_SSE_PROLOGUE
     6108        SSE_LD_FXSTATE_MXCSR_ONLY A0
     6109
     6110        movdqu  xmm0, [A1]
     6111        movq    mm0, A2
     6112        %1      xmm0, mm0
     6113        movdqu  [A1], xmm0
     6114
     6115        SSE_ST_FXSTATE_MXCSR_ONLY_NO_FXSTATE A0
     6116        IEMIMPL_SSE_EPILOGUE
     6117        EPILOGUE_3_ARGS
     6118ENDPROC iemAImpl_ %+ %1 %+ _u128
     6119%endmacro
     6120
     6121IEMIMPL_MEDIA_SSE_MXCSR_U128_U64 cvtpi2ps
     6122IEMIMPL_MEDIA_SSE_MXCSR_U128_U64 cvtpi2pd
  • TabularUnified trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r96916 r96921  
    1680116801}
    1680216802#endif
     16803
     16804
     16805/**
     16806 * CVTPI2PS
     16807 */
     16808#ifdef IEM_WITHOUT_ASSEMBLY
     16809static uint32_t iemAImpl_cvtpi2ps_u128_worker(uint32_t fMxcsr, PRTFLOAT32U pr32Dst, int32_t i32Src)
     16810{
     16811    softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(fMxcsr);
     16812    float32_t r32Res = i32_to_f32(i32Src, &SoftState);
     16813    return iemSseSoftStateAndR32ToMxcsrAndIprtResult(&SoftState, r32Res, pr32Dst, fMxcsr);
     16814}
     16815
     16816
     16817IEM_DECL_IMPL_DEF(void, iemAImpl_cvtpi2ps_u128,(uint32_t *pfMxcsr, PX86XMMREG pDst, uint64_t u64Src))
     16818{
     16819    RTUINT64U uSrc = { u64Src };
     16820    uint32_t fMxcsrOut  = iemAImpl_cvtpi2ps_u128_worker(*pfMxcsr, &pDst->ar32[0], uSrc.ai32[0]);
     16821             fMxcsrOut |= iemAImpl_cvtpi2ps_u128_worker(*pfMxcsr, &pDst->ar32[1], uSrc.ai32[1]);
     16822    *pfMxcsr = fMxcsrOut;
     16823}
     16824#endif
     16825
     16826
     16827/**
     16828 * CVTPI2PD
     16829 */
     16830#ifdef IEM_WITHOUT_ASSEMBLY
     16831static uint32_t iemAImpl_cvtpi2pd_u128_worker(uint32_t fMxcsr, PRTFLOAT64U pr64Dst, int32_t i32Src)
     16832{
     16833    softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(fMxcsr);
     16834    float64_t r64Res = i32_to_f64(i32Src, &SoftState);
     16835    return iemSseSoftStateAndR64ToMxcsrAndIprtResult(&SoftState, r64Res, pr64Dst, fMxcsr);
     16836}
     16837
     16838
     16839IEM_DECL_IMPL_DEF(void, iemAImpl_cvtpi2pd_u128,(uint32_t *pfMxcsr, PX86XMMREG pDst, uint64_t u64Src))
     16840{
     16841    RTUINT64U uSrc = { u64Src };
     16842    uint32_t fMxcsrOut  = iemAImpl_cvtpi2pd_u128_worker(*pfMxcsr, &pDst->ar64[0], uSrc.ai32[0]);
     16843             fMxcsrOut |= iemAImpl_cvtpi2pd_u128_worker(*pfMxcsr, &pDst->ar64[1], uSrc.ai32[1]);
     16844    *pfMxcsr = fMxcsrOut;
     16845}
     16846#endif
  • TabularUnified trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r96916 r96921  
    36013601
    36023602/** Opcode      0x0f 0x2a - cvtpi2ps Vps, Qpi */
    3603 FNIEMOP_STUB(iemOp_cvtpi2ps_Vps_Qpi); //NEXT
     3603FNIEMOP_DEF(iemOp_cvtpi2ps_Vps_Qpi)
     3604{
     3605    IEMOP_MNEMONIC2(RM, CVTPI2PS, cvtpi2ps, Vps, Qq, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0); /// @todo
     3606    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     3607    if (IEM_IS_MODRM_REG_MODE(bRm))
     3608    {
     3609        /*
     3610         * Register, register.
     3611         */
     3612        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     3613
     3614        IEM_MC_BEGIN(3, 1);
     3615        IEM_MC_ARG(uint32_t *,              pfMxcsr,            0);
     3616        IEM_MC_LOCAL(X86XMMREG,             Dst);
     3617        IEM_MC_ARG_LOCAL_REF(PX86XMMREG,    pDst, Dst,          1);
     3618        IEM_MC_ARG(uint64_t,                u64Src,             2);
     3619        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     3620        IEM_MC_PREPARE_FPU_USAGE();
     3621        IEM_MC_FPU_TO_MMX_MODE();
     3622
     3623        IEM_MC_REF_MXCSR(pfMxcsr);
     3624        IEM_MC_FETCH_XREG_XMM(Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); /* Need it because the high quadword remains unchanged. */
     3625        IEM_MC_FETCH_MREG_U64(u64Src, IEM_GET_MODRM_REG(pVCpu, bRm));
     3626
     3627        IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_cvtpi2ps_u128, pfMxcsr, pDst, u64Src);
     3628        IEM_MC_IF_MXCSR_XCPT_PENDING()
     3629            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3630        IEM_MC_ELSE()
     3631            IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_RM(pVCpu, bRm), Dst);
     3632        IEM_MC_ENDIF();
     3633
     3634        IEM_MC_ADVANCE_RIP();
     3635        IEM_MC_END();
     3636    }
     3637    else
     3638    {
     3639        /*
     3640         * Register, memory.
     3641         */
     3642        IEM_MC_BEGIN(3, 3);
     3643        IEM_MC_ARG(uint32_t *,              pfMxcsr,            0);
     3644        IEM_MC_LOCAL(X86XMMREG,             Dst);
     3645        IEM_MC_ARG_LOCAL_REF(PX86XMMREG,    pDst, Dst,          1);
     3646        IEM_MC_ARG(uint64_t,                u64Src,             2);
     3647        IEM_MC_LOCAL(RTGCPTR,               GCPtrEffSrc);
     3648
     3649        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     3650        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     3651        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     3652        IEM_MC_FETCH_MEM_U64(u64Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     3653
     3654        IEM_MC_PREPARE_FPU_USAGE();
     3655        IEM_MC_FPU_TO_MMX_MODE();
     3656        IEM_MC_REF_MXCSR(pfMxcsr);
     3657
     3658        IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_cvtpi2ps_u128, pfMxcsr, pDst, u64Src);
     3659        IEM_MC_IF_MXCSR_XCPT_PENDING()
     3660            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3661        IEM_MC_ELSE()
     3662            IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_RM(pVCpu, bRm), Dst);
     3663        IEM_MC_ENDIF();
     3664
     3665        IEM_MC_ADVANCE_RIP();
     3666        IEM_MC_END();
     3667    }
     3668    return VINF_SUCCESS;
     3669}
     3670
     3671
    36043672/** Opcode 0x66 0x0f 0x2a - cvtpi2pd Vpd, Qpi */
    3605 FNIEMOP_STUB(iemOp_cvtpi2pd_Vpd_Qpi); //NEXT
     3673FNIEMOP_DEF(iemOp_cvtpi2pd_Vpd_Qpi)
     3674{
     3675    IEMOP_MNEMONIC2(RM, CVTPI2PD, cvtpi2pd, Vps, Qq, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0); /// @todo
     3676    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     3677    if (IEM_IS_MODRM_REG_MODE(bRm))
     3678    {
     3679        /*
     3680         * Register, register.
     3681         */
     3682        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     3683
     3684        IEM_MC_BEGIN(3, 1);
     3685        IEM_MC_ARG(uint32_t *,              pfMxcsr,            0);
     3686        IEM_MC_LOCAL(X86XMMREG,             Dst);
     3687        IEM_MC_ARG_LOCAL_REF(PX86XMMREG,    pDst, Dst,          1);
     3688        IEM_MC_ARG(uint64_t,                u64Src,             2);
     3689        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     3690        IEM_MC_PREPARE_FPU_USAGE();
     3691        IEM_MC_FPU_TO_MMX_MODE();
     3692
     3693        IEM_MC_REF_MXCSR(pfMxcsr);
     3694        IEM_MC_FETCH_MREG_U64(u64Src, IEM_GET_MODRM_REG(pVCpu, bRm));
     3695
     3696        IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_cvtpi2pd_u128, pfMxcsr, pDst, u64Src);
     3697        IEM_MC_IF_MXCSR_XCPT_PENDING()
     3698            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3699        IEM_MC_ELSE()
     3700            IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_RM(pVCpu, bRm), Dst);
     3701        IEM_MC_ENDIF();
     3702
     3703        IEM_MC_ADVANCE_RIP();
     3704        IEM_MC_END();
     3705    }
     3706    else
     3707    {
     3708        /*
     3709         * Register, memory.
     3710         */
     3711        IEM_MC_BEGIN(3, 3);
     3712        IEM_MC_ARG(uint32_t *,              pfMxcsr,            0);
     3713        IEM_MC_LOCAL(X86XMMREG,             Dst);
     3714        IEM_MC_ARG_LOCAL_REF(PX86XMMREG,    pDst, Dst,          1);
     3715        IEM_MC_ARG(uint64_t,                u64Src,             2);
     3716        IEM_MC_LOCAL(RTGCPTR,               GCPtrEffSrc);
     3717
     3718        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     3719        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     3720        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     3721        IEM_MC_FETCH_MEM_U64(u64Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     3722
     3723        /* Doesn't cause a transition to MMX mode. */
     3724        IEM_MC_PREPARE_SSE_USAGE();
     3725        IEM_MC_REF_MXCSR(pfMxcsr);
     3726
     3727        IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_cvtpi2pd_u128, pfMxcsr, pDst, u64Src);
     3728        IEM_MC_IF_MXCSR_XCPT_PENDING()
     3729            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3730        IEM_MC_ELSE()
     3731            IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_RM(pVCpu, bRm), Dst);
     3732        IEM_MC_ENDIF();
     3733
     3734        IEM_MC_ADVANCE_RIP();
     3735        IEM_MC_END();
     3736    }
     3737    return VINF_SUCCESS;
     3738}
    36063739
    36073740
  • TabularUnified trunk/src/VBox/VMM/include/IEMInternal.h

    r96916 r96921  
    23732373FNIEMAIMPLMXCSRU64U128 iemAImpl_cvtpd2pi_u128;
    23742374FNIEMAIMPLMXCSRU64U128 iemAImpl_cvttpd2pi_u128;
     2375
     2376typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLMXCSRU128U64,(uint32_t *pfMxcsr, PX86XMMREG pDst, uint64_t u64Src));
     2377typedef FNIEMAIMPLMXCSRU128U64 *PFNIEMAIMPLMXCSRU128U64;
     2378
     2379FNIEMAIMPLMXCSRU128U64 iemAImpl_cvtpi2ps_u128;
     2380FNIEMAIMPLMXCSRU128U64 iemAImpl_cvtpi2pd_u128;
    23752381
    23762382/** @} */
Note: See TracChangeset for help on using the changeset viewer.

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