Changeset 96726 in vbox for trunk/src/VBox
- Timestamp:
- Sep 14, 2022 7:53:21 AM (2 years ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm
r96723 r96726 5546 5546 EPILOGUE_4_ARGS 5547 5547 ENDPROC 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 ; 5558 BEGINPROC_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 5569 ENDPROC 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 ; 5579 BEGINPROC_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 5590 ENDPROC iemAImpl_cvtsd2si_i64_r64 -
trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp
r96725 r96726 16030 16030 } 16031 16031 #endif 16032 16033 16034 /** 16035 * CVTSD2SI 16036 */ 16037 #ifdef IEM_WITHOUT_ASSEMBLY 16038 IEM_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 16051 IEM_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 3812 3812 /** Opcode 0xf3 0x0f 0x2d - cvtss2si Gy, Wss */ 3813 3813 FNIEMOP_STUB(iemOp_cvtss2si_Gy_Wss); 3814 3815 3814 3816 /** Opcode 0xf2 0x0f 0x2d - cvtsd2si Gy, Wsd */ 3815 FNIEMOP_STUB(iemOp_cvtsd2si_Gy_Wsd); 3817 FNIEMOP_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 } 3816 3940 3817 3941 /** Opcode 0x0f 0x2e - ucomiss Vss, Wss */ -
trunk/src/VBox/VMM/include/IEMInternal.h
r96723 r96726 2300 2300 2301 2301 FNIEMAIMPLSSEF2I32U64 iemAImpl_cvttsd2si_i32_r64; 2302 FNIEMAIMPLSSEF2I32U64 iemAImpl_cvtsd2si_i32_r64; 2303 2302 2304 FNIEMAIMPLSSEF2I64U64 iemAImpl_cvttsd2si_i64_r64; 2305 FNIEMAIMPLSSEF2I64U64 iemAImpl_cvtsd2si_i64_r64; 2303 2306 2304 2307 /** @} */
Note:
See TracChangeset
for help on using the changeset viewer.