[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Tinycc-devel] x86_64 tcc doesn't set sign bit on NaNs

From: Christian Jullien
Subject: Re: [Tinycc-devel] x86_64 tcc doesn't set sign bit on NaNs
Date: Mon, 4 Jan 2021 07:18:14 +0100

Hi Michael,
The fix does not make the test suite happy, at least, on Linux Aarch64 when 
clang is used (gcc and tcc are Ok):

./configure --strip-binaries --with-selinux --cc=clang 
Binary directory    /home/jullien/tinycc/static/bin
TinyCC directory    /home/jullien/tinycc/static/lib/tcc
Library directory   /home/jullien/tinycc/static/lib
Include directory   /home/jullien/tinycc/static/include
Manual directory    /home/jullien/tinycc/static/share/man
Info directory      /home/jullien/tinycc/static/share/info
Doc directory       /home/jullien/tinycc/static/share/doc
Source path         /home/jullien/tinycc
C compiler          clang (11.0)
Target OS           Linux
CPU                 aarch64
Config              strip selinux
Creating config.mak and config.h


------------ test3 ------------
--- test.ref    2021-01-04 06:54:01.523848942 +0100
+++ test.out3   2021-01-04 06:54:03.523846911 +0100
@@ -653,7 +653,7 @@
 Test 1.0 / x != 1.0 / -x returns 1 (should be 1).
 Test 1.0 / x != 1.0 / +y returns 1 (should be 1).
 Test 1.0 / x != 1.0 / -y returns 0 (should be 0).
-nantest: nan nan
+nantest: nan -nan
 1.200000 3.400000 -5.600000
 2.120000 0.500000 23000000000.000000
gmake[2]: *** [Makefile:128: test3] Error 1

-----Original Message-----
From: Tinycc-devel [mailto:tinycc-devel-bounces+eligis=orange.fr@nongnu.org] On 
Behalf Of Michael Matz
Sent: Monday, January 04, 2021 04:59
To: tinycc-devel@nongnu.org
Subject: Re: [Tinycc-devel] x86_64 tcc doesn't set sign bit on NaNs


On Mon, 4 Jan 2021, Vincent Lefevre wrote:

>> -----------------------------
>> #include <stdio.h>
>> #include <math.h>
>> #include <stdlib.h>
>> int main(int argc, char **argv)
>> {
>>      double d = strtod("-nan", NULL);
>>      d = -d;
>>      printf("%g, signbit(d) = %d\n", d, signbit(d));
>>      return 0;
>> }
>> -----------------------------
>> Results:
>>      $ gcc foo.c -o foo && ./foo
>>      -nan, signbit(d) = 1
>>      $ tcc foo.c -o foo2 && ./foo2
>>      nan, signbit(d) = 0
>> I get the same results as gcc with clang and pcc. tcc is the outlier.
> AFAIK, the status of the sign bit of a NaN is unspecified, except
> for some particular functions, but not strtod. So I don't see a
> bug in tcc.
> Note: for GCC, there's an inconsistency between your testcase
> and the result.

Yeah, I think that's merely a typo in Arnolds email.  The inconsistency is 
there, applying unary '-' to a NaN doesn't change the sign of it in TCC.

While the interpretation of sign bits in NaNs isn't specified in 
IEEE754/854/P754, its existence is a given (in particular it talks about 
"the sign of a NaN", in order to say that their interpretation isn't 
determined :) )

Further IEEE754 recommends implementations to provide a negate(x) 
operation that copies x with reversed sign, that is to work on NaNs (and 
due to copysign needs to have observable behaviour).  C99 and up specify 
that the unary '-' operator maps to that operation.

So, I think it's pretty clear, that whatever the sign bit of NaNs is 
supposed to mean, it must be switchable by unary '-' when IEEE754 
conformance is claimed.  We currently don't claim so, but we aim for it if 
possible :)

So the current "-0.0-x" expansion of unary '-' needs a change.  It turned 
out to be a bit uglier than I wished for, but alas, fixed in mob.

Thanks for the report, Arnold.


Tinycc-devel mailing list

reply via email to

[Prev in Thread] Current Thread [Next in Thread]