[Issue 9813] New: Signalling NaN initialization does not always work correctly on x86

d-bugmail at puremagic.com d-bugmail at puremagic.com
Mon Mar 25 08:56:14 PDT 2013


http://d.puremagic.com/issues/show_bug.cgi?id=9813

           Summary: Signalling NaN initialization does not always work
                    correctly on x86
           Product: D
           Version: D1 & D2
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody at puremagic.com
        ReportedBy: clugdbug at yahoo.com.au


--- Comment #0 from Don <clugdbug at yahoo.com.au> 2013-03-25 08:56:13 PDT ---
This code should not raise the floating point 'invalid' flag.
---
void foo()
{
     double x;
     x = 2;
     real y;
     y = 7;
     float z;
     z = 4;
}
---
Here is the generated code for 32 bits:

        push    EBP
        mov    EBP,ESP
        sub    ESP,018h
        fld    qword ptr FLAT:.rodata[08h]     // load SNAN - bad!
        fstp    qword ptr -018h[EBP]
        fld    qword ptr FLAT:.rodata[019h]
        fstp    qword ptr -018h[EBP]
        fld    tbyte ptr FLAT:.rodata[02Ah]
        fstp    tbyte ptr -010h[EBP]
        mov    word ptr -6[EBP],0
        fld    tbyte ptr FLAT:.rodata[045h]
        fstp    tbyte ptr -010h[EBP]
        mov    word ptr -6[EBP],0
        fld    float ptr FLAT:.rodata[060h]
        fstp    float ptr -4[EBP]
        fld    float ptr FLAT:.rodata[06Dh]
        fstp    float ptr -4[EBP]
        leave
        ret

The problem is, that the code first assigns SNAN to the variables *by loading
them through the floating point unit*. This makes them trigger an INVALID
exception. For this scheme to work, the floating point values would need to be
loaded by integer operations.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list