From: Richard Sandiford Date: Wed, 30 Aug 2017 11:20:03 +0000 (+0000) Subject: [69/77] Split scalar-only part out of convert_mode X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4e084bc3ce764a73312cefdda9a4736b8e27b5d1;p=gcc.git [69/77] Split scalar-only part out of convert_mode This patch splits the final scalar-only part of convert_mode out into its own subroutine and treats the modes as scalar_modes there. 2017-08-30 Richard Sandiford Alan Hayward David Sherwood gcc/ * expr.c (convert_mode): Split scalar handling out into... (convert_mode_scalar): ...this new function. Treat the modes as scalar_modes. Co-Authored-By: Alan Hayward Co-Authored-By: David Sherwood From-SVN: r251520 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 14f379cd55c..36cfad06647 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2017-08-30 Richard Sandiford + Alan Hayward + David Sherwood + + * expr.c (convert_mode): Split scalar handling out into... + (convert_mode_scalar): ...this new function. Treat the modes + as scalar_modes. + 2017-08-30 Richard Sandiford Alan Hayward David Sherwood diff --git a/gcc/expr.c b/gcc/expr.c index c586e7ce506..7e67f3dd8ca 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -102,6 +102,7 @@ static rtx const_vector_from_tree (tree); static rtx const_scalar_mask_from_tree (scalar_int_mode, tree); static tree tree_expr_size (const_tree); static HOST_WIDE_INT int_expr_size (tree); +static void convert_mode_scalar (rtx, rtx, int); /* This is run to set up which modes can be used @@ -216,17 +217,7 @@ convert_move (rtx to, rtx from, int unsignedp) { machine_mode to_mode = GET_MODE (to); machine_mode from_mode = GET_MODE (from); - int to_real = SCALAR_FLOAT_MODE_P (to_mode); - int from_real = SCALAR_FLOAT_MODE_P (from_mode); - enum insn_code code; - rtx libcall; - - /* rtx code for making an equivalent value. */ - enum rtx_code equiv_code = (unsignedp < 0 ? UNKNOWN - : (unsignedp ? ZERO_EXTEND : SIGN_EXTEND)); - - gcc_assert (to_real == from_real); gcc_assert (to_mode != BLKmode); gcc_assert (from_mode != BLKmode); @@ -277,6 +268,28 @@ convert_move (rtx to, rtx from, int unsignedp) return; } + convert_mode_scalar (to, from, unsignedp); +} + +/* Like convert_move, but deals only with scalar modes. */ + +static void +convert_mode_scalar (rtx to, rtx from, int unsignedp) +{ + /* Both modes should be scalar types. */ + scalar_mode from_mode = as_a (GET_MODE (from)); + scalar_mode to_mode = as_a (GET_MODE (to)); + bool to_real = SCALAR_FLOAT_MODE_P (to_mode); + bool from_real = SCALAR_FLOAT_MODE_P (from_mode); + enum insn_code code; + rtx libcall; + + gcc_assert (to_real == from_real); + + /* rtx code for making an equivalent value. */ + enum rtx_code equiv_code = (unsignedp < 0 ? UNKNOWN + : (unsignedp ? ZERO_EXTEND : SIGN_EXTEND)); + if (to_real) { rtx value; @@ -413,7 +426,7 @@ convert_move (rtx to, rtx from, int unsignedp) rtx fill_value; rtx lowfrom; int i; - machine_mode lowpart_mode; + scalar_mode lowpart_mode; int nwords = CEIL (GET_MODE_SIZE (to_mode), UNITS_PER_WORD); /* Try converting directly if the insn is supported. */