summaryrefslogtreecommitdiff
path: root/gcc/real.c
diff options
context:
space:
mode:
authordje <dje@138bc75d-0d04-0410-961f-82ee72b054a4>2002-04-19 17:12:59 +0000
committerdje <dje@138bc75d-0d04-0410-961f-82ee72b054a4>2002-04-19 17:12:59 +0000
commit046212551aad5610365a7402e3880a033b41e2bb (patch)
tree2e85cc466cd945f5bebc7ff57a852289e1b8e2fd /gcc/real.c
parent0b98ad8c937ab9d63ea0418073c319326736cbde (diff)
downloadgcc-046212551aad5610365a7402e3880a033b41e2bb.tar.gz
2002-04-19 Andreas Schwab <schwab@suse.de>
* real.c: Allow sizeof (REAL_VALUE_TYPE) > 2*NE. (PUT_REAL): Restore old definition. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@52527 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/real.c')
-rw-r--r--gcc/real.c17
1 files changed, 12 insertions, 5 deletions
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)