- 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);