aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJanis Johnson <janis187@us.ibm.com>2008-04-03 23:49:35 +0000
committerJanis Johnson <janis@gcc.gnu.org>2008-04-03 23:49:35 +0000
commit6db07dcbf61e96be4fbaf9b4c6f9aea19cff61b2 (patch)
tree204d2542b8154752ec21e713ddd9b4423580e3df /gcc
parent79addd1f3581896333c5437c10ae7a5202acc2ae (diff)
downloadgcc-6db07dcbf61e96be4fbaf9b4c6f9aea19cff61b2.zip
gcc-6db07dcbf61e96be4fbaf9b4c6f9aea19cff61b2.tar.gz
gcc-6db07dcbf61e96be4fbaf9b4c6f9aea19cff61b2.tar.bz2
re PR c/35712 (decimal float literal constant zero loses significant trailing zeroes)
2008-04-03 Janis Johnson <janis187@us.ibm.com> gcc/ PR c/35712 * dfp.c (decimal_from_decnumber): Retain trailing zeroes for decimal-float literal constant zero. testsuite/ PR c/35712 * gcc.dg/dfp/constants-zero.c: New test. From-SVN: r133881
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/dfp.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/dfp/constants-zero.c159
4 files changed, 170 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a9aad32..6965a49 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2008-04-03 Janis Johnson <janis187@us.ibm.com>
+
+ PR c/35712
+ * dfp.c (decimal_from_decnumber): Retain trailing zeroes for
+ decimal-float literal constant zero.
+
2008-04-03 Jakub Jelinek <jakub@redhat.com>
PR c/35738
diff --git a/gcc/dfp.c b/gcc/dfp.c
index 88ffded..2526ef6 100644
--- a/gcc/dfp.c
+++ b/gcc/dfp.c
@@ -46,8 +46,6 @@ decimal_from_decnumber (REAL_VALUE_TYPE *r, decNumber *dn, decContext *context)
memset (r, 0, sizeof (REAL_VALUE_TYPE));
r->cl = rvc_normal;
- if (decNumberIsZero (dn))
- r->cl = rvc_zero;
if (decNumberIsNaN (dn))
r->cl = rvc_nan;
if (decNumberIsInfinite (dn))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c89aa30..f3b7b6f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2008-04-03 Janis Johnson <janis187@us.ibm.com>
+
+ PR c/35712
+ * gcc.dg/dfp/constants-zero.c: New test.
+
2008-04-03 Jakub Jelinek <jakub@redhat.com>
PR c/35738
diff --git a/gcc/testsuite/gcc.dg/dfp/constants-zero.c b/gcc/testsuite/gcc.dg/dfp/constants-zero.c
new file mode 100644
index 0000000..e0db28c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/dfp/constants-zero.c
@@ -0,0 +1,159 @@
+/* { dg-options "-std=gnu99 -O0" } */
+
+/* Decimal float values can have significant trailing zeroes. This is
+ true for zero values as well. Check that various representations of
+ zero are handled correctly when specified as literal constants. */
+
+extern void abort (void);
+
+int big_endian;
+
+typedef union U32 {
+ unsigned int i;
+ _Decimal32 d;
+ unsigned char b[4];
+} u32_t;
+
+typedef union U64 {
+ unsigned long long i;
+ _Decimal64 d;
+} u64_t;
+
+typedef union U128 {
+ unsigned long long i[2];
+ _Decimal128 d;
+} u128_t;
+
+int
+compare32 (_Decimal32 d, unsigned int i)
+{
+ u32_t u;
+
+ u.d = d;
+ return (u.i == i);
+}
+
+int
+compare64 (_Decimal64 d, unsigned long long i)
+{
+ u64_t u;
+
+ u.d = d;
+ return (u.i == i);
+}
+
+int
+compare128 (_Decimal64 d, unsigned long long i, unsigned long long j)
+{
+ u128_t u;
+
+ u.d = d;
+ if (big_endian)
+ return (u.i[0] == i && u.i[1] == j);
+ else
+ return (u.i[1] == i && u.i[0] == j);
+}
+
+void
+dpd_tests (void)
+{
+ if (! compare32 (0.DF, 0x22500000U))
+ abort ();
+ if (! compare32 (-0.DF, 0xa2500000U))
+ abort ();
+ if (! compare32 (0.E-4DF, 0x22100000U))
+ abort ();
+ if (! compare32 (0.E-7DF, 0x21e00000U))
+ abort ();
+ if (! compare32 (0.E+3DF, 0x22800000U))
+ abort ();
+
+ if (! compare64 (0.DD, 0x2238000000000000ULL))
+ abort ();
+ if (! compare64 (-0.DD, 0xa238000000000000ULL))
+ abort ();
+ if (! compare64 (0.E-6DD, 0x2220000000000000ULL))
+ abort ();
+ if (! compare64 (0.E-7DD, 0x221c000000000000ULL))
+ abort ();
+ if (! compare64 (0.E+2DD, 0x2240000000000000ULL))
+ abort ();
+
+ if (! compare128 (0.DL, 0x2208000000000000ULL, 0x0000000000000000ULL))
+ abort ();
+ if (! compare128 (-0.DL, 0xa208000000000000ULL, 0x0000000000000000ULL))
+ abort ();
+ if (! compare128 (0.E-3DL, 0x2207400000000000ULL, 0x0000000000000000ULL))
+ abort ();
+ if (! compare128 (0.E-8DL, 0x2206000000000000ULL, 0x0000000000000000ULL))
+ abort ();
+ if (! compare128 (0.E+2DL, 0x2208800000000000ULL, 0x0000000000000000ULL))
+ abort ();
+}
+
+void
+bid_tests (void)
+{
+ if (! compare32 (0.DF, 0x32800000U))
+ abort ();
+ if (! compare32 (-0.DF, 0xb2800000U))
+ abort ();
+ if (! compare32 (0.E-4DF, 0x30800000U))
+ abort ();
+ if (! compare32 (0.E-7DF, 0x2f000000U))
+ abort ();
+ if (! compare32 (0.E+3DF, 0x34000000U))
+ abort ();
+
+ if (! compare64 (0.DD, 0x31c0000000000000ULL))
+ abort ();
+ if (! compare64 (-0.DD, 0xb1c0000000000000ULL))
+ abort ();
+ if (! compare64 (0.E-6DD, 0x3100000000000000ULL))
+ abort ();
+ if (! compare64 (0.E-7DD, 0x30e0000000000000ULL))
+ abort ();
+ if (! compare64 (0.E+2DD, 0x3200000000000000ULL))
+ abort ();
+
+ if (! compare128 (0.DL, 0x3040000000000000ULL, 0x0000000000000000ULL))
+ abort ();
+ if (! compare128 (-0.DL, 0xb040000000000000ULL, 0x0000000000000000ULL))
+ abort ();
+ if (! compare128 (0.E-3DL, 0x303a000000000000ULL, 0x0000000000000000ULL))
+ abort ();
+ if (! compare128 (0.E-8DL, 0x3030000000000000ULL, 0x0000000000000000ULL))
+ abort ();
+ if (! compare128 (0.E+2DL, 0x3044000000000000ULL, 0x0000000000000000ULL))
+ abort ();
+}
+
+int
+main ()
+{
+ u32_t u32;
+
+ /* These sizes are probably always true for targets that support decimal
+ float types, but check anyway. Abort so we can fix the test. */
+ if ((sizeof (_Decimal64) != sizeof (long long))
+ || (sizeof (_Decimal128) != 2 * sizeof (long long))
+ || (sizeof (_Decimal32) != sizeof (_Decimal32)))
+ abort ();
+
+ u32.d = 1.DF;
+
+ if (u32.i == 0x22500001)
+ {
+ big_endian = (u32.b[0] == 0x22);
+ dpd_tests ();
+ }
+ else if (u32.i == 0x32800001)
+ {
+ big_endian = (u32.b[0] == 0x32);
+ bid_tests ();
+ }
+ else
+ abort (); /* unknown format; test problem */
+
+ return 0;
+}