Skip to content

Commit 9f6250f

Browse files
committed
[Clang][AArch64][SME] Add vector load/store (ld1/st1) intrinsics
This patch adds support for the following SME ACLE intrinsics (as defined in https://arm-software.github.io/acle/main/acle.html): - svld1_hor_za8 // also for _za16, _za32, _za64 and _za128 - svld1_hor_vnum_za8 // also for _za16, _za32, _za64 and _za128 - svld1_ver_za8 // also for _za16, _za32, _za64 and _za128 - svld1_ver_vnum_za8 // also for _za16, _za32, _za64 and _za128 - svst1_hor_za8 // also for _za16, _za32, _za64 and _za128 - svst1_hor_vnum_za8 // also for _za16, _za32, _za64 and _za128 - svst1_ver_za8 // also for _za16, _za32, _za64 and _za128 - svst1_ver_vnum_za8 // also for _za16, _za32, _za64 and _za128 SveEmitter.cpp is extended to generate arm_sme.h (currently named arm_sme_draft_spec_subject_to_change.h) and other SME definitions from arm_sme.td, which is modeled after arm_sve.td. Common TableGen definitions are moved into arm_sve_sme_incl.td. Co-authored-by: Sagar Kulkarni <[email protected]> Reviewed By: sdesmalen, kmclaughlin Differential Revision: https://reviews.llvm.org/D127910
1 parent 2aef605 commit 9f6250f

24 files changed

+1584
-253
lines changed

clang/include/clang/Basic/BuiltinsAArch64.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,4 +269,5 @@ TARGET_HEADER_BUILTIN(__readx18qword, "ULLiULi", "nh", INTRIN_H, ALL_MS_LANGUAGE
269269

270270
#undef BUILTIN
271271
#undef LANGBUILTIN
272+
#undef TARGET_BUILTIN
272273
#undef TARGET_HEADER_BUILTIN

clang/include/clang/Basic/BuiltinsARM.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,4 +343,5 @@ TARGET_HEADER_BUILTIN(_InterlockedDecrement64_rel, "LLiLLiD*", "nh", INTRIN_H, A
343343

344344
#undef BUILTIN
345345
#undef LANGBUILTIN
346+
#undef TARGET_BUILTIN
346347
#undef TARGET_HEADER_BUILTIN

clang/include/clang/Basic/BuiltinsNEON.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@
1919
#undef GET_NEON_BUILTINS
2020

2121
#undef BUILTIN
22+
#undef TARGET_BUILTIN
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
//===--- BuiltinsSME.def - SME Builtin function database --------*- C++ -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
//
9+
// This file defines the SME-specific builtin function database. Users of
10+
// this file must define the BUILTIN macro to make use of this information.
11+
//
12+
//===----------------------------------------------------------------------===//
13+
14+
// The format of this database matches clang/Basic/Builtins.def.
15+
16+
#define GET_SME_BUILTINS
17+
#include "clang/Basic/arm_sme_builtins.inc"
18+
#undef GET_SME_BUILTINS
19+
20+
#undef BUILTIN
21+
#undef TARGET_BUILTIN

clang/include/clang/Basic/CMakeLists.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,15 @@ clang_tablegen(arm_sve_typeflags.inc -gen-arm-sve-typeflags
7272
clang_tablegen(arm_sve_sema_rangechecks.inc -gen-arm-sve-sema-rangechecks
7373
SOURCE arm_sve.td
7474
TARGET ClangARMSveSemaRangeChecks)
75+
clang_tablegen(arm_sme_builtins.inc -gen-arm-sme-builtins
76+
SOURCE arm_sme.td
77+
TARGET ClangARMSmeBuiltins)
78+
clang_tablegen(arm_sme_builtin_cg.inc -gen-arm-sme-builtin-codegen
79+
SOURCE arm_sme.td
80+
TARGET ClangARMSmeBuiltinCG)
81+
clang_tablegen(arm_sme_sema_rangechecks.inc -gen-arm-sme-sema-rangechecks
82+
SOURCE arm_sme.td
83+
TARGET ClangARMSmeSemaRangeChecks)
7584
clang_tablegen(arm_cde_builtins.inc -gen-arm-cde-builtin-def
7685
SOURCE arm_cde.td
7786
TARGET ClangARMCdeBuiltinsDef)

clang/include/clang/Basic/TargetBuiltins.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,18 +48,31 @@ namespace clang {
4848
enum {
4949
LastNEONBuiltin = NEON::FirstTSBuiltin - 1,
5050
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
51+
#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BI##ID,
5152
#include "clang/Basic/BuiltinsSVE.def"
5253
FirstTSBuiltin,
5354
};
5455
}
5556

57+
namespace SME {
58+
enum {
59+
LastSVEBuiltin = SVE::FirstTSBuiltin - 1,
60+
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
61+
#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BI##ID,
62+
#include "clang/Basic/BuiltinsSME.def"
63+
FirstTSBuiltin,
64+
};
65+
}
66+
5667
/// AArch64 builtins
5768
namespace AArch64 {
5869
enum {
5970
LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
6071
LastNEONBuiltin = NEON::FirstTSBuiltin - 1,
6172
FirstSVEBuiltin = NEON::FirstTSBuiltin,
6273
LastSVEBuiltin = SVE::FirstTSBuiltin - 1,
74+
FirstSMEBuiltin = SVE::FirstTSBuiltin,
75+
LastSMEBuiltin = SME::FirstTSBuiltin - 1,
6376
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
6477
#include "clang/Basic/BuiltinsAArch64.def"
6578
LastTSBuiltin

clang/include/clang/Basic/arm_sme.td

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
//===--- arm_sme.td - ARM SME compiler interface ------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
//
9+
// This file defines the TableGen definitions from which the ARM SME header
10+
// file will be generated. See:
11+
//
12+
// https://developer.arm.com/architectures/system-architectures/software-standards/acle
13+
//
14+
//===----------------------------------------------------------------------===//
15+
16+
include "arm_sve_sme_incl.td"
17+
18+
////////////////////////////////////////////////////////////////////////////////
19+
// Loads
20+
21+
multiclass ZALoad<string n_suffix, string t, string i_prefix, list<ImmCheck> ch> {
22+
let TargetGuard = "sme" in {
23+
def NAME # _H : MInst<"svld1_hor_" # n_suffix, "vimiPQ", t,
24+
[IsLoad, IsOverloadNone, IsStreaming, IsSharedZA],
25+
MemEltTyDefault, i_prefix # "_horiz", ch>;
26+
27+
def NAME # _H_VNUM : MInst<"svld1_hor_vnum_" # n_suffix, "vimiPQl", t,
28+
[IsLoad, IsOverloadNone, IsStreaming, IsSharedZA],
29+
MemEltTyDefault, i_prefix # "_horiz", ch>;
30+
31+
def NAME # _V : MInst<"svld1_ver_" # n_suffix, "vimiPQ", t,
32+
[IsLoad, IsOverloadNone, IsStreaming, IsSharedZA],
33+
MemEltTyDefault, i_prefix # "_vert", ch>;
34+
35+
def NAME # _V_VNUM : MInst<"svld1_ver_vnum_" # n_suffix, "vimiPQl", t,
36+
[IsLoad, IsOverloadNone, IsStreaming, IsSharedZA],
37+
MemEltTyDefault, i_prefix # "_vert", ch>;
38+
}
39+
}
40+
41+
defm SVLD1_ZA8 : ZALoad<"za8", "c", "aarch64_sme_ld1b", [ImmCheck<0, ImmCheck0_0>, ImmCheck<2, ImmCheck0_15>]>;
42+
defm SVLD1_ZA16 : ZALoad<"za16", "s", "aarch64_sme_ld1h", [ImmCheck<0, ImmCheck0_1>, ImmCheck<2, ImmCheck0_7>]>;
43+
defm SVLD1_ZA32 : ZALoad<"za32", "i", "aarch64_sme_ld1w", [ImmCheck<0, ImmCheck0_3>, ImmCheck<2, ImmCheck0_3>]>;
44+
defm SVLD1_ZA64 : ZALoad<"za64", "l", "aarch64_sme_ld1d", [ImmCheck<0, ImmCheck0_7>, ImmCheck<2, ImmCheck0_1>]>;
45+
defm SVLD1_ZA128 : ZALoad<"za128", "q", "aarch64_sme_ld1q", [ImmCheck<0, ImmCheck0_15>, ImmCheck<2, ImmCheck0_0>]>;
46+
47+
////////////////////////////////////////////////////////////////////////////////
48+
// Stores
49+
50+
multiclass ZAStore<string n_suffix, string t, string i_prefix, list<ImmCheck> ch> {
51+
let TargetGuard = "sme" in {
52+
def NAME # _H : MInst<"svst1_hor_" # n_suffix, "vimiP%", t,
53+
[IsStore, IsOverloadNone, IsStreaming, IsSharedZA, IsPreservesZA],
54+
MemEltTyDefault, i_prefix # "_horiz", ch>;
55+
56+
def NAME # _H_VNUM : MInst<"svst1_hor_vnum_" # n_suffix, "vimiP%l", t,
57+
[IsStore, IsOverloadNone, IsStreaming, IsSharedZA, IsPreservesZA],
58+
MemEltTyDefault, i_prefix # "_horiz", ch>;
59+
60+
def NAME # _V : MInst<"svst1_ver_" # n_suffix, "vimiP%", t,
61+
[IsStore, IsOverloadNone, IsStreaming, IsSharedZA, IsPreservesZA],
62+
MemEltTyDefault, i_prefix # "_vert", ch>;
63+
64+
def NAME # _V_VNUM : MInst<"svst1_ver_vnum_" # n_suffix, "vimiP%l", t,
65+
[IsStore, IsOverloadNone, IsStreaming, IsSharedZA, IsPreservesZA],
66+
MemEltTyDefault, i_prefix # "_vert", ch>;
67+
}
68+
}
69+
70+
defm SVST1_ZA8 : ZAStore<"za8", "c", "aarch64_sme_st1b", [ImmCheck<0, ImmCheck0_0>, ImmCheck<2, ImmCheck0_15>]>;
71+
defm SVST1_ZA16 : ZAStore<"za16", "s", "aarch64_sme_st1h", [ImmCheck<0, ImmCheck0_1>, ImmCheck<2, ImmCheck0_7>]>;
72+
defm SVST1_ZA32 : ZAStore<"za32", "i", "aarch64_sme_st1w", [ImmCheck<0, ImmCheck0_3>, ImmCheck<2, ImmCheck0_3>]>;
73+
defm SVST1_ZA64 : ZAStore<"za64", "l", "aarch64_sme_st1d", [ImmCheck<0, ImmCheck0_7>, ImmCheck<2, ImmCheck0_1>]>;
74+
defm SVST1_ZA128 : ZAStore<"za128", "q", "aarch64_sme_st1q", [ImmCheck<0, ImmCheck0_15>, ImmCheck<2, ImmCheck0_0>]>;

0 commit comments

Comments
 (0)