VirtualBox

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


Ignore:
Timestamp:
Oct 28, 2022 3:15:50 PM (2 years ago)
Author:
vboxsync
Message:

VMM/IEM: Underflow signalling in fsin instruction as described in 1985 version of IEEE 754, bugref:9898

File:
1 edited

Legend:

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

    r97319 r97337  
    62886288            {
    62896289                pFpuRes->r80Result = *pr80Val;
    6290 
    62916290            }
    62926291            else
     
    63146313    else if (RTFLOAT80U_IS_DENORMAL(pr80Val))
    63156314    {
    6316         pFpuRes->r80Result = *pr80Val;
    63176315        fFsw |= X86_FSW_DE;
    63186316
    63196317        if (fFcw & X86_FCW_DM)
    63206318        {
     6319            if (fFcw & X86_FCW_UM)
     6320            {
     6321                pFpuRes->r80Result = *pr80Val;
     6322            }
     6323            else
     6324            {
     6325                /* Underflow signalling as described at 7.4 section of 1985 IEEE 754*/
     6326                uint64_t uMantissa = pr80Val->s.uMantissa;
     6327                uint32_t uExponent = ASMBitLastSetU64(uMantissa);
     6328
     6329                uExponent = 64 - uExponent;
     6330                uMantissa <<= uExponent;
     6331                uExponent = RTFLOAT128U_EXP_BIAS_ADJUST - uExponent + 1;
     6332
     6333                pFpuRes->r80Result.s.fSign = pr80Val->s.fSign;
     6334                pFpuRes->r80Result.s.uMantissa = uMantissa;
     6335                pFpuRes->r80Result.s.uExponent = uExponent;
     6336            }
     6337
    63216338            fFsw |= X86_FSW_UE | X86_FSW_PE;
    63226339
    6323             if (!(fFcw & X86_FCW_UM) || !(fFcw & X86_FCW_PM))
     6340            if ((fFcw & X86_FCW_UM) && (fFcw & X86_FCW_PM))
     6341            {
     6342                /* All the exceptions are masked. */
     6343            }
     6344            else
    63246345            {
    63256346                fFsw |= X86_FSW_ES | X86_FSW_B;
     
    63286349        else
    63296350        {
     6351            pFpuRes->r80Result = *pr80Val;
     6352
    63306353            fFsw |= X86_FSW_ES | X86_FSW_B;
    63316354        }
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