]> git.ipfire.org Git - thirdparty/gcc.git/commit
aarch64: Improve vector constant generation using SVE INDEX instruction [PR113328]
authorPengxuan Zheng <quic_pzheng@quicinc.com>
Wed, 11 Sep 2024 00:59:46 +0000 (17:59 -0700)
committerPengxuan Zheng <quic_pzheng@quicinc.com>
Mon, 16 Sep 2024 17:31:10 +0000 (10:31 -0700)
commita92f54f580c37732a5de01e47aed56882231f196
tree1fa37e27bfce7b107f111b6efa121c4e851e4535
parent58bc39c73ca9aeca3d62d2d963be0121d0efeeac
aarch64: Improve vector constant generation using SVE INDEX instruction [PR113328]

SVE's INDEX instruction can be used to populate vectors by values starting from
"base" and incremented by "step" for each subsequent value. We can take
advantage of it to generate vector constants if TARGET_SVE is available and the
base and step values are within [-16, 15].

For example, with the following function:

typedef int v4si __attribute__ ((vector_size (16)));
v4si
f_v4si (void)
{
  return (v4si){ 0, 1, 2, 3 };
}

GCC currently generates:

f_v4si:
adrp    x0, .LC4
ldr     q0, [x0, #:lo12:.LC4]
ret

.LC4:
.word   0
.word   1
.word   2
.word   3

With this patch, we generate an INDEX instruction instead if TARGET_SVE is
available.

f_v4si:
index   z0.s, #0, #1
ret

PR target/113328

gcc/ChangeLog:

* config/aarch64/aarch64.cc (aarch64_simd_valid_immediate): Improve
handling of some ADVSIMD vectors by using SVE's INDEX if TARGET_SVE is
available.
(aarch64_output_simd_mov_immediate): Likewise.

gcc/testsuite/ChangeLog:

* gcc.target/aarch64/sve/acle/general/dupq_1.c: Update test to use
SVE's INDEX instruction.
* gcc.target/aarch64/sve/acle/general/dupq_2.c: Likewise.
* gcc.target/aarch64/sve/acle/general/dupq_3.c: Likewise.
* gcc.target/aarch64/sve/acle/general/dupq_4.c: Likewise.
* gcc.target/aarch64/sve/vec_init_3.c: New test.

Signed-off-by: Pengxuan Zheng <quic_pzheng@quicinc.com>
gcc/config/aarch64/aarch64.cc
gcc/testsuite/gcc.target/aarch64/sve/acle/general/dupq_1.c
gcc/testsuite/gcc.target/aarch64/sve/acle/general/dupq_2.c
gcc/testsuite/gcc.target/aarch64/sve/acle/general/dupq_3.c
gcc/testsuite/gcc.target/aarch64/sve/acle/general/dupq_4.c
gcc/testsuite/gcc.target/aarch64/sve/vec_init_3.c [new file with mode: 0644]