]> git.ipfire.org Git - thirdparty/gcc.git/commit - gcc/config/aarch64/aarch64-c.cc
aarch64: Add LS64 extension and intrinsics
authorPrzemyslaw Wirkus <przemyslaw.wirkus@arm.com>
Tue, 14 Dec 2021 14:03:38 +0000 (14:03 +0000)
committerPrzemyslaw Wirkus <przemyslaw.wirkus@arm.com>
Tue, 14 Dec 2021 14:52:27 +0000 (14:52 +0000)
commitfdcddba8f29ea3878851b8b4cd37d0fd3476d3bf
tree0af40dd3c44226d1a4e63b8dd60bff82cebfa3cc
parent0dfb1bd94454ccae6d3c77799e209fab7711ed93
aarch64: Add LS64 extension and intrinsics

This patch is adding support for LS64 (Armv8.7-A Load/Store 64 Byte extension)
which is part of Armv8.7-A architecture. Changes include missing plumbing for
TARGET_LS64, LS64 data structure and intrinsics defined in ACLE. Machine
description of intrinsics is using new V8DI mode added in a separate patch.
__ARM_FEATURE_LS64 is defined if the Armv8.7-A LS64 instructions for atomic
64-byte access to device memory are supported.

New compiler internal type is added wrapping ACLE struct data512_t:

typedef struct {
  uint64_t val[8];
} __arm_data512_t;

gcc/ChangeLog:

* config/aarch64/aarch64-builtins.c (enum aarch64_builtins):
Define AARCH64_LS64_BUILTIN_LD64B, AARCH64_LS64_BUILTIN_ST64B,
AARCH64_LS64_BUILTIN_ST64BV, AARCH64_LS64_BUILTIN_ST64BV0.
(aarch64_init_ls64_builtin_decl): Helper function.
(aarch64_init_ls64_builtins): Helper function.
(aarch64_init_ls64_builtins_types): Helper function.
(aarch64_general_init_builtins): Init LS64 intrisics for
TARGET_LS64.
(aarch64_expand_builtin_ls64): LS64 intrinsics expander.
(aarch64_general_expand_builtin): Handle aarch64_expand_builtin_ls64.
(ls64_builtins_data): New helper struct.
(v8di_UP): New define.
* config/aarch64/aarch64-c.c (aarch64_update_cpp_builtins): Define
__ARM_FEATURE_LS64.
* config/aarch64/aarch64.c (aarch64_classify_address): Enforce the
V8DI range (7-bit signed scaled) for both ends of the range.
* config/aarch64/aarch64-simd.md (movv8di): New pattern.
(aarch64_movv8di): New pattern.
* config/aarch64/aarch64.h (AARCH64_ISA_LS64): New define.
(TARGET_LS64): New define.
* config/aarch64/aarch64.md: Add UNSPEC_LD64B, UNSPEC_ST64B,
UNSPEC_ST64BV and UNSPEC_ST64BV0.
(ld64b): New define_insn.
(st64b): New define_insn.
(st64bv): New define_insn.
(st64bv0): New define_insn.
* config/aarch64/arm_acle.h (data512_t): New type derived from
__arm_data512_t.
(__arm_data512_t): New internal type.
(__arm_ld64b): New intrinsic.
(__arm_st64b): New intrinsic.
(__arm_st64bv): New intrinsic.
(__arm_st64bv0): New intrinsic.
* config/arm/types.md: Add new type ls64.

gcc/testsuite/ChangeLog:

* gcc.target/aarch64/acle/ls64_asm.c: New test.
* gcc.target/aarch64/acle/ls64_ld64b.c: New test.
* gcc.target/aarch64/acle/ls64_ld64b-2.c: New test.
* gcc.target/aarch64/acle/ls64_ld64b-3.c: New test.
* gcc.target/aarch64/acle/ls64_st64b.c: New test.
* gcc.target/aarch64/acle/ls64_ld_st_o0.c: New test.
* gcc.target/aarch64/acle/ls64_st64b-2.c: New test.
* gcc.target/aarch64/acle/ls64_st64bv.c: New test.
* gcc.target/aarch64/acle/ls64_st64bv-2.c: New test.
* gcc.target/aarch64/acle/ls64_st64bv-3.c: New test.
* gcc.target/aarch64/acle/ls64_st64bv0.c: New test.
* gcc.target/aarch64/acle/ls64_st64bv0-2.c: New test.
* gcc.target/aarch64/acle/ls64_st64bv0-3.c: New test.
* gcc.target/aarch64/pragma_cpp_predefs_2.c: Add checks
for __ARM_FEATURE_LS64.
22 files changed:
gcc/config/aarch64/aarch64-builtins.c
gcc/config/aarch64/aarch64-c.c
gcc/config/aarch64/aarch64-simd.md
gcc/config/aarch64/aarch64.c
gcc/config/aarch64/aarch64.h
gcc/config/aarch64/aarch64.md
gcc/config/aarch64/arm_acle.h
gcc/config/arm/types.md
gcc/testsuite/gcc.target/aarch64/acle/ls64_asm.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/acle/ls64_ld64b-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/acle/ls64_ld64b-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/acle/ls64_ld64b.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/acle/ls64_ld_st_o0.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/acle/ls64_st64b-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/acle/ls64_st64b.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/acle/ls64_st64bv-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/acle/ls64_st64bv-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/acle/ls64_st64bv.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/acle/ls64_st64bv0-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/acle/ls64_st64bv0-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/acle/ls64_st64bv0.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/pragma_cpp_predefs_2.c