VirtualBox

Changeset 96726 in vbox for trunk/src/VBox


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

VMM/IEM: Implement cvtsd2si instruction, bugref:9898

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

Legend:

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

    r96723 r96726  
    55465546        EPILOGUE_4_ARGS
    55475547ENDPROC iemAImpl_cvttsd2si_i64_r64
     5548
     5549
     5550;;
     5551; cvtsd2si instruction - 32-bit variant.
     5552;
     5553; @param    A0      FPU context (FXSTATE or XSAVEAREA).
     5554; @param    A1      Where to return the MXCSR value.
     5555; @param    A2      Pointer to the result operand (output).
     5556; @param    A3      Pointer to the second operand (input).
     5557;
     5558BEGINPROC_FASTCALL iemAImpl_cvtsd2si_i32_r64, 16
     5559        PROLOGUE_4_ARGS
     5560        IEMIMPL_SSE_PROLOGUE
     5561        SSE_LD_FXSTATE_MXCSR A0
     5562
     5563        cvtsd2si  T0_32, [A3]
     5564        mov       dword [A2], T0_32
     5565
     5566        SSE_ST_FXSTATE_MXCSR_ONLY A1, A0
     5567        IEMIMPL_SSE_PROLOGUE
     5568        EPILOGUE_4_ARGS
     5569ENDPROC iemAImpl_cvtsd2si_i32_r64
     5570
     5571;;
     5572; cvtsd2si instruction - 64-bit variant.
     5573;
     5574; @param    A0      FPU context (FXSTATE or XSAVEAREA).
     5575; @param    A1      Where to return the MXCSR value.
     5576; @param    A2      Pointer to the result operand (output).
     5577; @param    A3      Pointer to the second operand (input).
     5578;
     5579BEGINPROC_FASTCALL iemAImpl_cvtsd2si_i64_r64, 16
     5580        PROLOGUE_4_ARGS
     5581        IEMIMPL_SSE_PROLOGUE
     5582        SSE_LD_FXSTATE_MXCSR A0
     5583
     5584        cvtsd2si  T0, [A3]
     5585        mov       qword [A2], T0
     5586
     5587        SSE_ST_FXSTATE_MXCSR_ONLY A1, A0
     5588        IEMIMPL_SSE_PROLOGUE
     5589        EPILOGUE_4_ARGS
     5590ENDPROC iemAImpl_cvtsd2si_i64_r64
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r96725 r96726  
    1603016030}
    1603116031#endif
     16032
     16033
     16034/**
     16035 * CVTSD2SI
     16036 */
     16037#ifdef IEM_WITHOUT_ASSEMBLY
     16038IEM_DECL_IMPL_DEF(void, iemAImpl_cvtsd2si_i32_r64,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, int32_t *pi32Dst, const uint64_t *pu64Src))
     16039{
     16040    RTFLOAT64U r64Src;
     16041
     16042    r64Src.u = *pu64Src;
     16043    iemSsePrepareValueR64(&r64Src, pFpuState->MXCSR, &r64Src); /* The de-normal flag is not set. */
     16044
     16045    softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(pFpuState->MXCSR);
     16046    *pi32Dst = f64_to_i32(iemFpSoftF64FromIprt(&r64Src), SoftState.roundingMode, true /*exact*/, &SoftState);
     16047    *pfMxcsr = pFpuState->MXCSR | (SoftState.exceptionFlags & X86_MXCSR_XCPT_FLAGS);
     16048}
     16049
     16050
     16051IEM_DECL_IMPL_DEF(void, iemAImpl_cvtsd2si_i64_r64,(PCX86FXSTATE pFpuState, uint32_t *pfMxcsr, int64_t *pi64Dst, const uint64_t *pu64Src))
     16052{
     16053    RTFLOAT64U r64Src;
     16054
     16055    r64Src.u = *pu64Src;
     16056    iemSsePrepareValueR64(&r64Src, pFpuState->MXCSR, &r64Src); /* The de-normal flag is not set. */
     16057
     16058    softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(pFpuState->MXCSR);
     16059    *pi64Dst = f64_to_i64(iemFpSoftF64FromIprt(&r64Src), SoftState.roundingMode, true /*exact*/, &SoftState);
     16060    *pfMxcsr = pFpuState->MXCSR | (SoftState.exceptionFlags & X86_MXCSR_XCPT_FLAGS);
     16061}
     16062#endif
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r96723 r96726  
    38123812/** Opcode 0xf3 0x0f 0x2d - cvtss2si Gy, Wss */
    38133813FNIEMOP_STUB(iemOp_cvtss2si_Gy_Wss);
     3814
     3815
    38143816/** Opcode 0xf2 0x0f 0x2d - cvtsd2si Gy, Wsd */
    3815 FNIEMOP_STUB(iemOp_cvtsd2si_Gy_Wsd);
     3817FNIEMOP_DEF(iemOp_cvtsd2si_Gy_Wsd)
     3818{
     3819    IEMOP_MNEMONIC2(RM, CVTSD2SI, cvtsd2si, Gy, Wsd, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0);
     3820
     3821    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     3822    if (pVCpu->iem.s.fPrefixes & IEM_OP_PRF_SIZE_REX_W)
     3823    {
     3824        if (IEM_IS_MODRM_REG_MODE(bRm))
     3825        {
     3826            /* greg64, XMM */
     3827            IEM_MC_BEGIN(3, 4);
     3828            IEM_MC_LOCAL(uint32_t,  fMxcsr);
     3829            IEM_MC_LOCAL(int64_t,   i64Dst);
     3830            IEM_MC_ARG_LOCAL_REF(uint32_t *, pfMxcsr, fMxcsr,     0);
     3831            IEM_MC_ARG_LOCAL_REF(int64_t *,  pi64Dst, i64Dst,     1);
     3832            IEM_MC_ARG(const uint64_t *,     pu64Src,             2);
     3833
     3834            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     3835            IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     3836            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. */
     3837
     3838            IEM_MC_REF_XREG_U64_CONST(pu64Src, IEM_GET_MODRM_RM(pVCpu, bRm));
     3839            IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvtsd2si_i64_r64, pfMxcsr, pi64Dst, pu64Src);
     3840            IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     3841            IEM_MC_IF_MXCSR_XCPT_PENDING()
     3842                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3843            IEM_MC_ELSE()
     3844                IEM_MC_STORE_GREG_I64(i64Dst, IEM_GET_MODRM_REG(pVCpu, bRm));
     3845            IEM_MC_ENDIF();
     3846
     3847            IEM_MC_ADVANCE_RIP();
     3848            IEM_MC_END();
     3849        }
     3850        else
     3851        {
     3852            /* greg64, [mem64] */
     3853            IEM_MC_BEGIN(3, 4);
     3854            IEM_MC_LOCAL(RTGCPTR,   GCPtrEffSrc);
     3855            IEM_MC_LOCAL(uint32_t,  fMxcsr);
     3856            IEM_MC_LOCAL(int64_t,   i64Dst);
     3857            IEM_MC_LOCAL(uint64_t,  u64Src);
     3858            IEM_MC_ARG_LOCAL_REF(uint32_t *,        pfMxcsr, fMxcsr,     0);
     3859            IEM_MC_ARG_LOCAL_REF(int64_t *,         pi64Dst, i64Dst,     1);
     3860            IEM_MC_ARG_LOCAL_REF(const uint64_t *,  pu64Src, u64Src,     2);
     3861
     3862            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     3863            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     3864            IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     3865            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. */
     3866
     3867            IEM_MC_FETCH_MEM_U64(u64Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     3868            IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvtsd2si_i64_r64, pfMxcsr, pi64Dst, pu64Src);
     3869            IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     3870            IEM_MC_IF_MXCSR_XCPT_PENDING()
     3871                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3872            IEM_MC_ELSE()
     3873                IEM_MC_STORE_GREG_I64(i64Dst, IEM_GET_MODRM_REG(pVCpu, bRm));
     3874            IEM_MC_ENDIF();
     3875
     3876            IEM_MC_ADVANCE_RIP();
     3877            IEM_MC_END();
     3878        }
     3879    }
     3880    else
     3881    {
     3882        if (IEM_IS_MODRM_REG_MODE(bRm))
     3883        {
     3884            /* greg, XMM */
     3885            IEM_MC_BEGIN(3, 4);
     3886            IEM_MC_LOCAL(uint32_t,  fMxcsr);
     3887            IEM_MC_LOCAL(int32_t,   i32Dst);
     3888            IEM_MC_ARG_LOCAL_REF(uint32_t *, pfMxcsr, fMxcsr,     0);
     3889            IEM_MC_ARG_LOCAL_REF(int32_t *,  pi32Dst, i32Dst,     1);
     3890            IEM_MC_ARG(const uint64_t *,     pu64Src,             2);
     3891
     3892            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     3893            IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     3894            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. */
     3895
     3896            IEM_MC_REF_XREG_U64_CONST(pu64Src, IEM_GET_MODRM_RM(pVCpu, bRm));
     3897            IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvtsd2si_i32_r64, pfMxcsr, pi32Dst, pu64Src);
     3898            IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     3899            IEM_MC_IF_MXCSR_XCPT_PENDING()
     3900                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3901            IEM_MC_ELSE()
     3902                IEM_MC_STORE_GREG_I32(i32Dst, IEM_GET_MODRM_REG(pVCpu, bRm));
     3903            IEM_MC_ENDIF();
     3904
     3905            IEM_MC_ADVANCE_RIP();
     3906            IEM_MC_END();
     3907        }
     3908        else
     3909        {
     3910            /* greg, [mem] */
     3911            IEM_MC_BEGIN(3, 4);
     3912            IEM_MC_LOCAL(RTGCPTR,   GCPtrEffSrc);
     3913            IEM_MC_LOCAL(uint32_t,  fMxcsr);
     3914            IEM_MC_LOCAL(int32_t,   i32Dst);
     3915            IEM_MC_LOCAL(uint64_t,  u64Src);
     3916            IEM_MC_ARG_LOCAL_REF(uint32_t *,        pfMxcsr, fMxcsr,     0);
     3917            IEM_MC_ARG_LOCAL_REF(int32_t *,         pi32Dst, i32Dst,     1);
     3918            IEM_MC_ARG_LOCAL_REF(const uint64_t *,  pu64Src, u64Src,     2);
     3919
     3920            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0);
     3921            IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
     3922            IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT();
     3923            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. */
     3924
     3925            IEM_MC_FETCH_MEM_U64(u64Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc);
     3926            IEM_MC_CALL_SSE_AIMPL_3(iemAImpl_cvtsd2si_i32_r64, pfMxcsr, pi32Dst, pu64Src);
     3927            IEM_MC_SSE_UPDATE_MXCSR(fMxcsr);
     3928            IEM_MC_IF_MXCSR_XCPT_PENDING()
     3929                IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT();
     3930            IEM_MC_ELSE()
     3931                IEM_MC_STORE_GREG_I32(i32Dst, IEM_GET_MODRM_REG(pVCpu, bRm));
     3932            IEM_MC_ENDIF();
     3933
     3934            IEM_MC_ADVANCE_RIP();
     3935            IEM_MC_END();
     3936        }
     3937    }
     3938    return VINF_SUCCESS;
     3939}
    38163940
    38173941/** Opcode      0x0f 0x2e - ucomiss Vss, Wss */
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r96723 r96726  
    23002300
    23012301FNIEMAIMPLSSEF2I32U64 iemAImpl_cvttsd2si_i32_r64;
     2302FNIEMAIMPLSSEF2I32U64 iemAImpl_cvtsd2si_i32_r64;
     2303
    23022304FNIEMAIMPLSSEF2I64U64 iemAImpl_cvttsd2si_i64_r64;
     2305FNIEMAIMPLSSEF2I64U64 iemAImpl_cvtsd2si_i64_r64;
    23032306
    23042307/** @} */
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