On 2014-01-04 20:59:18 +0800, Thomas Preud'homme wrote:
Le vendredi 3 janvier 2014, 13:28:13 Thomas Preud'homme a écrit :
Le vendredi 3 janvier 2014, 04:54:57 Vincent Lefevre a écrit :
Hi Thomas,
On 2014-01-03 10:30:15 +0800, Thomas Preud'homme wrote:
There is quite a few differences in the output about -0.0 where gcc
uses 0.0.
I'm not sure it's worth doing anything to change that since it's not
a bug but less divergence with gcc (and probably clang) could be
good. If it's just a few lines to add, why not. I might take a look
later this month, or never. ;)
Actually I think that this is more than an output bug, but I don't
know whether this is related. The fact is that tcc doesn't seem to
support signed zeros (required by IEEE 754).
Oh ok. I didn't look at the code that generated this output. Then I'll try
to take a look. Maybe not now but I'll keep it on my bug list.
So I decided it could be an easy bug fix and it quite was so it's now fixed.
There's still a bug related to signed zero support.
I've updated my test:
static void signed_zero_inf (void)
{
double x = 0.0, y = -0.0, n, p;
printf (\nSigned zero tests (x is 0.0 and y is -0.0):\n);
if (x == y)
printf (Test 1.0 / x != 1.0 / y returns %d (should be 1).\n,
1.0 / x != 1.0 / y);
else
printf (x != y; this is wrong!\n);
n = -x;
if (x == n)
printf (Test 1.0 / x != 1.0 / -x returns %d (should be 1).\n,
1.0 / x != 1.0 / n);
else
printf (x != -x; this is wrong!\n);
p = +y;
if (x == p)
printf (Test 1.0 / x != 1.0 / +y returns %d (should be 1).\n,
1.0 / x != 1.0 / p);
else
printf (x != +y; this is wrong!\n);
}
I get:
Signed zero tests (x is 0.0 and y is -0.0):
Test 1.0 / x != 1.0 / y returns 1 (should be 1).
Test 1.0 / x != 1.0 / -x returns 0 (should be 1).
Test 1.0 / x != 1.0 / +y returns 0 (should be 1).
Note that -x (resp. +x) is not equivalent to 0-x (resp. 0+x).
If I understand the code generated by GCC for -x, it changes the
sign bit with xorpd. This follows the IEEE 754-2008 standard:
negate(x) copies a floating-point operand x to a destination in the
same format, reversing the sign bit. negate(x) is not the same as
subtraction(0, x) (see 6.3).
The C99 standard says:
The result of the unary + operator is the value of its (promoted)
operand. The integer promotions are performed on the operand, and
the result has the promoted type.
The result of the unary - operator is the negative of its (promoted)
operand. The integer promotions are performed on the operand, and
the result has the promoted type.
So, it seems that a unary + (when used in a valid context) is just a
no-op (I suppose that the only difference is when it is an argument
of the sizeof operator).
--
Vincent Lefèvre vinc...@vinc17.net - Web: http://www.vinc17.net/
100% accessible validated (X)HTML - Blog: http://www.vinc17.net/blog/
Work: CR INRIA - computer arithmetic / AriC project (LIP, ENS-Lyon)
___
Tinycc-devel mailing list
Tinycc-devel@nongnu.org
https://lists.nongnu.org/mailman/listinfo/tinycc-devel