#ifndef GCC_REAL_H
#define GCC_REAL_H
+#include "machmode.h"
+
/* Define codes for all the float formats that we know of. */
#define UNKNOWN_FLOAT_FORMAT 0
#define IEEE_FLOAT_FORMAT 1
#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 */
-typedef struct {
+struct realvaluetype GTY(()) {
HOST_WIDE_INT r[REAL_WIDTH];
-} REAL_VALUE_TYPE;
+};
+/* 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
/* 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
slots in a CONST_DOUBLE, so we provide them even if one would suffice. */
#if REAL_WIDTH == 1
-# define CONST_DOUBLE_FORMAT "0ww"
+# define CONST_DOUBLE_FORMAT "ww"
#else
# if REAL_WIDTH == 2
-# define CONST_DOUBLE_FORMAT "0ww"
+# define CONST_DOUBLE_FORMAT "ww"
# else
# if REAL_WIDTH == 3
-# define CONST_DOUBLE_FORMAT "0www"
+# define CONST_DOUBLE_FORMAT "www"
# else
# if REAL_WIDTH == 4
-# define CONST_DOUBLE_FORMAT "0wwww"
+# define CONST_DOUBLE_FORMAT "wwww"
# else
# if REAL_WIDTH == 5
-# define CONST_DOUBLE_FORMAT "0wwwww"
+# define CONST_DOUBLE_FORMAT "wwwww"
# else
#error "REAL_WIDTH > 5 not supported"
# endif
extern REAL_VALUE_TYPE real_value_truncate PARAMS ((enum machine_mode,
REAL_VALUE_TYPE));
+/* Expansion of REAL_VALUE_TRUNCATE.
+ The result is in floating point, rounded to nearest or even. */
+extern bool exact_real_truncate PARAMS ((enum machine_mode,
+ REAL_VALUE_TYPE *));
+
/* These return HOST_WIDE_INT: */
/* Convert a floating-point value to integer, rounding toward zero. */
#define REAL_VALUE_FIX(x) (efixi (x))
/* Return a CONST_DOUBLE with value R and mode M. */
-#define CONST_DOUBLE_FROM_REAL_VALUE(r, m) immed_real_const_1 (r, m)
-extern struct rtx_def *immed_real_const_1 PARAMS ((REAL_VALUE_TYPE,
- enum machine_mode));
+#define CONST_DOUBLE_FROM_REAL_VALUE(r, m) \
+ const_double_from_real_value (r, m)
+extern rtx const_double_from_real_value PARAMS ((REAL_VALUE_TYPE,
+ enum machine_mode));
+
+/* Shorthand; can be handy in machine descriptions. */
+#define CONST_DOUBLE_ATOF(s, m) \
+ CONST_DOUBLE_FROM_REAL_VALUE (REAL_VALUE_ATOF (s, m), m)
/* Replace R by 1/R in the given machine mode, if the result is exact. */
extern int exact_real_inverse PARAMS ((enum machine_mode, REAL_VALUE_TYPE *));
extern void debug_real PARAMS ((REAL_VALUE_TYPE));
extern REAL_VALUE_TYPE ereal_atof PARAMS ((const char *, enum machine_mode));
+/* In tree.c: wrap up a REAL_VALUE_TYPE in a tree node. */
+extern tree build_real PARAMS ((tree, REAL_VALUE_TYPE));
+
+
#endif /* ! GCC_REAL_H */