From 62a12b279567a085d7245af674b42bbe88a9f6e9 Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Fri, 19 Apr 2002 17:12:59 +0000 Subject: [PATCH] real.c: Allow sizeof (REAL_VALUE_TYPE) > 2*NE. 2002-04-19 Andreas Schwab * real.c: Allow sizeof (REAL_VALUE_TYPE) > 2*NE. (PUT_REAL): Restore old definition. From-SVN: r52527 --- gcc/ChangeLog | 5 +++++ gcc/real.c | 17 ++++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cd0ffc7e5c3..febb90a3e04 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2002-04-19 Andreas Schwab + + * real.c: Allow sizeof (REAL_VALUE_TYPE) > 2*NE. + (PUT_REAL): Restore old definition. + 2002-04-19 Dan Nicolaescu Gerald Pfeifer diff --git a/gcc/real.c b/gcc/real.c index 5d080393867..ad3d4b32e19 100644 --- a/gcc/real.c +++ b/gcc/real.c @@ -209,7 +209,7 @@ typedef unsigned int UHItype __attribute__ ((mode (HI))); #endif /* Calculate the size of the generic "e" type. This always has - identical in-memory size and representation to REAL_VALUE_TYPE. + identical in-memory size to REAL_VALUE_TYPE. There are only two supported sizes: ten and six 16-bit words (160 or 96 bits). */ @@ -224,11 +224,13 @@ typedef unsigned int UHItype __attribute__ ((mode (HI))); # define MINDECEXP -4956 #endif -/* Fail compilation if 2*NE is not the appropriate size. */ - +/* Fail compilation if 2*NE is not the appropriate size. + If HOST_BITS_PER_WIDE_INT is 64, we're going to have padding + at the end of the array, because neither 96 nor 160 is + evenly divisible by 64. */ struct compile_test_dummy { char twice_NE_must_equal_sizeof_REAL_VALUE_TYPE - [(sizeof (REAL_VALUE_TYPE) == 2*NE) ? 1 : -1]; + [(sizeof (REAL_VALUE_TYPE) >= 2*NE) ? 1 : -1]; }; /* Construct macros to translate between REAL_VALUE_TYPE and e type. @@ -236,7 +238,12 @@ struct compile_test_dummy { A REAL_VALUE_TYPE is guaranteed to occupy contiguous locations in memory, with no holes. */ #define GET_REAL(r, e) memcpy ((e), (r), 2*NE) -#define PUT_REAL(e, r) memcpy ((r), (e), 2*NE) +#define PUT_REAL(e, r) \ + do { \ + memcpy (r, e, 2*NE); \ + if (2*NE < sizeof (*r)) \ + memset ((char *) (r) + 2*NE, 0, sizeof (*r) - 2*NE); \ + } while (0) /* Number of 16 bit words in internal format */ #define NI (NE+3)