dfp.c (WORDS_BIGENDIAN): Define to 0 if not defined.
authorJoseph Myers <joseph@codesourcery.com>
Tue, 10 Jun 2008 23:43:09 +0000 (00:43 +0100)
committerJoseph Myers <jsm28@gcc.gnu.org>
Tue, 10 Jun 2008 23:43:09 +0000 (00:43 +0100)
gcc:
* dfp.c (WORDS_BIGENDIAN): Define to 0 if not defined.
(encode_decimal64, decode_decimal64, encode_decimal128,
decode_decimal128): Reverse order of 32-bit parts of value if host
and target endianness differ.

libdecnumber:
* dconfig.h: New.
* decContext.c, decExcept.c, decExcept.h, decLibrary.c,
decNumber.c, decNumberLocal.h, decRound.c, dpd/decimal128.c,
dpd/decimal32.c, dpd/decimal64.c: Include dconfig.h not config.h.
* dpd/decimal128Local.h (decimal128SetSign, decimal128ClearSign,
decimal128FlipSign): Use WORDS_BIGENDIAN not
FLOAT_WORDS_BIG_ENDIAN.
* bid/host-ieee128.c: Include dconfig.h.
(__host_to_ieee_128, __ieee_to_host_128): Swap 64-bit halves of
value if WORDS_BIGENDIAN.

libgcc:
* Makefile.in (DECNUMINC): Remove
-I$(MULTIBUILDTOP)../../libdecnumber.
* gstdint.h: New.

From-SVN: r136641

19 files changed:
gcc/ChangeLog
gcc/dfp.c
libdecnumber/ChangeLog
libdecnumber/bid/host-ieee128.c
libdecnumber/dconfig.h [new file with mode: 0644]
libdecnumber/decContext.c
libdecnumber/decExcept.c
libdecnumber/decExcept.h
libdecnumber/decLibrary.c
libdecnumber/decNumber.c
libdecnumber/decNumberLocal.h
libdecnumber/decRound.c
libdecnumber/dpd/decimal128.c
libdecnumber/dpd/decimal128Local.h
libdecnumber/dpd/decimal32.c
libdecnumber/dpd/decimal64.c
libgcc/ChangeLog
libgcc/Makefile.in
libgcc/gstdint.h [new file with mode: 0644]

index cf40b3751f94b8d184530a1dbb40cb16163a0c2f..63035a09edfa8ff6071b282b960fd2fb7798ecfb 100644 (file)
@@ -1,3 +1,10 @@
+2008-06-10  Joseph Myers  <joseph@codesourcery.com>
+
+       * dfp.c (WORDS_BIGENDIAN): Define to 0 if not defined.
+       (encode_decimal64, decode_decimal64, encode_decimal128,
+       decode_decimal128): Reverse order of 32-bit parts of value if host
+       and target endianness differ.
+
 2008-06-10  Vinodha Ramasamy  <vinodha@google.com>
         * value_prob.c (tree_divmod_fixed_value_transform): Use gcov_type.
        Avoid division by 0.
index fde3b84bda51180b739af04cac313d33728aa48f..43262380af5a5b4e69fb66ef6a0e6821bc6c02d1 100644 (file)
--- a/gcc/dfp.c
+++ b/gcc/dfp.c
@@ -36,6 +36,10 @@ along with GCC; see the file COPYING3.  If not see
 #include "decimal32.h"
 #include "decNumber.h"
 
+#ifndef WORDS_BIGENDIAN
+#define WORDS_BIGENDIAN 0
+#endif
+
 /* Initialize R (a real with the decimal flag set) from DN.  Can
    utilize status passed in via CONTEXT, if a previous operation had
    interesting status.  */
@@ -173,8 +177,16 @@ encode_decimal64 (const struct real_format *fmt ATTRIBUTE_UNUSED,
   decimal_to_decnumber (r, &dn);
   decimal64FromNumber (&d64, &dn, &set);
 
-  buf[0] = *(uint32_t *) &d64.bytes[0];
-  buf[1] = *(uint32_t *) &d64.bytes[4];
+  if (WORDS_BIGENDIAN == FLOAT_WORDS_BIG_ENDIAN)
+    {
+      buf[0] = *(uint32_t *) &d64.bytes[0];
+      buf[1] = *(uint32_t *) &d64.bytes[4];
+    }
+  else
+    {
+      buf[0] = *(uint32_t *) &d64.bytes[4];
+      buf[1] = *(uint32_t *) &d64.bytes[0];
+    }
 }
 
 /* Decode an IEEE 754R decimal64 type into a real.  */
@@ -190,8 +202,16 @@ decode_decimal64 (const struct real_format *fmt ATTRIBUTE_UNUSED,
   decContextDefault (&set, DEC_INIT_DECIMAL128);
   set.traps = 0;
 
-  *((uint32_t *) &d64.bytes[0]) = (uint32_t) buf[0];
-  *((uint32_t *) &d64.bytes[4]) = (uint32_t) buf[1];
+  if (WORDS_BIGENDIAN == FLOAT_WORDS_BIG_ENDIAN)
+    {
+      *((uint32_t *) &d64.bytes[0]) = (uint32_t) buf[0];
+      *((uint32_t *) &d64.bytes[4]) = (uint32_t) buf[1];
+    }
+  else
+    {
+      *((uint32_t *) &d64.bytes[0]) = (uint32_t) buf[1];
+      *((uint32_t *) &d64.bytes[4]) = (uint32_t) buf[0];
+    }
 
   decimal64ToNumber (&d64, &dn);
   decimal_from_decnumber (r, &dn, &set); 
@@ -213,10 +233,20 @@ encode_decimal128 (const struct real_format *fmt ATTRIBUTE_UNUSED,
   decimal_to_decnumber (r, &dn);
   decimal128FromNumber (&d128, &dn, &set);
 
-  buf[0] = *(uint32_t *) &d128.bytes[0];
-  buf[1] = *(uint32_t *) &d128.bytes[4];
-  buf[2] = *(uint32_t *) &d128.bytes[8];
-  buf[3] = *(uint32_t *) &d128.bytes[12];
+  if (WORDS_BIGENDIAN == FLOAT_WORDS_BIG_ENDIAN)
+    {
+      buf[0] = *(uint32_t *) &d128.bytes[0];
+      buf[1] = *(uint32_t *) &d128.bytes[4];
+      buf[2] = *(uint32_t *) &d128.bytes[8];
+      buf[3] = *(uint32_t *) &d128.bytes[12];
+    }
+  else
+    {
+      buf[0] = *(uint32_t *) &d128.bytes[12];
+      buf[1] = *(uint32_t *) &d128.bytes[8];
+      buf[2] = *(uint32_t *) &d128.bytes[4];
+      buf[3] = *(uint32_t *) &d128.bytes[0];
+    }
 }
 
 /* Decode an IEEE 754R decimal128 type into a real.  */
@@ -232,10 +262,20 @@ decode_decimal128 (const struct real_format *fmt ATTRIBUTE_UNUSED,
   decContextDefault (&set, DEC_INIT_DECIMAL128);
   set.traps = 0;
 
-  *((uint32_t *) &d128.bytes[0])  = (uint32_t) buf[0];
-  *((uint32_t *) &d128.bytes[4])  = (uint32_t) buf[1];
-  *((uint32_t *) &d128.bytes[8])  = (uint32_t) buf[2];
-  *((uint32_t *) &d128.bytes[12]) = (uint32_t) buf[3];
+  if (WORDS_BIGENDIAN == FLOAT_WORDS_BIG_ENDIAN)
+    {
+      *((uint32_t *) &d128.bytes[0])  = (uint32_t) buf[0];
+      *((uint32_t *) &d128.bytes[4])  = (uint32_t) buf[1];
+      *((uint32_t *) &d128.bytes[8])  = (uint32_t) buf[2];
+      *((uint32_t *) &d128.bytes[12]) = (uint32_t) buf[3];
+    }
+  else
+    {
+      *((uint32_t *) &d128.bytes[0])  = (uint32_t) buf[3];
+      *((uint32_t *) &d128.bytes[4])  = (uint32_t) buf[2];
+      *((uint32_t *) &d128.bytes[8])  = (uint32_t) buf[1];
+      *((uint32_t *) &d128.bytes[12]) = (uint32_t) buf[0];
+    }
 
   decimal128ToNumber (&d128, &dn);
   decimal_from_decnumber (r, &dn, &set); 
index 91c4f08dcaac0447d69bfd8839e501f7cb7b6217..153b6772f110b24057e816e486e05a42a84676eb 100644 (file)
@@ -1,3 +1,16 @@
+2008-06-10  Joseph Myers  <joseph@codesourcery.com>
+
+       * dconfig.h: New.
+       * decContext.c, decExcept.c, decExcept.h, decLibrary.c,
+       decNumber.c, decNumberLocal.h, decRound.c, dpd/decimal128.c,
+       dpd/decimal32.c, dpd/decimal64.c: Include dconfig.h not config.h.
+       * dpd/decimal128Local.h (decimal128SetSign, decimal128ClearSign,
+       decimal128FlipSign): Use WORDS_BIGENDIAN not
+       FLOAT_WORDS_BIG_ENDIAN.
+       * bid/host-ieee128.c: Include dconfig.h.
+       (__host_to_ieee_128, __ieee_to_host_128): Swap 64-bit halves of
+       value if WORDS_BIGENDIAN.
+
 2008-04-18  Paolo Bonzini  <bonzini@gnu.org>
 
        PR bootstrap/35457
index 6d493e5c9d8a49bd5c13b9542f3cf930c8f42fc2..12632c8aab2420ce2aec4664d3a4f51e5e43ce11 100644 (file)
@@ -29,20 +29,35 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
 
 #include <string.h>
 
+#include "dconfig.h"
 #include "bid-dpd.h"
 #include "decimal128.h"
 
 void __host_to_ieee_128 (_Decimal128 in, decimal128 *out);
 void __ieee_to_host_128 (decimal128 in, _Decimal128 *out);
 
+/* The code for converting 128-bit values between DPD and BID presumes
+   that the 64-bit halves of the 128-bit value are in little-endian
+   order, so they need swapping on big-endian hosts.  */
+
 void
 __host_to_ieee_128 (_Decimal128 in, decimal128 *out)
 {
+#if WORDS_BIGENDIAN
+  memcpy ((char *) out, (char *) &in + 8, 8);
+  memcpy ((char *) out + 8, (char *) &in, 8);
+#else
   memcpy ((char *) out, (char *) &in, 16);
+#endif
 }
 
 void
 __ieee_to_host_128 (decimal128 in, _Decimal128 *out)
 {
+#if WORDS_BIGENDIAN
+  memcpy ((char *) out, (char *) &in + 8, 8);
+  memcpy ((char *) out + 8, (char *) &in, 8);
+#else
   memcpy ((char *) out, (char *) &in, 16);
+#endif
 }
diff --git a/libdecnumber/dconfig.h b/libdecnumber/dconfig.h
new file mode 100644 (file)
index 0000000..ffbad25
--- /dev/null
@@ -0,0 +1,52 @@
+/* Configure decNumber for either host or target.
+   Copyright (C) 2008 Free Software Foundation, Inc.
+
+   This file is part of GCC.
+
+   GCC is free software; you can redistribute it and/or modify it under
+   the terms of the GNU General Public License as published by the Free
+   Software Foundation; either version 2, or (at your option) any later
+   version.
+
+   In addition to the permissions in the GNU General Public License,
+   the Free Software Foundation gives you unlimited permission to link
+   the compiled version of this file into combinations with other
+   programs, and to distribute those combinations without any
+   restriction coming from the use of this file.  (The General Public
+   License restrictions do apply in other respects; for example, they
+   cover modification of the file, and distribution when not linked
+   into a combine executable.)
+
+   GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+   WARRANTY; without even the implied warranty of MERCHANTABILITY or
+   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+   for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GCC; see the file COPYING.  If not, write to the Free
+   Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.  */
+
+#ifdef IN_LIBGCC2
+
+#include "tconfig.h"
+#include "coretypes.h"
+#include "tm.h"
+
+#ifndef LIBGCC2_WORDS_BIG_ENDIAN
+#define LIBGCC2_WORDS_BIG_ENDIAN WORDS_BIG_ENDIAN
+#endif
+
+#ifndef LIBGCC2_FLOAT_WORDS_BIG_ENDIAN
+#define LIBGCC2_FLOAT_WORDS_BIG_ENDIAN LIBGCC2_WORDS_BIG_ENDIAN
+#endif
+
+#if LIBGCC2_FLOAT_WORDS_BIG_ENDIAN
+#define WORDS_BIGENDIAN 1
+#endif
+
+#else
+
+#include "config.h"
+
+#endif
index 077419318194df44cc1d53f0a82580c90276816e..d2e3bed439750c1c845efab12b87004a4866c1da 100644 (file)
@@ -37,7 +37,7 @@
 
 #include <string.h>          /* for strcmp */
 #include <stdio.h>           /* for printf if DECCHECK */
-#include "config.h"          /* for GCC definitions */
+#include "dconfig.h"         /* for GCC definitions */
 #include "decContext.h"              /* context and base types */
 #include "decNumberLocal.h"   /* decNumber local types, etc. */
 
index 6821702420655dde51b6aff8e2a96acb1592f8d7..a111aeeb41622e71c494de0543747e2a600bb2d1 100644 (file)
@@ -28,7 +28,7 @@
    02110-1301, USA.  */
 
 #include <fenv.h>
-#include "config.h"
+#include "dconfig.h"
 #include "decContext.h"
 #include "decExcept.h"
 
index 12ba87d01fbff88a9ffd297b64fba033c45c4db6..5dc1ebb1d167f94e9bae61caab7094d2cb335602 100644 (file)
@@ -28,7 +28,7 @@
    02110-1301, USA.  */
 
 #include <fenv.h>
-#include "config.h"
+#include "dconfig.h"
 #include "decContext.h"
 
 #define DFP_EXCEPTIONS_ENABLED 1
index 7e5e928edc27977db4969403b271f89a1417db9d..86daedd89e69707b39cf8709c800cccddb144d0b 100644 (file)
@@ -27,7 +27,7 @@
    Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.  */
 
-#include "config.h"
+#include "dconfig.h"
 #include "decContext.h"
 #include "decimal128.h"
 #include "decimal64.h"
index c5e223c812fea3e755700734025db06168cb7aa1..f9a624a1afa9498702f22213203c95fde906a8ee 100644 (file)
 #include <stdio.h>                /* for printf [if needed] */
 #include <string.h>               /* for strcpy */
 #include <ctype.h>                /* for lower */
-#include "config.h"               /* for GCC definitions */
+#include "dconfig.h"              /* for GCC definitions */
 #include "decNumber.h"            /* base number library */
 #include "decNumberLocal.h"       /* decNumber local types, etc. */
 
index c07e8cd6ef42a7e51944d9bd8969bfe3d29dabad..809eaa466a22bc4050dcd6eb7b668199dee248fe 100644 (file)
@@ -44,7 +44,7 @@
 
   #include <stdlib.h>        /* for abs                              */
   #include <string.h>        /* for memset, strcpy                   */
-  #include "config.h"        /* for WORDS_BIGENDIAN                  */
+  #include "dconfig.h"       /* for WORDS_BIGENDIAN                  */
 
   /* Conditional code flag -- set this to match hardware platform     */
   /* 1=little-endian, 0=big-endian                                   */
index 6e51eb6b5bac4a52c8a9e06c4dd5a6fbd4d423aa..26740bf69c2ad0130c14787c186bcb4e5d694db7 100644 (file)
@@ -28,7 +28,7 @@
    Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.  */
 
-#include "config.h"
+#include "dconfig.h"
 #include "decContext.h"
 #include "decRound.h"
 
index 0e32ceb181c68b654eee6ba47fdfcb16bd0d168a..54191aab5c02d60aaba4d68dd74862cfcf540081 100644 (file)
@@ -42,7 +42,7 @@
 #include <string.h>          /* [for memset/memcpy] */
 #include <stdio.h>           /* [for printf] */
 
-#include "config.h"          /* GCC definitions */
+#include "dconfig.h"         /* GCC definitions */
 #define         DECNUMDIGITS 34      /* make decNumbers with space for 34 */
 #include "decNumber.h"       /* base number library */
 #include "decNumberLocal.h"   /* decNumber local types, etc. */
index b4130b53425a722ab0431fa7f347a73752255ceb..9765427719336148cb346cbfc5e3c40dd4b5f8f6 100644 (file)
 
 /* Set sign; this assumes the sign was previously zero.  */
 #define decimal128SetSign(d,b) \
-  { (d)->bytes[FLOAT_WORDS_BIG_ENDIAN ? 0 : 15] |= ((unsigned) (b) << 7); }
+  { (d)->bytes[WORDS_BIGENDIAN ? 0 : 15] |= ((unsigned) (b) << 7); }
 
 /* Clear sign.  */
 #define decimal128ClearSign(d) \
-  { (d)->bytes[FLOAT_WORDS_BIG_ENDIAN ? 0 : 15] &= ~0x80; }
+  { (d)->bytes[WORDS_BIGENDIAN ? 0 : 15] &= ~0x80; }
 
 /* Flip sign.  */
 #define decimal128FlipSign(d) \
-  { (d)->bytes[FLOAT_WORDS_BIG_ENDIAN ? 0 : 15] ^= 0x80; }
+  { (d)->bytes[WORDS_BIGENDIAN ? 0 : 15] ^= 0x80; }
 
 #endif
index 42bddf172afc2309da464f235bd7d47bcf066dd6..d8e3f5978111d15e87a8e146a38fa8556db273fc 100644 (file)
@@ -42,7 +42,7 @@
 #include <string.h>          /* [for memset/memcpy] */
 #include <stdio.h>           /* [for printf] */
 
-#include "config.h"          /* GCC definitions */
+#include "dconfig.h"         /* GCC definitions */
 #define         DECNUMDIGITS  7      /* make decNumbers with space for 7 */
 #include "decNumber.h"       /* base number library */
 #include "decNumberLocal.h"   /* decNumber local types, etc. */
index c3617c46c088a3cf14bfb41801e0695c6bb6b3ae..474eb7cf8a0634bbb16b52acfda239e5d732b9d9 100644 (file)
@@ -42,7 +42,7 @@
 #include <string.h>          /* [for memset/memcpy] */
 #include <stdio.h>           /* [for printf] */
 
-#include "config.h"          /* GCC definitions */
+#include "dconfig.h"         /* GCC definitions */
 #define         DECNUMDIGITS 16      /* make decNumbers with space for 16 */
 #include "decNumber.h"       /* base number library */
 #include "decNumberLocal.h"   /* decNumber local types, etc. */
index 93c9b7996828c8e327da87e9e29b2b538627cc9b..a0f379adbf023587bf13490e16b627b2f3cf2b5c 100644 (file)
@@ -1,3 +1,9 @@
+2008-06-10  Joseph Myers  <joseph@codesourcery.com>
+
+       * Makefile.in (DECNUMINC): Remove
+       -I$(MULTIBUILDTOP)../../libdecnumber.
+       * gstdint.h: New.
+
 2008-06-07  Joseph Myers  <joseph@codesourcery.com>
 
        * config.host (strongarm*-*-*, ep9312*-*-*, xscale-*-*,
index 3acf2e856a43eeb8226d920c5400f90c01b847d5..94b6440f011ee3d463a87a739ccf758a8a9fbe15 100644 (file)
@@ -191,8 +191,7 @@ ifeq ($(enable_decimal_float),bid)
 DECNUMINC = -I$(srcdir)/config/libbid -DENABLE_DECIMAL_BID_FORMAT
 else
 DECNUMINC = -I$(srcdir)/../libdecnumber/$(enable_decimal_float) \
-           -I$(srcdir)/../libdecnumber \
-           -I$(MULTIBUILDTOP)../../libdecnumber
+           -I$(srcdir)/../libdecnumber
 endif
 else
 DECNUMINC =
diff --git a/libgcc/gstdint.h b/libgcc/gstdint.h
new file mode 100644 (file)
index 0000000..4d61c31
--- /dev/null
@@ -0,0 +1,6 @@
+/* This header is only for use of libdecnumber built as part of
+   libgcc.  The targets supported for decimal floating point have
+   <stdint.h>; libdecnumber uses GCC_HEADER_STDINT only for the sake
+   of the host.  */
+
+#include <stdint.h>