VirtualBox

Changeset 96930 in vbox for trunk


Ignore:
Timestamp:
Sep 29, 2022 9:55:19 AM (2 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
153841
Message:

VMM/IEM: Implement cvtps2pi/cvttps2pi instructions, bugref:9898

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

Legend:

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

    r96921 r96930  
    60936093;;
    60946094; SSE instructions of the form
    6095 ;    xxx mm, xmm/m64.
     6095;    xxx xmm, xmm/m64.
    60966096; and we need to load and save the MXCSR register.
    60976097;
     
    61216121IEMIMPL_MEDIA_SSE_MXCSR_U128_U64 cvtpi2ps
    61226122IEMIMPL_MEDIA_SSE_MXCSR_U128_U64 cvtpi2pd
     6123
     6124;;
     6125; SSE instructions of the form
     6126;    xxx mm, xmm/m64.
     6127; and we need to load and save the MXCSR register.
     6128;
     6129; @param    1       The instruction name.
     6130;
     6131; @param    A0      Pointer to the MXCSR value (input/output).
     6132; @param    A1      Pointer to the first MMX media register sized operand (output).
     6133; @param    A2      The 64bit source value (input).
     6134;
     6135%macro IEMIMPL_MEDIA_SSE_MXCSR_U64_U64 1
     6136BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u128, 16
     6137        PROLOGUE_3_ARGS
     6138        IEMIMPL_SSE_PROLOGUE
     6139        SSE_LD_FXSTATE_MXCSR_ONLY A0
     6140
     6141        movq    xmm0, A2
     6142        %1      mm0, xmm0
     6143        movq    [A1], mm0
     6144
     6145        SSE_ST_FXSTATE_MXCSR_ONLY_NO_FXSTATE A0
     6146        IEMIMPL_SSE_EPILOGUE
     6147        EPILOGUE_3_ARGS
     6148ENDPROC iemAImpl_ %+ %1 %+ _u128
     6149%endmacro
     6150
     6151IEMIMPL_MEDIA_SSE_MXCSR_U64_U64 cvtps2pi
     6152IEMIMPL_MEDIA_SSE_MXCSR_U64_U64 cvttps2pi
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r96921 r96930  
    1684516845}
    1684616846#endif
     16847
     16848
     16849/**
     16850 * CVTPS2PI
     16851 */
     16852#ifdef IEM_WITHOUT_ASSEMBLY
     16853static uint32_t iemAImpl_cvtps2pi_u128_worker(uint32_t fMxcsr, int32_t *pi32Dst, PCRTFLOAT32U pr32Src)
     16854{
     16855    RTFLOAT32U r32Src;
     16856    iemSsePrepareValueR32(&r32Src, fMxcsr, pr32Src); /* The de-normal flag is not set. */
     16857
     16858    softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(fMxcsr);
     16859    *pi32Dst = f32_to_i32(iemFpSoftF32FromIprt(&r32Src), SoftState.roundingMode, true /*exact*/, &SoftState);
     16860    return fMxcsr | (SoftState.exceptionFlags & X86_MXCSR_XCPT_FLAGS);
     16861}
     16862
     16863
     16864IEM_DECL_IMPL_DEF(void, iemAImpl_cvtps2pi_u128,(uint32_t *pfMxcsr, uint64_t *pu64Dst, uint64_t u64Src))
     16865{
     16866    RTUINT64U uDst;
     16867    RTUINT64U uSrc = { u64Src };
     16868    uint32_t fMxcsrOut  = iemAImpl_cvtps2pi_u128_worker(*pfMxcsr, &uDst.ai32[0], (PCRTFLOAT32U)&uSrc.au32[0]);
     16869             fMxcsrOut |= iemAImpl_cvtps2pi_u128_worker(*pfMxcsr, &uDst.ai32[1], (PCRTFLOAT32U)&uSrc.au32[1]);
     16870    *pu64Dst = uDst.u;
     16871    *pfMxcsr = fMxcsrOut;
     16872}
     16873#endif
     16874
     16875
     16876/**
     16877 * CVTTPS2PI
     16878 */
     16879#ifdef IEM_WITHOUT_ASSEMBLY
     16880static uint32_t iemAImpl_cvttps2pi_u128_worker(uint32_t fMxcsr, int32_t *pi32Dst, PCRTFLOAT32U pr32Src)
     16881{
     16882    RTFLOAT32U r32Src;
     16883    iemSsePrepareValueR32(&r32Src, fMxcsr, pr32Src); /* The de-normal flag is not set. */
     16884
     16885    softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(fMxcsr);
     16886    *pi32Dst = f32_to_i32_r_minMag(iemFpSoftF32FromIprt(&r32Src), true /*exact*/, &SoftState);
     16887    return fMxcsr | (SoftState.exceptionFlags & X86_MXCSR_XCPT_FLAGS);
     16888}
     16889
     16890
     16891IEM_DECL_IMPL_DEF(void, iemAImpl_cvttps2pi_u128,(uint32_t *pfMxcsr, uint64_t *pu64Dst, uint64_t u64Src))
     16892{
     16893    RTUINT64U uDst;
     16894    RTUINT64U uSrc = { u64Src };
     16895    uint32_t fMxcsrOut  = iemAImpl_cvttps2pi_u128_worker(*pfMxcsr, &uDst.ai32[0], (PCRTFLOAT32U)&uSrc.au32[0]);
     16896             fMxcsrOut |= iemAImpl_cvttps2pi_u128_worker(*pfMxcsr, &uDst.ai32[1], (PCRTFLOAT32U)&uSrc.au32[1]);
     16897    *pu64Dst = uDst.u;
     16898    *pfMxcsr = fMxcsrOut;
     16899}
     16900#endif
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r96921 r96930  
    40754075
    40764076/** Opcode      0x0f 0x2c - cvttps2pi Ppi, Wps */
    4077 FNIEMOP_STUB(iemOp_cvttps2pi_Ppi_Wps);
     4077FNIEMOP_DEF(iemOp_cvttps2pi_Ppi_Wps)
     4078{
     4079    IEMOP_MNEMONIC2(RM, CVTTPS2PI, cvttps2pi, Pq, Wps, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0); /// @todo
     4080    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     4081    if (IEM_IS_MODRM_REG_MODE(bRm))
     4082    {
     4083        /*
     4084         * Register, register.
     4085         */
     4086        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     4087
     4088        IEM_MC_BEGIN(3, 1);
     4089        IEM_MC_ARG(uint32_t *,              pfMxcsr,            0);
     4090        IEM_MC_LOCAL(uint64_t,              u64Dst);
     4091        IEM_MC_ARG_LOCAL_REF(uint64_t *,    pu64Dst, u64Dst,    1);
     4092        IEM_MC_ARG(uint64_t,                u64Src,             2);
     4093        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     4094        IEM_MC_PREPARE_FPU_USAGE();
     4095        IEM_MC_FPU_TO_MMX_MODE();
     4096
     4097        IEM_MC_REF_MXCSR(pfMxcsr);
     4098        IEM_MC_FETCH_XREG_U64(u64Src, IEM_GET_MODRM_RM(pVCpu, bRm));
     4099
     4100        IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_cvttps2pi_u128, pfMxcsr, pu64Dst, u64Src);
     4101        IEM_MC_IF_MXCSR_XCPT_PENDING()
     4102            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4103        IEM_MC_ELSE()
     4104            IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_RM(pVCpu, bRm), u64Dst);
     4105        IEM_MC_ENDIF();
     4106
     4107        IEM_MC_ADVANCE_RIP();
     4108        IEM_MC_END();
     4109    }
     4110    else
     4111    {
     4112        /*
     4113         * Register, memory.
     4114         */
     4115        IEM_MC_BEGIN(3, 2);
     4116        IEM_MC_ARG(uint32_t *,              pfMxcsr,            0);
     4117        IEM_MC_LOCAL(uint64_t,              u64Dst);
     4118        IEM_MC_ARG_LOCAL_REF(uint64_t *,    pu64Dst, u64Dst,    1);
     4119        IEM_MC_ARG(uint64_t,                u64Src,             2);
     4120        IEM_MC_LOCAL(RTGCPTR,               GCPtrEffSrc);
     4121
     4122        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     4123        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     4124        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     4125        IEM_MC_FETCH_MEM_U64(u64Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     4126
     4127        IEM_MC_PREPARE_FPU_USAGE();
     4128        IEM_MC_FPU_TO_MMX_MODE();
     4129        IEM_MC_REF_MXCSR(pfMxcsr);
     4130
     4131        IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_cvttps2pi_u128, pfMxcsr, pu64Dst, u64Src);
     4132        IEM_MC_IF_MXCSR_XCPT_PENDING()
     4133            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4134        IEM_MC_ELSE()
     4135            IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_RM(pVCpu, bRm), u64Dst);
     4136        IEM_MC_ENDIF();
     4137
     4138        IEM_MC_ADVANCE_RIP();
     4139        IEM_MC_END();
     4140    }
     4141    return VINF_SUCCESS;
     4142}
    40784143
    40794144
     
    44024467
    44034468/** Opcode      0x0f 0x2d - cvtps2pi Ppi, Wps */
    4404 FNIEMOP_STUB(iemOp_cvtps2pi_Ppi_Wps);
     4469FNIEMOP_DEF(iemOp_cvtps2pi_Ppi_Wps)
     4470{
     4471    IEMOP_MNEMONIC2(RM, CVTPS2PI, cvtps2pi, Pq, Wps, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0); /// @todo
     4472    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     4473    if (IEM_IS_MODRM_REG_MODE(bRm))
     4474    {
     4475        /*
     4476         * Register, register.
     4477         */
     4478        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     4479
     4480        IEM_MC_BEGIN(3, 1);
     4481        IEM_MC_ARG(uint32_t *,              pfMxcsr,            0);
     4482        IEM_MC_LOCAL(uint64_t,              u64Dst);
     4483        IEM_MC_ARG_LOCAL_REF(uint64_t *,    pu64Dst, u64Dst,    1);
     4484        IEM_MC_ARG(uint64_t,                u64Src,             2);
     4485        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     4486        IEM_MC_PREPARE_FPU_USAGE();
     4487        IEM_MC_FPU_TO_MMX_MODE();
     4488
     4489        IEM_MC_REF_MXCSR(pfMxcsr);
     4490        IEM_MC_FETCH_XREG_U64(u64Src, IEM_GET_MODRM_RM(pVCpu, bRm));
     4491
     4492        IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_cvtps2pi_u128, pfMxcsr, pu64Dst, u64Src);
     4493        IEM_MC_IF_MXCSR_XCPT_PENDING()
     4494            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4495        IEM_MC_ELSE()
     4496            IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_RM(pVCpu, bRm), u64Dst);
     4497        IEM_MC_ENDIF();
     4498
     4499        IEM_MC_ADVANCE_RIP();
     4500        IEM_MC_END();
     4501    }
     4502    else
     4503    {
     4504        /*
     4505         * Register, memory.
     4506         */
     4507        IEM_MC_BEGIN(3, 2);
     4508        IEM_MC_ARG(uint32_t *,              pfMxcsr,            0);
     4509        IEM_MC_LOCAL(uint64_t,              u64Dst);
     4510        IEM_MC_ARG_LOCAL_REF(uint64_t *,    pu64Dst, u64Dst,    1);
     4511        IEM_MC_ARG(uint64_t,                u64Src,             2);
     4512        IEM_MC_LOCAL(RTGCPTR,               GCPtrEffSrc);
     4513
     4514        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     4515        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     4516        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     4517        IEM_MC_FETCH_MEM_U64(u64Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     4518
     4519        IEM_MC_PREPARE_FPU_USAGE();
     4520        IEM_MC_FPU_TO_MMX_MODE();
     4521        IEM_MC_REF_MXCSR(pfMxcsr);
     4522
     4523        IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_cvtps2pi_u128, pfMxcsr, pu64Dst, u64Src);
     4524        IEM_MC_IF_MXCSR_XCPT_PENDING()
     4525            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4526        IEM_MC_ELSE()
     4527            IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_RM(pVCpu, bRm), u64Dst);
     4528        IEM_MC_ENDIF();
     4529
     4530        IEM_MC_ADVANCE_RIP();
     4531        IEM_MC_END();
     4532    }
     4533    return VINF_SUCCESS;
     4534}
    44054535
    44064536
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r96921 r96930  
    23792379FNIEMAIMPLMXCSRU128U64 iemAImpl_cvtpi2ps_u128;
    23802380FNIEMAIMPLMXCSRU128U64 iemAImpl_cvtpi2pd_u128;
     2381
     2382typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLMXCSRU64U64,(uint32_t *pfMxcsr, uint64_t *pu64Dst, uint64_t u64Src));
     2383typedef FNIEMAIMPLMXCSRU64U64 *PFNIEMAIMPLMXCSRU64U64;
     2384
     2385FNIEMAIMPLMXCSRU64U64 iemAImpl_cvtps2pi_u128;
     2386FNIEMAIMPLMXCSRU64U64 iemAImpl_cvttps2pi_u128;
    23812387
    23822388/** @} */
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