On 10/23/2017 11:41 AM, Richard Sandiford wrote: > This patch changes GET_MODE_NUNITS from unsigned char > to poly_uint16, although it remains a macro when compiling > target code with NUM_POLY_INT_COEFFS == 1. > > If the number of units isn't known at compile time, we use: > > (const:M (vec_duplicate:M X)) > > to represent a vector in which every element is equal to X. The code > ensures that there is only a single instance of each constant, so that > pointer equality is enough. (This is a requirement for the constants > that go in const_tiny_rtx, but we might as well do it for all constants.) > > Similarly we use: > > (const:M (vec_series:M A B)) > > for a linear series starting at A and having step B. > > The to_constant call in make_vector_type goes away in a later patch. > > > 2017-10-23 Richard Sandiford <richard.sandif...@linaro.org> > Alan Hayward <alan.hayw...@arm.com> > David Sherwood <david.sherw...@arm.com> > > gcc/ > * machmode.h (mode_nunits): Change from unsigned char to > poly_uint16_pod. > (ONLY_FIXED_SIZE_MODES): New macro. > (pod_mode::measurement_type, scalar_int_mode::measurement_type) > (scalar_float_mode::measurement_type, scalar_mode::measurement_type) > (complex_mode::measurement_type, fixed_size_mode::measurement_type): > New typedefs. > (mode_to_nunits): Return a poly_uint16 rather than an unsigned short. > (GET_MODE_NUNITS): Return a constant if ONLY_FIXED_SIZE_MODES, > or if measurement_type is not polynomial. > * genmodes.c (ZERO_COEFFS): New macro. > (emit_mode_nunits_inline): Make mode_nunits_inline return a > poly_uint16. > (emit_mode_nunits): Change the type of mode_nunits to poly_uint16_pod. > Use ZERO_COEFFS when emitting initializers. > * data-streamer.h (bp_pack_poly_value): New function. > (bp_unpack_poly_value): Likewise. > * lto-streamer-in.c (lto_input_mode_table): Use bp_unpack_poly_value > for GET_MODE_NUNITS. > * lto-streamer-out.c (lto_write_mode_table): Use bp_pack_poly_value > for GET_MODE_NUNITS. > * tree.c (make_vector_type): Remove temporary shim and make > the real function take the number of units as a poly_uint64 > rather than an int. > (build_vector_type_for_mode): Handle polynomial nunits. > * emit-rtl.c (gen_const_vec_duplicate_1): Likewise. > (gen_const_vec_series, gen_rtx_CONST_VECTOR): Likewise. > * genrecog.c (validate_pattern): Likewise. > * optabs-query.c (can_mult_highpart_p): Likewise. > * optabs-tree.c (expand_vec_cond_expr_p): Likewise. > * optabs.c (expand_vector_broadcast, expand_binop_directly) > (shift_amt_for_vec_perm_mask, expand_vec_perm, expand_vec_cond_expr) > (expand_mult_highpart): Likewise. > * rtlanal.c (subreg_get_info): Likewise. > * simplify-rtx.c (simplify_unary_operation_1): Likewise. > (simplify_const_unary_operation, simplify_binary_operation_1) > (simplify_const_binary_operation, simplify_ternary_operation) > (test_vector_ops_duplicate, test_vector_ops): Likewise. > * tree-vect-data-refs.c (vect_grouped_store_supported): Likewise. > (vect_grouped_load_supported): Likewise. > * tree-vect-generic.c (type_for_widest_vector_mode): Likewise. > * tree-vect-loop.c (have_whole_vector_shift): Likewise. > > gcc/ada/ > * gcc-interface/misc.c (enumerate_modes): Handle polynomial > GET_MODE_NUNITS. OK. jeff