Changeset 105371 in vbox for trunk/src/VBox/VMM/VMMAll
- Timestamp:
- Jul 17, 2024 11:33:48 AM (7 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp
r105359 r105371 37 37 #include <iprt/uint256.h> 38 38 #include <iprt/crc.h> 39 #include <iprt/string.h> 39 40 40 41 RT_C_DECLS_BEGIN … … 20698 20699 * [V]DPPS 20699 20700 */ 20701 static uint32_t iemAImpl_dpps_u128_worker(PRTFLOAT32U par32Dst, uint32_t fMxcsr, PCRTFLOAT32U par32Src1, PCRTFLOAT32U par32Src2, uint8_t bImm) 20702 { 20703 uint32_t fMxcsrOut = 0; 20704 20705 RTFLOAT32U ar32Tmp[4]; RT_ZERO(ar32Tmp); /* This will set the values to 0.0 */ 20706 if (bImm & RT_BIT(4)) 20707 fMxcsrOut |= iemAImpl_mulps_u128_worker(&ar32Tmp[0], fMxcsr, &par32Src1[0], &par32Src2[0]); 20708 if (bImm & RT_BIT(5)) 20709 fMxcsrOut |= iemAImpl_mulps_u128_worker(&ar32Tmp[1], fMxcsr, &par32Src1[1], &par32Src2[1]); 20710 if (bImm & RT_BIT(6)) 20711 fMxcsrOut |= iemAImpl_mulps_u128_worker(&ar32Tmp[2], fMxcsr, &par32Src1[2], &par32Src2[2]); 20712 if (bImm & RT_BIT(7)) 20713 fMxcsrOut |= iemAImpl_mulps_u128_worker(&ar32Tmp[3], fMxcsr, &par32Src1[3], &par32Src2[3]); 20714 20715 RTFLOAT32U ar32TmpRes[2]; 20716 fMxcsrOut |= iemAImpl_addps_u128_worker(&ar32TmpRes[0], fMxcsr, &ar32Tmp[0], &ar32Tmp[1]); 20717 fMxcsrOut |= iemAImpl_addps_u128_worker(&ar32TmpRes[1], fMxcsr, &ar32Tmp[2], &ar32Tmp[3]); 20718 20719 RTFLOAT32U r32Res; 20720 fMxcsrOut |= iemAImpl_addps_u128_worker(&r32Res, fMxcsr, &ar32TmpRes[0], &ar32TmpRes[1]); 20721 20722 if (bImm & RT_BIT(0)) 20723 par32Dst[0] = r32Res; 20724 else 20725 par32Dst[0] = RTFLOAT32U_INIT_ZERO(0); 20726 20727 if (bImm & RT_BIT(1)) 20728 par32Dst[1] = r32Res; 20729 else 20730 par32Dst[1] = RTFLOAT32U_INIT_ZERO(0); 20731 20732 if (bImm & RT_BIT(2)) 20733 par32Dst[2] = r32Res; 20734 else 20735 par32Dst[2] = RTFLOAT32U_INIT_ZERO(0); 20736 20737 if (bImm & RT_BIT(3)) 20738 par32Dst[3] = r32Res; 20739 else 20740 par32Dst[3] = RTFLOAT32U_INIT_ZERO(0); 20741 20742 return fMxcsrOut; 20743 } 20744 20745 20700 20746 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_dpps_u128_fallback,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCIEMMEDIAF2XMMSRC pSrc, uint8_t bImm)) 20701 20747 { 20702 RT_NOREF(puDst, pSrc, bImm); 20703 AssertReleaseFailed(); 20704 return uMxCsrIn; 20748 return iemAImpl_dpps_u128_worker(&puDst->ar32[0], uMxCsrIn, &pSrc->uSrc1.ar32[0], &pSrc->uSrc2.ar32[0], bImm); 20705 20749 } 20706 20750 … … 20708 20752 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vdpps_u128_fallback,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCIEMMEDIAF2XMMSRC pSrc, uint8_t bImm)) 20709 20753 { 20710 RT_NOREF(puDst, pSrc, bImm); 20711 AssertReleaseFailed(); 20712 return uMxCsrIn; 20754 return iemAImpl_dpps_u128_worker(&puDst->ar32[0], uMxCsrIn, &pSrc->uSrc1.ar32[0], &pSrc->uSrc2.ar32[0], bImm); 20713 20755 } 20714 20756 … … 20716 20758 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vdpps_u256_fallback,(uint32_t uMxCsrIn, PX86YMMREG puDst, PCIEMMEDIAF2YMMSRC pSrc, uint8_t bImm)) 20717 20759 { 20718 RT_NOREF(puDst, pSrc, bImm);20719 AssertReleaseFailed();20720 return uMxCsrIn;20760 uint32_t fMxcsrOut = iemAImpl_dpps_u128_worker(&puDst->ar32[0], uMxCsrIn, &pSrc->uSrc1.ar32[0], &pSrc->uSrc2.ar32[0], bImm); 20761 fMxcsrOut |= iemAImpl_dpps_u128_worker(&puDst->ar32[4], uMxCsrIn, &pSrc->uSrc1.ar32[4], &pSrc->uSrc2.ar32[4], bImm); 20762 return fMxcsrOut; 20721 20763 } 20722 20764 … … 20725 20767 * [V]DPPD 20726 20768 */ 20769 static uint32_t iemAImpl_dppd_u128_worker(PRTFLOAT64U par64Dst, uint32_t fMxcsr, PCRTFLOAT64U par64Src1, PCRTFLOAT64U par64Src2, uint8_t bImm) 20770 { 20771 uint32_t fMxcsrOut = 0; 20772 20773 RTFLOAT64U ar64Tmp[2]; RT_ZERO(ar64Tmp); /* This will set the values to 0.0 */ 20774 if (bImm & RT_BIT(4)) 20775 fMxcsrOut |= iemAImpl_mulpd_u128_worker(&ar64Tmp[0], fMxcsr, &par64Src1[0], &par64Src2[0]); 20776 if (bImm & RT_BIT(5)) 20777 fMxcsrOut |= iemAImpl_mulpd_u128_worker(&ar64Tmp[1], fMxcsr, &par64Src1[1], &par64Src2[1]); 20778 20779 RTFLOAT64U r64Res; 20780 fMxcsrOut |= iemAImpl_addpd_u128_worker(&r64Res, fMxcsr, &ar64Tmp[0], &ar64Tmp[1]); 20781 20782 if (bImm & RT_BIT(0)) 20783 par64Dst[0] = r64Res; 20784 else 20785 par64Dst[0] = RTFLOAT64U_INIT_ZERO(0); 20786 20787 if (bImm & RT_BIT(1)) 20788 par64Dst[1] = r64Res; 20789 else 20790 par64Dst[1] = RTFLOAT64U_INIT_ZERO(0); 20791 20792 return fMxcsrOut; 20793 } 20794 20795 20727 20796 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_dppd_u128_fallback,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCIEMMEDIAF2XMMSRC pSrc, uint8_t bImm)) 20728 20797 { 20729 RT_NOREF(puDst, pSrc, bImm); 20730 AssertReleaseFailed(); 20731 return uMxCsrIn; 20798 return iemAImpl_dppd_u128_worker(&puDst->ar64[0], uMxCsrIn, &pSrc->uSrc1.ar64[0], &pSrc->uSrc2.ar64[0], bImm); 20732 20799 } 20733 20800 … … 20735 20802 IEM_DECL_IMPL_DEF(uint32_t, iemAImpl_vdppd_u128_fallback,(uint32_t uMxCsrIn, PX86XMMREG puDst, PCIEMMEDIAF2XMMSRC pSrc, uint8_t bImm)) 20736 20803 { 20737 RT_NOREF(puDst, pSrc, bImm); 20738 AssertReleaseFailed(); 20739 return uMxCsrIn; 20804 return iemAImpl_dppd_u128_worker(&puDst->ar64[0], uMxCsrIn, &pSrc->uSrc1.ar64[0], &pSrc->uSrc2.ar64[0], bImm); 20740 20805 } 20741 20806
Note:
See TracChangeset
for help on using the changeset viewer.