gengenrtl.c (CONST_DOUBLE_FORMAT): Take the size REAL_ARITHMETIC will use into account.
[gcc.git] / gcc / rtl.c
index 1c5bf6db4cb41545dd81ea6923690625c4ec196a..4164c689c6c984414c281de40aee2eae474feb59 100644 (file)
--- a/gcc/rtl.c
+++ b/gcc/rtl.c
@@ -42,22 +42,47 @@ Boston, MA 02111-1307, USA.  */
 
 extern struct obstack *rtl_obstack;
 \f
-
 /* Calculate the format for CONST_DOUBLE.  This depends on the relative
    widths of HOST_WIDE_INT and REAL_VALUE_TYPE.
-   We only need to go out to e0wwww, since min(HOST_WIDE_INT)==32 and
-   max(LONG_DOUBLE_TYPE_SIZE)==128.
+
+   We need to go out to e0wwwww, since REAL_ARITHMETIC assumes 16-bits
+   per element in REAL_VALUE_TYPE.
+
    This is duplicated in gengenrtl.c.
+
    A number of places assume that there are always at least two 'w'
    slots in a CONST_DOUBLE, so we provide them even if one would suffice.  */
-#if HOST_BITS_PER_WIDE_INT >= LONG_DOUBLE_TYPE_SIZE
+
+#ifdef REAL_ARITHMETIC
+#if LONG_DOUBLE_TYPE_SIZE == 96
+#define REAL_WIDTH     (11*8 + HOST_BITS_PER_WIDE_INT)/HOST_BITS_PER_WIDE_INT
+#elif LONG_DOUBLE_TYPE_SIZE == 128
+#define REAL_WIDTH     (19*8 + HOST_BITS_PER_WIDE_INT)/HOST_BITS_PER_WIDE_INT
+#elif HOST_FLOAT_FORMAT != TARGET_FLOAT_FORMAT
+#define REAL_WIDTH     (7*8 + HOST_BITS_PER_WIDE_INT)/HOST_BITS_PER_WIDE_INT
+#endif
+#endif /* REAL_ARITHMETIC */
+
+#ifndef REAL_WIDTH
+#if HOST_BITS_PER_WIDE_INT*2 >= LONG_DOUBLE_TYPE_SIZE
+#define REAL_WIDTH     2
+#elif HOST_BITS_PER_WIDE_INT*3 >= LONG_DOUBLE_TYPE_SIZE
+#define REAL_WIDTH     3
+#elif HOST_BITS_PER_WIDE_INT*4 >= LONG_DOUBLE_TYPE_SIZE
+#define REAL_WIDTH     4
+#endif
+#endif /* REAL_WIDTH */
+
+#if REAL_WIDTH == 1
 #define CONST_DOUBLE_FORMAT    "e0ww"
-#elif HOST_BITS_PER_WIDE_INT*2 >= LONG_DOUBLE_TYPE_SIZE
+#elif REAL_WIDTH == 2
 #define CONST_DOUBLE_FORMAT    "e0ww"
-#elif HOST_BITS_PER_WIDE_INT*3 >= LONG_DOUBLE_TYPE_SIZE
+#elif REAL_WIDTH == 3
 #define CONST_DOUBLE_FORMAT    "e0www"
-#elif HOST_BITS_PER_WIDE_INT*4 >= LONG_DOUBLE_TYPE_SIZE
+#elif REAL_WIDTH == 4
 #define CONST_DOUBLE_FORMAT    "e0wwww"
+#elif REAL_WIDTH == 5
+#define CONST_DOUBLE_FORMAT    "e0wwwww"
 #else
 #define CONST_DOUBLE_FORMAT    /* nothing - will cause syntax error */
 #endif