diff options
author | Andrew Lenharth <andrewl@lenharth.org> | 2005-06-27 23:59:51 +0000 |
---|---|---|
committer | Andrew Lenharth <andrewl@lenharth.org> | 2005-06-27 23:59:51 +0000 |
commit | e014f89f3dfdd7a825536c188f585fec41692d50 (patch) | |
tree | bffa4f59fc357d78b02b3ae63c8debe02f61fb5b /lib/Target/SparcV8/SparcV8ISelPattern.cpp | |
parent | f4b3278aeba23efbeacf6be5c33273e2945be2f2 (diff) |
some call work
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22303 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/SparcV8/SparcV8ISelPattern.cpp')
-rw-r--r-- | lib/Target/SparcV8/SparcV8ISelPattern.cpp | 65 |
1 files changed, 64 insertions, 1 deletions
diff --git a/lib/Target/SparcV8/SparcV8ISelPattern.cpp b/lib/Target/SparcV8/SparcV8ISelPattern.cpp index 98d4f93049..e19e14c12b 100644 --- a/lib/Target/SparcV8/SparcV8ISelPattern.cpp +++ b/lib/Target/SparcV8/SparcV8ISelPattern.cpp @@ -119,7 +119,8 @@ static unsigned AddLiveIn(MachineFunction &MF, unsigned PReg, 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 @@ V8TargetLowering::LowerArguments(Function &F, SelectionDAG &DAG) 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; } |