__builtin_isnanl() and invalid x87 80-bit floating point numbers

Liu Hao lh_mouse@126.com
Mon May 15 14:35:00 GMT 2017


On 2017/5/15 20:02, Vincent Lefevre wrote:
> On 2017-05-14 00:43:52 +0800, Liu Hao wrote:
>> 4) If the `FST` or `FSTP` instruction is used to store an invalid
>>     operand to a memory location, an #IA exception is raised regardless
>>     of size of that location.
>>
>> Since case 2) and 4) differ, a SNaN and an invalid operand are *not*
>> indistinguishable.
> 
> In C, an assignment with no type conversion corresponds to a "copy" or
> equivalently nothing, the unary minus is "negate", and fabs is "abs"
> (Annex F of the C standard). If you get an exception, then this is a
> compiler bug.
> 
Yeah but `printf()` from glibc doesn't think it is a NaN... From your 
point of view, is this a glibc bug?

------------------------------------------------------------------
lh_mouse@lhmouse-dev:~$ cat test.c
#include <stdio.h>
#include <math.h>

int main (void)
{
    long double ld = 0;
    unsigned char data[10] = {
      0x5b, 0x01, 0x04, 0x5e, 0x85, 0x00, 0x00, 0x00, 0xd8, 0x59
    };
    __builtin_memcpy(&ld, data, 10);
    printf ("nan = %d, ld = %Lg\n", isnanl(ld), ld);
    return 0;
}
lh_mouse@lhmouse-dev:~$ gcc test.c -O3 -lm -Wall -Wextra -pedantic
lh_mouse@lhmouse-dev:~$ ./a.out
nan = 1, ld = 5.11212e+1984
lh_mouse@lhmouse-dev:~$
------------------------------------------------------------------

-- 
Best regards,
LH_Mouse



More information about the Gcc-help mailing list