diff options
author | Tejas Belagod <tejas.belagod@arm.com> | 2024-01-11 12:37:06 +0530 |
---|---|---|
committer | Tejas Belagod <tejas.belagod@arm.com> | 2024-02-06 16:04:55 +0530 |
commit | ca04e7a2e1b08ed02e22e2656ba6032099195856 (patch) | |
tree | 67be843d856e5c263dc339c94ab5f6076499429f | |
parent | c5f48b5fdde849759d0e3b4effd9352a2399d6f9 (diff) | |
download | gcc-ca04e7a2e1b08ed02e22e2656ba6032099195856.zip gcc-ca04e7a2e1b08ed02e22e2656ba6032099195856.tar.gz gcc-ca04e7a2e1b08ed02e22e2656ba6032099195856.tar.bz2 |
AArch64: aarch64_class_max_nregs mishandles 64-bit structure modes [PR112577]
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.
gcc/ChangeLog:
PR target/112577
* config/aarch64/aarch64.cc (aarch64_class_max_nregs): Handle 64-bit
vector structure modes correctly.
-rw-r--r-- | gcc/config/aarch64/aarch64.cc | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc index 4556b8d..872393a 100644 --- a/gcc/config/aarch64/aarch64.cc +++ b/gcc/config/aarch64/aarch64.cc @@ -12961,6 +12961,8 @@ 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; + 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)); |