1. 30 Aug, 2017 40 commits
    • [37/77] Use scalar_int_mode when emitting cstores · 7cc237a6
      cstore patterns always have a scalar integer result, which has the
      value 0 for "false" and STORE_FLAG_VALUE for "true".  This patch
      makes that explicit using scalar_int_mode.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* target.def (cstore_mode): Return a scalar_int_mode.
      	* doc/tm.texi: Regenerate.
      	* config/sparc/sparc.c (sparc_cstore_mode): Return a scalar_int_mode.
      	* targhooks.h (default_cstore_mode): Likewise.
      	* targhooks.c (default_cstore_mode): Likewise, using a forced
      	conversion.
      	* expmed.c (emit_cstore): Expect the target of the cstore to be
      	a scalar_int_mode.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251489
      Richard Sandiford committed
    • [36/77] Use scalar_int_mode in the RTL iv routines · 3d88d1cd
      This patch changes the iv modes in rtx_iv from machine_mode
      to scalar_int_mode.  It also passes the mode of the iv down
      to subroutines; this avoids the previous situation in which
      the mode information was sometimes lost and had to be added
      by the caller on return.
      
      Some routines already took a mode argument, but the patch
      tries to standardise on passing it immediately before the
      argument it describes.
      
      gcc/
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      	* cfgloop.h (rtx_iv): Change type of extend_mode and mode to
      	scalar_int_mode.
      	(niter_desc): Likewise mode.
      	(iv_analyze): Add a mode parameter.
      	(biv_p): Likewise.
      	(iv_analyze_expr): Pass the mode paraeter before the rtx it describes
      	and change its type to scalar_int_mode.
      	* loop-iv.c: Update commentary at head of file.
      	(iv_constant): Pass the mode paraeter before the rtx it describes
      	and change its type to scalar_int_mode.  Remove VOIDmode handling.
      	(iv_subreg): Change the type of the mode parameter to scalar_int_mode.
      	(iv_extend): Likewise.
      	(shorten_into_mode): Likewise.
      	(iv_add): Use scalar_int_mode.
      	(iv_mult): Likewise.
      	(iv_shift): Likewise.
      	(canonicalize_iv_subregs): Likewise.
      	(get_biv_step_1): Pass the outer_mode parameter before the rtx
      	it describes and change its mode to scalar_int_mode.   Also change
      	the type of the returned inner_mode to scalar_int_mode.
      	(get_biv_step): Likewise, turning outer_mode from a pointer
      	into a direct parameter.  Update call to get_biv_step_1.
      	(iv_analyze_biv): Add an outer_mode parameter.  Update calls to
      	iv_constant and get_biv_step.
      	(iv_analyze_expr): Pass the mode parameter before the rtx it describes
      	and change its type to scalar_int_mode.  Don't initialise iv->mode
      	to VOIDmode and remove later checks for its still being VOIDmode.
      	Update calls to iv_analyze_op and iv_analyze_expr.  Check
      	is_a <scalar_int_mode> when changing the mode under consideration.
      	(iv_analyze_def): Ignore registers that don't have a scalar_int_mode.
      	Update call to iv_analyze_expr.
      	(iv_analyze_op): Add a mode parameter.  Reject subregs whose
      	inner register is not also a scalar_int_mode.  Update call to
      	iv_analyze_biv.
      	(iv_analyze): Add a mode parameter.  Update call to iv_analyze_op.
      	(biv_p): Add a mode parameter.  Update call to iv_analyze_biv.
      	(iv_number_of_iterations): Use is_a <scalar_int_mode> instead of
      	separate mode class checks.  Update calls to iv_analyze.  Remove
      	fix-up of VOIDmodes after iv_analyze_biv.
      	* loop-unroll.c (analyze_iv_to_split_insn): Reject registers that
      	don't have a scalar_int_mode.  Update call to biv_p.
      
      From-SVN: r251488
      Richard Sandiford committed
    • [35/77] Add uses of as_a <scalar_int_mode> · c7ad039d
      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
      Richard Sandiford committed
    • [34/77] Add a SCALAR_INT_TYPE_MODE macro · 7a504f33
      This patch adds a SCALAR_INT_TYPE_MODE macro that asserts
      that the type has a scalar integer mode and returns it as
      a scalar_int_mode.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* tree.h (SCALAR_INT_TYPE_MODE): New macro.
      	* builtins.c (expand_builtin_signbit): Use it.
      	* cfgexpand.c (expand_debug_expr): Likewise.
      	* dojump.c (do_jump): Likewise.
      	(do_compare_and_jump): Likewise.
      	* dwarf2cfi.c (expand_builtin_init_dwarf_reg_sizes): Likewise.
      	* expmed.c (make_tree): Likewise.
      	* expr.c (expand_expr_real_2): Likewise.
      	(expand_expr_real_1): Likewise.
      	(try_casesi): Likewise.
      	* fold-const-call.c (fold_const_call_ss): Likewise.
      	* fold-const.c (unextend): Likewise.
      	(extract_muldiv_1): Likewise.
      	(fold_single_bit_test): Likewise.
      	(native_encode_int): Likewise.
      	(native_encode_string): Likewise.
      	(native_interpret_int): Likewise.
      	* gimple-fold.c (gimple_fold_builtin_memset): Likewise.
      	* internal-fn.c (expand_addsub_overflow): Likewise.
      	(expand_neg_overflow): Likewise.
      	(expand_mul_overflow): Likewise.
      	(expand_arith_overflow): Likewise.
      	* match.pd: Likewise.
      	* stor-layout.c (layout_type): Likewise.
      	* tree-cfg.c (verify_gimple_assign_ternary): Likewise.
      	* tree-ssa-math-opts.c (convert_mult_to_widen): Likewise.
      	* tree-ssanames.c (get_range_info): Likewise.
      	* tree-switch-conversion.c (array_value_type) Likewise.
      	* tree-vect-patterns.c (vect_recog_rotate_pattern): Likewise.
      	(vect_recog_divmod_pattern): Likewise.
      	(vect_recog_mixed_size_cond_pattern): Likewise.
      	* tree-vrp.c (extract_range_basic): Likewise.
      	(simplify_float_conversion_using_ranges): Likewise.
      	* tree.c (int_fits_type_p): Likewise.
      	* ubsan.c (instrument_bool_enum_load): Likewise.
      	* varasm.c (mergeable_string_section): Likewise.
      	(narrowing_initializer_constant_valid_p): Likewise.
      	(output_constant): Likewise.
      
      gcc/cp/
      	* cvt.c (cp_convert_to_pointer): Use SCALAR_INT_TYPE_MODE.
      
      gcc/fortran/
      	* target-memory.c (size_integer): Use SCALAR_INT_TYPE_MODE.
      	(size_logical): Likewise.
      
      gcc/objc/
      	* objc-encoding.c (encode_type): Use SCALAR_INT_TYPE_MODE.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251486
      Richard Sandiford committed
    • [33/77] Add a NARROWEST_INT_MODE macro · e72b0ef4
      This patch replaces uses of GET_CLASS_NARROWEST_MODE (MODE_INT) with a
      new NARROWEST_INT_MODE macro, which has type scalar_int_mode.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* machmode.h (NARROWEST_INT_MODE): New macro.
      	* expr.c (alignment_for_piecewise_move): Use it instead of
      	GET_CLASS_NARROWEST_MODE (MODE_INT).
      	(push_block): Likewise.
      	* stor-layout.c (bit_field_mode_iterator::bit_field_mode_iterator):
      	Likewise.
      	* tree-vrp.c (simplify_float_conversion_using_ranges): Likewise.
      
      gcc/ada/
      	* gcc-interface/decl.c (validate_size): Use NARROWEST_INT_MODE
      	instead of GET_CLASS_NARROWEST_MODE (MODE_INT).
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251485
      Richard Sandiford committed
    • [32/77] Check is_a <scalar_int_mode> before calling valid_pointer_mode · e05c94ba
      A future patch will make valid_pointer_mode take a scalar_int_mode
      instead of a machine_mode.  is_a <...> rather than as_a <...> is
      needed here because we're checking a mode supplied by the user.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/c-family/
      	* c-attribs.c (handle_mode_attribute): Check for a scalar_int_mode
      	before calling targetm.addr_space.valid_pointer_mode.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251484
      Richard Sandiford committed
    • [31/77] Use scalar_int_mode for move2add · 1e047eed
      The postreload move2add optimisations are specific to scalar
      integers.  This patch adds an explicit check to the main guarding
      "if" and propagates the information through subroutines.
      
      gcc/
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      	* postreload.c (move2add_valid_value_p): Change the type of the
      	mode parameter to scalar_int_mode.
      	(move2add_use_add2_insn): Add a mode parameter and use it instead
      	of GET_MODE (reg).
      	(move2add_use_add3_insn): Likewise.
      	(reload_cse_move2add): Update accordingly.
      
      From-SVN: r251483
      Richard Sandiford committed
    • [30/77] Use scalar_int_mode for doubleword splits · e4dc9904
      This patch uses is_a <scalar_int_mode> in a couple of places that
      were splitting doubleword integer operations into word_mode
      operations.  It also uses scalar_int_mode in the expand_expr_real_2
      handling of doubleword shifts.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* expr.c (expand_expr_real_2): Use scalar_int_mode for the
      	double-word mode.
      	* lower-subreg.c (resolve_shift_zext): Use is_a <scalar_int_mode>.
      	* optabs.c (expand_unop): Likewise.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251482
      Richard Sandiford committed
    • [29/77] Make some *_loc_descriptor helpers take scalar_int_mode · 99767219
      The *_loc_descriptor routines for clz, popcount, bswap and rotate
      all required SCALAR_INT_MODE_P.  This patch moves the checks into
      the caller (mem_loc_descriptor) so that the types of the mode
      parameters can be scalar_int_mode instead of machine_mode.
      
      The MOD handling in mem_loc_descriptor is also specific to
      scalar integer modes.  Adding an explicit check allows
      typed_binop to take a scalar_int_mode too.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* dwarf2out.c (typed_binop): Change mode parameter to scalar_int_mode.
      	(clz_loc_descriptor): Likewise.  Remove SCALAR_INT_MODE_P check.
      	(popcount_loc_descriptor): Likewise.
      	(bswap_loc_descriptor): Likewise.
      	(rotate_loc_descriptor): Likewise.
      	(mem_loc_descriptor): Add is_a <scalar_int_mode> checks before
      	calling the functions above.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251481
      Richard Sandiford committed
    • [28/77] Use is_a <scalar_int_mode> for miscellaneous types of test · 54651377
      This patch adds is_a <scalar_int_mode> checks to various places
      that were explicitly or implicitly restricted to integers already,
      in cases where adding an explicit is_a <scalar_int_mode> is useful
      for later patches.
      
      In simplify_if_then_else, the:
      
        GET_MODE (XEXP (XEXP (t, 0), N))
      
      expressions were equivalent to:
      
        GET_MODE (XEXP (t, 0))
      
      due to the type of operation.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* combine.c (sign_extend_short_imm): Add is_a <scalar_int_mode>
      	checks.
      	(try_combine): Likewise.
      	(simplify_if_then_else): Likewise.
      	* cse.c (cse_insn): Likewise.
      	* dwarf2out.c (mem_loc_descriptor): Likewise.
      	* emit-rtl.c (gen_lowpart_common): Likewise.
      	* simplify-rtx.c (simplify_truncation): Likewise.
      	(simplify_binary_operation_1): Likewise.
      	(simplify_const_relational_operation): Likewise.
      	(simplify_ternary_operation): Likewise.
      	* tree-ssa-loop-ivopts.c (force_expr_to_var_cost): Likewise.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251480
      Richard Sandiford committed
    • [27/77] Use is_a <scalar_int_mode> before LOAD_EXTEND_OP · 095a49c8
      This patch adds is_a <scalar_int_mode> checks before load_extend_op/
      LOAD_EXTEND_OP calls, if that becomes useful for later patches.
      (load_extend_op will return UNKNOWN for any other type of mode.)
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* cse.c (cse_insn): Add is_a <scalar_int_mode> checks.
      	* reload.c (push_reload): Likewise.
      	(find_reloads): Likewise.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251479
      Richard Sandiford committed
    • [26/77] Use is_a <scalar_int_mode> in subreg/extract simplifications · 6b9c3dec
      This patch adds is_a <scalar_int_mode> checks to various places that
      were optimising subregs or extractions in ways that only made sense
      for scalar integers.  Often the subreg transformations were looking
      for extends, truncates or shifts and trying to remove the subreg, which
      wouldn't be correct if the SUBREG_REG was a vector rather than a scalar.
      
      The simplify_binary_operation_1 part also removes a redundant:
      
        GET_MODE (opleft) == GET_MODE (XEXP (opright, 0))
      
      since this must be true for:
      
        (ior A (lshifrt B ...))  A == opleft, B == XEXP (opright, 0)
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* combine.c (find_split_point): Add is_a <scalar_int_mode> checks.
      	(make_compound_operation_int): Likewise.
      	(change_zero_ext): Likewise.
      	* expr.c (convert_move): Likewise.
      	(convert_modes): Likewise.
      	* fwprop.c (forward_propagate_subreg): Likewise.
      	* loop-iv.c (get_biv_step_1): Likewise.
      	* optabs.c (widen_operand): Likewise.
      	* postreload.c (move2add_valid_value_p): Likewise.
      	* recog.c (simplify_while_replacing): Likewise.
      	* simplify-rtx.c (simplify_unary_operation_1): Likewise.
      	(simplify_binary_operation_1): Likewise.  Remove redundant
      	mode equality check.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251478
      Richard Sandiford committed
    • [25/77] Use is_a <scalar_int_mode> for bitmask optimisations · 7c61657f
      Explicitly check for scalar_int_mode in code that maps arithmetic
      to full-mode bit operations.  These operations wouldn't work correctly
      for vector modes, for example.  In many cases this is enforced also by
      checking whether an operand is CONST_INT_P, but there were other cases
      where the condition is more indirect.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* combine.c (combine_simplify_rtx): Add checks for
      	is_a <scalar_int_mode>.
      	(simplify_if_then_else): Likewise.
      	(make_field_assignment): Likewise.
      	(simplify_comparison): Likewise.
      	* ifcvt.c (noce_try_bitop): Likewise.
      	* loop-invariant.c (canonicalize_address_mult): Likewise.
      	* simplify-rtx.c (simplify_unary_operation_1): Likewise.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251477
      Richard Sandiford committed
    • [24/77] Replace a != BLKmode check with is_a <scalar_int_mode> · 64ab8765
      This patch replaces a check against BLKmode with a check
      of is_a <scalar_int_mode>, in a case where scalar integer
      modes were the only useful alternatives left.
      
      gcc/
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      	* gimple-fold.c (gimple_fold_builtin_memory_op): Use
      	is_a <scalar_int_mode> instead of != BLKmode.
      
      From-SVN: r251476
      Richard Sandiford committed
    • [23/77] Replace != VOIDmode checks with is_a <scalar_int_mode> · 673bf5a6
      This patch replaces some checks against VOIDmode with checks
      of is_a <scalar_int_mode>, in cases where scalar integer modes
      were the only useful alternatives left.
      
      gcc/
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      	* cfgexpand.c (expand_debug_expr): Use is_a <scalar_int_mode>
      	instead of != VOIDmode.
      	* combine.c (if_then_else_cond): Likewise.
      	(change_zero_ext): Likewise.
      	* dwarf2out.c (mem_loc_descriptor): Likewise.
      	(loc_descriptor): Likewise.
      	* rtlanal.c (canonicalize_condition): Likewise.
      	* simplify-rtx.c (simplify_relational_operation_1): Likewise.
      
      From-SVN: r251475
      Richard Sandiford committed
    • [22/77] Replace !VECTOR_MODE_P with is_a <scalar_int_mode> · 45e8e706
      This patch replaces some checks of !VECTOR_MODE_P with checks
      of is_a <scalar_int_mode>, in cases where the scalar integer
      modes were the only useful alternatives left.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* simplify-rtx.c (simplify_binary_operation_1): Use
      	is_a <scalar_int_mode> instead of !VECTOR_MODE_P.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251474
      Richard Sandiford committed
    • [21/77] Replace SCALAR_INT_MODE_P checks with is_a <scalar_int_mode> · b0567726
      This patch replaces checks of "SCALAR_INT_MODE_P (...)" with
      "is_a <scalar_int_mode> (..., &var)" in cases where it becomes
      useful to refer to the mode as a scalar_int_mode.  It also
      replaces some checks for the two constituent classes (MODE_INT
      and MODE_PARTIAL_INT).
      
      The patch also introduces is_a <scalar_int_mode> checks for some
      uses of HWI_COMPUTABLE_MODE_P, which is a subcondition of
      SCALAR_INT_MODE_P.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* wide-int.h (int_traits<unsigned char>) New class.
      	(int_traits<unsigned short>) Likewise.
      	* cfgexpand.c (expand_debug_expr): Use is_a <scalar_int_mode>.
      	Use GET_MODE_UNIT_PRECISION and remove redundant test for
      	SCALAR_INT_MODE_P.
      	* combine.c (set_nonzero_bits_and_sign_copies): Use
      	is_a <scalar_int_mode>.
      	(find_split_point): Likewise.
      	(combine_simplify_rtx): Likewise.
      	(simplify_logical): Likewise.
      	(expand_compound_operation): Likewise.
      	(expand_field_assignment): Likewise.
      	(make_compound_operation): Likewise.
      	(extended_count): Likewise.
      	(change_zero_ext): Likewise.
      	(simplify_comparison): Likewise.
      	* dwarf2out.c (scompare_loc_descriptor): Likewise.
      	(ucompare_loc_descriptor): Likewise.
      	(minmax_loc_descriptor): Likewise.
      	(mem_loc_descriptor): Likewise.
      	(loc_descriptor): Likewise.
      	* expmed.c (init_expmed_one_mode): Likewise.
      	* lra-constraints.c (lra_constraint_offset): Likewise.
      	* optabs.c (prepare_libcall_arg): Likewise.
      	* postreload.c (move2add_note_store): Likewise.
      	* reload.c (operands_match_p): Likewise.
      	* rtl.h (load_extend_op): Likewise.
      	* rtlhooks.c (gen_lowpart_general): Likewise.
      	* simplify-rtx.c (simplify_truncation): Likewise.
      	(simplify_unary_operation_1): Likewise.
      	(simplify_binary_operation_1): Likewise.
      	(simplify_const_binary_operation): Likewise.
      	(simplify_const_relational_operation): Likewise.
      	(simplify_subreg): Likewise.
      	* stor-layout.c (bitwise_mode_for_mode): Likewise.
      	* var-tracking.c (adjust_mems): Likewise.
      	(prepare_call_arguments): Likewise.
      
      gcc/ada/
      	* gcc-interface/decl.c (check_ok_for_atomic_type): Use
      	is_a <scalar_int_mode>.
      	* gcc-interface/trans.c (Pragma_to_gnu): Likewise.
      	* gcc-interface/utils.c (gnat_type_for_mode): Likewise.
      
      gcc/fortran/
      	* trans-types.c (gfc_type_for_mode): Use is_a <scalar_int_mode>.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251473
      Richard Sandiford committed
    • [20/77] Replace MODE_INT checks with is_int_mode · b4206259
      Replace checks of "GET_MODE_CLASS (...) == MODE_INT" with
      "is_int_mode (..., &var)", in cases where it becomes useful
      to refer to the mode as a scalar_int_mode.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* machmode.h (is_int_mode): New fuction.
      	* combine.c (find_split_point): Use it.
      	(combine_simplify_rtx): Likewise.
      	(simplify_if_then_else): Likewise.
      	(simplify_set): Likewise.
      	(simplify_shift_const_1): Likewise.
      	(simplify_comparison): Likewise.
      	* config/aarch64/aarch64.c (aarch64_rtx_costs): Likewise.
      	* cse.c (notreg_cost): Likewise.
      	(cse_insn): Likewise.
      	* cselib.c (cselib_lookup_1): Likewise.
      	* dojump.c (do_jump_1): Likewise.
      	(do_compare_rtx_and_jump): Likewise.
      	* dse.c (get_call_args): Likewise.
      	* dwarf2out.c (rtl_for_decl_init): Likewise.
      	(native_encode_initializer): Likewise.
      	* expmed.c (emit_store_flag_1): Likewise.
      	(emit_store_flag): Likewise.
      	* expr.c (convert_modes): Likewise.
      	(store_field): Likewise.
      	(expand_expr_real_1): Likewise.
      	* fold-const.c (fold_read_from_constant_string): Likewise.
      	* gimple-ssa-sprintf.c (get_format_string): Likewise.
      	* optabs-libfuncs.c (gen_int_libfunc): Likewise.
      	* optabs.c (expand_binop): Likewise.
      	(expand_unop): Likewise.
      	(expand_abs_nojump): Likewise.
      	(expand_one_cmpl_abs_nojump): Likewise.
      	* simplify-rtx.c (mode_signbit_p): Likewise.
      	(val_signbit_p): Likewise.
      	(val_signbit_known_set_p): Likewise.
      	(val_signbit_known_clear_p): Likewise.
      	(simplify_relational_operation_1): Likewise.
      	* tree.c (vector_type_mode): Likewise.
      
      gcc/go/
      	* go-lang.c (go_langhook_type_for_mode): Use is_int_mode.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251472
      Richard Sandiford committed
    • [19/77] Add a smallest_int_mode_for_size helper function · f67f4dff
      This patch adds a wrapper around smallest_mode_for_size
      for cases in which the mode class is MODE_INT.  Unlike
      (int_)mode_for_size, smallest_mode_for_size always returns
      a mode of the specified class, asserting if no such mode exists.
      smallest_int_mode_for_size therefore returns a scalar_int_mode
      rather than an opt_scalar_int_mode.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* machmode.h (smallest_mode_for_size): Fix formatting.
      	(smallest_int_mode_for_size): New function.
      	* cfgexpand.c (expand_debug_expr): Use smallest_int_mode_for_size
      	instead of smallest_mode_for_size.
      	* combine.c (make_extraction): Likewise.
      	* config/arc/arc.c (arc_expand_movmem): Likewise.
      	* config/arm/arm.c (arm_expand_divmod_libfunc): Likewise.
      	* config/i386/i386.c (ix86_get_mask_mode): Likewise.
      	* config/s390/s390.c (s390_expand_insv): Likewise.
      	* config/sparc/sparc.c (assign_int_registers): Likewise.
      	* config/spu/spu.c (spu_function_value): Likewise.
      	(spu_function_arg): Likewise.
      	* coverage.c (get_gcov_type): Likewise.
      	(get_gcov_unsigned_t): Likewise.
      	* dse.c (find_shift_sequence): Likewise.
      	* expmed.c (store_bit_field_1): Likewise.
      	* expr.c (convert_move): Likewise.
      	(store_field): Likewise.
      	* internal-fn.c (expand_arith_overflow): Likewise.
      	* optabs-query.c (get_best_extraction_insn): Likewise.
      	* optabs.c (expand_twoval_binop_libfunc): Likewise.
      	* stor-layout.c (layout_type): Likewise.
      	(initialize_sizetypes): Likewise.
      	* targhooks.c (default_get_mask_mode): Likewise.
      	* tree-ssa-loop-manip.c (canonicalize_loop_ivs): Likewise.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251471
      Richard Sandiford committed
    • [18/77] Make int_mode_for_mode return an opt_scalar_int_mode · 304b9962
      Also use int_mode_for_mode instead of (int_)mode_for_size
      in cases where the requested size was the bitsize of an
      existing mode.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
                  Alan Hayward  <alan.hayward@arm.com>
                  David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* machmode.h (opt_mode::else_blk): New function.
      	(int_mode_for_mode): Declare.
      	* stor-layout.c (int_mode_for_mode): Return an opt_scalar_int_mode.
      	* builtins.c (expand_builtin_signbit): Adjust for new int_mode_for_mode
      	return type.
      	* cfgexpand.c (expand_debug_expr): Likewise.
      	* combine.c (gen_lowpart_or_truncate): Likewise.
      	(gen_lowpart_for_combine): Likewise.
      	* config/aarch64/aarch64.c (aarch64_emit_approx_sqrt): Likewise.
      	* config/avr/avr.c (avr_to_int_mode): Likewise.
      	(avr_out_plus_1): Likewise.
      	(avr_out_plus): Likewise.
      	(avr_out_round): Likewise.
      	* config/i386/i386.c (ix86_split_to_parts): Likewise.
      	* config/s390/s390.c (s390_expand_vec_compare_cc): Likewise.
      	(s390_expand_vcond): Likewise.
      	* config/spu/spu.c (spu_split_immediate): Likewise.
      	(spu_expand_mov): Likewise.
      	* dse.c (get_stored_val): Likewise.
      	* expmed.c (store_bit_field_1): Likewise.
      	(convert_extracted_bit_field): Use int_mode_for_mode instead of
      	int_mode_for_size.
      	(extract_bit_field_1): Adjust for new int_mode_for_mode return type.
      	(extract_low_bits): Likewise.
      	* expr.c (emit_group_load_1): Likewise.  Separate out the BLKmode
      	handling rather than repeating the check.
      	(emit_group_store): Likewise.
      	(emit_move_via_integer): Adjust for new int_mode_for_mode return type.
      	* optabs.c (expand_absneg_bit): Likewise.
      	(expand_copysign_absneg): Likewise.
      	(expand_copysign_bit): Likewise.
      	* tree-if-conv.c (ifcvt_can_use_mask_load_store): Likewise.
      	* tree-vect-slp.c (vect_transform_slp_perm_load): Likewise.
      	* tree-vect-stmts.c (vect_gen_perm_mask_any): Likewise.
      	* var-tracking.c (prepare_call_arguments):  Likewise.
      	* config/powerpcspe/powerpcspe.c (rs6000_do_expand_vec_perm): Use
      	int_mode_for_mode instead of mode_for_size.
      	* config/rs6000/rs6000.c (rs6000_do_expand_vec_perm): Likewise.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251470
      Richard Sandiford committed
    • [17/77] Add an int_mode_for_size helper function · fffbab82
      This patch adds a wrapper around mode_for_size for cases in which
      the mode class is MODE_INT (the commonest case).  The return type
      can then be an opt_scalar_int_mode instead of a machine_mode.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* machmode.h (int_mode_for_size): New function.
      	* builtins.c (set_builtin_user_assembler_name): Use int_mode_for_size
      	instead of mode_for_size.
      	* calls.c (save_fixed_argument_area): Likewise.  Make use of BLKmode
      	explicit.
      	* combine.c (expand_field_assignment): Use int_mode_for_size
      	instead of mode_for_size.
      	(make_extraction): Likewise.
      	(simplify_shift_const_1): Likewise.
      	(simplify_comparison): Likewise.
      	* dojump.c (do_jump): Likewise.
      	* dwarf2out.c (mem_loc_descriptor): Likewise.
      	* emit-rtl.c (init_derived_machine_modes): Likewise.
      	* expmed.c (flip_storage_order): Likewise.
      	(convert_extracted_bit_field): Likewise.
      	* expr.c (copy_blkmode_from_reg): Likewise.
      	* graphite-isl-ast-to-gimple.c (max_mode_int_precision): Likewise.
      	* internal-fn.c (expand_mul_overflow): Likewise.
      	* lower-subreg.c (simple_move): Likewise.
      	* optabs-libfuncs.c (init_optabs): Likewise.
      	* simplify-rtx.c (simplify_unary_operation_1): Likewise.
      	* tree.c (vector_type_mode): Likewise.
      	* tree-ssa-strlen.c (handle_builtin_memcmp): Likewise.
      	* tree-vect-data-refs.c (vect_lanes_optab_supported_p): Likewise.
      	* tree-vect-generic.c (expand_vector_parallel): Likewise.
      	* tree-vect-stmts.c (vectorizable_load): Likewise.
      	(vectorizable_store): Likewise.
      
      gcc/ada/
      	* gcc-interface/decl.c (gnat_to_gnu_entity): Use int_mode_for_size
      	instead of mode_for_size.
      	(gnat_to_gnu_subprog_type): Likewise.
      	* gcc-interface/utils.c (make_type_from_size): Likewise.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251469
      Richard Sandiford committed
    • [16/77] Add scalar_int_mode_pod · bf862c53
      This patch adds a POD class for scalar integers, as an instance
      of a new pod_mode template.  Later patches will use pod_mode in
      situations that really do need to be POD; this patch is simply
      using PODs to remove load-time initialisation.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* coretypes.h (pod_mode): New type.
      	(scalar_int_mode_pod): New typedef.
      	* machmode.h (pod_mode): New class.
      	(int_n_data_t::m): Change type to scalar_int_mode_pod.
      	* genmodes.c (emit_mode_int_n): Update accordingly.
      	* lower-subreg.h (target_lower_subreg): Change type to
      	scalar_int_mode_pod.
      	* gdbhooks.py (build_pretty_printer): Handle pod_mode and
      	scalar_int_mode_pod.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251468
      Richard Sandiford committed
    • [15/77] Add scalar_int_mode · 501623d4
      Similar to the previous scalar_float_mode patch, but for modes that
      satisfy SCALAR_INT_MODE_P.  There are very many uses of scalar integers,
      so this patch only makes a token change to the types of byte_mode,
      word_mode, ptr_mode and rs6000_pmode.  The next patches in the series
      gradually replace more uses.
      
      The patch also removes and adds casts to some target-specific code
      due to the new types of SImode, DImode and Pmode.
      
      The as_a <scalar_int_mode> goes away in a later patch.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* config/powerpcspe/powerpcspe.h (rs6000_pmode): Change type from
      	machine_mode to scalar_int_mode.
      	* config/powerpcspe/powerpcspe.c (rs6000_pmode): Likewise.
      	(rs6000_option_override_internal): Remove cast to int.
      	* config/rs6000/rs6000.h (rs6000_pmode): Change type from
      	machine_mode to scalar_int_mode.
      	* config/rs6000/rs6000.c (rs6000_pmode): Likewise.
      	(rs6000_option_override_internal): Remove cast to int.
      	* config/s390/s390.h (Pmode): Remove cast to machine_mode.
      	* config/epiphany/epiphany.h (RTX_OK_FOR_OFFSET_P): Add cast
      	to machine_mode.
      	* config/s390/s390.c (s390_expand_builtin): Likewise.
      	* coretypes.h (scalar_int_mode): New type.
      	(opt_scalar_int_mode): New typedef.
      	* machmode.h (scalar_int_mode): New class.
      	(scalar_int_mode::includes_p): New function.
      	(byte_mode): Change type to scalar_int_mode.
      	(word_mode): Likewise.
      	(ptr_mode): Likewise.
      	* emit-rtl.c (byte_mode): Likewise.
      	(word_mode): Likewise.
      	(ptr_mode): Likewise.
      	(init_derived_machine_modes): Update accordingly.
      	* genmodes.c (get_mode_class): Return scalar_int_mode for MODE_INT
      	and MODE_PARTIAL_INT.
      	* gdbhooks.py (build_pretty_printer): Handle scalar_int_mode and
      	opt_scalar_int_mode.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251467
      Richard Sandiford committed
    • [14/77] Make libgcc_floating_mode_supported_p take a scalar_float_mode · 7c5bd57a
      As per subject.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* target.def (libgcc_floating_mode_supported_p): Take a
      	scalar_float_mode.
      	* doc/tm.texi: Regenerate.
      	* targhooks.h (default_libgcc_floating_mode_supported_p): Take a
      	scalar_float_mode.
      	* targhooks.c (default_libgcc_floating_mode_supported_p): Likewise.
      	* config/aarch64/aarch64.c (aarch64_libgcc_floating_mode_supported_p):
      	Likewise.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251466
      Richard Sandiford committed
    • [13/77] Make floatn_mode return an opt_scalar_float_mode · 1ce87609
      As per subject.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* target.def (default_floatn_mode): Return an opt_scalar_float_mode.
      	* doc/tm.texi: Regenerate.
      	* config/arm/arm.c (arm_floatn_mode): Return an opt_scalar_float_mode.
      	* config/powerpcspe/powerpcspe.c (rs6000_floatn_mode): Likewise.
      	* config/rs6000/rs6000.c (rs6000_floatn_mode): Likewise.
      	* targhooks.h (default_floatn_mode): Likewise.
      	* targhooks.c (default_floatn_mode): Likewise.
      	* tree.c (build_common_tree_nodes): Update accordingly.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251465
      Richard Sandiford committed
    • [12/77] Use opt_scalar_float_mode when iterating over float modes · 5c20c4af
      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
      Richard Sandiford committed
    • [11/77] Add a float_mode_for_size helper function · 857c7b46
      This provides a type-safe way to ask for a float mode and get it as a
      scalar_float_mode.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* coretypes.h (opt_scalar_float_mode): New typedef.
      	* machmode.h (float_mode_for_size): New function.
      	* emit-rtl.c (double_mode): Delete.
      	(init_emit_once): Use float_mode_for_size.
      	* stor-layout.c (layout_type): Likewise.
      	* gdbhooks.py (build_pretty_printer): Handle opt_scalar_float_mode.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251463
      Richard Sandiford committed
    • Fix test-case vrp104.c. · d16c828e
      2017-08-30  Martin Liska  <mliska@suse.cz>
      
      	* gcc.dg/tree-ssa/vrp104.c: Change dump file name.
      
      From-SVN: r251462
      Martin Liska committed
    • [10/77] Make assemble_real take a scalar_float_mode · fc0461ae
      As per subject.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* output.h (assemble_real): Take a scalar_float_mode.
      	* config/arm/arm.c (arm_assemble_integer): Update accordingly.
      	* config/arm/arm.md (consttable_4): Likewise.
      	(consttable_8): Likewise.
      	(consttable_16): Likewise.
      	* config/mips/mips.md (consttable_float): Likewise.
      	* config/s390/s390.c (s390_output_pool_entry): Likewise.
      	* varasm.c (assemble_real): Take a scalar_float_mode.
      	(output_constant_pool_2): Update accordingly.
      	(output_constant): Likewise.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251461
      Richard Sandiford committed
    • [9/77] Add SCALAR_FLOAT_TYPE_MODE · b5f2d801
      This patch adds a macro that extracts the TYPE_MODE and forcibly
      converts it to a scalar_float_mode.  The forcible conversion
      includes a gcc_checking_assert that the mode is a SCALAR_FLOAT_MODE_P.
      
      This becomes important as more static type checking is added by
      later patches.  It has the additional benefit of bypassing the
      VECTOR_TYPE_P (...) ? vector_type_mode (...) : ... condition
      in TYPE_MODE; in release builds the new macro is a simple
      field access.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* tree.h (SCALAR_FLOAT_TYPE_MODE): New macro.
      	* builtins.c (expand_builtin_signbit): Use it instead of TYPE_MODE.
      	* fold-const.c (fold_convert_const_real_from_fixed): Likewise.
      	(native_encode_real): Likewise.
      	(native_interpret_real): Likewise.
      	* hsa-brig.c (emit_immediate_scalar_to_buffer): Likewise.
      	* tree-vrp.c (simplify_float_conversion_using_ranges): Likewise.
      
      gcc/cp/
      	* mangle.c (write_real_cst): Use SCALAR_FLOAT_TYPE_MODE
      	instead of TYPE_MODE.
      
      gcc/fortran/
      	* target-memory.c (size_float): Use SCALAR_FLOAT_TYPE_MODE
      	instead of TYPE_MODE.
      
      gcc/objc/
      	* objc-encoding.c (encode_type): Use SCALAR_FLOAT_TYPE_MODE
      	instead of TYPE_MODE.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251460
      Richard Sandiford committed
    • [8/77] Simplify gen_trunc/extend_conv_libfunc · 3205ab28
      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
      Richard Sandiford committed
    • [7/77] Add scalar_float_mode · e386a52f
      This patch adds a scalar_float_mode class, which wraps a mode enum
      that is known to satisfy SCALAR_FLOAT_MODE_P.  Things like "SFmode"
      now give a scalar_float_mode object instead of a machine_mode.
      This in turn needs a change to the real.h format_helper, so that
      it can accept both machine_modes and scalar_float_modes.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* coretypes.h (scalar_float_mode): New type.
      	* machmode.h (mode_traits::from_int): Use machine_mode if
      	USE_ENUM_MODES is defined.
      	(is_a): New function.
      	(as_a): Likewise.
      	(dyn_cast): Likewise.
      	(scalar_float_mode): New class.
      	(scalar_float_mode::includes_p): New function.
      	(is_float_mode): Likewise.
      	* gdbhooks.py (MachineModePrinter): New class.
      	(build_pretty_printer): Use it for scalar_float_mode.
      	* real.h (FLOAT_MODE_FORMAT): Use as_a <scalar_float_mode>.
      	(format_helper::format_helper): Turn into a template.
      	* genmodes.c (get_mode_class): New function.
      	(emit_insn_modes_h): Give modes the class returned by get_mode_class,
      	or machine_mode if none.
      	* config/aarch64/aarch64.c (aarch64_simd_valid_immediate): Use
      	as_a <scalar_float_mode>.
      	* dwarf2out.c (mem_loc_descriptor): Likewise.
      	(insert_float): Likewise.
      	(add_const_value_attribute): Likewise.
      	* simplify-rtx.c (simplify_immed_subreg): Likewise.
      	* optabs.c (expand_absneg_bit): Take a scalar_float_mode.
      	(expand_unop): Update accordingly.
      	(expand_abs_nojump): Likewise.
      	(expand_copysign_absneg): Take a scalar_float_mode.
      	(expand_copysign_bit): Likewise.
      	(expand_copysign): Update accordingly.
      
      gcc/ada/
      	* gcc-interface/utils.c (gnat_type_for_mode): Use is_a
      	<scalar_float_mode> instead of SCALAR_FLOAT_MODE_P.
      
      gcc/go/
      	* go-lang.c (go_langhook_type_for_mode): Use is_float_mode.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251458
      Richard Sandiford committed
    • [6/77] Make GET_MODE_WIDER return an opt_mode · 490d0f6c
      GET_MODE_WIDER previously returned VOIDmode if no wider mode existed.
      That would cause problems with stricter mode classes, since VOIDmode
      isn't for example a valid scalar integer or floating-point mode.
      This patch instead makes it return a new opt_mode<T> class, which
      holds either a T or nothing.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* coretypes.h (opt_mode): New class.
      	* machmode.h (opt_mode): Likewise.
      	(opt_mode::else_void): New function.
      	(opt_mode::require): Likewise.
      	(opt_mode::exists): Likewise.
      	(GET_MODE_WIDER_MODE): Turn into a function and return an opt_mode.
      	(GET_MODE_2XWIDER_MODE): Likewise.
      	(mode_iterator::get_wider): Update accordingly.
      	(mode_iterator::get_2xwider): Likewise.
      	(mode_iterator::get_known_wider): Likewise, turning into a template.
      	* combine.c (make_extraction): Update use of GET_MODE_WIDER_MODE,
      	forcing a wider mode to exist.
      	* config/cr16/cr16.h (LONG_REG_P): Likewise.
      	* rtlanal.c (init_num_sign_bit_copies_in_rep): Likewise.
      	* config/c6x/c6x.c (c6x_rtx_costs): Update use of
      	GET_MODE_2XWIDER_MODE, forcing a wider mode to exist.
      	* lower-subreg.c (init_lower_subreg): Likewise.
      	* optabs-libfuncs.c (init_sync_libfuncs_1): Likewise, but not
      	on the final iteration.
      	* config/i386/i386.c (ix86_expand_set_or_movmem): Check whether
      	a wider mode exists before asking for a move pattern.
      	(get_mode_wider_vector): Update use of GET_MODE_WIDER_MODE,
      	forcing a wider mode to exist.
      	(expand_vselect_vconcat): Update use of GET_MODE_2XWIDER_MODE,
      	returning false if no such mode exists.
      	* config/ia64/ia64.c (expand_vselect_vconcat): Likewise.
      	* config/mips/mips.c (mips_expand_vselect_vconcat): Likewise.
      	* expmed.c (init_expmed_one_mode): Update use of GET_MODE_WIDER_MODE.
      	Avoid checking for a MODE_INT if we already know the mode is not a
      	SCALAR_INT_MODE_P.
      	(extract_high_half): Update use of GET_MODE_WIDER_MODE,
      	forcing a wider mode to exist.
      	(expmed_mult_highpart_optab): Likewise.
      	(expmed_mult_highpart): Likewise.
      	* expr.c (expand_expr_real_2): Update use of GET_MODE_WIDER_MODE,
      	using else_void.
      	* lto-streamer-in.c (lto_input_mode_table): Likewise.
      	* optabs-query.c (find_widening_optab_handler_and_mode): Likewise.
      	* stor-layout.c (bit_field_mode_iterator::next_mode): Likewise.
      	* internal-fn.c (expand_mul_overflow): Update use of
      	GET_MODE_2XWIDER_MODE.
      	* omp-low.c (omp_clause_aligned_alignment): Likewise.
      	* tree-ssa-math-opts.c (convert_mult_to_widen): Update use of
      	GET_MODE_WIDER_MODE.
      	(convert_plusminus_to_widen): Likewise.
      	* tree-switch-conversion.c (array_value_type): Likewise.
      	* var-tracking.c (emit_note_insn_var_location): Likewise.
      	* tree-vrp.c (simplify_float_conversion_using_ranges): Likewise.
      	Return false inside rather than outside the loop if no wider mode
      	exists
      	* optabs.c (expand_binop): Update use of GET_MODE_WIDER_MODE
      	and GET_MODE_2XWIDER_MODE
      	(can_compare_p): Use else_void.
      	* gdbhooks.py (OptMachineModePrinter): New class.
      	(build_pretty_printer): Use it for opt_mode.
      
      gcc/ada/
      	* gcc-interface/decl.c (validate_size): Update use of
      	GET_MODE_WIDER_MODE, forcing a wider mode to exist.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251457
      Richard Sandiford committed
    • [5/77] Small tweak to array_value_type · ec35d572
      Store the type mode in a variable so that a later,
      more mechanical patch can change its type.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* tree-switch-conversion.c (array_value_type): Only read TYPE_MODE
      	once.  Use get_narrowest_mode instead of GET_CLASS_NARROWEST_MODE.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251456
      Richard Sandiford committed
    • [4/77] Add FOR_EACH iterators for modes · c94843d2
      The new iterators are:
      
      - FOR_EACH_MODE_IN_CLASS: iterate over all the modes in a mode class.
      
      - FOR_EACH_MODE_FROM: iterate over all the modes in a class,
        starting at a given mode.
      
      - FOR_EACH_WIDER_MODE: iterate over all the modes in a class,
        starting at the next widest mode after a given mode.
      
      - FOR_EACH_2XWIDER_MODE: same, but considering only modes that
        are two times wider than the previous mode.
      
      - FOR_EACH_MODE_UNTIL: iterate over all the modes in a class until
        a given mode is reached.
      
      - FOR_EACH_MODE: iterate over all the modes in a class between
        two given modes, inclusive of the first but not the second.
      
      These help with the stronger type checking added by later patches,
      since every new mode will be in the same class as the previous one.
      
      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_traits): New structure.
      	(get_narrowest_mode): New function.
      	(mode_iterator::start): Likewise.
      	(mode_iterator::iterate_p): Likewise.
      	(mode_iterator::get_wider): Likewise.
      	(mode_iterator::get_known_wider): Likewise.
      	(mode_iterator::get_2xwider): Likewise.
      	(FOR_EACH_MODE_IN_CLASS): New mode iterator.
      	(FOR_EACH_MODE): Likewise.
      	(FOR_EACH_MODE_FROM): Likewise.
      	(FOR_EACH_MODE_UNTIL): Likewise.
      	(FOR_EACH_WIDER_MODE): Likewise.
      	(FOR_EACH_2XWIDER_MODE): Likewise.
      	* builtins.c (expand_builtin_strlen): Use new mode iterators.
      	* combine.c (simplify_comparison): Likewise
      	* config/i386/i386.c (type_natural_mode): Likewise.
      	* cse.c (cse_insn): Likewise.
      	* dse.c (find_shift_sequence): Likewise.
      	* emit-rtl.c (init_derived_machine_modes): Likewise.
      	(init_emit_once): Likewise.
      	* explow.c (hard_function_value): Likewise.
      	* expmed.c (extract_fixed_bit_field_1): Likewise.
      	(extract_bit_field_1): Likewise.
      	(expand_divmod): Likewise.
      	(emit_store_flag_1): Likewise.
      	* expr.c (init_expr_target): Likewise.
      	(convert_move): Likewise.
      	(alignment_for_piecewise_move): Likewise.
      	(widest_int_mode_for_size): Likewise.
      	(emit_block_move_via_movmem): Likewise.
      	(copy_blkmode_to_reg): Likewise.
      	(set_storage_via_setmem): Likewise.
      	(compress_float_constant): Likewise.
      	* omp-low.c (omp_clause_aligned_alignment): Likewise.
      	* optabs-query.c (get_best_extraction_insn): Likewise.
      	* optabs.c (expand_binop): Likewise.
      	(expand_twoval_unop): Likewise.
      	(expand_twoval_binop): Likewise.
      	(widen_leading): Likewise.
      	(widen_bswap): Likewise.
      	(expand_parity): Likewise.
      	(expand_unop): Likewise.
      	(prepare_cmp_insn): Likewise.
      	(prepare_float_lib_cmp): Likewise.
      	(expand_float): Likewise.
      	(expand_fix): Likewise.
      	(expand_sfix_optab): Likewise.
      	* postreload.c (move2add_use_add2_insn): Likewise.
      	* reg-stack.c (reg_to_stack): Likewise.
      	* reginfo.c (choose_hard_reg_mode): Likewise.
      	* rtlanal.c (init_num_sign_bit_copies_in_rep): Likewise.
      	* stor-layout.c (mode_for_size): Likewise.
      	(smallest_mode_for_size): Likewise.
      	(mode_for_vector): Likewise.
      	(finish_bitfield_representative): Likewise.
      	* tree-ssa-math-opts.c (target_supports_divmod_p): Likewise.
      	* tree-vect-generic.c (type_for_widest_vector_mode): Likewise.
      	* tree-vect-stmts.c (vectorizable_conversion): Likewise.
      	* var-tracking.c (prepare_call_arguments): Likewise.
      
      gcc/ada/
      	* gcc-interface/misc.c (fp_prec_to_size): Use new mode iterators.
      	(fp_size_to_prec): Likewise.
      
      gcc/c-family/
      	* c-common.c (c_common_fixed_point_type_for_size): Use new mode
      	iterators.
      	* c-cppbuiltin.c (c_cpp_builtins): Likewise.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251455
      Richard Sandiford committed
    • [3/77] Allow machine modes to be classes · b77d1a17
      This patch makes various changes that allow modes like SImode to be
      classes rather than enums.
      
      Firstly, it adds inline functions for all mode size properties,
      with the macros being simple wrappers around them.  This is necessary
      for the __builtin_constant_p trick to continue working effectively when
      the mode arguments are slightly more complex (but still foldable at
      compile time).
      
      These inline functions are trivial and heavily used.  There's not much
      point keeping them out-of-line at -O0: if anything it would make
      debugging harder rather than easier, and it would also slow things down.
      The patch therefore marks them as "always_inline", if that's available.
      Later patches use this approach too.
      
      Using inline functions means that it's no longer possible to pass
      an int to GET_MODE_PRECISION etc.  The Fortran and powerpcspe-c.c
      parts are needed to avoid instances of that.
      
      The patch continues to use enums for gencondmd.c, so that more
      mode comparisons are integer constant expressions when checking
      for always-true or always-false conditions.  This is the only
      intended use of USE_ENUM_MODES.
      
      The patch also enforces the previous replacement of case statements
      by defining modes as:
      
        #define FOOmode ((void) 0, E_FOOmode)
      
      This adds no overhead but makes sure that new uses of "case FOOmode:"
      don't accidentally creep in when FOOmode has no specific class associated
      with it.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* genconditions.c (write_header): Add a "#define USE_ENUM_MODES".
      	* genmodes.c (emit_insn_modes_h): Define FOOmode to E_FOOmode if
      	USE_ENUM_MODES is defined and to ((void) 0, E_FOOmode) otherwise.
      	* machmode.h (mode_size): Move earlier in file.
      	(mode_precision): Likewise.
      	(mode_inner): Likewise.
      	(mode_nunits): Likewise.
      	(mode_unit_size): Likewise.
      	(unit_unit_precision): Likewise.
      	(mode_wider): Likewise.
      	(mode_2xwider): Likewise.
      	(machine_mode): New class.
      	(mode_to_bytes): New function.
      	(mode_to_bits): Likewise.
      	(mode_to_precision): Likewise.
      	(mode_to_inner): Likewise.
      	(mode_to_unit_size): Likewise.
      	(mode_to_unit_precision): Likewise.
      	(mode_to_nunits): Likewise.
      	(GET_MODE_SIZE): Use mode_to_bytes.
      	(GET_MODE_BITSIZE): Use mode_to_bits.
      	(GET_MODE_PRECISION): Use mode_to_precision.
      	(GET_MODE_INNER): Use mode_to_inner.
      	(GET_MODE_UNIT_SIZE): Use mode_to_unit_size.
      	(GET_MODE_UNIT_PRECISION): Use mode_to_unit_precision.
      	(GET_MODE_NUNITS): Use mode_to_nunits.
      	* system.h (ALWAYS_INLINE): New macro.
      	* config/powerpcspe/powerpcspe-c.c
      	(altivec_resolve_overloaded_builtin): Use machine_mode instead of
      	int for arg1_mode and arg2_mode.
      
      gcc/fortran/
      	* trans-types.c (gfc_init_kinds): Use machine_mode instead of int
      	for "mode".
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251454
      Richard Sandiford committed
    • [2/77] Add an E_ prefix to case statements · 4e10a5a7
      All case statements need to be updated to use the prefixed names,
      since the unprefixed names will eventually not be integer constant
      expressions.  This patch does a mechanical substitution over the whole
      codebase.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* config/aarch64/aarch64-builtins.c (aarch64_simd_builtin_std_type):
      	Prefix mode names with E_ in case statements.
      	* config/aarch64/aarch64-elf.h (ASM_OUTPUT_ADDR_DIFF_ELT): Likewise.
      	* config/aarch64/aarch64.c (aarch64_split_simd_combine): Likewise.
      	(aarch64_split_simd_move): Likewise.
      	(aarch64_gen_storewb_pair): Likewise.
      	(aarch64_gen_loadwb_pair): Likewise.
      	(aarch64_gen_store_pair): Likewise.
      	(aarch64_gen_load_pair): Likewise.
      	(aarch64_get_condition_code_1): Likewise.
      	(aarch64_constant_pool_reload_icode): Likewise.
      	(get_rsqrte_type): Likewise.
      	(get_rsqrts_type): Likewise.
      	(get_recpe_type): Likewise.
      	(get_recps_type): Likewise.
      	(aarch64_gimplify_va_arg_expr): Likewise.
      	(aarch64_simd_container_mode): Likewise.
      	(aarch64_emit_load_exclusive): Likewise.
      	(aarch64_emit_store_exclusive): Likewise.
      	(aarch64_expand_compare_and_swap): Likewise.
      	(aarch64_gen_atomic_cas): Likewise.
      	(aarch64_emit_bic): Likewise.
      	(aarch64_emit_atomic_swap): Likewise.
      	(aarch64_emit_atomic_load_op): Likewise.
      	(aarch64_evpc_trn): Likewise.
      	(aarch64_evpc_uzp): Likewise.
      	(aarch64_evpc_zip): Likewise.
      	(aarch64_evpc_ext): Likewise.
      	(aarch64_evpc_rev): Likewise.
      	(aarch64_evpc_dup): Likewise.
      	(aarch64_gen_ccmp_first): Likewise.
      	(aarch64_gen_ccmp_next): Likewise.
      	* config/alpha/alpha.c (alpha_scalar_mode_supported_p): Likewise.
      	(alpha_emit_xfloating_libcall): Likewise.
      	(emit_insxl): Likewise.
      	(alpha_arg_type): Likewise.
      	* config/arc/arc.c (arc_vector_mode_supported_p): Likewise.
      	(arc_preferred_simd_mode): Likewise.
      	(arc_secondary_reload): Likewise.
      	(get_arc_condition_code): Likewise.
      	(arc_print_operand): Likewise.
      	(arc_legitimate_constant_p): Likewise.
      	* config/arc/arc.h (ASM_OUTPUT_ADDR_DIFF_ELT): Likewise.
      	* config/arc/arc.md (casesi_load): Likewise.
      	(casesi_compact_jump): Likewise.
      	* config/arc/predicates.md (proper_comparison_operator): Likewise.
      	(cc_use_register): Likewise.
      	* config/arm/aout.h (ASM_OUTPUT_ADDR_DIFF_ELT): Likewise.
      	* config/arm/arm-builtins.c (arm_simd_builtin_std_type): Likewise.
      	(arm_init_iwmmxt_builtins): Likewise.
      	* config/arm/arm.c (thumb1_size_rtx_costs): Likewise.
      	(neon_expand_vector_init): Likewise.
      	(arm_attr_length_move_neon): Likewise.
      	(maybe_get_arm_condition_code): Likewise.
      	(arm_emit_vector_const): Likewise.
      	(arm_preferred_simd_mode): Likewise.
      	(arm_output_iwmmxt_tinsr): Likewise.
      	(thumb1_output_casesi): Likewise.
      	(thumb2_output_casesi): Likewise.
      	(arm_emit_load_exclusive): Likewise.
      	(arm_emit_store_exclusive): Likewise.
      	(arm_expand_compare_and_swap): Likewise.
      	(arm_evpc_neon_vuzp): Likewise.
      	(arm_evpc_neon_vzip): Likewise.
      	(arm_evpc_neon_vrev): Likewise.
      	(arm_evpc_neon_vtrn): Likewise.
      	(arm_evpc_neon_vext): Likewise.
      	(arm_validize_comparison): Likewise.
      	* config/arm/neon.md (neon_vc<cmp_op><mode>): Likewise.
      	* config/avr/avr-c.c (avr_resolve_overloaded_builtin): Likewise.
      	* config/avr/avr.c (avr_rtx_costs_1): Likewise.
      	* config/c6x/c6x.c (c6x_vector_mode_supported_p): Likewise.
      	(c6x_preferred_simd_mode): Likewise.
      	* config/epiphany/epiphany.c (get_epiphany_condition_code): Likewise.
      	(epiphany_rtx_costs): Likewise.
      	* config/epiphany/predicates.md (proper_comparison_operator):
      	Likewise.
      	* config/frv/frv.c (condexec_memory_operand): Likewise.
      	(frv_emit_move): Likewise.
      	(output_move_single): Likewise.
      	(output_condmove_single): Likewise.
      	(frv_hard_regno_mode_ok): Likewise.
      	(frv_matching_accg_mode): Likewise.
      	* config/h8300/h8300.c (split_adds_subs): Likewise.
      	(h8300_rtx_costs): Likewise.
      	(h8300_print_operand): Likewise.
      	(compute_mov_length): Likewise.
      	(output_logical_op): Likewise.
      	(compute_logical_op_length): Likewise.
      	(compute_logical_op_cc): Likewise.
      	(h8300_shift_needs_scratch_p): Likewise.
      	(output_a_shift): Likewise.
      	(compute_a_shift_length): Likewise.
      	(compute_a_shift_cc): Likewise.
      	(expand_a_rotate): Likewise.
      	(output_a_rotate): Likewise.
      	* config/i386/i386.c (classify_argument): Likewise.
      	(function_arg_advance_32): Likewise.
      	(function_arg_32): Likewise.
      	(function_arg_64): Likewise.
      	(function_value_64): Likewise.
      	(ix86_gimplify_va_arg): Likewise.
      	(ix86_legitimate_constant_p): Likewise.
      	(put_condition_code): Likewise.
      	(split_double_mode): Likewise.
      	(ix86_avx256_split_vector_move_misalign): Likewise.
      	(ix86_expand_vector_logical_operator): Likewise.
      	(ix86_split_idivmod): Likewise.
      	(ix86_expand_adjust_ufix_to_sfix_si): Likewise.
      	(ix86_build_const_vector): Likewise.
      	(ix86_build_signbit_mask): Likewise.
      	(ix86_match_ccmode): Likewise.
      	(ix86_cc_modes_compatible): Likewise.
      	(ix86_expand_branch): Likewise.
      	(ix86_expand_sse_cmp): Likewise.
      	(ix86_expand_sse_movcc): Likewise.
      	(ix86_expand_int_sse_cmp): Likewise.
      	(ix86_expand_vec_perm_vpermi2): Likewise.
      	(ix86_expand_vec_perm): Likewise.
      	(ix86_expand_sse_unpack): Likewise.
      	(ix86_expand_int_addcc): Likewise.
      	(ix86_split_to_parts): Likewise.
      	(ix86_vectorize_builtin_gather): Likewise.
      	(ix86_vectorize_builtin_scatter): Likewise.
      	(avx_vpermilp_parallel): Likewise.
      	(inline_memory_move_cost): Likewise.
      	(ix86_tieable_integer_mode_p): Likewise.
      	(x86_maybe_negate_const_int): Likewise.
      	(ix86_expand_vector_init_duplicate): Likewise.
      	(ix86_expand_vector_init_one_nonzero): Likewise.
      	(ix86_expand_vector_init_one_var): Likewise.
      	(ix86_expand_vector_init_concat): Likewise.
      	(ix86_expand_vector_init_interleave): Likewise.
      	(ix86_expand_vector_init_general): Likewise.
      	(ix86_expand_vector_set): Likewise.
      	(ix86_expand_vector_extract): Likewise.
      	(emit_reduc_half): Likewise.
      	(ix86_emit_i387_round): Likewise.
      	(ix86_mangle_type): Likewise.
      	(ix86_expand_round_sse4): Likewise.
      	(expand_vec_perm_blend): Likewise.
      	(canonicalize_vector_int_perm): Likewise.
      	(ix86_expand_vec_one_operand_perm_avx512): Likewise.
      	(expand_vec_perm_1): Likewise.
      	(expand_vec_perm_interleave3): Likewise.
      	(expand_vec_perm_even_odd_pack): Likewise.
      	(expand_vec_perm_even_odd_1): Likewise.
      	(expand_vec_perm_broadcast_1): Likewise.
      	(ix86_vectorize_vec_perm_const_ok): Likewise.
      	(ix86_expand_vecop_qihi): Likewise.
      	(ix86_expand_mul_widen_hilo): Likewise.
      	(ix86_expand_sse2_abs): Likewise.
      	(ix86_expand_pextr): Likewise.
      	(ix86_expand_pinsr): Likewise.
      	(ix86_preferred_simd_mode): Likewise.
      	(ix86_simd_clone_compute_vecsize_and_simdlen): Likewise.
      	* config/i386/sse.md (*andnot<mode>3): Likewise.
      	(<mask_codefor><code><mode>3<mask_name>): Likewise.
      	(*<code><mode>3): Likewise.
      	* config/ia64/ia64.c (ia64_expand_vecint_compare): Likewise.
      	(ia64_expand_atomic_op): Likewise.
      	(ia64_arg_type): Likewise.
      	(ia64_mode_to_int): Likewise.
      	(ia64_scalar_mode_supported_p): Likewise.
      	(ia64_vector_mode_supported_p): Likewise.
      	(expand_vec_perm_broadcast): Likewise.
      	* config/iq2000/iq2000.c (iq2000_move_1word): Likewise.
      	(iq2000_function_arg_advance): Likewise.
      	(iq2000_function_arg): Likewise.
      	* config/m32c/m32c.c (m32c_preferred_reload_class): Likewise.
      	* config/m68k/m68k.c (output_dbcc_and_branch): Likewise.
      	(m68k_libcall_value): Likewise.
      	(m68k_function_value): Likewise.
      	(sched_attr_op_type): Likewise.
      	* config/mcore/mcore.c (mcore_output_move): Likewise.
      	* config/microblaze/microblaze.c (microblaze_function_arg_advance):
      	Likewise.
      	(microblaze_function_arg): Likewise.
      	* config/mips/mips.c (mips16_build_call_stub): Likewise.
      	(mips_print_operand): Likewise.
      	(mips_mode_ok_for_mov_fmt_p): Likewise.
      	(mips_vector_mode_supported_p): Likewise.
      	(mips_preferred_simd_mode): Likewise.
      	(mips_expand_vpc_loongson_even_odd): Likewise.
      	(mips_expand_vec_unpack): Likewise.
      	(mips_expand_vi_broadcast): Likewise.
      	(mips_expand_vector_init): Likewise.
      	(mips_expand_vec_reduc): Likewise.
      	(mips_expand_msa_cmp): Likewise.
      	* config/mips/mips.md (casesi_internal_mips16_<mode>): Likewise.
      	* config/mn10300/mn10300.c (mn10300_print_operand): Likewise.
      	(cc_flags_for_mode): Likewise.
      	* config/msp430/msp430.c (msp430_print_operand): Likewise.
      	* config/nds32/nds32-md-auxiliary.c (nds32_mem_format): Likewise.
      	(nds32_output_casesi_pc_relative): Likewise.
      	* config/nds32/nds32.h (ASM_OUTPUT_ADDR_DIFF_ELT): Likewise.
      	* config/nvptx/nvptx.c (nvptx_ptx_type_from_mode): Likewise.
      	(nvptx_gen_unpack): Likewise.
      	(nvptx_gen_pack): Likewise.
      	(nvptx_gen_shuffle): Likewise.
      	(nvptx_gen_wcast): Likewise.
      	(nvptx_preferred_simd_mode): Likewise.
      	* config/pa/pa.c (pa_secondary_reload): Likewise.
      	* config/pa/predicates.md (base14_operand): Likewise.
      	* config/powerpcspe/powerpcspe-c.c
      	(altivec_resolve_overloaded_builtin): Likewise.
      	* config/powerpcspe/powerpcspe.c (rs6000_setup_reg_addr_masks):
      	Likewise.
      	(rs6000_preferred_simd_mode): Likewise.
      	(output_vec_const_move): Likewise.
      	(rs6000_expand_vector_extract): Likewise.
      	(rs6000_split_vec_extract_var): Likewise.
      	(reg_offset_addressing_ok_p): Likewise.
      	(rs6000_legitimate_offset_address_p): Likewise.
      	(rs6000_legitimize_address): Likewise.
      	(rs6000_emit_set_const): Likewise.
      	(rs6000_const_vec): Likewise.
      	(rs6000_emit_move): Likewise.
      	(spe_build_register_parallel): Likewise.
      	(rs6000_darwin64_record_arg_recurse): Likewise.
      	(swap_selector_for_mode): Likewise.
      	(spe_init_builtins): Likewise.
      	(paired_init_builtins): Likewise.
      	(altivec_init_builtins): Likewise.
      	(do_load_for_compare): Likewise.
      	(rs6000_generate_compare): Likewise.
      	(rs6000_expand_float128_convert): Likewise.
      	(emit_load_locked): Likewise.
      	(emit_store_conditional): Likewise.
      	(rs6000_output_function_epilogue): Likewise.
      	(rs6000_handle_altivec_attribute): Likewise.
      	(rs6000_function_value): Likewise.
      	(emit_fusion_gpr_load): Likewise.
      	(emit_fusion_p9_load): Likewise.
      	(emit_fusion_p9_store): Likewise.
      	* config/powerpcspe/predicates.md (easy_fp_constant): Likewise.
      	(fusion_gpr_mem_load): Likewise.
      	(fusion_addis_mem_combo_load): Likewise.
      	(fusion_addis_mem_combo_store): Likewise.
      	* config/rs6000/predicates.md (easy_fp_constant): Likewise.
      	(fusion_gpr_mem_load): Likewise.
      	(fusion_addis_mem_combo_load): Likewise.
      	(fusion_addis_mem_combo_store): Likewise.
      	* config/rs6000/rs6000-c.c (altivec_resolve_overloaded_builtin):
      	Likewise.
      	* config/rs6000/rs6000-string.c (do_load_for_compare): Likewise.
      	* config/rs6000/rs6000.c (rs6000_setup_reg_addr_masks): Likewise.
      	(rs6000_preferred_simd_mode): Likewise.
      	(output_vec_const_move): Likewise.
      	(rs6000_expand_vector_extract): Likewise.
      	(rs6000_split_vec_extract_var): Likewise.
      	(reg_offset_addressing_ok_p): Likewise.
      	(rs6000_legitimate_offset_address_p): Likewise.
      	(rs6000_legitimize_address): Likewise.
      	(rs6000_emit_set_const): Likewise.
      	(rs6000_const_vec): Likewise.
      	(rs6000_emit_move): Likewise.
      	(rs6000_darwin64_record_arg_recurse): Likewise.
      	(swap_selector_for_mode): Likewise.
      	(paired_init_builtins): Likewise.
      	(altivec_init_builtins): Likewise.
      	(rs6000_expand_float128_convert): Likewise.
      	(emit_load_locked): Likewise.
      	(emit_store_conditional): Likewise.
      	(rs6000_output_function_epilogue): Likewise.
      	(rs6000_handle_altivec_attribute): Likewise.
      	(rs6000_function_value): Likewise.
      	(emit_fusion_gpr_load): Likewise.
      	(emit_fusion_p9_load): Likewise.
      	(emit_fusion_p9_store): Likewise.
      	* config/rx/rx.c (rx_gen_move_template): Likewise.
      	(flags_from_mode): Likewise.
      	* config/s390/predicates.md (s390_alc_comparison): Likewise.
      	(s390_slb_comparison): Likewise.
      	* config/s390/s390.c (s390_handle_vectorbool_attribute): Likewise.
      	(s390_vector_mode_supported_p): Likewise.
      	(s390_cc_modes_compatible): Likewise.
      	(s390_match_ccmode_set): Likewise.
      	(s390_canonicalize_comparison): Likewise.
      	(s390_emit_compare_and_swap): Likewise.
      	(s390_branch_condition_mask): Likewise.
      	(s390_rtx_costs): Likewise.
      	(s390_secondary_reload): Likewise.
      	(__SECONDARY_RELOAD_CASE): Likewise.
      	(s390_expand_cs): Likewise.
      	(s390_preferred_simd_mode): Likewise.
      	* config/s390/vx-builtins.md (vec_packsu_u<mode>): Likewise.
      	* config/sh/sh.c (sh_print_operand): Likewise.
      	(dump_table): Likewise.
      	(sh_secondary_reload): Likewise.
      	* config/sh/sh.h (ASM_OUTPUT_ADDR_DIFF_ELT): Likewise.
      	* config/sh/sh.md (casesi_worker_1): Likewise.
      	(casesi_worker_2): Likewise.
      	* config/sparc/predicates.md (icc_comparison_operator): Likewise.
      	(fcc_comparison_operator): Likewise.
      	* config/sparc/sparc.c (sparc_expand_move): Likewise.
      	(emit_soft_tfmode_cvt): Likewise.
      	(sparc_preferred_simd_mode): Likewise.
      	(output_cbranch): Likewise.
      	(sparc_print_operand): Likewise.
      	(sparc_expand_vec_perm_bmask): Likewise.
      	(vector_init_bshuffle): Likewise.
      	* config/spu/spu.c (spu_scalar_mode_supported_p): Likewise.
      	(spu_vector_mode_supported_p): Likewise.
      	(spu_expand_insv): Likewise.
      	(spu_emit_branch_or_set): Likewise.
      	(spu_handle_vector_attribute): Likewise.
      	(spu_builtin_splats): Likewise.
      	(spu_builtin_extract): Likewise.
      	(spu_builtin_promote): Likewise.
      	(spu_expand_sign_extend): Likewise.
      	* config/tilegx/tilegx.c (tilegx_scalar_mode_supported_p): Likewise.
      	(tilegx_simd_int): Likewise.
      	* config/tilepro/tilepro.c (tilepro_scalar_mode_supported_p): Likewise.
      	(tilepro_simd_int): Likewise.
      	* config/v850/v850.c (const_double_split): Likewise.
      	(v850_print_operand): Likewise.
      	(ep_memory_offset): Likewise.
      	* config/vax/vax.c (vax_rtx_costs): Likewise.
      	(vax_output_int_move): Likewise.
      	(vax_output_int_add): Likewise.
      	(vax_output_int_subtract): Likewise.
      	* config/visium/predicates.md (visium_branch_operator): Likewise.
      	* config/visium/visium.c (rtx_ok_for_offset_p): Likewise.
      	(visium_print_operand_address): Likewise.
      	* config/visium/visium.h (ASM_OUTPUT_ADDR_DIFF_ELT): Likewise.
      	* config/xtensa/xtensa.c (xtensa_mem_offset): Likewise.
      	(xtensa_expand_conditional_branch): Likewise.
      	(xtensa_copy_incoming_a7): Likewise.
      	(xtensa_output_literal): Likewise.
      	* dfp.c (decimal_real_maxval): Likewise.
      	* targhooks.c (default_libgcc_floating_mode_supported_p): Likewise.
      
      gcc/c-family/
      	* c-cppbuiltin.c (mode_has_fma): Prefix mode names with E_ in
      	case statements.
      
      gcc/objc/
      	* objc-encoding.c (encode_gnu_bitfield): Prefix mode names with E_ in
      	case statements.
      
      libobjc/
      	* encoding.c (_darwin_rs6000_special_round_type_align): Prefix mode
      	names with E_ in case statements.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251453
      Richard Sandiford committed
    • [1/77] Add an E_ prefix to mode names · 0d4a1197
      Later patches will add wrapper types for specific classes
      of mode.  E.g. SImode will be a scalar_int_mode, SFmode will be a
      scalar_float_mode, etc.  This patch prepares for that change by adding
      an E_ prefix to the mode enum values.  It also adds #defines that map
      the unprefixed names to the prefixed names; e.g:
      
        #define QImode E_QImode
      
      Later patches will change this to use things like scalar_int_mode
      where appropriate.
      
      The patch continues to use enum values to initialise static data.
      This isn't necessary for correctness, but it cuts down on the amount
      of load-time initialisation and shouldn't have any downsides.
      
      The patch also changes things like:
      
        cmp_mode == DImode ? DFmode : DImode
      
      to:
      
        cmp_mode == DImode ? E_DFmode : E_DImode
      
      This is because DImode and DFmode will eventually be different
      classes, so the original ?: wouldn't be well-formed.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      	    Alan Hayward  <alan.hayward@arm.com>
      	    David Sherwood  <david.sherwood@arm.com>
      
      gcc/
      	* genmodes.c (mode_size_inline): Add an E_ prefix to mode names.
      	(mode_nunits_inline): Likewise.
      	(mode_inner_inline): Likewise.
      	(mode_unit_size_inline): Likewise.
      	(mode_unit_precision_inline): Likewise.
      	(emit_insn_modes_h): Likewise.  Also emit a #define of the
      	unprefixed name.
      	(emit_mode_wider): Add an E_ prefix to mode names.
      	(emit_mode_complex): Likewise.
      	(emit_mode_inner): Likewise.
      	(emit_mode_adjustments): Likewise.
      	(emit_mode_int_n): Likewise.
      	* config/aarch64/aarch64-builtins.c (v8qi_UP, v4hi_UP, v4hf_UP)
      	(v2si_UP, v2sf_UP, v1df_UP, di_UP, df_UP, v16qi_UP, v8hi_UP, v8hf_UP)
      	(v4si_UP, v4sf_UP, v2di_UP, v2df_UP, ti_UP, oi_UP, ci_UP, xi_UP)
      	(si_UP, sf_UP, hi_UP, hf_UP, qi_UP): Likewise.
      	(CRC32_BUILTIN, ENTRY): Likewise.
      	* config/aarch64/aarch64.c (aarch64_push_regs): Likewise.
      	(aarch64_pop_regs): Likewise.
      	(aarch64_process_components): Likewise.
      	* config/alpha/alpha.c (alpha_emit_conditional_move): Likewise.
      	* config/arm/arm-builtins.c (v8qi_UP, v4hi_UP, v4hf_UP, v2si_UP)
      	(v2sf_UP, di_UP, v16qi_UP, v8hi_UP, v8hf_UP, v4si_UP, v4sf_UP)
      	(v2di_UP, ti_UP, ei_UP, oi_UP, hf_UP, si_UP, void_UP): Likewise.
      	* config/arm/arm.c (arm_init_libfuncs): Likewise.
      	* config/i386/i386-builtin-types.awk (ix86_builtin_type_vect_mode):
      	Likewise.
      	* config/i386/i386-builtin.def (pcmpestr): Likewise.
      	(pcmpistr): Likewise.
      	* config/microblaze/microblaze.c (double_memory_operand): Likewise.
      	* config/mmix/mmix.c (mmix_output_condition): Likewise.
      	* config/powerpcspe/powerpcspe.c (rs6000_init_hard_regno_mode_ok):
      	Likewise.
      	* config/rl78/rl78.c (mduc_regs): Likewise.
      	* config/rs6000/rs6000.c (rs6000_init_hard_regno_mode_ok): Likewise.
      	(htm_expand_builtin): Likewise.
      	* config/sh/sh.h (REGISTER_NATURAL_MODE): Likewise.
      	* config/sparc/sparc.c (emit_save_or_restore_regs): Likewise.
      	* config/xtensa/xtensa.c (print_operand): Likewise.
      	* expmed.h (NUM_MODE_PARTIAL_INT): Likewise.
      	(NUM_MODE_VECTOR_INT): Likewise.
      	* genoutput.c (null_operand): Likewise.
      	(output_operand_data): Likewise.
      	* genrecog.c (print_parameter_value): Likewise.
      	* lra.c (debug_operand_data): Likewise.
      
      Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
      Co-Authored-By: David Sherwood <david.sherwood@arm.com>
      
      From-SVN: r251452
      Richard Sandiford committed
    • Split out parts of scompare_loc_descriptor and emit_store_flag · 8afacf2c
      This patch splits some cases out of scompare_loc_descriptor and
      emit_store_flag, which helps with the upcoming machmode series.
      
      2017-08-30  Richard Sandiford  <richard.sandiford@linaro.org>
      
      gcc/
      	* dwarf2out.c (scompare_loc_descriptor_wide)
      	(scompare_loc_descriptor_narrow): New functions, split out from...
      	(scompare_loc_descriptor): ...here.
      	* expmed.c (emit_store_flag_int): New function, split out from...
      	(emit_store_flag): ...here.
      
      From-SVN: r251451
      Richard Sandiford committed
    • dwarf2out.c (dwarf2out_finish): Remove setting AT_pubnames. · 70704d42
      2017-08-30  Richard Biener  <rguenther@suse.de>
      
      	* dwarf2out.c (dwarf2out_finish): Remove setting AT_pubnames.
      	(dwarf2out_early_finish): Move setting of AT_pubnames from
      	early debug output to early finish.
      
      From-SVN: r251450
      Richard Biener committed