Added support for callee- and caller-save registers.
[oota-llvm.git] / lib / Target / X86 / X86RegisterInfo.cpp
1 //===- X86RegisterInfo.cpp - X86 Register Information -----------*- C++ -*-===//
2 //
3 // This file contains the X86 implementation of the MRegisterInfo class.
4 //
5 //===----------------------------------------------------------------------===//
6
7 #include "X86.h"
8 #include "X86RegisterInfo.h"
9 #include "X86InstrBuilder.h"
10 #include "llvm/Constants.h"
11 #include "llvm/Type.h"
12 #include "llvm/CodeGen/MachineInstrBuilder.h"
13
14 // X86Regs - Turn the X86RegisterInfo.def file into a bunch of register
15 // descriptors
16 //
17 static const MRegisterDesc X86Regs[] = {
18 #define R(ENUM, NAME, FLAGS, TSFLAGS) { NAME, FLAGS, TSFLAGS },
19 #include "X86RegisterInfo.def"
20 };
21
22 X86RegisterInfo::X86RegisterInfo()
23   : MRegisterInfo(X86Regs, sizeof(X86Regs)/sizeof(X86Regs[0])) {
24 }
25
26
27 MachineBasicBlock::iterator
28 X86RegisterInfo::storeReg2RegOffset(MachineBasicBlock *MBB,
29                                     MachineBasicBlock::iterator &MBBI,
30                                     unsigned SrcReg, unsigned DestReg, 
31                                     unsigned ImmOffset, unsigned dataSize)
32   const
33 {
34   MachineInstr *MI = addRegOffset(BuildMI(X86::MOVrm32, 5),
35                                   DestReg, ImmOffset).addReg(SrcReg);
36   return ++(MBB->insert(MBBI, MI));
37 }
38
39 MachineBasicBlock::iterator
40 X86RegisterInfo::loadRegOffset2Reg(MachineBasicBlock *MBB,
41                                    MachineBasicBlock::iterator &MBBI,
42                                    unsigned DestReg, unsigned SrcReg,
43                                    unsigned ImmOffset, unsigned dataSize)
44   const
45 {
46   MachineInstr *MI = addRegOffset(BuildMI(X86::MOVmr32, 5).addReg(DestReg),
47                                   SrcReg, ImmOffset);
48   return ++(MBB->insert(MBBI, MI));
49 }
50
51
52 unsigned X86RegisterInfo::getFramePointer() const {
53   return X86::EBP;
54 }
55
56 unsigned X86RegisterInfo::getStackPointer() const {
57   return X86::ESP;
58 }
59
60 const unsigned* X86RegisterInfo::getCalleeSaveRegs() const {
61   static const unsigned CalleeSaveRegs[] = { X86::ESI, X86::EDI, X86::EBX, X86::EBP,
62                                              MRegisterInfo::NoRegister };
63   return CalleeSaveRegs;
64 }
65
66
67 const unsigned* X86RegisterInfo::getCallerSaveRegs() const {
68   static const unsigned CallerSaveRegs[] = { X86::EAX, X86::ECX, X86::EDX,
69                                              MRegisterInfo::NoRegister };
70   return CallerSaveRegs;
71 }
72
73 void
74 X86RegisterInfo::buildReg2RegClassMap
75 (std::map<unsigned,
76  const TargetRegisterClass*>& Reg2RegClassMap) const
77 {
78   for (MRegisterInfo::const_iterator I = const_regclass_begin(),
79          E = const_regclass_end(); I != E; ++I)
80   {
81     I->buildReg2RegClassMap(Reg2RegClassMap);
82   }
83 }