initial prologue and epilogue implementation. Need to define add and sub before finis...
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 18 Jul 2006 17:00:30 +0000 (17:00 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 18 Jul 2006 17:00:30 +0000 (17:00 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29175 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMInstrInfo.td
lib/Target/ARM/ARMRegisterInfo.cpp

index 15a57c5a83dfb2552b13dffa4a69450100320d5d..4cf5acce849b31bc3ccddf7b7efe9c6781fc6913 100644 (file)
@@ -53,7 +53,9 @@ def ADJCALLSTACKDOWN : InstARM<(ops i32imm:$amt),
                                "!ADJCALLSTACKDOWN $amt",
                                [(callseq_start imm:$amt)]>;
 
-def bxr: InstARM<(ops IntRegs:$dst), "bx $dst", [(brind IntRegs:$dst)]>;
+let isReturn = 1 in {
+  def bx: InstARM<(ops IntRegs:$dst), "bx $dst", [(brind IntRegs:$dst)]>;
+}
 
 def bl: InstARM<(ops i32imm:$func, variable_ops), "bl $func", [(ARMcall tglobaladdr:$func)]>;
 
index e7e1690596fe97c1ead682c0bd45a56bf1aec4a1..8daf06579489bf5e806d16a254bf2678d2b74fed 100644 (file)
@@ -116,10 +116,30 @@ void ARMRegisterInfo::
 processFunctionBeforeFrameFinalized(MachineFunction &MF) const {}
 
 void ARMRegisterInfo::emitPrologue(MachineFunction &MF) const {
+  MachineBasicBlock &MBB = MF.front();
+  MachineFrameInfo  *MFI = MF.getFrameInfo();
+  int           NumBytes = (int) MFI->getStackSize();
+
+  //hack
+  assert(NumBytes == 0);
+
+  //add a sp = sp - 4
+  BuildMI(MBB, MBB.begin(), ARM::str, 1, ARM::R14).addReg(ARM::R13);
 }
 
 void ARMRegisterInfo::emitEpilogue(MachineFunction &MF,
                                   MachineBasicBlock &MBB) const {
+  MachineBasicBlock::iterator MBBI = prior(MBB.end());
+  assert(MBBI->getOpcode() == ARM::bx &&
+         "Can only insert epilog into returning blocks");
+
+  MachineFrameInfo *MFI = MF.getFrameInfo();
+  int          NumBytes = (int) MFI->getStackSize();
+  //hack
+  assert(NumBytes == 0);
+
+  BuildMI(MBB, MBBI, ARM::ldr, 2, ARM::R14).addImm(0).addReg(ARM::R13);
+  //add a sp = sp + 4
 }
 
 unsigned ARMRegisterInfo::getRARegister() const {