From bc6d4c3f08404ffb1cb9379649d60bace4d15258 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Wed, 11 Jun 2008 00:43:09 +0100 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 ++++ gcc/dfp.c | 64 ++++++++++++++++++++++++------ libdecnumber/ChangeLog | 13 ++++++ libdecnumber/bid/host-ieee128.c | 15 +++++++ libdecnumber/dconfig.h | 52 ++++++++++++++++++++++++ libdecnumber/decContext.c | 2 +- libdecnumber/decExcept.c | 2 +- libdecnumber/decExcept.h | 2 +- libdecnumber/decLibrary.c | 2 +- libdecnumber/decNumber.c | 2 +- libdecnumber/decNumberLocal.h | 2 +- libdecnumber/decRound.c | 2 +- libdecnumber/dpd/decimal128.c | 2 +- libdecnumber/dpd/decimal128Local.h | 6 +-- libdecnumber/dpd/decimal32.c | 2 +- libdecnumber/dpd/decimal64.c | 2 +- libgcc/ChangeLog | 6 +++ libgcc/Makefile.in | 3 +- libgcc/gstdint.h | 6 +++ 19 files changed, 165 insertions(+), 27 deletions(-) create mode 100644 libdecnumber/dconfig.h create mode 100644 libgcc/gstdint.h 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 + + * 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 * 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 + + * 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 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 +#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 /* for strcmp */ #include /* 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 -#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 -#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 /* for printf [if needed] */ #include /* for strcpy */ #include /* 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 /* for abs */ #include /* 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 /* [for memset/memcpy] */ #include /* [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 /* [for memset/memcpy] */ #include /* [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 /* [for memset/memcpy] */ #include /* [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 + + * Makefile.in (DECNUMINC): Remove + -I$(MULTIBUILDTOP)../../libdecnumber. + * gstdint.h: New. + 2008-06-07 Joseph Myers * 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 + ; libdecnumber uses GCC_HEADER_STDINT only for the sake + of the host. */ + +#include -- 2.30.2