[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