VirtualBox

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


Ignore:
Timestamp:
Apr 1, 2022 6:54:16 PM (3 years ago)
Author:
vboxsync
Message:

VMM/IEM: C implementation of fabs, fchs, ftst, and fxam. bugref:9898

File:
1 edited

Legend:

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

    r94423 r94447  
    45584558IEM_DECL_IMPL_DEF(void, iemAImpl_ftst_r80,(PCX86FXSTATE pFpuState, uint16_t *pu16Fsw, PCRTFLOAT80U pr80Val))
    45594559{
    4560     RT_NOREF(pFpuState, pu16Fsw, pr80Val);
    4561     AssertReleaseFailed();
     4560    uint16_t fFsw = (7 << X86_FSW_TOP_SHIFT);
     4561
     4562    if (RTFLOAT80U_IS_ZERO(pr80Val))
     4563        fFsw |= X86_FSW_C3;
     4564    else if (RTFLOAT80U_IS_NORMAL(pr80Val) || RTFLOAT80U_IS_INF(pr80Val))
     4565        fFsw |= pr80Val->s.fSign ? X86_FSW_C0 : 0;
     4566    else if (RTFLOAT80U_IS_DENORMAL(pr80Val) || RTFLOAT80U_IS_PSEUDO_DENORMAL(pr80Val))
     4567    {
     4568        fFsw |= pr80Val->s.fSign ? X86_FSW_C0 | X86_FSW_DE : X86_FSW_DE;
     4569        if (!(pFpuState->FCW & X86_FCW_DM))
     4570            fFsw |= X86_FSW_ES | X86_FSW_B;
     4571    }
     4572    else
     4573    {
     4574        fFsw |= X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3 | X86_FSW_IE;
     4575        if (!(pFpuState->FCW & X86_FCW_IM))
     4576            fFsw |= X86_FSW_ES | X86_FSW_B;
     4577    }
     4578
     4579    *pu16Fsw = fFsw;
    45624580}
    45634581
     
    45654583IEM_DECL_IMPL_DEF(void, iemAImpl_fxam_r80,(PCX86FXSTATE pFpuState, uint16_t *pu16Fsw, PCRTFLOAT80U pr80Val))
    45664584{
    4567     RT_NOREF(pFpuState, pu16Fsw, pr80Val);
    4568     AssertReleaseFailed();
     4585    RT_NOREF(pFpuState);
     4586    uint16_t fFsw = (7 << X86_FSW_TOP_SHIFT);
     4587
     4588    /* C1 = sign bit (always, even if empty Intel says). */
     4589    if (pr80Val->s.fSign)
     4590        fFsw |= X86_FSW_C1;
     4591
     4592    /* Classify the value in C0, C2, C3. */
     4593    if (!(pFpuState->FTW & RT_BIT_32(X86_FSW_TOP_GET(pFpuState->FSW))))
     4594        fFsw |= X86_FSW_C0 | X86_FSW_C3; /* empty */
     4595    else if (RTFLOAT80U_IS_NORMAL(pr80Val))
     4596        fFsw |= X86_FSW_C2;
     4597    else if (RTFLOAT80U_IS_ZERO(pr80Val))
     4598        fFsw |= X86_FSW_C3;
     4599    else if (RTFLOAT80U_IS_QUIET_OR_SIGNALLING_NAN(pr80Val))
     4600        fFsw |= X86_FSW_C0;
     4601    else if (RTFLOAT80U_IS_INF(pr80Val))
     4602        fFsw |= X86_FSW_C0 | X86_FSW_C2;
     4603    else if (RTFLOAT80U_IS_DENORMAL(pr80Val) || RTFLOAT80U_IS_PSEUDO_DENORMAL(pr80Val))
     4604        fFsw |= X86_FSW_C2 | X86_FSW_C3;
     4605    /* whatever else: 0 */
     4606
     4607    *pu16Fsw = fFsw;
    45694608}
    45704609
     
    46854724IEM_DECL_IMPL_DEF(void, iemAImpl_fabs_r80,(PCX86FXSTATE pFpuState, PIEMFPURESULT pFpuRes, PCRTFLOAT80U pr80Val))
    46864725{
    4687     RT_NOREF(pFpuState, pFpuRes, pr80Val);
    4688     AssertReleaseFailed();
     4726    pFpuRes->FSW = (pFpuState->FSW & (X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3)) | (7 << X86_FSW_TOP_SHIFT);
     4727    pFpuRes->r80Result         = *pr80Val;
     4728    pFpuRes->r80Result.s.fSign = 0;
    46894729}
    46904730
     
    46924732IEM_DECL_IMPL_DEF(void, iemAImpl_fchs_r80,(PCX86FXSTATE pFpuState, PIEMFPURESULT pFpuRes, PCRTFLOAT80U pr80Val))
    46934733{
    4694     RT_NOREF(pFpuState, pFpuRes, pr80Val);
    4695     AssertReleaseFailed();
     4734    pFpuRes->FSW = (pFpuState->FSW & (X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3)) | (7 << X86_FSW_TOP_SHIFT);
     4735    pFpuRes->r80Result         = *pr80Val;
     4736    pFpuRes->r80Result.s.fSign = !pr80Val->s.fSign;
    46964737}
    46974738
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