forked from OSchip/llvm-project
TableGen: Support physical register inputs > 255
This was truncating register value that didn't fit in unsigned char. Switch AMDGPU sendmsg intrinsics to using a tablegen pattern. llvm-svn: 366695
This commit is contained in:
parent
1b2da771f5
commit
542720b2bc
|
@ -162,6 +162,7 @@ public:
|
|||
OPC_EmitMergeInputChains1_1,
|
||||
OPC_EmitMergeInputChains1_2,
|
||||
OPC_EmitCopyToReg,
|
||||
OPC_EmitCopyToReg2,
|
||||
OPC_EmitNodeXForm,
|
||||
OPC_EmitNode,
|
||||
// Space-optimized forms that implicitly encode number of result VTs.
|
||||
|
|
|
@ -3323,10 +3323,13 @@ void SelectionDAGISel::SelectCodeCommon(SDNode *NodeToMatch,
|
|||
continue;
|
||||
}
|
||||
|
||||
case OPC_EmitCopyToReg: {
|
||||
case OPC_EmitCopyToReg:
|
||||
case OPC_EmitCopyToReg2: {
|
||||
unsigned RecNo = MatcherTable[MatcherIndex++];
|
||||
assert(RecNo < RecordedNodes.size() && "Invalid EmitCopyToReg");
|
||||
unsigned DestPhysReg = MatcherTable[MatcherIndex++];
|
||||
if (Opcode == OPC_EmitCopyToReg2)
|
||||
DestPhysReg |= MatcherTable[MatcherIndex++] << 8;
|
||||
|
||||
if (!InputChain.getNode())
|
||||
InputChain = CurDAG->getEntryNode();
|
||||
|
|
|
@ -932,13 +932,15 @@ private:
|
|||
///
|
||||
class EmitCopyToRegMatcher : public Matcher {
|
||||
unsigned SrcSlot; // Value to copy into the physreg.
|
||||
Record *DestPhysReg;
|
||||
const CodeGenRegister *DestPhysReg;
|
||||
|
||||
public:
|
||||
EmitCopyToRegMatcher(unsigned srcSlot, Record *destPhysReg)
|
||||
EmitCopyToRegMatcher(unsigned srcSlot,
|
||||
const CodeGenRegister *destPhysReg)
|
||||
: Matcher(EmitCopyToReg), SrcSlot(srcSlot), DestPhysReg(destPhysReg) {}
|
||||
|
||||
unsigned getSrcSlot() const { return SrcSlot; }
|
||||
Record *getDestPhysReg() const { return DestPhysReg; }
|
||||
const CodeGenRegister *getDestPhysReg() const { return DestPhysReg; }
|
||||
|
||||
static bool classof(const Matcher *N) {
|
||||
return N->getKind() == EmitCopyToReg;
|
||||
|
|
|
@ -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()) << ", "
|
||||
|
|
|
@ -867,9 +867,13 @@ EmitResultInstructionAsOperand(const TreePatternNode *N,
|
|||
if (isRoot && !PhysRegInputs.empty()) {
|
||||
// Emit all of the CopyToReg nodes for the input physical registers. These
|
||||
// occur in patterns like (mul:i8 AL:i8, GR8:i8:$src).
|
||||
for (unsigned i = 0, e = PhysRegInputs.size(); i != e; ++i)
|
||||
for (unsigned i = 0, e = PhysRegInputs.size(); i != e; ++i) {
|
||||
const CodeGenRegister *Reg =
|
||||
CGP.getTargetInfo().getRegBank().getReg(PhysRegInputs[i].first);
|
||||
AddMatcher(new EmitCopyToRegMatcher(PhysRegInputs[i].second,
|
||||
PhysRegInputs[i].first));
|
||||
Reg));
|
||||
}
|
||||
|
||||
// Even if the node has no other glue inputs, the resultant node must be
|
||||
// glued to the CopyFromReg nodes we just generated.
|
||||
TreeHasInGlue = true;
|
||||
|
|
Loading…
Reference in New Issue