VirtualBox

Changeset 96916 in vbox for trunk


Ignore:
Timestamp:
Sep 28, 2022 12:53:09 PM (2 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
153827
Message:

VMM/IEM: Implement cvtpd2pi/cvttpd2pi instructions, bugref:9898

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

Legend:

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

    r96796 r96916  
    60606060IEMIMPL_MEDIA_SSE_INSN_IMM8_MXCSR_5 cmpss
    60616061IEMIMPL_MEDIA_SSE_INSN_IMM8_MXCSR_5 cmpsd
     6062
     6063;;
     6064; SSE instructions of the form
     6065;    xxx mm, xmm.
     6066; and we need to load and save the MXCSR register.
     6067;
     6068; @param    1       The instruction name.
     6069;
     6070; @param    A0      Pointer to the MXCSR value (input/output).
     6071; @param    A1      Pointer to the first MMX register sized operand (output).
     6072; @param    A2      Pointer to the media register sized operand (input).
     6073;
     6074%macro IEMIMPL_MEDIA_SSE_MXCSR_I64_U128 1
     6075BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u128, 16
     6076        PROLOGUE_3_ARGS
     6077        IEMIMPL_SSE_PROLOGUE
     6078        SSE_LD_FXSTATE_MXCSR_ONLY A0
     6079
     6080        movdqu  xmm0, [A2]
     6081        %1      mm0, xmm0
     6082        movq    [A1], mm0
     6083
     6084        SSE_ST_FXSTATE_MXCSR_ONLY_NO_FXSTATE A0
     6085        IEMIMPL_SSE_EPILOGUE
     6086        EPILOGUE_3_ARGS
     6087ENDPROC iemAImpl_ %+ %1 %+ _u128
     6088%endmacro
     6089
     6090IEMIMPL_MEDIA_SSE_MXCSR_I64_U128 cvtpd2pi
     6091IEMIMPL_MEDIA_SSE_MXCSR_I64_U128 cvttpd2pi
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r96895 r96916  
    1674716747}
    1674816748#endif
     16749
     16750
     16751/**
     16752 * CVTPD2PI
     16753 */
     16754#ifdef IEM_WITHOUT_ASSEMBLY
     16755static uint32_t iemAImpl_cvtpd2pi_u128_worker(uint32_t fMxcsr, int32_t *pi32Dst, PCRTFLOAT64U pr64Src)
     16756{
     16757    RTFLOAT64U r64Src;
     16758    iemSsePrepareValueR64(&r64Src, fMxcsr, pr64Src); /* The de-normal flag is not set. */
     16759
     16760    softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(fMxcsr);
     16761    *pi32Dst = f64_to_i32(iemFpSoftF64FromIprt(&r64Src), SoftState.roundingMode, true /*exact*/, &SoftState);
     16762    return fMxcsr | (SoftState.exceptionFlags & X86_MXCSR_XCPT_FLAGS);
     16763}
     16764
     16765
     16766IEM_DECL_IMPL_DEF(void, iemAImpl_cvtpd2pi_u128,(uint32_t *pfMxcsr, uint64_t *pu64Dst, PCX86XMMREG pSrc))
     16767{
     16768    RTUINT64U u64Res;
     16769    uint32_t fMxcsrOut  = iemAImpl_cvtpd2pi_u128_worker(*pfMxcsr, &u64Res.ai32[0], &pSrc->ar64[0]);
     16770             fMxcsrOut |= iemAImpl_cvtpd2pi_u128_worker(*pfMxcsr, &u64Res.ai32[1], &pSrc->ar64[1]);
     16771
     16772    *pu64Dst = u64Res.u;
     16773    *pfMxcsr = fMxcsrOut;
     16774}
     16775#endif
     16776
     16777
     16778/**
     16779 * CVTTPD2PI
     16780 */
     16781#ifdef IEM_WITHOUT_ASSEMBLY
     16782static uint32_t iemAImpl_cvttpd2pi_u128_worker(uint32_t fMxcsr, int32_t *pi32Dst, PCRTFLOAT64U pr64Src)
     16783{
     16784    RTFLOAT64U r64Src;
     16785    iemSsePrepareValueR64(&r64Src, fMxcsr, pr64Src); /* The de-normal flag is not set. */
     16786
     16787    softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(fMxcsr);
     16788    *pi32Dst = f64_to_i32_r_minMag(iemFpSoftF64FromIprt(&r64Src), true /*exact*/, &SoftState);
     16789    return fMxcsr | (SoftState.exceptionFlags & X86_MXCSR_XCPT_FLAGS);
     16790}
     16791
     16792
     16793IEM_DECL_IMPL_DEF(void, iemAImpl_cvttpd2pi_u128,(uint32_t *pfMxcsr, uint64_t *pu64Dst, PCX86XMMREG pSrc))
     16794{
     16795    RTUINT64U u64Res;
     16796    uint32_t fMxcsrOut  = iemAImpl_cvttpd2pi_u128_worker(*pfMxcsr, &u64Res.ai32[0], &pSrc->ar64[0]);
     16797             fMxcsrOut |= iemAImpl_cvttpd2pi_u128_worker(*pfMxcsr, &u64Res.ai32[1], &pSrc->ar64[1]);
     16798
     16799    *pu64Dst = u64Res.u;
     16800    *pfMxcsr = fMxcsrOut;
     16801}
     16802#endif
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r96882 r96916  
    39433943/** Opcode      0x0f 0x2c - cvttps2pi Ppi, Wps */
    39443944FNIEMOP_STUB(iemOp_cvttps2pi_Ppi_Wps);
     3945
     3946
    39453947/** Opcode 0x66 0x0f 0x2c - cvttpd2pi Ppi, Wpd */
    3946 FNIEMOP_STUB(iemOp_cvttpd2pi_Ppi_Wpd);
     3948FNIEMOP_DEF(iemOp_cvttpd2pi_Ppi_Wpd)
     3949{
     3950    IEMOP_MNEMONIC2(RM, CVTTPD2PI, cvttpd2pi, Pq, Wpd, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0); /// @todo
     3951    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     3952    if (IEM_IS_MODRM_REG_MODE(bRm))
     3953    {
     3954        /*
     3955         * Register, register.
     3956         */
     3957        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     3958
     3959        IEM_MC_BEGIN(3, 1);
     3960        IEM_MC_ARG(uint32_t *,              pfMxcsr,            0);
     3961        IEM_MC_LOCAL(uint64_t,              u64Dst);
     3962        IEM_MC_ARG_LOCAL_REF(uint64_t *,    pu64Dst, u64Dst,    1);
     3963        IEM_MC_ARG(PCX86XMMREG,             pSrc,               2);
     3964        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     3965        IEM_MC_PREPARE_FPU_USAGE();
     3966        IEM_MC_FPU_TO_MMX_MODE();
     3967
     3968        IEM_MC_REF_MXCSR(pfMxcsr);
     3969        IEM_MC_REF_XREG_XMM_CONST(pSrc, IEM_GET_MODRM_RM(pVCpu, bRm));
     3970
     3971        IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_cvttpd2pi_u128, pfMxcsr, pu64Dst, pSrc);
     3972        IEM_MC_IF_MXCSR_XCPT_PENDING()
     3973            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3974        IEM_MC_ELSE()
     3975            IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG(pVCpu, bRm), u64Dst);
     3976        IEM_MC_ENDIF();
     3977
     3978        IEM_MC_ADVANCE_RIP();
     3979        IEM_MC_END();
     3980    }
     3981    else
     3982    {
     3983        /*
     3984         * Register, memory.
     3985         */
     3986        IEM_MC_BEGIN(3, 3);
     3987        IEM_MC_ARG(uint32_t *,              pfMxcsr,            0);
     3988        IEM_MC_LOCAL(uint64_t,              u64Dst);
     3989        IEM_MC_ARG_LOCAL_REF(uint64_t *,    pu64Dst,    u64Dst, 1);
     3990        IEM_MC_LOCAL(X86XMMREG,             uSrc);
     3991        IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,   pSrc,       uSrc,   2);
     3992        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     3993
     3994        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     3995        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     3996        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     3997        IEM_MC_FETCH_MEM_XMM_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     3998
     3999        IEM_MC_PREPARE_FPU_USAGE();
     4000        IEM_MC_FPU_TO_MMX_MODE();
     4001
     4002        IEM_MC_REF_MXCSR(pfMxcsr);
     4003
     4004        IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_cvttpd2pi_u128, pfMxcsr, pu64Dst, pSrc);
     4005        IEM_MC_IF_MXCSR_XCPT_PENDING()
     4006            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4007        IEM_MC_ELSE()
     4008            IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG(pVCpu, bRm), u64Dst);
     4009        IEM_MC_ENDIF();
     4010
     4011        IEM_MC_ADVANCE_RIP();
     4012        IEM_MC_END();
     4013    }
     4014    return VINF_SUCCESS;
     4015}
    39474016
    39484017
     
    42014270/** Opcode      0x0f 0x2d - cvtps2pi Ppi, Wps */
    42024271FNIEMOP_STUB(iemOp_cvtps2pi_Ppi_Wps);
     4272
     4273
    42034274/** Opcode 0x66 0x0f 0x2d - cvtpd2pi Qpi, Wpd */
    4204 FNIEMOP_STUB(iemOp_cvtpd2pi_Qpi_Wpd);
     4275FNIEMOP_DEF(iemOp_cvtpd2pi_Qpi_Wpd)
     4276{
     4277    IEMOP_MNEMONIC2(RM, CVTPD2PI, cvtpd2pi, Pq, Wpd, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0); /// @todo
     4278    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     4279    if (IEM_IS_MODRM_REG_MODE(bRm))
     4280    {
     4281        /*
     4282         * Register, register.
     4283         */
     4284        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     4285
     4286        IEM_MC_BEGIN(3, 1);
     4287        IEM_MC_ARG(uint32_t *,              pfMxcsr,            0);
     4288        IEM_MC_LOCAL(uint64_t,              u64Dst);
     4289        IEM_MC_ARG_LOCAL_REF(uint64_t *,    pu64Dst, u64Dst,    1);
     4290        IEM_MC_ARG(PCX86XMMREG,             pSrc,               2);
     4291        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     4292        IEM_MC_PREPARE_FPU_USAGE();
     4293        IEM_MC_FPU_TO_MMX_MODE();
     4294
     4295        IEM_MC_REF_MXCSR(pfMxcsr);
     4296        IEM_MC_REF_XREG_XMM_CONST(pSrc, IEM_GET_MODRM_RM(pVCpu, bRm));
     4297
     4298        IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_cvtpd2pi_u128, pfMxcsr, pu64Dst, pSrc);
     4299        IEM_MC_IF_MXCSR_XCPT_PENDING()
     4300            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4301        IEM_MC_ELSE()
     4302            IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG(pVCpu, bRm), u64Dst);
     4303        IEM_MC_ENDIF();
     4304
     4305        IEM_MC_ADVANCE_RIP();
     4306        IEM_MC_END();
     4307    }
     4308    else
     4309    {
     4310        /*
     4311         * Register, memory.
     4312         */
     4313        IEM_MC_BEGIN(3, 3);
     4314        IEM_MC_ARG(uint32_t *,              pfMxcsr,            0);
     4315        IEM_MC_LOCAL(uint64_t,              u64Dst);
     4316        IEM_MC_ARG_LOCAL_REF(uint64_t *,    pu64Dst,    u64Dst, 1);
     4317        IEM_MC_LOCAL(X86XMMREG,             uSrc);
     4318        IEM_MC_ARG_LOCAL_REF(PCX86XMMREG,   pSrc,       uSrc,   2);
     4319        IEM_MC_LOCAL(RTGCPTR,                   GCPtrEffSrc);
     4320
     4321        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     4322        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     4323        IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     4324        IEM_MC_FETCH_MEM_XMM_ALIGN_SSE(uSrc, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     4325
     4326        IEM_MC_PREPARE_FPU_USAGE();
     4327        IEM_MC_FPU_TO_MMX_MODE();
     4328
     4329        IEM_MC_REF_MXCSR(pfMxcsr);
     4330
     4331        IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_cvtpd2pi_u128, pfMxcsr, pu64Dst, pSrc);
     4332        IEM_MC_IF_MXCSR_XCPT_PENDING()
     4333            IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4334        IEM_MC_ELSE()
     4335            IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_REG(pVCpu, bRm), u64Dst);
     4336        IEM_MC_ENDIF();
     4337
     4338        IEM_MC_ADVANCE_RIP();
     4339        IEM_MC_END();
     4340    }
     4341    return VINF_SUCCESS;
     4342}
    42054343
    42064344
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r96811 r96916  
    23672367FNIEMAIMPLMXCSRF2XMMIMM8 iemAImpl_cmpss_u128;
    23682368FNIEMAIMPLMXCSRF2XMMIMM8 iemAImpl_cmpsd_u128;
     2369
     2370typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLMXCSRU64U128,(uint32_t *pfMxcsr, uint64_t *pu64Dst, PCX86XMMREG pSrc));
     2371typedef FNIEMAIMPLMXCSRU64U128 *PFNIEMAIMPLMXCSRU64U128;
     2372
     2373FNIEMAIMPLMXCSRU64U128 iemAImpl_cvtpd2pi_u128;
     2374FNIEMAIMPLMXCSRU64U128 iemAImpl_cvttpd2pi_u128;
    23692375
    23702376/** @} */
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