diff options
author | mingmingl <mingmingl@google.com> | 2025-02-04 11:11:14 -0800 |
---|---|---|
committer | mingmingl <mingmingl@google.com> | 2025-02-04 11:11:14 -0800 |
commit | e91747a92d27ecf799427bf563f9f64f7c4d2447 (patch) | |
tree | 7aa5a8a9170deec293e152bdf2be804399dcd612 /clang/utils/TableGen/SveEmitter.cpp | |
parent | 3a8d9337d816aef41c3ca1484be8b933a71a3c46 (diff) | |
parent | 53d6e59b594639417cdbfcfa2d18cea64acb4009 (diff) | |
download | llvm-users/mingmingl-llvm/spr/sdpglobalvariable.zip llvm-users/mingmingl-llvm/spr/sdpglobalvariable.tar.gz llvm-users/mingmingl-llvm/spr/sdpglobalvariable.tar.bz2 |
Merge branch 'main' into users/mingmingl-llvm/spr/sdpglobalvariableusers/mingmingl-llvm/spr/sdpglobalvariable
Diffstat (limited to 'clang/utils/TableGen/SveEmitter.cpp')
-rw-r--r-- | clang/utils/TableGen/SveEmitter.cpp | 116 |
1 files changed, 93 insertions, 23 deletions
diff --git a/clang/utils/TableGen/SveEmitter.cpp b/clang/utils/TableGen/SveEmitter.cpp index 39dcbc6..e226987 100644 --- a/clang/utils/TableGen/SveEmitter.cpp +++ b/clang/utils/TableGen/SveEmitter.cpp @@ -27,9 +27,11 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringMap.h" +#include "llvm/Support/raw_ostream.h" #include "llvm/TableGen/AArch64ImmCheck.h" #include "llvm/TableGen/Error.h" #include "llvm/TableGen/Record.h" +#include "llvm/TableGen/StringToOffsetTable.h" #include <array> #include <cctype> #include <set> @@ -200,7 +202,9 @@ public: StringRef getSVEGuard() const { return SVEGuard; } StringRef getSMEGuard() const { return SMEGuard; } - void printGuard(raw_ostream &OS) const { + std::string getGuard() const { + std::string Guard; + llvm::raw_string_ostream OS(Guard); if (!SVEGuard.empty() && SMEGuard.empty()) OS << SVEGuard; else if (SVEGuard.empty() && !SMEGuard.empty()) @@ -218,6 +222,7 @@ public: else OS << SMEGuard; } + return Guard; } ClassKind getClassKind() const { return Class; } @@ -1479,19 +1484,19 @@ void SVEEmitter::createBuiltins(raw_ostream &OS) { return A->getMangledName() < B->getMangledName(); }); - OS << "#ifdef GET_SVE_BUILTINS\n"; - for (auto &Def : Defs) { - // Only create BUILTINs for non-overloaded intrinsics, as overloaded - // declarations only live in the header file. + llvm::StringToOffsetTable Table; + Table.GetOrAddStringOffset(""); + Table.GetOrAddStringOffset("n"); + + for (const auto &Def : Defs) if (Def->getClassKind() != ClassG) { - OS << "TARGET_BUILTIN(__builtin_sve_" << Def->getMangledName() << ", \"" - << Def->getBuiltinTypeStr() << "\", \"n\", \""; - Def->printGuard(OS); - OS << "\")\n"; + Table.GetOrAddStringOffset(Def->getMangledName()); + Table.GetOrAddStringOffset(Def->getBuiltinTypeStr()); + Table.GetOrAddStringOffset(Def->getGuard()); } - } - // Add reinterpret functions. + Table.GetOrAddStringOffset("sme|sve"); + SmallVector<std::pair<std::string, std::string>> ReinterpretBuiltins; for (auto [N, Suffix] : std::initializer_list<std::pair<unsigned, const char *>>{ {1, ""}, {2, "_x2"}, {3, "_x3"}, {4, "_x4"}}) { @@ -1499,14 +1504,54 @@ void SVEEmitter::createBuiltins(raw_ostream &OS) { SVEType ToV(To.BaseType, N); for (const ReinterpretTypeInfo &From : Reinterprets) { SVEType FromV(From.BaseType, N); - OS << "TARGET_BUILTIN(__builtin_sve_reinterpret_" << To.Suffix << "_" - << From.Suffix << Suffix << +", \"" << ToV.builtin_str() - << FromV.builtin_str() << "\", \"n\", \"sme|sve\")\n"; + std::string Name = + (Twine("reinterpret_") + To.Suffix + "_" + From.Suffix + Suffix) + .str(); + std::string Type = ToV.builtin_str() + FromV.builtin_str(); + Table.GetOrAddStringOffset(Name); + Table.GetOrAddStringOffset(Type); + ReinterpretBuiltins.push_back({Name, Type}); } } } - OS << "#endif\n\n"; + OS << "#ifdef GET_SVE_BUILTIN_ENUMERATORS\n"; + for (const auto &Def : Defs) + if (Def->getClassKind() != ClassG) + OS << " BI__builtin_sve_" << Def->getMangledName() << ",\n"; + for (const auto &[Name, _] : ReinterpretBuiltins) + OS << " BI__builtin_sve_" << Name << ",\n"; + OS << "#endif // GET_SVE_BUILTIN_ENUMERATORS\n\n"; + + OS << "#ifdef GET_SVE_BUILTIN_STR_TABLE\n"; + Table.EmitStringTableDef(OS, "BuiltinStrings"); + OS << "#endif // GET_SVE_BUILTIN_STR_TABLE\n\n"; + + OS << "#ifdef GET_SVE_BUILTIN_INFOS\n"; + for (const auto &Def : Defs) { + // Only create BUILTINs for non-overloaded intrinsics, as overloaded + // declarations only live in the header file. + if (Def->getClassKind() != ClassG) { + OS << " Builtin::Info{Builtin::Info::StrOffsets{" + << Table.GetStringOffset(Def->getMangledName()) << " /* " + << Def->getMangledName() << " */, "; + OS << Table.GetStringOffset(Def->getBuiltinTypeStr()) << " /* " + << Def->getBuiltinTypeStr() << " */, "; + OS << Table.GetStringOffset("n") << " /* n */, "; + OS << Table.GetStringOffset(Def->getGuard()) << " /* " << Def->getGuard() + << " */}, "; + OS << "HeaderDesc::NO_HEADER, ALL_LANGUAGES},\n"; + } + } + for (const auto &[Name, Type] : ReinterpretBuiltins) { + OS << " Builtin::Info{Builtin::Info::StrOffsets{" + << Table.GetStringOffset(Name) << " /* " << Name << " */, "; + OS << Table.GetStringOffset(Type) << " /* " << Type << " */, "; + OS << Table.GetStringOffset("n") << " /* n */, "; + OS << Table.GetStringOffset("sme|sve") << " /* sme|sve */}, "; + OS << "HeaderDesc::NO_HEADER, ALL_LANGUAGES},\n"; + } + OS << "#endif // GET_SVE_BUILTIN_INFOS\n\n"; } void SVEEmitter::createCodeGenMap(raw_ostream &OS) { @@ -1679,19 +1724,44 @@ void SVEEmitter::createSMEBuiltins(raw_ostream &OS) { return A->getMangledName() < B->getMangledName(); }); - OS << "#ifdef GET_SME_BUILTINS\n"; - for (auto &Def : Defs) { + llvm::StringToOffsetTable Table; + Table.GetOrAddStringOffset(""); + Table.GetOrAddStringOffset("n"); + + for (const auto &Def : Defs) + if (Def->getClassKind() != ClassG) { + Table.GetOrAddStringOffset(Def->getMangledName()); + Table.GetOrAddStringOffset(Def->getBuiltinTypeStr()); + Table.GetOrAddStringOffset(Def->getGuard()); + } + + OS << "#ifdef GET_SME_BUILTIN_ENUMERATORS\n"; + for (const auto &Def : Defs) + if (Def->getClassKind() != ClassG) + OS << " BI__builtin_sme_" << Def->getMangledName() << ",\n"; + OS << "#endif // GET_SME_BUILTIN_ENUMERATORS\n\n"; + + OS << "#ifdef GET_SME_BUILTIN_STR_TABLE\n"; + Table.EmitStringTableDef(OS, "BuiltinStrings"); + OS << "#endif // GET_SME_BUILTIN_STR_TABLE\n\n"; + + OS << "#ifdef GET_SME_BUILTIN_INFOS\n"; + for (const auto &Def : Defs) { // Only create BUILTINs for non-overloaded intrinsics, as overloaded // declarations only live in the header file. if (Def->getClassKind() != ClassG) { - OS << "TARGET_BUILTIN(__builtin_sme_" << Def->getMangledName() << ", \"" - << Def->getBuiltinTypeStr() << "\", \"n\", \""; - Def->printGuard(OS); - OS << "\")\n"; + OS << " Builtin::Info{Builtin::Info::StrOffsets{" + << Table.GetStringOffset(Def->getMangledName()) << " /* " + << Def->getMangledName() << " */, "; + OS << Table.GetStringOffset(Def->getBuiltinTypeStr()) << " /* " + << Def->getBuiltinTypeStr() << " */, "; + OS << Table.GetStringOffset("n") << " /* n */, "; + OS << Table.GetStringOffset(Def->getGuard()) << " /* " << Def->getGuard() + << " */}, "; + OS << "HeaderDesc::NO_HEADER, ALL_LANGUAGES},\n"; } } - - OS << "#endif\n\n"; + OS << "#endif // GET_SME_BUILTIN_INFOS\n\n"; } void SVEEmitter::createSMECodeGenMap(raw_ostream &OS) { |