diff --git a/llvm/utils/TableGen/InstrInfoEmitter.cpp b/llvm/utils/TableGen/InstrInfoEmitter.cpp --- a/llvm/utils/TableGen/InstrInfoEmitter.cpp +++ b/llvm/utils/TableGen/InstrInfoEmitter.cpp @@ -22,6 +22,7 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringExtras.h" #include "llvm/Support/Casting.h" +#include "llvm/Support/Regex.h" #include "llvm/Support/raw_ostream.h" #include "llvm/TableGen/Error.h" #include "llvm/TableGen/Record.h" @@ -449,6 +450,31 @@ OS << "} // end namespace " << Namespace << "\n"; OS << "} // end namespace llvm\n"; OS << "#endif // GET_INSTRINFO_OPERAND_TYPE\n\n"; + + OS << "#ifdef GET_INSTRINFO_MEM_OPERAND_SIZE\n"; + OS << "#undef GET_INSTRINFO_MEM_OPERAND_SIZE\n"; + OS << "namespace llvm {\n"; + OS << "namespace " << Namespace << " {\n"; + OS << "LLVM_READONLY\n"; + OS << "static int getMemOperandSize(int OpType) {\n"; + OS << " switch (OpType) {\n"; + Regex MemSizeRegex("Mem([0-9]+)"); + for (const Record *Op : Operands) { + assert(!Op->isValueUnset("ParserMatchClass")); + const Record *OperandClassDef = Op->getValueAsDef("ParserMatchClass"); + // ParserMatchClass Name field, e.g. Mem64 + StringRef Name = OperandClassDef->getValueAsString("Name"); + SmallVector Matches; + if (!MemSizeRegex.match(Name, &Matches)) + continue; + std::string Size = MemSizeRegex.sub("\\1", Matches[0]); + OS << " case OpTypes::" << Op->getName() << ": return " << Size << ";\n"; + } + OS << " default: return 0;\n"; + OS << " }\n}\n"; + OS << "} // end namespace " << Namespace << "\n"; + OS << "} // end namespace llvm\n"; + OS << "#endif // GET_INSTRINFO_MEM_OPERAND_SIZE\n\n"; } void InstrInfoEmitter::emitLogicalOperandSizeMappings(