Skip to content

Commit 03a686f

Browse files
committed
fixup: add za state tablegen generation
1 parent 72dc89f commit 03a686f

File tree

4 files changed

+49
-4
lines changed

4 files changed

+49
-4
lines changed

clang/test/Sema/aarch64-sme-intrinsics/acle_sme_target.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,21 @@
66
#include <arm_sme_draft_spec_subject_to_change.h>
77

88
__attribute__((target("sme")))
9-
void test_sme(svbool_t pg, void *ptr) __arm_streaming {
9+
void test_sme(svbool_t pg, void *ptr) __arm_streaming __arm_shared_za {
1010
svld1_hor_za8(0, 0, pg, ptr);
1111
}
1212

1313
__attribute__((target("arch=armv8-a+sme")))
14-
void test_arch_sme(svbool_t pg, void *ptr) __arm_streaming {
14+
void test_arch_sme(svbool_t pg, void *ptr) __arm_streaming __arm_shared_za {
1515
svld1_hor_vnum_za32(0, 0, pg, ptr, 0);
1616
}
1717

1818
__attribute__((target("+sme")))
19-
void test_plus_sme(svbool_t pg, void *ptr) __arm_streaming {
19+
void test_plus_sme(svbool_t pg, void *ptr) __arm_streaming __arm_shared_za {
2020
svst1_ver_za16(0, 0, pg, ptr);
2121
}
2222

2323
__attribute__((target("+sme")))
24-
void undefined(svbool_t pg, void *ptr) {
24+
void undefined(svbool_t pg, void *ptr) __arm_shared_za {
2525
svst1_ver_vnum_za64(0, 0, pg, ptr, 0); // expected-warning {{builtin call has undefined behaviour when called from a non-streaming function}}
2626
}

clang/utils/TableGen/SveEmitter.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,9 @@ class SVEEmitter {
384384
/// Emit all the range checks for the immediates.
385385
void createSMERangeChecks(raw_ostream &o);
386386

387+
/// Create a table for a builtin's requirement for PSTATE.ZA.
388+
void createBuiltinZAState(raw_ostream &OS);
389+
387390
/// Create intrinsic and add it to \p Out
388391
void createIntrinsic(Record *R,
389392
SmallVectorImpl<std::unique_ptr<Intrinsic>> &Out);
@@ -1697,6 +1700,40 @@ void SVEEmitter::createSMERangeChecks(raw_ostream &OS) {
16971700
OS << "#endif\n\n";
16981701
}
16991702

1703+
void SVEEmitter::createBuiltinZAState(raw_ostream &OS) {
1704+
std::vector<Record *> RV = Records.getAllDerivedDefinitions("Inst");
1705+
SmallVector<std::unique_ptr<Intrinsic>, 128> Defs;
1706+
for (auto *R : RV)
1707+
createIntrinsic(R, Defs);
1708+
1709+
// The mappings must be sorted based on BuiltinID.
1710+
llvm::sort(Defs, [](const std::unique_ptr<Intrinsic> &A,
1711+
const std::unique_ptr<Intrinsic> &B) {
1712+
return A->getMangledName() < B->getMangledName();
1713+
});
1714+
1715+
OS << "#ifdef GET_SME_BUILTIN_HAS_ZA_STATE\n";
1716+
1717+
// Ensure these are only emitted once.
1718+
std::set<std::string> Emitted;
1719+
1720+
uint64_t IsSharedZAFlag = getEnumValueForFlag("IsSharedZA");
1721+
for (auto &Def : Defs) {
1722+
if (Emitted.find(Def->getMangledName()) != Emitted.end())
1723+
continue;
1724+
1725+
OS << "case SME::BI__builtin_sme_" << Def->getMangledName() << ":\n";
1726+
if (Def->isFlagSet(IsSharedZAFlag))
1727+
OS << " return true;\n";
1728+
else
1729+
OS << " return false;\n";
1730+
1731+
Emitted.insert(Def->getMangledName());
1732+
}
1733+
1734+
OS << "#endif\n\n";
1735+
}
1736+
17001737
void SVEEmitter::createStreamingAttrs(raw_ostream &OS, ACLEKind Kind) {
17011738
std::vector<Record *> RV = Records.getAllDerivedDefinitions("Inst");
17021739
SmallVector<std::unique_ptr<Intrinsic>, 128> Defs;
@@ -1792,4 +1829,8 @@ void EmitSmeRangeChecks(RecordKeeper &Records, raw_ostream &OS) {
17921829
void EmitSmeStreamingAttrs(RecordKeeper &Records, raw_ostream &OS) {
17931830
SVEEmitter(Records).createStreamingAttrs(OS, ACLEKind::SME);
17941831
}
1832+
1833+
void EmitSmeBuiltinZAState(RecordKeeper &Records, raw_ostream &OS) {
1834+
SVEEmitter(Records).createBuiltinZAState(OS);
1835+
}
17951836
} // End namespace clang

clang/utils/TableGen/TableGen.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -509,6 +509,9 @@ bool ClangTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
509509
case GenArmSmeStreamingAttrs:
510510
EmitSmeStreamingAttrs(Records, OS);
511511
break;
512+
case GenArmSmeBuiltinZAState:
513+
EmitSmeBuiltinZAState(Records, OS);
514+
break;
512515
case GenArmCdeHeader:
513516
EmitCdeHeader(Records, OS);
514517
break;

clang/utils/TableGen/TableGenBackends.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ void EmitSmeBuiltins(llvm::RecordKeeper &Records, llvm::raw_ostream &OS);
110110
void EmitSmeBuiltinCG(llvm::RecordKeeper &Records, llvm::raw_ostream &OS);
111111
void EmitSmeRangeChecks(llvm::RecordKeeper &Records, llvm::raw_ostream &OS);
112112
void EmitSmeStreamingAttrs(llvm::RecordKeeper &Records, llvm::raw_ostream &OS);
113+
void EmitSmeBuiltinZAState(llvm::RecordKeeper &Records, llvm::raw_ostream &OS);
113114

114115
void EmitMveHeader(llvm::RecordKeeper &Records, llvm::raw_ostream &OS);
115116
void EmitMveBuiltinDef(llvm::RecordKeeper &Records, llvm::raw_ostream &OS);

0 commit comments

Comments
 (0)