On 12/23/2010 12:19 PM, Pete wrote:
Ok, i've done some more investigating and 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 0x7FA00000H. This causes an FPU trap which is where the time
is going. This looks like a bug to me. Can anyone confirm?

Thanks.

I just did a test with DMD 2.051 on Linux

void F1(ref float a)
{
        a++;
}

void F2(out float a)
{
        a++;
}

void main()
{
        float a;
        float b;

        F1(a);
        F2(b);
}

And ASM:

080490e4 <_D3out2F1FKfZv>:
 80490e4:       55                      push   ebp
 80490e5:       8b ec                   mov    ebp,esp
 80490e7:       83 ec 04                sub    esp,0x4
 80490ea:       d9 e8                   fld1
 80490ec:       d8 00                   fadd   DWORD PTR [eax]
 80490ee:       d9 18                   fstp   DWORD PTR [eax]
 80490f0:       c9                      leave
 80490f1:       c3                      ret
 80490f2:       90                      nop
 80490f3:       90                      nop

080490f4 <_D3out2F2FJfZv>:
 80490f4:       55                      push   ebp
 80490f5:       8b ec                   mov    ebp,esp
 80490f7:       83 ec 04                sub    esp,0x4
 80490fa:       d9 05 00 81 05 08       fld    DWORD PTR ds:0x8058100
 8049100:       d9 18                   fstp   DWORD PTR [eax]
 8049102:       d9 e8                   fld1
 8049104:       d8 00                   fadd   DWORD PTR [eax]
 8049106:       d9 18                   fstp   DWORD PTR [eax]
 8049108:       c9                      leave
 8049109:       c3                      ret
 804910a:       90                      nop
 804910b:       90                      nop

0804910c <_Dmain>:
 804910c:       55                      push   ebp
 804910d:       8b ec                   mov    ebp,esp
 804910f:       83 ec 08                sub    esp,0x8
 8049112:       d9 05 00 81 05 08       fld    DWORD PTR ds:0x8058100
 8049118:       d9 5d f8                fstp   DWORD PTR [ebp-0x8]
 804911b:       d9 05 00 81 05 08       fld    DWORD PTR ds:0x8058100
 8049121:       d9 5d fc                fstp   DWORD PTR [ebp-0x4]
 8049124:       8d 45 f8                lea    eax,[ebp-0x8]
 8049127:       e8 b8 ff ff ff          call   80490e4 <_D3out2F1FKfZv>
 804912c:       8d 45 fc                lea    eax,[ebp-0x4]
 804912f:       e8 c0 ff ff ff          call   80490f4 <_D3out2F2FJfZv>
 8049134:       31 c0                   xor    eax,eax
 8049136:       c9                      leave
 8049137:       c3                      ret

And 0x8058100 is 0x7FA00000. As you can see out doesn't force the loading and storing of a different NaN value.

Of course, maybe the compiler should skip initializing a float that gets passed into a routine as an out parameter as its first use. E.g.

float a;
a = 1.0;

wouldn't generate two separate assignments.

Reply via email to