[llvm-commits] CVS: llvm/lib/Target/SparcV8/SparcV8ISelPattern.cpp
Andrew Lenharth
alenhar2 at cs.uiuc.edu
Mon Jun 27 17:00:02 PDT 2005
Changes in directory llvm/lib/Target/SparcV8:
SparcV8ISelPattern.cpp updated: 1.1 -> 1.2
---
Log message:
some call work
---
Diffs of the changes: (+64 -1)
SparcV8ISelPattern.cpp | 65 ++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 64 insertions(+), 1 deletion(-)
Index: llvm/lib/Target/SparcV8/SparcV8ISelPattern.cpp
diff -u llvm/lib/Target/SparcV8/SparcV8ISelPattern.cpp:1.1 llvm/lib/Target/SparcV8/SparcV8ISelPattern.cpp:1.2
--- llvm/lib/Target/SparcV8/SparcV8ISelPattern.cpp:1.1 Fri Jun 17 11:52:12 2005
+++ llvm/lib/Target/SparcV8/SparcV8ISelPattern.cpp Mon Jun 27 18:59:51 2005
@@ -119,7 +119,8 @@
std::vector<SDOperand>
V8TargetLowering::LowerArguments(Function &F, SelectionDAG &DAG)
{
- //FIXME
+ static const unsigned IncomingArgRegs[] =
+ { V8::I0, V8::I1, V8::I2, V8::I3, V8::I4, V8::I5 };
std::vector<SDOperand> ArgValues;
MachineFunction &MF = DAG.getMachineFunction();
@@ -127,6 +128,68 @@
MachineBasicBlock& BB = MF.front();
+ unsigned ArgNo = 0;
+ unsigned ArgOffset = 92;
+ for (Function::arg_iterator I = F.arg_begin(), E = F.arg_end();
+ I != E; ++I, ++ArgNo) {
+ MVT::ValueType VT = getValueType(I->getType());
+ SDOperand argt;
+ if (ArgNo < 6) {
+ switch(VT) {
+ default:
+ std::cerr << "Unknown Type " << VT << "\n";
+ abort();
+ case MVT::f64:
+ case MVT::i64:
+ //FIXME: figure out the build pair thing
+ assert(0 && "doubles and longs not supported yet");
+ case MVT::f32:
+ argt = DAG.getCopyFromReg(AddLiveIn(MF, IncomingArgRegs[ArgNo],
+ MVT::i32),
+ VT, DAG.getRoot());
+ //copy out of Int reg
+ argt = DAG.getNode(ISD::FP_TO_UINT, MVT::f32, argt);
+ break;
+ case MVT::i1:
+ case MVT::i8:
+ case MVT::i16:
+ case MVT::i32:
+ argt = DAG.getCopyFromReg(AddLiveIn(MF, IncomingArgRegs[ArgNo],
+ getRegClassFor(MVT::i32)),
+ VT, DAG.getRoot());
+ if (VT != MVT::i32)
+ argt = DAG.getNode(ISD::TRUNCATE, VT, argt);
+ break;
+ }
+ DAG.setRoot(argt.getValue(1));
+ } else {
+ //stack passed
+ switch(VT) {
+ default:
+ std::cerr << "Unknown Type " << VT << "\n";
+ abort();
+ case MVT::f64:
+ case MVT::i64:
+ //FIXME: figure out the build pair thing
+ assert(0 && "doubles and longs not supported yet");
+ case MVT::f32:
+ case MVT::i1:
+ case MVT::i8:
+ case MVT::i16:
+ case MVT::i32:
+ // Create the frame index object for this incoming parameter...
+ int FI = MFI->CreateFixedObject(4, ArgOffset);
+ argt = DAG.getLoad(VT,
+ DAG.getEntryNode(),
+ DAG.getFramIndex(FI, MVT::i32),
+ DAG.getSrcValue(NULL));
+ ArgOffset += 4;
+ break;
+ }
+ ArgValues.push_back(argt);
+ }
+ }
+
//return the arguments
return ArgValues;
}
More information about the llvm-commits
mailing list