diff options
Diffstat (limited to 'lib/Target')
-rw-r--r-- | lib/Target/PTX/PTXISelLowering.cpp | 23 | ||||
-rw-r--r-- | lib/Target/PTX/PTXISelLowering.h | 3 | ||||
-rw-r--r-- | lib/Target/PTX/PTXInstrInfo.td | 3 |
3 files changed, 27 insertions, 2 deletions
diff --git a/lib/Target/PTX/PTXISelLowering.cpp b/lib/Target/PTX/PTXISelLowering.cpp index 9d7e34434e..d38abf1a3c 100644 --- a/lib/Target/PTX/PTXISelLowering.cpp +++ b/lib/Target/PTX/PTXISelLowering.cpp @@ -32,6 +32,7 @@ const char *PTXTargetLowering::getTargetNodeName(unsigned Opcode) const { switch (Opcode) { default: llvm_unreachable("Unknown opcode"); case PTXISD::EXIT: return "PTXISD::EXIT"; + case PTXISD::RET: return "PTXISD::RET"; } } @@ -58,5 +59,25 @@ SDValue PTXTargetLowering:: const SmallVectorImpl<SDValue> &OutVals, DebugLoc dl, SelectionDAG &DAG) const { - return DAG.getNode(PTXISD::EXIT, dl, MVT::Other, Chain); + assert(!isVarArg && "PTX does not support var args."); + + switch (CallConv) { + default: + llvm_unreachable("Unsupported calling convention."); + case CallingConv::PTX_Kernel: + assert(Outs.size() == 0 && "Kernel must return void."); + return DAG.getNode(PTXISD::EXIT, dl, MVT::Other, Chain); + case CallingConv::PTX_Device: + assert(Outs.size() <= 1 && "Can at most return one value."); + break; + } + + // PTX_Device + + if (Outs.size() == 0) + return DAG.getNode(PTXISD::RET, dl, MVT::Other, Chain); + + // TODO: allocate return register + SDValue Flag; + return DAG.getNode(PTXISD::RET, dl, MVT::Other, Chain, Flag); } diff --git a/lib/Target/PTX/PTXISelLowering.h b/lib/Target/PTX/PTXISelLowering.h index d0978e76a8..68badf538c 100644 --- a/lib/Target/PTX/PTXISelLowering.h +++ b/lib/Target/PTX/PTXISelLowering.h @@ -24,7 +24,8 @@ class PTXTargetMachine; namespace PTXISD { enum NodeType { FIRST_NUMBER = ISD::BUILTIN_OP_END, - EXIT + EXIT, + RET }; } // namespace PTXISD diff --git a/lib/Target/PTX/PTXInstrInfo.td b/lib/Target/PTX/PTXInstrInfo.td index 758eff67ba..3698c9dfc4 100644 --- a/lib/Target/PTX/PTXInstrInfo.td +++ b/lib/Target/PTX/PTXInstrInfo.td @@ -23,6 +23,8 @@ include "PTXInstrFormats.td" def PTXexit : SDNode<"PTXISD::EXIT", SDTNone, [SDNPHasChain]>; +def PTXret + : SDNode<"PTXISD::RET", SDTNone, [SDNPHasChain]>; //===----------------------------------------------------------------------===// // Instructions @@ -30,4 +32,5 @@ def PTXexit let isReturn = 1, isTerminator = 1, isBarrier = 1 in { def EXIT : InstPTX<(outs), (ins), "exit", [(PTXexit)]>; + def RET : InstPTX<(outs), (ins), "ret", [(PTXret)]>; } |