aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Gaeke <gaeke@uiuc.edu>2004-04-07 16:41:22 +0000
committerBrian Gaeke <gaeke@uiuc.edu>2004-04-07 16:41:22 +0000
commitd54c38b2f46208d79e0da536c38c9ae65cba0f96 (patch)
treeb6cddfc62ffc4609a04856e1edb06a6841ffd114
parent9f01e8a28ddc8d8fde3e8ae446210a6387c829e6 (diff)
It's setting up the call args right now, but on the callee side, it's
trying to get incoming args off the stack, instead of the %i0...%i6 regs, which is wrong. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12756 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/Sparc/InstSelectSimple.cpp14
-rw-r--r--lib/Target/Sparc/SparcV8ISelSimple.cpp14
-rw-r--r--lib/Target/SparcV8/InstSelectSimple.cpp14
-rw-r--r--lib/Target/SparcV8/SparcV8ISelSimple.cpp14
4 files changed, 52 insertions, 4 deletions
diff --git a/lib/Target/Sparc/InstSelectSimple.cpp b/lib/Target/Sparc/InstSelectSimple.cpp
index cd847bfba8..48a101a552 100644
--- a/lib/Target/Sparc/InstSelectSimple.cpp
+++ b/lib/Target/Sparc/InstSelectSimple.cpp
@@ -254,7 +254,18 @@ bool V8ISel::runOnFunction(Function &Fn) {
}
void V8ISel::visitCallInst(CallInst &I) {
- assert (I.getNumOperands () == 1 && "Can't handle call args yet");
+ assert (I.getNumOperands () < 8
+ && "Can't handle pushing excess call args on the stack yet");
+ static const unsigned IncomingArgRegs[] = { V8::O0, V8::O1, V8::O2, V8::O3,
+ V8::O4, V8::O5 };
+ for (unsigned i = 1; i < 7; ++i)
+ if (i < I.getNumOperands ()) {
+ unsigned ArgReg = getReg (I.getOperand (i));
+ // Schlep it over into the incoming arg register
+ BuildMI (BB, V8::ORrr, 2, IncomingArgRegs[i]).addReg (V8::G0)
+ .addReg (ArgReg);
+ }
+
unsigned DestReg = getReg (I);
BuildMI (BB, V8::CALL, 1).addPCDisp (I.getOperand (0));
if (I.getType ()->getPrimitiveID () == Type::VoidTyID)
@@ -405,6 +416,7 @@ void V8ISel::visitSetCondInst(Instruction &I) {
case Instruction::SetGT:
case Instruction::SetLE:
case Instruction::SetGE:
+ ;
}
// FIXME: We need either conditional moves like the V9 has (e.g. movge), or we
diff --git a/lib/Target/Sparc/SparcV8ISelSimple.cpp b/lib/Target/Sparc/SparcV8ISelSimple.cpp
index cd847bfba8..48a101a552 100644
--- a/lib/Target/Sparc/SparcV8ISelSimple.cpp
+++ b/lib/Target/Sparc/SparcV8ISelSimple.cpp
@@ -254,7 +254,18 @@ bool V8ISel::runOnFunction(Function &Fn) {
}
void V8ISel::visitCallInst(CallInst &I) {
- assert (I.getNumOperands () == 1 && "Can't handle call args yet");
+ assert (I.getNumOperands () < 8
+ && "Can't handle pushing excess call args on the stack yet");
+ static const unsigned IncomingArgRegs[] = { V8::O0, V8::O1, V8::O2, V8::O3,
+ V8::O4, V8::O5 };
+ for (unsigned i = 1; i < 7; ++i)
+ if (i < I.getNumOperands ()) {
+ unsigned ArgReg = getReg (I.getOperand (i));
+ // Schlep it over into the incoming arg register
+ BuildMI (BB, V8::ORrr, 2, IncomingArgRegs[i]).addReg (V8::G0)
+ .addReg (ArgReg);
+ }
+
unsigned DestReg = getReg (I);
BuildMI (BB, V8::CALL, 1).addPCDisp (I.getOperand (0));
if (I.getType ()->getPrimitiveID () == Type::VoidTyID)
@@ -405,6 +416,7 @@ void V8ISel::visitSetCondInst(Instruction &I) {
case Instruction::SetGT:
case Instruction::SetLE:
case Instruction::SetGE:
+ ;
}
// FIXME: We need either conditional moves like the V9 has (e.g. movge), or we
diff --git a/lib/Target/SparcV8/InstSelectSimple.cpp b/lib/Target/SparcV8/InstSelectSimple.cpp
index cd847bfba8..48a101a552 100644
--- a/lib/Target/SparcV8/InstSelectSimple.cpp
+++ b/lib/Target/SparcV8/InstSelectSimple.cpp
@@ -254,7 +254,18 @@ bool V8ISel::runOnFunction(Function &Fn) {
}
void V8ISel::visitCallInst(CallInst &I) {
- assert (I.getNumOperands () == 1 && "Can't handle call args yet");
+ assert (I.getNumOperands () < 8
+ && "Can't handle pushing excess call args on the stack yet");
+ static const unsigned IncomingArgRegs[] = { V8::O0, V8::O1, V8::O2, V8::O3,
+ V8::O4, V8::O5 };
+ for (unsigned i = 1; i < 7; ++i)
+ if (i < I.getNumOperands ()) {
+ unsigned ArgReg = getReg (I.getOperand (i));
+ // Schlep it over into the incoming arg register
+ BuildMI (BB, V8::ORrr, 2, IncomingArgRegs[i]).addReg (V8::G0)
+ .addReg (ArgReg);
+ }
+
unsigned DestReg = getReg (I);
BuildMI (BB, V8::CALL, 1).addPCDisp (I.getOperand (0));
if (I.getType ()->getPrimitiveID () == Type::VoidTyID)
@@ -405,6 +416,7 @@ void V8ISel::visitSetCondInst(Instruction &I) {
case Instruction::SetGT:
case Instruction::SetLE:
case Instruction::SetGE:
+ ;
}
// FIXME: We need either conditional moves like the V9 has (e.g. movge), or we
diff --git a/lib/Target/SparcV8/SparcV8ISelSimple.cpp b/lib/Target/SparcV8/SparcV8ISelSimple.cpp
index cd847bfba8..48a101a552 100644
--- a/lib/Target/SparcV8/SparcV8ISelSimple.cpp
+++ b/lib/Target/SparcV8/SparcV8ISelSimple.cpp
@@ -254,7 +254,18 @@ bool V8ISel::runOnFunction(Function &Fn) {
}
void V8ISel::visitCallInst(CallInst &I) {
- assert (I.getNumOperands () == 1 && "Can't handle call args yet");
+ assert (I.getNumOperands () < 8
+ && "Can't handle pushing excess call args on the stack yet");
+ static const unsigned IncomingArgRegs[] = { V8::O0, V8::O1, V8::O2, V8::O3,
+ V8::O4, V8::O5 };
+ for (unsigned i = 1; i < 7; ++i)
+ if (i < I.getNumOperands ()) {
+ unsigned ArgReg = getReg (I.getOperand (i));
+ // Schlep it over into the incoming arg register
+ BuildMI (BB, V8::ORrr, 2, IncomingArgRegs[i]).addReg (V8::G0)
+ .addReg (ArgReg);
+ }
+
unsigned DestReg = getReg (I);
BuildMI (BB, V8::CALL, 1).addPCDisp (I.getOperand (0));
if (I.getType ()->getPrimitiveID () == Type::VoidTyID)
@@ -405,6 +416,7 @@ void V8ISel::visitSetCondInst(Instruction &I) {
case Instruction::SetGT:
case Instruction::SetLE:
case Instruction::SetGE:
+ ;
}
// FIXME: We need either conditional moves like the V9 has (e.g. movge), or we