@@ -248,7 +248,7 @@ class Intrinsic {
248
248
}
249
249
250
250
// / 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 ;
252
252
253
253
private:
254
254
std::string getMergeSuffix () const { return MergeSuffix; }
@@ -357,7 +357,7 @@ class SVEEmitter {
357
357
void createHeader (raw_ostream &o);
358
358
359
359
// 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);
361
361
362
362
// / Emit all the __builtin prototypes and code needed by Sema.
363
363
void createBuiltins (raw_ostream &o);
@@ -1028,25 +1028,39 @@ std::string Intrinsic::mangleName(ClassKind LocalCK) const {
1028
1028
getMergeSuffix ();
1029
1029
}
1030
1030
1031
- void Intrinsic::emitIntrinsic (raw_ostream &OS, ACLEKind Kind) const {
1031
+ void Intrinsic::emitIntrinsic (raw_ostream &OS, SVEEmitter &Emitter,
1032
+ ACLEKind Kind) const {
1032
1033
bool IsOverloaded = getClassKind () == ClassG && getProto ().size () > 1 ;
1033
1034
1034
1035
std::string FullName = mangleName (ClassS);
1035
1036
std::string ProtoName = mangleName (getClassKind ());
1036
1037
std::string SMEAttrs = " " ;
1037
1038
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
+
1038
1048
OS << (IsOverloaded ? " __aio " : " __ai " )
1039
1049
<< " __attribute__((__clang_arm_builtin_alias(" ;
1040
1050
1041
1051
switch (Kind) {
1042
1052
case ACLEKind::SME:
1043
- OS << " __builtin_sme_" << FullName << " ))) \n " ;
1053
+ OS << " __builtin_sme_" << FullName << " )" ;
1044
1054
break ;
1045
1055
case ACLEKind::SVE:
1046
- OS << " __builtin_sve_" << FullName << " ))) \n " ;
1056
+ OS << " __builtin_sve_" << FullName << " )" ;
1047
1057
break ;
1048
1058
}
1049
1059
1060
+ if (!SMEAttrs.empty ())
1061
+ OS << SMEAttrs;
1062
+ OS << " ))\n " ;
1063
+
1050
1064
OS << getTypes ()[0 ].str () << " " << ProtoName << " (" ;
1051
1065
for (unsigned I = 0 ; I < getTypes ().size () - 1 ; ++I) {
1052
1066
if (I != 0 )
@@ -1180,7 +1194,9 @@ void SVEEmitter::createIntrinsic(
1180
1194
}
1181
1195
}
1182
1196
1183
- void SVEEmitter::createCoreHeaderIntrinsics (raw_ostream &OS, ACLEKind Kind) {
1197
+ void SVEEmitter::createCoreHeaderIntrinsics (raw_ostream &OS,
1198
+ SVEEmitter &Emitter,
1199
+ ACLEKind Kind) {
1184
1200
SmallVector<std::unique_ptr<Intrinsic>, 128 > Defs;
1185
1201
std::vector<Record *> RV = Records.getAllDerivedDefinitions (" Inst" );
1186
1202
for (auto *R : RV)
@@ -1201,7 +1217,7 @@ void SVEEmitter::createCoreHeaderIntrinsics(raw_ostream &OS, ACLEKind Kind) {
1201
1217
1202
1218
// Actually emit the intrinsic declarations.
1203
1219
for (auto &I : Defs)
1204
- I->emitIntrinsic (OS, Kind);
1220
+ I->emitIntrinsic (OS, Emitter, Kind);
1205
1221
}
1206
1222
1207
1223
void SVEEmitter::createHeader (raw_ostream &OS) {
@@ -1355,7 +1371,7 @@ void SVEEmitter::createHeader(raw_ostream &OS) {
1355
1371
<< To.Suffix << " (__VA_ARGS__)\n " ;
1356
1372
}
1357
1373
1358
- createCoreHeaderIntrinsics (OS, ACLEKind::SVE);
1374
+ createCoreHeaderIntrinsics (OS, * this , ACLEKind::SVE);
1359
1375
1360
1376
OS << " #define svcvtnt_bf16_x svcvtnt_bf16_m\n " ;
1361
1377
OS << " #define svcvtnt_bf16_f32_x svcvtnt_bf16_f32_m\n " ;
@@ -1537,7 +1553,7 @@ void SVEEmitter::createSMEHeader(raw_ostream &OS) {
1537
1553
OS << " extern \" C\" {\n " ;
1538
1554
OS << " #endif\n\n " ;
1539
1555
1540
- createCoreHeaderIntrinsics (OS, ACLEKind::SME);
1556
+ createCoreHeaderIntrinsics (OS, * this , ACLEKind::SME);
1541
1557
1542
1558
OS << " #ifdef __cplusplus\n " ;
1543
1559
OS << " } // extern \" C\"\n " ;
0 commit comments