Index: RegisterInfoEmitter.cpp =================================================================== --- RegisterInfoEmitter.cpp (revision 292532) +++ RegisterInfoEmitter.cpp (working copy) @@ -1060,6 +1060,67 @@ } 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; + } + for (uint64_t HWE = 0; HWE <= max; ++HWE) + { + bool found = false; + for (unsigned i = 0, e = Order.size(); i != e; ++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; + if (HWE == Value) { + // First of any aliases wins. + OS << " /* [" << Value << "] = */ " << getQualifiedName(Reg) <<",\n"; + found = true; + break; + } + } + if (not found) + OS << " 0,\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, "