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));
67 unsigned X86RegisterInfo::getFramePointer() const {
71 unsigned X86RegisterInfo::getStackPointer() const {
75 const unsigned* X86RegisterInfo::getCalleeSaveRegs() const {
76 static const unsigned CalleeSaveRegs[] = { X86::ESI, X86::EDI, X86::EBX,
77 MRegisterInfo::NoRegister };
78 return CalleeSaveRegs;
82 const unsigned* X86RegisterInfo::getCallerSaveRegs() const {
83 static const unsigned CallerSaveRegs[] = { X86::EAX, X86::ECX, X86::EDX,
84 MRegisterInfo::NoRegister };
85 return CallerSaveRegs;
88 MachineBasicBlock::iterator
89 X86RegisterInfo::emitPrologue(MachineBasicBlock *MBB,
90 MachineBasicBlock::iterator MBBI,
91 unsigned numBytes) const
96 MI = BuildMI (X86::PUSHr32, 1).addReg(X86::EBP);
97 MBBI = ++(MBB->insert(MBBI, MI));
100 MI = BuildMI (X86::MOVrr32, 2).addReg(X86::EBP).addReg(X86::ESP);
101 MBBI = ++(MBB->insert(MBBI, MI));
103 // adjust stack pointer
104 MI = BuildMI(X86::SUBri32, 2).addReg(X86::ESP).addZImm(numBytes);
105 MBBI = ++(MBB->insert(MBBI, MI));
107 // PUSH all callee-save registers
108 const unsigned* regs = getCalleeSaveRegs();
110 MI = BuildMI(X86::PUSHr32, 1).addReg(*regs);
111 MBBI = ++(MBB->insert(MBBI, MI));
118 MachineBasicBlock::iterator
119 X86RegisterInfo::emitEpilogue(MachineBasicBlock *MBB,
120 MachineBasicBlock::iterator MBBI,
121 unsigned numBytes) const
125 // POP all callee-save registers in REVERSE ORDER
126 static const unsigned regs[] = { X86::EBX, X86::EDI, X86::ESI,
127 MRegisterInfo::NoRegister };
130 MI = BuildMI(X86::POPr32, 1).addReg(regs[idx++]);
131 MBBI = ++(MBB->insert(MBBI, MI));
135 MI = BuildMI(X86::LEAVE, 0);
136 MBBI = ++(MBB->insert(MBBI, MI));