diff options
Diffstat (limited to 'gcc/real.h')
-rw-r--r-- | gcc/real.h | 49 |
1 files changed, 35 insertions, 14 deletions
diff --git a/gcc/real.h b/gcc/real.h index 7ac10ffdd9a..6b9cc35a321 100644 --- a/gcc/real.h +++ b/gcc/real.h @@ -24,26 +24,47 @@ #include "machmode.h" -/* REAL_VALUE_TYPE is an array of the minimum number of HOST_WIDE_INTs - required to hold a 128-bit floating point type. This is true even - if the maximum precision floating point type on the target is smaller. +/* An expanded form of the represented number. */ + +/* Enumerate the special cases of numbers that we encounter. */ +enum real_value_class { + rvc_zero, + rvc_normal, + rvc_inf, + rvc_nan +}; + +#define SIGNIFICAND_BITS 128 +#define EXP_BITS (32 - 3) +#define MAX_EXP ((1 << (EXP_BITS - 1)) - 1) +#define SIGSZ (SIGNIFICAND_BITS / HOST_BITS_PER_LONG) +#define SIG_MSB ((unsigned long)1 << (HOST_BITS_PER_LONG - 1)) + +struct real_value GTY(()) +{ + enum real_value_class class : 2; + unsigned int sign : 1; + int exp : EXP_BITS; + unsigned long sig[SIGSZ]; +}; - The extra 32 bits are for storing the mode of the float. Ideally - we'd keep this elsewhere, but that's too drastic a change all at once. */ +/* Various headers condition prototypes on #ifdef REAL_VALUE_TYPE, so it + needs to be a macro. We do need to continue to have a structure tag + so that other headers can forward declare it. */ +#define REAL_VALUE_TYPE struct real_value -#define REAL_VALUE_TYPE_SIZE (128 + 32) +/* We store a REAL_VALUE_TYPE into an rtx, and we do this by putting it in + consecutive "w" slots. Moreover, we've got to compute the number of "w" + slots at preprocessor time, which means we can't use sizeof. Guess. */ + +#define REAL_VALUE_TYPE_SIZE (SIGNIFICAND_BITS + 32) #define REAL_WIDTH \ (REAL_VALUE_TYPE_SIZE/HOST_BITS_PER_WIDE_INT \ + (REAL_VALUE_TYPE_SIZE%HOST_BITS_PER_WIDE_INT ? 1 : 0)) /* round up */ -struct realvaluetype GTY(()) { - HOST_WIDE_INT r[REAL_WIDTH]; -}; - -/* Various headers condition prototypes on #ifdef REAL_VALUE_TYPE, so it needs - to be a macro. realvaluetype cannot be a typedef as this interferes with - other headers declaring opaque pointers to it. */ -#define REAL_VALUE_TYPE struct realvaluetype +/* Verify the guess. */ +extern char test_real_width + [sizeof(REAL_VALUE_TYPE) <= REAL_WIDTH*sizeof(HOST_WIDE_INT) ? 1 : -1]; /* Calculate the format for CONST_DOUBLE. We need as many slots as are necessary to overlay a REAL_VALUE_TYPE on them. This could be |