Implement ret with operand, giving us this:
authorChris Lattner <sabre@nondot.org>
Sat, 17 Dec 2005 08:15:09 +0000 (08:15 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 17 Dec 2005 08:15:09 +0000 (08:15 +0000)
int %test(int %A) {
  ret int %A
}

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24773 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Sparc/SparcISelDAGToDAG.cpp
lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp

index fcc07c29f5b01711dd544f1ddc2b77eff8038f78..15a28f22ab8bb5c4b77a3998f316732782dd9c09 100644 (file)
@@ -139,8 +139,15 @@ SparcV8TargetLowering::LowerCallTo(SDOperand Chain, const Type *RetTy,
 
 SDOperand SparcV8TargetLowering::LowerReturnTo(SDOperand Chain, SDOperand Op,
                                                SelectionDAG &DAG) {
-  assert(0 && "Unimp");
-  abort();
+  if (Op.getValueType() == MVT::i64) {
+    SDOperand Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32, Op, 
+                               DAG.getConstant(1, MVT::i32));
+    SDOperand Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32, Op,
+                               DAG.getConstant(0, MVT::i32));
+    return DAG.getNode(ISD::RET, MVT::Other, Chain, Lo, Hi);
+  } else {
+    return DAG.getNode(ISD::RET, MVT::Other, Chain, Op);
+  }
 }
 
 SDOperand SparcV8TargetLowering::LowerVAStart(SDOperand Chain, SDOperand VAListP,
@@ -219,6 +226,30 @@ SDOperand SparcV8DAGToDAGISel::Select(SDOperand Op) {
   
   switch (N->getOpcode()) {
   default: break;
+  case ISD::RET: {
+    if (N->getNumOperands() == 2) {
+      SDOperand Chain = Select(N->getOperand(0));     // Token chain.
+      SDOperand Val = Select(N->getOperand(1));
+      if (N->getOperand(1).getValueType() == MVT::i32) {
+        Chain = CurDAG->getCopyToReg(Chain, V8::I0, Val);
+      } else if (N->getOperand(1).getValueType() == MVT::f32) {
+        Chain = CurDAG->getCopyToReg(Chain, V8::F0, Val);
+      } else {
+        assert(N->getOperand(1).getValueType() == MVT::f64);
+        Chain = CurDAG->getCopyToReg(Chain, V8::D0, Val);
+      }
+      return CurDAG->SelectNodeTo(N, V8::RETL, MVT::Other, Chain);
+    } else if (N->getNumOperands() > 1) {
+      SDOperand Chain = Select(N->getOperand(0));     // Token chain.
+      assert(N->getOperand(1).getValueType() == MVT::i32 &&
+             N->getOperand(2).getValueType() == MVT::i32 &&
+             N->getNumOperands() == 3 && "Unknown two-register ret value!");
+      Chain = CurDAG->getCopyToReg(Chain, V8::I0, Select(N->getOperand(1)));
+      Chain = CurDAG->getCopyToReg(Chain, V8::I1, Select(N->getOperand(2)));
+      return CurDAG->SelectNodeTo(N, V8::RETL, MVT::Other, Chain);
+    }
+    break;  // Generated code handles the void case.
+  }
   }
   
   return SelectCode(Op);
index fcc07c29f5b01711dd544f1ddc2b77eff8038f78..15a28f22ab8bb5c4b77a3998f316732782dd9c09 100644 (file)
@@ -139,8 +139,15 @@ SparcV8TargetLowering::LowerCallTo(SDOperand Chain, const Type *RetTy,
 
 SDOperand SparcV8TargetLowering::LowerReturnTo(SDOperand Chain, SDOperand Op,
                                                SelectionDAG &DAG) {
-  assert(0 && "Unimp");
-  abort();
+  if (Op.getValueType() == MVT::i64) {
+    SDOperand Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32, Op, 
+                               DAG.getConstant(1, MVT::i32));
+    SDOperand Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32, Op,
+                               DAG.getConstant(0, MVT::i32));
+    return DAG.getNode(ISD::RET, MVT::Other, Chain, Lo, Hi);
+  } else {
+    return DAG.getNode(ISD::RET, MVT::Other, Chain, Op);
+  }
 }
 
 SDOperand SparcV8TargetLowering::LowerVAStart(SDOperand Chain, SDOperand VAListP,
@@ -219,6 +226,30 @@ SDOperand SparcV8DAGToDAGISel::Select(SDOperand Op) {
   
   switch (N->getOpcode()) {
   default: break;
+  case ISD::RET: {
+    if (N->getNumOperands() == 2) {
+      SDOperand Chain = Select(N->getOperand(0));     // Token chain.
+      SDOperand Val = Select(N->getOperand(1));
+      if (N->getOperand(1).getValueType() == MVT::i32) {
+        Chain = CurDAG->getCopyToReg(Chain, V8::I0, Val);
+      } else if (N->getOperand(1).getValueType() == MVT::f32) {
+        Chain = CurDAG->getCopyToReg(Chain, V8::F0, Val);
+      } else {
+        assert(N->getOperand(1).getValueType() == MVT::f64);
+        Chain = CurDAG->getCopyToReg(Chain, V8::D0, Val);
+      }
+      return CurDAG->SelectNodeTo(N, V8::RETL, MVT::Other, Chain);
+    } else if (N->getNumOperands() > 1) {
+      SDOperand Chain = Select(N->getOperand(0));     // Token chain.
+      assert(N->getOperand(1).getValueType() == MVT::i32 &&
+             N->getOperand(2).getValueType() == MVT::i32 &&
+             N->getNumOperands() == 3 && "Unknown two-register ret value!");
+      Chain = CurDAG->getCopyToReg(Chain, V8::I0, Select(N->getOperand(1)));
+      Chain = CurDAG->getCopyToReg(Chain, V8::I1, Select(N->getOperand(2)));
+      return CurDAG->SelectNodeTo(N, V8::RETL, MVT::Other, Chain);
+    }
+    break;  // Generated code handles the void case.
+  }
   }
   
   return SelectCode(Op);