forked from OSchip/llvm-project
parent
58159b36a3
commit
f5ce475540
|
@ -148,6 +148,12 @@ static SDOperand LowerCALL(SDOperand Op, SelectionDAG &DAG) {
|
|||
Ops.push_back(Chain);
|
||||
Ops.push_back(Callee);
|
||||
|
||||
// Add argument registers to the end of the list so that they are known live
|
||||
// into the call.
|
||||
for (unsigned i = 0, e = RegsToPass.size(); i != e; ++i)
|
||||
Ops.push_back(DAG.getRegister(RegsToPass[i].first,
|
||||
RegsToPass[i].second.getValueType()));
|
||||
|
||||
unsigned CallOpc = ARMISD::CALL;
|
||||
if (InFlag.Val)
|
||||
Ops.push_back(InFlag);
|
||||
|
|
|
@ -31,9 +31,8 @@ void ARMRegisterInfo::
|
|||
storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
|
||||
unsigned SrcReg, int FI,
|
||||
const TargetRegisterClass *RC) const {
|
||||
// On the order of operands here: think "[FI + 0] = SrcReg".
|
||||
assert (RC == ARM::IntRegsRegisterClass);
|
||||
BuildMI(MBB, I, ARM::str, 3).addFrameIndex(FI).addImm(0).addReg(SrcReg);
|
||||
BuildMI(MBB, I, ARM::str, 3).addReg(SrcReg).addImm(0).addFrameIndex(FI);
|
||||
}
|
||||
|
||||
void ARMRegisterInfo::
|
||||
|
@ -41,7 +40,7 @@ loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
|
|||
unsigned DestReg, int FI,
|
||||
const TargetRegisterClass *RC) const {
|
||||
assert (RC == ARM::IntRegsRegisterClass);
|
||||
BuildMI(MBB, I, ARM::ldr, 2, DestReg).addFrameIndex(FI).addImm(0);
|
||||
BuildMI(MBB, I, ARM::ldr, 2, DestReg).addImm(0).addFrameIndex(FI);
|
||||
}
|
||||
|
||||
void ARMRegisterInfo::copyRegToReg(MachineBasicBlock &MBB,
|
||||
|
@ -81,7 +80,8 @@ ARMRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II) const {
|
|||
MachineBasicBlock &MBB = *MI.getParent();
|
||||
MachineFunction &MF = *MBB.getParent();
|
||||
|
||||
assert (MI.getOpcode() == ARM::ldr);
|
||||
assert (MI.getOpcode() == ARM::ldr ||
|
||||
MI.getOpcode() == ARM::str);
|
||||
|
||||
unsigned FrameIdx = 2;
|
||||
unsigned OffIdx = 1;
|
||||
|
@ -93,6 +93,11 @@ ARMRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II) const {
|
|||
|
||||
unsigned StackSize = MF.getFrameInfo()->getStackSize();
|
||||
|
||||
//<hack>
|
||||
if (Offset < 0)
|
||||
Offset -= 4;
|
||||
//</hack>
|
||||
|
||||
Offset += StackSize;
|
||||
|
||||
assert (Offset >= 0);
|
||||
|
@ -121,9 +126,6 @@ void ARMRegisterInfo::emitPrologue(MachineFunction &MF) const {
|
|||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
int NumBytes = (int) MFI->getStackSize();
|
||||
|
||||
//hack
|
||||
assert(NumBytes == 0);
|
||||
|
||||
if (MFI->hasCalls()) {
|
||||
// We reserve argument space for call sites in the function immediately on
|
||||
// entry to the current function. This eliminates the need for add/sub
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
; RUN: llvm-as < %s | llc -march=arm
|
||||
; RUN: llvm-as < %s | llc -march=arm
|
||||
%str = internal constant [43 x sbyte] c"Hello World %d %d %d %d %d %d %d %d %d %d\0A\00" ; <[43 x sbyte]*> [#uses=1]
|
||||
|
||||
implementation ; Functions:
|
||||
|
@ -6,7 +6,8 @@ implementation ; Functions:
|
|||
int %main() {
|
||||
entry:
|
||||
%tmp = call int (sbyte*, ...)* %printf( sbyte* getelementptr ([43 x sbyte]* %str, int 0, uint 0), int 1, int 2, int 3, int 4, int 5, int 6, int 7, int 8, int 9, int 10 ) ; <int> [#uses=0]
|
||||
ret int 0
|
||||
%tmp2 = call int (sbyte*, ...)* %printf( sbyte* getelementptr ([43 x sbyte]* %str, int 0, uint 0), int 10, int 9, int 8, int 7, int 6, int 5, int 4, int 3, int 2, int 1 ) ; <int> [#uses=0]
|
||||
ret int 11
|
||||
}
|
||||
|
||||
declare int %printf(sbyte*, ...)
|
||||
|
|
Loading…
Reference in New Issue