]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix comparison of decimal float zeroes (PR80692)
authorSegher Boessenkool <segher@kernel.crashing.org>
Wed, 17 May 2017 21:57:23 +0000 (23:57 +0200)
committerSegher Boessenkool <segher@gcc.gnu.org>
Wed, 17 May 2017 21:57:23 +0000 (23:57 +0200)
Decimal float negative zero should compare equal to positive zero.
Decimal float zeroes are encoded as value class "normal" (in real.c);
they need to be handled specially, but in this one case that does not
yet happen.  This fixes it.

PR middle-end/80692
* real.c (do_compare): Give decimal_do_compare preference over
comparing just the signs.

gcc/testsuite/
PR middle-end/80692
* gcc.c-torture/execute/pr80692.c: New testcase.

From-SVN: r248174

gcc/ChangeLog
gcc/real.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr80692.c [new file with mode: 0644]

index 068ddd90d1e741a442c6f4625953f109cae4cab4..f9a143068a0f23c871ec7bf192e3e2256cf94d73 100644 (file)
@@ -1,3 +1,9 @@
+2017-05-17  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       PR middle-end/80692
+       * real.c (do_compare): Give decimal_do_compare preference over
+       comparing just the signs.
+
 2017-05-17  Uros Bizjak  <ubizjak@gmail.com>
 
        * doc/md.texi (Canonicalization of Instructions): Describe the
index 97452a9701ed0be019dee1950ade5e4d63a2ff12..a5671b2865bd10db1d26bfa02cc592aa109a43e2 100644 (file)
@@ -960,12 +960,12 @@ do_compare (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b,
       gcc_unreachable ();
     }
 
-  if (a->sign != b->sign)
-    return -a->sign - -b->sign;
-
   if (a->decimal || b->decimal)
     return decimal_do_compare (a, b, nan_result);
 
+  if (a->sign != b->sign)
+    return -a->sign - -b->sign;
+
   if (REAL_EXP (a) > REAL_EXP (b))
     ret = 1;
   else if (REAL_EXP (a) < REAL_EXP (b))
index 9549f609cf0446d9ffe6b1ba07bf1cc96fed0ba2..7b38a5233f9966b675d9228bf0bf9b3947419eea 100644 (file)
@@ -1,3 +1,8 @@
+2017-05-17  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       PR middle-end/80692
+       * gcc.c-torture/execute/pr80692.c: New testcase.
+
 2017-05-17  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR libgfortran/80741
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr80692.c b/gcc/testsuite/gcc.c-torture/execute/pr80692.c
new file mode 100644 (file)
index 0000000..e653c71
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-require-effective-target dfp } */
+
+int main () {
+       _Decimal64 d64 = -0.DD;
+
+       if (d64 != 0.DD)
+               __builtin_abort ();
+
+       if (d64 != -0.DD)
+               __builtin_abort ();
+
+       return 0;
+}