Skip to content

Commit

Permalink
gcc:
Browse files Browse the repository at this point in the history
	* 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.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@136641 138bc75d-0d04-0410-961f-82ee72b054a4
  • Loading branch information
jsm28 committed Jun 10, 2008
1 parent 5b17b7a commit 4d6f3aa
Show file tree
Hide file tree
Showing 19 changed files with 165 additions and 27 deletions.
7 changes: 7 additions & 0 deletions gcc/ChangeLog
Original file line number Diff line number Diff line change
@@ -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.
Expand Down
64 changes: 52 additions & 12 deletions gcc/dfp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down Expand Up @@ -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. */
Expand All @@ -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);
Expand All @@ -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. */
Expand All @@ -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);
Expand Down
13 changes: 13 additions & 0 deletions libdecnumber/ChangeLog
Original file line number Diff line number Diff line change
@@ -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
Expand Down
15 changes: 15 additions & 0 deletions libdecnumber/bid/host-ieee128.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 changes: 52 additions & 0 deletions libdecnumber/dconfig.h
Original file line number Diff line number Diff line change
@@ -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
2 changes: 1 addition & 1 deletion libdecnumber/decContext.c
Original file line number Diff line number Diff line change
Expand Up @@ -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. */

Expand Down
2 changes: 1 addition & 1 deletion libdecnumber/decExcept.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
02110-1301, USA. */

#include <fenv.h>
#include "config.h"
#include "dconfig.h"
#include "decContext.h"
#include "decExcept.h"

Expand Down
2 changes: 1 addition & 1 deletion libdecnumber/decExcept.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
02110-1301, USA. */

#include <fenv.h>
#include "config.h"
#include "dconfig.h"
#include "decContext.h"

#define DFP_EXCEPTIONS_ENABLED 1
Expand Down
2 changes: 1 addition & 1 deletion libdecnumber/decLibrary.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
2 changes: 1 addition & 1 deletion libdecnumber/decNumber.c
Original file line number Diff line number Diff line change
Expand Up @@ -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. */

Expand Down
2 changes: 1 addition & 1 deletion libdecnumber/decNumberLocal.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down
2 changes: 1 addition & 1 deletion libdecnumber/decRound.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down
2 changes: 1 addition & 1 deletion libdecnumber/dpd/decimal128.c
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down
6 changes: 3 additions & 3 deletions libdecnumber/dpd/decimal128Local.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 1 addition & 1 deletion libdecnumber/dpd/decimal32.c
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down
2 changes: 1 addition & 1 deletion libdecnumber/dpd/decimal64.c
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down
6 changes: 6 additions & 0 deletions libgcc/ChangeLog
Original file line number Diff line number Diff line change
@@ -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-*-*,
Expand Down
3 changes: 1 addition & 2 deletions libgcc/Makefile.in
Original file line number Diff line number Diff line change
Expand Up @@ -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 =
Expand Down
6 changes: 6 additions & 0 deletions libgcc/gstdint.h
Original file line number Diff line number Diff line change
@@ -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>

0 comments on commit 4d6f3aa

Please sign in to comment.