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
This commit is contained in:
parent
0178d64465
commit
bc6d4c3f08
19 changed files with 165 additions and 27 deletions
|
@ -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.
|
||||
|
|
64
gcc/dfp.c
64
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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
52
libdecnumber/dconfig.h
Normal file
52
libdecnumber/dconfig.h
Normal file
|
@ -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
|
|
@ -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. */
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
02110-1301, USA. */
|
||||
|
||||
#include <fenv.h>
|
||||
#include "config.h"
|
||||
#include "dconfig.h"
|
||||
#include "decContext.h"
|
||||
#include "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
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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. */
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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-*-*,
|
||||
|
|
|
@ -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 =
|
||||
|
|
6
libgcc/gstdint.h
Normal file
6
libgcc/gstdint.h
Normal file
|
@ -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>
|
Loading…
Add table
Reference in a new issue