- Timestamp:
- Sep 28, 2022 12:53:09 PM (2 years ago)
- svn:sync-xref-src-repo-rev:
- 153827
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm
r96796 r96916 6060 6060 IEMIMPL_MEDIA_SSE_INSN_IMM8_MXCSR_5 cmpss 6061 6061 IEMIMPL_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 6075 BEGINPROC_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 6087 ENDPROC iemAImpl_ %+ %1 %+ _u128 6088 %endmacro 6089 6090 IEMIMPL_MEDIA_SSE_MXCSR_I64_U128 cvtpd2pi 6091 IEMIMPL_MEDIA_SSE_MXCSR_I64_U128 cvttpd2pi -
trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp
r96895 r96916 16747 16747 } 16748 16748 #endif 16749 16750 16751 /** 16752 * CVTPD2PI 16753 */ 16754 #ifdef IEM_WITHOUT_ASSEMBLY 16755 static 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 16766 IEM_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 16782 static 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 16793 IEM_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 3943 3943 /** Opcode 0x0f 0x2c - cvttps2pi Ppi, Wps */ 3944 3944 FNIEMOP_STUB(iemOp_cvttps2pi_Ppi_Wps); 3945 3946 3945 3947 /** Opcode 0x66 0x0f 0x2c - cvttpd2pi Ppi, Wpd */ 3946 FNIEMOP_STUB(iemOp_cvttpd2pi_Ppi_Wpd); 3948 FNIEMOP_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 } 3947 4016 3948 4017 … … 4201 4270 /** Opcode 0x0f 0x2d - cvtps2pi Ppi, Wps */ 4202 4271 FNIEMOP_STUB(iemOp_cvtps2pi_Ppi_Wps); 4272 4273 4203 4274 /** Opcode 0x66 0x0f 0x2d - cvtpd2pi Qpi, Wpd */ 4204 FNIEMOP_STUB(iemOp_cvtpd2pi_Qpi_Wpd); 4275 FNIEMOP_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 } 4205 4343 4206 4344 -
trunk/src/VBox/VMM/include/IEMInternal.h
r96811 r96916 2367 2367 FNIEMAIMPLMXCSRF2XMMIMM8 iemAImpl_cmpss_u128; 2368 2368 FNIEMAIMPLMXCSRF2XMMIMM8 iemAImpl_cmpsd_u128; 2369 2370 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLMXCSRU64U128,(uint32_t *pfMxcsr, uint64_t *pu64Dst, PCX86XMMREG pSrc)); 2371 typedef FNIEMAIMPLMXCSRU64U128 *PFNIEMAIMPLMXCSRU64U128; 2372 2373 FNIEMAIMPLMXCSRU64U128 iemAImpl_cvtpd2pi_u128; 2374 FNIEMAIMPLMXCSRU64U128 iemAImpl_cvttpd2pi_u128; 2369 2375 2370 2376 /** @} */
Note:
See TracChangeset
for help on using the changeset viewer.