MC/AsmMatcher: Add support for custom conversion functions.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@124870 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Daniel Dunbar 2011-02-04 17:12:15 +00:00
parent c83e203757
commit cf12067ae0
2 changed files with 27 additions and 1 deletions

View File

@ -248,6 +248,13 @@ class Instruction {
/// Target-specific flags. This becomes the TSFlags field in TargetInstrDesc.
bits<64> TSFlags = 0;
///@name Assembler Parser Support
///@{
string AsmMatchConverter = "";
///@}
}
/// Predicates - These are extra conditionals which are turned into instruction

View File

@ -1388,6 +1388,26 @@ static void EmitConvertToMCInst(CodeGenTarget &Target,
ie = Infos.end(); it != ie; ++it) {
MatchableInfo &II = **it;
// Check if we have a custom match function.
StringRef AsmMatchConverter = II.getResultInst()->TheDef->getValueAsString(
"AsmMatchConverter");
if (!AsmMatchConverter.empty()) {
std::string Signature = "ConvertCustom_" + AsmMatchConverter.str();
II.ConversionFnKind = Signature;
// Check if we have already generated this signature.
if (!GeneratedFns.insert(Signature).second)
continue;
// If not, emit it now. Add to the enum list.
OS << " " << Signature << ",\n";
CvtOS << " case " << Signature << ":\n";
CvtOS << " " << AsmMatchConverter << "(Inst, Opcode, Operands);\n";
CvtOS << " return;\n";
continue;
}
// Build the conversion function signature.
std::string Signature = "Convert";
std::string CaseBody;
@ -1988,7 +2008,6 @@ void AsmMatcherEmitter::run(raw_ostream &OS) {
it != ie; ++it) {
MatchableInfo &II = **it;
OS << " { " << Target.getName() << "::"
<< II.getResultInst()->TheDef->getName() << ", \"" << II.Mnemonic << "\""
<< ", " << II.ConversionFnKind << ", { ";