Richard Biener <[email protected]> writes:
> On Mon, Sep 4, 2017 at 1:36 PM, Richard Sandiford
> <[email protected]> wrote:
>> There are at least a few places that want to create an integer vector
>> with a specified element size and element count, or to create the
>> integer equivalent of an existing mode. This patch adds helpers
>> for doing that.
>>
>> The require ()s are all used in functions that go on to emit
>> instructions that use the result as a vector mode.
>>
>> 2017-09-04 Richard Sandiford <[email protected]>
>>
>> gcc/
>> * machmode.h (mode_for_int_vector): New function.
>> * stor-layout.c (mode_for_int_vector): Likewise.
>> * config/aarch64/aarch64.c (aarch64_emit_approx_sqrt): Use it.
>> * config/powerpcspe/powerpcspe.c (rs6000_do_expand_vec_perm):
>> Likewise.
>> * config/rs6000/rs6000.c (rs6000_do_expand_vec_perm): Likewise.
>> * config/s390/s390.c (s390_expand_vec_compare_cc): Likewise.
>> (s390_expand_vcond): Likewise.
>>
>> Index: gcc/machmode.h
>> ===================================================================
>> --- gcc/machmode.h 2017-09-04 12:18:50.674859598 +0100
>> +++ gcc/machmode.h 2017-09-04 12:18:53.153306182 +0100
>> @@ -706,6 +706,21 @@ extern machine_mode bitwise_mode_for_mod
>>
>> extern machine_mode mode_for_vector (scalar_mode, unsigned);
>>
>> +extern opt_machine_mode mode_for_int_vector (unsigned int, unsigned int);
>> +
>> +/* Return the integer vector equivalent of MODE, if one exists. In other
>> + words, return the mode for an integer vector that has the same number
>> + of bits as MODE and the same number of elements as MODE, with the
>> + latter being 1 if MODE is scalar. The returned mode can be either
>> + an integer mode or a vector mode. */
>> +
>> +inline opt_machine_mode
>> +mode_for_int_vector (machine_mode mode)
>
> So this is similar to int_mode_for_mode which means...
>
> int_vector_mode_for_vector_mode?
I'd used that style of name originally, but didn't like it because
it gave the impression that the result would be a VECTOR_MODE_P.
mode_for_int_vector was supposed to be consistent with mode_for_vector.
>> +{
>
> Nothing prevents use with non-vector MODE here, can we place an assert here?
That was deliberate. I wanted it to work with scalars too, returning
a V1xx in that case.
>> + return mode_for_int_vector (GET_MODE_UNIT_BITSIZE (mode),
>> + GET_MODE_NUNITS (mode));
>> +}
>> +
>> /* A class for iterating through possible bitfield modes. */
>> class bit_field_mode_iterator
>> {
>> Index: gcc/stor-layout.c
>> ===================================================================
>> --- gcc/stor-layout.c 2017-09-04 12:18:50.675762071 +0100
>> +++ gcc/stor-layout.c 2017-09-04 12:18:53.153306182 +0100
>> @@ -517,6 +517,23 @@ mode_for_vector (scalar_mode innermode,
>> return mode;
>> }
>>
>> +/* Return the mode for a vector that has NUNITS integer elements of
>> + INT_BITS bits each, if such a mode exists. The mode can be either
>> + an integer mode or a vector mode. */
>> +
>> +opt_machine_mode
>> +mode_for_int_vector (unsigned int int_bits, unsigned int nunits)
>
> That's more vector_int_mode_for_size (...), no? Similar to int_mode_for_size
> or mode_for_size.
>
> Ok with those renamings. I wonder if int_vector_mode_for_vector_mode
> is necessary -- is calling vector_int_mode_for_size
> (GET_MODE_UNIT_BITSIZE (mode),
> GET_MODE_NUNITS (mode)) too cumbersome?
IMO yes :-) It's certainly longer than the equivalent int_mode_for_mode
expansion.
Thanks,
Richard