We add if-else statement here to check if the arguement is passed in register or memory. According to UniCore32-ABI [1], the first four arguements are passed in r0 - r3 registers. We only deal with i32 arguement at this moment. i8 and i16 needed to be addressed in the future by using unsigned extension. [1] http://mprc.pku.edu.cn/~guanxuetao/linux/manual/UniCore32-ABI-1.1.0-UC4.pdf Signed-off-by: Chen Wei-Ren <chenwj@xxxxxxxxxxxxxxxxx> --- lib/Target/UniCore/UniCoreISelLowering.cpp | 41 +++++++++++++++++++++++----- 1 files changed, 34 insertions(+), 7 deletions(-) diff --git a/lib/Target/UniCore/UniCoreISelLowering.cpp b/lib/Target/UniCore/UniCoreISelLowering.cpp index 07ec567..7e9daee 100644 --- a/lib/Target/UniCore/UniCoreISelLowering.cpp +++ b/lib/Target/UniCore/UniCoreISelLowering.cpp @@ -96,13 +96,40 @@ UniCoreTargetLowering::LowerCCCArguments(SDValue Chain, for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) { CCValAssign &VA = ArgLocs[i]; - unsigned ObjSize = VA.getLocVT().getSizeInBits()/8; - - int FI = MFI->CreateFixedObject(ObjSize, VA.getLocMemOffset(), true); - SDValue FIN = DAG.getFrameIndex(FI, MVT::i32); - InVals.push_back(DAG.getLoad(VA.getLocVT(), dl, Chain, FIN, - MachinePointerInfo::getFixedStack(FI), - false, false, false, 0)); + if (VA.isRegLoc()) { + // Arguments passed in registers + EVT RegVT = VA.getLocVT(); + switch (RegVT.getSimpleVT().SimpleTy) { + default: + { +#ifndef NDEBUG + errs() << "LowerFormalArguments Unhandled argument type: " + << RegVT.getSimpleVT().SimpleTy << "\n"; +#endif + llvm_unreachable(0); + } + case MVT::i32: + unsigned VReg = RegInfo.createVirtualRegister(&UniCore::GPRRegsRegClass); + RegInfo.addLiveIn(VA.getLocReg(), VReg); + SDValue ArgValue = DAG.getCopyFromReg(Chain, dl, VReg, RegVT); + + if (VA.getLocInfo() != CCValAssign::Full) + ArgValue = DAG.getNode(ISD::TRUNCATE, dl, VA.getValVT(), ArgValue); + + InVals.push_back(ArgValue); + } + } else { + // Sanity check + assert(VA.isMemLoc()); + + unsigned ObjSize = VA.getLocVT().getSizeInBits()/8; + + int FI = MFI->CreateFixedObject(ObjSize, VA.getLocMemOffset(), true); + SDValue FIN = DAG.getFrameIndex(FI, MVT::i32); + InVals.push_back(DAG.getLoad(VA.getLocVT(), dl, Chain, FIN, + MachinePointerInfo::getFixedStack(FI), + false, false, false, 0)); + } } return Chain; -- 1.7.3.4