aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@linaro.org>2017-11-01 13:30:34 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2017-11-01 13:30:34 +0000
commit7aaba298fe122dfd40bb612623df89db08499f8b (patch)
tree0ae2545c05dfb383c6e30bf2152244a320722bec
parentb3ad445f853ab7ca0da6216ff1bebfd6f90425f5 (diff)
downloadgcc-7aaba298fe122dfd40bb612623df89db08499f8b.zip
gcc-7aaba298fe122dfd40bb612623df89db08499f8b.tar.gz
gcc-7aaba298fe122dfd40bb612623df89db08499f8b.tar.bz2
Add an is_narrower_int_mode helper function
This patch adds a function for testing whether an arbitrary mode X is an integer mode that is narrower than integer mode Y. This is useful for code like expand_float and expand_fix that could in principle handle vectors as well as scalars. 2017-11-01 Richard Sandiford <richard.sandiford@linaro.org> Alan Hayward <alan.hayward@arm.com> David Sherwood <david.sherwood@arm.com> gcc/ * machmode.h (is_narrower_int_mode): New function * optabs.c (expand_float, expand_fix): Use it. * dwarf2out.c (rotate_loc_descriptor): Likewise. Co-Authored-By: Alan Hayward <alan.hayward@arm.com> Co-Authored-By: David Sherwood <david.sherwood@arm.com> From-SVN: r254305
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/dwarf2out.c3
-rw-r--r--gcc/machmode.h11
-rw-r--r--gcc/optabs.c4
4 files changed, 22 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bdd6b73..b9b5ddd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -2,6 +2,14 @@
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
+ * machmode.h (is_narrower_int_mode): New function
+ * optabs.c (expand_float, expand_fix): Use it.
+ * dwarf2out.c (rotate_loc_descriptor): Likewise.
+
+2017-11-01 Richard Sandiford <richard.sandiford@linaro.org>
+ Alan Hayward <alan.hayward@arm.com>
+ David Sherwood <david.sherwood@arm.com>
+
* rtl.h (narrower_subreg_mode): New function.
* ira-color.c (update_costs_from_allocno): Use it.
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 1a15c96..7344767 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -14547,8 +14547,7 @@ rotate_loc_descriptor (rtx rtl, scalar_int_mode mode,
dw_loc_descr_ref op0, op1, ret, mask[2] = { NULL, NULL };
int i;
- if (GET_MODE (rtlop1) != VOIDmode
- && GET_MODE_BITSIZE (GET_MODE (rtlop1)) < GET_MODE_BITSIZE (mode))
+ if (is_narrower_int_mode (GET_MODE (rtlop1), mode))
rtlop1 = gen_rtx_ZERO_EXTEND (mode, rtlop1);
op0 = mem_loc_descriptor (XEXP (rtl, 0), mode, mem_mode,
VAR_INIT_STATUS_INITIALIZED);
diff --git a/gcc/machmode.h b/gcc/machmode.h
index f5e5baa..f53e7b3 100644
--- a/gcc/machmode.h
+++ b/gcc/machmode.h
@@ -893,6 +893,17 @@ is_complex_float_mode (machine_mode mode, T *cmode)
return false;
}
+/* Return true if MODE is a scalar integer mode with a precision
+ smaller than LIMIT's precision. */
+
+inline bool
+is_narrower_int_mode (machine_mode mode, scalar_int_mode limit)
+{
+ scalar_int_mode int_mode;
+ return (is_a <scalar_int_mode> (mode, &int_mode)
+ && GET_MODE_PRECISION (int_mode) < GET_MODE_PRECISION (limit));
+}
+
namespace mode_iterator
{
/* Start mode iterator *ITER at the first mode in class MCLASS, if any. */
diff --git a/gcc/optabs.c b/gcc/optabs.c
index 7cf4d8e..8f7089e 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -4811,7 +4811,7 @@ expand_float (rtx to, rtx from, int unsignedp)
rtx value;
convert_optab tab = unsignedp ? ufloat_optab : sfloat_optab;
- if (GET_MODE_PRECISION (GET_MODE (from)) < GET_MODE_PRECISION (SImode))
+ if (is_narrower_int_mode (GET_MODE (from), SImode))
from = convert_to_mode (SImode, from, unsignedp);
libfunc = convert_optab_libfunc (tab, GET_MODE (to), GET_MODE (from));
@@ -4993,7 +4993,7 @@ expand_fix (rtx to, rtx from, int unsignedp)
that the mode of TO is at least as wide as SImode, since those are the
only library calls we know about. */
- if (GET_MODE_PRECISION (GET_MODE (to)) < GET_MODE_PRECISION (SImode))
+ if (is_narrower_int_mode (GET_MODE (to), SImode))
{
target = gen_reg_rtx (SImode);