summaryrefslogtreecommitdiff
path: root/lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp
diff options
context:
space:
mode:
authorJustin Holewinski <jholewinski@nvidia.com>2013-06-28 17:58:04 +0000
committerJustin Holewinski <jholewinski@nvidia.com>2013-06-28 17:58:04 +0000
commitef0ccc93203e99077632cec7a0a15b8e1b704aee (patch)
tree7ac6c8ef44c8dfec014737475d1480b32729b5e4 /lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp
parent1c07dae9fcd04469779edf7b86fef37fecc9466c (diff)
downloadllvm-ef0ccc93203e99077632cec7a0a15b8e1b704aee.tar.gz
llvm-ef0ccc93203e99077632cec7a0a15b8e1b704aee.tar.bz2
llvm-ef0ccc93203e99077632cec7a0a15b8e1b704aee.tar.xz
[NVPTX] Clean up comparison/select/convert patterns and factor out PTX instructions from their patterns
Test case is no breakage git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185175 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp')
-rw-r--r--lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp23
1 files changed, 19 insertions, 4 deletions
diff --git a/lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp b/lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp
index 7a0a59f1ce..4457ec349c 100644
--- a/lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp
+++ b/lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp
@@ -1965,13 +1965,28 @@ SDNode *NVPTXDAGToDAGISel::SelectStoreParam(SDNode *N) {
break;
}
break;
- case NVPTXISD::StoreParamU32:
- Opcode = NVPTX::StoreParamU32I16;
+ // Special case: if we have a sign-extend/zero-extend node, insert the
+ // conversion instruction first, and use that as the value operand to
+ // the selected StoreParam node.
+ case NVPTXISD::StoreParamU32: {
+ Opcode = NVPTX::StoreParamI32;
+ SDValue CvtNone = CurDAG->getTargetConstant(NVPTX::PTXCvtMode::NONE,
+ MVT::i32);
+ SDNode *Cvt = CurDAG->getMachineNode(NVPTX::CVT_u32_u16, DL,
+ MVT::i32, Ops[0], CvtNone);
+ Ops[0] = SDValue(Cvt, 0);
break;
- case NVPTXISD::StoreParamS32:
- Opcode = NVPTX::StoreParamS32I16;
+ }
+ case NVPTXISD::StoreParamS32: {
+ Opcode = NVPTX::StoreParamI32;
+ SDValue CvtNone = CurDAG->getTargetConstant(NVPTX::PTXCvtMode::NONE,
+ MVT::i32);
+ SDNode *Cvt = CurDAG->getMachineNode(NVPTX::CVT_s32_s16, DL,
+ MVT::i32, Ops[0], CvtNone);
+ Ops[0] = SDValue(Cvt, 0);
break;
}
+ }
SDNode *Ret =
CurDAG->getMachineNode(Opcode, DL, N->getVTList(), Ops);