aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorSegher Boessenkool <segher@kernel.crashing.org>2017-05-17 23:57:23 +0200
committerSegher Boessenkool <segher@gcc.gnu.org>2017-05-17 23:57:23 +0200
commite98e63404c6b3057ac0f0ff4fe871cd19a1aacb4 (patch)
tree60059a11d628cc19e51fd631d1d8f35c71eb2b26 /gcc
parent78eca3093f7f60295aac46d559b5f21f3154e6dd (diff)
downloadgcc-e98e63404c6b3057ac0f0ff4fe871cd19a1aacb4.zip
gcc-e98e63404c6b3057ac0f0ff4fe871cd19a1aacb4.tar.gz
gcc-e98e63404c6b3057ac0f0ff4fe871cd19a1aacb4.tar.bz2
Fix comparison of decimal float zeroes (PR80692)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/real.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr80692.c13
4 files changed, 27 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 068ddd9..f9a1430 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/real.c b/gcc/real.c
index 97452a9..a5671b2 100644
--- a/gcc/real.c
+++ b/gcc/real.c
@@ -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))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9549f60..7b38a52 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..e653c71
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr80692.c
@@ -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;
+}