Commit bc6d4c3f by Joseph Myers Committed by Joseph Myers

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
parent 0178d644
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.
......
......@@ -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);
......
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
}
/* 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. */
......
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 =
......
/* 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>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment