VirtualBox

Changeset 96895 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Sep 27, 2022 9:24:35 AM (2 years ago)
Author:
vboxsync
Message:

VMM/IEM: Rough implementation for fyl2x and fyl2xp1 instructions in IEM, bugref:9898

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r96796 r96895  
    73277327    pFpuResTwo->FSW = fFsw;
    73287328}
    7329 
     7329#endif /* IEM_WITHOUT_ASSEMBLY */
     7330
     7331#if defined(IEM_WITHOUT_ASSEMBLY)
     7332
     7333static 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}
    73307346
    73317347IEM_DECL_IMPL_DEF(void, iemAImpl_fyl2x_r80_by_r80,(PCX86FXSTATE pFpuState, PIEMFPURESULT pFpuRes,
    73327348                                                   PCRTFLOAT80U pr80Val1, PCRTFLOAT80U pr80Val2))
    73337349{
    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}
    73387379#endif /* IEM_WITHOUT_ASSEMBLY */
    73397380
     
    73527393#if defined(IEM_WITHOUT_ASSEMBLY)
    73537394
     7395static 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
    73547409IEM_DECL_IMPL_DEF(void, iemAImpl_fyl2xp1_r80_by_r80,(PCX86FXSTATE pFpuState, PIEMFPURESULT pFpuRes,
    73557410                                                     PCRTFLOAT80U pr80Val1, PCRTFLOAT80U pr80Val2))
    73567411{
    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;
    73597440}
    73607441
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette