summaryrefslogtreecommitdiffstats
path: root/llvm/utils/TableGen/DAGISelMatcherEmitter.cpp
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2019-07-22 15:02:34 +0000
committerMatt Arsenault <Matthew.Arsenault@amd.com>2019-07-22 15:02:34 +0000
commit542720b2bc48d243d2eec93157feebc37af0e202 (patch)
tree329e82ce7ea94f5afa8290491bd0debe65636265 /llvm/utils/TableGen/DAGISelMatcherEmitter.cpp
parent1b2da771f561affe36eb5eb0c7a3d2862c5a5c1c (diff)
downloadbcm5719-llvm-542720b2bc48d243d2eec93157feebc37af0e202.tar.gz
bcm5719-llvm-542720b2bc48d243d2eec93157feebc37af0e202.zip
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
Diffstat (limited to 'llvm/utils/TableGen/DAGISelMatcherEmitter.cpp')
-rw-r--r--llvm/utils/TableGen/DAGISelMatcherEmitter.cpp22
1 files changed, 16 insertions, 6 deletions
diff --git a/llvm/utils/TableGen/DAGISelMatcherEmitter.cpp b/llvm/utils/TableGen/DAGISelMatcherEmitter.cpp
index cecbc6cccdf..e9f1fb93d51 100644
--- a/llvm/utils/TableGen/DAGISelMatcherEmitter.cpp
+++ b/llvm/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()) << ", "
OpenPOWER on IntegriCloud