D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 9813 - Signalling NaN initialization does not always work correctly on x86
Summary: Signalling NaN initialization does not always work correctly on x86
Status: NEW
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D2
Hardware: All All
: P3 normal
Assignee: No Owner
URL:
Keywords:
: 6303 15316 (view as issue list)
Depends on:
Blocks:
 
Reported: 2013-03-25 08:56 UTC by Don
Modified: 2024-12-13 18:05 UTC (History)
4 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description Don 2013-03-25 08:56:13 UTC
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.
Comment 1 Don 2013-03-25 09:01:10 UTC
An oddity about this, is that Intel processors will not raise the INVALID exception when initializing 80-bit reals. That is the one case where the scheme works correctly. It fails on AMD for all floating-point sizes.

This is a barely-documented difference between Intel and AMD processors.
Comment 2 Walter Bright 2013-03-25 14:52:53 UTC
Given the erratic and frankly bad support for signalling NaNs in the hardware, my inclination is to just drop support for them.
Comment 3 Andrej Mitrovic 2013-03-25 15:00:33 UTC
Also relevant: Issue 6303
Comment 4 Don 2013-07-26 07:47:40 UTC
*** Issue 6303 has been marked as a duplicate of this issue. ***
Comment 5 Cauterite 2016-08-19 21:50:07 UTC
*** Issue 15316 has been marked as a duplicate of this issue. ***
Comment 6 Martin Nowak 2016-10-01 18:50:44 UTC
Just to reference the original post that seems to have started the SNaN usage.
http://forum.dlang.org/post/gpsjfj$1678$1@digitalmars.com
Comment 7 dlangBugzillaToGithub 2024-12-13 18:05:20 UTC
THIS ISSUE HAS BEEN MOVED TO GITHUB

https://github.com/dlang/dmd/issues/18547

DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB