aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTejas Belagod <tejas.belagod@arm.com>2024-01-11 12:37:06 +0530
committerTejas Belagod <tejas.belagod@arm.com>2024-02-06 16:04:55 +0530
commitca04e7a2e1b08ed02e22e2656ba6032099195856 (patch)
tree67be843d856e5c263dc339c94ab5f6076499429f /gcc
parentc5f48b5fdde849759d0e3b4effd9352a2399d6f9 (diff)
downloadgcc-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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/aarch64/aarch64.cc2
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));