diff options
author | Richard Sandiford <richard.sandiford@linaro.org> | 2018-01-03 21:41:49 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2018-01-03 21:41:49 +0000 |
commit | 7b777afa955ad765500dfd53d6da990c84067197 (patch) | |
tree | 59c49cc214d86eec3fc81dedbb8c6b6b71dbfcb7 /gcc/genmodes.c | |
parent | e5f83886b05c22f4bc221dac05e64b54ef7eece4 (diff) | |
download | gcc-7b777afa955ad765500dfd53d6da990c84067197.zip gcc-7b777afa955ad765500dfd53d6da990c84067197.tar.gz gcc-7b777afa955ad765500dfd53d6da990c84067197.tar.bz2 |
poly_int: GET_MODE_NUNITS
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.
We can handle permuted loads and stores for variable nunits if
the number of statements is a power of 2, but not otherwise.
The to_constant call in make_vector_type goes away in a later patch.
2018-01-03 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@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.
* dwarf2out.c (loc_descriptor, add_const_value_attribute): Likewise.
* emit-rtl.c (const_vec_series_p_1): Likewise.
(gen_rtx_CONST_VECTOR): Likewise.
* fold-const.c (test_vec_duplicate_folding): Likewise.
* genrecog.c (validate_pattern): Likewise.
* optabs-query.c (can_vec_perm_var_p, can_mult_highpart_p): Likewise.
* optabs-tree.c (expand_vec_cond_expr_p): Likewise.
* optabs.c (expand_vector_broadcast, expand_binop_directly): Likewise.
(shift_amt_for_vec_perm_mask, expand_vec_perm_var): Likewise.
(expand_vec_cond_expr, expand_mult_highpart): Likewise.
* rtlanal.c (subreg_get_info): 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.
* 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.
(simplify_immed_subreg): Use GET_MODE_NUNITS on a fixed_size_mode
instead of CONST_VECTOR_NUNITS.
* varasm.c (output_constant_pool_2): Likewise.
* rtx-vector-builder.c (rtx_vector_builder::build): Only include the
explicit-encoded elements in the XVEC for variable-length vectors.
gcc/ada/
* gcc-interface/misc.c (enumerate_modes): Handle polynomial
GET_MODE_NUNITS.
Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>
From-SVN: r256195
Diffstat (limited to 'gcc/genmodes.c')
-rw-r--r-- | gcc/genmodes.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/gcc/genmodes.c b/gcc/genmodes.c index ce0046c..efcceb3 100644 --- a/gcc/genmodes.c +++ b/gcc/genmodes.c @@ -901,6 +901,16 @@ calc_wider_mode (void) } } +/* Text to add to the constant part of a poly_int_pod initializer in + order to fill out te whole structure. */ +#if NUM_POLY_INT_COEFFS == 1 +#define ZERO_COEFFS "" +#elif NUM_POLY_INT_COEFFS == 2 +#define ZERO_COEFFS ", 0" +#else +#error "Unknown value of NUM_POLY_INT_COEFFS" +#endif + /* Output routines. */ #define tagged_printf(FMT, ARG, TAG) do { \ @@ -1008,11 +1018,10 @@ inline __attribute__((__always_inline__))\n\ #else\n\ extern __inline__ __attribute__((__always_inline__, __gnu_inline__))\n\ #endif\n\ -unsigned char\n\ +poly_uint16\n\ mode_nunits_inline (machine_mode mode)\n\ {\n\ - extern const unsigned char mode_nunits[NUM_MACHINE_MODES];\n\ - gcc_assert (mode >= 0 && mode < NUM_MACHINE_MODES);\n\ + extern poly_uint16_pod mode_nunits[NUM_MACHINE_MODES];\n\ switch (mode)\n\ {"); @@ -1381,10 +1390,10 @@ emit_mode_nunits (void) int c; struct mode_data *m; - print_decl ("unsigned char", "mode_nunits", "NUM_MACHINE_MODES"); + print_decl ("poly_uint16_pod", "mode_nunits", "NUM_MACHINE_MODES"); for_all_modes (c, m) - tagged_printf ("%u", m->ncomponents, m->name); + tagged_printf ("{ %u" ZERO_COEFFS " }", m->ncomponents, m->name); print_closer (); } |