Changeset 96921 in vbox
- Timestamp:
- Sep 28, 2022 7:22:51 PM (2 years ago)
- svn:sync-xref-src-repo-rev:
- 153832
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm ¶
r96916 r96921 6090 6090 IEMIMPL_MEDIA_SSE_MXCSR_I64_U128 cvtpd2pi 6091 6091 IEMIMPL_MEDIA_SSE_MXCSR_I64_U128 cvttpd2pi 6092 6093 ;; 6094 ; SSE instructions of the form 6095 ; xxx mm, xmm/m64. 6096 ; and we need to load and save the MXCSR register. 6097 ; 6098 ; @param 1 The instruction name. 6099 ; 6100 ; @param A0 Pointer to the MXCSR value (input/output). 6101 ; @param A1 Pointer to the first media register sized operand (input/output). 6102 ; @param A2 The 64bit source value from a MMX media register (input) 6103 ; 6104 %macro IEMIMPL_MEDIA_SSE_MXCSR_U128_U64 1 6105 BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u128, 16 6106 PROLOGUE_3_ARGS 6107 IEMIMPL_SSE_PROLOGUE 6108 SSE_LD_FXSTATE_MXCSR_ONLY A0 6109 6110 movdqu xmm0, [A1] 6111 movq mm0, A2 6112 %1 xmm0, mm0 6113 movdqu [A1], xmm0 6114 6115 SSE_ST_FXSTATE_MXCSR_ONLY_NO_FXSTATE A0 6116 IEMIMPL_SSE_EPILOGUE 6117 EPILOGUE_3_ARGS 6118 ENDPROC iemAImpl_ %+ %1 %+ _u128 6119 %endmacro 6120 6121 IEMIMPL_MEDIA_SSE_MXCSR_U128_U64 cvtpi2ps 6122 IEMIMPL_MEDIA_SSE_MXCSR_U128_U64 cvtpi2pd -
TabularUnified trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp ¶
r96916 r96921 16801 16801 } 16802 16802 #endif 16803 16804 16805 /** 16806 * CVTPI2PS 16807 */ 16808 #ifdef IEM_WITHOUT_ASSEMBLY 16809 static uint32_t iemAImpl_cvtpi2ps_u128_worker(uint32_t fMxcsr, PRTFLOAT32U pr32Dst, int32_t i32Src) 16810 { 16811 softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(fMxcsr); 16812 float32_t r32Res = i32_to_f32(i32Src, &SoftState); 16813 return iemSseSoftStateAndR32ToMxcsrAndIprtResult(&SoftState, r32Res, pr32Dst, fMxcsr); 16814 } 16815 16816 16817 IEM_DECL_IMPL_DEF(void, iemAImpl_cvtpi2ps_u128,(uint32_t *pfMxcsr, PX86XMMREG pDst, uint64_t u64Src)) 16818 { 16819 RTUINT64U uSrc = { u64Src }; 16820 uint32_t fMxcsrOut = iemAImpl_cvtpi2ps_u128_worker(*pfMxcsr, &pDst->ar32[0], uSrc.ai32[0]); 16821 fMxcsrOut |= iemAImpl_cvtpi2ps_u128_worker(*pfMxcsr, &pDst->ar32[1], uSrc.ai32[1]); 16822 *pfMxcsr = fMxcsrOut; 16823 } 16824 #endif 16825 16826 16827 /** 16828 * CVTPI2PD 16829 */ 16830 #ifdef IEM_WITHOUT_ASSEMBLY 16831 static uint32_t iemAImpl_cvtpi2pd_u128_worker(uint32_t fMxcsr, PRTFLOAT64U pr64Dst, int32_t i32Src) 16832 { 16833 softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(fMxcsr); 16834 float64_t r64Res = i32_to_f64(i32Src, &SoftState); 16835 return iemSseSoftStateAndR64ToMxcsrAndIprtResult(&SoftState, r64Res, pr64Dst, fMxcsr); 16836 } 16837 16838 16839 IEM_DECL_IMPL_DEF(void, iemAImpl_cvtpi2pd_u128,(uint32_t *pfMxcsr, PX86XMMREG pDst, uint64_t u64Src)) 16840 { 16841 RTUINT64U uSrc = { u64Src }; 16842 uint32_t fMxcsrOut = iemAImpl_cvtpi2pd_u128_worker(*pfMxcsr, &pDst->ar64[0], uSrc.ai32[0]); 16843 fMxcsrOut |= iemAImpl_cvtpi2pd_u128_worker(*pfMxcsr, &pDst->ar64[1], uSrc.ai32[1]); 16844 *pfMxcsr = fMxcsrOut; 16845 } 16846 #endif -
TabularUnified trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h ¶
r96916 r96921 3601 3601 3602 3602 /** Opcode 0x0f 0x2a - cvtpi2ps Vps, Qpi */ 3603 FNIEMOP_STUB(iemOp_cvtpi2ps_Vps_Qpi); //NEXT 3603 FNIEMOP_DEF(iemOp_cvtpi2ps_Vps_Qpi) 3604 { 3605 IEMOP_MNEMONIC2(RM, CVTPI2PS, cvtpi2ps, Vps, Qq, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0); /// @todo 3606 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 3607 if (IEM_IS_MODRM_REG_MODE(bRm)) 3608 { 3609 /* 3610 * Register, register. 3611 */ 3612 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 3613 3614 IEM_MC_BEGIN(3, 1); 3615 IEM_MC_ARG(uint32_t *, pfMxcsr, 0); 3616 IEM_MC_LOCAL(X86XMMREG, Dst); 3617 IEM_MC_ARG_LOCAL_REF(PX86XMMREG, pDst, Dst, 1); 3618 IEM_MC_ARG(uint64_t, u64Src, 2); 3619 IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT(); 3620 IEM_MC_PREPARE_FPU_USAGE(); 3621 IEM_MC_FPU_TO_MMX_MODE(); 3622 3623 IEM_MC_REF_MXCSR(pfMxcsr); 3624 IEM_MC_FETCH_XREG_XMM(Dst, IEM_GET_MODRM_RM(pVCpu, bRm)); /* Need it because the high quadword remains unchanged. */ 3625 IEM_MC_FETCH_MREG_U64(u64Src, IEM_GET_MODRM_REG(pVCpu, bRm)); 3626 3627 IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_cvtpi2ps_u128, pfMxcsr, pDst, u64Src); 3628 IEM_MC_IF_MXCSR_XCPT_PENDING() 3629 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT(); 3630 IEM_MC_ELSE() 3631 IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_RM(pVCpu, bRm), Dst); 3632 IEM_MC_ENDIF(); 3633 3634 IEM_MC_ADVANCE_RIP(); 3635 IEM_MC_END(); 3636 } 3637 else 3638 { 3639 /* 3640 * Register, memory. 3641 */ 3642 IEM_MC_BEGIN(3, 3); 3643 IEM_MC_ARG(uint32_t *, pfMxcsr, 0); 3644 IEM_MC_LOCAL(X86XMMREG, Dst); 3645 IEM_MC_ARG_LOCAL_REF(PX86XMMREG, pDst, Dst, 1); 3646 IEM_MC_ARG(uint64_t, u64Src, 2); 3647 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 3648 3649 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); 3650 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 3651 IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT(); 3652 IEM_MC_FETCH_MEM_U64(u64Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 3653 3654 IEM_MC_PREPARE_FPU_USAGE(); 3655 IEM_MC_FPU_TO_MMX_MODE(); 3656 IEM_MC_REF_MXCSR(pfMxcsr); 3657 3658 IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_cvtpi2ps_u128, pfMxcsr, pDst, u64Src); 3659 IEM_MC_IF_MXCSR_XCPT_PENDING() 3660 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT(); 3661 IEM_MC_ELSE() 3662 IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_RM(pVCpu, bRm), Dst); 3663 IEM_MC_ENDIF(); 3664 3665 IEM_MC_ADVANCE_RIP(); 3666 IEM_MC_END(); 3667 } 3668 return VINF_SUCCESS; 3669 } 3670 3671 3604 3672 /** Opcode 0x66 0x0f 0x2a - cvtpi2pd Vpd, Qpi */ 3605 FNIEMOP_STUB(iemOp_cvtpi2pd_Vpd_Qpi); //NEXT 3673 FNIEMOP_DEF(iemOp_cvtpi2pd_Vpd_Qpi) 3674 { 3675 IEMOP_MNEMONIC2(RM, CVTPI2PD, cvtpi2pd, Vps, Qq, DISOPTYPE_HARMLESS | DISOPTYPE_SSE, 0); /// @todo 3676 uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm); 3677 if (IEM_IS_MODRM_REG_MODE(bRm)) 3678 { 3679 /* 3680 * Register, register. 3681 */ 3682 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 3683 3684 IEM_MC_BEGIN(3, 1); 3685 IEM_MC_ARG(uint32_t *, pfMxcsr, 0); 3686 IEM_MC_LOCAL(X86XMMREG, Dst); 3687 IEM_MC_ARG_LOCAL_REF(PX86XMMREG, pDst, Dst, 1); 3688 IEM_MC_ARG(uint64_t, u64Src, 2); 3689 IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT(); 3690 IEM_MC_PREPARE_FPU_USAGE(); 3691 IEM_MC_FPU_TO_MMX_MODE(); 3692 3693 IEM_MC_REF_MXCSR(pfMxcsr); 3694 IEM_MC_FETCH_MREG_U64(u64Src, IEM_GET_MODRM_REG(pVCpu, bRm)); 3695 3696 IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_cvtpi2pd_u128, pfMxcsr, pDst, u64Src); 3697 IEM_MC_IF_MXCSR_XCPT_PENDING() 3698 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT(); 3699 IEM_MC_ELSE() 3700 IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_RM(pVCpu, bRm), Dst); 3701 IEM_MC_ENDIF(); 3702 3703 IEM_MC_ADVANCE_RIP(); 3704 IEM_MC_END(); 3705 } 3706 else 3707 { 3708 /* 3709 * Register, memory. 3710 */ 3711 IEM_MC_BEGIN(3, 3); 3712 IEM_MC_ARG(uint32_t *, pfMxcsr, 0); 3713 IEM_MC_LOCAL(X86XMMREG, Dst); 3714 IEM_MC_ARG_LOCAL_REF(PX86XMMREG, pDst, Dst, 1); 3715 IEM_MC_ARG(uint64_t, u64Src, 2); 3716 IEM_MC_LOCAL(RTGCPTR, GCPtrEffSrc); 3717 3718 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm, 0); 3719 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 3720 IEM_MC_MAYBE_RAISE_SSE2_RELATED_XCPT(); 3721 IEM_MC_FETCH_MEM_U64(u64Src, pVCpu->iem.s.iEffSeg, GCPtrEffSrc); 3722 3723 /* Doesn't cause a transition to MMX mode. */ 3724 IEM_MC_PREPARE_SSE_USAGE(); 3725 IEM_MC_REF_MXCSR(pfMxcsr); 3726 3727 IEM_MC_CALL_VOID_AIMPL_3(iemAImpl_cvtpi2pd_u128, pfMxcsr, pDst, u64Src); 3728 IEM_MC_IF_MXCSR_XCPT_PENDING() 3729 IEM_MC_RAISE_SSE_AVX_SIMD_FP_OR_UD_XCPT(); 3730 IEM_MC_ELSE() 3731 IEM_MC_STORE_XREG_XMM(IEM_GET_MODRM_RM(pVCpu, bRm), Dst); 3732 IEM_MC_ENDIF(); 3733 3734 IEM_MC_ADVANCE_RIP(); 3735 IEM_MC_END(); 3736 } 3737 return VINF_SUCCESS; 3738 } 3606 3739 3607 3740 -
TabularUnified trunk/src/VBox/VMM/include/IEMInternal.h ¶
r96916 r96921 2373 2373 FNIEMAIMPLMXCSRU64U128 iemAImpl_cvtpd2pi_u128; 2374 2374 FNIEMAIMPLMXCSRU64U128 iemAImpl_cvttpd2pi_u128; 2375 2376 typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLMXCSRU128U64,(uint32_t *pfMxcsr, PX86XMMREG pDst, uint64_t u64Src)); 2377 typedef FNIEMAIMPLMXCSRU128U64 *PFNIEMAIMPLMXCSRU128U64; 2378 2379 FNIEMAIMPLMXCSRU128U64 iemAImpl_cvtpi2ps_u128; 2380 FNIEMAIMPLMXCSRU128U64 iemAImpl_cvtpi2pd_u128; 2375 2381 2376 2382 /** @} */
Note:
See TracChangeset
for help on using the changeset viewer.