forked from OSchip/llvm-project
Teach the AsmMatcherEmitter to allow InstAlias' where the suboperands of a complex operand are called out explicitly in the asm string.
llvm-svn: 158183
This commit is contained in:
parent
aadbfafcd1
commit
da6bd3e603
|
@ -556,9 +556,31 @@ CodeGenInstAlias::CodeGenInstAlias(Record *R, CodeGenTarget &T) : TheDef(R) {
|
|||
ResultOperand ResOp(static_cast<int64_t>(0));
|
||||
if (tryAliasOpMatch(Result, AliasOpNo, InstOpRec, (NumSubOps > 1),
|
||||
R->getLoc(), T, ResOp)) {
|
||||
ResultOperands.push_back(ResOp);
|
||||
ResultInstOperandIndex.push_back(std::make_pair(i, -1));
|
||||
++AliasOpNo;
|
||||
// If this is a simple operand, or a complex operand with a custom match
|
||||
// class, then we can match is verbatim.
|
||||
if (NumSubOps == 1 ||
|
||||
(InstOpRec->getValue("ParserMatchClass") &&
|
||||
InstOpRec->getValueAsDef("ParserMatchClass")
|
||||
->getValueAsString("Name") != "Imm")) {
|
||||
ResultOperands.push_back(ResOp);
|
||||
ResultInstOperandIndex.push_back(std::make_pair(i, -1));
|
||||
++AliasOpNo;
|
||||
|
||||
// Otherwise, we need to match each of the suboperands individually.
|
||||
} else {
|
||||
DagInit *MIOI = ResultInst->Operands[i].MIOperandInfo;
|
||||
for (unsigned SubOp = 0; SubOp != NumSubOps; ++SubOp) {
|
||||
Record *SubRec = dynamic_cast<DefInit*>(MIOI->getArg(SubOp))->getDef();
|
||||
|
||||
// Take care to instantiate each of the suboperands with the correct
|
||||
// nomenclature: $foo.bar
|
||||
ResultOperands.push_back(
|
||||
ResultOperand(Result->getArgName(AliasOpNo) + "." +
|
||||
MIOI->getArgName(SubOp), SubRec));
|
||||
ResultInstOperandIndex.push_back(std::make_pair(i, SubOp));
|
||||
}
|
||||
++AliasOpNo;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
@ -280,7 +280,7 @@ namespace llvm {
|
|||
|
||||
struct ResultOperand {
|
||||
private:
|
||||
StringRef Name;
|
||||
std::string Name;
|
||||
Record *R;
|
||||
|
||||
int64_t Imm;
|
||||
|
@ -291,7 +291,7 @@ namespace llvm {
|
|||
K_Reg
|
||||
} Kind;
|
||||
|
||||
ResultOperand(StringRef N, Record *r) : Name(N), R(r), Kind(K_Record) {}
|
||||
ResultOperand(std::string N, Record *r) : Name(N), R(r), Kind(K_Record) {}
|
||||
ResultOperand(int64_t I) : Imm(I), Kind(K_Imm) {}
|
||||
ResultOperand(Record *r) : R(r), Kind(K_Reg) {}
|
||||
|
||||
|
|
Loading…
Reference in New Issue