Changeset 96895 in vbox for trunk/src/VBox/VMM/VMMAll
- Timestamp:
- Sep 27, 2022 9:24:35 AM (2 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp
r96796 r96895 7327 7327 pFpuResTwo->FSW = fFsw; 7328 7328 } 7329 7329 #endif /* IEM_WITHOUT_ASSEMBLY */ 7330 7331 #if defined(IEM_WITHOUT_ASSEMBLY) 7332 7333 static uint16_t iemAImpl_fyl2x_r80_by_r80_normal(PCRTFLOAT80U pr80Val1, PCRTFLOAT80U pr80Val2, PRTFLOAT80U pr80Result, uint16_t fFcw, uint16_t fFsw) 7334 { 7335 softfloat_state_t SoftState = SOFTFLOAT_STATE_INIT_DEFAULTS(); 7336 extFloat80_t y = iemFpuSoftF80FromIprt(pr80Val1); 7337 extFloat80_t x = iemFpuSoftF80FromIprt(pr80Val2); 7338 extFloat80_t v; 7339 (void)fFcw; 7340 7341 v = extF80_ylog2x(y, x, &SoftState); 7342 iemFpuSoftF80ToIprt(pr80Result, v); 7343 7344 return fFsw; 7345 } 7330 7346 7331 7347 IEM_DECL_IMPL_DEF(void, iemAImpl_fyl2x_r80_by_r80,(PCX86FXSTATE pFpuState, PIEMFPURESULT pFpuRes, 7332 7348 PCRTFLOAT80U pr80Val1, PCRTFLOAT80U pr80Val2)) 7333 7349 { 7334 RT_NOREF(pFpuState, pFpuRes, pr80Val1, pr80Val2); 7335 AssertReleaseFailed(); 7336 } 7337 7350 uint16_t const fFcw = pFpuState->FCW; 7351 uint16_t fFsw = pFpuState->FSW & (X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3); 7352 7353 if (RTFLOAT80U_IS_NORMAL(pr80Val1) && RTFLOAT80U_IS_NORMAL(pr80Val2) && !pr80Val2->s.fSign) 7354 { 7355 fFsw |= iemAImpl_fyl2x_r80_by_r80_normal(pr80Val1, pr80Val2, &pFpuRes->r80Result, fFcw, fFsw); 7356 7357 fFsw |= X86_FSW_PE | (7 << X86_FSW_TOP_SHIFT); 7358 if (!(fFcw & X86_FCW_PM)) 7359 fFsw |= X86_FSW_ES | X86_FSW_B; 7360 } 7361 else 7362 { 7363 fFsw |= X86_FSW_IE; 7364 7365 if (!(fFcw & X86_FCW_IM)) 7366 { 7367 pFpuRes->r80Result = *pr80Val2; 7368 fFsw |= X86_FSW_ES | X86_FSW_B | (6 << X86_FSW_TOP_SHIFT); 7369 } 7370 else 7371 { 7372 pFpuRes->r80Result = g_r80Indefinite; 7373 fFsw |= (7 << X86_FSW_TOP_SHIFT); 7374 } 7375 } 7376 7377 pFpuRes->FSW = fFsw; 7378 } 7338 7379 #endif /* IEM_WITHOUT_ASSEMBLY */ 7339 7380 … … 7352 7393 #if defined(IEM_WITHOUT_ASSEMBLY) 7353 7394 7395 static uint16_t iemAImpl_fyl2xp1_r80_by_r80_normal(PCRTFLOAT80U pr80Val1, PCRTFLOAT80U pr80Val2, PRTFLOAT80U pr80Result, uint16_t fFcw, uint16_t fFsw) 7396 { 7397 softfloat_state_t SoftState = SOFTFLOAT_STATE_INIT_DEFAULTS(); 7398 extFloat80_t y = iemFpuSoftF80FromIprt(pr80Val1); 7399 extFloat80_t x = iemFpuSoftF80FromIprt(pr80Val2); 7400 extFloat80_t v; 7401 (void)fFcw; 7402 7403 v = extF80_ylog2xp1(y, x, &SoftState); 7404 iemFpuSoftF80ToIprt(pr80Result, v); 7405 7406 return fFsw; 7407 } 7408 7354 7409 IEM_DECL_IMPL_DEF(void, iemAImpl_fyl2xp1_r80_by_r80,(PCX86FXSTATE pFpuState, PIEMFPURESULT pFpuRes, 7355 7410 PCRTFLOAT80U pr80Val1, PCRTFLOAT80U pr80Val2)) 7356 7411 { 7357 RT_NOREF(pFpuState, pFpuRes, pr80Val1, pr80Val2); 7358 AssertReleaseFailed(); 7412 uint16_t const fFcw = pFpuState->FCW; 7413 uint16_t fFsw = pFpuState->FSW & (X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3); 7414 7415 if (RTFLOAT80U_IS_NORMAL(pr80Val1) && RTFLOAT80U_IS_NORMAL(pr80Val2) && pr80Val2->s.uExponent < RTFLOAT80U_EXP_BIAS) 7416 { 7417 fFsw = iemAImpl_fyl2xp1_r80_by_r80_normal(pr80Val1, pr80Val2, &pFpuRes->r80Result, fFcw, fFsw); 7418 7419 fFsw |= X86_FSW_PE | (7 << X86_FSW_TOP_SHIFT); 7420 if (!(fFcw & X86_FCW_PM)) 7421 fFsw |= X86_FSW_ES | X86_FSW_B; 7422 } 7423 else 7424 { 7425 fFsw |= X86_FSW_IE; 7426 7427 if (!(fFcw & X86_FCW_IM)) 7428 { 7429 pFpuRes->r80Result = *pr80Val2; 7430 fFsw |= X86_FSW_ES | X86_FSW_B | (6 << X86_FSW_TOP_SHIFT); 7431 } 7432 else 7433 { 7434 pFpuRes->r80Result = g_r80Indefinite; 7435 fFsw |= (7 << X86_FSW_TOP_SHIFT); 7436 } 7437 } 7438 7439 pFpuRes->FSW = fFsw; 7359 7440 } 7360 7441
Note:
See TracChangeset
for help on using the changeset viewer.