1 //===- X86RegisterInfo.cpp - X86 Register Information -----------*- C++ -*-===//
3 // This file contains the X86 implementation of the MRegisterInfo class.
5 //===----------------------------------------------------------------------===//
8 #include "X86RegisterInfo.h"
9 #include "X86InstrBuilder.h"
10 #include "llvm/Constants.h"
11 #include "llvm/Type.h"
12 #include "llvm/CodeGen/MachineInstrBuilder.h"
14 // X86Regs - Turn the X86RegisterInfo.def file into a bunch of register
17 static const MRegisterDesc X86Regs[] = {
18 #define R(ENUM, NAME, FLAGS, TSFLAGS) { NAME, FLAGS, TSFLAGS },
19 #include "X86RegisterInfo.def"
22 X86RegisterInfo::X86RegisterInfo()
23 : MRegisterInfo(X86Regs, sizeof(X86Regs)/sizeof(X86Regs[0])) {
26 MachineBasicBlock::iterator
27 X86RegisterInfo::storeReg2RegOffset(MachineBasicBlock *MBB,
28 MachineBasicBlock::iterator MBBI,
29 unsigned SrcReg, unsigned DestReg,
30 unsigned ImmOffset, unsigned dataSize)
35 case 1: opcode = X86::MOVrm8; break;
36 case 2: opcode = X86::MOVrm16; break;
37 case 4: opcode = X86::MOVrm32; break;
38 default: assert(0 && "Invalid data size!");
41 MachineInstr *MI = addRegOffset(BuildMI(opcode, 5),
42 DestReg, ImmOffset).addReg(SrcReg);
43 return ++(MBB->insert(MBBI, MI));
46 MachineBasicBlock::iterator
47 X86RegisterInfo::loadRegOffset2Reg(MachineBasicBlock *MBB,
48 MachineBasicBlock::iterator MBBI,
49 unsigned DestReg, unsigned SrcReg,
50 unsigned ImmOffset, unsigned dataSize)
55 case 1: opcode = X86::MOVmr8; break;
56 case 2: opcode = X86::MOVmr16; break;
57 case 4: opcode = X86::MOVmr32; break;
58 default: assert(0 && "Invalid data size!");
61 MachineInstr *MI = addRegOffset(BuildMI(opcode, 5).addReg(DestReg),
63 return ++(MBB->insert(MBBI, MI));
66 MachineBasicBlock::iterator
67 X86RegisterInfo::moveReg2Reg(MachineBasicBlock *MBB,
68 MachineBasicBlock::iterator MBBI,
69 unsigned DestReg, unsigned SrcReg,
70 unsigned dataSize) const
74 case 1: opcode = X86::MOVrr8; break;
75 case 2: opcode = X86::MOVrr16; break;
76 case 4: opcode = X86::MOVrr32; break;
77 default: assert(0 && "Invalid data size!");
80 MachineInstr *MI = BuildMI(opcode, 2).addReg(DestReg).addReg(SrcReg);
81 return ++(MBB->insert(MBBI, MI));
84 MachineBasicBlock::iterator
85 X86RegisterInfo::moveImm2Reg(MachineBasicBlock *MBB,
86 MachineBasicBlock::iterator MBBI,
87 unsigned DestReg, unsigned Imm, unsigned dataSize)
92 case 1: opcode = X86::MOVir8; break;
93 case 2: opcode = X86::MOVir16; break;
94 case 4: opcode = X86::MOVir32; break;
95 default: assert(0 && "Invalid data size!");
98 MachineInstr *MI = BuildMI(opcode, 2).addReg(DestReg).addReg(Imm);
99 return ++(MBB->insert(MBBI, MI));
103 unsigned X86RegisterInfo::getFramePointer() const {
107 unsigned X86RegisterInfo::getStackPointer() const {
111 const unsigned* X86RegisterInfo::getCalleeSaveRegs() const {
112 static const unsigned CalleeSaveRegs[] = { X86::ESI, X86::EDI, X86::EBX,
113 MRegisterInfo::NoRegister };
114 return CalleeSaveRegs;
118 const unsigned* X86RegisterInfo::getCallerSaveRegs() const {
119 static const unsigned CallerSaveRegs[] = { X86::EAX, X86::ECX, X86::EDX,
120 MRegisterInfo::NoRegister };
121 return CallerSaveRegs;
124 MachineBasicBlock::iterator
125 X86RegisterInfo::emitPrologue(MachineBasicBlock *MBB,
126 MachineBasicBlock::iterator MBBI,
127 unsigned numBytes) const
132 MI = BuildMI (X86::PUSHr32, 1).addReg(X86::EBP);
133 MBBI = ++(MBB->insert(MBBI, MI));
136 MI = BuildMI (X86::MOVrr32, 2).addReg(X86::EBP).addReg(X86::ESP);
137 MBBI = ++(MBB->insert(MBBI, MI));
139 // adjust stack pointer
140 MI = BuildMI(X86::SUBri32, 2).addReg(X86::ESP).addZImm(numBytes);
141 MBBI = ++(MBB->insert(MBBI, MI));
143 // PUSH all callee-save registers
144 const unsigned* regs = getCalleeSaveRegs();
146 MI = BuildMI(X86::PUSHr32, 1).addReg(*regs);
147 MBBI = ++(MBB->insert(MBBI, MI));
154 MachineBasicBlock::iterator
155 X86RegisterInfo::emitEpilogue(MachineBasicBlock *MBB,
156 MachineBasicBlock::iterator MBBI,
157 unsigned numBytes) const
161 // POP all callee-save registers in REVERSE ORDER
162 static const unsigned regs[] = { X86::EBX, X86::EDI, X86::ESI,
163 MRegisterInfo::NoRegister };
166 MI = BuildMI(X86::POPr32, 1).addReg(regs[idx++]);
167 MBBI = ++(MBB->insert(MBBI, MI));
171 MI = BuildMI(X86::LEAVE, 0);
172 MBBI = ++(MBB->insert(MBBI, MI));