aboutsummaryrefslogtreecommitdiff
path: root/utils/TableGen/DAGISelMatcherEmitter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'utils/TableGen/DAGISelMatcherEmitter.cpp')
-rw-r--r--utils/TableGen/DAGISelMatcherEmitter.cpp22
1 files changed, 16 insertions, 6 deletions
diff --git a/utils/TableGen/DAGISelMatcherEmitter.cpp b/utils/TableGen/DAGISelMatcherEmitter.cpp
index cecbc6cccdff..e9f1fb93d516 100644
--- a/utils/TableGen/DAGISelMatcherEmitter.cpp
+++ b/utils/TableGen/DAGISelMatcherEmitter.cpp
@@ -670,12 +670,22 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx,
OS << '\n';
return 2+MN->getNumNodes();
}
- case Matcher::EmitCopyToReg:
- OS << "OPC_EmitCopyToReg, "
- << cast<EmitCopyToRegMatcher>(N)->getSrcSlot() << ", "
- << getQualifiedName(cast<EmitCopyToRegMatcher>(N)->getDestPhysReg())
- << ",\n";
- return 3;
+ case Matcher::EmitCopyToReg: {
+ const auto *C2RMatcher = cast<EmitCopyToRegMatcher>(N);
+ int Bytes = 3;
+ const CodeGenRegister *Reg = C2RMatcher->getDestPhysReg();
+ if (Reg->EnumValue > 255) {
+ assert(isUInt<16>(Reg->EnumValue) && "not handled");
+ OS << "OPC_EmitCopyToReg2, " << C2RMatcher->getSrcSlot() << ", "
+ << "TARGET_VAL(" << getQualifiedName(Reg->TheDef) << "),\n";
+ ++Bytes;
+ } else {
+ OS << "OPC_EmitCopyToReg, " << C2RMatcher->getSrcSlot() << ", "
+ << getQualifiedName(Reg->TheDef) << ",\n";
+ }
+
+ return Bytes;
+ }
case Matcher::EmitNodeXForm: {
const EmitNodeXFormMatcher *XF = cast<EmitNodeXFormMatcher>(N);
OS << "OPC_EmitNodeXForm, " << getNodeXFormID(XF->getNodeXForm()) << ", "