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>
* 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_to_decimal, fixed_convert_from_real)
(real_convert_from_fixed): Fix mode arguments to real_2expN.
......@@ -7273,7 +7273,7 @@ fold_builtin_strlen (location_t loc, tree type, tree arg)
static tree
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 *))
{
if (TREE_CODE (arg) != REAL_CST || TREE_OVERFLOW (arg))
......
......@@ -343,13 +343,13 @@ decode_decimal128 (const struct real_format *fmt ATTRIBUTE_UNUSED,
static void
decimal_to_binary (REAL_VALUE_TYPE *to, const REAL_VALUE_TYPE *from,
machine_mode mode)
const real_format *fmt)
{
char string[256];
const decimal128 *const d128 = (const decimal128 *) from->sig;
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)
binary and decimal types. */
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 struct real_format *fmt = REAL_MODE_FORMAT (mode);
if (a->decimal && fmt->b == 10)
return;
if (a->decimal)
decimal_to_binary (r, a, mode);
decimal_to_binary (r, a, fmt);
else
decimal_from_binary (r, a);
}
......
......@@ -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);
void decimal_real_from_string (REAL_VALUE_TYPE *, const char *);
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_do_fix_trunc (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
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>
* boehm.c: Reorder #include's and remove duplicates.
......
......@@ -1058,7 +1058,7 @@ get_constant (JCF *jcf, int index)
long buf = num;
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);
break;
}
......@@ -1076,7 +1076,7 @@ get_constant (JCF *jcf, int index)
else
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);
break;
}
......
......@@ -193,6 +193,28 @@ extern const struct real_format *
(FLOAT_MODE_P (MODE) \
&& 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. */
/* 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 *);
extern bool real_equal (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. */
extern void real_convert (REAL_VALUE_TYPE *, machine_mode,
/* Extend or truncate to a new format. */
extern void real_convert (REAL_VALUE_TYPE *, format_helper,
const REAL_VALUE_TYPE *);
/* 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. */
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 *);
the value underflows, +1 if overflows, and 0 otherwise. */
extern int real_from_string (REAL_VALUE_TYPE *, const char *);
/* 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 *,
const struct real_format *);
extern long real_to_target (long *, const REAL_VALUE_TYPE *, machine_mode);
extern long real_to_target (long *, const REAL_VALUE_TYPE *, format_helper);
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 *,
machine_mode);
format_helper);
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_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 *);
......@@ -370,15 +388,14 @@ extern const struct real_format arm_half_format;
#define REAL_VALUE_TO_TARGET_DECIMAL32(IN, OUT) \
((OUT) = real_to_target (NULL, &(IN), mode_for_size (32, MODE_DECIMAL_FLOAT, 0)))
extern REAL_VALUE_TYPE real_value_truncate (machine_mode,
REAL_VALUE_TYPE);
extern REAL_VALUE_TYPE real_value_truncate (format_helper, 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 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) \
real_from_string2 (s, m)
......@@ -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. */
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. */
extern bool exact_real_inverse (machine_mode, REAL_VALUE_TYPE *);
/* Replace R by 1/R in the given format, if the result is exact. */
extern bool exact_real_inverse (format_helper, REAL_VALUE_TYPE *);
/* Return true if arithmetic on values in IMODE that were promoted
from values in TMODE is equivalent to direct arithmetic on values
......@@ -451,25 +468,25 @@ extern tree build_real (tree, REAL_VALUE_TYPE);
/* Likewise, but first truncate the value to the type. */
extern tree build_real_truncate (tree, REAL_VALUE_TYPE);
/* Calculate R as X raised to the integer exponent N in mode MODE. */
extern bool real_powi (REAL_VALUE_TYPE *, machine_mode,
/* Calculate R as X raised to the integer exponent N in format FMT. */
extern bool real_powi (REAL_VALUE_TYPE *, format_helper,
const REAL_VALUE_TYPE *, HOST_WIDE_INT);
/* 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 *);
extern void real_floor (REAL_VALUE_TYPE *, machine_mode,
extern void real_floor (REAL_VALUE_TYPE *, format_helper,
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 *);
extern void real_round (REAL_VALUE_TYPE *, machine_mode,
extern void real_round (REAL_VALUE_TYPE *, format_helper,
const REAL_VALUE_TYPE *);
/* Set the sign of R to the sign of X. */
extern void real_copysign (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
/* 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 *);
/* 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);
#ifndef GENERATOR_FILE
/* real related routines. */
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);
#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