summaryrefslogtreecommitdiff
path: root/utils/TableGen/CodeEmitterGen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'utils/TableGen/CodeEmitterGen.cpp')
-rw-r--r--utils/TableGen/CodeEmitterGen.cpp25
1 files changed, 20 insertions, 5 deletions
diff --git a/utils/TableGen/CodeEmitterGen.cpp b/utils/TableGen/CodeEmitterGen.cpp
index 64ea16e362..b7b62d502b 100644
--- a/utils/TableGen/CodeEmitterGen.cpp
+++ b/utils/TableGen/CodeEmitterGen.cpp
@@ -154,7 +154,6 @@ void CodeEmitterGen::run(raw_ostream &o) {
}
if (!gotOp) {
-
// If the operand matches by name, reference according to that
// operand number. Non-matching operands are assumed to be in
// order.
@@ -171,10 +170,26 @@ void CodeEmitterGen::run(raw_ostream &o) {
++NumberedOp;
OpIdx = NumberedOp++;
}
-
- Case += " // op: " + VarName + "\n"
- + " op = getMachineOpValue(MI, MI.getOperand("
- + utostr(OpIdx) + "));\n";
+ std::pair<unsigned, unsigned> SO = CGI.getSubOperandNumber(OpIdx);
+ std::string &EncoderMethodName =
+ CGI.OperandList[SO.first].EncoderMethodName;
+
+ // If the source operand has a custom encoder, use it. This will
+ // get the encoding for all of the suboperands.
+ if (!EncoderMethodName.empty()) {
+ // A custom encoder has all of the information for the
+ // sub-operands, if there are more than one, so only
+ // query the encoder once per source operand.
+ if (SO.second == 0) {
+ Case += " // op: " + VarName + "\n"
+ + " op = " + EncoderMethodName + "(MI, "
+ + utostr(OpIdx) + ");\n";
+ }
+ } else {
+ Case += " // op: " + VarName + "\n"
+ + " op = getMachineOpValue(MI, MI.getOperand("
+ + utostr(OpIdx) + "));\n";
+ }
gotOp = true;
}