[llvm] [GISel][TableGen] Generate getRegBankFromRegClass (PR #99896)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 22 09:58:29 PDT 2024
================
@@ -287,8 +291,88 @@ void RegisterBankEmitter::emitBaseClassImplementation(
<< " for (auto RB : enumerate(RegBanks))\n"
<< " assert(RB.index() == RB.value()->getID() && \"Index != ID\");\n"
<< "#endif // NDEBUG\n"
- << "}\n"
- << "} // end namespace llvm\n";
+ << "}\n";
+
+ uint32_t NoRegBanks = Banks.size();
+ uint32_t BitSize = NextPowerOf2(Log2_32(NoRegBanks));
+ uint32_t ElemsPerWord = 32 / BitSize;
+ uint32_t BitMask = (1 << BitSize) - 1;
+ bool HasAmbigousOrMissingEntry = false;
+ struct Entry {
+ std::string RCIdName;
+ std::string RBIdName;
+ };
+ std::vector<Entry> Entries;
+ for (const auto &Bank : Banks)
+ for (const auto *RC : Bank.register_classes()) {
+ if (RC->EnumValue >= Entries.size())
+ Entries.resize(RC->EnumValue+1);
+ Entry &E = Entries[RC->EnumValue];
+ E.RCIdName = RC->getIdName();
+ if (!E.RBIdName.empty()) {
+ HasAmbigousOrMissingEntry = true;
+ E.RBIdName = "InvalidRegBankID";
+ } else {
+ E.RBIdName = (TargetName + "::" + Bank.getEnumeratorName()).str();
+ }
+ }
+ for (auto &E : Entries) {
+ if (E.RBIdName.empty()) {
+ HasAmbigousOrMissingEntry = true;
+ E.RBIdName = "InvalidRegBankID";
+ }
+ }
+ OS << "const RegisterBank &\n"
+ << TargetName << "GenRegisterBankInfo::getRegBankFromRegClass"
+ << "(const TargetRegisterClass &RC, LLT) const {\n";
+ if (HasAmbigousOrMissingEntry)
+ OS << " constexpr uint32_t InvalidRegBankID = uint32_t("
+ << TargetName + "::InvalidRegBankID) & " << BitMask << ";\n";
+ unsigned TableSize = Entries.size() / ElemsPerWord + ((Entries.size() % ElemsPerWord) > 0);
+ OS << " static const uint32_t RegClass2RegBank["
+ << TableSize << "] = {\n";
+ uint32_t Shift = 32 - BitSize;
+ bool First = true;
+ std::string TrailingComment;
+ for (auto &E : Entries) {
+ Shift += BitSize;
+ if (Shift == 32) {
+ Shift = 0;
+ if (First)
+ First = false;
+ else
+ OS << "," << TrailingComment << "\n";
+ } else {
+ OS << " |" << TrailingComment << "\n";
+ }
+ OS << " ("
+ << (E.RBIdName.empty()
+ ? "InvalidRegBankID"
+ : Twine("uint32_t(").concat(E.RBIdName).concat(")").str())
+ << " << " << Shift << ")";
----------------
arsenm wrote:
```suggestion
<< " << " << Shift << ')';
```
https://github.com/llvm/llvm-project/pull/99896
More information about the llvm-commits
mailing list