diff options
author | Justin Holewinski <jholewinski@nvidia.com> | 2013-06-28 17:58:04 +0000 |
---|---|---|
committer | Justin Holewinski <jholewinski@nvidia.com> | 2013-06-28 17:58:04 +0000 |
commit | ef0ccc93203e99077632cec7a0a15b8e1b704aee (patch) | |
tree | 7ac6c8ef44c8dfec014737475d1480b32729b5e4 /lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp | |
parent | 1c07dae9fcd04469779edf7b86fef37fecc9466c (diff) | |
download | llvm-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.cpp | 23 |
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); |