From 42dc1cf56b3a09aa5a6b62796bc203d2d0b4fb8e Mon Sep 17 00:00:00 2001 From: janis Date: Fri, 6 Feb 2009 21:01:46 +0000 Subject: [PATCH] PR c/39035 * real.c (do_compare): Special-case compare of zero against decimal float value. * gcc.dg/dfp/pr39035.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@143992 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 +++ gcc/real.c | 10 ++++- gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.dg/dfp/pr39035.c | 81 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/dfp/pr39035.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fcbe406326b..1e450105874 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-02-06 Janis Johnson + + PR c/39035 + * real.c (do_compare): Special-case compare of zero against + decimal float value. + 2009-02-06 Joseph Myers PR c/36432 diff --git a/gcc/real.c b/gcc/real.c index d26b0cbd0c9..29fee8305e1 100644 --- a/gcc/real.c +++ b/gcc/real.c @@ -905,15 +905,23 @@ do_compare (const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b, /* Sign of zero doesn't matter for compares. */ return 0; + case CLASS2 (rvc_normal, rvc_zero): + /* Decimal float zero is special and uses rvc_normal, not rvc_zero. */ + if (a->decimal) + return decimal_do_compare (a, b, nan_result); + /* Fall through. */ case CLASS2 (rvc_inf, rvc_zero): case CLASS2 (rvc_inf, rvc_normal): - case CLASS2 (rvc_normal, rvc_zero): return (a->sign ? -1 : 1); case CLASS2 (rvc_inf, rvc_inf): return -a->sign - -b->sign; case CLASS2 (rvc_zero, rvc_normal): + /* Decimal float zero is special and uses rvc_normal, not rvc_zero. */ + if (b->decimal) + return decimal_do_compare (a, b, nan_result); + /* Fall through. */ case CLASS2 (rvc_zero, rvc_inf): case CLASS2 (rvc_normal, rvc_inf): return (b->sign ? 1 : -1); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f88b297c83b..bf0aca756ee 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-02-06 Janis Johnson + + PR c/39035 + * gcc.dg/dfp/pr39035.c: New test. + 2009-02-06 Joseph Myers PR c/36432 diff --git a/gcc/testsuite/gcc.dg/dfp/pr39035.c b/gcc/testsuite/gcc.dg/dfp/pr39035.c new file mode 100644 index 00000000000..2d44e06a432 --- /dev/null +++ b/gcc/testsuite/gcc.dg/dfp/pr39035.c @@ -0,0 +1,81 @@ +/* { dg-do run } */ +/* { dg-options "-std=gnu99 -O" } */ + +/* DFP TR 24732 == WG14 / N1176, N1312 */ +/* Based on a test from Fred Tydeman. */ + +extern void abort (void); +int failures = 0; + +#ifdef DBG +#include +#define FAILURE(MSG) { printf ("line %d: %s\n", __LINE__, MSG); failures++; } +#else +#define FAILURE(MSG) failures++; +#endif + +/* Test runtime computations. */ + +void +runtime32 (void) +{ + volatile _Decimal32 d; + d = 0.0DF; + if (d) + FAILURE ("0.0DF should be zero") +} + +void +runtime64 (void) +{ + volatile _Decimal64 d; + d = 0.0DD; + if (d) + FAILURE ("0.0DD should be zero") +} + +void +runtime128 (void) +{ + volatile _Decimal128 d; + d = 0.0DL; + if (d) + FAILURE ("0.0DL should be zero") +} + +void +fold32 (void) +{ + if (0.0DF) + FAILURE ("0.0DF should be zero") +} + +void +fold64 (void) +{ + if (0.0DD) + FAILURE ("0.0DD should be zero") +} + +void +fold128 (void) +{ + if (0.0DL) + FAILURE ("0.0DL should be zero") +} + +int +main(void) +{ + runtime32 (); + runtime64 (); + runtime128 (); + + fold32 (); + fold64 (); + fold128 (); + + if (failures != 0) + abort (); + return 0; +} -- 2.11.0