diff options
author | Segher Boessenkool <segher@kernel.crashing.org> | 2017-05-17 23:57:23 +0200 |
---|---|---|
committer | Segher Boessenkool <segher@gcc.gnu.org> | 2017-05-17 23:57:23 +0200 |
commit | e98e63404c6b3057ac0f0ff4fe871cd19a1aacb4 (patch) | |
tree | 60059a11d628cc19e51fd631d1d8f35c71eb2b26 /gcc | |
parent | 78eca3093f7f60295aac46d559b5f21f3154e6dd (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/real.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr80692.c | 13 |
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 @@ -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; +} |