Could vector type of poly_int and compile-time constants be enabled at the same time ?

Richard Sandiford richard.sandiford@arm.com
Thu Apr 29 09:03:38 GMT 2021


JojoR via Gcc <gcc@gcc.gnu.org> writes:
> Hi,
>
> 	I have a little know about for 'Sizes and offsets as runtime invariants’,
>
> 	and need to add vector types like V2SImode as compile-time constants
> 	with enabled vector types of runtime invariants.
>
> 	Could I enable two vector types at same time ?
> 	I guess it’s not allow :(
>
> 	Could anyone give me some hints ?

Vector modes like V2SI always represent fixed-length vectors.
Variable-length vector modes have to be defined explicitly in the
.def file.

A target can have both variable-length and fixed-length vectors.

Probably the best place to look for examples is the aarch64 backend.
There we have:

- V2SI (64-bit Advanced SIMD)
- V4SI (128-bit Advanced SIMD)
- VNx2SI (variable-length SVE vector with 2 32-bit elements per
  128-bit granule)
- VNx4SI (variable-length SVE vector with 4 32-bit elements per
  128-bit granule)
etc.

In target-independent code, things like GET_MODE_NUNITS are always
poly_ints.  In other words, the number of elements might be constant
(is_constant()) or might vary at runtime (!is_constant()).

On targets like x86 that don't define variable-length vectors,
things like GET_MODE_NUNITS are always compile-time constants
*within config/i386*.  This removes the need to use is_constant()
everywhere.

On targets like aarch64 that do define variable-length vectors,
things like GET_MODE_NUNITS are poly_ints even in config/aarch64.
However, GET_MODE_NUNITS is still constant for V2SI and V4SI.
We just have to use to_constant() to get the constant 2 or 4.

Thanks,
Richard


More information about the Gcc mailing list