Bug 5386 – Initialising out float parameter causes FPU exception
Status
RESOLVED
Resolution
WORKSFORME
Severity
major
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
x86
OS
Windows
Creation time
2010-12-28T04:50:00Z
Last change time
2013-11-02T18:18:53Z
Keywords
performance
Assigned to
nobody
Creator
pvm_2004
Comments
Comment #0 by pvm_2004 — 2010-12-28T04:50:04Z
The following short code snippet causes slow code caused by FPU exception:
float f;
func(f);
void func(out float ff) {
ff = 1;
}
The following code is produced for the function:
func LABEL NEAR
push ebp
mov ebp, esp
push eax
fld dword ptr [_nan]
fstp dword ptr [eax]
fld dword ptr [_one]
fstp dword ptr [eax]
mov esp, ebp
pop ebp
ret
It appears that in DMD2 a float NaN is 0x7FE00000 (in dword format) but when it initialises a float 'out' parameter it
initialises it with 0x7FA00000. This causes an FPU trap which unnecessarily eats up around 250 ticks.
I had a quick look at doubles too. This uses 7FF4000000000000 to initialise a double out parameter which also traps the FPU.
Comment #1 by mk — 2013-11-02T18:18:53Z
I see no such behavior, float is initialized with 7FC0.