summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2008-06-11 00:43:09 +0100
committerJoseph Myers <jsm28@gcc.gnu.org>2008-06-11 00:43:09 +0100
commitbc6d4c3f08404ffb1cb9379649d60bace4d15258 (patch)
treeaaae18cb379d8aaa4351816af260f701d6721cc1
parent0178d64465a03fdfa6e37f6f0750ad7d55e446f1 (diff)
downloadgcc-bc6d4c3f08404ffb1cb9379649d60bace4d15258.tar.gz
dfp.c (WORDS_BIGENDIAN): Define to 0 if not defined.
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
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/dfp.c64
-rw-r--r--libdecnumber/ChangeLog13
-rw-r--r--libdecnumber/bid/host-ieee128.c15
-rw-r--r--libdecnumber/dconfig.h52
-rw-r--r--libdecnumber/decContext.c2
-rw-r--r--libdecnumber/decExcept.c2
-rw-r--r--libdecnumber/decExcept.h2
-rw-r--r--libdecnumber/decLibrary.c2
-rw-r--r--libdecnumber/decNumber.c2
-rw-r--r--libdecnumber/decNumberLocal.h2
-rw-r--r--libdecnumber/decRound.c2
-rw-r--r--libdecnumber/dpd/decimal128.c2
-rw-r--r--libdecnumber/dpd/decimal128Local.h6
-rw-r--r--libdecnumber/dpd/decimal32.c2
-rw-r--r--libdecnumber/dpd/decimal64.c2
-rw-r--r--libgcc/ChangeLog6
-rw-r--r--libgcc/Makefile.in3
-rw-r--r--libgcc/gstdint.h6
19 files changed, 165 insertions, 27 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cf40b3751f9..63035a09edf 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/dfp.c b/gcc/dfp.c
index fde3b84bda5..43262380af5 100644
--- 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);
diff --git a/libdecnumber/ChangeLog b/libdecnumber/ChangeLog
index 91c4f08dcaa..153b6772f11 100644
--- a/libdecnumber/ChangeLog
+++ b/libdecnumber/ChangeLog
@@ -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
diff --git a/libdecnumber/bid/host-ieee128.c b/libdecnumber/bid/host-ieee128.c
index 6d493e5c9d8..12632c8aab2 100644
--- a/libdecnumber/bid/host-ieee128.c
+++ b/libdecnumber/bid/host-ieee128.c
@@ -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
index 00000000000..ffbad255ce5
--- /dev/null
+++ b/libdecnumber/dconfig.h
@@ -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
diff --git a/libdecnumber/decContext.c b/libdecnumber/decContext.c
index 07741931819..d2e3bed4397 100644
--- a/libdecnumber/decContext.c
+++ b/libdecnumber/decContext.c
@@ -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. */
diff --git a/libdecnumber/decExcept.c b/libdecnumber/decExcept.c
index 68217024206..a111aeeb416 100644
--- a/libdecnumber/decExcept.c
+++ b/libdecnumber/decExcept.c
@@ -28,7 +28,7 @@
02110-1301, USA. */
#include <fenv.h>
-#include "config.h"
+#include "dconfig.h"
#include "decContext.h"
#include "decExcept.h"
diff --git a/libdecnumber/decExcept.h b/libdecnumber/decExcept.h
index 12ba87d01fb..5dc1ebb1d16 100644
--- a/libdecnumber/decExcept.h
+++ b/libdecnumber/decExcept.h
@@ -28,7 +28,7 @@
02110-1301, USA. */
#include <fenv.h>
-#include "config.h"
+#include "dconfig.h"
#include "decContext.h"
#define DFP_EXCEPTIONS_ENABLED 1
diff --git a/libdecnumber/decLibrary.c b/libdecnumber/decLibrary.c
index 7e5e928edc2..86daedd89e6 100644
--- a/libdecnumber/decLibrary.c
+++ b/libdecnumber/decLibrary.c
@@ -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"
diff --git a/libdecnumber/decNumber.c b/libdecnumber/decNumber.c
index c5e223c812f..f9a624a1afa 100644
--- a/libdecnumber/decNumber.c
+++ b/libdecnumber/decNumber.c
@@ -170,7 +170,7 @@
#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. */
diff --git a/libdecnumber/decNumberLocal.h b/libdecnumber/decNumberLocal.h
index c07e8cd6ef4..809eaa466a2 100644
--- a/libdecnumber/decNumberLocal.h
+++ b/libdecnumber/decNumberLocal.h
@@ -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 */
diff --git a/libdecnumber/decRound.c b/libdecnumber/decRound.c
index 6e51eb6b5ba..26740bf69c2 100644
--- a/libdecnumber/decRound.c
+++ b/libdecnumber/decRound.c
@@ -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"
diff --git a/libdecnumber/dpd/decimal128.c b/libdecnumber/dpd/decimal128.c
index 0e32ceb181c..54191aab5c0 100644
--- a/libdecnumber/dpd/decimal128.c
+++ b/libdecnumber/dpd/decimal128.c
@@ -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. */
diff --git a/libdecnumber/dpd/decimal128Local.h b/libdecnumber/dpd/decimal128Local.h
index b4130b53425..97654277193 100644
--- a/libdecnumber/dpd/decimal128Local.h
+++ b/libdecnumber/dpd/decimal128Local.h
@@ -34,14 +34,14 @@
/* 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
diff --git a/libdecnumber/dpd/decimal32.c b/libdecnumber/dpd/decimal32.c
index 42bddf172af..d8e3f597811 100644
--- a/libdecnumber/dpd/decimal32.c
+++ b/libdecnumber/dpd/decimal32.c
@@ -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. */
diff --git a/libdecnumber/dpd/decimal64.c b/libdecnumber/dpd/decimal64.c
index c3617c46c08..474eb7cf8a0 100644
--- a/libdecnumber/dpd/decimal64.c
+++ b/libdecnumber/dpd/decimal64.c
@@ -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. */
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog
index 93c9b799682..a0f379adbf0 100644
--- a/libgcc/ChangeLog
+++ b/libgcc/ChangeLog
@@ -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-*-*,
diff --git a/libgcc/Makefile.in b/libgcc/Makefile.in
index 3acf2e856a4..94b6440f011 100644
--- a/libgcc/Makefile.in
+++ b/libgcc/Makefile.in
@@ -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
index 00000000000..4d61c318440
--- /dev/null
+++ b/libgcc/gstdint.h
@@ -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>