Commit 3205ab28 by Richard Sandiford Committed by Richard Sandiford

[8/77] Simplify gen_trunc/extend_conv_libfunc

Replace checks of:

  GET_MODE_CLASS (fmode) != MODE_FLOAT && !DECIMAL_FLOAT_MODE_P (fmode)

with !is_a <scalar_float_mode> and use MODE_CLASS equality/inequality
instead of:

  (GET_MODE_CLASS (tmode) == MODE_FLOAT && DECIMAL_FLOAT_MODE_P (fmode))
  || (GET_MODE_CLASS (fmode) == MODE_FLOAT && DECIMAL_FLOAT_MODE_P (tmode))

and:

  (GET_MODE_CLASS (tmode) == MODE_FLOAT
   && GET_MODE_CLASS (fmode) == MODE_FLOAT)
  || (DECIMAL_FLOAT_MODE_P (fmode) && DECIMAL_FLOAT_MODE_P (tmode))

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

gcc/
	* optabs-libfuncs.c (gen_trunc_conv_libfunc): Use is_a
	<scalar_float_mode>.  Simplify.
	(gen_extend_conv_libfunc): Likewise.

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

From-SVN: r251459
parent e386a52f
...@@ -2,6 +2,14 @@ ...@@ -2,6 +2,14 @@
Alan Hayward <alan.hayward@arm.com> Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com> David Sherwood <david.sherwood@arm.com>
* optabs-libfuncs.c (gen_trunc_conv_libfunc): Use is_a
<scalar_float_mode>. Simplify.
(gen_extend_conv_libfunc): Likewise.
2017-08-30 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
* coretypes.h (scalar_float_mode): New type. * coretypes.h (scalar_float_mode): New type.
* machmode.h (mode_traits::from_int): Use machine_mode if * machmode.h (mode_traits::from_int): Use machine_mode if
USE_ENUM_MODES is defined. USE_ENUM_MODES is defined.
......
...@@ -579,24 +579,20 @@ gen_trunc_conv_libfunc (convert_optab tab, ...@@ -579,24 +579,20 @@ gen_trunc_conv_libfunc (convert_optab tab,
machine_mode tmode, machine_mode tmode,
machine_mode fmode) machine_mode fmode)
{ {
if (GET_MODE_CLASS (tmode) != MODE_FLOAT && !DECIMAL_FLOAT_MODE_P (tmode)) scalar_float_mode float_tmode, float_fmode;
return; if (!is_a <scalar_float_mode> (fmode, &float_fmode)
if (GET_MODE_CLASS (fmode) != MODE_FLOAT && !DECIMAL_FLOAT_MODE_P (fmode)) || !is_a <scalar_float_mode> (tmode, &float_tmode)
return; || float_tmode == float_fmode)
if (tmode == fmode)
return; return;
if ((GET_MODE_CLASS (tmode) == MODE_FLOAT && DECIMAL_FLOAT_MODE_P (fmode)) if (GET_MODE_CLASS (float_tmode) != GET_MODE_CLASS (float_fmode))
|| (GET_MODE_CLASS (fmode) == MODE_FLOAT && DECIMAL_FLOAT_MODE_P (tmode))) gen_interclass_conv_libfunc (tab, opname, float_tmode, float_fmode);
gen_interclass_conv_libfunc (tab, opname, tmode, fmode);
if (GET_MODE_PRECISION (fmode) <= GET_MODE_PRECISION (tmode)) if (GET_MODE_PRECISION (float_fmode) <= GET_MODE_PRECISION (float_tmode))
return; return;
if ((GET_MODE_CLASS (tmode) == MODE_FLOAT if (GET_MODE_CLASS (float_tmode) == GET_MODE_CLASS (float_fmode))
&& GET_MODE_CLASS (fmode) == MODE_FLOAT) gen_intraclass_conv_libfunc (tab, opname, float_tmode, float_fmode);
|| (DECIMAL_FLOAT_MODE_P (fmode) && DECIMAL_FLOAT_MODE_P (tmode)))
gen_intraclass_conv_libfunc (tab, opname, tmode, fmode);
} }
/* Pick proper libcall for extend_optab. We need to chose if we do /* Pick proper libcall for extend_optab. We need to chose if we do
...@@ -608,23 +604,19 @@ gen_extend_conv_libfunc (convert_optab tab, ...@@ -608,23 +604,19 @@ gen_extend_conv_libfunc (convert_optab tab,
machine_mode tmode, machine_mode tmode,
machine_mode fmode) machine_mode fmode)
{ {
if (GET_MODE_CLASS (tmode) != MODE_FLOAT && !DECIMAL_FLOAT_MODE_P (tmode)) scalar_float_mode float_tmode, float_fmode;
return; if (!is_a <scalar_float_mode> (fmode, &float_fmode)
if (GET_MODE_CLASS (fmode) != MODE_FLOAT && !DECIMAL_FLOAT_MODE_P (fmode)) || !is_a <scalar_float_mode> (tmode, &float_tmode)
return; || float_tmode == float_fmode)
if (tmode == fmode)
return; return;
if ((GET_MODE_CLASS (tmode) == MODE_FLOAT && DECIMAL_FLOAT_MODE_P (fmode)) if (GET_MODE_CLASS (float_tmode) != GET_MODE_CLASS (float_fmode))
|| (GET_MODE_CLASS (fmode) == MODE_FLOAT && DECIMAL_FLOAT_MODE_P (tmode))) gen_interclass_conv_libfunc (tab, opname, float_tmode, float_fmode);
gen_interclass_conv_libfunc (tab, opname, tmode, fmode);
if (GET_MODE_PRECISION (fmode) > GET_MODE_PRECISION (tmode)) if (GET_MODE_PRECISION (float_fmode) > GET_MODE_PRECISION (float_tmode))
return; return;
if ((GET_MODE_CLASS (tmode) == MODE_FLOAT if (GET_MODE_CLASS (float_tmode) == GET_MODE_CLASS (float_fmode))
&& GET_MODE_CLASS (fmode) == MODE_FLOAT)
|| (DECIMAL_FLOAT_MODE_P (fmode) && DECIMAL_FLOAT_MODE_P (tmode)))
gen_intraclass_conv_libfunc (tab, opname, tmode, fmode); gen_intraclass_conv_libfunc (tab, opname, tmode, fmode);
} }
......
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