Index: utils/TableGen/RegisterInfoEmitter.cpp =================================================================== --- utils/TableGen/RegisterInfoEmitter.cpp +++ utils/TableGen/RegisterInfoEmitter.cpp @@ -1060,6 +1060,63 @@ } OS << "};\n"; // End of HW encoding table + // Emit Reg decoding tables + OS << "\n#ifdef GET_REGINFO_REGISTER_DECODER\n"; + OS << "#undef GET_REGINFO_REGISTER_DECODER\n\n"; + for (const auto &RC : RegisterClasses) { + ArrayRef Order = RC.getOrder(); + unsigned HWEncodingWidth; + int e = Order.size(); + for (HWEncodingWidth = 1; + (1L<getValueAsBitsInit("HWEncoding"); + uint64_t Value = 0; + for (unsigned b = 0, be = BI->getNumBits(); b != be; ++b) { + if (BitInit *B = dyn_cast(BI->getBit(b))) + Value |= (uint64_t)B->getValue() << b; + } + Value &= mask; + if (Value >= max) + max = Value; + } + std::map RegNo2Name; + for (int i = Order.size()-1; i>=0; --i) { + auto Reg = Order[i]; + BitsInit *BI = Reg->getValueAsBitsInit("HWEncoding"); + uint64_t Value = 0; + for (unsigned b = 0, be = BI->getNumBits(); b != be; ++b) { + if (BitInit *B = dyn_cast(BI->getBit(b))) + Value |= (uint64_t)B->getValue() << b; + } + Value &= mask; + RegNo2Name[Value] = getQualifiedName(Reg); + } + uint64_t last = -1; + for (const auto i : RegNo2Name) { + while (++last < i.first) + OS << " /* [" << last << "] = */ 0,\n"; + OS << " /* [" << i.first << "] = */ " << i.second <<",\n"; + } + OS << "};\n"; // End of HW decoding tables + } + // Emit the main register decoding table + OS << "const uint16_t *" << TargetName; + OS << "RegDecodingTable[] = {\n"; + for (const auto &RC : RegisterClasses) { + const std::string &Name = RC.getName(); + OS << " " << TargetName << "RegDecodingTable_" << Name << ",\n"; + } + OS << "};\n"; // End of the main register decoding table + OS << "\n#endif // GET_REGINFO_REGISTER_DECODER\n\n"; + // MCRegisterInfo initialization routine. OS << "static inline void Init" << TargetName << "MCRegisterInfo(MCRegisterInfo *RI, unsigned RA, "