Changeset 98311 in vbox for trunk/src/VBox/VMM/VMMAll
- Timestamp:
- Jan 26, 2023 11:06:50 AM (2 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp
r98134 r98311 17132 17132 */ 17133 17133 17134 #define X86_SSE_ROUNDXX_IMM_RC_MASK UINT32_C(0x0003) 17135 #define X86_SSE_ROUNDXX_IMM_ROUND_SEL UINT32_C(0x0004) 17136 #define X86_SSE_ROUNDXX_IMM_PRECISION UINT32_C(0x0008) 17137 17138 DECLINLINE(softfloat_state_t) iemSseRoundXXMxcsrAndImmToSoftState(uint32_t fMxcsr, uint8_t bImm) 17139 { 17140 if (bImm & X86_SSE_ROUNDXX_IMM_ROUND_SEL) 17141 return IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(fMxcsr); 17142 17143 fMxcsr &= ~X86_MXCSR_RC_MASK; 17144 fMxcsr |= (bImm & X86_SSE_ROUNDXX_IMM_RC_MASK) << X86_MXCSR_RC_SHIFT; 17145 return IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(fMxcsr); 17146 } 17147 17134 17148 static RTFLOAT32U iemAImpl_round_worker_r32(uint32_t *pfMxcsr, PCRTFLOAT32U pr32Src, uint8_t bImm) 17135 17149 { 17136 RT_NOREF(bImm);17137 17150 RTFLOAT32U r32Src, r32Dst; 17138 17151 float32_t f32Src; 17139 softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(*pfMxcsr); 17152 softfloat_state_t SoftState = iemSseRoundXXMxcsrAndImmToSoftState(*pfMxcsr, bImm); 17153 bool fExact = !RT_BOOL(bImm & X86_SSE_ROUNDXX_IMM_PRECISION); 17140 17154 17141 17155 iemSsePrepareValueR32(&r32Src, *pfMxcsr, pr32Src); 17142 f32Src = f32_roundToInt(iemFpSoftF32FromIprt(&r32Src), SoftState.roundingMode, true/*exact*/, &SoftState);17156 f32Src = f32_roundToInt(iemFpSoftF32FromIprt(&r32Src), SoftState.roundingMode, fExact, &SoftState); 17143 17157 17144 17158 iemFpSoftF32ToIprt(&r32Dst, f32Src); … … 17148 17162 static RTFLOAT64U iemAImpl_round_worker_r64(uint32_t *pfMxcsr, PCRTFLOAT64U pr64Src, uint8_t bImm) 17149 17163 { 17150 RT_NOREF(bImm);17151 17164 RTFLOAT64U r64Src, r64Dst; 17152 17165 float64_t f64Src; 17153 softfloat_state_t SoftState = IEM_SOFTFLOAT_STATE_INITIALIZER_FROM_MXCSR(*pfMxcsr); 17166 softfloat_state_t SoftState = iemSseRoundXXMxcsrAndImmToSoftState(*pfMxcsr, bImm); 17167 bool fExact = !RT_BOOL(bImm & X86_SSE_ROUNDXX_IMM_PRECISION); 17154 17168 17155 17169 iemSsePrepareValueR64(&r64Src, *pfMxcsr, pr64Src); 17156 f64Src = f64_roundToInt(iemFpSoftF64FromIprt(&r64Src), SoftState.roundingMode, true/*exact*/, &SoftState);17170 f64Src = f64_roundToInt(iemFpSoftF64FromIprt(&r64Src), SoftState.roundingMode, fExact, &SoftState); 17157 17171 17158 17172 iemFpSoftF64ToIprt(&r64Dst, f64Src);
Note:
See TracChangeset
for help on using the changeset viewer.