Skip to content

Commit 2c64efe

Browse files
- Rename GetAArch64SMEProcessedOperands to GetAArch64SVEProcessedOperands
- Removed code checking for ICEArguments from EmitAArch64SMEBuiltinExpr - Added comment over check for IsTupleGetOrSet - Added the code to print SME attributes back into emitIntrinsic
1 parent 8c9c9bd commit 2c64efe

File tree

2 files changed

+26
-10
lines changed

2 files changed

+26
-10
lines changed

clang/lib/CodeGen/CodeGenFunction.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4298,7 +4298,7 @@ class CodeGenFunction : public CodeGenTypeCache {
42984298
/// for struct of scalable vectors if a function returns struct.
42994299
llvm::Value *FormSVEBuiltinResult(llvm::Value *Call);
43004300

4301-
void GetAArch64SMEProcessedOperands(unsigned BuiltinID, const CallExpr *E,
4301+
void GetAArch64SVEProcessedOperands(unsigned BuiltinID, const CallExpr *E,
43024302
SmallVectorImpl<llvm::Value *> &Ops,
43034303
SVETypeFlags TypeFlags);
43044304

clang/utils/TableGen/SveEmitter.cpp

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ class Intrinsic {
248248
}
249249

250250
/// Emits the intrinsic declaration to the ostream.
251-
void emitIntrinsic(raw_ostream &OS, ACLEKind Kind) const;
251+
void emitIntrinsic(raw_ostream &OS, SVEEmitter &Emitter, ACLEKind Kind) const;
252252

253253
private:
254254
std::string getMergeSuffix() const { return MergeSuffix; }
@@ -357,7 +357,7 @@ class SVEEmitter {
357357
void createHeader(raw_ostream &o);
358358

359359
// Emits core intrinsics in both arm_sme.h and arm_sve.h
360-
void createCoreHeaderIntrinsics(raw_ostream &o, ACLEKind Kind);
360+
void createCoreHeaderIntrinsics(raw_ostream &o, SVEEmitter &Emitter, ACLEKind Kind);
361361

362362
/// Emit all the __builtin prototypes and code needed by Sema.
363363
void createBuiltins(raw_ostream &o);
@@ -1028,25 +1028,39 @@ std::string Intrinsic::mangleName(ClassKind LocalCK) const {
10281028
getMergeSuffix();
10291029
}
10301030

1031-
void Intrinsic::emitIntrinsic(raw_ostream &OS, ACLEKind Kind) const {
1031+
void Intrinsic::emitIntrinsic(raw_ostream &OS, SVEEmitter &Emitter,
1032+
ACLEKind Kind) const {
10321033
bool IsOverloaded = getClassKind() == ClassG && getProto().size() > 1;
10331034

10341035
std::string FullName = mangleName(ClassS);
10351036
std::string ProtoName = mangleName(getClassKind());
10361037
std::string SMEAttrs = "";
10371038

1039+
if (Flags & Emitter.getEnumValueForFlag("IsStreaming"))
1040+
SMEAttrs += ", arm_streaming";
1041+
if (Flags & Emitter.getEnumValueForFlag("IsStreamingCompatible"))
1042+
SMEAttrs += ", arm_streaming_compatible";
1043+
if (Flags & Emitter.getEnumValueForFlag("IsSharedZA"))
1044+
SMEAttrs += ", arm_shared_za";
1045+
if (Flags & Emitter.getEnumValueForFlag("IsPreservesZA"))
1046+
SMEAttrs += ", arm_preserves_za";
1047+
10381048
OS << (IsOverloaded ? "__aio " : "__ai ")
10391049
<< "__attribute__((__clang_arm_builtin_alias(";
10401050

10411051
switch (Kind) {
10421052
case ACLEKind::SME:
1043-
OS << "__builtin_sme_" << FullName << ")))\n";
1053+
OS << "__builtin_sme_" << FullName << ")";
10441054
break;
10451055
case ACLEKind::SVE:
1046-
OS << "__builtin_sve_" << FullName << ")))\n";
1056+
OS << "__builtin_sve_" << FullName << ")";
10471057
break;
10481058
}
10491059

1060+
if (!SMEAttrs.empty())
1061+
OS << SMEAttrs;
1062+
OS << "))\n";
1063+
10501064
OS << getTypes()[0].str() << " " << ProtoName << "(";
10511065
for (unsigned I = 0; I < getTypes().size() - 1; ++I) {
10521066
if (I != 0)
@@ -1180,7 +1194,9 @@ void SVEEmitter::createIntrinsic(
11801194
}
11811195
}
11821196

1183-
void SVEEmitter::createCoreHeaderIntrinsics(raw_ostream &OS, ACLEKind Kind) {
1197+
void SVEEmitter::createCoreHeaderIntrinsics(raw_ostream &OS,
1198+
SVEEmitter &Emitter,
1199+
ACLEKind Kind) {
11841200
SmallVector<std::unique_ptr<Intrinsic>, 128> Defs;
11851201
std::vector<Record *> RV = Records.getAllDerivedDefinitions("Inst");
11861202
for (auto *R : RV)
@@ -1201,7 +1217,7 @@ void SVEEmitter::createCoreHeaderIntrinsics(raw_ostream &OS, ACLEKind Kind) {
12011217

12021218
// Actually emit the intrinsic declarations.
12031219
for (auto &I : Defs)
1204-
I->emitIntrinsic(OS, Kind);
1220+
I->emitIntrinsic(OS, Emitter, Kind);
12051221
}
12061222

12071223
void SVEEmitter::createHeader(raw_ostream &OS) {
@@ -1355,7 +1371,7 @@ void SVEEmitter::createHeader(raw_ostream &OS) {
13551371
<< To.Suffix << "(__VA_ARGS__)\n";
13561372
}
13571373

1358-
createCoreHeaderIntrinsics(OS, ACLEKind::SVE);
1374+
createCoreHeaderIntrinsics(OS, *this, ACLEKind::SVE);
13591375

13601376
OS << "#define svcvtnt_bf16_x svcvtnt_bf16_m\n";
13611377
OS << "#define svcvtnt_bf16_f32_x svcvtnt_bf16_f32_m\n";
@@ -1537,7 +1553,7 @@ void SVEEmitter::createSMEHeader(raw_ostream &OS) {
15371553
OS << "extern \"C\" {\n";
15381554
OS << "#endif\n\n";
15391555

1540-
createCoreHeaderIntrinsics(OS, ACLEKind::SME);
1556+
createCoreHeaderIntrinsics(OS, *this, ACLEKind::SME);
15411557

15421558
OS << "#ifdef __cplusplus\n";
15431559
OS << "} // extern \"C\"\n";

0 commit comments

Comments
 (0)