Deal with call return values.
Don't put NOPs in delay slots at all. We'll have a fix-up pass later.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12725 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/Sparc/InstSelectSimple.cpp b/lib/Target/Sparc/InstSelectSimple.cpp
index 05a1920..8ae5a0c 100644
--- a/lib/Target/Sparc/InstSelectSimple.cpp
+++ b/lib/Target/Sparc/InstSelectSimple.cpp
@@ -229,8 +229,22 @@
 
 void V8ISel::visitCallInst(CallInst &I) {
   assert (I.getNumOperands () == 1 && "Can't handle call args yet");
+  unsigned DestReg = getReg (I);
   BuildMI (BB, V8::CALL, 1).addPCDisp (I.getOperand (0));
-  BuildMI (BB, V8::NOP, 0); // NOP in delay slot
+  if (I.getType ()->getPrimitiveID () == Type::VoidTyID)
+    return;
+  // Deal w/ return value
+  switch (getClass (I.getType ())) {
+    case cByte:
+    case cShort:
+    case cInt:
+      // Schlep it over into the destination register
+      BuildMI (BB, V8::ORrr, 2, DestReg).addReg(V8::G0).addReg(V8::O0);
+      break;
+    default:
+      visitInstruction (I);
+      return;
+  }
 }
 
 void V8ISel::visitReturnInst(ReturnInst &I) {