Tejas Belagod <[email protected]> writes:
> The target hook aarch64_class_max_nregs returns the incorrect result for
> 64-bit
> structure modes like V31DImode or V41DFmode etc. The calculation of the nregs
> is based on the size of AdvSIMD vector register for 64-bit modes which ought
> to
> be UNITS_PER_VREG / 2. This patch fixes the register size.
>
> Existing tests like gcc.target/aarch64/advsimd-intrinsics/vld1x3.c cover this
> change.
>
> Regression tested on aarch64-linux. Bootstrapped on aarch64-linux.
>
> OK for trunk?
>
> gcc/ChangeLog:
>
> PR target/112577
> * config/aarch64/aarch64.cc (aarch64_class_max_nregs): Handle 64-bit
> vector structure modes correctly.
> ---
> gcc/config/aarch64/aarch64.cc | 10 ++++++----
> 1 file changed, 6 insertions(+), 4 deletions(-)
>
> diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
> index a5a6b52730d..b9f00bdce3b 100644
> --- a/gcc/config/aarch64/aarch64.cc
> +++ b/gcc/config/aarch64/aarch64.cc
> @@ -12914,10 +12914,12 @@ aarch64_class_max_nregs (reg_class_t regclass,
> machine_mode mode)
> && constant_multiple_p (GET_MODE_SIZE (mode),
> aarch64_vl_bytes (mode, vec_flags), &nregs))
> return nregs;
> - return (vec_flags & VEC_ADVSIMD
> - ? CEIL (lowest_size, UNITS_PER_VREG)
> - : CEIL (lowest_size, UNITS_PER_WORD));
> -
> + if (vec_flags == (VEC_ADVSIMD | VEC_STRUCT | VEC_PARTIAL))
> + return GET_MODE_SIZE (mode).to_constant () / 8;
> + else
> + return (vec_flags & VEC_ADVSIMD
> + ? CEIL (lowest_size, UNITS_PER_VREG)
> + : CEIL (lowest_size, UNITS_PER_WORD));
Very minor, sorry, but I think it would be more usual style to add the
new condition as an early-out and so not add an "else", especially since
there's alreaedy an early-out for SVE above:
if (vec_flags == (VEC_ADVSIMD | VEC_STRUCT | VEC_PARTIAL))
return GET_MODE_SIZE (mode).to_constant () / 8;
return (vec_flags & VEC_ADVSIMD
? CEIL (lowest_size, UNITS_PER_VREG)
: CEIL (lowest_size, UNITS_PER_WORD));
I think it's also worth keeping the blank line between this and the
following block of cases.
OK with that change, thanks.
Richard
> case PR_REGS:
> case PR_LO_REGS:
> case PR_HI_REGS: