blob: f46c631e3cb842c97523a3ae0786effc2d9f48d3 [file] [log] [blame]
Misha Brukmancf2b9ac2002-11-22 22:43:47 +00001//===- X86RegisterInfo.cpp - X86 Register Information -----------*- C++ -*-===//
Alkis Evlogimenos39354c92004-03-14 07:19:51 +00002//
John Criswellb576c942003-10-20 19:43:21 +00003// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Alkis Evlogimenos39354c92004-03-14 07:19:51 +00007//
John Criswellb576c942003-10-20 19:43:21 +00008//===----------------------------------------------------------------------===//
Chris Lattner72614082002-10-25 22:55:53 +00009//
Dan Gohman6f0d0242008-02-10 18:45:23 +000010// This file contains the X86 implementation of the TargetRegisterInfo class.
11// This file is responsible for the frame pointer elimination optimization
12// on X86.
Chris Lattner72614082002-10-25 22:55:53 +000013//
14//===----------------------------------------------------------------------===//
15
Misha Brukmanb83b2862002-11-20 18:59:43 +000016#include "X86.h"
Chris Lattner72614082002-10-25 22:55:53 +000017#include "X86RegisterInfo.h"
Misha Brukmancf2b9ac2002-11-22 22:43:47 +000018#include "X86InstrBuilder.h"
Evan Chenge8bd0a32006-06-06 23:30:24 +000019#include "X86MachineFunctionInfo.h"
Evan Cheng25ab6902006-09-08 06:48:29 +000020#include "X86Subtarget.h"
Evan Chenge8bd0a32006-06-06 23:30:24 +000021#include "X86TargetMachine.h"
Misha Brukmanb83b2862002-11-20 18:59:43 +000022#include "llvm/Constants.h"
Evan Cheng3649b0e2006-06-02 22:38:37 +000023#include "llvm/Function.h"
Evan Cheng25ab6902006-09-08 06:48:29 +000024#include "llvm/Type.h"
Chris Lattnerc8c377d2003-07-29 05:14:16 +000025#include "llvm/CodeGen/ValueTypes.h"
Misha Brukmanb83b2862002-11-20 18:59:43 +000026#include "llvm/CodeGen/MachineInstrBuilder.h"
Chris Lattner198ab642002-12-15 20:06:35 +000027#include "llvm/CodeGen/MachineFunction.h"
Dan Gohman2dad0252008-07-01 18:15:35 +000028#include "llvm/CodeGen/MachineFunctionPass.h"
Chris Lattneraa09b752002-12-28 21:08:28 +000029#include "llvm/CodeGen/MachineFrameInfo.h"
Jim Laskeyf1d78e82006-03-23 18:12:57 +000030#include "llvm/CodeGen/MachineLocation.h"
Chris Lattner84bc5422007-12-31 04:13:23 +000031#include "llvm/CodeGen/MachineModuleInfo.h"
32#include "llvm/CodeGen/MachineRegisterInfo.h"
Chris Lattneraf76e592009-08-22 20:48:53 +000033#include "llvm/MC/MCAsmInfo.h"
Chris Lattnerf158da22003-01-16 02:20:12 +000034#include "llvm/Target/TargetFrameInfo.h"
Evan Cheng51cdcd12006-12-07 01:21:59 +000035#include "llvm/Target/TargetInstrInfo.h"
Misha Brukman83eaa0b2004-06-21 21:10:24 +000036#include "llvm/Target/TargetMachine.h"
Chris Lattner0cf0c372004-07-11 04:17:10 +000037#include "llvm/Target/TargetOptions.h"
Evan Chengb371f452007-02-19 21:49:54 +000038#include "llvm/ADT/BitVector.h"
Reid Spencer551ccae2004-09-01 22:55:40 +000039#include "llvm/ADT/STLExtras.h"
Dan Gohmana4714e02009-07-30 01:56:29 +000040#include "llvm/Support/CommandLine.h"
Torok Edwinc25e7582009-07-11 20:10:48 +000041#include "llvm/Support/ErrorHandling.h"
Chris Lattner300d0ed2004-02-14 06:00:36 +000042using namespace llvm;
Brian Gaeked0fde302003-11-11 22:41:34 +000043
Evan Cheng25ab6902006-09-08 06:48:29 +000044X86RegisterInfo::X86RegisterInfo(X86TargetMachine &tm,
45 const TargetInstrInfo &tii)
Dan Gohman6d4b0522008-10-01 18:28:06 +000046 : X86GenRegisterInfo(tm.getSubtarget<X86Subtarget>().is64Bit() ?
47 X86::ADJCALLSTACKDOWN64 :
48 X86::ADJCALLSTACKDOWN32,
49 tm.getSubtarget<X86Subtarget>().is64Bit() ?
50 X86::ADJCALLSTACKUP64 :
51 X86::ADJCALLSTACKUP32),
Evan Cheng25ab6902006-09-08 06:48:29 +000052 TM(tm), TII(tii) {
53 // Cache some information.
54 const X86Subtarget *Subtarget = &TM.getSubtarget<X86Subtarget>();
55 Is64Bit = Subtarget->is64Bit();
Anton Korobeynikov1dcce212008-03-22 21:04:01 +000056 IsWin64 = Subtarget->isTargetWin64();
Evan Chengdb807ed2007-11-05 07:30:01 +000057 StackAlign = TM.getFrameInfo()->getStackAlignment();
Bill Wendling80c76432009-08-16 11:00:26 +000058
Evan Cheng25ab6902006-09-08 06:48:29 +000059 if (Is64Bit) {
60 SlotSize = 8;
61 StackPtr = X86::RSP;
62 FramePtr = X86::RBP;
63 } else {
64 SlotSize = 4;
65 StackPtr = X86::ESP;
66 FramePtr = X86::EBP;
67 }
68}
Chris Lattner7ad3e062003-08-03 15:48:14 +000069
Bill Wendling80c76432009-08-16 11:00:26 +000070/// getDwarfRegNum - This function maps LLVM register identifiers to the DWARF
71/// specific numbering, used in debug info and exception tables.
Dale Johannesenb97aec62007-11-13 19:13:01 +000072int X86RegisterInfo::getDwarfRegNum(unsigned RegNo, bool isEH) const {
Dale Johannesen483ec212007-11-07 00:25:05 +000073 const X86Subtarget *Subtarget = &TM.getSubtarget<X86Subtarget>();
Anton Korobeynikovf191c802007-11-11 19:50:10 +000074 unsigned Flavour = DWARFFlavour::X86_64;
Bill Wendling80c76432009-08-16 11:00:26 +000075
Dale Johannesen7a42f242007-11-09 18:07:11 +000076 if (!Subtarget->is64Bit()) {
Anton Korobeynikovf191c802007-11-11 19:50:10 +000077 if (Subtarget->isTargetDarwin()) {
Anton Korobeynikov8eea3392008-01-25 00:34:13 +000078 if (isEH)
79 Flavour = DWARFFlavour::X86_32_DarwinEH;
80 else
81 Flavour = DWARFFlavour::X86_32_Generic;
Anton Korobeynikovf191c802007-11-11 19:50:10 +000082 } else if (Subtarget->isTargetCygMing()) {
83 // Unsupported by now, just quick fallback
Anton Korobeynikov8eea3392008-01-25 00:34:13 +000084 Flavour = DWARFFlavour::X86_32_Generic;
Anton Korobeynikovf191c802007-11-11 19:50:10 +000085 } else {
Anton Korobeynikov8eea3392008-01-25 00:34:13 +000086 Flavour = DWARFFlavour::X86_32_Generic;
Dale Johannesen7a42f242007-11-09 18:07:11 +000087 }
Dale Johannesen483ec212007-11-07 00:25:05 +000088 }
Anton Korobeynikovf191c802007-11-11 19:50:10 +000089
90 return X86GenRegisterInfo::getDwarfRegNumFull(RegNo, Flavour);
Dale Johannesen483ec212007-11-07 00:25:05 +000091}
92
Bill Wendling80c76432009-08-16 11:00:26 +000093/// getX86RegNum - This function maps LLVM register identifiers to their X86
94/// specific numbering, which is used in various places encoding instructions.
Nicolas Geoffray52e724a2008-04-16 20:10:13 +000095unsigned X86RegisterInfo::getX86RegNum(unsigned RegNo) {
Duncan Sandsee465742007-08-29 19:01:20 +000096 switch(RegNo) {
97 case X86::RAX: case X86::EAX: case X86::AX: case X86::AL: return N86::EAX;
98 case X86::RCX: case X86::ECX: case X86::CX: case X86::CL: return N86::ECX;
99 case X86::RDX: case X86::EDX: case X86::DX: case X86::DL: return N86::EDX;
100 case X86::RBX: case X86::EBX: case X86::BX: case X86::BL: return N86::EBX;
101 case X86::RSP: case X86::ESP: case X86::SP: case X86::SPL: case X86::AH:
102 return N86::ESP;
103 case X86::RBP: case X86::EBP: case X86::BP: case X86::BPL: case X86::CH:
104 return N86::EBP;
105 case X86::RSI: case X86::ESI: case X86::SI: case X86::SIL: case X86::DH:
106 return N86::ESI;
107 case X86::RDI: case X86::EDI: case X86::DI: case X86::DIL: case X86::BH:
108 return N86::EDI;
109
110 case X86::R8: case X86::R8D: case X86::R8W: case X86::R8B:
111 return N86::EAX;
112 case X86::R9: case X86::R9D: case X86::R9W: case X86::R9B:
113 return N86::ECX;
114 case X86::R10: case X86::R10D: case X86::R10W: case X86::R10B:
115 return N86::EDX;
116 case X86::R11: case X86::R11D: case X86::R11W: case X86::R11B:
117 return N86::EBX;
118 case X86::R12: case X86::R12D: case X86::R12W: case X86::R12B:
119 return N86::ESP;
120 case X86::R13: case X86::R13D: case X86::R13W: case X86::R13B:
121 return N86::EBP;
122 case X86::R14: case X86::R14D: case X86::R14W: case X86::R14B:
123 return N86::ESI;
124 case X86::R15: case X86::R15D: case X86::R15W: case X86::R15B:
125 return N86::EDI;
126
127 case X86::ST0: case X86::ST1: case X86::ST2: case X86::ST3:
128 case X86::ST4: case X86::ST5: case X86::ST6: case X86::ST7:
129 return RegNo-X86::ST0;
130
Nate Begeman6e041c22007-12-11 18:06:14 +0000131 case X86::XMM0: case X86::XMM8: case X86::MM0:
Evan Chenge7c87542007-11-13 17:54:34 +0000132 return 0;
Nate Begeman6e041c22007-12-11 18:06:14 +0000133 case X86::XMM1: case X86::XMM9: case X86::MM1:
Evan Chenge7c87542007-11-13 17:54:34 +0000134 return 1;
Nate Begeman6e041c22007-12-11 18:06:14 +0000135 case X86::XMM2: case X86::XMM10: case X86::MM2:
Evan Chenge7c87542007-11-13 17:54:34 +0000136 return 2;
Nate Begeman6e041c22007-12-11 18:06:14 +0000137 case X86::XMM3: case X86::XMM11: case X86::MM3:
Evan Chenge7c87542007-11-13 17:54:34 +0000138 return 3;
Nate Begeman6e041c22007-12-11 18:06:14 +0000139 case X86::XMM4: case X86::XMM12: case X86::MM4:
Evan Chenge7c87542007-11-13 17:54:34 +0000140 return 4;
Nate Begeman6e041c22007-12-11 18:06:14 +0000141 case X86::XMM5: case X86::XMM13: case X86::MM5:
Evan Chenge7c87542007-11-13 17:54:34 +0000142 return 5;
Nate Begeman6e041c22007-12-11 18:06:14 +0000143 case X86::XMM6: case X86::XMM14: case X86::MM6:
Evan Chenge7c87542007-11-13 17:54:34 +0000144 return 6;
Nate Begeman6e041c22007-12-11 18:06:14 +0000145 case X86::XMM7: case X86::XMM15: case X86::MM7:
Evan Chenge7c87542007-11-13 17:54:34 +0000146 return 7;
Duncan Sandsee465742007-08-29 19:01:20 +0000147
148 default:
149 assert(isVirtualRegister(RegNo) && "Unknown physical register!");
Torok Edwinc23197a2009-07-14 16:55:14 +0000150 llvm_unreachable("Register allocator hasn't allocated reg correctly yet!");
Duncan Sandsee465742007-08-29 19:01:20 +0000151 return 0;
152 }
153}
154
Evan Cheng52484682009-07-18 02:10:10 +0000155const TargetRegisterClass *
156X86RegisterInfo::getMatchingSuperRegClass(const TargetRegisterClass *A,
157 const TargetRegisterClass *B,
158 unsigned SubIdx) const {
159 switch (SubIdx) {
160 default: return 0;
161 case 1:
162 // 8-bit
163 if (B == &X86::GR8RegClass) {
Evan Cheng753480a2009-07-20 19:47:55 +0000164 if (A->getSize() == 2 || A->getSize() == 4 || A->getSize() == 8)
165 return A;
Evan Cheng52484682009-07-18 02:10:10 +0000166 } else if (B == &X86::GR8_ABCD_LRegClass || B == &X86::GR8_ABCD_HRegClass) {
Evan Cheng753480a2009-07-20 19:47:55 +0000167 if (A == &X86::GR64RegClass || A == &X86::GR64_ABCDRegClass ||
Dan Gohmana4714e02009-07-30 01:56:29 +0000168 A == &X86::GR64_NOREXRegClass ||
169 A == &X86::GR64_NOSPRegClass ||
170 A == &X86::GR64_NOREX_NOSPRegClass)
Evan Cheng52484682009-07-18 02:10:10 +0000171 return &X86::GR64_ABCDRegClass;
Evan Cheng753480a2009-07-20 19:47:55 +0000172 else if (A == &X86::GR32RegClass || A == &X86::GR32_ABCDRegClass ||
Dan Gohmana4714e02009-07-30 01:56:29 +0000173 A == &X86::GR32_NOREXRegClass ||
174 A == &X86::GR32_NOSPRegClass)
Evan Cheng52484682009-07-18 02:10:10 +0000175 return &X86::GR32_ABCDRegClass;
Evan Cheng753480a2009-07-20 19:47:55 +0000176 else if (A == &X86::GR16RegClass || A == &X86::GR16_ABCDRegClass ||
177 A == &X86::GR16_NOREXRegClass)
Evan Cheng52484682009-07-18 02:10:10 +0000178 return &X86::GR16_ABCDRegClass;
179 } else if (B == &X86::GR8_NOREXRegClass) {
Dan Gohmana4714e02009-07-30 01:56:29 +0000180 if (A == &X86::GR64RegClass || A == &X86::GR64_NOREXRegClass ||
181 A == &X86::GR64_NOSPRegClass || A == &X86::GR64_NOREX_NOSPRegClass)
Evan Cheng52484682009-07-18 02:10:10 +0000182 return &X86::GR64_NOREXRegClass;
Evan Cheng753480a2009-07-20 19:47:55 +0000183 else if (A == &X86::GR64_ABCDRegClass)
184 return &X86::GR64_ABCDRegClass;
Dan Gohmana4714e02009-07-30 01:56:29 +0000185 else if (A == &X86::GR32RegClass || A == &X86::GR32_NOREXRegClass ||
186 A == &X86::GR32_NOSPRegClass)
Evan Cheng52484682009-07-18 02:10:10 +0000187 return &X86::GR32_NOREXRegClass;
Evan Cheng753480a2009-07-20 19:47:55 +0000188 else if (A == &X86::GR32_ABCDRegClass)
189 return &X86::GR32_ABCDRegClass;
Evan Cheng52484682009-07-18 02:10:10 +0000190 else if (A == &X86::GR16RegClass || A == &X86::GR16_NOREXRegClass)
191 return &X86::GR16_NOREXRegClass;
Evan Cheng753480a2009-07-20 19:47:55 +0000192 else if (A == &X86::GR16_ABCDRegClass)
193 return &X86::GR16_ABCDRegClass;
Dan Gohman874cada2010-02-28 00:17:42 +0000194 } else if (B == &X86::FR32RegClass) {
195 return A;
Evan Cheng52484682009-07-18 02:10:10 +0000196 }
197 break;
198 case 2:
199 // 8-bit hi
200 if (B == &X86::GR8_ABCD_HRegClass) {
Evan Cheng753480a2009-07-20 19:47:55 +0000201 if (A == &X86::GR64RegClass || A == &X86::GR64_ABCDRegClass ||
Dan Gohmana4714e02009-07-30 01:56:29 +0000202 A == &X86::GR64_NOREXRegClass ||
203 A == &X86::GR64_NOSPRegClass ||
204 A == &X86::GR64_NOREX_NOSPRegClass)
Evan Cheng52484682009-07-18 02:10:10 +0000205 return &X86::GR64_ABCDRegClass;
Evan Cheng753480a2009-07-20 19:47:55 +0000206 else if (A == &X86::GR32RegClass || A == &X86::GR32_ABCDRegClass ||
Dan Gohmana4714e02009-07-30 01:56:29 +0000207 A == &X86::GR32_NOREXRegClass || A == &X86::GR32_NOSPRegClass)
Evan Cheng52484682009-07-18 02:10:10 +0000208 return &X86::GR32_ABCDRegClass;
Evan Cheng753480a2009-07-20 19:47:55 +0000209 else if (A == &X86::GR16RegClass || A == &X86::GR16_ABCDRegClass ||
210 A == &X86::GR16_NOREXRegClass)
Evan Cheng52484682009-07-18 02:10:10 +0000211 return &X86::GR16_ABCDRegClass;
Dan Gohman874cada2010-02-28 00:17:42 +0000212 } else if (B == &X86::FR64RegClass) {
213 return A;
Evan Cheng52484682009-07-18 02:10:10 +0000214 }
215 break;
216 case 3:
217 // 16-bit
218 if (B == &X86::GR16RegClass) {
Evan Cheng753480a2009-07-20 19:47:55 +0000219 if (A->getSize() == 4 || A->getSize() == 8)
220 return A;
Evan Cheng52484682009-07-18 02:10:10 +0000221 } else if (B == &X86::GR16_ABCDRegClass) {
Evan Cheng753480a2009-07-20 19:47:55 +0000222 if (A == &X86::GR64RegClass || A == &X86::GR64_ABCDRegClass ||
Dan Gohmana4714e02009-07-30 01:56:29 +0000223 A == &X86::GR64_NOREXRegClass ||
224 A == &X86::GR64_NOSPRegClass ||
225 A == &X86::GR64_NOREX_NOSPRegClass)
Evan Cheng52484682009-07-18 02:10:10 +0000226 return &X86::GR64_ABCDRegClass;
Evan Cheng753480a2009-07-20 19:47:55 +0000227 else if (A == &X86::GR32RegClass || A == &X86::GR32_ABCDRegClass ||
Dan Gohmana4714e02009-07-30 01:56:29 +0000228 A == &X86::GR32_NOREXRegClass || A == &X86::GR32_NOSPRegClass)
Evan Cheng52484682009-07-18 02:10:10 +0000229 return &X86::GR32_ABCDRegClass;
230 } else if (B == &X86::GR16_NOREXRegClass) {
Dan Gohmana4714e02009-07-30 01:56:29 +0000231 if (A == &X86::GR64RegClass || A == &X86::GR64_NOREXRegClass ||
232 A == &X86::GR64_NOSPRegClass || A == &X86::GR64_NOREX_NOSPRegClass)
Evan Cheng52484682009-07-18 02:10:10 +0000233 return &X86::GR64_NOREXRegClass;
Evan Cheng753480a2009-07-20 19:47:55 +0000234 else if (A == &X86::GR64_ABCDRegClass)
235 return &X86::GR64_ABCDRegClass;
Dan Gohmana4714e02009-07-30 01:56:29 +0000236 else if (A == &X86::GR32RegClass || A == &X86::GR32_NOREXRegClass ||
237 A == &X86::GR32_NOSPRegClass)
Evan Cheng753480a2009-07-20 19:47:55 +0000238 return &X86::GR32_NOREXRegClass;
239 else if (A == &X86::GR32_ABCDRegClass)
Evan Cheng52484682009-07-18 02:10:10 +0000240 return &X86::GR64_ABCDRegClass;
Dan Gohman874cada2010-02-28 00:17:42 +0000241 } else if (B == &X86::VR128RegClass) {
242 return A;
Evan Cheng52484682009-07-18 02:10:10 +0000243 }
244 break;
245 case 4:
246 // 32-bit
Dan Gohmana4714e02009-07-30 01:56:29 +0000247 if (B == &X86::GR32RegClass || B == &X86::GR32_NOSPRegClass) {
Evan Cheng753480a2009-07-20 19:47:55 +0000248 if (A->getSize() == 8)
249 return A;
Evan Cheng52484682009-07-18 02:10:10 +0000250 } else if (B == &X86::GR32_ABCDRegClass) {
Evan Cheng753480a2009-07-20 19:47:55 +0000251 if (A == &X86::GR64RegClass || A == &X86::GR64_ABCDRegClass ||
Dan Gohmana4714e02009-07-30 01:56:29 +0000252 A == &X86::GR64_NOREXRegClass ||
253 A == &X86::GR64_NOSPRegClass ||
254 A == &X86::GR64_NOREX_NOSPRegClass)
Evan Cheng52484682009-07-18 02:10:10 +0000255 return &X86::GR64_ABCDRegClass;
256 } else if (B == &X86::GR32_NOREXRegClass) {
Dan Gohmana4714e02009-07-30 01:56:29 +0000257 if (A == &X86::GR64RegClass || A == &X86::GR64_NOREXRegClass ||
258 A == &X86::GR64_NOSPRegClass || A == &X86::GR64_NOREX_NOSPRegClass)
Evan Cheng52484682009-07-18 02:10:10 +0000259 return &X86::GR64_NOREXRegClass;
Evan Cheng753480a2009-07-20 19:47:55 +0000260 else if (A == &X86::GR64_ABCDRegClass)
261 return &X86::GR64_ABCDRegClass;
Evan Cheng52484682009-07-18 02:10:10 +0000262 }
263 break;
264 }
265 return 0;
266}
267
Bill Wendling80c76432009-08-16 11:00:26 +0000268const TargetRegisterClass *
269X86RegisterInfo::getPointerRegClass(unsigned Kind) const {
Dan Gohmana4714e02009-07-30 01:56:29 +0000270 switch (Kind) {
271 default: llvm_unreachable("Unexpected Kind in getPointerRegClass!");
272 case 0: // Normal GPRs.
273 if (TM.getSubtarget<X86Subtarget>().is64Bit())
274 return &X86::GR64RegClass;
275 return &X86::GR32RegClass;
276 case 1: // Normal GRPs except the stack pointer (for encoding reasons).
Dan Gohman74f6f9a2009-08-05 17:40:24 +0000277 if (TM.getSubtarget<X86Subtarget>().is64Bit())
278 return &X86::GR64_NOSPRegClass;
279 return &X86::GR32_NOSPRegClass;
Dan Gohmana4714e02009-07-30 01:56:29 +0000280 }
Evan Cheng770bcc72009-02-06 17:43:24 +0000281}
282
Evan Chengff110262007-09-26 21:31:07 +0000283const TargetRegisterClass *
284X86RegisterInfo::getCrossCopyRegClass(const TargetRegisterClass *RC) const {
Anton Korobeynikov4aefd6b2008-02-20 12:07:57 +0000285 if (RC == &X86::CCRRegClass) {
Evan Cheng3f2d9ec2007-09-27 21:50:05 +0000286 if (Is64Bit)
287 return &X86::GR64RegClass;
288 else
289 return &X86::GR32RegClass;
Anton Korobeynikov4aefd6b2008-02-20 12:07:57 +0000290 }
Evan Chengff110262007-09-26 21:31:07 +0000291 return NULL;
292}
Evan Chengbf2c8b32007-03-20 08:09:38 +0000293
Evan Cheng64d80e32007-07-19 01:14:50 +0000294const unsigned *
295X86RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
Anton Korobeynikovb84c1672008-09-08 21:12:47 +0000296 bool callsEHReturn = false;
Chris Lattner29689432010-03-11 00:22:57 +0000297 bool ghcCall = false;
Anton Korobeynikovb84c1672008-09-08 21:12:47 +0000298
299 if (MF) {
300 const MachineFrameInfo *MFI = MF->getFrameInfo();
301 const MachineModuleInfo *MMI = MFI->getMachineModuleInfo();
302 callsEHReturn = (MMI ? MMI->callsEHReturn() : false);
Chris Lattner29689432010-03-11 00:22:57 +0000303 const Function *F = MF->getFunction();
304 ghcCall = (F ? F->getCallingConv() == CallingConv::GHC : false);
Anton Korobeynikovb84c1672008-09-08 21:12:47 +0000305 }
306
Chris Lattner29689432010-03-11 00:22:57 +0000307 static const unsigned GhcCalleeSavedRegs[] = {
308 0
309 };
310
Evan Chengc2b861d2007-01-02 21:33:40 +0000311 static const unsigned CalleeSavedRegs32Bit[] = {
Evan Cheng0f3ac8d2006-05-18 00:12:58 +0000312 X86::ESI, X86::EDI, X86::EBX, X86::EBP, 0
313 };
Anton Korobeynikov2365f512007-07-14 14:06:15 +0000314
315 static const unsigned CalleeSavedRegs32EHRet[] = {
316 X86::EAX, X86::EDX, X86::ESI, X86::EDI, X86::EBX, X86::EBP, 0
317 };
318
Evan Chengc2b861d2007-01-02 21:33:40 +0000319 static const unsigned CalleeSavedRegs64Bit[] = {
Evan Cheng25ab6902006-09-08 06:48:29 +0000320 X86::RBX, X86::R12, X86::R13, X86::R14, X86::R15, X86::RBP, 0
321 };
322
Anton Korobeynikovb84c1672008-09-08 21:12:47 +0000323 static const unsigned CalleeSavedRegs64EHRet[] = {
324 X86::RAX, X86::RDX, X86::RBX, X86::R12,
325 X86::R13, X86::R14, X86::R15, X86::RBP, 0
326 };
327
Anton Korobeynikov1dcce212008-03-22 21:04:01 +0000328 static const unsigned CalleeSavedRegsWin64[] = {
Anton Korobeynikov5979d712008-09-24 22:03:04 +0000329 X86::RBX, X86::RBP, X86::RDI, X86::RSI,
330 X86::R12, X86::R13, X86::R14, X86::R15,
331 X86::XMM6, X86::XMM7, X86::XMM8, X86::XMM9,
332 X86::XMM10, X86::XMM11, X86::XMM12, X86::XMM13,
333 X86::XMM14, X86::XMM15, 0
Anton Korobeynikov1dcce212008-03-22 21:04:01 +0000334 };
335
Chris Lattner29689432010-03-11 00:22:57 +0000336 if (ghcCall) {
337 return GhcCalleeSavedRegs;
338 } else if (Is64Bit) {
Anton Korobeynikov1dcce212008-03-22 21:04:01 +0000339 if (IsWin64)
340 return CalleeSavedRegsWin64;
341 else
Anton Korobeynikovb84c1672008-09-08 21:12:47 +0000342 return (callsEHReturn ? CalleeSavedRegs64EHRet : CalleeSavedRegs64Bit);
Anton Korobeynikov1dcce212008-03-22 21:04:01 +0000343 } else {
Anton Korobeynikovb84c1672008-09-08 21:12:47 +0000344 return (callsEHReturn ? CalleeSavedRegs32EHRet : CalleeSavedRegs32Bit);
Anton Korobeynikov2365f512007-07-14 14:06:15 +0000345 }
Evan Cheng0f3ac8d2006-05-18 00:12:58 +0000346}
347
348const TargetRegisterClass* const*
Anton Korobeynikov2365f512007-07-14 14:06:15 +0000349X86RegisterInfo::getCalleeSavedRegClasses(const MachineFunction *MF) const {
Anton Korobeynikovb84c1672008-09-08 21:12:47 +0000350 bool callsEHReturn = false;
351
352 if (MF) {
353 const MachineFrameInfo *MFI = MF->getFrameInfo();
354 const MachineModuleInfo *MMI = MFI->getMachineModuleInfo();
355 callsEHReturn = (MMI ? MMI->callsEHReturn() : false);
356 }
357
Evan Chengc2b861d2007-01-02 21:33:40 +0000358 static const TargetRegisterClass * const CalleeSavedRegClasses32Bit[] = {
Evan Cheng0f3ac8d2006-05-18 00:12:58 +0000359 &X86::GR32RegClass, &X86::GR32RegClass,
360 &X86::GR32RegClass, &X86::GR32RegClass, 0
361 };
Anton Korobeynikov2365f512007-07-14 14:06:15 +0000362 static const TargetRegisterClass * const CalleeSavedRegClasses32EHRet[] = {
363 &X86::GR32RegClass, &X86::GR32RegClass,
364 &X86::GR32RegClass, &X86::GR32RegClass,
365 &X86::GR32RegClass, &X86::GR32RegClass, 0
366 };
Evan Chengc2b861d2007-01-02 21:33:40 +0000367 static const TargetRegisterClass * const CalleeSavedRegClasses64Bit[] = {
Evan Cheng25ab6902006-09-08 06:48:29 +0000368 &X86::GR64RegClass, &X86::GR64RegClass,
369 &X86::GR64RegClass, &X86::GR64RegClass,
370 &X86::GR64RegClass, &X86::GR64RegClass, 0
371 };
Anton Korobeynikovb84c1672008-09-08 21:12:47 +0000372 static const TargetRegisterClass * const CalleeSavedRegClasses64EHRet[] = {
373 &X86::GR64RegClass, &X86::GR64RegClass,
374 &X86::GR64RegClass, &X86::GR64RegClass,
375 &X86::GR64RegClass, &X86::GR64RegClass,
376 &X86::GR64RegClass, &X86::GR64RegClass, 0
377 };
Anton Korobeynikov1dcce212008-03-22 21:04:01 +0000378 static const TargetRegisterClass * const CalleeSavedRegClassesWin64[] = {
Anton Korobeynikov5979d712008-09-24 22:03:04 +0000379 &X86::GR64RegClass, &X86::GR64RegClass,
380 &X86::GR64RegClass, &X86::GR64RegClass,
381 &X86::GR64RegClass, &X86::GR64RegClass,
382 &X86::GR64RegClass, &X86::GR64RegClass,
383 &X86::VR128RegClass, &X86::VR128RegClass,
384 &X86::VR128RegClass, &X86::VR128RegClass,
385 &X86::VR128RegClass, &X86::VR128RegClass,
386 &X86::VR128RegClass, &X86::VR128RegClass,
387 &X86::VR128RegClass, &X86::VR128RegClass, 0
Anton Korobeynikov1dcce212008-03-22 21:04:01 +0000388 };
Evan Cheng25ab6902006-09-08 06:48:29 +0000389
Anton Korobeynikov1dcce212008-03-22 21:04:01 +0000390 if (Is64Bit) {
391 if (IsWin64)
392 return CalleeSavedRegClassesWin64;
393 else
Anton Korobeynikovb84c1672008-09-08 21:12:47 +0000394 return (callsEHReturn ?
395 CalleeSavedRegClasses64EHRet : CalleeSavedRegClasses64Bit);
Anton Korobeynikov1dcce212008-03-22 21:04:01 +0000396 } else {
Anton Korobeynikovb84c1672008-09-08 21:12:47 +0000397 return (callsEHReturn ?
398 CalleeSavedRegClasses32EHRet : CalleeSavedRegClasses32Bit);
Anton Korobeynikov2365f512007-07-14 14:06:15 +0000399 }
Evan Cheng0f3ac8d2006-05-18 00:12:58 +0000400}
401
Evan Chengb371f452007-02-19 21:49:54 +0000402BitVector X86RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
403 BitVector Reserved(getNumRegs());
Dan Gohmana32b7ac2008-12-18 01:05:09 +0000404 // Set the stack-pointer register and its aliases as reserved.
Evan Chengb371f452007-02-19 21:49:54 +0000405 Reserved.set(X86::RSP);
406 Reserved.set(X86::ESP);
407 Reserved.set(X86::SP);
408 Reserved.set(X86::SPL);
Bill Wendling80c76432009-08-16 11:00:26 +0000409
Jakob Stoklund Olesen52cd5482009-11-13 21:56:01 +0000410 // Set the instruction pointer register and its aliases as reserved.
411 Reserved.set(X86::RIP);
412 Reserved.set(X86::EIP);
413 Reserved.set(X86::IP);
414
Dan Gohmana32b7ac2008-12-18 01:05:09 +0000415 // Set the frame-pointer register and its aliases as reserved if needed.
Evan Chengb371f452007-02-19 21:49:54 +0000416 if (hasFP(MF)) {
417 Reserved.set(X86::RBP);
418 Reserved.set(X86::EBP);
419 Reserved.set(X86::BP);
420 Reserved.set(X86::BPL);
421 }
Bill Wendling80c76432009-08-16 11:00:26 +0000422
423 // Mark the x87 stack registers as reserved, since they don't behave normally
424 // with respect to liveness. We don't fully model the effects of x87 stack
425 // pushes and pops after stackification.
Dan Gohmana32b7ac2008-12-18 01:05:09 +0000426 Reserved.set(X86::ST0);
427 Reserved.set(X86::ST1);
428 Reserved.set(X86::ST2);
429 Reserved.set(X86::ST3);
430 Reserved.set(X86::ST4);
431 Reserved.set(X86::ST5);
432 Reserved.set(X86::ST6);
433 Reserved.set(X86::ST7);
Evan Chengb371f452007-02-19 21:49:54 +0000434 return Reserved;
435}
436
Chris Lattner3c1c03d2002-12-28 20:32:28 +0000437//===----------------------------------------------------------------------===//
438// Stack Frame Processing methods
439//===----------------------------------------------------------------------===//
440
Bill Wendling80c76432009-08-16 11:00:26 +0000441/// hasFP - Return true if the specified function should have a dedicated frame
442/// pointer register. This is true if the function has variable sized allocas
443/// or if frame pointer elimination is disabled.
Evan Chengdc775402007-01-23 00:57:47 +0000444bool X86RegisterInfo::hasFP(const MachineFunction &MF) const {
Dan Gohman8e5f2c62008-07-07 23:14:23 +0000445 const MachineFrameInfo *MFI = MF.getFrameInfo();
446 const MachineModuleInfo *MMI = MFI->getMachineModuleInfo();
Anton Korobeynikov2365f512007-07-14 14:06:15 +0000447
Anton Korobeynikove2011902008-04-23 18:15:11 +0000448 return (NoFramePointerElim ||
Anton Korobeynikov9bbbea52008-04-23 18:15:48 +0000449 needsStackRealignment(MF) ||
Evan Cheng7e7bbf82007-07-19 00:42:05 +0000450 MFI->hasVarSizedObjects() ||
Evan Cheng184793f2008-09-27 01:56:22 +0000451 MFI->isFrameAddressTaken() ||
Anton Korobeynikov2365f512007-07-14 14:06:15 +0000452 MF.getInfo<X86MachineFunctionInfo>()->getForceFramePointer() ||
453 (MMI && MMI->callsUnwindInit()));
Misha Brukman03c6faf2002-12-03 23:11:21 +0000454}
Misha Brukman2adb3952002-12-04 23:57:03 +0000455
Jim Grosbache45ab8a2010-01-19 18:31:11 +0000456bool X86RegisterInfo::canRealignStack(const MachineFunction &MF) const {
457 const MachineFrameInfo *MFI = MF.getFrameInfo();
458 return (RealignStack &&
459 !MFI->hasVarSizedObjects());
460}
461
Anton Korobeynikov9bbbea52008-04-23 18:15:48 +0000462bool X86RegisterInfo::needsStackRealignment(const MachineFunction &MF) const {
Nick Lewycky9c0f1462009-03-19 05:51:39 +0000463 const MachineFrameInfo *MFI = MF.getFrameInfo();
Charles Davis5dfa2672010-02-19 18:17:13 +0000464 const Function *F = MF.getFunction();
Anton Korobeynikov773943a2009-11-08 12:58:40 +0000465 bool requiresRealignment =
Charles Davis5dfa2672010-02-19 18:17:13 +0000466 RealignStack && ((MFI->getMaxAlignment() > StackAlign) ||
467 F->hasFnAttr(Attribute::StackAlignment));
Anton Korobeynikov9bbbea52008-04-23 18:15:48 +0000468
Anton Korobeynikov35410a42008-04-23 18:16:43 +0000469 // FIXME: Currently we don't support stack realignment for functions with
Anton Korobeynikovb23f3aa2009-11-14 18:01:41 +0000470 // variable-sized allocas.
471 // FIXME: Temporary disable the error - it seems to be too conservative.
472 if (0 && requiresRealignment && MFI->hasVarSizedObjects())
Anton Korobeynikov773943a2009-11-08 12:58:40 +0000473 llvm_report_error(
474 "Stack realignment in presense of dynamic allocas is not supported");
475
Anton Korobeynikovb23f3aa2009-11-14 18:01:41 +0000476 return (requiresRealignment && !MFI->hasVarSizedObjects());
Anton Korobeynikov9bbbea52008-04-23 18:15:48 +0000477}
478
Evan Cheng7e7bbf82007-07-19 00:42:05 +0000479bool X86RegisterInfo::hasReservedCallFrame(MachineFunction &MF) const {
480 return !MF.getFrameInfo()->hasVarSizedObjects();
481}
482
Evan Cheng910139f2009-07-09 06:53:48 +0000483bool X86RegisterInfo::hasReservedSpillSlot(MachineFunction &MF, unsigned Reg,
484 int &FrameIdx) const {
485 if (Reg == FramePtr && hasFP(MF)) {
486 FrameIdx = MF.getFrameInfo()->getObjectIndexBegin();
487 return true;
488 }
489 return false;
490}
491
Anton Korobeynikov82751e32008-04-23 18:18:36 +0000492int
Chris Lattner30c6b752010-01-26 23:15:09 +0000493X86RegisterInfo::getFrameIndexOffset(const MachineFunction &MF, int FI) const {
Anton Korobeynikovcf6b7392009-08-03 08:12:53 +0000494 const TargetFrameInfo &TFI = *MF.getTarget().getFrameInfo();
Chris Lattner30c6b752010-01-26 23:15:09 +0000495 const MachineFrameInfo *MFI = MF.getFrameInfo();
Anton Korobeynikovcf6b7392009-08-03 08:12:53 +0000496 int Offset = MFI->getObjectOffset(FI) - TFI.getOffsetOfLocalArea();
497 uint64_t StackSize = MFI->getStackSize();
Anton Korobeynikov82751e32008-04-23 18:18:36 +0000498
Anton Korobeynikov8e91ec52008-04-23 18:21:02 +0000499 if (needsStackRealignment(MF)) {
Bill Wendling80c76432009-08-16 11:00:26 +0000500 if (FI < 0) {
501 // Skip the saved EBP.
Anton Korobeynikov8e91ec52008-04-23 18:21:02 +0000502 Offset += SlotSize;
Bill Wendling80c76432009-08-16 11:00:26 +0000503 } else {
Anton Korobeynikovcf6b7392009-08-03 08:12:53 +0000504 unsigned Align = MFI->getObjectAlignment(FI);
Evan Cheng7545f492010-02-13 01:56:41 +0000505 assert((-(Offset + StackSize)) % Align == 0);
Devang Patelfd1c6c32008-12-23 21:56:28 +0000506 Align = 0;
Dale Johannesenb5dae002008-06-26 01:51:13 +0000507 return Offset + StackSize;
Anton Korobeynikov2c430cb2008-04-23 18:21:27 +0000508 }
Anton Korobeynikov8e91ec52008-04-23 18:21:02 +0000509 // FIXME: Support tail calls
510 } else {
511 if (!hasFP(MF))
Anton Korobeynikov2c430cb2008-04-23 18:21:27 +0000512 return Offset + StackSize;
Anton Korobeynikov8e91ec52008-04-23 18:21:02 +0000513
Bill Wendling80c76432009-08-16 11:00:26 +0000514 // Skip the saved EBP.
Anton Korobeynikov8e91ec52008-04-23 18:21:02 +0000515 Offset += SlotSize;
516
517 // Skip the RETADDR move area
Chris Lattner30c6b752010-01-26 23:15:09 +0000518 const X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
Anton Korobeynikov8e91ec52008-04-23 18:21:02 +0000519 int TailCallReturnAddrDelta = X86FI->getTCReturnAddrDelta();
Bill Wendling80c76432009-08-16 11:00:26 +0000520 if (TailCallReturnAddrDelta < 0)
521 Offset -= TailCallReturnAddrDelta;
Anton Korobeynikov8e91ec52008-04-23 18:21:02 +0000522 }
523
Anton Korobeynikov82751e32008-04-23 18:18:36 +0000524 return Offset;
525}
526
Chris Lattnerbb07ef92004-02-14 19:49:54 +0000527void X86RegisterInfo::
528eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
529 MachineBasicBlock::iterator I) const {
Evan Cheng7e7bbf82007-07-19 00:42:05 +0000530 if (!hasReservedCallFrame(MF)) {
531 // If the stack pointer can be changed after prologue, turn the
532 // adjcallstackup instruction into a 'sub ESP, <amt>' and the
533 // adjcallstackdown instruction into 'add ESP, <amt>'
534 // TODO: consider using push / pop instead of sub + store / add
Chris Lattnerbb07ef92004-02-14 19:49:54 +0000535 MachineInstr *Old = I;
Chris Lattner61807802007-04-25 04:25:10 +0000536 uint64_t Amount = Old->getOperand(0).getImm();
Chris Lattner3c1c03d2002-12-28 20:32:28 +0000537 if (Amount != 0) {
Chris Lattnerf158da22003-01-16 02:20:12 +0000538 // We need to keep the stack aligned properly. To do this, we round the
539 // amount of space needed for the outgoing arguments up to the next
540 // alignment boundary.
Bill Wendling80c76432009-08-16 11:00:26 +0000541 Amount = (Amount + StackAlign - 1) / StackAlign * StackAlign;
Chris Lattnerf158da22003-01-16 02:20:12 +0000542
Chris Lattner3648c672005-05-13 21:44:04 +0000543 MachineInstr *New = 0;
Dan Gohman6d4b0522008-10-01 18:28:06 +0000544 if (Old->getOpcode() == getCallFrameSetupOpcode()) {
Dale Johannesen21b55412009-02-12 23:08:38 +0000545 New = BuildMI(MF, Old->getDebugLoc(),
546 TII.get(Is64Bit ? X86::SUB64ri32 : X86::SUB32ri),
Bill Wendling80c76432009-08-16 11:00:26 +0000547 StackPtr)
548 .addReg(StackPtr)
549 .addImm(Amount);
Chris Lattner3c1c03d2002-12-28 20:32:28 +0000550 } else {
Dan Gohman6d4b0522008-10-01 18:28:06 +0000551 assert(Old->getOpcode() == getCallFrameDestroyOpcode());
Bill Wendling80c76432009-08-16 11:00:26 +0000552
553 // Factor out the amount the callee already popped.
Chris Lattner61807802007-04-25 04:25:10 +0000554 uint64_t CalleeAmt = Old->getOperand(1).getImm();
Chris Lattner3648c672005-05-13 21:44:04 +0000555 Amount -= CalleeAmt;
Bill Wendling80c76432009-08-16 11:00:26 +0000556
557 if (Amount) {
Evan Cheng25ab6902006-09-08 06:48:29 +0000558 unsigned Opc = (Amount < 128) ?
559 (Is64Bit ? X86::ADD64ri8 : X86::ADD32ri8) :
560 (Is64Bit ? X86::ADD64ri32 : X86::ADD32ri);
Dale Johannesen21b55412009-02-12 23:08:38 +0000561 New = BuildMI(MF, Old->getDebugLoc(), TII.get(Opc), StackPtr)
Bill Wendling80c76432009-08-16 11:00:26 +0000562 .addReg(StackPtr)
563 .addImm(Amount);
Chris Lattnerd77525d2006-02-03 18:20:04 +0000564 }
Chris Lattner3c1c03d2002-12-28 20:32:28 +0000565 }
Chris Lattnerbb07ef92004-02-14 19:49:54 +0000566
Dan Gohmand293e0d2009-02-11 19:50:24 +0000567 if (New) {
568 // The EFLAGS implicit def is dead.
569 New->getOperand(3).setIsDead();
Dan Gohmanbfd23c92008-12-18 22:03:42 +0000570
Bill Wendling80c76432009-08-16 11:00:26 +0000571 // Replace the pseudo instruction with a new instruction.
Dan Gohmand293e0d2009-02-11 19:50:24 +0000572 MBB.insert(I, New);
573 }
Chris Lattner3648c672005-05-13 21:44:04 +0000574 }
Dan Gohman6d4b0522008-10-01 18:28:06 +0000575 } else if (I->getOpcode() == getCallFrameDestroyOpcode()) {
Chris Lattner3648c672005-05-13 21:44:04 +0000576 // If we are performing frame pointer elimination and if the callee pops
577 // something off the stack pointer, add it back. We do this until we have
578 // more advanced stack pointer tracking ability.
Chris Lattner61807802007-04-25 04:25:10 +0000579 if (uint64_t CalleeAmt = I->getOperand(1).getImm()) {
Evan Cheng25ab6902006-09-08 06:48:29 +0000580 unsigned Opc = (CalleeAmt < 128) ?
581 (Is64Bit ? X86::SUB64ri8 : X86::SUB32ri8) :
582 (Is64Bit ? X86::SUB64ri32 : X86::SUB32ri);
Dale Johannesen21b55412009-02-12 23:08:38 +0000583 MachineInstr *Old = I;
Jeff Cohen00b168892005-07-27 06:12:32 +0000584 MachineInstr *New =
Dale Johannesen21b55412009-02-12 23:08:38 +0000585 BuildMI(MF, Old->getDebugLoc(), TII.get(Opc),
Bill Wendling80c76432009-08-16 11:00:26 +0000586 StackPtr)
587 .addReg(StackPtr)
588 .addImm(CalleeAmt);
589
Dan Gohmanbfd23c92008-12-18 22:03:42 +0000590 // The EFLAGS implicit def is dead.
591 New->getOperand(3).setIsDead();
Chris Lattnerbb07ef92004-02-14 19:49:54 +0000592 MBB.insert(I, New);
Chris Lattner3c1c03d2002-12-28 20:32:28 +0000593 }
594 }
595
Chris Lattnerbb07ef92004-02-14 19:49:54 +0000596 MBB.erase(I);
Chris Lattner3c1c03d2002-12-28 20:32:28 +0000597}
598
Jim Grosbachb58f4982009-10-07 17:12:56 +0000599unsigned
600X86RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
Jim Grosbachdff4b4c2010-03-09 21:45:49 +0000601 int SPAdj, FrameIndexValue *Value,
Jim Grosbachb58f4982009-10-07 17:12:56 +0000602 RegScavenger *RS) const{
Evan Cheng97de9132007-05-01 09:13:03 +0000603 assert(SPAdj == 0 && "Unexpected");
604
Chris Lattnerd264bec2003-01-13 00:50:33 +0000605 unsigned i = 0;
Alkis Evlogimenosc0b9dc52004-02-12 02:27:10 +0000606 MachineInstr &MI = *II;
Nate Begemanf8be5e92004-08-14 22:05:10 +0000607 MachineFunction &MF = *MI.getParent()->getParent();
Bill Wendling80c76432009-08-16 11:00:26 +0000608
Dan Gohmand735b802008-10-03 15:45:36 +0000609 while (!MI.getOperand(i).isFI()) {
Chris Lattner3c1c03d2002-12-28 20:32:28 +0000610 ++i;
611 assert(i < MI.getNumOperands() && "Instr doesn't have FrameIndex operand!");
612 }
613
Chris Lattner8aa797a2007-12-30 23:10:15 +0000614 int FrameIndex = MI.getOperand(i).getIndex();
Anton Korobeynikov8e91ec52008-04-23 18:21:02 +0000615 unsigned BasePtr;
Bill Wendling80c76432009-08-16 11:00:26 +0000616
Anton Korobeynikov8e91ec52008-04-23 18:21:02 +0000617 if (needsStackRealignment(MF))
618 BasePtr = (FrameIndex < 0 ? FramePtr : StackPtr);
619 else
620 BasePtr = (hasFP(MF) ? FramePtr : StackPtr);
621
Chris Lattnerd264bec2003-01-13 00:50:33 +0000622 // This must be part of a four operand memory reference. Replace the
Evan Cheng25ab6902006-09-08 06:48:29 +0000623 // FrameIndex with base register with EBP. Add an offset to the offset.
Anton Korobeynikov8e91ec52008-04-23 18:21:02 +0000624 MI.getOperand(i).ChangeToRegister(BasePtr, false);
Chris Lattnerd264bec2003-01-13 00:50:33 +0000625
Dan Gohman82779702008-12-24 00:27:51 +0000626 // Now add the frame object offset to the offset from EBP.
627 if (MI.getOperand(i+3).isImm()) {
628 // Offset is a 32-bit integer.
629 int Offset = getFrameIndexOffset(MF, FrameIndex) +
Bill Wendling80c76432009-08-16 11:00:26 +0000630 (int)(MI.getOperand(i + 3).getImm());
David Greene3f2bf852009-11-12 20:49:22 +0000631
632 MI.getOperand(i + 3).ChangeToImmediate(Offset);
Dan Gohman82779702008-12-24 00:27:51 +0000633 } else {
634 // Offset is symbolic. This is extremely rare.
635 uint64_t Offset = getFrameIndexOffset(MF, FrameIndex) +
636 (uint64_t)MI.getOperand(i+3).getOffset();
637 MI.getOperand(i+3).setOffset(Offset);
638 }
Jim Grosbachb58f4982009-10-07 17:12:56 +0000639 return 0;
Chris Lattner3c1c03d2002-12-28 20:32:28 +0000640}
641
Chris Lattnerbb07ef92004-02-14 19:49:54 +0000642void
Anton Korobeynikovb51dce32008-04-23 18:20:17 +0000643X86RegisterInfo::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
644 RegScavenger *RS) const {
Anton Korobeynikovcf6b7392009-08-03 08:12:53 +0000645 MachineFrameInfo *MFI = MF.getFrameInfo();
Anton Korobeynikovb51dce32008-04-23 18:20:17 +0000646
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +0000647 X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
648 int32_t TailCallReturnAddrDelta = X86FI->getTCReturnAddrDelta();
Bill Wendling80c76432009-08-16 11:00:26 +0000649
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +0000650 if (TailCallReturnAddrDelta < 0) {
651 // create RETURNADDR area
652 // arg
653 // arg
654 // RETADDR
655 // { ...
656 // RETADDR area
657 // ...
658 // }
659 // [EBP]
Anton Korobeynikovcf6b7392009-08-03 08:12:53 +0000660 MFI->CreateFixedObject(-TailCallReturnAddrDelta,
David Greene3f2bf852009-11-12 20:49:22 +0000661 (-1U*SlotSize)+TailCallReturnAddrDelta,
662 true, false);
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +0000663 }
Anton Korobeynikovcf6b7392009-08-03 08:12:53 +0000664
Chris Lattner3c1c03d2002-12-28 20:32:28 +0000665 if (hasFP(MF)) {
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +0000666 assert((TailCallReturnAddrDelta <= 0) &&
667 "The Delta should always be zero or negative");
Anton Korobeynikovdd93f5e2009-08-03 08:14:30 +0000668 const TargetFrameInfo &TFI = *MF.getTarget().getFrameInfo();
Bill Wendling80c76432009-08-16 11:00:26 +0000669
Chris Lattner3c1c03d2002-12-28 20:32:28 +0000670 // Create a frame entry for the EBP register that must be saved.
Anton Korobeynikovcf6b7392009-08-03 08:12:53 +0000671 int FrameIdx = MFI->CreateFixedObject(SlotSize,
Anton Korobeynikovdd93f5e2009-08-03 08:14:30 +0000672 -(int)SlotSize +
673 TFI.getOffsetOfLocalArea() +
David Greene3f2bf852009-11-12 20:49:22 +0000674 TailCallReturnAddrDelta,
675 true, false);
Anton Korobeynikovcf6b7392009-08-03 08:12:53 +0000676 assert(FrameIdx == MFI->getObjectIndexBegin() &&
Chris Lattner96c3d2e2004-02-15 00:15:37 +0000677 "Slot for EBP register must be last in order to be found!");
Devang Patelfd1c6c32008-12-23 21:56:28 +0000678 FrameIdx = 0;
Chris Lattner3c1c03d2002-12-28 20:32:28 +0000679 }
680}
681
Evan Chenga24dddd2007-04-26 01:09:28 +0000682/// emitSPUpdate - Emit a series of instructions to increment / decrement the
683/// stack pointer by a constant value.
684static
685void emitSPUpdate(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI,
686 unsigned StackPtr, int64_t NumBytes, bool Is64Bit,
687 const TargetInstrInfo &TII) {
688 bool isSub = NumBytes < 0;
689 uint64_t Offset = isSub ? -NumBytes : NumBytes;
690 unsigned Opc = isSub
691 ? ((Offset < 128) ?
692 (Is64Bit ? X86::SUB64ri8 : X86::SUB32ri8) :
693 (Is64Bit ? X86::SUB64ri32 : X86::SUB32ri))
694 : ((Offset < 128) ?
695 (Is64Bit ? X86::ADD64ri8 : X86::ADD32ri8) :
696 (Is64Bit ? X86::ADD64ri32 : X86::ADD32ri));
697 uint64_t Chunk = (1LL << 31) - 1;
Dale Johannesen73e884b2010-01-20 21:36:02 +0000698 DebugLoc DL = MBB.findDebugLoc(MBBI);
Evan Chenga24dddd2007-04-26 01:09:28 +0000699
700 while (Offset) {
701 uint64_t ThisVal = (Offset > Chunk) ? Chunk : Offset;
Dan Gohmanbfd23c92008-12-18 22:03:42 +0000702 MachineInstr *MI =
Dale Johannesen8d13f8f2009-02-13 02:33:27 +0000703 BuildMI(MBB, MBBI, DL, TII.get(Opc), StackPtr)
Bill Wendling3f5bb162009-08-15 21:27:32 +0000704 .addReg(StackPtr)
705 .addImm(ThisVal);
706 MI->getOperand(3).setIsDead(); // The EFLAGS implicit def is dead.
Evan Chenga24dddd2007-04-26 01:09:28 +0000707 Offset -= ThisVal;
708 }
709}
710
Bill Wendling80c76432009-08-16 11:00:26 +0000711/// mergeSPUpdatesUp - Merge two stack-manipulating instructions upper iterator.
Anton Korobeynikov4f1c33f2007-10-06 16:17:49 +0000712static
713void mergeSPUpdatesUp(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI,
714 unsigned StackPtr, uint64_t *NumBytes = NULL) {
Chris Lattnereac93852007-10-07 21:53:12 +0000715 if (MBBI == MBB.begin()) return;
Anton Korobeynikove2011902008-04-23 18:15:11 +0000716
Chris Lattnereac93852007-10-07 21:53:12 +0000717 MachineBasicBlock::iterator PI = prior(MBBI);
718 unsigned Opc = PI->getOpcode();
719 if ((Opc == X86::ADD64ri32 || Opc == X86::ADD64ri8 ||
720 Opc == X86::ADD32ri || Opc == X86::ADD32ri8) &&
721 PI->getOperand(0).getReg() == StackPtr) {
722 if (NumBytes)
723 *NumBytes += PI->getOperand(2).getImm();
724 MBB.erase(PI);
725 } else if ((Opc == X86::SUB64ri32 || Opc == X86::SUB64ri8 ||
726 Opc == X86::SUB32ri || Opc == X86::SUB32ri8) &&
727 PI->getOperand(0).getReg() == StackPtr) {
728 if (NumBytes)
729 *NumBytes -= PI->getOperand(2).getImm();
730 MBB.erase(PI);
Anton Korobeynikov4f1c33f2007-10-06 16:17:49 +0000731 }
732}
733
Bill Wendling80c76432009-08-16 11:00:26 +0000734/// mergeSPUpdatesUp - Merge two stack-manipulating instructions lower iterator.
Anton Korobeynikov25083722007-10-06 16:39:43 +0000735static
Chris Lattnereac93852007-10-07 21:53:12 +0000736void mergeSPUpdatesDown(MachineBasicBlock &MBB,
737 MachineBasicBlock::iterator &MBBI,
Anton Korobeynikov25083722007-10-06 16:39:43 +0000738 unsigned StackPtr, uint64_t *NumBytes = NULL) {
Bill Wendling3f5bb162009-08-15 21:27:32 +0000739 // FIXME: THIS ISN'T RUN!!!
Chris Lattnerf443ba72007-10-07 22:00:31 +0000740 return;
Anton Korobeynikove2011902008-04-23 18:15:11 +0000741
Chris Lattnereac93852007-10-07 21:53:12 +0000742 if (MBBI == MBB.end()) return;
Anton Korobeynikove2011902008-04-23 18:15:11 +0000743
Chris Lattner7896c9f2009-12-03 00:50:42 +0000744 MachineBasicBlock::iterator NI = llvm::next(MBBI);
Chris Lattnereac93852007-10-07 21:53:12 +0000745 if (NI == MBB.end()) return;
Anton Korobeynikove2011902008-04-23 18:15:11 +0000746
Chris Lattnereac93852007-10-07 21:53:12 +0000747 unsigned Opc = NI->getOpcode();
748 if ((Opc == X86::ADD64ri32 || Opc == X86::ADD64ri8 ||
749 Opc == X86::ADD32ri || Opc == X86::ADD32ri8) &&
750 NI->getOperand(0).getReg() == StackPtr) {
751 if (NumBytes)
752 *NumBytes -= NI->getOperand(2).getImm();
753 MBB.erase(NI);
754 MBBI = NI;
755 } else if ((Opc == X86::SUB64ri32 || Opc == X86::SUB64ri8 ||
756 Opc == X86::SUB32ri || Opc == X86::SUB32ri8) &&
757 NI->getOperand(0).getReg() == StackPtr) {
758 if (NumBytes)
759 *NumBytes += NI->getOperand(2).getImm();
760 MBB.erase(NI);
761 MBBI = NI;
Anton Korobeynikov25083722007-10-06 16:39:43 +0000762 }
763}
764
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +0000765/// mergeSPUpdates - Checks the instruction before/after the passed
Bill Wendling80c76432009-08-16 11:00:26 +0000766/// instruction. If it is an ADD/SUB instruction it is deleted argument and the
767/// stack adjustment is returned as a positive value for ADD and a negative for
768/// SUB.
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +0000769static int mergeSPUpdates(MachineBasicBlock &MBB,
770 MachineBasicBlock::iterator &MBBI,
Anton Korobeynikove2011902008-04-23 18:15:11 +0000771 unsigned StackPtr,
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +0000772 bool doMergeWithPrevious) {
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +0000773 if ((doMergeWithPrevious && MBBI == MBB.begin()) ||
774 (!doMergeWithPrevious && MBBI == MBB.end()))
775 return 0;
776
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +0000777 MachineBasicBlock::iterator PI = doMergeWithPrevious ? prior(MBBI) : MBBI;
Chris Lattner7896c9f2009-12-03 00:50:42 +0000778 MachineBasicBlock::iterator NI = doMergeWithPrevious ? 0 : llvm::next(MBBI);
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +0000779 unsigned Opc = PI->getOpcode();
Bill Wendling80c76432009-08-16 11:00:26 +0000780 int Offset = 0;
781
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +0000782 if ((Opc == X86::ADD64ri32 || Opc == X86::ADD64ri8 ||
783 Opc == X86::ADD32ri || Opc == X86::ADD32ri8) &&
784 PI->getOperand(0).getReg() == StackPtr){
785 Offset += PI->getOperand(2).getImm();
786 MBB.erase(PI);
787 if (!doMergeWithPrevious) MBBI = NI;
788 } else if ((Opc == X86::SUB64ri32 || Opc == X86::SUB64ri8 ||
789 Opc == X86::SUB32ri || Opc == X86::SUB32ri8) &&
790 PI->getOperand(0).getReg() == StackPtr) {
791 Offset -= PI->getOperand(2).getImm();
792 MBB.erase(PI);
793 if (!doMergeWithPrevious) MBBI = NI;
Anton Korobeynikove2011902008-04-23 18:15:11 +0000794 }
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +0000795
796 return Offset;
797}
798
Bill Wendlingc3d505c2009-07-08 21:02:53 +0000799void X86RegisterInfo::emitCalleeSavedFrameMoves(MachineFunction &MF,
800 unsigned LabelId,
801 unsigned FramePtr) const {
Anton Korobeynikov9bbbea52008-04-23 18:15:48 +0000802 MachineFrameInfo *MFI = MF.getFrameInfo();
803 MachineModuleInfo *MMI = MFI->getMachineModuleInfo();
Bill Wendlingc3d505c2009-07-08 21:02:53 +0000804 if (!MMI) return;
Anton Korobeynikov9bbbea52008-04-23 18:15:48 +0000805
Bill Wendlingc3d505c2009-07-08 21:02:53 +0000806 // Add callee saved registers to move list.
807 const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
808 if (CSI.empty()) return;
809
Anton Korobeynikov9bbbea52008-04-23 18:15:48 +0000810 std::vector<MachineMove> &Moves = MMI->getFrameMoves();
811 const TargetData *TD = MF.getTarget().getTargetData();
Bill Wendlingc3d505c2009-07-08 21:02:53 +0000812 bool HasFP = hasFP(MF);
Anton Korobeynikov9bbbea52008-04-23 18:15:48 +0000813
Bill Wendling80c76432009-08-16 11:00:26 +0000814 // Calculate amount of bytes used for return address storing.
Anton Korobeynikov9bbbea52008-04-23 18:15:48 +0000815 int stackGrowth =
816 (MF.getTarget().getFrameInfo()->getStackGrowthDirection() ==
817 TargetFrameInfo::StackGrowsUp ?
818 TD->getPointerSize() : -TD->getPointerSize());
819
Anton Korobeynikov9bbbea52008-04-23 18:15:48 +0000820 // FIXME: This is dirty hack. The code itself is pretty mess right now.
821 // It should be rewritten from scratch and generalized sometimes.
822
Bill Wendling80c76432009-08-16 11:00:26 +0000823 // Determine maximum offset (minumum due to stack growth).
Anton Korobeynikov9bbbea52008-04-23 18:15:48 +0000824 int64_t MaxOffset = 0;
Bill Wendlingc3d505c2009-07-08 21:02:53 +0000825 for (std::vector<CalleeSavedInfo>::const_iterator
826 I = CSI.begin(), E = CSI.end(); I != E; ++I)
Anton Korobeynikov9bbbea52008-04-23 18:15:48 +0000827 MaxOffset = std::min(MaxOffset,
Bill Wendlingc3d505c2009-07-08 21:02:53 +0000828 MFI->getObjectOffset(I->getFrameIdx()));
Anton Korobeynikov9bbbea52008-04-23 18:15:48 +0000829
Bill Wendlingc3d505c2009-07-08 21:02:53 +0000830 // Calculate offsets.
831 int64_t saveAreaOffset = (HasFP ? 3 : 2) * stackGrowth;
832 for (std::vector<CalleeSavedInfo>::const_iterator
833 I = CSI.begin(), E = CSI.end(); I != E; ++I) {
834 int64_t Offset = MFI->getObjectOffset(I->getFrameIdx());
835 unsigned Reg = I->getReg();
836 Offset = MaxOffset - Offset + saveAreaOffset;
837
Duncan Sandsdaf22122009-07-23 19:00:02 +0000838 // Don't output a new machine move if we're re-saving the frame
839 // pointer. This happens when the PrologEpilogInserter has inserted an extra
840 // "PUSH" of the frame pointer -- the "emitPrologue" method automatically
841 // generates one when frame pointers are used. If we generate a "machine
842 // move" for this extra "PUSH", the linker will lose track of the fact that
843 // the frame pointer should have the value of the first "PUSH" when it's
844 // trying to unwind.
845 //
846 // FIXME: This looks inelegant. It's possibly correct, but it's covering up
847 // another bug. I.e., one where we generate a prolog like this:
848 //
849 // pushl %ebp
850 // movl %esp, %ebp
851 // pushl %ebp
852 // pushl %esi
853 // ...
854 //
855 // The immediate re-push of EBP is unnecessary. At the least, it's an
856 // optimization bug. EBP can be used as a scratch register in certain
857 // cases, but probably not when we have a frame pointer.
858 if (HasFP && FramePtr == Reg)
859 continue;
860
Anton Korobeynikov9bbbea52008-04-23 18:15:48 +0000861 MachineLocation CSDst(MachineLocation::VirtualFP, Offset);
862 MachineLocation CSSrc(Reg);
Bill Wendlingc3d505c2009-07-08 21:02:53 +0000863 Moves.push_back(MachineMove(LabelId, CSDst, CSSrc));
Bill Wendlingfe7f2942009-06-16 04:12:45 +0000864 }
Anton Korobeynikov9bbbea52008-04-23 18:15:48 +0000865}
866
Bill Wendling3f5bb162009-08-15 21:27:32 +0000867/// emitPrologue - Push callee-saved registers onto the stack, which
868/// automatically adjust the stack pointer. Adjust the stack pointer to allocate
869/// space for local variables. Also emit labels used by the exception handler to
870/// generate the exception handling frames.
Chris Lattnerbb07ef92004-02-14 19:49:54 +0000871void X86RegisterInfo::emitPrologue(MachineFunction &MF) const {
Bill Wendling3f5bb162009-08-15 21:27:32 +0000872 MachineBasicBlock &MBB = MF.front(); // Prologue goes in entry BB.
873 MachineBasicBlock::iterator MBBI = MBB.begin();
Chris Lattnereafa4232003-01-15 22:57:35 +0000874 MachineFrameInfo *MFI = MF.getFrameInfo();
Bill Wendling3f5bb162009-08-15 21:27:32 +0000875 const Function *Fn = MF.getFunction();
876 const X86Subtarget *Subtarget = &MF.getTarget().getSubtarget<X86Subtarget>();
Jim Laskey44c3b9f2007-01-26 21:22:28 +0000877 MachineModuleInfo *MMI = MFI->getMachineModuleInfo();
Evan Cheng89d16592007-07-17 07:59:08 +0000878 X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
Anton Korobeynikove2011902008-04-23 18:15:11 +0000879 bool needsFrameMoves = (MMI && MMI->hasDebugInfo()) ||
Bill Wendling3f5bb162009-08-15 21:27:32 +0000880 !Fn->doesNotThrow() || UnwindTablesMandatory;
881 uint64_t MaxAlign = MFI->getMaxAlignment(); // Desired stack alignment.
882 uint64_t StackSize = MFI->getStackSize(); // Number of bytes to allocate.
Bill Wendlingc3d505c2009-07-08 21:02:53 +0000883 bool HasFP = hasFP(MF);
Devang Patel369de262009-06-17 00:48:26 +0000884 DebugLoc DL;
Bill Wendling3d2445f2009-02-21 00:43:56 +0000885
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +0000886 // Add RETADDR move area to callee saved frame size.
887 int TailCallReturnAddrDelta = X86FI->getTCReturnAddrDelta();
Anton Korobeynikove2011902008-04-23 18:15:11 +0000888 if (TailCallReturnAddrDelta < 0)
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +0000889 X86FI->setCalleeSavedFrameSize(
Bill Wendling3f5bb162009-08-15 21:27:32 +0000890 X86FI->getCalleeSavedFrameSize() - TailCallReturnAddrDelta);
Evan Chengd9245ca2006-04-14 07:26:43 +0000891
Dan Gohman336b6362009-01-27 00:40:06 +0000892 // If this is x86-64 and the Red Zone is not disabled, if we are a leaf
893 // function, and use up to 128 bytes of stack space, don't have a frame
894 // pointer, calls, or dynamic alloca then we do not need to adjust the
895 // stack pointer (we fit in the Red Zone).
Bill Wendling3f5bb162009-08-15 21:27:32 +0000896 if (Is64Bit && !Fn->hasFnAttr(Attribute::NoRedZone) &&
Dan Gohman336b6362009-01-27 00:40:06 +0000897 !needsStackRealignment(MF) &&
898 !MFI->hasVarSizedObjects() && // No dynamic alloca.
Eli Friedman9a417122009-06-04 02:02:01 +0000899 !MFI->hasCalls() && // No calls.
900 !Subtarget->isTargetWin64()) { // Win64 has no Red Zone
Dan Gohman336b6362009-01-27 00:40:06 +0000901 uint64_t MinSize = X86FI->getCalleeSavedFrameSize();
Bill Wendlingc3d505c2009-07-08 21:02:53 +0000902 if (HasFP) MinSize += SlotSize;
Bill Wendling3f5bb162009-08-15 21:27:32 +0000903 StackSize = std::max(MinSize, StackSize > 128 ? StackSize - 128 : 0);
Dan Gohman336b6362009-01-27 00:40:06 +0000904 MFI->setStackSize(StackSize);
Anton Korobeynikovcf6b7392009-08-03 08:12:53 +0000905 } else if (Subtarget->isTargetWin64()) {
906 // We need to always allocate 32 bytes as register spill area.
Bill Wendling3f5bb162009-08-15 21:27:32 +0000907 // FIXME: We might reuse these 32 bytes for leaf functions.
Anton Korobeynikovcf6b7392009-08-03 08:12:53 +0000908 StackSize += 32;
909 MFI->setStackSize(StackSize);
Dan Gohman336b6362009-01-27 00:40:06 +0000910 }
911
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +0000912 // Insert stack pointer adjustment for later moving of return addr. Only
913 // applies to tail call optimized functions where the callee argument stack
914 // size is bigger than the callers.
915 if (TailCallReturnAddrDelta < 0) {
Dan Gohmanbfd23c92008-12-18 22:03:42 +0000916 MachineInstr *MI =
Dale Johannesen21b55412009-02-12 23:08:38 +0000917 BuildMI(MBB, MBBI, DL, TII.get(Is64Bit? X86::SUB64ri32 : X86::SUB32ri),
Bill Wendling3f5bb162009-08-15 21:27:32 +0000918 StackPtr)
919 .addReg(StackPtr)
920 .addImm(-TailCallReturnAddrDelta);
921 MI->getOperand(3).setIsDead(); // The EFLAGS implicit def is dead.
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +0000922 }
923
Bill Wendling3f5bb162009-08-15 21:27:32 +0000924 // Mapping for machine moves:
925 //
926 // DST: VirtualFP AND
927 // SRC: VirtualFP => DW_CFA_def_cfa_offset
928 // ELSE => DW_CFA_def_cfa
929 //
930 // SRC: VirtualFP AND
931 // DST: Register => DW_CFA_def_cfa_register
932 //
933 // ELSE
934 // OFFSET < 0 => DW_CFA_offset_extended_sf
935 // REG < 64 => DW_CFA_offset + Reg
936 // ELSE => DW_CFA_offset_extended
937
Bill Wendlingc3d505c2009-07-08 21:02:53 +0000938 std::vector<MachineMove> &Moves = MMI->getFrameMoves();
939 const TargetData *TD = MF.getTarget().getTargetData();
Bill Wendling3f5bb162009-08-15 21:27:32 +0000940 uint64_t NumBytes = 0;
Chris Lattner464bee12010-03-13 08:04:35 +0000941 int stackGrowth = -TD->getPointerSize();
Bill Wendlingc3d505c2009-07-08 21:02:53 +0000942
Bill Wendlingc3d505c2009-07-08 21:02:53 +0000943 if (HasFP) {
Bill Wendling3f5bb162009-08-15 21:27:32 +0000944 // Calculate required stack adjustment.
Anton Korobeynikov2c430cb2008-04-23 18:21:27 +0000945 uint64_t FrameSize = StackSize - SlotSize;
946 if (needsStackRealignment(MF))
Bill Wendling3f5bb162009-08-15 21:27:32 +0000947 FrameSize = (FrameSize + MaxAlign - 1) / MaxAlign * MaxAlign;
Anton Korobeynikov2c430cb2008-04-23 18:21:27 +0000948
949 NumBytes = FrameSize - X86FI->getCalleeSavedFrameSize();
950
Bill Wendlingc3d505c2009-07-08 21:02:53 +0000951 // Get the offset of the stack slot for the EBP register, which is
Evan Cheng89d16592007-07-17 07:59:08 +0000952 // guaranteed to be the last slot by processFunctionBeforeFrameFinalized.
953 // Update the frame offset adjustment.
Anton Korobeynikov2c430cb2008-04-23 18:21:27 +0000954 MFI->setOffsetAdjustment(-NumBytes);
Evan Cheng89d16592007-07-17 07:59:08 +0000955
Bill Wendling3f5bb162009-08-15 21:27:32 +0000956 // Save EBP/RBP into the appropriate stack slot.
Dale Johannesen21b55412009-02-12 23:08:38 +0000957 BuildMI(MBB, MBBI, DL, TII.get(Is64Bit ? X86::PUSH64r : X86::PUSH32r))
Bill Wendling587daed2009-05-13 21:33:08 +0000958 .addReg(FramePtr, RegState::Kill);
Evan Cheng89d16592007-07-17 07:59:08 +0000959
Bill Wendling92c1e122009-02-13 02:16:35 +0000960 if (needsFrameMoves) {
Bill Wendling3f5bb162009-08-15 21:27:32 +0000961 // Mark the place where EBP/RBP was saved.
Bill Wendlingc3d505c2009-07-08 21:02:53 +0000962 unsigned FrameLabelId = MMI->NextLabelID();
Bill Wendling92c1e122009-02-13 02:16:35 +0000963 BuildMI(MBB, MBBI, DL, TII.get(X86::DBG_LABEL)).addImm(FrameLabelId);
Bill Wendlingc3d505c2009-07-08 21:02:53 +0000964
965 // Define the current CFA rule to use the provided offset.
966 if (StackSize) {
967 MachineLocation SPDst(MachineLocation::VirtualFP);
Bill Wendling80c76432009-08-16 11:00:26 +0000968 MachineLocation SPSrc(MachineLocation::VirtualFP, 2 * stackGrowth);
Bill Wendlingc3d505c2009-07-08 21:02:53 +0000969 Moves.push_back(MachineMove(FrameLabelId, SPDst, SPSrc));
970 } else {
971 // FIXME: Verify & implement for FP
972 MachineLocation SPDst(StackPtr);
973 MachineLocation SPSrc(StackPtr, stackGrowth);
974 Moves.push_back(MachineMove(FrameLabelId, SPDst, SPSrc));
975 }
976
977 // Change the rule for the FramePtr to be an "offset" rule.
Chris Lattner464bee12010-03-13 08:04:35 +0000978 MachineLocation FPDst(MachineLocation::VirtualFP, 2 * stackGrowth);
Bill Wendlingc3d505c2009-07-08 21:02:53 +0000979 MachineLocation FPSrc(FramePtr);
980 Moves.push_back(MachineMove(FrameLabelId, FPDst, FPSrc));
Bill Wendling92c1e122009-02-13 02:16:35 +0000981 }
982
Evan Cheng89d16592007-07-17 07:59:08 +0000983 // Update EBP with the new base value...
Dale Johannesen21b55412009-02-12 23:08:38 +0000984 BuildMI(MBB, MBBI, DL,
985 TII.get(Is64Bit ? X86::MOV64rr : X86::MOV32rr), FramePtr)
986 .addReg(StackPtr);
Anton Korobeynikov2c430cb2008-04-23 18:21:27 +0000987
Bill Wendlingc3d505c2009-07-08 21:02:53 +0000988 if (needsFrameMoves) {
Bill Wendling3f5bb162009-08-15 21:27:32 +0000989 // Mark effective beginning of when frame pointer becomes valid.
Bill Wendlingc3d505c2009-07-08 21:02:53 +0000990 unsigned FrameLabelId = MMI->NextLabelID();
991 BuildMI(MBB, MBBI, DL, TII.get(X86::DBG_LABEL)).addImm(FrameLabelId);
992
993 // Define the current CFA to use the EBP/RBP register.
994 MachineLocation FPDst(FramePtr);
995 MachineLocation FPSrc(MachineLocation::VirtualFP);
996 Moves.push_back(MachineMove(FrameLabelId, FPDst, FPSrc));
997 }
998
Dan Gohman34d6ad72008-12-18 22:01:52 +0000999 // Mark the FramePtr as live-in in every block except the entry.
Chris Lattner7896c9f2009-12-03 00:50:42 +00001000 for (MachineFunction::iterator I = llvm::next(MF.begin()), E = MF.end();
Dan Gohman34d6ad72008-12-18 22:01:52 +00001001 I != E; ++I)
1002 I->addLiveIn(FramePtr);
1003
Anton Korobeynikov2c430cb2008-04-23 18:21:27 +00001004 // Realign stack
Dan Gohmanbfd23c92008-12-18 22:03:42 +00001005 if (needsStackRealignment(MF)) {
1006 MachineInstr *MI =
Dale Johannesen21b55412009-02-12 23:08:38 +00001007 BuildMI(MBB, MBBI, DL,
Dan Gohmanbfd23c92008-12-18 22:03:42 +00001008 TII.get(Is64Bit ? X86::AND64ri32 : X86::AND32ri),
1009 StackPtr).addReg(StackPtr).addImm(-MaxAlign);
Bill Wendlingc3d505c2009-07-08 21:02:53 +00001010
Dan Gohmanbfd23c92008-12-18 22:03:42 +00001011 // The EFLAGS implicit def is dead.
1012 MI->getOperand(3).setIsDead();
1013 }
Bill Wendling3d2445f2009-02-21 00:43:56 +00001014 } else {
Anton Korobeynikov2c430cb2008-04-23 18:21:27 +00001015 NumBytes = StackSize - X86FI->getCalleeSavedFrameSize();
Bill Wendling3d2445f2009-02-21 00:43:56 +00001016 }
Anton Korobeynikove2011902008-04-23 18:15:11 +00001017
Evan Cheng89d16592007-07-17 07:59:08 +00001018 // Skip the callee-saved push instructions.
Bill Wendling3f5bb162009-08-15 21:27:32 +00001019 bool PushedRegs = false;
1020 int StackOffset = 2 * stackGrowth;
1021
Evan Cheng89d16592007-07-17 07:59:08 +00001022 while (MBBI != MBB.end() &&
1023 (MBBI->getOpcode() == X86::PUSH32r ||
Bill Wendlingc3d505c2009-07-08 21:02:53 +00001024 MBBI->getOpcode() == X86::PUSH64r)) {
Bill Wendling3f5bb162009-08-15 21:27:32 +00001025 PushedRegs = true;
Evan Cheng89d16592007-07-17 07:59:08 +00001026 ++MBBI;
Bill Wendlingc3d505c2009-07-08 21:02:53 +00001027
Bill Wendling3f5bb162009-08-15 21:27:32 +00001028 if (!HasFP && needsFrameMoves) {
1029 // Mark callee-saved push instruction.
1030 unsigned LabelId = MMI->NextLabelID();
1031 BuildMI(MBB, MBBI, DL, TII.get(X86::DBG_LABEL)).addImm(LabelId);
Bill Wendlingc3d505c2009-07-08 21:02:53 +00001032
Bill Wendling3f5bb162009-08-15 21:27:32 +00001033 // Define the current CFA rule to use the provided offset.
1034 unsigned Ptr = StackSize ?
1035 MachineLocation::VirtualFP : StackPtr;
1036 MachineLocation SPDst(Ptr);
1037 MachineLocation SPSrc(Ptr, StackOffset);
1038 Moves.push_back(MachineMove(LabelId, SPDst, SPSrc));
1039 StackOffset += stackGrowth;
1040 }
Bill Wendlingc3d505c2009-07-08 21:02:53 +00001041 }
Evan Cheng89d16592007-07-17 07:59:08 +00001042
Dale Johannesen73e884b2010-01-20 21:36:02 +00001043 DL = MBB.findDebugLoc(MBBI);
Bill Wendling3d2445f2009-02-21 00:43:56 +00001044
Bill Wendling3ae67f52009-06-09 20:08:51 +00001045 // Adjust stack pointer: ESP -= numbytes.
1046 if (NumBytes >= 4096 && Subtarget->isTargetCygMing()) {
1047 // Check, whether EAX is livein for this function.
1048 bool isEAXAlive = false;
1049 for (MachineRegisterInfo::livein_iterator
Chris Lattner84bc5422007-12-31 04:13:23 +00001050 II = MF.getRegInfo().livein_begin(),
1051 EE = MF.getRegInfo().livein_end(); (II != EE) && !isEAXAlive; ++II) {
Bill Wendling3ae67f52009-06-09 20:08:51 +00001052 unsigned Reg = II->first;
1053 isEAXAlive = (Reg == X86::EAX || Reg == X86::AX ||
1054 Reg == X86::AH || Reg == X86::AL);
Evan Cheng004fb922006-06-13 05:14:44 +00001055 }
Bill Wendling3ae67f52009-06-09 20:08:51 +00001056
1057 // Function prologue calls _alloca to probe the stack when allocating more
1058 // than 4k bytes in one go. Touching the stack at 4K increments is necessary
1059 // to ensure that the guard pages used by the OS virtual memory manager are
1060 // allocated in correct sequence.
1061 if (!isEAXAlive) {
1062 BuildMI(MBB, MBBI, DL, TII.get(X86::MOV32ri), X86::EAX)
1063 .addImm(NumBytes);
1064 BuildMI(MBB, MBBI, DL, TII.get(X86::CALLpcrel32))
Anton Korobeynikov043f3c22010-03-06 19:32:29 +00001065 .addExternalSymbol("_alloca")
1066 .addReg(StackPtr, RegState::Define | RegState::Implicit);
Bill Wendling3ae67f52009-06-09 20:08:51 +00001067 } else {
1068 // Save EAX
1069 BuildMI(MBB, MBBI, DL, TII.get(X86::PUSH32r))
1070 .addReg(X86::EAX, RegState::Kill);
1071
1072 // Allocate NumBytes-4 bytes on stack. We'll also use 4 already
1073 // allocated bytes for EAX.
1074 BuildMI(MBB, MBBI, DL, TII.get(X86::MOV32ri), X86::EAX)
1075 .addImm(NumBytes - 4);
1076 BuildMI(MBB, MBBI, DL, TII.get(X86::CALLpcrel32))
Anton Korobeynikov043f3c22010-03-06 19:32:29 +00001077 .addExternalSymbol("_alloca")
1078 .addReg(StackPtr, RegState::Define | RegState::Implicit);
Bill Wendling3ae67f52009-06-09 20:08:51 +00001079
1080 // Restore EAX
1081 MachineInstr *MI = addRegOffset(BuildMI(MF, DL, TII.get(X86::MOV32rm),
1082 X86::EAX),
1083 StackPtr, false, NumBytes - 4);
1084 MBB.insert(MBBI, MI);
1085 }
1086 } else if (NumBytes) {
1087 // If there is an SUB32ri of ESP immediately before this instruction, merge
1088 // the two. This can be the case when tail call elimination is enabled and
1089 // the callee has more arguments then the caller.
1090 NumBytes -= mergeSPUpdates(MBB, MBBI, StackPtr, true);
1091
1092 // If there is an ADD32ri or SUB32ri of ESP immediately after this
1093 // instruction, merge the two instructions.
1094 mergeSPUpdatesDown(MBB, MBBI, StackPtr, &NumBytes);
1095
1096 if (NumBytes)
1097 emitSPUpdate(MBB, MBBI, StackPtr, -(int64_t)NumBytes, Is64Bit, TII);
Evan Chengd9245ca2006-04-14 07:26:43 +00001098 }
Bill Wendlingd15f45f2009-07-09 22:30:02 +00001099
Bill Wendlingeb3a7662009-09-03 22:19:22 +00001100 if ((NumBytes || PushedRegs) && needsFrameMoves) {
Bill Wendlingd15f45f2009-07-09 22:30:02 +00001101 // Mark end of stack pointer adjustment.
1102 unsigned LabelId = MMI->NextLabelID();
1103 BuildMI(MBB, MBBI, DL, TII.get(X86::DBG_LABEL)).addImm(LabelId);
1104
Bill Wendlingeb3a7662009-09-03 22:19:22 +00001105 if (!HasFP && NumBytes) {
Bill Wendling3f5bb162009-08-15 21:27:32 +00001106 // Define the current CFA rule to use the provided offset.
1107 if (StackSize) {
1108 MachineLocation SPDst(MachineLocation::VirtualFP);
1109 MachineLocation SPSrc(MachineLocation::VirtualFP,
1110 -StackSize + stackGrowth);
1111 Moves.push_back(MachineMove(LabelId, SPDst, SPSrc));
1112 } else {
1113 // FIXME: Verify & implement for FP
1114 MachineLocation SPDst(StackPtr);
1115 MachineLocation SPSrc(StackPtr, stackGrowth);
1116 Moves.push_back(MachineMove(LabelId, SPDst, SPSrc));
1117 }
Bill Wendlingd15f45f2009-07-09 22:30:02 +00001118 }
Bill Wendling3f5bb162009-08-15 21:27:32 +00001119
1120 // Emit DWARF info specifying the offsets of the callee-saved registers.
1121 if (PushedRegs)
1122 emitCalleeSavedFrameMoves(MF, LabelId, HasFP ? FramePtr : StackPtr);
Bill Wendlingd15f45f2009-07-09 22:30:02 +00001123 }
Misha Brukman2adb3952002-12-04 23:57:03 +00001124}
1125
Chris Lattnerbb07ef92004-02-14 19:49:54 +00001126void X86RegisterInfo::emitEpilogue(MachineFunction &MF,
1127 MachineBasicBlock &MBB) const {
Chris Lattneraa09b752002-12-28 21:08:28 +00001128 const MachineFrameInfo *MFI = MF.getFrameInfo();
Evan Cheng89d16592007-07-17 07:59:08 +00001129 X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
Alkis Evlogimenosf81af212004-02-14 01:18:34 +00001130 MachineBasicBlock::iterator MBBI = prior(MBB.end());
Anton Korobeynikov2365f512007-07-14 14:06:15 +00001131 unsigned RetOpcode = MBBI->getOpcode();
Bill Wendling2625f9b2009-02-21 00:32:08 +00001132 DebugLoc DL = MBBI->getDebugLoc();
Chris Lattner2b3d56e2005-05-14 23:35:21 +00001133
Anton Korobeynikov2365f512007-07-14 14:06:15 +00001134 switch (RetOpcode) {
Bill Wendling80c76432009-08-16 11:00:26 +00001135 default:
1136 llvm_unreachable("Can only insert epilog into returning blocks");
Chris Lattner2b3d56e2005-05-14 23:35:21 +00001137 case X86::RET:
1138 case X86::RETI:
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +00001139 case X86::TCRETURNdi:
1140 case X86::TCRETURNri:
Evan Chengf48ef032010-03-14 03:48:46 +00001141 case X86::TCRETURNmi:
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +00001142 case X86::TCRETURNdi64:
Evan Chengf48ef032010-03-14 03:48:46 +00001143 case X86::TCRETURNri64:
1144 case X86::TCRETURNmi64:
Anton Korobeynikov2365f512007-07-14 14:06:15 +00001145 case X86::EH_RETURN:
Anton Korobeynikovb84c1672008-09-08 21:12:47 +00001146 case X86::EH_RETURN64:
Bill Wendling80c76432009-08-16 11:00:26 +00001147 break; // These are ok
Chris Lattner2b3d56e2005-05-14 23:35:21 +00001148 }
Misha Brukman2adb3952002-12-04 23:57:03 +00001149
Bill Wendling80c76432009-08-16 11:00:26 +00001150 // Get the number of bytes to allocate from the FrameInfo.
Evan Cheng89d16592007-07-17 07:59:08 +00001151 uint64_t StackSize = MFI->getStackSize();
Anton Korobeynikov2c430cb2008-04-23 18:21:27 +00001152 uint64_t MaxAlign = MFI->getMaxAlignment();
Evan Cheng89d16592007-07-17 07:59:08 +00001153 unsigned CSSize = X86FI->getCalleeSavedFrameSize();
Anton Korobeynikov2c430cb2008-04-23 18:21:27 +00001154 uint64_t NumBytes = 0;
Evan Cheng89d16592007-07-17 07:59:08 +00001155
Chris Lattner3c1c03d2002-12-28 20:32:28 +00001156 if (hasFP(MF)) {
Bill Wendling80c76432009-08-16 11:00:26 +00001157 // Calculate required stack adjustment.
Anton Korobeynikov2c430cb2008-04-23 18:21:27 +00001158 uint64_t FrameSize = StackSize - SlotSize;
1159 if (needsStackRealignment(MF))
1160 FrameSize = (FrameSize + MaxAlign - 1)/MaxAlign*MaxAlign;
1161
1162 NumBytes = FrameSize - CSSize;
1163
Bill Wendling80c76432009-08-16 11:00:26 +00001164 // Pop EBP.
Bill Wendling3d2445f2009-02-21 00:43:56 +00001165 BuildMI(MBB, MBBI, DL,
Dale Johannesen21b55412009-02-12 23:08:38 +00001166 TII.get(Is64Bit ? X86::POP64r : X86::POP32r), FramePtr);
Bill Wendling2625f9b2009-02-21 00:32:08 +00001167 } else {
Anton Korobeynikov2c430cb2008-04-23 18:21:27 +00001168 NumBytes = StackSize - CSSize;
Bill Wendling2625f9b2009-02-21 00:32:08 +00001169 }
Anton Korobeynikov2365f512007-07-14 14:06:15 +00001170
Evan Chengf27795d2007-07-17 18:03:34 +00001171 // Skip the callee-saved pop instructions.
Anton Korobeynikov2c430cb2008-04-23 18:21:27 +00001172 MachineBasicBlock::iterator LastCSPop = MBBI;
Evan Chengf27795d2007-07-17 18:03:34 +00001173 while (MBBI != MBB.begin()) {
Evan Chengfcc87932007-07-26 17:45:41 +00001174 MachineBasicBlock::iterator PI = prior(MBBI);
1175 unsigned Opc = PI->getOpcode();
Bill Wendling80c76432009-08-16 11:00:26 +00001176
Bill Wendlingf7c09402008-10-31 18:30:19 +00001177 if (Opc != X86::POP32r && Opc != X86::POP64r &&
1178 !PI->getDesc().isTerminator())
Evan Chengf27795d2007-07-17 18:03:34 +00001179 break;
Bill Wendling80c76432009-08-16 11:00:26 +00001180
Evan Chengf27795d2007-07-17 18:03:34 +00001181 --MBBI;
1182 }
1183
Bill Wendling3d2445f2009-02-21 00:43:56 +00001184 DL = MBBI->getDebugLoc();
1185
Anton Korobeynikov4f1c33f2007-10-06 16:17:49 +00001186 // If there is an ADD32ri or SUB32ri of ESP immediately before this
1187 // instruction, merge the two instructions.
1188 if (NumBytes || MFI->hasVarSizedObjects())
1189 mergeSPUpdatesUp(MBB, MBBI, StackPtr, &NumBytes);
Evan Cheng5b3332c2007-07-17 18:40:47 +00001190
Anton Korobeynikov4f1c33f2007-10-06 16:17:49 +00001191 // If dynamic alloca is used, then reset esp to point to the last callee-saved
Anton Korobeynikov2c430cb2008-04-23 18:21:27 +00001192 // slot before popping them off! Same applies for the case, when stack was
Bill Wendling80c76432009-08-16 11:00:26 +00001193 // realigned.
Anton Korobeynikov2c430cb2008-04-23 18:21:27 +00001194 if (needsStackRealignment(MF)) {
1195 // We cannot use LEA here, because stack pointer was realigned. We need to
Bill Wendling80c76432009-08-16 11:00:26 +00001196 // deallocate local frame back.
Evan Cheng3c46eef2007-07-18 21:26:06 +00001197 if (CSSize) {
Anton Korobeynikov2c430cb2008-04-23 18:21:27 +00001198 emitSPUpdate(MBB, MBBI, StackPtr, NumBytes, Is64Bit, TII);
1199 MBBI = prior(LastCSPop);
1200 }
1201
Dale Johannesen21b55412009-02-12 23:08:38 +00001202 BuildMI(MBB, MBBI, DL,
Anton Korobeynikov2c430cb2008-04-23 18:21:27 +00001203 TII.get(Is64Bit ? X86::MOV64rr : X86::MOV32rr),
1204 StackPtr).addReg(FramePtr);
1205 } else if (MFI->hasVarSizedObjects()) {
1206 if (CSSize) {
1207 unsigned Opc = Is64Bit ? X86::LEA64r : X86::LEA32r;
Bill Wendling80c76432009-08-16 11:00:26 +00001208 MachineInstr *MI =
1209 addLeaRegOffset(BuildMI(MF, DL, TII.get(Opc), StackPtr),
1210 FramePtr, false, -CSSize);
Evan Cheng3c46eef2007-07-18 21:26:06 +00001211 MBB.insert(MBBI, MI);
Bill Wendling80c76432009-08-16 11:00:26 +00001212 } else {
1213 BuildMI(MBB, MBBI, DL,
1214 TII.get(Is64Bit ? X86::MOV64rr : X86::MOV32rr), StackPtr)
1215 .addReg(FramePtr);
1216 }
1217 } else if (NumBytes) {
1218 // Adjust stack pointer back: ESP += numbytes.
1219 emitSPUpdate(MBB, MBBI, StackPtr, NumBytes, Is64Bit, TII);
Evan Cheng3c46eef2007-07-18 21:26:06 +00001220 }
1221
Evan Cheng5b3332c2007-07-17 18:40:47 +00001222 // We're returning from function via eh_return.
Anton Korobeynikovb84c1672008-09-08 21:12:47 +00001223 if (RetOpcode == X86::EH_RETURN || RetOpcode == X86::EH_RETURN64) {
Evan Cheng5b3332c2007-07-17 18:40:47 +00001224 MBBI = prior(MBB.end());
1225 MachineOperand &DestAddr = MBBI->getOperand(0);
Dan Gohmand735b802008-10-03 15:45:36 +00001226 assert(DestAddr.isReg() && "Offset should be in register!");
Dale Johannesen21b55412009-02-12 23:08:38 +00001227 BuildMI(MBB, MBBI, DL,
Anton Korobeynikovb84c1672008-09-08 21:12:47 +00001228 TII.get(Is64Bit ? X86::MOV64rr : X86::MOV32rr),
1229 StackPtr).addReg(DestAddr.getReg());
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +00001230 } else if (RetOpcode == X86::TCRETURNri || RetOpcode == X86::TCRETURNdi ||
Evan Chengf48ef032010-03-14 03:48:46 +00001231 RetOpcode == X86::TCRETURNmi ||
1232 RetOpcode == X86::TCRETURNri64 || RetOpcode == X86::TCRETURNdi64 ||
1233 RetOpcode == X86::TCRETURNmi64) {
1234 bool isMem = RetOpcode == X86::TCRETURNmi || RetOpcode == X86::TCRETURNmi64;
Bill Wendling80c76432009-08-16 11:00:26 +00001235 // Tail call return: adjust the stack pointer and jump to callee.
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +00001236 MBBI = prior(MBB.end());
1237 MachineOperand &JumpTarget = MBBI->getOperand(0);
Evan Chengf48ef032010-03-14 03:48:46 +00001238 MachineOperand &StackAdjust = MBBI->getOperand(isMem ? 5 : 1);
Dan Gohmand735b802008-10-03 15:45:36 +00001239 assert(StackAdjust.isImm() && "Expecting immediate value.");
Anton Korobeynikove2011902008-04-23 18:15:11 +00001240
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +00001241 // Adjust stack pointer.
1242 int StackAdj = StackAdjust.getImm();
1243 int MaxTCDelta = X86FI->getTCReturnAddrDelta();
1244 int Offset = 0;
1245 assert(MaxTCDelta <= 0 && "MaxTCDelta should never be positive");
Bill Wendling80c76432009-08-16 11:00:26 +00001246
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +00001247 // Incoporate the retaddr area.
1248 Offset = StackAdj-MaxTCDelta;
1249 assert(Offset >= 0 && "Offset should never be negative");
Bill Wendling3d2445f2009-02-21 00:43:56 +00001250
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +00001251 if (Offset) {
1252 // Check for possible merge with preceeding ADD instruction.
1253 Offset += mergeSPUpdates(MBB, MBBI, StackPtr, true);
1254 emitSPUpdate(MBB, MBBI, StackPtr, Offset, Is64Bit, TII);
Anton Korobeynikove2011902008-04-23 18:15:11 +00001255 }
Bill Wendling3d2445f2009-02-21 00:43:56 +00001256
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +00001257 // Jump to label or value in register.
Evan Chengf48ef032010-03-14 03:48:46 +00001258 if (RetOpcode == X86::TCRETURNdi || RetOpcode == X86::TCRETURNdi64) {
1259 BuildMI(MBB, MBBI, DL, TII.get((RetOpcode == X86::TCRETURNdi)
1260 ? X86::TAILJMPd : X86::TAILJMPd64)).
Evan Cheng1d885c02010-01-30 01:16:15 +00001261 addGlobalAddress(JumpTarget.getGlobal(), JumpTarget.getOffset(),
1262 JumpTarget.getTargetFlags());
Evan Chengf48ef032010-03-14 03:48:46 +00001263 } else if (RetOpcode == X86::TCRETURNmi || RetOpcode == X86::TCRETURNmi64) {
1264 MachineInstrBuilder MIB =
1265 BuildMI(MBB, MBBI, DL, TII.get((RetOpcode == X86::TCRETURNmi)
1266 ? X86::TAILJMPm : X86::TAILJMPm64));
1267 for (unsigned i = 0; i != 5; ++i)
1268 MIB.addOperand(MBBI->getOperand(i));
Evan Chengaa92bec2010-01-31 07:28:44 +00001269 } else if (RetOpcode == X86::TCRETURNri64) {
Dale Johannesen21b55412009-02-12 23:08:38 +00001270 BuildMI(MBB, MBBI, DL, TII.get(X86::TAILJMPr64), JumpTarget.getReg());
Evan Chengaa92bec2010-01-31 07:28:44 +00001271 } else {
Dan Gohman39a1fab2009-11-30 23:33:53 +00001272 BuildMI(MBB, MBBI, DL, TII.get(X86::TAILJMPr), JumpTarget.getReg());
Evan Chengaa92bec2010-01-31 07:28:44 +00001273 }
1274
1275 MachineInstr *NewMI = prior(MBBI);
1276 for (unsigned i = 2, e = MBBI->getNumOperands(); i != e; ++i)
1277 NewMI->addOperand(MBBI->getOperand(i));
Bill Wendling3d2445f2009-02-21 00:43:56 +00001278
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +00001279 // Delete the pseudo instruction TCRETURN.
1280 MBB.erase(MBBI);
Anton Korobeynikove2011902008-04-23 18:15:11 +00001281 } else if ((RetOpcode == X86::RET || RetOpcode == X86::RETI) &&
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +00001282 (X86FI->getTCReturnAddrDelta() < 0)) {
1283 // Add the return addr area delta back since we are not tail calling.
1284 int delta = -1*X86FI->getTCReturnAddrDelta();
1285 MBBI = prior(MBB.end());
Bill Wendling80c76432009-08-16 11:00:26 +00001286
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +00001287 // Check for possible merge with preceeding ADD instruction.
1288 delta += mergeSPUpdates(MBB, MBBI, StackPtr, true);
1289 emitSPUpdate(MBB, MBBI, StackPtr, delta, Is64Bit, TII);
Evan Cheng5b3332c2007-07-17 18:40:47 +00001290 }
Chris Lattner3c1c03d2002-12-28 20:32:28 +00001291}
1292
Jim Laskey41886992006-04-07 16:34:46 +00001293unsigned X86RegisterInfo::getRARegister() const {
Bill Wendling80c76432009-08-16 11:00:26 +00001294 return Is64Bit ? X86::RIP // Should have dwarf #16.
1295 : X86::EIP; // Should have dwarf #8.
Jim Laskey41886992006-04-07 16:34:46 +00001296}
1297
David Greene3f2bf852009-11-12 20:49:22 +00001298unsigned X86RegisterInfo::getFrameRegister(const MachineFunction &MF) const {
Evan Cheng25ab6902006-09-08 06:48:29 +00001299 return hasFP(MF) ? FramePtr : StackPtr;
Jim Laskeyf1d78e82006-03-23 18:12:57 +00001300}
1301
Bill Wendling80c76432009-08-16 11:00:26 +00001302void
1303X86RegisterInfo::getInitialFrameState(std::vector<MachineMove> &Moves) const {
Anton Korobeynikov0ff3ca42007-05-12 22:36:25 +00001304 // Calculate amount of bytes used for return address storing
1305 int stackGrowth = (Is64Bit ? -8 : -4);
1306
1307 // Initial state of the frame pointer is esp+4.
Jim Laskey0e410942007-01-24 19:15:24 +00001308 MachineLocation Dst(MachineLocation::VirtualFP);
Anton Korobeynikov0ff3ca42007-05-12 22:36:25 +00001309 MachineLocation Src(StackPtr, stackGrowth);
Jim Laskey0e410942007-01-24 19:15:24 +00001310 Moves.push_back(MachineMove(0, Dst, Src));
Anton Korobeynikov0ff3ca42007-05-12 22:36:25 +00001311
1312 // Add return address to move list
1313 MachineLocation CSDst(StackPtr, stackGrowth);
1314 MachineLocation CSSrc(getRARegister());
1315 Moves.push_back(MachineMove(0, CSDst, CSSrc));
Jim Laskey0e410942007-01-24 19:15:24 +00001316}
1317
Jim Laskey62819f32007-02-21 22:54:50 +00001318unsigned X86RegisterInfo::getEHExceptionRegister() const {
Torok Edwinc23197a2009-07-14 16:55:14 +00001319 llvm_unreachable("What is the exception register");
Jim Laskey62819f32007-02-21 22:54:50 +00001320 return 0;
1321}
1322
1323unsigned X86RegisterInfo::getEHHandlerRegister() const {
Torok Edwinc23197a2009-07-14 16:55:14 +00001324 llvm_unreachable("What is the exception handler register");
Jim Laskey62819f32007-02-21 22:54:50 +00001325 return 0;
1326}
1327
Evan Cheng8f7f7122006-05-05 05:40:20 +00001328namespace llvm {
Owen Andersone50ed302009-08-10 22:56:29 +00001329unsigned getX86SubSuperRegister(unsigned Reg, EVT VT, bool High) {
Owen Anderson825b72b2009-08-11 20:47:22 +00001330 switch (VT.getSimpleVT().SimpleTy) {
Evan Cheng8f7f7122006-05-05 05:40:20 +00001331 default: return Reg;
Owen Anderson825b72b2009-08-11 20:47:22 +00001332 case MVT::i8:
Evan Cheng8f7f7122006-05-05 05:40:20 +00001333 if (High) {
1334 switch (Reg) {
Evan Cheng25ab6902006-09-08 06:48:29 +00001335 default: return 0;
1336 case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
Evan Cheng8f7f7122006-05-05 05:40:20 +00001337 return X86::AH;
Evan Cheng25ab6902006-09-08 06:48:29 +00001338 case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
Evan Cheng8f7f7122006-05-05 05:40:20 +00001339 return X86::DH;
Evan Cheng25ab6902006-09-08 06:48:29 +00001340 case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
Evan Cheng8f7f7122006-05-05 05:40:20 +00001341 return X86::CH;
Evan Cheng25ab6902006-09-08 06:48:29 +00001342 case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
Evan Cheng8f7f7122006-05-05 05:40:20 +00001343 return X86::BH;
1344 }
1345 } else {
1346 switch (Reg) {
Evan Cheng25ab6902006-09-08 06:48:29 +00001347 default: return 0;
1348 case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
Evan Cheng8f7f7122006-05-05 05:40:20 +00001349 return X86::AL;
Evan Cheng25ab6902006-09-08 06:48:29 +00001350 case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
Evan Cheng8f7f7122006-05-05 05:40:20 +00001351 return X86::DL;
Evan Cheng25ab6902006-09-08 06:48:29 +00001352 case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
Evan Cheng8f7f7122006-05-05 05:40:20 +00001353 return X86::CL;
Evan Cheng25ab6902006-09-08 06:48:29 +00001354 case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
Evan Cheng8f7f7122006-05-05 05:40:20 +00001355 return X86::BL;
Evan Cheng25ab6902006-09-08 06:48:29 +00001356 case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
1357 return X86::SIL;
1358 case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
1359 return X86::DIL;
1360 case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
1361 return X86::BPL;
1362 case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
1363 return X86::SPL;
1364 case X86::R8B: case X86::R8W: case X86::R8D: case X86::R8:
1365 return X86::R8B;
1366 case X86::R9B: case X86::R9W: case X86::R9D: case X86::R9:
1367 return X86::R9B;
1368 case X86::R10B: case X86::R10W: case X86::R10D: case X86::R10:
1369 return X86::R10B;
1370 case X86::R11B: case X86::R11W: case X86::R11D: case X86::R11:
1371 return X86::R11B;
1372 case X86::R12B: case X86::R12W: case X86::R12D: case X86::R12:
1373 return X86::R12B;
1374 case X86::R13B: case X86::R13W: case X86::R13D: case X86::R13:
1375 return X86::R13B;
1376 case X86::R14B: case X86::R14W: case X86::R14D: case X86::R14:
1377 return X86::R14B;
1378 case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
1379 return X86::R15B;
Evan Cheng8f7f7122006-05-05 05:40:20 +00001380 }
1381 }
Owen Anderson825b72b2009-08-11 20:47:22 +00001382 case MVT::i16:
Evan Cheng8f7f7122006-05-05 05:40:20 +00001383 switch (Reg) {
1384 default: return Reg;
Evan Cheng25ab6902006-09-08 06:48:29 +00001385 case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
Evan Cheng8f7f7122006-05-05 05:40:20 +00001386 return X86::AX;
Evan Cheng25ab6902006-09-08 06:48:29 +00001387 case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
Evan Cheng8f7f7122006-05-05 05:40:20 +00001388 return X86::DX;
Evan Cheng25ab6902006-09-08 06:48:29 +00001389 case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
Evan Cheng8f7f7122006-05-05 05:40:20 +00001390 return X86::CX;
Evan Cheng25ab6902006-09-08 06:48:29 +00001391 case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
Evan Cheng8f7f7122006-05-05 05:40:20 +00001392 return X86::BX;
Evan Cheng25ab6902006-09-08 06:48:29 +00001393 case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
Evan Cheng8f7f7122006-05-05 05:40:20 +00001394 return X86::SI;
Evan Cheng25ab6902006-09-08 06:48:29 +00001395 case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
Evan Cheng8f7f7122006-05-05 05:40:20 +00001396 return X86::DI;
Evan Cheng25ab6902006-09-08 06:48:29 +00001397 case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
Evan Cheng8f7f7122006-05-05 05:40:20 +00001398 return X86::BP;
Evan Cheng25ab6902006-09-08 06:48:29 +00001399 case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
Evan Cheng8f7f7122006-05-05 05:40:20 +00001400 return X86::SP;
Evan Cheng25ab6902006-09-08 06:48:29 +00001401 case X86::R8B: case X86::R8W: case X86::R8D: case X86::R8:
1402 return X86::R8W;
1403 case X86::R9B: case X86::R9W: case X86::R9D: case X86::R9:
1404 return X86::R9W;
1405 case X86::R10B: case X86::R10W: case X86::R10D: case X86::R10:
1406 return X86::R10W;
1407 case X86::R11B: case X86::R11W: case X86::R11D: case X86::R11:
1408 return X86::R11W;
1409 case X86::R12B: case X86::R12W: case X86::R12D: case X86::R12:
1410 return X86::R12W;
1411 case X86::R13B: case X86::R13W: case X86::R13D: case X86::R13:
1412 return X86::R13W;
1413 case X86::R14B: case X86::R14W: case X86::R14D: case X86::R14:
1414 return X86::R14W;
1415 case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
1416 return X86::R15W;
Evan Cheng8f7f7122006-05-05 05:40:20 +00001417 }
Owen Anderson825b72b2009-08-11 20:47:22 +00001418 case MVT::i32:
Evan Cheng8f7f7122006-05-05 05:40:20 +00001419 switch (Reg) {
Evan Cheng25ab6902006-09-08 06:48:29 +00001420 default: return Reg;
1421 case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
Evan Cheng8f7f7122006-05-05 05:40:20 +00001422 return X86::EAX;
Evan Cheng25ab6902006-09-08 06:48:29 +00001423 case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
Evan Cheng8f7f7122006-05-05 05:40:20 +00001424 return X86::EDX;
Evan Cheng25ab6902006-09-08 06:48:29 +00001425 case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
Evan Cheng8f7f7122006-05-05 05:40:20 +00001426 return X86::ECX;
Evan Cheng25ab6902006-09-08 06:48:29 +00001427 case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
Evan Cheng8f7f7122006-05-05 05:40:20 +00001428 return X86::EBX;
Evan Cheng25ab6902006-09-08 06:48:29 +00001429 case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
Evan Cheng8f7f7122006-05-05 05:40:20 +00001430 return X86::ESI;
Evan Cheng25ab6902006-09-08 06:48:29 +00001431 case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
Evan Cheng8f7f7122006-05-05 05:40:20 +00001432 return X86::EDI;
Evan Cheng25ab6902006-09-08 06:48:29 +00001433 case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
Evan Cheng8f7f7122006-05-05 05:40:20 +00001434 return X86::EBP;
Evan Cheng25ab6902006-09-08 06:48:29 +00001435 case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
Evan Cheng8f7f7122006-05-05 05:40:20 +00001436 return X86::ESP;
Evan Cheng25ab6902006-09-08 06:48:29 +00001437 case X86::R8B: case X86::R8W: case X86::R8D: case X86::R8:
1438 return X86::R8D;
1439 case X86::R9B: case X86::R9W: case X86::R9D: case X86::R9:
1440 return X86::R9D;
1441 case X86::R10B: case X86::R10W: case X86::R10D: case X86::R10:
1442 return X86::R10D;
1443 case X86::R11B: case X86::R11W: case X86::R11D: case X86::R11:
1444 return X86::R11D;
1445 case X86::R12B: case X86::R12W: case X86::R12D: case X86::R12:
1446 return X86::R12D;
1447 case X86::R13B: case X86::R13W: case X86::R13D: case X86::R13:
1448 return X86::R13D;
1449 case X86::R14B: case X86::R14W: case X86::R14D: case X86::R14:
1450 return X86::R14D;
1451 case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
1452 return X86::R15D;
1453 }
Owen Anderson825b72b2009-08-11 20:47:22 +00001454 case MVT::i64:
Evan Cheng25ab6902006-09-08 06:48:29 +00001455 switch (Reg) {
1456 default: return Reg;
1457 case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
1458 return X86::RAX;
1459 case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
1460 return X86::RDX;
1461 case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
1462 return X86::RCX;
1463 case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
1464 return X86::RBX;
1465 case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
1466 return X86::RSI;
1467 case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
1468 return X86::RDI;
1469 case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
1470 return X86::RBP;
1471 case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
1472 return X86::RSP;
1473 case X86::R8B: case X86::R8W: case X86::R8D: case X86::R8:
1474 return X86::R8;
1475 case X86::R9B: case X86::R9W: case X86::R9D: case X86::R9:
1476 return X86::R9;
1477 case X86::R10B: case X86::R10W: case X86::R10D: case X86::R10:
1478 return X86::R10;
1479 case X86::R11B: case X86::R11W: case X86::R11D: case X86::R11:
1480 return X86::R11;
1481 case X86::R12B: case X86::R12W: case X86::R12D: case X86::R12:
1482 return X86::R12;
1483 case X86::R13B: case X86::R13W: case X86::R13D: case X86::R13:
1484 return X86::R13;
1485 case X86::R14B: case X86::R14W: case X86::R14D: case X86::R14:
1486 return X86::R14;
1487 case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
1488 return X86::R15;
Evan Cheng8f7f7122006-05-05 05:40:20 +00001489 }
1490 }
1491
1492 return Reg;
1493}
1494}
1495
Chris Lattner7ad3e062003-08-03 15:48:14 +00001496#include "X86GenRegisterInfo.inc"