[llvm] [NFC][TableGen] Refactor IntrinsicEmitter code (PR #106479)
Rahul Joshi via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 29 05:21:38 PDT 2024
================
@@ -213,95 +218,94 @@ void IntrinsicEmitter::EmitIITInfo(raw_ostream &OS) {
void IntrinsicEmitter::EmitTargetInfo(const CodeGenIntrinsicTable &Ints,
raw_ostream &OS) {
- OS << "// Target mapping.\n";
- OS << "#ifdef GET_INTRINSIC_TARGET_DATA\n";
- OS << "struct IntrinsicTargetInfo {\n"
- << " llvm::StringLiteral Name;\n"
- << " size_t Offset;\n"
- << " size_t Count;\n"
- << "};\n";
- OS << "static constexpr IntrinsicTargetInfo TargetInfos[] = {\n";
- for (const auto &Target : Ints.Targets)
- OS << " {llvm::StringLiteral(\"" << Target.Name << "\"), " << Target.Offset
- << ", " << Target.Count << "},\n";
- OS << "};\n";
- OS << "#endif\n\n";
+ OS << R"(// Target mapping.
+#ifdef GET_INTRINSIC_TARGET_DATA
+struct IntrinsicTargetInfo {
+ StringLiteral Name;
+ size_t Offset;
+ size_t Count;
+};
+static constexpr IntrinsicTargetInfo TargetInfos[] = {
+)";
+ for (const auto [Name, Offset, Count] : Ints.Targets)
+ OS << formatv(" {{\"{0}\", {1}, {2}},\n", Name, Offset, Count);
+ OS << R"(};
+#endif
+
+)";
}
void IntrinsicEmitter::EmitIntrinsicToNameTable(
const CodeGenIntrinsicTable &Ints, raw_ostream &OS) {
- OS << "// Intrinsic ID to name table.\n";
- OS << "#ifdef GET_INTRINSIC_NAME_TABLE\n";
- OS << " // Note that entry #0 is the invalid intrinsic!\n";
+ OS << R"(// Intrinsic ID to name table.
+#ifdef GET_INTRINSIC_NAME_TABLE
+// Note that entry #0 is the invalid intrinsic!
+)";
for (const auto &Int : Ints)
OS << " \"" << Int.Name << "\",\n";
OS << "#endif\n\n";
}
void IntrinsicEmitter::EmitIntrinsicToOverloadTable(
const CodeGenIntrinsicTable &Ints, raw_ostream &OS) {
- OS << "// Intrinsic ID to overload bitset.\n";
- OS << "#ifdef GET_INTRINSIC_OVERLOAD_TABLE\n";
- OS << "static constexpr uint8_t OTable[] = {\n";
- OS << " 0";
- for (unsigned i = 0, e = Ints.size(); i != e; ++i) {
+ OS << R"(// Intrinsic ID to overload bitset.
+#ifdef GET_INTRINSIC_OVERLOAD_TABLE
+static constexpr uint8_t OTable[] = {
+ 0
+ )";
+ for (auto [I, Int] : enumerate(Ints)) {
// Add one to the index so we emit a null bit for the invalid #0 intrinsic.
- if ((i + 1) % 8 == 0)
+ size_t Idx = I + 1;
+
+ if (Idx % 8 == 0)
OS << ",\n 0";
- if (Ints[i].isOverloaded)
- OS << " | (1<<" << (i + 1) % 8 << ')';
+ if (Int.isOverloaded)
+ OS << " | (1<<" << Idx % 8 << ')';
}
OS << "\n};\n\n";
// OTable contains a true bit at the position if the intrinsic is overloaded.
OS << "return (OTable[id/8] & (1 << (id%8))) != 0;\n";
OS << "#endif\n\n";
}
-/// ComputeFixedEncoding - If we can encode the type signature for this
-/// intrinsic into 32 bits, return it. If not, return ~0U.
-static void ComputeFixedEncoding(const CodeGenIntrinsic &Int,
- std::vector<unsigned char> &TypeSig) {
- if (auto *R = Int.TheDef->getValue("TypeSig")) {
- for (auto &a : cast<ListInit>(R->getValue())->getValues()) {
- for (auto &b : cast<ListInit>(a)->getValues())
+/// ComputeTypeSignature - Compute type signature of the intrinsic `Int`.
+static std::vector<unsigned char>
+ComputeTypeSignature(const CodeGenIntrinsic &Int) {
+ std::vector<unsigned char> TypeSig;
+ if (const auto *R = Int.TheDef->getValue("TypeSig")) {
+ for (const auto *a : cast<ListInit>(R->getValue())->getValues()) {
+ for (const auto *b : cast<ListInit>(a)->getValues())
TypeSig.push_back(cast<IntInit>(b)->getValue());
}
}
-}
-
-static void printIITEntry(raw_ostream &OS, unsigned char X) {
- OS << (unsigned)X;
+ return TypeSig;
}
void IntrinsicEmitter::EmitGenerator(const CodeGenIntrinsicTable &Ints,
raw_ostream &OS) {
// If we can compute a 32-bit fixed encoding for this intrinsic, do so and
// capture it in this vector, otherwise store a ~0U.
std::vector<unsigned> FixedEncodings;
-
SequenceToOffsetTable<std::vector<unsigned char>> LongEncodingTable;
- std::vector<unsigned char> TypeSig;
-
// Compute the unique argument type info.
- for (unsigned i = 0, e = Ints.size(); i != e; ++i) {
+ for (const CodeGenIntrinsic &Int : Ints) {
// Get the signature for the intrinsic.
- TypeSig.clear();
- ComputeFixedEncoding(Ints[i], TypeSig);
+ std::vector<unsigned char> TypeSig = ComputeTypeSignature(Int);
- // Check to see if we can encode it into a 32-bit word. We can only encode
+ // Check to see if we can encode it into a 32-bit word. We can only encode
// 8 nibbles into a 32-bit word.
if (TypeSig.size() <= 8) {
- bool Failed = false;
+ // Attempt to pack elements of TypeSig into a 32-bit word, starting from
+ // the most significant nibble.
unsigned Result = 0;
- for (unsigned i = 0, e = TypeSig.size(); i != e; ++i) {
- // If we had an unencodable argument, bail out.
- if (TypeSig[i] > 15) {
+ bool Failed = false;
+ for_each(reverse(TypeSig), [&Result, &Failed](unsigned char C) {
----------------
jurahul wrote:
Done.
https://github.com/llvm/llvm-project/pull/106479
More information about the llvm-commits
mailing list