diff --git a/llvm/include/llvm/CodeGen/SelectionDAGISel.h b/llvm/include/llvm/CodeGen/SelectionDAGISel.h index c604e7eaa0887..40046e0a8dec9 100644 --- a/llvm/include/llvm/CodeGen/SelectionDAGISel.h +++ b/llvm/include/llvm/CodeGen/SelectionDAGISel.h @@ -223,6 +223,8 @@ class SelectionDAGISel : public MachineFunctionPass { // Space-optimized forms that implicitly encode integer VT. OPC_EmitStringInteger32, OPC_EmitRegister, + OPC_EmitRegisterI32, + OPC_EmitRegisterI64, OPC_EmitRegister2, OPC_EmitConvertToTarget, OPC_EmitConvertToTarget0, diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index af49ef17a3f2d..3dc6e4bbcf46b 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -3612,12 +3612,24 @@ void SelectionDAGISel::SelectCodeCommon(SDNode *NodeToMatch, CurDAG->getTargetConstant(Val, SDLoc(NodeToMatch), VT), nullptr)); continue; } - case OPC_EmitRegister: { - MVT::SimpleValueType VT = - static_cast(MatcherTable[MatcherIndex++]); + case OPC_EmitRegister: + case OPC_EmitRegisterI32: + case OPC_EmitRegisterI64: { + MVT::SimpleValueType VT; + switch (Opcode) { + case OPC_EmitRegisterI32: + VT = MVT::i32; + break; + case OPC_EmitRegisterI64: + VT = MVT::i64; + break; + default: + VT = static_cast(MatcherTable[MatcherIndex++]); + break; + } unsigned RegNo = MatcherTable[MatcherIndex++]; - RecordedNodes.push_back(std::pair( - CurDAG->getRegister(RegNo, VT), nullptr)); + RecordedNodes.push_back(std::pair( + CurDAG->getRegister(RegNo, VT), nullptr)); continue; } case OPC_EmitRegister2: { diff --git a/llvm/utils/TableGen/DAGISelMatcherEmitter.cpp b/llvm/utils/TableGen/DAGISelMatcherEmitter.cpp index 94799267e8960..6fd5698e7372e 100644 --- a/llvm/utils/TableGen/DAGISelMatcherEmitter.cpp +++ b/llvm/utils/TableGen/DAGISelMatcherEmitter.cpp @@ -737,24 +737,35 @@ EmitMatcher(const Matcher *N, const unsigned Indent, unsigned CurrentIdx, case Matcher::EmitRegister: { const EmitRegisterMatcher *Matcher = cast(N); const CodeGenRegister *Reg = Matcher->getReg(); + MVT::SimpleValueType VT = Matcher->getVT(); // If the enum value of the register is larger than one byte can handle, // use EmitRegister2. if (Reg && Reg->EnumValue > 255) { - OS << "OPC_EmitRegister2, " << getEnumName(Matcher->getVT()) << ", "; + OS << "OPC_EmitRegister2, " << getEnumName(VT) << ", "; OS << "TARGET_VAL(" << getQualifiedName(Reg->TheDef) << "),\n"; return 4; + } + unsigned OpBytes; + switch (VT) { + case MVT::i32: + case MVT::i64: + OpBytes = 1; + OS << "OPC_EmitRegisterI" << MVT(VT).getSizeInBits() << ", "; + break; + default: + OpBytes = 2; + OS << "OPC_EmitRegister, " << getEnumName(VT) << ", "; + break; + } + if (Reg) { + OS << getQualifiedName(Reg->TheDef) << ",\n"; } else { - OS << "OPC_EmitRegister, " << getEnumName(Matcher->getVT()) << ", "; - if (Reg) { - OS << getQualifiedName(Reg->TheDef) << ",\n"; - } else { - OS << "0 "; - if (!OmitComments) - OS << "/*zero_reg*/"; - OS << ",\n"; - } - return 3; + OS << "0 "; + if (!OmitComments) + OS << "/*zero_reg*/"; + OS << ",\n"; } + return OpBytes + 1; } case Matcher::EmitConvertToTarget: {