Commit 5c20c4af by Richard Sandiford Committed by Richard Sandiford

[12/77] Use opt_scalar_float_mode when iterating over float modes

This means that we know when accessing the modes that the size is
a compile-time constant, even for SVE.  It also enables stricter
type safety in later patches.

2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
	    Alan Hayward  <alan.hayward@arm.com>
	    David Sherwood  <david.sherwood@arm.com>

gcc/
	* machmode.h (mode_iterator::start): Provide overload for opt_modes.
	(mode_iterator::iterate_p): Likewise.
	(mode_iterator::get_wider): Likewise.
	* expr.c (init_expr_target): Use opt_scalar_float_mode.

gcc/ada/
	* gcc-interface/misc.c (fp_prec_to_size): Use opt_scalar_float_mode.
	(fp_size_to_prec): Likewise.

gcc/c-family/
	* c-cppbuiltin.c (c_cpp_builtins): Use opt_scalar_float_mode.

gcc/fortran/
	* trans-types.c (gfc_init_kinds): Use opt_scalar_float_mode
	and FOR_EACH_MODE_IN_CLASS.

Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>

From-SVN: r251464
parent 857c7b46
......@@ -2,6 +2,15 @@
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
* machmode.h (mode_iterator::start): Provide overload for opt_modes.
(mode_iterator::iterate_p): Likewise.
(mode_iterator::get_wider): Likewise.
* expr.c (init_expr_target): Use opt_scalar_float_mode.
2017-08-30 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
* coretypes.h (opt_scalar_float_mode): New typedef.
* machmode.h (float_mode_for_size): New function.
* emit-rtl.c (double_mode): Delete.
......
......@@ -2,6 +2,13 @@
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
* gcc-interface/misc.c (fp_prec_to_size): Use opt_scalar_float_mode.
(fp_size_to_prec): Likewise.
2017-08-30 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
* gcc-interface/utils.c (gnat_type_for_mode): Use is_a
<scalar_float_mode> instead of SCALAR_FLOAT_MODE_P.
......
......@@ -1311,11 +1311,14 @@ enumerate_modes (void (*f) (const char *, int, int, int, int, int, int, int))
int
fp_prec_to_size (int prec)
{
machine_mode mode;
opt_scalar_float_mode opt_mode;
FOR_EACH_MODE_IN_CLASS (mode, MODE_FLOAT)
if (GET_MODE_PRECISION (mode) == prec)
return GET_MODE_BITSIZE (mode);
FOR_EACH_MODE_IN_CLASS (opt_mode, MODE_FLOAT)
{
scalar_float_mode mode = opt_mode.require ();
if (GET_MODE_PRECISION (mode) == prec)
return GET_MODE_BITSIZE (mode);
}
gcc_unreachable ();
}
......@@ -1325,11 +1328,14 @@ fp_prec_to_size (int prec)
int
fp_size_to_prec (int size)
{
machine_mode mode;
opt_scalar_float_mode opt_mode;
FOR_EACH_MODE_IN_CLASS (mode, MODE_FLOAT)
if (GET_MODE_BITSIZE (mode) == size)
return GET_MODE_PRECISION (mode);
FOR_EACH_MODE_IN_CLASS (opt_mode, MODE_FLOAT)
{
scalar_mode mode = opt_mode.require ();
if (GET_MODE_BITSIZE (mode) == size)
return GET_MODE_PRECISION (mode);
}
gcc_unreachable ();
}
......
2017-08-30 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
* c-cppbuiltin.c (c_cpp_builtins): Use opt_scalar_float_mode.
2017-08-30 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
......
......@@ -1186,9 +1186,10 @@ c_cpp_builtins (cpp_reader *pfile)
if (flag_building_libgcc)
{
/* Properties of floating-point modes for libgcc2.c. */
machine_mode mode;
FOR_EACH_MODE_IN_CLASS (mode, MODE_FLOAT)
opt_scalar_float_mode mode_iter;
FOR_EACH_MODE_IN_CLASS (mode_iter, MODE_FLOAT)
{
scalar_float_mode mode = mode_iter.require ();
const char *name = GET_MODE_NAME (mode);
char *macro_name
= (char *) alloca (strlen (name)
......
......@@ -112,7 +112,6 @@ void
init_expr_target (void)
{
rtx pat;
machine_mode mode;
int num_clobbers;
rtx mem, mem1;
rtx reg;
......@@ -131,7 +130,7 @@ init_expr_target (void)
pat = gen_rtx_SET (NULL_RTX, NULL_RTX);
PATTERN (insn) = pat;
for (mode = VOIDmode; (int) mode < NUM_MACHINE_MODES;
for (machine_mode mode = VOIDmode; (int) mode < NUM_MACHINE_MODES;
mode = (machine_mode) ((int) mode + 1))
{
int regno;
......@@ -177,9 +176,11 @@ init_expr_target (void)
mem = gen_rtx_MEM (VOIDmode, gen_raw_REG (Pmode, LAST_VIRTUAL_REGISTER + 1));
FOR_EACH_MODE_IN_CLASS (mode, MODE_FLOAT)
opt_scalar_float_mode mode_iter;
FOR_EACH_MODE_IN_CLASS (mode_iter, MODE_FLOAT)
{
machine_mode srcmode;
scalar_float_mode mode = mode_iter.require ();
scalar_float_mode srcmode;
FOR_EACH_MODE_UNTIL (srcmode, mode)
{
enum insn_code ic;
......
......@@ -2,6 +2,13 @@
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
* trans-types.c (gfc_init_kinds): Use opt_scalar_float_mode
and FOR_EACH_MODE_IN_CLASS.
2017-08-30 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
* target-memory.c (size_float): Use SCALAR_FLOAT_TYPE_MODE
instead of TYPE_MODE.
......
......@@ -364,6 +364,7 @@ void
gfc_init_kinds (void)
{
machine_mode mode;
opt_scalar_float_mode float_mode_iter;
int i_index, r_index, kind;
bool saw_i4 = false, saw_i8 = false;
bool saw_r4 = false, saw_r8 = false, saw_r10 = false, saw_r16 = false;
......@@ -419,11 +420,11 @@ gfc_init_kinds (void)
/* Set the maximum integer kind. Used with at least BOZ constants. */
gfc_max_integer_kind = gfc_integer_kinds[i_index - 1].kind;
for (r_index = 0, mode = MIN_MODE_FLOAT; mode <= MAX_MODE_FLOAT;
mode = (machine_mode) ((int) mode + 1))
r_index = 0;
FOR_EACH_MODE_IN_CLASS (float_mode_iter, MODE_FLOAT)
{
const struct real_format *fmt =
REAL_MODE_FORMAT (mode);
scalar_float_mode mode = float_mode_iter.require ();
const struct real_format *fmt = REAL_MODE_FORMAT (mode);
int kind;
if (fmt == NULL)
......@@ -434,8 +435,7 @@ gfc_init_kinds (void)
/* Only let float, double, long double and __float128 go through.
Runtime support for others is not provided, so they would be
useless. */
if (!targetm.libgcc_floating_mode_supported_p ((machine_mode)
mode))
if (!targetm.libgcc_floating_mode_supported_p (mode))
continue;
if (mode != TYPE_MODE (float_type_node)
&& (mode != TYPE_MODE (double_type_node))
......
......@@ -651,6 +651,16 @@ namespace mode_iterator
{
/* Start mode iterator *ITER at the first mode in class MCLASS, if any. */
template<typename T>
inline void
start (opt_mode<T> *iter, enum mode_class mclass)
{
if (GET_CLASS_NARROWEST_MODE (mclass) == E_VOIDmode)
*iter = opt_mode<T> ();
else
*iter = as_a<T> (GET_CLASS_NARROWEST_MODE (mclass));
}
inline void
start (machine_mode *iter, enum mode_class mclass)
{
......@@ -659,6 +669,13 @@ namespace mode_iterator
/* Return true if mode iterator *ITER has not reached the end. */
template<typename T>
inline bool
iterate_p (opt_mode<T> *iter)
{
return iter->exists ();
}
inline bool
iterate_p (machine_mode *iter)
{
......@@ -668,6 +685,13 @@ namespace mode_iterator
/* Set mode iterator *ITER to the next widest mode in the same class,
if any. */
template<typename T>
inline void
get_wider (opt_mode<T> *iter)
{
*iter = GET_MODE_WIDER_MODE (iter->require ());
}
inline void
get_wider (machine_mode *iter)
{
......
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