- Timestamp:
- Sep 29, 2022 9:55:19 AM (2 years ago)
- svn:sync-xref-src-repo-rev:
- 153841
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm
r96921 r96930 6093 6093 ;; 6094 6094 ; SSE instructions of the form 6095 ; xxx mm, xmm/m64.6095 ; xxx xmm, xmm/m64. 6096 6096 ; and we need to load and save the MXCSR register. 6097 6097 ; … … 6121 6121 IEMIMPL_MEDIA_SSE_MXCSR_U128_U64 cvtpi2ps 6122 6122 IEMIMPL_MEDIA_SSE_MXCSR_U128_U64 cvtpi2pd 6123 6124 ;; 6125 ; SSE instructions of the form 6126 ; xxx mm, xmm/m64. 6127 ; and we need to load and save the MXCSR register. 6128 ; 6129 ; @param 1 The instruction name. 6130 ; 6131 ; @param A0 Pointer to the MXCSR value (input/output). 6132 ; @param A1 Pointer to the first MMX media register sized operand (output). 6133 ; @param A2 The 64bit source value (input). 6134 ; 6135 %macro IEMIMPL_MEDIA_SSE_MXCSR_U64_U64 1 6136 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u128, 16 6137 PROLOGUE_3_ARGS 6138 IEMIMPL_SSE_PROLOGUE 6139 SSE_LD_FXSTATE_MXCSR_ONLY A0 6140 6141 movq xmm0, A2 6142 %1 mm0, xmm0 6143 movq [A1], mm0 6144 6145 SSE_ST_FXSTATE_MXCSR_ONLY_NO_FXSTATE A0 6146 IEMIMPL_SSE_EPILOGUE 6147 EPILOGUE_3_ARGS 6148 ENDPROC iemAImpl_ %+ %1 %+ _u128 6149 %endmacro 6150 6151 IEMIMPL_MEDIA_SSE_MXCSR_U64_U64 cvtps2pi 6152 IEMIMPL_MEDIA_SSE_MXCSR_U64_U64 cvttps2pi -
trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp
r96921 r96930 16845 16845 } 16846 16846 #endif 16847 16848 16849 /** 16850 * CVTPS2PI 16851 */ 16852 #ifdef IEM_WITHOUT_ASSEMBLY 16853 static uint32_t iemAImpl_cvtps2pi_u128_worker(uint32_t fMxcsr, int32_t *pi32Dst, PCRTFLOAT32U pr32Src) 16854 { 16855 RTFLOAT32U r32Src; 16856 iemSsePrepareValueR32(&r32Src, fMxcsr, pr32Src); /* The de-normal flag is not set. */ 16857 16858 softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(fMxcsr); 16859 *pi32Dst = f32_to_i32(iemFpSoftF32FromIprt(&r32Src), SoftState.roundingMode, true /*exact*/, &SoftState); 16860 return fMxcsr | (SoftState.exceptionFlags & X86_MXCSR_XCPT_FLAGS); 16861 } 16862 16863 16864 IEM_DECL_IMPL_DEF(void, iemAImpl_cvtps2pi_u128,(uint32_t *pfMxcsr, uint64_t *pu64Dst, uint64_t u64Src)) 16865 { 16866 RTUINT64U uDst; 16867 RTUINT64U uSrc = { u64Src }; 16868 uint32_t fMxcsrOut = iemAImpl_cvtps2pi_u128_worker(*pfMxcsr, &uDst.ai32[0], (PCRTFLOAT32U)&uSrc.au32[0]); 16869 fMxcsrOut |= iemAImpl_cvtps2pi_u128_worker(*pfMxcsr, &uDst.ai32[1], (PCRTFLOAT32U)&uSrc.au32[1]); 16870 *pu64Dst = uDst.u; 16871 *pfMxcsr = fMxcsrOut; 16872 } 16873 #endif 16874 16875 16876 /** 16877 * CVTTPS2PI 16878 */ 16879 #ifdef IEM_WITHOUT_ASSEMBLY 16880 static uint32_t iemAImpl_cvttps2pi_u128_worker(uint32_t fMxcsr, int32_t *pi32Dst, PCRTFLOAT32U pr32Src) 16881 { 16882 RTFLOAT32U r32Src; 16883 iemSsePrepareValueR32(&r32Src, fMxcsr, pr32Src); /* The de-normal flag is not set. */ 16884 16885 softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(fMxcsr); 16886 *pi32Dst = f32_to_i32_r_minMag(iemFpSoftF32FromIprt(&r32Src), true /*exact*/, &SoftState); 16887 return fMxcsr | (SoftState.exceptionFlags & X86_MXCSR_XCPT_FLAGS); 16888 } 16889 16890 16891 IEM_DECL_IMPL_DEF(void, iemAImpl_cvttps2pi_u128,(uint32_t *pfMxcsr, uint64_t *pu64Dst, uint64_t u64Src)) 16892 { 16893 RTUINT64U uDst; 16894 RTUINT64U uSrc = { u64Src }; 16895 uint32_t fMxcsrOut = iemAImpl_cvttps2pi_u128_worker(*pfMxcsr, &uDst.ai32[0], (PCRTFLOAT32U)&uSrc.au32[0]); 16896 fMxcsrOut |= iemAImpl_cvttps2pi_u128_worker(*pfMxcsr, &uDst.ai32[1], (PCRTFLOAT32U)&uSrc.au32[1]); 16897 *pu64Dst = uDst.u; 16898 *pfMxcsr = fMxcsrOut; 16899 } 16900 #endif -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h
r96921 r96930 4075 4075 4076 4076 /** Opcode 0x0f 0x2c - cvttps2pi Ppi, Wps */ 4077 FNIEMOP_STUB(iemOp_cvttps2pi_Ppi_Wps); 4077 FNIEMOP_DEF(iemOp_cvttps2pi_Ppi_Wps) 4078 { 4079 IEMOP_MNEMONIC2(RM, CVTTPS2PI, cvttps2pi, Pq, Wps, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0); /// @todo 4080 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 4081 if (IEM_IS_MODRM_REG_MODE(bRm)) 4082 { 4083 /* 4084 * Register, register. 4085 */ 4086 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 4087 4088 IEM_MC_BEGIN(3, 1); 4089 IEM_MC_ARG(uint32_t *, pfMxcsr, 0); 4090 IEM_MC_LOCAL(uint64_t, u64Dst); 4091 IEM_MC_ARG_LOCAL_REF(uint64_t *, pu64Dst, u64Dst, 1); 4092 IEM_MC_ARG(uint64_t, u64Src, 2); 4093 IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT(); 4094 IEM_MC_PREPARE_FPU_USAGE(); 4095 IEM_MC_FPU_TO_MMX_MODE(); 4096 4097 IEM_MC_REF_MXCSR(pfMxcsr); 4098 IEM_MC_FETCH_XREG_U64(u64Src, IEM_GET_MODRM_RM(pVCpu, bRm)); 4099 4100 IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_cvttps2pi_u128, pfMxcsr, pu64Dst, u64Src); 4101 IEM_MC_IF_MXCSR_XCPT_PENDING() 4102 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT(); 4103 IEM_MC_ELSE() 4104 IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_RM(pVCpu, bRm), u64Dst); 4105 IEM_MC_ENDIF(); 4106 4107 IEM_MC_ADVANCE_RIP(); 4108 IEM_MC_END(); 4109 } 4110 else 4111 { 4112 /* 4113 * Register, memory. 4114 */ 4115 IEM_MC_BEGIN(3, 2); 4116 IEM_MC_ARG(uint32_t *, pfMxcsr, 0); 4117 IEM_MC_LOCAL(uint64_t, u64Dst); 4118 IEM_MC_ARG_LOCAL_REF(uint64_t *, pu64Dst, u64Dst, 1); 4119 IEM_MC_ARG(uint64_t, u64Src, 2); 4120 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 4121 4122 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); 4123 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 4124 IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT(); 4125 IEM_MC_FETCH_MEM_U64(u64Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 4126 4127 IEM_MC_PREPARE_FPU_USAGE(); 4128 IEM_MC_FPU_TO_MMX_MODE(); 4129 IEM_MC_REF_MXCSR(pfMxcsr); 4130 4131 IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_cvttps2pi_u128, pfMxcsr, pu64Dst, u64Src); 4132 IEM_MC_IF_MXCSR_XCPT_PENDING() 4133 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT(); 4134 IEM_MC_ELSE() 4135 IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_RM(pVCpu, bRm), u64Dst); 4136 IEM_MC_ENDIF(); 4137 4138 IEM_MC_ADVANCE_RIP(); 4139 IEM_MC_END(); 4140 } 4141 return VINF_SUCCESS; 4142 } 4078 4143 4079 4144 … … 4402 4467 4403 4468 /** Opcode 0x0f 0x2d - cvtps2pi Ppi, Wps */ 4404 FNIEMOP_STUB(iemOp_cvtps2pi_Ppi_Wps); 4469 FNIEMOP_DEF(iemOp_cvtps2pi_Ppi_Wps) 4470 { 4471 IEMOP_MNEMONIC2(RM, CVTPS2PI, cvtps2pi, Pq, Wps, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0); /// @todo 4472 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 4473 if (IEM_IS_MODRM_REG_MODE(bRm)) 4474 { 4475 /* 4476 * Register, register. 4477 */ 4478 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 4479 4480 IEM_MC_BEGIN(3, 1); 4481 IEM_MC_ARG(uint32_t *, pfMxcsr, 0); 4482 IEM_MC_LOCAL(uint64_t, u64Dst); 4483 IEM_MC_ARG_LOCAL_REF(uint64_t *, pu64Dst, u64Dst, 1); 4484 IEM_MC_ARG(uint64_t, u64Src, 2); 4485 IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT(); 4486 IEM_MC_PREPARE_FPU_USAGE(); 4487 IEM_MC_FPU_TO_MMX_MODE(); 4488 4489 IEM_MC_REF_MXCSR(pfMxcsr); 4490 IEM_MC_FETCH_XREG_U64(u64Src, IEM_GET_MODRM_RM(pVCpu, bRm)); 4491 4492 IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_cvtps2pi_u128, pfMxcsr, pu64Dst, u64Src); 4493 IEM_MC_IF_MXCSR_XCPT_PENDING() 4494 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT(); 4495 IEM_MC_ELSE() 4496 IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_RM(pVCpu, bRm), u64Dst); 4497 IEM_MC_ENDIF(); 4498 4499 IEM_MC_ADVANCE_RIP(); 4500 IEM_MC_END(); 4501 } 4502 else 4503 { 4504 /* 4505 * Register, memory. 4506 */ 4507 IEM_MC_BEGIN(3, 2); 4508 IEM_MC_ARG(uint32_t *, pfMxcsr, 0); 4509 IEM_MC_LOCAL(uint64_t, u64Dst); 4510 IEM_MC_ARG_LOCAL_REF(uint64_t *, pu64Dst, u64Dst, 1); 4511 IEM_MC_ARG(uint64_t, u64Src, 2); 4512 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 4513 4514 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); 4515 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 4516 IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT(); 4517 IEM_MC_FETCH_MEM_U64(u64Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 4518 4519 IEM_MC_PREPARE_FPU_USAGE(); 4520 IEM_MC_FPU_TO_MMX_MODE(); 4521 IEM_MC_REF_MXCSR(pfMxcsr); 4522 4523 IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_cvtps2pi_u128, pfMxcsr, pu64Dst, u64Src); 4524 IEM_MC_IF_MXCSR_XCPT_PENDING() 4525 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT(); 4526 IEM_MC_ELSE() 4527 IEM_MC_STORE_MREG_U64(IEM_GET_MODRM_RM(pVCpu, bRm), u64Dst); 4528 IEM_MC_ENDIF(); 4529 4530 IEM_MC_ADVANCE_RIP(); 4531 IEM_MC_END(); 4532 } 4533 return VINF_SUCCESS; 4534 } 4405 4535 4406 4536 -
trunk/src/VBox/VMM/include/IEMInternal.h
r96921 r96930 2379 2379 FNIEMAIMPLMXCSRU128U64 iemAImpl_cvtpi2ps_u128; 2380 2380 FNIEMAIMPLMXCSRU128U64 iemAImpl_cvtpi2pd_u128; 2381 2382 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLMXCSRU64U64,(uint32_t *pfMxcsr, uint64_t *pu64Dst, uint64_t u64Src)); 2383 typedef FNIEMAIMPLMXCSRU64U64 *PFNIEMAIMPLMXCSRU64U64; 2384 2385 FNIEMAIMPLMXCSRU64U64 iemAImpl_cvtps2pi_u128; 2386 FNIEMAIMPLMXCSRU64U64 iemAImpl_cvttps2pi_u128; 2381 2387 2382 2388 /** @} */
Note:
See TracChangeset
for help on using the changeset viewer.