Implemented functions for emitting prologues and epilogues;
authorMisha Brukman <brukman+llvm@gmail.com>
Wed, 4 Dec 2002 23:57:03 +0000 (23:57 +0000)
committerMisha Brukman <brukman+llvm@gmail.com>
Wed, 4 Dec 2002 23:57:03 +0000 (23:57 +0000)
removed EBP from the list of callee-saved registers (it isn't one).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4929 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86RegisterInfo.cpp
lib/Target/X86/X86RegisterInfo.h

index ef4fce5e96580d54594529e1349e883df4f22661..a1ed317bd681cee49e4e54bd2352f3381917e029 100644 (file)
@@ -58,7 +58,7 @@ unsigned X86RegisterInfo::getStackPointer() const {
 }
 
 const unsigned* X86RegisterInfo::getCalleeSaveRegs() const {
-  static const unsigned CalleeSaveRegs[] = { X86::ESI, X86::EDI, X86::EBX, X86::EBP,
+  static const unsigned CalleeSaveRegs[] = { X86::ESI, X86::EDI, X86::EBX,
                                              MRegisterInfo::NoRegister };
   return CalleeSaveRegs;
 }
@@ -69,3 +69,56 @@ const unsigned* X86RegisterInfo::getCallerSaveRegs() const {
                                              MRegisterInfo::NoRegister };
   return CallerSaveRegs;
 }
+
+MachineBasicBlock::iterator 
+X86RegisterInfo::emitPrologue(MachineBasicBlock *MBB,
+                              MachineBasicBlock::iterator MBBI,
+                              unsigned numBytes) const
+{
+  MachineInstr *MI;
+
+  // PUSH ebp
+  MI = BuildMI (X86::PUSHr32, 1).addReg(X86::EBP);
+  MBBI = ++(MBB->insert(MBBI, MI));
+
+  // MOV ebp, esp
+  MI = BuildMI (X86::MOVrr32, 2).addReg(X86::EBP).addReg(X86::ESP);
+  MBBI = ++(MBB->insert(MBBI, MI));  
+
+  // adjust stack pointer
+  MI  = BuildMI(X86::SUBri32, 2).addReg(X86::ESP).addZImm(numBytes);
+  MBBI = ++(MBB->insert(MBBI, MI));
+
+  // PUSH all callee-save registers
+  const unsigned* regs = getCalleeSaveRegs();
+  while (*regs) {
+    MI = BuildMI(X86::PUSHr32, 1).addReg(*regs);
+    MBBI = ++(MBB->insert(MBBI, MI));
+    ++regs;
+  }
+
+  return MBBI;
+}
+
+MachineBasicBlock::iterator
+X86RegisterInfo::emitEpilogue(MachineBasicBlock *MBB,
+                              MachineBasicBlock::iterator MBBI,
+                              unsigned numBytes) const
+{
+  MachineInstr *MI;
+
+  // POP all callee-save registers in REVERSE ORDER
+  static const unsigned regs[] = { X86::EBX, X86::EDI, X86::ESI,
+                                   MRegisterInfo::NoRegister };
+  unsigned idx = 0;
+  while (regs[idx]) {
+    MI = BuildMI(X86::POPr32, 1).addReg(regs[idx++]);
+    MBBI = ++(MBB->insert(MBBI, MI));
+  }
+  
+  // insert LEAVE
+  MI = BuildMI(X86::LEAVE, 0);
+  MBBI = ++(MBB->insert(MBBI, MI));
+  
+  return MBBI;
+}
index be3cbc09bc1909df623dd46f556ca52ba082c26b..76950e8d8897163ab638b37760c444e2005369a3 100644 (file)
@@ -35,6 +35,14 @@ struct X86RegisterInfo : public MRegisterInfo {
   const unsigned* getCalleeSaveRegs() const;
   const unsigned* getCallerSaveRegs() const;
 
+  MachineBasicBlock::iterator emitPrologue(MachineBasicBlock *MBB,
+                                           MachineBasicBlock::iterator MBBI,
+                                           unsigned numBytes) const;
+
+  MachineBasicBlock::iterator emitEpilogue(MachineBasicBlock *MBB,
+                                           MachineBasicBlock::iterator MBBI,
+                                           unsigned numBytes) const;
+
   /// Returns register class appropriate for input SSA register
   /// 
   const TargetRegisterClass *getClassForReg(unsigned Reg) const;