1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-18 18:42:46 +02:00

AsmMatcherEmitter: Add an option to override custom converters for InstAlias

If there is an InstAlias defined for an instruction that had a custom
converter (AsmMatchConverter), then when the alias is matched,
the custom converter will be used rather than the converter generated
by the InstAlias.

This patch adds the UseInstAsmMatchConverter field to the InstAlias
class, which allows you to override this behavior and force the
converter generated by the InstAlias to be used.

This is required for some future improvemnts to the R600 assembler.

Differential Revision: http://reviews.llvm.org/D9083

llvm-svn: 238210
This commit is contained in:
Tom Stellard 2015-05-26 15:55:50 +00:00
parent 0e92f19a7e
commit 77e56fd9ed
2 changed files with 21 additions and 3 deletions

View File

@ -1006,6 +1006,15 @@ class InstAlias<string Asm, dag Result, int Emit = 1> {
// Predicates - Predicates that must be true for this to match. // Predicates - Predicates that must be true for this to match.
list<Predicate> Predicates = []; list<Predicate> Predicates = [];
// If the instruction specified in Result has defined an AsmMatchConverter
// then setting this to 1 will cause the alias to use the AsmMatchConverter
// function when converting the OperandVector into an MCInst instead of the
// function that is generated by the dag Result.
// Setting this to 0 will cause the alias to ignore the Result instruction's
// defined AsmMatchConverter and instead use the function generated by the
// dag Result.
bit UseInstAsmMatchConverter = 1;
} }
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//

View File

@ -438,12 +438,21 @@ struct MatchableInfo {
/// If this instruction is deprecated in some form. /// If this instruction is deprecated in some form.
bool HasDeprecation; bool HasDeprecation;
/// If this is an alias, this is use to determine whether or not to using
/// the conversion function defined by the instruction's AsmMatchConverter
/// or to use the function generated by the alias.
bool UseInstAsmMatchConverter;
MatchableInfo(const CodeGenInstruction &CGI) MatchableInfo(const CodeGenInstruction &CGI)
: AsmVariantID(0), AsmString(CGI.AsmString), TheDef(CGI.TheDef), DefRec(&CGI) { : AsmVariantID(0), AsmString(CGI.AsmString), TheDef(CGI.TheDef), DefRec(&CGI),
UseInstAsmMatchConverter(true) {
} }
MatchableInfo(std::unique_ptr<const CodeGenInstAlias> Alias) MatchableInfo(std::unique_ptr<const CodeGenInstAlias> Alias)
: AsmVariantID(0), AsmString(Alias->AsmString), TheDef(Alias->TheDef), DefRec(Alias.release()) { : AsmVariantID(0), AsmString(Alias->AsmString), TheDef(Alias->TheDef),
DefRec(Alias.release()),
UseInstAsmMatchConverter(
TheDef->getValueAsBit("UseInstAsmMatchConverter")) {
} }
~MatchableInfo() { ~MatchableInfo() {
@ -1749,7 +1758,7 @@ static void emitConvertFuncs(CodeGenTarget &Target, StringRef ClassName,
// Check if we have a custom match function. // Check if we have a custom match function.
std::string AsmMatchConverter = std::string AsmMatchConverter =
II->getResultInst()->TheDef->getValueAsString("AsmMatchConverter"); II->getResultInst()->TheDef->getValueAsString("AsmMatchConverter");
if (!AsmMatchConverter.empty()) { if (!AsmMatchConverter.empty() && II->UseInstAsmMatchConverter) {
std::string Signature = "ConvertCustom_" + AsmMatchConverter; std::string Signature = "ConvertCustom_" + AsmMatchConverter;
II->ConversionFnKind = Signature; II->ConversionFnKind = Signature;