VirtualBox

Changeset 96731 in vbox


Ignore:
Timestamp:
Sep 14, 2022 9:21:03 AM (2 years ago)
Author:
vboxsync
Message:

VMM/IEM: Implement cvttss2si/cvtss2si instructions, bugref:9898

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

Legend:

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

    r96726 r96731  
    55895589        EPILOGUE_4_ARGS
    55905590ENDPROC iemAImpl_cvtsd2si_i64_r64
     5591
     5592
     5593;;
     5594; cvttss2si instruction - 32-bit variant.
     5595;
     5596; @param    A0      FPU context (FXSTATE or XSAVEAREA).
     5597; @param    A1      Where to return the MXCSR value.
     5598; @param    A2      Pointer to the result operand (output).
     5599; @param    A3      Pointer to the second operand (input).
     5600;
     5601BEGINPROC_FASTCALL iemAImpl_cvttss2si_i32_r32, 16
     5602        PROLOGUE_4_ARGS
     5603        IEMIMPL_SSE_PROLOGUE
     5604        SSE_LD_FXSTATE_MXCSR A0
     5605
     5606        cvttss2si T0_32, [A3]
     5607        mov       dword [A2], T0_32
     5608
     5609        SSE_ST_FXSTATE_MXCSR_ONLY A1, A0
     5610        IEMIMPL_SSE_PROLOGUE
     5611        EPILOGUE_4_ARGS
     5612ENDPROC iemAImpl_cvttss2si_i32_r32
     5613
     5614;;
     5615; cvttss2si instruction - 64-bit variant.
     5616;
     5617; @param    A0      FPU context (FXSTATE or XSAVEAREA).
     5618; @param    A1      Where to return the MXCSR value.
     5619; @param    A2      Pointer to the result operand (output).
     5620; @param    A3      Pointer to the second operand (input).
     5621;
     5622BEGINPROC_FASTCALL iemAImpl_cvttss2si_i64_r32, 16
     5623        PROLOGUE_4_ARGS
     5624        IEMIMPL_SSE_PROLOGUE
     5625        SSE_LD_FXSTATE_MXCSR A0
     5626
     5627        cvttss2si T0, [A3]
     5628        mov       qword [A2], T0
     5629
     5630        SSE_ST_FXSTATE_MXCSR_ONLY A1, A0
     5631        IEMIMPL_SSE_PROLOGUE
     5632        EPILOGUE_4_ARGS
     5633ENDPROC iemAImpl_cvttss2si_i64_r32
     5634
     5635
     5636;;
     5637; cvtss2si instruction - 32-bit variant.
     5638;
     5639; @param    A0      FPU context (FXSTATE or XSAVEAREA).
     5640; @param    A1      Where to return the MXCSR value.
     5641; @param    A2      Pointer to the result operand (output).
     5642; @param    A3      Pointer to the second operand (input).
     5643;
     5644BEGINPROC_FASTCALL iemAImpl_cvtss2si_i32_r32, 16
     5645        PROLOGUE_4_ARGS
     5646        IEMIMPL_SSE_PROLOGUE
     5647        SSE_LD_FXSTATE_MXCSR A0
     5648
     5649        cvtss2si  T0_32, [A3]
     5650        mov       dword [A2], T0_32
     5651
     5652        SSE_ST_FXSTATE_MXCSR_ONLY A1, A0
     5653        IEMIMPL_SSE_PROLOGUE
     5654        EPILOGUE_4_ARGS
     5655ENDPROC iemAImpl_cvtss2si_i32_r32
     5656
     5657;;
     5658; cvtss2si instruction - 64-bit variant.
     5659;
     5660; @param    A0      FPU context (FXSTATE or XSAVEAREA).
     5661; @param    A1      Where to return the MXCSR value.
     5662; @param    A2      Pointer to the result operand (output).
     5663; @param    A3      Pointer to the second operand (input).
     5664;
     5665BEGINPROC_FASTCALL iemAImpl_cvtss2si_i64_r32, 16
     5666        PROLOGUE_4_ARGS
     5667        IEMIMPL_SSE_PROLOGUE
     5668        SSE_LD_FXSTATE_MXCSR A0
     5669
     5670        cvtss2si  T0, [A3]
     5671        mov       qword [A2], T0
     5672
     5673        SSE_ST_FXSTATE_MXCSR_ONLY A1, A0
     5674        IEMIMPL_SSE_PROLOGUE
     5675        EPILOGUE_4_ARGS
     5676ENDPROC iemAImpl_cvtss2si_i64_r32
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r96726 r96731  
    1606116061}
    1606216062#endif
     16063
     16064
     16065/**
     16066 * CVTTSS2SI
     16067 */
     16068#ifdef IEM_WITHOUT_ASSEMBLY
     16069IEM_DECL_IMPL_DEF(void, iemAImpl_cvttss2si_i32_r32,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, int32_t *pi32Dst, const uint32_t *pu32Src))
     16070{
     16071    RTFLOAT32U r32Src;
     16072
     16073    r32Src.u = *pu32Src;
     16074    iemSsePrepareValueR32(&r32Src, pFpuState->MXCSR, &r32Src); /* The de-normal flag is not set. */
     16075
     16076    softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(pFpuState->MXCSR);
     16077    *pi32Dst = f32_to_i32_r_minMag(iemFpSoftF32FromIprt(&r32Src), true /*exact*/, &SoftState);
     16078    *pfMxcsr = pFpuState->MXCSR | (SoftState.exceptionFlags & X86_MXCSR_XCPT_FLAGS);
     16079}
     16080
     16081
     16082IEM_DECL_IMPL_DEF(void, iemAImpl_cvttss2si_i64_r32,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, int64_t *pi64Dst, const uint32_t *pu32Src))
     16083{
     16084    RTFLOAT32U r32Src;
     16085
     16086    r32Src.u = *pu32Src;
     16087    iemSsePrepareValueR32(&r32Src, pFpuState->MXCSR, &r32Src); /* The de-normal flag is not set. */
     16088
     16089    softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(pFpuState->MXCSR);
     16090    *pi64Dst = f32_to_i64_r_minMag(iemFpSoftF32FromIprt(&r32Src), true /*exact*/, &SoftState);
     16091    *pfMxcsr = pFpuState->MXCSR | (SoftState.exceptionFlags & X86_MXCSR_XCPT_FLAGS);
     16092}
     16093#endif
     16094
     16095
     16096/**
     16097 * CVTSS2SI
     16098 */
     16099#ifdef IEM_WITHOUT_ASSEMBLY
     16100IEM_DECL_IMPL_DEF(void, iemAImpl_cvtss2si_i32_r32,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, int32_t *pi32Dst, const uint32_t *pu32Src))
     16101{
     16102    RTFLOAT32U r32Src;
     16103
     16104    r32Src.u = *pu32Src;
     16105    iemSsePrepareValueR32(&r32Src, pFpuState->MXCSR, &r32Src); /* The de-normal flag is not set. */
     16106
     16107    softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(pFpuState->MXCSR);
     16108    *pi32Dst = f32_to_i32(iemFpSoftF32FromIprt(&r32Src), SoftState.roundingMode, true /*exact*/, &SoftState);
     16109    *pfMxcsr = pFpuState->MXCSR | (SoftState.exceptionFlags & X86_MXCSR_XCPT_FLAGS);
     16110}
     16111
     16112
     16113IEM_DECL_IMPL_DEF(void, iemAImpl_cvtss2si_i64_r32,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, int64_t *pi64Dst, const uint32_t *pu32Src))
     16114{
     16115    RTFLOAT32U r32Src;
     16116
     16117    r32Src.u = *pu32Src;
     16118    iemSsePrepareValueR32(&r32Src, pFpuState->MXCSR, &r32Src); /* The de-normal flag is not set. */
     16119
     16120    softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(pFpuState->MXCSR);
     16121    *pi64Dst = f32_to_i64(iemFpSoftF32FromIprt(&r32Src), SoftState.roundingMode, true /*exact*/, &SoftState);
     16122    *pfMxcsr = pFpuState->MXCSR | (SoftState.exceptionFlags & X86_MXCSR_XCPT_FLAGS);
     16123}
     16124#endif
     16125
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r96726 r96731  
    36763676/** Opcode 0x66 0x0f 0x2c - cvttpd2pi Ppi, Wpd */
    36773677FNIEMOP_STUB(iemOp_cvttpd2pi_Ppi_Wpd);
     3678
     3679
    36783680/** Opcode 0xf3 0x0f 0x2c - cvttss2si Gy, Wss */
    3679 FNIEMOP_STUB(iemOp_cvttss2si_Gy_Wss);
     3681FNIEMOP_DEF(iemOp_cvttss2si_Gy_Wss)
     3682{
     3683    IEMOP_MNEMONIC2(RM, CVTTSS2SI, cvttss2si, Gy, Wsd, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0);
     3684
     3685    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     3686    if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W)
     3687    {
     3688        if (IEM_IS_MODRM_REG_MODE(bRm))
     3689        {
     3690            /* greg64, XMM */
     3691            IEM_MC_BEGIN(3, 4);
     3692            IEM_MC_LOCAL(uint32_t,  fMxcsr);
     3693            IEM_MC_LOCAL(int64_t,   i64Dst);
     3694            IEM_MC_ARG_LOCAL_REF(uint32_t *, pfMxcsr, fMxcsr,     0);
     3695            IEM_MC_ARG_LOCAL_REF(int64_t *,  pi64Dst, i64Dst,     1);
     3696            IEM_MC_ARG(const uint32_t *,     pu32Src,             2);
     3697
     3698            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     3699            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     3700            IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     3701
     3702            IEM_MC_REF_XREG_U32_CONST(pu32Src, IEM_GET_MODRM_RM(pVCpu, bRm));
     3703            IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvttss2si_i64_r32, pfMxcsr, pi64Dst, pu32Src);
     3704            IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     3705            IEM_MC_IF_MXCSR_XCPT_PENDING()
     3706                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3707            IEM_MC_ELSE()
     3708                IEM_MC_STORE_GREG_I64(i64Dst, IEM_GET_MODRM_REG(pVCpu, bRm));
     3709            IEM_MC_ENDIF();
     3710
     3711            IEM_MC_ADVANCE_RIP();
     3712            IEM_MC_END();
     3713        }
     3714        else
     3715        {
     3716            /* greg64, [mem64] */
     3717            IEM_MC_BEGIN(3, 4);
     3718            IEM_MC_LOCAL(RTGCPTR,   GCPtrEffSrc);
     3719            IEM_MC_LOCAL(uint32_t,  fMxcsr);
     3720            IEM_MC_LOCAL(int64_t,   i64Dst);
     3721            IEM_MC_LOCAL(uint32_t,  u32Src);
     3722            IEM_MC_ARG_LOCAL_REF(uint32_t *,        pfMxcsr, fMxcsr,     0);
     3723            IEM_MC_ARG_LOCAL_REF(int64_t *,         pi64Dst, i64Dst,     1);
     3724            IEM_MC_ARG_LOCAL_REF(const uint32_t *,  pu32Src, u32Src,     2);
     3725
     3726            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     3727            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     3728            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     3729            IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     3730
     3731            IEM_MC_FETCH_MEM_U32(u32Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     3732            IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvttss2si_i64_r32, pfMxcsr, pi64Dst, pu32Src);
     3733            IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     3734            IEM_MC_IF_MXCSR_XCPT_PENDING()
     3735                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3736            IEM_MC_ELSE()
     3737                IEM_MC_STORE_GREG_I64(i64Dst, IEM_GET_MODRM_REG(pVCpu, bRm));
     3738            IEM_MC_ENDIF();
     3739
     3740            IEM_MC_ADVANCE_RIP();
     3741            IEM_MC_END();
     3742        }
     3743    }
     3744    else
     3745    {
     3746        if (IEM_IS_MODRM_REG_MODE(bRm))
     3747        {
     3748            /* greg, XMM */
     3749            IEM_MC_BEGIN(3, 4);
     3750            IEM_MC_LOCAL(uint32_t,  fMxcsr);
     3751            IEM_MC_LOCAL(int32_t,   i32Dst);
     3752            IEM_MC_ARG_LOCAL_REF(uint32_t *, pfMxcsr, fMxcsr,     0);
     3753            IEM_MC_ARG_LOCAL_REF(int32_t *,  pi32Dst, i32Dst,     1);
     3754            IEM_MC_ARG(const uint32_t *,     pu32Src,             2);
     3755
     3756            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     3757            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     3758            IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     3759
     3760            IEM_MC_REF_XREG_U32_CONST(pu32Src, IEM_GET_MODRM_RM(pVCpu, bRm));
     3761            IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvttss2si_i32_r32, pfMxcsr, pi32Dst, pu32Src);
     3762            IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     3763            IEM_MC_IF_MXCSR_XCPT_PENDING()
     3764                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3765            IEM_MC_ELSE()
     3766                IEM_MC_STORE_GREG_I32(i32Dst, IEM_GET_MODRM_REG(pVCpu, bRm));
     3767            IEM_MC_ENDIF();
     3768
     3769            IEM_MC_ADVANCE_RIP();
     3770            IEM_MC_END();
     3771        }
     3772        else
     3773        {
     3774            /* greg, [mem] */
     3775            IEM_MC_BEGIN(3, 4);
     3776            IEM_MC_LOCAL(RTGCPTR,   GCPtrEffSrc);
     3777            IEM_MC_LOCAL(uint32_t,  fMxcsr);
     3778            IEM_MC_LOCAL(int32_t,   i32Dst);
     3779            IEM_MC_LOCAL(uint32_t,  u32Src);
     3780            IEM_MC_ARG_LOCAL_REF(uint32_t *,        pfMxcsr, fMxcsr,     0);
     3781            IEM_MC_ARG_LOCAL_REF(int32_t *,         pi32Dst, i32Dst,     1);
     3782            IEM_MC_ARG_LOCAL_REF(const uint32_t *,  pu32Src, u32Src,     2);
     3783
     3784            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     3785            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     3786            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     3787            IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     3788
     3789            IEM_MC_FETCH_MEM_U32(u32Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     3790            IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvttss2si_i32_r32, pfMxcsr, pi32Dst, pu32Src);
     3791            IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     3792            IEM_MC_IF_MXCSR_XCPT_PENDING()
     3793                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3794            IEM_MC_ELSE()
     3795                IEM_MC_STORE_GREG_I32(i32Dst, IEM_GET_MODRM_REG(pVCpu, bRm));
     3796            IEM_MC_ENDIF();
     3797
     3798            IEM_MC_ADVANCE_RIP();
     3799            IEM_MC_END();
     3800        }
     3801    }
     3802    return VINF_SUCCESS;
     3803}
    36803804
    36813805
     
    38103934/** Opcode 0x66 0x0f 0x2d - cvtpd2pi Qpi, Wpd */
    38113935FNIEMOP_STUB(iemOp_cvtpd2pi_Qpi_Wpd);
     3936
     3937
    38123938/** Opcode 0xf3 0x0f 0x2d - cvtss2si Gy, Wss */
    3813 FNIEMOP_STUB(iemOp_cvtss2si_Gy_Wss);
     3939FNIEMOP_DEF(iemOp_cvtss2si_Gy_Wss)
     3940{
     3941    IEMOP_MNEMONIC2(RM, CVTSS2SI, cvtss2si, Gy, Wsd, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0);
     3942
     3943    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     3944    if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W)
     3945    {
     3946        if (IEM_IS_MODRM_REG_MODE(bRm))
     3947        {
     3948            /* greg64, XMM */
     3949            IEM_MC_BEGIN(3, 4);
     3950            IEM_MC_LOCAL(uint32_t,  fMxcsr);
     3951            IEM_MC_LOCAL(int64_t,   i64Dst);
     3952            IEM_MC_ARG_LOCAL_REF(uint32_t *, pfMxcsr, fMxcsr,     0);
     3953            IEM_MC_ARG_LOCAL_REF(int64_t *,  pi64Dst, i64Dst,     1);
     3954            IEM_MC_ARG(const uint32_t *,     pu32Src,             2);
     3955
     3956            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     3957            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     3958            IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     3959
     3960            IEM_MC_REF_XREG_U32_CONST(pu32Src, IEM_GET_MODRM_RM(pVCpu, bRm));
     3961            IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvtss2si_i64_r32, pfMxcsr, pi64Dst, pu32Src);
     3962            IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     3963            IEM_MC_IF_MXCSR_XCPT_PENDING()
     3964                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3965            IEM_MC_ELSE()
     3966                IEM_MC_STORE_GREG_I64(i64Dst, IEM_GET_MODRM_REG(pVCpu, bRm));
     3967            IEM_MC_ENDIF();
     3968
     3969            IEM_MC_ADVANCE_RIP();
     3970            IEM_MC_END();
     3971        }
     3972        else
     3973        {
     3974            /* greg64, [mem64] */
     3975            IEM_MC_BEGIN(3, 4);
     3976            IEM_MC_LOCAL(RTGCPTR,   GCPtrEffSrc);
     3977            IEM_MC_LOCAL(uint32_t,  fMxcsr);
     3978            IEM_MC_LOCAL(int64_t,   i64Dst);
     3979            IEM_MC_LOCAL(uint32_t,  u32Src);
     3980            IEM_MC_ARG_LOCAL_REF(uint32_t *,        pfMxcsr, fMxcsr,     0);
     3981            IEM_MC_ARG_LOCAL_REF(int64_t *,         pi64Dst, i64Dst,     1);
     3982            IEM_MC_ARG_LOCAL_REF(const uint32_t *,  pu32Src, u32Src,     2);
     3983
     3984            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     3985            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     3986            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     3987            IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     3988
     3989            IEM_MC_FETCH_MEM_U32(u32Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     3990            IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvtss2si_i64_r32, pfMxcsr, pi64Dst, pu32Src);
     3991            IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     3992            IEM_MC_IF_MXCSR_XCPT_PENDING()
     3993                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3994            IEM_MC_ELSE()
     3995                IEM_MC_STORE_GREG_I64(i64Dst, IEM_GET_MODRM_REG(pVCpu, bRm));
     3996            IEM_MC_ENDIF();
     3997
     3998            IEM_MC_ADVANCE_RIP();
     3999            IEM_MC_END();
     4000        }
     4001    }
     4002    else
     4003    {
     4004        if (IEM_IS_MODRM_REG_MODE(bRm))
     4005        {
     4006            /* greg, XMM */
     4007            IEM_MC_BEGIN(3, 4);
     4008            IEM_MC_LOCAL(uint32_t,  fMxcsr);
     4009            IEM_MC_LOCAL(int32_t,   i32Dst);
     4010            IEM_MC_ARG_LOCAL_REF(uint32_t *, pfMxcsr, fMxcsr,     0);
     4011            IEM_MC_ARG_LOCAL_REF(int32_t *,  pi32Dst, i32Dst,     1);
     4012            IEM_MC_ARG(const uint32_t *,     pu32Src,             2);
     4013
     4014            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     4015            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     4016            IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     4017
     4018            IEM_MC_REF_XREG_U32_CONST(pu32Src, IEM_GET_MODRM_RM(pVCpu, bRm));
     4019            IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvtss2si_i32_r32, pfMxcsr, pi32Dst, pu32Src);
     4020            IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     4021            IEM_MC_IF_MXCSR_XCPT_PENDING()
     4022                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4023            IEM_MC_ELSE()
     4024                IEM_MC_STORE_GREG_I32(i32Dst, IEM_GET_MODRM_REG(pVCpu, bRm));
     4025            IEM_MC_ENDIF();
     4026
     4027            IEM_MC_ADVANCE_RIP();
     4028            IEM_MC_END();
     4029        }
     4030        else
     4031        {
     4032            /* greg, [mem] */
     4033            IEM_MC_BEGIN(3, 4);
     4034            IEM_MC_LOCAL(RTGCPTR,   GCPtrEffSrc);
     4035            IEM_MC_LOCAL(uint32_t,  fMxcsr);
     4036            IEM_MC_LOCAL(int32_t,   i32Dst);
     4037            IEM_MC_LOCAL(uint32_t,  u32Src);
     4038            IEM_MC_ARG_LOCAL_REF(uint32_t *,        pfMxcsr, fMxcsr,     0);
     4039            IEM_MC_ARG_LOCAL_REF(int32_t *,         pi32Dst, i32Dst,     1);
     4040            IEM_MC_ARG_LOCAL_REF(const uint32_t *,  pu32Src, u32Src,     2);
     4041
     4042            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     4043            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     4044            IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT();
     4045            IEM_MC_PREPARE_SSE_USAGE(); /** @todo: This is superfluous because IEM_MC_CALL_SSE_AIMPL_3() is calling this but the tstIEMCheckMc testcase depends on it. */
     4046
     4047            IEM_MC_FETCH_MEM_U32(u32Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     4048            IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvtss2si_i32_r32, pfMxcsr, pi32Dst, pu32Src);
     4049            IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     4050            IEM_MC_IF_MXCSR_XCPT_PENDING()
     4051                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     4052            IEM_MC_ELSE()
     4053                IEM_MC_STORE_GREG_I32(i32Dst, IEM_GET_MODRM_REG(pVCpu, bRm));
     4054            IEM_MC_ENDIF();
     4055
     4056            IEM_MC_ADVANCE_RIP();
     4057            IEM_MC_END();
     4058        }
     4059    }
     4060    return VINF_SUCCESS;
     4061}
    38144062
    38154063
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r96726 r96731  
    22982298typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLSSEF2I64U64,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, int64_t *pi64Dst, const uint64_t *pu64Src)); /* pu64Src is a double precision floating point. */
    22992299typedef FNIEMAIMPLSSEF2I64U64 *PFNIEMAIMPLSSEF2I64U64;
     2300typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLSSEF2I32U32,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, int32_t *pi32Dst, const uint32_t *pu32Src)); /* pu32Src is a single precision floating point. */
     2301typedef FNIEMAIMPLSSEF2I32U32 *PFNIEMAIMPLSSEF2I32U32;
     2302typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLSSEF2I64U32,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, int64_t *pi64Dst, const uint32_t *pu32Src)); /* pu32Src is a single precision floating point. */
     2303typedef FNIEMAIMPLSSEF2I64U32 *PFNIEMAIMPLSSEF2I64U32;
    23002304
    23012305FNIEMAIMPLSSEF2I32U64 iemAImpl_cvttsd2si_i32_r64;
     
    23042308FNIEMAIMPLSSEF2I64U64 iemAImpl_cvttsd2si_i64_r64;
    23052309FNIEMAIMPLSSEF2I64U64 iemAImpl_cvtsd2si_i64_r64;
     2310
     2311FNIEMAIMPLSSEF2I32U32 iemAImpl_cvttss2si_i32_r32;
     2312FNIEMAIMPLSSEF2I32U32 iemAImpl_cvtss2si_i32_r32;
     2313
     2314FNIEMAIMPLSSEF2I64U32 iemAImpl_cvttss2si_i64_r32;
     2315FNIEMAIMPLSSEF2I64U32 iemAImpl_cvtss2si_i64_r32;
    23062316
    23072317/** @} */
  • trunk/src/VBox/VMM/include/IEMMc.h

    r96723 r96731  
    477477#define IEM_MC_REF_XREG_XMM_CONST(a_pXmmDst, a_iXReg) \
    478478    (a_pXmmDst) = (&pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)])
     479#define IEM_MC_REF_XREG_U32_CONST(a_pu32Dst, a_iXReg) \
     480    (a_pu32Dst) = ((uint32_t const *)&pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au32[0])
    479481#define IEM_MC_REF_XREG_U64_CONST(a_pu64Dst, a_iXReg) \
    480482    (a_pu64Dst) = ((uint64_t const *)&pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].au64[0])
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r96723 r96731  
    742742#define IEM_MC_REF_XREG_U128(a_pu128Dst, a_iXReg)           do { (a_pu128Dst) = (PRTUINT128U)((uintptr_t)0);        CHK_PTYPE(PRTUINT128U, a_pu128Dst);     (void)fSseWrite; (void)fMcBegin; } while (0)
    743743#define IEM_MC_REF_XREG_U128_CONST(a_pu128Dst, a_iXReg)     do { (a_pu128Dst) = (PCRTUINT128U)((uintptr_t)0);       CHK_PTYPE(PCRTUINT128U, a_pu128Dst);    (void)fSseWrite; (void)fMcBegin; } while (0)
     744#define IEM_MC_REF_XREG_U32_CONST(a_pu32Dst, a_iXReg)       do { (a_pu32Dst)  = (uint32_t const *)((uintptr_t)0);   CHK_PTYPE(uint32_t const *, a_pu32Dst); (void)fSseWrite; (void)fMcBegin; } while (0)
    744745#define IEM_MC_REF_XREG_U64_CONST(a_pu64Dst, a_iXReg)       do { (a_pu64Dst)  = (uint64_t const *)((uintptr_t)0);   CHK_PTYPE(uint64_t const *, a_pu64Dst); (void)fSseWrite; (void)fMcBegin; } while (0)
    745746#define IEM_MC_REF_XREG_R32_CONST(a_pr32Dst, a_iXReg)       do { (a_pr32Dst)  = (RTFLOAT32U const *)((uintptr_t)0); CHK_PTYPE(RTFLOAT32U const *, a_pr32Dst); (void)fSseWrite; (void)fMcBegin; } while (0)
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