Commit f16e6077 by Richard Sandiford Committed by Richard Sandiford

Allow real_format to be passed to more real.h functions

Most real.h routines used machine modes to specify the format of
an operation and converted that to a float_format * internally.
Some also had alternative versions that accepted a float_format *.

In an upcoming patch it seemed more convenient for the callers
I was adding to use float_format directly, since the callers need
to examine the format themselves for other reasons.  This patch
therefore replaces the machine_mode arguments with a new class that
allows both machine modes and float_format pointers to be used.

Tested on x86_64-linux-gnu, arm-linux-gnueabi and aarch64-linux-gnu.

gcc/
	* real.h (format_helper): New.
	(real_convert, exact_real_truncate, real_from_string3, real_to_target)
	(real_from_target, real_nan, real_2expN, real_value_truncate)
	(significand_size, real_from_string2, exact_real_inverse)
	(exact_real_inverse, real_powi, real_trunc, real_floor, real_ceil)
	(real_round, real_isinteger, real_from_integer): Replace
	machine_mode arguments with format_helper arguments.
	* real.c (exact_real_inverse, real_from_string2, real_from_string3)
	(real_from_integer, real_nan, real_2expN, real_convert)
	(real_value_truncate, exact_real_truncate, real_to_target)
	(real_from_target, significand_size, real_powi, real_trunc)
	(real_floor, real_ceil, real_round, real_isinteger): Replace
	machine_mode arguments with format_helper arguments.
	(real_to_target_fmt, real_from_target_fmt): Delete.
	* dfp.h (decimal_real_convert): Replace mode argument with real_format.
	* dfp.c (decimal_to_binary, decimal_real_convert): Replace mode
	argument with real_format.
	* builtins.c (do_real_to_int_conversion): Update type of fn argument.

gcc/java/
	* jcf-parse.c (get_constant): Use real_from_target rather than
	real_from_target_fmt.

From-SVN: r229581
parent 4ff7defd
2015-10-30 Richard Sandiford <richard.sandiford@arm.com> 2015-10-30 Richard Sandiford <richard.sandiford@arm.com>
* real.h (format_helper): New.
(real_convert, exact_real_truncate, real_from_string3, real_to_target)
(real_from_target, real_nan, real_2expN, real_value_truncate)
(significand_size, real_from_string2, exact_real_inverse)
(exact_real_inverse, real_powi, real_trunc, real_floor, real_ceil)
(real_round, real_isinteger, real_from_integer): Replace
machine_mode arguments with format_helper arguments.
* real.c (exact_real_inverse, real_from_string2, real_from_string3)
(real_from_integer, real_nan, real_2expN, real_convert)
(real_value_truncate, exact_real_truncate, real_to_target)
(real_from_target, significand_size, real_powi, real_trunc)
(real_floor, real_ceil, real_round, real_isinteger): Replace
machine_mode arguments with format_helper arguments.
(real_to_target_fmt, real_from_target_fmt): Delete.
* dfp.h (decimal_real_convert): Replace mode argument with real_format.
* dfp.c (decimal_to_binary, decimal_real_convert): Replace mode
argument with real_format.
* builtins.c (do_real_to_int_conversion): Update type of fn argument.
2015-10-30 Richard Sandiford <richard.sandiford@arm.com>
* fixed-value.c (check_real_for_fixed_mode, fixed_from_string) * fixed-value.c (check_real_for_fixed_mode, fixed_from_string)
(fixed_to_decimal, fixed_convert_from_real) (fixed_to_decimal, fixed_convert_from_real)
(real_convert_from_fixed): Fix mode arguments to real_2expN. (real_convert_from_fixed): Fix mode arguments to real_2expN.
...@@ -7273,7 +7273,7 @@ fold_builtin_strlen (location_t loc, tree type, tree arg) ...@@ -7273,7 +7273,7 @@ fold_builtin_strlen (location_t loc, tree type, tree arg)
static tree static tree
do_real_to_int_conversion (tree itype, tree arg, do_real_to_int_conversion (tree itype, tree arg,
void (*fn) (REAL_VALUE_TYPE *, machine_mode, void (*fn) (REAL_VALUE_TYPE *, format_helper,
const REAL_VALUE_TYPE *)) const REAL_VALUE_TYPE *))
{ {
if (TREE_CODE (arg) != REAL_CST || TREE_OVERFLOW (arg)) if (TREE_CODE (arg) != REAL_CST || TREE_OVERFLOW (arg))
......
...@@ -343,13 +343,13 @@ decode_decimal128 (const struct real_format *fmt ATTRIBUTE_UNUSED, ...@@ -343,13 +343,13 @@ decode_decimal128 (const struct real_format *fmt ATTRIBUTE_UNUSED,
static void static void
decimal_to_binary (REAL_VALUE_TYPE *to, const REAL_VALUE_TYPE *from, decimal_to_binary (REAL_VALUE_TYPE *to, const REAL_VALUE_TYPE *from,
machine_mode mode) const real_format *fmt)
{ {
char string[256]; char string[256];
const decimal128 *const d128 = (const decimal128 *) from->sig; const decimal128 *const d128 = (const decimal128 *) from->sig;
decimal128ToString (d128, string); decimal128ToString (d128, string);
real_from_string3 (to, string, mode); real_from_string3 (to, string, fmt);
} }
...@@ -459,15 +459,13 @@ decimal_round_for_format (const struct real_format *fmt, REAL_VALUE_TYPE *r) ...@@ -459,15 +459,13 @@ decimal_round_for_format (const struct real_format *fmt, REAL_VALUE_TYPE *r)
binary and decimal types. */ binary and decimal types. */
void void
decimal_real_convert (REAL_VALUE_TYPE *r, machine_mode mode, decimal_real_convert (REAL_VALUE_TYPE *r, const real_format *fmt,
const REAL_VALUE_TYPE *a) const REAL_VALUE_TYPE *a)
{ {
const struct real_format *fmt = REAL_MODE_FORMAT (mode);
if (a->decimal && fmt->b == 10) if (a->decimal && fmt->b == 10)
return; return;
if (a->decimal) if (a->decimal)
decimal_to_binary (r, a, mode); decimal_to_binary (r, a, fmt);
else else
decimal_from_binary (r, a); decimal_from_binary (r, a);
} }
......
...@@ -34,7 +34,8 @@ void encode_decimal128 (const struct real_format *fmt, long *, const REAL_VALUE_ ...@@ -34,7 +34,8 @@ void encode_decimal128 (const struct real_format *fmt, long *, const REAL_VALUE_
int decimal_do_compare (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, int); int decimal_do_compare (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, int);
void decimal_real_from_string (REAL_VALUE_TYPE *, const char *); void decimal_real_from_string (REAL_VALUE_TYPE *, const char *);
void decimal_round_for_format (const struct real_format *, REAL_VALUE_TYPE *); void decimal_round_for_format (const struct real_format *, REAL_VALUE_TYPE *);
void decimal_real_convert (REAL_VALUE_TYPE *, machine_mode, const REAL_VALUE_TYPE *); void decimal_real_convert (REAL_VALUE_TYPE *, const real_format *,
const REAL_VALUE_TYPE *);
void decimal_real_to_decimal (char *, const REAL_VALUE_TYPE *, size_t, size_t, int); void decimal_real_to_decimal (char *, const REAL_VALUE_TYPE *, size_t, size_t, int);
void decimal_do_fix_trunc (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *); void decimal_do_fix_trunc (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
void decimal_real_maxval (REAL_VALUE_TYPE *, int, machine_mode); void decimal_real_maxval (REAL_VALUE_TYPE *, int, machine_mode);
......
2015-10-30 Richard Sandiford <richard.sandiford@arm.com>
* jcf-parse.c (get_constant): Use real_from_target rather than
real_from_target_fmt.
2015-10-29 Andrew MacLeod <amacleod@redhat.com> 2015-10-29 Andrew MacLeod <amacleod@redhat.com>
* boehm.c: Reorder #include's and remove duplicates. * boehm.c: Reorder #include's and remove duplicates.
......
...@@ -1058,7 +1058,7 @@ get_constant (JCF *jcf, int index) ...@@ -1058,7 +1058,7 @@ get_constant (JCF *jcf, int index)
long buf = num; long buf = num;
REAL_VALUE_TYPE d; REAL_VALUE_TYPE d;
real_from_target_fmt (&d, &buf, &ieee_single_format); real_from_target (&d, &buf, &ieee_single_format);
value = build_real (float_type_node, d); value = build_real (float_type_node, d);
break; break;
} }
...@@ -1076,7 +1076,7 @@ get_constant (JCF *jcf, int index) ...@@ -1076,7 +1076,7 @@ get_constant (JCF *jcf, int index)
else else
buf[0] = lo, buf[1] = hi; buf[0] = lo, buf[1] = hi;
real_from_target_fmt (&d, buf, &ieee_double_format); real_from_target (&d, buf, &ieee_double_format);
value = build_real (double_type_node, d); value = build_real (double_type_node, d);
break; break;
} }
......
...@@ -193,6 +193,28 @@ extern const struct real_format * ...@@ -193,6 +193,28 @@ extern const struct real_format *
(FLOAT_MODE_P (MODE) \ (FLOAT_MODE_P (MODE) \
&& FLOAT_MODE_FORMAT (MODE)->has_sign_dependent_rounding) && FLOAT_MODE_FORMAT (MODE)->has_sign_dependent_rounding)
/* This class allows functions in this file to accept a floating-point
format as either a mode or an explicit real_format pointer. In the
former case the mode must be VOIDmode (which means "no particular
format") or must satisfy SCALAR_FLOAT_MODE_P. */
class format_helper
{
public:
format_helper (const real_format *format) : m_format (format) {}
format_helper (machine_mode m);
const real_format *operator-> () const { return m_format; }
operator const real_format *() const { return m_format; }
bool decimal_p () const { return m_format && m_format->b == 10; }
private:
const real_format *m_format;
};
inline format_helper::format_helper (machine_mode m)
: m_format (m == VOIDmode ? 0 : REAL_MODE_FORMAT (m))
{}
/* Declare functions in real.c. */ /* Declare functions in real.c. */
/* True if the given mode has a NaN representation and the treatment of /* True if the given mode has a NaN representation and the treatment of
...@@ -254,12 +276,12 @@ extern bool real_identical (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *); ...@@ -254,12 +276,12 @@ extern bool real_identical (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
extern bool real_equal (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *); extern bool real_equal (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
extern bool real_less (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *); extern bool real_less (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
/* Extend or truncate to a new mode. */ /* Extend or truncate to a new format. */
extern void real_convert (REAL_VALUE_TYPE *, machine_mode, extern void real_convert (REAL_VALUE_TYPE *, format_helper,
const REAL_VALUE_TYPE *); const REAL_VALUE_TYPE *);
/* Return true if truncating to NEW is exact. */ /* Return true if truncating to NEW is exact. */
extern bool exact_real_truncate (machine_mode, const REAL_VALUE_TYPE *); extern bool exact_real_truncate (format_helper, const REAL_VALUE_TYPE *);
/* Render R as a decimal floating point constant. */ /* Render R as a decimal floating point constant. */
extern void real_to_decimal (char *, const REAL_VALUE_TYPE *, size_t, extern void real_to_decimal (char *, const REAL_VALUE_TYPE *, size_t,
...@@ -281,24 +303,20 @@ extern HOST_WIDE_INT real_to_integer (const REAL_VALUE_TYPE *); ...@@ -281,24 +303,20 @@ extern HOST_WIDE_INT real_to_integer (const REAL_VALUE_TYPE *);
the value underflows, +1 if overflows, and 0 otherwise. */ the value underflows, +1 if overflows, and 0 otherwise. */
extern int real_from_string (REAL_VALUE_TYPE *, const char *); extern int real_from_string (REAL_VALUE_TYPE *, const char *);
/* Wrapper to allow different internal representation for decimal floats. */ /* Wrapper to allow different internal representation for decimal floats. */
extern void real_from_string3 (REAL_VALUE_TYPE *, const char *, machine_mode); extern void real_from_string3 (REAL_VALUE_TYPE *, const char *, format_helper);
extern long real_to_target_fmt (long *, const REAL_VALUE_TYPE *, extern long real_to_target (long *, const REAL_VALUE_TYPE *, format_helper);
const struct real_format *);
extern long real_to_target (long *, const REAL_VALUE_TYPE *, machine_mode);
extern void real_from_target_fmt (REAL_VALUE_TYPE *, const long *,
const struct real_format *);
extern void real_from_target (REAL_VALUE_TYPE *, const long *, extern void real_from_target (REAL_VALUE_TYPE *, const long *,
machine_mode); format_helper);
extern void real_inf (REAL_VALUE_TYPE *); extern void real_inf (REAL_VALUE_TYPE *);
extern bool real_nan (REAL_VALUE_TYPE *, const char *, int, machine_mode); extern bool real_nan (REAL_VALUE_TYPE *, const char *, int, format_helper);
extern void real_maxval (REAL_VALUE_TYPE *, int, machine_mode); extern void real_maxval (REAL_VALUE_TYPE *, int, machine_mode);
extern void real_2expN (REAL_VALUE_TYPE *, int, machine_mode); extern void real_2expN (REAL_VALUE_TYPE *, int, format_helper);
extern unsigned int real_hash (const REAL_VALUE_TYPE *); extern unsigned int real_hash (const REAL_VALUE_TYPE *);
...@@ -370,15 +388,14 @@ extern const struct real_format arm_half_format; ...@@ -370,15 +388,14 @@ extern const struct real_format arm_half_format;
#define REAL_VALUE_TO_TARGET_DECIMAL32(IN, OUT) \ #define REAL_VALUE_TO_TARGET_DECIMAL32(IN, OUT) \
((OUT) = real_to_target (NULL, &(IN), mode_for_size (32, MODE_DECIMAL_FLOAT, 0))) ((OUT) = real_to_target (NULL, &(IN), mode_for_size (32, MODE_DECIMAL_FLOAT, 0)))
extern REAL_VALUE_TYPE real_value_truncate (machine_mode, extern REAL_VALUE_TYPE real_value_truncate (format_helper, REAL_VALUE_TYPE);
REAL_VALUE_TYPE);
extern REAL_VALUE_TYPE real_value_negate (const REAL_VALUE_TYPE *); extern REAL_VALUE_TYPE real_value_negate (const REAL_VALUE_TYPE *);
extern REAL_VALUE_TYPE real_value_abs (const REAL_VALUE_TYPE *); extern REAL_VALUE_TYPE real_value_abs (const REAL_VALUE_TYPE *);
extern int significand_size (machine_mode); extern int significand_size (format_helper);
extern REAL_VALUE_TYPE real_from_string2 (const char *, machine_mode); extern REAL_VALUE_TYPE real_from_string2 (const char *, format_helper);
#define REAL_VALUE_ATOF(s, m) \ #define REAL_VALUE_ATOF(s, m) \
real_from_string2 (s, m) real_from_string2 (s, m)
...@@ -437,8 +454,8 @@ REAL_VALUE_TYPE real_value_from_int_cst (const_tree, const_tree); ...@@ -437,8 +454,8 @@ REAL_VALUE_TYPE real_value_from_int_cst (const_tree, const_tree);
/* Return a CONST_DOUBLE with value R and mode M. */ /* Return a CONST_DOUBLE with value R and mode M. */
extern rtx const_double_from_real_value (REAL_VALUE_TYPE, machine_mode); extern rtx const_double_from_real_value (REAL_VALUE_TYPE, machine_mode);
/* Replace R by 1/R in the given machine mode, if the result is exact. */ /* Replace R by 1/R in the given format, if the result is exact. */
extern bool exact_real_inverse (machine_mode, REAL_VALUE_TYPE *); extern bool exact_real_inverse (format_helper, REAL_VALUE_TYPE *);
/* Return true if arithmetic on values in IMODE that were promoted /* Return true if arithmetic on values in IMODE that were promoted
from values in TMODE is equivalent to direct arithmetic on values from values in TMODE is equivalent to direct arithmetic on values
...@@ -451,25 +468,25 @@ extern tree build_real (tree, REAL_VALUE_TYPE); ...@@ -451,25 +468,25 @@ extern tree build_real (tree, REAL_VALUE_TYPE);
/* Likewise, but first truncate the value to the type. */ /* Likewise, but first truncate the value to the type. */
extern tree build_real_truncate (tree, REAL_VALUE_TYPE); extern tree build_real_truncate (tree, REAL_VALUE_TYPE);
/* Calculate R as X raised to the integer exponent N in mode MODE. */ /* Calculate R as X raised to the integer exponent N in format FMT. */
extern bool real_powi (REAL_VALUE_TYPE *, machine_mode, extern bool real_powi (REAL_VALUE_TYPE *, format_helper,
const REAL_VALUE_TYPE *, HOST_WIDE_INT); const REAL_VALUE_TYPE *, HOST_WIDE_INT);
/* Standard round to integer value functions. */ /* Standard round to integer value functions. */
extern void real_trunc (REAL_VALUE_TYPE *, machine_mode, extern void real_trunc (REAL_VALUE_TYPE *, format_helper,
const REAL_VALUE_TYPE *); const REAL_VALUE_TYPE *);
extern void real_floor (REAL_VALUE_TYPE *, machine_mode, extern void real_floor (REAL_VALUE_TYPE *, format_helper,
const REAL_VALUE_TYPE *); const REAL_VALUE_TYPE *);
extern void real_ceil (REAL_VALUE_TYPE *, machine_mode, extern void real_ceil (REAL_VALUE_TYPE *, format_helper,
const REAL_VALUE_TYPE *); const REAL_VALUE_TYPE *);
extern void real_round (REAL_VALUE_TYPE *, machine_mode, extern void real_round (REAL_VALUE_TYPE *, format_helper,
const REAL_VALUE_TYPE *); const REAL_VALUE_TYPE *);
/* Set the sign of R to the sign of X. */ /* Set the sign of R to the sign of X. */
extern void real_copysign (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *); extern void real_copysign (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
/* Check whether the real constant value given is an integer. */ /* Check whether the real constant value given is an integer. */
extern bool real_isinteger (const REAL_VALUE_TYPE *, machine_mode); extern bool real_isinteger (const REAL_VALUE_TYPE *, format_helper);
extern bool real_isinteger (const REAL_VALUE_TYPE *, HOST_WIDE_INT *); extern bool real_isinteger (const REAL_VALUE_TYPE *, HOST_WIDE_INT *);
/* Write into BUF the maximum representable finite floating-point /* Write into BUF the maximum representable finite floating-point
...@@ -480,7 +497,7 @@ extern void get_max_float (const struct real_format *, char *, size_t); ...@@ -480,7 +497,7 @@ extern void get_max_float (const struct real_format *, char *, size_t);
#ifndef GENERATOR_FILE #ifndef GENERATOR_FILE
/* real related routines. */ /* real related routines. */
extern wide_int real_to_integer (const REAL_VALUE_TYPE *, bool *, int); extern wide_int real_to_integer (const REAL_VALUE_TYPE *, bool *, int);
extern void real_from_integer (REAL_VALUE_TYPE *, machine_mode, extern void real_from_integer (REAL_VALUE_TYPE *, format_helper,
const wide_int_ref &, signop); const wide_int_ref &, signop);
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment