diff options
author | Richard Sandiford <rsandifo@gcc.gnu.org> | 2017-08-30 11:13:29 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2017-08-30 11:13:29 +0000 |
commit | c7ad039d8d75666f4f188a913033da36206503b8 (patch) | |
tree | 39a850b1263916714cd0fc62162dc9adaf993d73 /gcc/optabs.c | |
parent | 7a504f3390ecfe3457d37b9d716262a14d5d1938 (diff) | |
download | gcc-c7ad039d8d75666f4f188a913033da36206503b8.zip gcc-c7ad039d8d75666f4f188a913033da36206503b8.tar.gz gcc-c7ad039d8d75666f4f188a913033da36206503b8.tar.bz2 |
[35/77] Add uses of as_a <scalar_int_mode>
This patch adds asserting as_a <scalar_int_mode> conversions
to contexts in which the input is known to be a scalar integer mode.
In expand_divmod, op1 is always a scalar_int_mode if
op1_is_constant (but might not be otherwise).
In expand_binop, the patch reverses a < comparison in order to
avoid splitting a long line.
gcc/
2017-08-30 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
* cfgexpand.c (convert_debug_memory_address): Use
as_a <scalar_int_mode>.
* combine.c (expand_compound_operation): Likewise.
(make_extraction): Likewise.
(change_zero_ext): Likewise.
(simplify_comparison): Likewise.
* cse.c (cse_insn): Likewise.
* dwarf2out.c (minmax_loc_descriptor): Likewise.
(mem_loc_descriptor): Likewise.
(loc_descriptor): Likewise.
* expmed.c (init_expmed_one_mode): Likewise.
(synth_mult): Likewise.
(emit_store_flag_1): Likewise.
(expand_divmod): Likewise. Use HWI_COMPUTABLE_MODE_P instead
of a comparison with size.
* expr.c (expand_assignment): Use as_a <scalar_int_mode>.
(reduce_to_bit_field_precision): Likewise.
* function.c (expand_function_end): Likewise.
* internal-fn.c (expand_arith_overflow_result_store): Likewise.
* loop-doloop.c (doloop_modify): Likewise.
* optabs.c (expand_binop): Likewise.
(expand_unop): Likewise.
(expand_copysign_absneg): Likewise.
(prepare_cmp_insn): Likewise.
(maybe_legitimize_operand): Likewise.
* recog.c (const_scalar_int_operand): Likewise.
* rtlanal.c (get_address_mode): Likewise.
* simplify-rtx.c (simplify_unary_operation_1): Likewise.
(simplify_cond_clz_ctz): Likewise.
* tree-nested.c (get_nl_goto_field): Likewise.
* tree.c (build_vector_type_for_mode): Likewise.
* var-tracking.c (use_narrower_mode): Likewise.
gcc/c-family/
2017-08-30 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
* c-common.c (c_common_type_for_mode): Use as_a <scalar_int_mode>.
gcc/lto/
2017-08-30 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
* lto-lang.c (lto_type_for_mode): Use as_a <scalar_int_mode>.
From-SVN: r251487
Diffstat (limited to 'gcc/optabs.c')
-rw-r--r-- | gcc/optabs.c | 62 |
1 files changed, 36 insertions, 26 deletions
diff --git a/gcc/optabs.c b/gcc/optabs.c index d9609ff..c54a561 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -1232,8 +1232,8 @@ expand_binop (machine_mode mode, optab binoptab, rtx op0, rtx op1, it back to the proper size to fit in the broadcast vector. */ machine_mode inner_mode = GET_MODE_INNER (mode); if (!CONST_INT_P (op1) - && (GET_MODE_BITSIZE (inner_mode) - < GET_MODE_BITSIZE (GET_MODE (op1)))) + && (GET_MODE_BITSIZE (as_a <scalar_int_mode> (GET_MODE (op1))) + > GET_MODE_BITSIZE (inner_mode))) op1 = force_reg (inner_mode, simplify_gen_unary (TRUNCATE, inner_mode, op1, GET_MODE (op1))); @@ -1378,11 +1378,13 @@ expand_binop (machine_mode mode, optab binoptab, rtx op0, rtx op1, && optab_handler (lshr_optab, word_mode) != CODE_FOR_nothing) { unsigned HOST_WIDE_INT shift_mask, double_shift_mask; - machine_mode op1_mode; + scalar_int_mode op1_mode; double_shift_mask = targetm.shift_truncation_mask (int_mode); shift_mask = targetm.shift_truncation_mask (word_mode); - op1_mode = GET_MODE (op1) != VOIDmode ? GET_MODE (op1) : word_mode; + op1_mode = (GET_MODE (op1) != VOIDmode + ? as_a <scalar_int_mode> (GET_MODE (op1)) + : word_mode); /* Apply the truncation to constant shifts. */ if (double_shift_mask > 0 && CONST_INT_P (op1)) @@ -3011,24 +3013,32 @@ expand_unop (machine_mode mode, optab unoptab, rtx op0, rtx target, result. Similarly for clrsb. */ if ((unoptab == clz_optab || unoptab == clrsb_optab) && temp != 0) - temp = expand_binop - (wider_mode, sub_optab, temp, - gen_int_mode (GET_MODE_PRECISION (wider_mode) - - GET_MODE_PRECISION (mode), - wider_mode), - target, true, OPTAB_DIRECT); + { + scalar_int_mode wider_int_mode + = as_a <scalar_int_mode> (wider_mode); + int_mode = as_a <scalar_int_mode> (mode); + temp = expand_binop + (wider_mode, sub_optab, temp, + gen_int_mode (GET_MODE_PRECISION (wider_int_mode) + - GET_MODE_PRECISION (int_mode), + wider_int_mode), + target, true, OPTAB_DIRECT); + } /* Likewise for bswap. */ if (unoptab == bswap_optab && temp != 0) { - gcc_assert (GET_MODE_PRECISION (wider_mode) - == GET_MODE_BITSIZE (wider_mode) - && GET_MODE_PRECISION (mode) - == GET_MODE_BITSIZE (mode)); - - temp = expand_shift (RSHIFT_EXPR, wider_mode, temp, - GET_MODE_BITSIZE (wider_mode) - - GET_MODE_BITSIZE (mode), + scalar_int_mode wider_int_mode + = as_a <scalar_int_mode> (wider_mode); + int_mode = as_a <scalar_int_mode> (mode); + gcc_assert (GET_MODE_PRECISION (wider_int_mode) + == GET_MODE_BITSIZE (wider_int_mode) + && GET_MODE_PRECISION (int_mode) + == GET_MODE_BITSIZE (int_mode)); + + temp = expand_shift (RSHIFT_EXPR, wider_int_mode, temp, + GET_MODE_BITSIZE (wider_int_mode) + - GET_MODE_BITSIZE (int_mode), NULL_RTX, true); } @@ -3256,7 +3266,7 @@ static rtx expand_copysign_absneg (scalar_float_mode mode, rtx op0, rtx op1, rtx target, int bitpos, bool op0_is_abs) { - machine_mode imode; + scalar_int_mode imode; enum insn_code icode; rtx sign; rtx_code_label *label; @@ -3269,7 +3279,7 @@ expand_copysign_absneg (scalar_float_mode mode, rtx op0, rtx op1, rtx target, icode = optab_handler (signbit_optab, mode); if (icode != CODE_FOR_nothing) { - imode = insn_data[(int) icode].operand[0].mode; + imode = as_a <scalar_int_mode> (insn_data[(int) icode].operand[0].mode); sign = gen_reg_rtx (imode); emit_unop_insn (icode, sign, op1, UNKNOWN); } @@ -3801,10 +3811,10 @@ prepare_cmp_insn (rtx x, rtx y, enum rtx_code comparison, rtx size, continue; /* Must make sure the size fits the insn's mode. */ - if ((CONST_INT_P (size) - && INTVAL (size) >= (1 << GET_MODE_BITSIZE (cmp_mode))) - || (GET_MODE_BITSIZE (GET_MODE (size)) - > GET_MODE_BITSIZE (cmp_mode))) + if (CONST_INT_P (size) + ? INTVAL (size) >= (1 << GET_MODE_BITSIZE (cmp_mode)) + : (GET_MODE_BITSIZE (as_a <scalar_int_mode> (GET_MODE (size))) + > GET_MODE_BITSIZE (cmp_mode))) continue; result_mode = insn_data[cmp_code].operand[0].mode; @@ -6979,8 +6989,8 @@ maybe_legitimize_operand (enum insn_code icode, unsigned int opno, goto input; case EXPAND_ADDRESS: - gcc_assert (mode != VOIDmode); - op->value = convert_memory_address (mode, op->value); + op->value = convert_memory_address (as_a <scalar_int_mode> (mode), + op->value); goto input; case EXPAND_INTEGER: |