~ubuntu-branches/ubuntu/saucy/clamav/saucy

« back to all changes in this revision

Viewing changes to libclamav/c++/llvm/lib/Target/X86/X86RegisterInfo.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Leonel Nunez
  • Date: 2008-02-11 22:52:13 UTC
  • mfrom: (1.1.6 upstream)
  • mto: This revision was merged to the branch mainline in revision 38.
  • Revision ID: james.westby@ubuntu.com-20080211225213-p2uwj4czso1w2f8h
Tags: upstream-0.92~dfsg
ImportĀ upstreamĀ versionĀ 0.92~dfsg

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
//===- X86RegisterInfo.cpp - X86 Register Information -----------*- C++ -*-===//
2
 
//
3
 
//                     The LLVM Compiler Infrastructure
4
 
//
5
 
// This file is distributed under the University of Illinois Open Source
6
 
// License. See LICENSE.TXT for details.
7
 
//
8
 
//===----------------------------------------------------------------------===//
9
 
//
10
 
// This file contains the X86 implementation of the TargetRegisterInfo class.
11
 
// This file is responsible for the frame pointer elimination optimization
12
 
// on X86.
13
 
//
14
 
//===----------------------------------------------------------------------===//
15
 
 
16
 
#include "X86.h"
17
 
#include "X86RegisterInfo.h"
18
 
#include "X86InstrBuilder.h"
19
 
#include "X86MachineFunctionInfo.h"
20
 
#include "X86Subtarget.h"
21
 
#include "X86TargetMachine.h"
22
 
#include "llvm/Constants.h"
23
 
#include "llvm/Function.h"
24
 
#include "llvm/Type.h"
25
 
#include "llvm/CodeGen/ValueTypes.h"
26
 
#include "llvm/CodeGen/MachineInstrBuilder.h"
27
 
#include "llvm/CodeGen/MachineFunction.h"
28
 
#include "llvm/CodeGen/MachineFunctionPass.h"
29
 
#include "llvm/CodeGen/MachineFrameInfo.h"
30
 
#include "llvm/CodeGen/MachineLocation.h"
31
 
#include "llvm/CodeGen/MachineModuleInfo.h"
32
 
#include "llvm/CodeGen/MachineRegisterInfo.h"
33
 
#include "llvm/MC/MCAsmInfo.h"
34
 
#include "llvm/Target/TargetFrameInfo.h"
35
 
#include "llvm/Target/TargetInstrInfo.h"
36
 
#include "llvm/Target/TargetMachine.h"
37
 
#include "llvm/Target/TargetOptions.h"
38
 
#include "llvm/ADT/BitVector.h"
39
 
#include "llvm/ADT/STLExtras.h"
40
 
#include "llvm/Support/ErrorHandling.h"
41
 
#include "llvm/Support/CommandLine.h"
42
 
using namespace llvm;
43
 
 
44
 
static cl::opt<bool>
45
 
ForceStackAlign("force-align-stack",
46
 
                 cl::desc("Force align the stack to the minimum alignment"
47
 
                           " needed for the function."),
48
 
                 cl::init(false), cl::Hidden);
49
 
 
50
 
X86RegisterInfo::X86RegisterInfo(X86TargetMachine &tm,
51
 
                                 const TargetInstrInfo &tii)
52
 
  : X86GenRegisterInfo(tm.getSubtarget<X86Subtarget>().is64Bit() ?
53
 
                         X86::ADJCALLSTACKDOWN64 :
54
 
                         X86::ADJCALLSTACKDOWN32,
55
 
                       tm.getSubtarget<X86Subtarget>().is64Bit() ?
56
 
                         X86::ADJCALLSTACKUP64 :
57
 
                         X86::ADJCALLSTACKUP32),
58
 
    TM(tm), TII(tii) {
59
 
  // Cache some information.
60
 
  const X86Subtarget *Subtarget = &TM.getSubtarget<X86Subtarget>();
61
 
  Is64Bit = Subtarget->is64Bit();
62
 
  IsWin64 = Subtarget->isTargetWin64();
63
 
  StackAlign = TM.getFrameInfo()->getStackAlignment();
64
 
 
65
 
  if (Is64Bit) {
66
 
    SlotSize = 8;
67
 
    StackPtr = X86::RSP;
68
 
    FramePtr = X86::RBP;
69
 
  } else {
70
 
    SlotSize = 4;
71
 
    StackPtr = X86::ESP;
72
 
    FramePtr = X86::EBP;
73
 
  }
74
 
}
75
 
 
76
 
/// getDwarfRegNum - This function maps LLVM register identifiers to the DWARF
77
 
/// specific numbering, used in debug info and exception tables.
78
 
int X86RegisterInfo::getDwarfRegNum(unsigned RegNo, bool isEH) const {
79
 
  const X86Subtarget *Subtarget = &TM.getSubtarget<X86Subtarget>();
80
 
  unsigned Flavour = DWARFFlavour::X86_64;
81
 
 
82
 
  if (!Subtarget->is64Bit()) {
83
 
    if (Subtarget->isTargetDarwin()) {
84
 
      if (isEH)
85
 
        Flavour = DWARFFlavour::X86_32_DarwinEH;
86
 
      else
87
 
        Flavour = DWARFFlavour::X86_32_Generic;
88
 
    } else if (Subtarget->isTargetCygMing()) {
89
 
      // Unsupported by now, just quick fallback
90
 
      Flavour = DWARFFlavour::X86_32_Generic;
91
 
    } else {
92
 
      Flavour = DWARFFlavour::X86_32_Generic;
93
 
    }
94
 
  }
95
 
 
96
 
  return X86GenRegisterInfo::getDwarfRegNumFull(RegNo, Flavour);
97
 
}
98
 
 
99
 
/// getX86RegNum - This function maps LLVM register identifiers to their X86
100
 
/// specific numbering, which is used in various places encoding instructions.
101
 
unsigned X86RegisterInfo::getX86RegNum(unsigned RegNo) {
102
 
  switch(RegNo) {
103
 
  case X86::RAX: case X86::EAX: case X86::AX: case X86::AL: return N86::EAX;
104
 
  case X86::RCX: case X86::ECX: case X86::CX: case X86::CL: return N86::ECX;
105
 
  case X86::RDX: case X86::EDX: case X86::DX: case X86::DL: return N86::EDX;
106
 
  case X86::RBX: case X86::EBX: case X86::BX: case X86::BL: return N86::EBX;
107
 
  case X86::RSP: case X86::ESP: case X86::SP: case X86::SPL: case X86::AH:
108
 
    return N86::ESP;
109
 
  case X86::RBP: case X86::EBP: case X86::BP: case X86::BPL: case X86::CH:
110
 
    return N86::EBP;
111
 
  case X86::RSI: case X86::ESI: case X86::SI: case X86::SIL: case X86::DH:
112
 
    return N86::ESI;
113
 
  case X86::RDI: case X86::EDI: case X86::DI: case X86::DIL: case X86::BH:
114
 
    return N86::EDI;
115
 
 
116
 
  case X86::R8:  case X86::R8D:  case X86::R8W:  case X86::R8B:
117
 
    return N86::EAX;
118
 
  case X86::R9:  case X86::R9D:  case X86::R9W:  case X86::R9B:
119
 
    return N86::ECX;
120
 
  case X86::R10: case X86::R10D: case X86::R10W: case X86::R10B:
121
 
    return N86::EDX;
122
 
  case X86::R11: case X86::R11D: case X86::R11W: case X86::R11B:
123
 
    return N86::EBX;
124
 
  case X86::R12: case X86::R12D: case X86::R12W: case X86::R12B:
125
 
    return N86::ESP;
126
 
  case X86::R13: case X86::R13D: case X86::R13W: case X86::R13B:
127
 
    return N86::EBP;
128
 
  case X86::R14: case X86::R14D: case X86::R14W: case X86::R14B:
129
 
    return N86::ESI;
130
 
  case X86::R15: case X86::R15D: case X86::R15W: case X86::R15B:
131
 
    return N86::EDI;
132
 
 
133
 
  case X86::ST0: case X86::ST1: case X86::ST2: case X86::ST3:
134
 
  case X86::ST4: case X86::ST5: case X86::ST6: case X86::ST7:
135
 
    return RegNo-X86::ST0;
136
 
 
137
 
  case X86::XMM0: case X86::XMM8:
138
 
  case X86::YMM0: case X86::YMM8: case X86::MM0:
139
 
    return 0;
140
 
  case X86::XMM1: case X86::XMM9:
141
 
  case X86::YMM1: case X86::YMM9: case X86::MM1:
142
 
    return 1;
143
 
  case X86::XMM2: case X86::XMM10:
144
 
  case X86::YMM2: case X86::YMM10: case X86::MM2:
145
 
    return 2;
146
 
  case X86::XMM3: case X86::XMM11:
147
 
  case X86::YMM3: case X86::YMM11: case X86::MM3:
148
 
    return 3;
149
 
  case X86::XMM4: case X86::XMM12:
150
 
  case X86::YMM4: case X86::YMM12: case X86::MM4:
151
 
    return 4;
152
 
  case X86::XMM5: case X86::XMM13:
153
 
  case X86::YMM5: case X86::YMM13: case X86::MM5:
154
 
    return 5;
155
 
  case X86::XMM6: case X86::XMM14:
156
 
  case X86::YMM6: case X86::YMM14: case X86::MM6:
157
 
    return 6;
158
 
  case X86::XMM7: case X86::XMM15:
159
 
  case X86::YMM7: case X86::YMM15: case X86::MM7:
160
 
    return 7;
161
 
 
162
 
  case X86::ES:
163
 
    return 0;
164
 
  case X86::CS:
165
 
    return 1;
166
 
  case X86::SS:
167
 
    return 2;
168
 
  case X86::DS:
169
 
    return 3;
170
 
  case X86::FS:
171
 
    return 4;
172
 
  case X86::GS:
173
 
    return 5;
174
 
 
175
 
  case X86::CR0:
176
 
    return 0;
177
 
  case X86::CR1:
178
 
    return 1;
179
 
  case X86::CR2:
180
 
    return 2;
181
 
  case X86::CR3:
182
 
    return 3;
183
 
  case X86::CR4:
184
 
    return 4;
185
 
 
186
 
  case X86::DR0:
187
 
    return 0;
188
 
  case X86::DR1:
189
 
    return 1;
190
 
  case X86::DR2:
191
 
    return 2;
192
 
  case X86::DR3:
193
 
    return 3;
194
 
  case X86::DR4:
195
 
    return 4;
196
 
  case X86::DR5:
197
 
    return 5;
198
 
  case X86::DR6:
199
 
    return 6;
200
 
  case X86::DR7:
201
 
    return 7;
202
 
 
203
 
  // Pseudo index registers are equivalent to a "none"
204
 
  // scaled index (See Intel Manual 2A, table 2-3)
205
 
  case X86::EIZ:
206
 
  case X86::RIZ:
207
 
    return 4;
208
 
 
209
 
  default:
210
 
    assert(isVirtualRegister(RegNo) && "Unknown physical register!");
211
 
    llvm_unreachable("Register allocator hasn't allocated reg correctly yet!");
212
 
    return 0;
213
 
  }
214
 
}
215
 
 
216
 
const TargetRegisterClass *
217
 
X86RegisterInfo::getMatchingSuperRegClass(const TargetRegisterClass *A,
218
 
                                          const TargetRegisterClass *B,
219
 
                                          unsigned SubIdx) const {
220
 
  switch (SubIdx) {
221
 
  default: return 0;
222
 
  case X86::sub_8bit:
223
 
    if (B == &X86::GR8RegClass) {
224
 
      if (A->getSize() == 2 || A->getSize() == 4 || A->getSize() == 8)
225
 
        return A;
226
 
    } else if (B == &X86::GR8_ABCD_LRegClass || B == &X86::GR8_ABCD_HRegClass) {
227
 
      if (A == &X86::GR64RegClass || A == &X86::GR64_ABCDRegClass ||
228
 
          A == &X86::GR64_NOREXRegClass ||
229
 
          A == &X86::GR64_NOSPRegClass ||
230
 
          A == &X86::GR64_NOREX_NOSPRegClass)
231
 
        return &X86::GR64_ABCDRegClass;
232
 
      else if (A == &X86::GR32RegClass || A == &X86::GR32_ABCDRegClass ||
233
 
               A == &X86::GR32_NOREXRegClass ||
234
 
               A == &X86::GR32_NOSPRegClass)
235
 
        return &X86::GR32_ABCDRegClass;
236
 
      else if (A == &X86::GR16RegClass || A == &X86::GR16_ABCDRegClass ||
237
 
               A == &X86::GR16_NOREXRegClass)
238
 
        return &X86::GR16_ABCDRegClass;
239
 
    } else if (B == &X86::GR8_NOREXRegClass) {
240
 
      if (A == &X86::GR64RegClass || A == &X86::GR64_NOREXRegClass ||
241
 
          A == &X86::GR64_NOSPRegClass || A == &X86::GR64_NOREX_NOSPRegClass)
242
 
        return &X86::GR64_NOREXRegClass;
243
 
      else if (A == &X86::GR64_ABCDRegClass)
244
 
        return &X86::GR64_ABCDRegClass;
245
 
      else if (A == &X86::GR32RegClass || A == &X86::GR32_NOREXRegClass ||
246
 
               A == &X86::GR32_NOSPRegClass)
247
 
        return &X86::GR32_NOREXRegClass;
248
 
      else if (A == &X86::GR32_ABCDRegClass)
249
 
        return &X86::GR32_ABCDRegClass;
250
 
      else if (A == &X86::GR16RegClass || A == &X86::GR16_NOREXRegClass)
251
 
        return &X86::GR16_NOREXRegClass;
252
 
      else if (A == &X86::GR16_ABCDRegClass)
253
 
        return &X86::GR16_ABCDRegClass;
254
 
    }
255
 
    break;
256
 
  case X86::sub_8bit_hi:
257
 
    if (B == &X86::GR8_ABCD_HRegClass) {
258
 
      if (A == &X86::GR64RegClass || A == &X86::GR64_ABCDRegClass ||
259
 
          A == &X86::GR64_NOREXRegClass ||
260
 
          A == &X86::GR64_NOSPRegClass ||
261
 
          A == &X86::GR64_NOREX_NOSPRegClass)
262
 
        return &X86::GR64_ABCDRegClass;
263
 
      else if (A == &X86::GR32RegClass || A == &X86::GR32_ABCDRegClass ||
264
 
               A == &X86::GR32_NOREXRegClass || A == &X86::GR32_NOSPRegClass)
265
 
        return &X86::GR32_ABCDRegClass;
266
 
      else if (A == &X86::GR16RegClass || A == &X86::GR16_ABCDRegClass ||
267
 
               A == &X86::GR16_NOREXRegClass)
268
 
        return &X86::GR16_ABCDRegClass;
269
 
    }
270
 
    break;
271
 
  case X86::sub_16bit:
272
 
    if (B == &X86::GR16RegClass) {
273
 
      if (A->getSize() == 4 || A->getSize() == 8)
274
 
        return A;
275
 
    } else if (B == &X86::GR16_ABCDRegClass) {
276
 
      if (A == &X86::GR64RegClass || A == &X86::GR64_ABCDRegClass ||
277
 
          A == &X86::GR64_NOREXRegClass ||
278
 
          A == &X86::GR64_NOSPRegClass ||
279
 
          A == &X86::GR64_NOREX_NOSPRegClass)
280
 
        return &X86::GR64_ABCDRegClass;
281
 
      else if (A == &X86::GR32RegClass || A == &X86::GR32_ABCDRegClass ||
282
 
               A == &X86::GR32_NOREXRegClass || A == &X86::GR32_NOSPRegClass)
283
 
        return &X86::GR32_ABCDRegClass;
284
 
    } else if (B == &X86::GR16_NOREXRegClass) {
285
 
      if (A == &X86::GR64RegClass || A == &X86::GR64_NOREXRegClass ||
286
 
          A == &X86::GR64_NOSPRegClass || A == &X86::GR64_NOREX_NOSPRegClass)
287
 
        return &X86::GR64_NOREXRegClass;
288
 
      else if (A == &X86::GR64_ABCDRegClass)
289
 
        return &X86::GR64_ABCDRegClass;
290
 
      else if (A == &X86::GR32RegClass || A == &X86::GR32_NOREXRegClass ||
291
 
               A == &X86::GR32_NOSPRegClass)
292
 
        return &X86::GR32_NOREXRegClass;
293
 
      else if (A == &X86::GR32_ABCDRegClass)
294
 
        return &X86::GR64_ABCDRegClass;
295
 
    }
296
 
    break;
297
 
  case X86::sub_32bit:
298
 
    if (B == &X86::GR32RegClass || B == &X86::GR32_NOSPRegClass) {
299
 
      if (A->getSize() == 8)
300
 
        return A;
301
 
    } else if (B == &X86::GR32_ABCDRegClass) {
302
 
      if (A == &X86::GR64RegClass || A == &X86::GR64_ABCDRegClass ||
303
 
          A == &X86::GR64_NOREXRegClass ||
304
 
          A == &X86::GR64_NOSPRegClass ||
305
 
          A == &X86::GR64_NOREX_NOSPRegClass)
306
 
        return &X86::GR64_ABCDRegClass;
307
 
    } else if (B == &X86::GR32_NOREXRegClass) {
308
 
      if (A == &X86::GR64RegClass || A == &X86::GR64_NOREXRegClass ||
309
 
          A == &X86::GR64_NOSPRegClass || A == &X86::GR64_NOREX_NOSPRegClass)
310
 
        return &X86::GR64_NOREXRegClass;
311
 
      else if (A == &X86::GR64_ABCDRegClass)
312
 
        return &X86::GR64_ABCDRegClass;
313
 
    }
314
 
    break;
315
 
  case X86::sub_ss:
316
 
    if (B == &X86::FR32RegClass)
317
 
      return A;
318
 
    break;
319
 
  case X86::sub_sd:
320
 
    if (B == &X86::FR64RegClass)
321
 
      return A;
322
 
    break;
323
 
  case X86::sub_xmm:
324
 
    if (B == &X86::VR128RegClass)
325
 
      return A;
326
 
    break;
327
 
  }
328
 
  return 0;
329
 
}
330
 
 
331
 
const TargetRegisterClass *
332
 
X86RegisterInfo::getPointerRegClass(unsigned Kind) const {
333
 
  switch (Kind) {
334
 
  default: llvm_unreachable("Unexpected Kind in getPointerRegClass!");
335
 
  case 0: // Normal GPRs.
336
 
    if (TM.getSubtarget<X86Subtarget>().is64Bit())
337
 
      return &X86::GR64RegClass;
338
 
    return &X86::GR32RegClass;
339
 
  case 1: // Normal GRPs except the stack pointer (for encoding reasons).
340
 
    if (TM.getSubtarget<X86Subtarget>().is64Bit())
341
 
      return &X86::GR64_NOSPRegClass;
342
 
    return &X86::GR32_NOSPRegClass;
343
 
  }
344
 
}
345
 
 
346
 
const TargetRegisterClass *
347
 
X86RegisterInfo::getCrossCopyRegClass(const TargetRegisterClass *RC) const {
348
 
  if (RC == &X86::CCRRegClass) {
349
 
    if (Is64Bit)
350
 
      return &X86::GR64RegClass;
351
 
    else
352
 
      return &X86::GR32RegClass;
353
 
  }
354
 
  return NULL;
355
 
}
356
 
 
357
 
const unsigned *
358
 
X86RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
359
 
  bool callsEHReturn = false;
360
 
  bool ghcCall = false;
361
 
 
362
 
  if (MF) {
363
 
    callsEHReturn = MF->getMMI().callsEHReturn();
364
 
    const Function *F = MF->getFunction();
365
 
    ghcCall = (F ? F->getCallingConv() == CallingConv::GHC : false);
366
 
  }
367
 
 
368
 
  static const unsigned GhcCalleeSavedRegs[] = {
369
 
    0
370
 
  };
371
 
 
372
 
  static const unsigned CalleeSavedRegs32Bit[] = {
373
 
    X86::ESI, X86::EDI, X86::EBX, X86::EBP,  0
374
 
  };
375
 
 
376
 
  static const unsigned CalleeSavedRegs32EHRet[] = {
377
 
    X86::EAX, X86::EDX, X86::ESI, X86::EDI, X86::EBX, X86::EBP,  0
378
 
  };
379
 
 
380
 
  static const unsigned CalleeSavedRegs64Bit[] = {
381
 
    X86::RBX, X86::R12, X86::R13, X86::R14, X86::R15, X86::RBP, 0
382
 
  };
383
 
 
384
 
  static const unsigned CalleeSavedRegs64EHRet[] = {
385
 
    X86::RAX, X86::RDX, X86::RBX, X86::R12,
386
 
    X86::R13, X86::R14, X86::R15, X86::RBP, 0
387
 
  };
388
 
 
389
 
  static const unsigned CalleeSavedRegsWin64[] = {
390
 
    X86::RBX,   X86::RBP,   X86::RDI,   X86::RSI,
391
 
    X86::R12,   X86::R13,   X86::R14,   X86::R15,
392
 
    X86::XMM6,  X86::XMM7,  X86::XMM8,  X86::XMM9,
393
 
    X86::XMM10, X86::XMM11, X86::XMM12, X86::XMM13,
394
 
    X86::XMM14, X86::XMM15, 0
395
 
  };
396
 
 
397
 
  if (ghcCall) {
398
 
    return GhcCalleeSavedRegs;
399
 
  } else if (Is64Bit) {
400
 
    if (IsWin64)
401
 
      return CalleeSavedRegsWin64;
402
 
    else
403
 
      return (callsEHReturn ? CalleeSavedRegs64EHRet : CalleeSavedRegs64Bit);
404
 
  } else {
405
 
    return (callsEHReturn ? CalleeSavedRegs32EHRet : CalleeSavedRegs32Bit);
406
 
  }
407
 
}
408
 
 
409
 
BitVector X86RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
410
 
  BitVector Reserved(getNumRegs());
411
 
  // Set the stack-pointer register and its aliases as reserved.
412
 
  Reserved.set(X86::RSP);
413
 
  Reserved.set(X86::ESP);
414
 
  Reserved.set(X86::SP);
415
 
  Reserved.set(X86::SPL);
416
 
 
417
 
  // Set the instruction pointer register and its aliases as reserved.
418
 
  Reserved.set(X86::RIP);
419
 
  Reserved.set(X86::EIP);
420
 
  Reserved.set(X86::IP);
421
 
 
422
 
  // Set the frame-pointer register and its aliases as reserved if needed.
423
 
  if (hasFP(MF)) {
424
 
    Reserved.set(X86::RBP);
425
 
    Reserved.set(X86::EBP);
426
 
    Reserved.set(X86::BP);
427
 
    Reserved.set(X86::BPL);
428
 
  }
429
 
 
430
 
  // Mark the x87 stack registers as reserved, since they don't behave normally
431
 
  // with respect to liveness. We don't fully model the effects of x87 stack
432
 
  // pushes and pops after stackification.
433
 
  Reserved.set(X86::ST0);
434
 
  Reserved.set(X86::ST1);
435
 
  Reserved.set(X86::ST2);
436
 
  Reserved.set(X86::ST3);
437
 
  Reserved.set(X86::ST4);
438
 
  Reserved.set(X86::ST5);
439
 
  Reserved.set(X86::ST6);
440
 
  Reserved.set(X86::ST7);
441
 
  return Reserved;
442
 
}
443
 
 
444
 
//===----------------------------------------------------------------------===//
445
 
// Stack Frame Processing methods
446
 
//===----------------------------------------------------------------------===//
447
 
 
448
 
/// hasFP - Return true if the specified function should have a dedicated frame
449
 
/// pointer register.  This is true if the function has variable sized allocas
450
 
/// or if frame pointer elimination is disabled.
451
 
bool X86RegisterInfo::hasFP(const MachineFunction &MF) const {
452
 
  const MachineFrameInfo *MFI = MF.getFrameInfo();
453
 
  const MachineModuleInfo &MMI = MF.getMMI();
454
 
 
455
 
  return (DisableFramePointerElim(MF) ||
456
 
          needsStackRealignment(MF) ||
457
 
          MFI->hasVarSizedObjects() ||
458
 
          MFI->isFrameAddressTaken() ||
459
 
          MF.getInfo<X86MachineFunctionInfo>()->getForceFramePointer() ||
460
 
          MMI.callsUnwindInit());
461
 
}
462
 
 
463
 
bool X86RegisterInfo::canRealignStack(const MachineFunction &MF) const {
464
 
  const MachineFrameInfo *MFI = MF.getFrameInfo();
465
 
  return (RealignStack &&
466
 
          !MFI->hasVarSizedObjects());
467
 
}
468
 
 
469
 
bool X86RegisterInfo::needsStackRealignment(const MachineFunction &MF) const {
470
 
  const MachineFrameInfo *MFI = MF.getFrameInfo();
471
 
  const Function *F = MF.getFunction();
472
 
  bool requiresRealignment = ((MFI->getMaxAlignment() > StackAlign) ||
473
 
                               F->hasFnAttr(Attribute::StackAlignment));
474
 
 
475
 
  // FIXME: Currently we don't support stack realignment for functions with
476
 
  //        variable-sized allocas.
477
 
  // FIXME: It's more complicated than this...
478
 
  if (0 && requiresRealignment && MFI->hasVarSizedObjects())
479
 
    report_fatal_error(
480
 
      "Stack realignment in presense of dynamic allocas is not supported");
481
 
    
482
 
  // If we've requested that we force align the stack do so now.
483
 
  if (ForceStackAlign)
484
 
    return canRealignStack(MF);
485
 
    
486
 
  return requiresRealignment && canRealignStack(MF);
487
 
}
488
 
 
489
 
bool X86RegisterInfo::hasReservedCallFrame(const MachineFunction &MF) const {
490
 
  return !MF.getFrameInfo()->hasVarSizedObjects();
491
 
}
492
 
 
493
 
bool X86RegisterInfo::hasReservedSpillSlot(const MachineFunction &MF,
494
 
                                           unsigned Reg, int &FrameIdx) const {
495
 
  if (Reg == FramePtr && hasFP(MF)) {
496
 
    FrameIdx = MF.getFrameInfo()->getObjectIndexBegin();
497
 
    return true;
498
 
  }
499
 
  return false;
500
 
}
501
 
 
502
 
int
503
 
X86RegisterInfo::getFrameIndexOffset(const MachineFunction &MF, int FI) const {
504
 
  const TargetFrameInfo &TFI = *MF.getTarget().getFrameInfo();
505
 
  const MachineFrameInfo *MFI = MF.getFrameInfo();
506
 
  int Offset = MFI->getObjectOffset(FI) - TFI.getOffsetOfLocalArea();
507
 
  uint64_t StackSize = MFI->getStackSize();
508
 
 
509
 
  if (needsStackRealignment(MF)) {
510
 
    if (FI < 0) {
511
 
      // Skip the saved EBP.
512
 
      Offset += SlotSize;
513
 
    } else {
514
 
      unsigned Align = MFI->getObjectAlignment(FI);
515
 
      assert((-(Offset + StackSize)) % Align == 0);
516
 
      Align = 0;
517
 
      return Offset + StackSize;
518
 
    }
519
 
    // FIXME: Support tail calls
520
 
  } else {
521
 
    if (!hasFP(MF))
522
 
      return Offset + StackSize;
523
 
 
524
 
    // Skip the saved EBP.
525
 
    Offset += SlotSize;
526
 
 
527
 
    // Skip the RETADDR move area
528
 
    const X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
529
 
    int TailCallReturnAddrDelta = X86FI->getTCReturnAddrDelta();
530
 
    if (TailCallReturnAddrDelta < 0)
531
 
      Offset -= TailCallReturnAddrDelta;
532
 
  }
533
 
 
534
 
  return Offset;
535
 
}
536
 
 
537
 
static unsigned getSUBriOpcode(unsigned is64Bit, int64_t Imm) {
538
 
  if (is64Bit) {
539
 
    if (isInt<8>(Imm))
540
 
      return X86::SUB64ri8;
541
 
    return X86::SUB64ri32;
542
 
  } else {
543
 
    if (isInt<8>(Imm))
544
 
      return X86::SUB32ri8;
545
 
    return X86::SUB32ri;
546
 
  }
547
 
}
548
 
 
549
 
static unsigned getADDriOpcode(unsigned is64Bit, int64_t Imm) {
550
 
  if (is64Bit) {
551
 
    if (isInt<8>(Imm))
552
 
      return X86::ADD64ri8;
553
 
    return X86::ADD64ri32;
554
 
  } else {
555
 
    if (isInt<8>(Imm))
556
 
      return X86::ADD32ri8;
557
 
    return X86::ADD32ri;
558
 
  }
559
 
}
560
 
 
561
 
void X86RegisterInfo::
562
 
eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
563
 
                              MachineBasicBlock::iterator I) const {
564
 
  if (!hasReservedCallFrame(MF)) {
565
 
    // If the stack pointer can be changed after prologue, turn the
566
 
    // adjcallstackup instruction into a 'sub ESP, <amt>' and the
567
 
    // adjcallstackdown instruction into 'add ESP, <amt>'
568
 
    // TODO: consider using push / pop instead of sub + store / add
569
 
    MachineInstr *Old = I;
570
 
    uint64_t Amount = Old->getOperand(0).getImm();
571
 
    if (Amount != 0) {
572
 
      // We need to keep the stack aligned properly.  To do this, we round the
573
 
      // amount of space needed for the outgoing arguments up to the next
574
 
      // alignment boundary.
575
 
      Amount = (Amount + StackAlign - 1) / StackAlign * StackAlign;
576
 
 
577
 
      MachineInstr *New = 0;
578
 
      if (Old->getOpcode() == getCallFrameSetupOpcode()) {
579
 
        New = BuildMI(MF, Old->getDebugLoc(),
580
 
                      TII.get(getSUBriOpcode(Is64Bit, Amount)),
581
 
                      StackPtr)
582
 
          .addReg(StackPtr)
583
 
          .addImm(Amount);
584
 
      } else {
585
 
        assert(Old->getOpcode() == getCallFrameDestroyOpcode());
586
 
 
587
 
        // Factor out the amount the callee already popped.
588
 
        uint64_t CalleeAmt = Old->getOperand(1).getImm();
589
 
        Amount -= CalleeAmt;
590
 
  
591
 
      if (Amount) {
592
 
          unsigned Opc = getADDriOpcode(Is64Bit, Amount);
593
 
          New = BuildMI(MF, Old->getDebugLoc(), TII.get(Opc), StackPtr)
594
 
            .addReg(StackPtr)
595
 
            .addImm(Amount);
596
 
        }
597
 
      }
598
 
 
599
 
      if (New) {
600
 
        // The EFLAGS implicit def is dead.
601
 
        New->getOperand(3).setIsDead();
602
 
 
603
 
        // Replace the pseudo instruction with a new instruction.
604
 
        MBB.insert(I, New);
605
 
      }
606
 
    }
607
 
  } else if (I->getOpcode() == getCallFrameDestroyOpcode()) {
608
 
    // If we are performing frame pointer elimination and if the callee pops
609
 
    // something off the stack pointer, add it back.  We do this until we have
610
 
    // more advanced stack pointer tracking ability.
611
 
    if (uint64_t CalleeAmt = I->getOperand(1).getImm()) {
612
 
      unsigned Opc = getSUBriOpcode(Is64Bit, CalleeAmt);
613
 
      MachineInstr *Old = I;
614
 
      MachineInstr *New =
615
 
        BuildMI(MF, Old->getDebugLoc(), TII.get(Opc), 
616
 
                StackPtr)
617
 
          .addReg(StackPtr)
618
 
          .addImm(CalleeAmt);
619
 
 
620
 
      // The EFLAGS implicit def is dead.
621
 
      New->getOperand(3).setIsDead();
622
 
      MBB.insert(I, New);
623
 
    }
624
 
  }
625
 
 
626
 
  MBB.erase(I);
627
 
}
628
 
 
629
 
void
630
 
X86RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
631
 
                                     int SPAdj, RegScavenger *RS) const{
632
 
  assert(SPAdj == 0 && "Unexpected");
633
 
 
634
 
  unsigned i = 0;
635
 
  MachineInstr &MI = *II;
636
 
  MachineFunction &MF = *MI.getParent()->getParent();
637
 
 
638
 
  while (!MI.getOperand(i).isFI()) {
639
 
    ++i;
640
 
    assert(i < MI.getNumOperands() && "Instr doesn't have FrameIndex operand!");
641
 
  }
642
 
 
643
 
  int FrameIndex = MI.getOperand(i).getIndex();
644
 
  unsigned BasePtr;
645
 
 
646
 
  unsigned Opc = MI.getOpcode();
647
 
  bool AfterFPPop = Opc == X86::TAILJMPm64 || Opc == X86::TAILJMPm;
648
 
  if (needsStackRealignment(MF))
649
 
    BasePtr = (FrameIndex < 0 ? FramePtr : StackPtr);
650
 
  else if (AfterFPPop)
651
 
    BasePtr = StackPtr;
652
 
  else
653
 
    BasePtr = (hasFP(MF) ? FramePtr : StackPtr);
654
 
 
655
 
  // This must be part of a four operand memory reference.  Replace the
656
 
  // FrameIndex with base register with EBP.  Add an offset to the offset.
657
 
  MI.getOperand(i).ChangeToRegister(BasePtr, false);
658
 
 
659
 
  // Now add the frame object offset to the offset from EBP.
660
 
  int FIOffset;
661
 
  if (AfterFPPop) {
662
 
    // Tail call jmp happens after FP is popped.
663
 
    const TargetFrameInfo &TFI = *MF.getTarget().getFrameInfo();
664
 
    const MachineFrameInfo *MFI = MF.getFrameInfo();
665
 
    FIOffset = MFI->getObjectOffset(FrameIndex) - TFI.getOffsetOfLocalArea();
666
 
  } else
667
 
    FIOffset = getFrameIndexOffset(MF, FrameIndex);
668
 
 
669
 
  if (MI.getOperand(i+3).isImm()) {
670
 
    // Offset is a 32-bit integer.
671
 
    int Offset = FIOffset + (int)(MI.getOperand(i + 3).getImm());
672
 
    MI.getOperand(i + 3).ChangeToImmediate(Offset);
673
 
  } else {
674
 
    // Offset is symbolic. This is extremely rare.
675
 
    uint64_t Offset = FIOffset + (uint64_t)MI.getOperand(i+3).getOffset();
676
 
    MI.getOperand(i+3).setOffset(Offset);
677
 
  }
678
 
}
679
 
 
680
 
void
681
 
X86RegisterInfo::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
682
 
                                                      RegScavenger *RS) const {
683
 
  MachineFrameInfo *MFI = MF.getFrameInfo();
684
 
 
685
 
  X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
686
 
  int32_t TailCallReturnAddrDelta = X86FI->getTCReturnAddrDelta();
687
 
 
688
 
  if (TailCallReturnAddrDelta < 0) {
689
 
    // create RETURNADDR area
690
 
    //   arg
691
 
    //   arg
692
 
    //   RETADDR
693
 
    //   { ...
694
 
    //     RETADDR area
695
 
    //     ...
696
 
    //   }
697
 
    //   [EBP]
698
 
    MFI->CreateFixedObject(-TailCallReturnAddrDelta,
699
 
                           (-1U*SlotSize)+TailCallReturnAddrDelta, true);
700
 
  }
701
 
 
702
 
  if (hasFP(MF)) {
703
 
    assert((TailCallReturnAddrDelta <= 0) &&
704
 
           "The Delta should always be zero or negative");
705
 
    const TargetFrameInfo &TFI = *MF.getTarget().getFrameInfo();
706
 
 
707
 
    // Create a frame entry for the EBP register that must be saved.
708
 
    int FrameIdx = MFI->CreateFixedObject(SlotSize,
709
 
                                          -(int)SlotSize +
710
 
                                          TFI.getOffsetOfLocalArea() +
711
 
                                          TailCallReturnAddrDelta,
712
 
                                          true);
713
 
    assert(FrameIdx == MFI->getObjectIndexBegin() &&
714
 
           "Slot for EBP register must be last in order to be found!");
715
 
    FrameIdx = 0;
716
 
  }
717
 
}
718
 
 
719
 
/// emitSPUpdate - Emit a series of instructions to increment / decrement the
720
 
/// stack pointer by a constant value.
721
 
static
722
 
void emitSPUpdate(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI,
723
 
                  unsigned StackPtr, int64_t NumBytes, bool Is64Bit,
724
 
                  const TargetInstrInfo &TII) {
725
 
  bool isSub = NumBytes < 0;
726
 
  uint64_t Offset = isSub ? -NumBytes : NumBytes;
727
 
  unsigned Opc = isSub ?
728
 
    getSUBriOpcode(Is64Bit, Offset) :
729
 
    getADDriOpcode(Is64Bit, Offset);
730
 
  uint64_t Chunk = (1LL << 31) - 1;
731
 
  DebugLoc DL = MBB.findDebugLoc(MBBI);
732
 
 
733
 
  while (Offset) {
734
 
    uint64_t ThisVal = (Offset > Chunk) ? Chunk : Offset;
735
 
    MachineInstr *MI =
736
 
      BuildMI(MBB, MBBI, DL, TII.get(Opc), StackPtr)
737
 
        .addReg(StackPtr)
738
 
        .addImm(ThisVal);
739
 
    MI->getOperand(3).setIsDead(); // The EFLAGS implicit def is dead.
740
 
    Offset -= ThisVal;
741
 
  }
742
 
}
743
 
 
744
 
/// mergeSPUpdatesUp - Merge two stack-manipulating instructions upper iterator.
745
 
static
746
 
void mergeSPUpdatesUp(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI,
747
 
                      unsigned StackPtr, uint64_t *NumBytes = NULL) {
748
 
  if (MBBI == MBB.begin()) return;
749
 
 
750
 
  MachineBasicBlock::iterator PI = prior(MBBI);
751
 
  unsigned Opc = PI->getOpcode();
752
 
  if ((Opc == X86::ADD64ri32 || Opc == X86::ADD64ri8 ||
753
 
       Opc == X86::ADD32ri || Opc == X86::ADD32ri8) &&
754
 
      PI->getOperand(0).getReg() == StackPtr) {
755
 
    if (NumBytes)
756
 
      *NumBytes += PI->getOperand(2).getImm();
757
 
    MBB.erase(PI);
758
 
  } else if ((Opc == X86::SUB64ri32 || Opc == X86::SUB64ri8 ||
759
 
              Opc == X86::SUB32ri || Opc == X86::SUB32ri8) &&
760
 
             PI->getOperand(0).getReg() == StackPtr) {
761
 
    if (NumBytes)
762
 
      *NumBytes -= PI->getOperand(2).getImm();
763
 
    MBB.erase(PI);
764
 
  }
765
 
}
766
 
 
767
 
/// mergeSPUpdatesDown - Merge two stack-manipulating instructions lower iterator.
768
 
static
769
 
void mergeSPUpdatesDown(MachineBasicBlock &MBB,
770
 
                        MachineBasicBlock::iterator &MBBI,
771
 
                        unsigned StackPtr, uint64_t *NumBytes = NULL) {
772
 
  // FIXME: THIS ISN'T RUN!!!
773
 
  return;
774
 
 
775
 
  if (MBBI == MBB.end()) return;
776
 
 
777
 
  MachineBasicBlock::iterator NI = llvm::next(MBBI);
778
 
  if (NI == MBB.end()) return;
779
 
 
780
 
  unsigned Opc = NI->getOpcode();
781
 
  if ((Opc == X86::ADD64ri32 || Opc == X86::ADD64ri8 ||
782
 
       Opc == X86::ADD32ri || Opc == X86::ADD32ri8) &&
783
 
      NI->getOperand(0).getReg() == StackPtr) {
784
 
    if (NumBytes)
785
 
      *NumBytes -= NI->getOperand(2).getImm();
786
 
    MBB.erase(NI);
787
 
    MBBI = NI;
788
 
  } else if ((Opc == X86::SUB64ri32 || Opc == X86::SUB64ri8 ||
789
 
              Opc == X86::SUB32ri || Opc == X86::SUB32ri8) &&
790
 
             NI->getOperand(0).getReg() == StackPtr) {
791
 
    if (NumBytes)
792
 
      *NumBytes += NI->getOperand(2).getImm();
793
 
    MBB.erase(NI);
794
 
    MBBI = NI;
795
 
  }
796
 
}
797
 
 
798
 
/// mergeSPUpdates - Checks the instruction before/after the passed
799
 
/// instruction. If it is an ADD/SUB instruction it is deleted argument and the
800
 
/// stack adjustment is returned as a positive value for ADD and a negative for
801
 
/// SUB.
802
 
static int mergeSPUpdates(MachineBasicBlock &MBB,
803
 
                           MachineBasicBlock::iterator &MBBI,
804
 
                           unsigned StackPtr,
805
 
                           bool doMergeWithPrevious) {
806
 
  if ((doMergeWithPrevious && MBBI == MBB.begin()) ||
807
 
      (!doMergeWithPrevious && MBBI == MBB.end()))
808
 
    return 0;
809
 
 
810
 
  MachineBasicBlock::iterator PI = doMergeWithPrevious ? prior(MBBI) : MBBI;
811
 
  MachineBasicBlock::iterator NI = doMergeWithPrevious ? 0 : llvm::next(MBBI);
812
 
  unsigned Opc = PI->getOpcode();
813
 
  int Offset = 0;
814
 
 
815
 
  if ((Opc == X86::ADD64ri32 || Opc == X86::ADD64ri8 ||
816
 
       Opc == X86::ADD32ri || Opc == X86::ADD32ri8) &&
817
 
      PI->getOperand(0).getReg() == StackPtr){
818
 
    Offset += PI->getOperand(2).getImm();
819
 
    MBB.erase(PI);
820
 
    if (!doMergeWithPrevious) MBBI = NI;
821
 
  } else if ((Opc == X86::SUB64ri32 || Opc == X86::SUB64ri8 ||
822
 
              Opc == X86::SUB32ri || Opc == X86::SUB32ri8) &&
823
 
             PI->getOperand(0).getReg() == StackPtr) {
824
 
    Offset -= PI->getOperand(2).getImm();
825
 
    MBB.erase(PI);
826
 
    if (!doMergeWithPrevious) MBBI = NI;
827
 
  }
828
 
 
829
 
  return Offset;
830
 
}
831
 
 
832
 
void X86RegisterInfo::emitCalleeSavedFrameMoves(MachineFunction &MF,
833
 
                                                MCSymbol *Label,
834
 
                                                unsigned FramePtr) const {
835
 
  MachineFrameInfo *MFI = MF.getFrameInfo();
836
 
  MachineModuleInfo &MMI = MF.getMMI();
837
 
 
838
 
  // Add callee saved registers to move list.
839
 
  const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
840
 
  if (CSI.empty()) return;
841
 
 
842
 
  std::vector<MachineMove> &Moves = MMI.getFrameMoves();
843
 
  const TargetData *TD = MF.getTarget().getTargetData();
844
 
  bool HasFP = hasFP(MF);
845
 
 
846
 
  // Calculate amount of bytes used for return address storing.
847
 
  int stackGrowth =
848
 
    (MF.getTarget().getFrameInfo()->getStackGrowthDirection() ==
849
 
     TargetFrameInfo::StackGrowsUp ?
850
 
     TD->getPointerSize() : -TD->getPointerSize());
851
 
 
852
 
  // FIXME: This is dirty hack. The code itself is pretty mess right now.
853
 
  // It should be rewritten from scratch and generalized sometimes.
854
 
 
855
 
  // Determine maximum offset (minumum due to stack growth).
856
 
  int64_t MaxOffset = 0;
857
 
  for (std::vector<CalleeSavedInfo>::const_iterator
858
 
         I = CSI.begin(), E = CSI.end(); I != E; ++I)
859
 
    MaxOffset = std::min(MaxOffset,
860
 
                         MFI->getObjectOffset(I->getFrameIdx()));
861
 
 
862
 
  // Calculate offsets.
863
 
  int64_t saveAreaOffset = (HasFP ? 3 : 2) * stackGrowth;
864
 
  for (std::vector<CalleeSavedInfo>::const_iterator
865
 
         I = CSI.begin(), E = CSI.end(); I != E; ++I) {
866
 
    int64_t Offset = MFI->getObjectOffset(I->getFrameIdx());
867
 
    unsigned Reg = I->getReg();
868
 
    Offset = MaxOffset - Offset + saveAreaOffset;
869
 
 
870
 
    // Don't output a new machine move if we're re-saving the frame
871
 
    // pointer. This happens when the PrologEpilogInserter has inserted an extra
872
 
    // "PUSH" of the frame pointer -- the "emitPrologue" method automatically
873
 
    // generates one when frame pointers are used. If we generate a "machine
874
 
    // move" for this extra "PUSH", the linker will lose track of the fact that
875
 
    // the frame pointer should have the value of the first "PUSH" when it's
876
 
    // trying to unwind.
877
 
    // 
878
 
    // FIXME: This looks inelegant. It's possibly correct, but it's covering up
879
 
    //        another bug. I.e., one where we generate a prolog like this:
880
 
    //
881
 
    //          pushl  %ebp
882
 
    //          movl   %esp, %ebp
883
 
    //          pushl  %ebp
884
 
    //          pushl  %esi
885
 
    //           ...
886
 
    //
887
 
    //        The immediate re-push of EBP is unnecessary. At the least, it's an
888
 
    //        optimization bug. EBP can be used as a scratch register in certain
889
 
    //        cases, but probably not when we have a frame pointer.
890
 
    if (HasFP && FramePtr == Reg)
891
 
      continue;
892
 
 
893
 
    MachineLocation CSDst(MachineLocation::VirtualFP, Offset);
894
 
    MachineLocation CSSrc(Reg);
895
 
    Moves.push_back(MachineMove(Label, CSDst, CSSrc));
896
 
  }
897
 
}
898
 
 
899
 
/// emitPrologue - Push callee-saved registers onto the stack, which
900
 
/// automatically adjust the stack pointer. Adjust the stack pointer to allocate
901
 
/// space for local variables. Also emit labels used by the exception handler to
902
 
/// generate the exception handling frames.
903
 
void X86RegisterInfo::emitPrologue(MachineFunction &MF) const {
904
 
  MachineBasicBlock &MBB = MF.front(); // Prologue goes in entry BB.
905
 
  MachineBasicBlock::iterator MBBI = MBB.begin();
906
 
  MachineFrameInfo *MFI = MF.getFrameInfo();
907
 
  const Function *Fn = MF.getFunction();
908
 
  const X86Subtarget *Subtarget = &MF.getTarget().getSubtarget<X86Subtarget>();
909
 
  MachineModuleInfo &MMI = MF.getMMI();
910
 
  X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
911
 
  bool needsFrameMoves = MMI.hasDebugInfo() ||
912
 
                          !Fn->doesNotThrow() || UnwindTablesMandatory;
913
 
  uint64_t MaxAlign  = MFI->getMaxAlignment(); // Desired stack alignment.
914
 
  uint64_t StackSize = MFI->getStackSize();    // Number of bytes to allocate.
915
 
  bool HasFP = hasFP(MF);
916
 
  DebugLoc DL;
917
 
 
918
 
  // If we're forcing a stack realignment we can't rely on just the frame
919
 
  // info, we need to know the ABI stack alignment as well in case we
920
 
  // have a call out.  Otherwise just make sure we have some alignment - we'll
921
 
  // go with the minimum SlotSize.
922
 
  if (ForceStackAlign) {
923
 
    if (MFI->hasCalls())
924
 
      MaxAlign = (StackAlign > MaxAlign) ? StackAlign : MaxAlign;
925
 
    else if (MaxAlign < SlotSize)
926
 
      MaxAlign = SlotSize;
927
 
  }
928
 
 
929
 
  // Add RETADDR move area to callee saved frame size.
930
 
  int TailCallReturnAddrDelta = X86FI->getTCReturnAddrDelta();
931
 
  if (TailCallReturnAddrDelta < 0)
932
 
    X86FI->setCalleeSavedFrameSize(
933
 
      X86FI->getCalleeSavedFrameSize() - TailCallReturnAddrDelta);
934
 
 
935
 
  // If this is x86-64 and the Red Zone is not disabled, if we are a leaf
936
 
  // function, and use up to 128 bytes of stack space, don't have a frame
937
 
  // pointer, calls, or dynamic alloca then we do not need to adjust the
938
 
  // stack pointer (we fit in the Red Zone).
939
 
  if (Is64Bit && !Fn->hasFnAttr(Attribute::NoRedZone) &&
940
 
      !needsStackRealignment(MF) &&
941
 
      !MFI->hasVarSizedObjects() &&                // No dynamic alloca.
942
 
      !MFI->adjustsStack() &&                      // No calls.
943
 
      !Subtarget->isTargetWin64()) {               // Win64 has no Red Zone
944
 
    uint64_t MinSize = X86FI->getCalleeSavedFrameSize();
945
 
    if (HasFP) MinSize += SlotSize;
946
 
    StackSize = std::max(MinSize, StackSize > 128 ? StackSize - 128 : 0);
947
 
    MFI->setStackSize(StackSize);
948
 
  } else if (Subtarget->isTargetWin64()) {
949
 
    // We need to always allocate 32 bytes as register spill area.
950
 
    // FIXME: We might reuse these 32 bytes for leaf functions.
951
 
    StackSize += 32;
952
 
    MFI->setStackSize(StackSize);
953
 
  }
954
 
 
955
 
  // Insert stack pointer adjustment for later moving of return addr.  Only
956
 
  // applies to tail call optimized functions where the callee argument stack
957
 
  // size is bigger than the callers.
958
 
  if (TailCallReturnAddrDelta < 0) {
959
 
    MachineInstr *MI =
960
 
      BuildMI(MBB, MBBI, DL,
961
 
              TII.get(getSUBriOpcode(Is64Bit, -TailCallReturnAddrDelta)),
962
 
              StackPtr)
963
 
        .addReg(StackPtr)
964
 
        .addImm(-TailCallReturnAddrDelta);
965
 
    MI->getOperand(3).setIsDead(); // The EFLAGS implicit def is dead.
966
 
  }
967
 
 
968
 
  // Mapping for machine moves:
969
 
  //
970
 
  //   DST: VirtualFP AND
971
 
  //        SRC: VirtualFP              => DW_CFA_def_cfa_offset
972
 
  //        ELSE                        => DW_CFA_def_cfa
973
 
  //
974
 
  //   SRC: VirtualFP AND
975
 
  //        DST: Register               => DW_CFA_def_cfa_register
976
 
  //
977
 
  //   ELSE
978
 
  //        OFFSET < 0                  => DW_CFA_offset_extended_sf
979
 
  //        REG < 64                    => DW_CFA_offset + Reg
980
 
  //        ELSE                        => DW_CFA_offset_extended
981
 
 
982
 
  std::vector<MachineMove> &Moves = MMI.getFrameMoves();
983
 
  const TargetData *TD = MF.getTarget().getTargetData();
984
 
  uint64_t NumBytes = 0;
985
 
  int stackGrowth = -TD->getPointerSize();
986
 
 
987
 
  if (HasFP) {
988
 
    // Calculate required stack adjustment.
989
 
    uint64_t FrameSize = StackSize - SlotSize;
990
 
    if (needsStackRealignment(MF))
991
 
      FrameSize = (FrameSize + MaxAlign - 1) / MaxAlign * MaxAlign;
992
 
 
993
 
    NumBytes = FrameSize - X86FI->getCalleeSavedFrameSize();
994
 
 
995
 
    // Get the offset of the stack slot for the EBP register, which is
996
 
    // guaranteed to be the last slot by processFunctionBeforeFrameFinalized.
997
 
    // Update the frame offset adjustment.
998
 
    MFI->setOffsetAdjustment(-NumBytes);
999
 
 
1000
 
    // Save EBP/RBP into the appropriate stack slot.
1001
 
    BuildMI(MBB, MBBI, DL, TII.get(Is64Bit ? X86::PUSH64r : X86::PUSH32r))
1002
 
      .addReg(FramePtr, RegState::Kill);
1003
 
 
1004
 
    if (needsFrameMoves) {
1005
 
      // Mark the place where EBP/RBP was saved.
1006
 
      MCSymbol *FrameLabel = MMI.getContext().CreateTempSymbol();
1007
 
      BuildMI(MBB, MBBI, DL, TII.get(X86::PROLOG_LABEL)).addSym(FrameLabel);
1008
 
 
1009
 
      // Define the current CFA rule to use the provided offset.
1010
 
      if (StackSize) {
1011
 
        MachineLocation SPDst(MachineLocation::VirtualFP);
1012
 
        MachineLocation SPSrc(MachineLocation::VirtualFP, 2 * stackGrowth);
1013
 
        Moves.push_back(MachineMove(FrameLabel, SPDst, SPSrc));
1014
 
      } else {
1015
 
        // FIXME: Verify & implement for FP
1016
 
        MachineLocation SPDst(StackPtr);
1017
 
        MachineLocation SPSrc(StackPtr, stackGrowth);
1018
 
        Moves.push_back(MachineMove(FrameLabel, SPDst, SPSrc));
1019
 
      }
1020
 
 
1021
 
      // Change the rule for the FramePtr to be an "offset" rule.
1022
 
      MachineLocation FPDst(MachineLocation::VirtualFP, 2 * stackGrowth);
1023
 
      MachineLocation FPSrc(FramePtr);
1024
 
      Moves.push_back(MachineMove(FrameLabel, FPDst, FPSrc));
1025
 
    }
1026
 
 
1027
 
    // Update EBP with the new base value...
1028
 
    BuildMI(MBB, MBBI, DL,
1029
 
            TII.get(Is64Bit ? X86::MOV64rr : X86::MOV32rr), FramePtr)
1030
 
        .addReg(StackPtr);
1031
 
 
1032
 
    if (needsFrameMoves) {
1033
 
      // Mark effective beginning of when frame pointer becomes valid.
1034
 
      MCSymbol *FrameLabel = MMI.getContext().CreateTempSymbol();
1035
 
      BuildMI(MBB, MBBI, DL, TII.get(X86::PROLOG_LABEL)).addSym(FrameLabel);
1036
 
 
1037
 
      // Define the current CFA to use the EBP/RBP register.
1038
 
      MachineLocation FPDst(FramePtr);
1039
 
      MachineLocation FPSrc(MachineLocation::VirtualFP);
1040
 
      Moves.push_back(MachineMove(FrameLabel, FPDst, FPSrc));
1041
 
    }
1042
 
 
1043
 
    // Mark the FramePtr as live-in in every block except the entry.
1044
 
    for (MachineFunction::iterator I = llvm::next(MF.begin()), E = MF.end();
1045
 
         I != E; ++I)
1046
 
      I->addLiveIn(FramePtr);
1047
 
 
1048
 
    // Realign stack
1049
 
    if (needsStackRealignment(MF)) {
1050
 
      MachineInstr *MI =
1051
 
        BuildMI(MBB, MBBI, DL,
1052
 
                TII.get(Is64Bit ? X86::AND64ri32 : X86::AND32ri),
1053
 
                StackPtr).addReg(StackPtr).addImm(-MaxAlign);
1054
 
 
1055
 
      // The EFLAGS implicit def is dead.
1056
 
      MI->getOperand(3).setIsDead();
1057
 
    }
1058
 
  } else {
1059
 
    NumBytes = StackSize - X86FI->getCalleeSavedFrameSize();
1060
 
  }
1061
 
 
1062
 
  // Skip the callee-saved push instructions.
1063
 
  bool PushedRegs = false;
1064
 
  int StackOffset = 2 * stackGrowth;
1065
 
 
1066
 
  while (MBBI != MBB.end() &&
1067
 
         (MBBI->getOpcode() == X86::PUSH32r ||
1068
 
          MBBI->getOpcode() == X86::PUSH64r)) {
1069
 
    PushedRegs = true;
1070
 
    ++MBBI;
1071
 
 
1072
 
    if (!HasFP && needsFrameMoves) {
1073
 
      // Mark callee-saved push instruction.
1074
 
      MCSymbol *Label = MMI.getContext().CreateTempSymbol();
1075
 
      BuildMI(MBB, MBBI, DL, TII.get(X86::PROLOG_LABEL)).addSym(Label);
1076
 
 
1077
 
      // Define the current CFA rule to use the provided offset.
1078
 
      unsigned Ptr = StackSize ?
1079
 
        MachineLocation::VirtualFP : StackPtr;
1080
 
      MachineLocation SPDst(Ptr);
1081
 
      MachineLocation SPSrc(Ptr, StackOffset);
1082
 
      Moves.push_back(MachineMove(Label, SPDst, SPSrc));
1083
 
      StackOffset += stackGrowth;
1084
 
    }
1085
 
  }
1086
 
 
1087
 
  DL = MBB.findDebugLoc(MBBI);
1088
 
 
1089
 
  // Adjust stack pointer: ESP -= numbytes.
1090
 
 
1091
 
  // Windows and cygwin/mingw require a prologue helper routine when allocating
1092
 
  // more than 4K bytes on the stack.  Windows uses __chkstk and cygwin/mingw
1093
 
  // uses __alloca.  __alloca and the 32-bit version of __chkstk will probe
1094
 
  // the stack and adjust the stack pointer in one go.  The 64-bit version
1095
 
  // of __chkstk is only responsible for probing the stack.  The 64-bit
1096
 
  // prologue is responsible for adjusting the stack pointer.  Touching the
1097
 
  // stack at 4K increments is necessary to ensure that the guard pages used
1098
 
  // by the OS virtual memory manager are allocated in correct sequence.
1099
 
  if (NumBytes >= 4096 &&
1100
 
     (Subtarget->isTargetCygMing() || Subtarget->isTargetWin32())) {
1101
 
    // Check, whether EAX is livein for this function.
1102
 
    bool isEAXAlive = false;
1103
 
    for (MachineRegisterInfo::livein_iterator
1104
 
           II = MF.getRegInfo().livein_begin(),
1105
 
           EE = MF.getRegInfo().livein_end(); (II != EE) && !isEAXAlive; ++II) {
1106
 
      unsigned Reg = II->first;
1107
 
      isEAXAlive = (Reg == X86::EAX || Reg == X86::AX ||
1108
 
                    Reg == X86::AH || Reg == X86::AL);
1109
 
    }
1110
 
 
1111
 
 
1112
 
    const char *StackProbeSymbol =
1113
 
      Subtarget->isTargetWindows() ? "_chkstk" : "_alloca";
1114
 
    if (!isEAXAlive) {
1115
 
      BuildMI(MBB, MBBI, DL, TII.get(X86::MOV32ri), X86::EAX)
1116
 
        .addImm(NumBytes);
1117
 
      BuildMI(MBB, MBBI, DL, TII.get(X86::CALLpcrel32))
1118
 
        .addExternalSymbol(StackProbeSymbol)
1119
 
        .addReg(StackPtr,    RegState::Define | RegState::Implicit)
1120
 
        .addReg(X86::EFLAGS, RegState::Define | RegState::Implicit);
1121
 
    } else {
1122
 
      // Save EAX
1123
 
      BuildMI(MBB, MBBI, DL, TII.get(X86::PUSH32r))
1124
 
        .addReg(X86::EAX, RegState::Kill);
1125
 
 
1126
 
      // Allocate NumBytes-4 bytes on stack. We'll also use 4 already
1127
 
      // allocated bytes for EAX.
1128
 
      BuildMI(MBB, MBBI, DL, TII.get(X86::MOV32ri), X86::EAX)
1129
 
        .addImm(NumBytes - 4);
1130
 
      BuildMI(MBB, MBBI, DL, TII.get(X86::CALLpcrel32))
1131
 
        .addExternalSymbol(StackProbeSymbol)
1132
 
        .addReg(StackPtr,    RegState::Define | RegState::Implicit)
1133
 
        .addReg(X86::EFLAGS, RegState::Define | RegState::Implicit);
1134
 
 
1135
 
      // Restore EAX
1136
 
      MachineInstr *MI = addRegOffset(BuildMI(MF, DL, TII.get(X86::MOV32rm),
1137
 
                                              X86::EAX),
1138
 
                                      StackPtr, false, NumBytes - 4);
1139
 
      MBB.insert(MBBI, MI);
1140
 
    }
1141
 
  } else if (NumBytes) {
1142
 
    // If there is an SUB32ri of ESP immediately before this instruction, merge
1143
 
    // the two. This can be the case when tail call elimination is enabled and
1144
 
    // the callee has more arguments then the caller.
1145
 
    NumBytes -= mergeSPUpdates(MBB, MBBI, StackPtr, true);
1146
 
 
1147
 
    // If there is an ADD32ri or SUB32ri of ESP immediately after this
1148
 
    // instruction, merge the two instructions.
1149
 
    mergeSPUpdatesDown(MBB, MBBI, StackPtr, &NumBytes);
1150
 
 
1151
 
    if (NumBytes)
1152
 
      emitSPUpdate(MBB, MBBI, StackPtr, -(int64_t)NumBytes, Is64Bit, TII);
1153
 
  }
1154
 
 
1155
 
  if ((NumBytes || PushedRegs) && needsFrameMoves) {
1156
 
    // Mark end of stack pointer adjustment.
1157
 
    MCSymbol *Label = MMI.getContext().CreateTempSymbol();
1158
 
    BuildMI(MBB, MBBI, DL, TII.get(X86::PROLOG_LABEL)).addSym(Label);
1159
 
 
1160
 
    if (!HasFP && NumBytes) {
1161
 
      // Define the current CFA rule to use the provided offset.
1162
 
      if (StackSize) {
1163
 
        MachineLocation SPDst(MachineLocation::VirtualFP);
1164
 
        MachineLocation SPSrc(MachineLocation::VirtualFP,
1165
 
                              -StackSize + stackGrowth);
1166
 
        Moves.push_back(MachineMove(Label, SPDst, SPSrc));
1167
 
      } else {
1168
 
        // FIXME: Verify & implement for FP
1169
 
        MachineLocation SPDst(StackPtr);
1170
 
        MachineLocation SPSrc(StackPtr, stackGrowth);
1171
 
        Moves.push_back(MachineMove(Label, SPDst, SPSrc));
1172
 
      }
1173
 
    }
1174
 
 
1175
 
    // Emit DWARF info specifying the offsets of the callee-saved registers.
1176
 
    if (PushedRegs)
1177
 
      emitCalleeSavedFrameMoves(MF, Label, HasFP ? FramePtr : StackPtr);
1178
 
  }
1179
 
}
1180
 
 
1181
 
void X86RegisterInfo::emitEpilogue(MachineFunction &MF,
1182
 
                                   MachineBasicBlock &MBB) const {
1183
 
  const MachineFrameInfo *MFI = MF.getFrameInfo();
1184
 
  X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
1185
 
  MachineBasicBlock::iterator MBBI = prior(MBB.end());
1186
 
  unsigned RetOpcode = MBBI->getOpcode();
1187
 
  DebugLoc DL = MBBI->getDebugLoc();
1188
 
 
1189
 
  switch (RetOpcode) {
1190
 
  default:
1191
 
    llvm_unreachable("Can only insert epilog into returning blocks");
1192
 
  case X86::RET:
1193
 
  case X86::RETI:
1194
 
  case X86::TCRETURNdi:
1195
 
  case X86::TCRETURNri:
1196
 
  case X86::TCRETURNmi:
1197
 
  case X86::TCRETURNdi64:
1198
 
  case X86::TCRETURNri64:
1199
 
  case X86::TCRETURNmi64:
1200
 
  case X86::EH_RETURN:
1201
 
  case X86::EH_RETURN64:
1202
 
    break;  // These are ok
1203
 
  }
1204
 
 
1205
 
  // Get the number of bytes to allocate from the FrameInfo.
1206
 
  uint64_t StackSize = MFI->getStackSize();
1207
 
  uint64_t MaxAlign  = MFI->getMaxAlignment();
1208
 
  unsigned CSSize = X86FI->getCalleeSavedFrameSize();
1209
 
  uint64_t NumBytes = 0;
1210
 
 
1211
 
  // If we're forcing a stack realignment we can't rely on just the frame
1212
 
  // info, we need to know the ABI stack alignment as well in case we
1213
 
  // have a call out.  Otherwise just make sure we have some alignment - we'll
1214
 
  // go with the minimum.
1215
 
  if (ForceStackAlign) {
1216
 
    if (MFI->hasCalls())
1217
 
      MaxAlign = (StackAlign > MaxAlign) ? StackAlign : MaxAlign;
1218
 
    else
1219
 
      MaxAlign = MaxAlign ? MaxAlign : 4;
1220
 
  }
1221
 
 
1222
 
  if (hasFP(MF)) {
1223
 
    // Calculate required stack adjustment.
1224
 
    uint64_t FrameSize = StackSize - SlotSize;
1225
 
    if (needsStackRealignment(MF))
1226
 
      FrameSize = (FrameSize + MaxAlign - 1)/MaxAlign*MaxAlign;
1227
 
 
1228
 
    NumBytes = FrameSize - CSSize;
1229
 
 
1230
 
    // Pop EBP.
1231
 
    BuildMI(MBB, MBBI, DL,
1232
 
            TII.get(Is64Bit ? X86::POP64r : X86::POP32r), FramePtr);
1233
 
  } else {
1234
 
    NumBytes = StackSize - CSSize;
1235
 
  }
1236
 
 
1237
 
  // Skip the callee-saved pop instructions.
1238
 
  MachineBasicBlock::iterator LastCSPop = MBBI;
1239
 
  while (MBBI != MBB.begin()) {
1240
 
    MachineBasicBlock::iterator PI = prior(MBBI);
1241
 
    unsigned Opc = PI->getOpcode();
1242
 
 
1243
 
    if (Opc != X86::POP32r && Opc != X86::POP64r &&
1244
 
        !PI->getDesc().isTerminator())
1245
 
      break;
1246
 
 
1247
 
    --MBBI;
1248
 
  }
1249
 
 
1250
 
  DL = MBBI->getDebugLoc();
1251
 
 
1252
 
  // If there is an ADD32ri or SUB32ri of ESP immediately before this
1253
 
  // instruction, merge the two instructions.
1254
 
  if (NumBytes || MFI->hasVarSizedObjects())
1255
 
    mergeSPUpdatesUp(MBB, MBBI, StackPtr, &NumBytes);
1256
 
 
1257
 
  // If dynamic alloca is used, then reset esp to point to the last callee-saved
1258
 
  // slot before popping them off! Same applies for the case, when stack was
1259
 
  // realigned.
1260
 
  if (needsStackRealignment(MF)) {
1261
 
    // We cannot use LEA here, because stack pointer was realigned. We need to
1262
 
    // deallocate local frame back.
1263
 
    if (CSSize) {
1264
 
      emitSPUpdate(MBB, MBBI, StackPtr, NumBytes, Is64Bit, TII);
1265
 
      MBBI = prior(LastCSPop);
1266
 
    }
1267
 
 
1268
 
    BuildMI(MBB, MBBI, DL,
1269
 
            TII.get(Is64Bit ? X86::MOV64rr : X86::MOV32rr),
1270
 
            StackPtr).addReg(FramePtr);
1271
 
  } else if (MFI->hasVarSizedObjects()) {
1272
 
    if (CSSize) {
1273
 
      unsigned Opc = Is64Bit ? X86::LEA64r : X86::LEA32r;
1274
 
      MachineInstr *MI =
1275
 
        addRegOffset(BuildMI(MF, DL, TII.get(Opc), StackPtr),
1276
 
                     FramePtr, false, -CSSize);
1277
 
      MBB.insert(MBBI, MI);
1278
 
    } else {
1279
 
      BuildMI(MBB, MBBI, DL,
1280
 
              TII.get(Is64Bit ? X86::MOV64rr : X86::MOV32rr), StackPtr)
1281
 
        .addReg(FramePtr);
1282
 
    }
1283
 
  } else if (NumBytes) {
1284
 
    // Adjust stack pointer back: ESP += numbytes.
1285
 
    emitSPUpdate(MBB, MBBI, StackPtr, NumBytes, Is64Bit, TII);
1286
 
  }
1287
 
 
1288
 
  // We're returning from function via eh_return.
1289
 
  if (RetOpcode == X86::EH_RETURN || RetOpcode == X86::EH_RETURN64) {
1290
 
    MBBI = prior(MBB.end());
1291
 
    MachineOperand &DestAddr  = MBBI->getOperand(0);
1292
 
    assert(DestAddr.isReg() && "Offset should be in register!");
1293
 
    BuildMI(MBB, MBBI, DL,
1294
 
            TII.get(Is64Bit ? X86::MOV64rr : X86::MOV32rr),
1295
 
            StackPtr).addReg(DestAddr.getReg());
1296
 
  } else if (RetOpcode == X86::TCRETURNri || RetOpcode == X86::TCRETURNdi ||
1297
 
             RetOpcode == X86::TCRETURNmi ||
1298
 
             RetOpcode == X86::TCRETURNri64 || RetOpcode == X86::TCRETURNdi64 ||
1299
 
             RetOpcode == X86::TCRETURNmi64) {
1300
 
    bool isMem = RetOpcode == X86::TCRETURNmi || RetOpcode == X86::TCRETURNmi64;
1301
 
    // Tail call return: adjust the stack pointer and jump to callee.
1302
 
    MBBI = prior(MBB.end());
1303
 
    MachineOperand &JumpTarget = MBBI->getOperand(0);
1304
 
    MachineOperand &StackAdjust = MBBI->getOperand(isMem ? 5 : 1);
1305
 
    assert(StackAdjust.isImm() && "Expecting immediate value.");
1306
 
 
1307
 
    // Adjust stack pointer.
1308
 
    int StackAdj = StackAdjust.getImm();
1309
 
    int MaxTCDelta = X86FI->getTCReturnAddrDelta();
1310
 
    int Offset = 0;
1311
 
    assert(MaxTCDelta <= 0 && "MaxTCDelta should never be positive");
1312
 
 
1313
 
    // Incoporate the retaddr area.
1314
 
    Offset = StackAdj-MaxTCDelta;
1315
 
    assert(Offset >= 0 && "Offset should never be negative");
1316
 
 
1317
 
    if (Offset) {
1318
 
      // Check for possible merge with preceeding ADD instruction.
1319
 
      Offset += mergeSPUpdates(MBB, MBBI, StackPtr, true);
1320
 
      emitSPUpdate(MBB, MBBI, StackPtr, Offset, Is64Bit, TII);
1321
 
    }
1322
 
 
1323
 
    // Jump to label or value in register.
1324
 
    if (RetOpcode == X86::TCRETURNdi || RetOpcode == X86::TCRETURNdi64) {
1325
 
      BuildMI(MBB, MBBI, DL, TII.get((RetOpcode == X86::TCRETURNdi)
1326
 
                                     ? X86::TAILJMPd : X86::TAILJMPd64)).
1327
 
        addGlobalAddress(JumpTarget.getGlobal(), JumpTarget.getOffset(),
1328
 
                         JumpTarget.getTargetFlags());
1329
 
    } else if (RetOpcode == X86::TCRETURNmi || RetOpcode == X86::TCRETURNmi64) {
1330
 
      MachineInstrBuilder MIB =
1331
 
        BuildMI(MBB, MBBI, DL, TII.get((RetOpcode == X86::TCRETURNmi)
1332
 
                                       ? X86::TAILJMPm : X86::TAILJMPm64));
1333
 
      for (unsigned i = 0; i != 5; ++i)
1334
 
        MIB.addOperand(MBBI->getOperand(i));
1335
 
    } else if (RetOpcode == X86::TCRETURNri64) {
1336
 
      BuildMI(MBB, MBBI, DL, TII.get(X86::TAILJMPr64)).
1337
 
        addReg(JumpTarget.getReg(), RegState::Kill);
1338
 
    } else {
1339
 
      BuildMI(MBB, MBBI, DL, TII.get(X86::TAILJMPr)).
1340
 
        addReg(JumpTarget.getReg(), RegState::Kill);
1341
 
    }
1342
 
 
1343
 
    MachineInstr *NewMI = prior(MBBI);
1344
 
    for (unsigned i = 2, e = MBBI->getNumOperands(); i != e; ++i)
1345
 
      NewMI->addOperand(MBBI->getOperand(i));
1346
 
 
1347
 
    // Delete the pseudo instruction TCRETURN.
1348
 
    MBB.erase(MBBI);
1349
 
  } else if ((RetOpcode == X86::RET || RetOpcode == X86::RETI) &&
1350
 
             (X86FI->getTCReturnAddrDelta() < 0)) {
1351
 
    // Add the return addr area delta back since we are not tail calling.
1352
 
    int delta = -1*X86FI->getTCReturnAddrDelta();
1353
 
    MBBI = prior(MBB.end());
1354
 
 
1355
 
    // Check for possible merge with preceeding ADD instruction.
1356
 
    delta += mergeSPUpdates(MBB, MBBI, StackPtr, true);
1357
 
    emitSPUpdate(MBB, MBBI, StackPtr, delta, Is64Bit, TII);
1358
 
  }
1359
 
}
1360
 
 
1361
 
unsigned X86RegisterInfo::getRARegister() const {
1362
 
  return Is64Bit ? X86::RIP     // Should have dwarf #16.
1363
 
                 : X86::EIP;    // Should have dwarf #8.
1364
 
}
1365
 
 
1366
 
unsigned X86RegisterInfo::getFrameRegister(const MachineFunction &MF) const {
1367
 
  return hasFP(MF) ? FramePtr : StackPtr;
1368
 
}
1369
 
 
1370
 
void
1371
 
X86RegisterInfo::getInitialFrameState(std::vector<MachineMove> &Moves) const {
1372
 
  // Calculate amount of bytes used for return address storing
1373
 
  int stackGrowth = (Is64Bit ? -8 : -4);
1374
 
 
1375
 
  // Initial state of the frame pointer is esp+stackGrowth.
1376
 
  MachineLocation Dst(MachineLocation::VirtualFP);
1377
 
  MachineLocation Src(StackPtr, stackGrowth);
1378
 
  Moves.push_back(MachineMove(0, Dst, Src));
1379
 
 
1380
 
  // Add return address to move list
1381
 
  MachineLocation CSDst(StackPtr, stackGrowth);
1382
 
  MachineLocation CSSrc(getRARegister());
1383
 
  Moves.push_back(MachineMove(0, CSDst, CSSrc));
1384
 
}
1385
 
 
1386
 
unsigned X86RegisterInfo::getEHExceptionRegister() const {
1387
 
  llvm_unreachable("What is the exception register");
1388
 
  return 0;
1389
 
}
1390
 
 
1391
 
unsigned X86RegisterInfo::getEHHandlerRegister() const {
1392
 
  llvm_unreachable("What is the exception handler register");
1393
 
  return 0;
1394
 
}
1395
 
 
1396
 
namespace llvm {
1397
 
unsigned getX86SubSuperRegister(unsigned Reg, EVT VT, bool High) {
1398
 
  switch (VT.getSimpleVT().SimpleTy) {
1399
 
  default: return Reg;
1400
 
  case MVT::i8:
1401
 
    if (High) {
1402
 
      switch (Reg) {
1403
 
      default: return 0;
1404
 
      case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
1405
 
        return X86::AH;
1406
 
      case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
1407
 
        return X86::DH;
1408
 
      case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
1409
 
        return X86::CH;
1410
 
      case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
1411
 
        return X86::BH;
1412
 
      }
1413
 
    } else {
1414
 
      switch (Reg) {
1415
 
      default: return 0;
1416
 
      case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
1417
 
        return X86::AL;
1418
 
      case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
1419
 
        return X86::DL;
1420
 
      case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
1421
 
        return X86::CL;
1422
 
      case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
1423
 
        return X86::BL;
1424
 
      case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
1425
 
        return X86::SIL;
1426
 
      case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
1427
 
        return X86::DIL;
1428
 
      case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
1429
 
        return X86::BPL;
1430
 
      case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
1431
 
        return X86::SPL;
1432
 
      case X86::R8B: case X86::R8W: case X86::R8D: case X86::R8:
1433
 
        return X86::R8B;
1434
 
      case X86::R9B: case X86::R9W: case X86::R9D: case X86::R9:
1435
 
        return X86::R9B;
1436
 
      case X86::R10B: case X86::R10W: case X86::R10D: case X86::R10:
1437
 
        return X86::R10B;
1438
 
      case X86::R11B: case X86::R11W: case X86::R11D: case X86::R11:
1439
 
        return X86::R11B;
1440
 
      case X86::R12B: case X86::R12W: case X86::R12D: case X86::R12:
1441
 
        return X86::R12B;
1442
 
      case X86::R13B: case X86::R13W: case X86::R13D: case X86::R13:
1443
 
        return X86::R13B;
1444
 
      case X86::R14B: case X86::R14W: case X86::R14D: case X86::R14:
1445
 
        return X86::R14B;
1446
 
      case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
1447
 
        return X86::R15B;
1448
 
      }
1449
 
    }
1450
 
  case MVT::i16:
1451
 
    switch (Reg) {
1452
 
    default: return Reg;
1453
 
    case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
1454
 
      return X86::AX;
1455
 
    case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
1456
 
      return X86::DX;
1457
 
    case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
1458
 
      return X86::CX;
1459
 
    case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
1460
 
      return X86::BX;
1461
 
    case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
1462
 
      return X86::SI;
1463
 
    case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
1464
 
      return X86::DI;
1465
 
    case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
1466
 
      return X86::BP;
1467
 
    case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
1468
 
      return X86::SP;
1469
 
    case X86::R8B: case X86::R8W: case X86::R8D: case X86::R8:
1470
 
      return X86::R8W;
1471
 
    case X86::R9B: case X86::R9W: case X86::R9D: case X86::R9:
1472
 
      return X86::R9W;
1473
 
    case X86::R10B: case X86::R10W: case X86::R10D: case X86::R10:
1474
 
      return X86::R10W;
1475
 
    case X86::R11B: case X86::R11W: case X86::R11D: case X86::R11:
1476
 
      return X86::R11W;
1477
 
    case X86::R12B: case X86::R12W: case X86::R12D: case X86::R12:
1478
 
      return X86::R12W;
1479
 
    case X86::R13B: case X86::R13W: case X86::R13D: case X86::R13:
1480
 
      return X86::R13W;
1481
 
    case X86::R14B: case X86::R14W: case X86::R14D: case X86::R14:
1482
 
      return X86::R14W;
1483
 
    case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
1484
 
      return X86::R15W;
1485
 
    }
1486
 
  case MVT::i32:
1487
 
    switch (Reg) {
1488
 
    default: return Reg;
1489
 
    case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
1490
 
      return X86::EAX;
1491
 
    case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
1492
 
      return X86::EDX;
1493
 
    case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
1494
 
      return X86::ECX;
1495
 
    case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
1496
 
      return X86::EBX;
1497
 
    case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
1498
 
      return X86::ESI;
1499
 
    case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
1500
 
      return X86::EDI;
1501
 
    case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
1502
 
      return X86::EBP;
1503
 
    case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
1504
 
      return X86::ESP;
1505
 
    case X86::R8B: case X86::R8W: case X86::R8D: case X86::R8:
1506
 
      return X86::R8D;
1507
 
    case X86::R9B: case X86::R9W: case X86::R9D: case X86::R9:
1508
 
      return X86::R9D;
1509
 
    case X86::R10B: case X86::R10W: case X86::R10D: case X86::R10:
1510
 
      return X86::R10D;
1511
 
    case X86::R11B: case X86::R11W: case X86::R11D: case X86::R11:
1512
 
      return X86::R11D;
1513
 
    case X86::R12B: case X86::R12W: case X86::R12D: case X86::R12:
1514
 
      return X86::R12D;
1515
 
    case X86::R13B: case X86::R13W: case X86::R13D: case X86::R13:
1516
 
      return X86::R13D;
1517
 
    case X86::R14B: case X86::R14W: case X86::R14D: case X86::R14:
1518
 
      return X86::R14D;
1519
 
    case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
1520
 
      return X86::R15D;
1521
 
    }
1522
 
  case MVT::i64:
1523
 
    switch (Reg) {
1524
 
    default: return Reg;
1525
 
    case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
1526
 
      return X86::RAX;
1527
 
    case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
1528
 
      return X86::RDX;
1529
 
    case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
1530
 
      return X86::RCX;
1531
 
    case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
1532
 
      return X86::RBX;
1533
 
    case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
1534
 
      return X86::RSI;
1535
 
    case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
1536
 
      return X86::RDI;
1537
 
    case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
1538
 
      return X86::RBP;
1539
 
    case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
1540
 
      return X86::RSP;
1541
 
    case X86::R8B: case X86::R8W: case X86::R8D: case X86::R8:
1542
 
      return X86::R8;
1543
 
    case X86::R9B: case X86::R9W: case X86::R9D: case X86::R9:
1544
 
      return X86::R9;
1545
 
    case X86::R10B: case X86::R10W: case X86::R10D: case X86::R10:
1546
 
      return X86::R10;
1547
 
    case X86::R11B: case X86::R11W: case X86::R11D: case X86::R11:
1548
 
      return X86::R11;
1549
 
    case X86::R12B: case X86::R12W: case X86::R12D: case X86::R12:
1550
 
      return X86::R12;
1551
 
    case X86::R13B: case X86::R13W: case X86::R13D: case X86::R13:
1552
 
      return X86::R13;
1553
 
    case X86::R14B: case X86::R14W: case X86::R14D: case X86::R14:
1554
 
      return X86::R14;
1555
 
    case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
1556
 
      return X86::R15;
1557
 
    }
1558
 
  }
1559
 
 
1560
 
  return Reg;
1561
 
}
1562
 
}
1563
 
 
1564
 
#include "X86GenRegisterInfo.inc"
1565
 
 
1566
 
namespace {
1567
 
  struct MSAH : public MachineFunctionPass {
1568
 
    static char ID;
1569
 
    MSAH() : MachineFunctionPass(ID) {}
1570
 
 
1571
 
    virtual bool runOnMachineFunction(MachineFunction &MF) {
1572
 
      const X86TargetMachine *TM =
1573
 
        static_cast<const X86TargetMachine *>(&MF.getTarget());
1574
 
      const X86RegisterInfo *X86RI = TM->getRegisterInfo();
1575
 
      MachineRegisterInfo &RI = MF.getRegInfo();
1576
 
      X86MachineFunctionInfo *FuncInfo = MF.getInfo<X86MachineFunctionInfo>();
1577
 
      unsigned StackAlignment = X86RI->getStackAlignment();
1578
 
 
1579
 
      // Be over-conservative: scan over all vreg defs and find whether vector
1580
 
      // registers are used. If yes, there is a possibility that vector register
1581
 
      // will be spilled and thus require dynamic stack realignment.
1582
 
      for (unsigned RegNum = TargetRegisterInfo::FirstVirtualRegister;
1583
 
           RegNum < RI.getLastVirtReg(); ++RegNum)
1584
 
        if (RI.getRegClass(RegNum)->getAlignment() > StackAlignment) {
1585
 
          FuncInfo->setReserveFP(true);
1586
 
          return true;
1587
 
        }
1588
 
 
1589
 
      // Nothing to do
1590
 
      return false;
1591
 
    }
1592
 
 
1593
 
    virtual const char *getPassName() const {
1594
 
      return "X86 Maximal Stack Alignment Check";
1595
 
    }
1596
 
 
1597
 
    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
1598
 
      AU.setPreservesCFG();
1599
 
      MachineFunctionPass::getAnalysisUsage(AU);
1600
 
    }
1601
 
  };
1602
 
 
1603
 
  char MSAH::ID = 0;
1604
 
}
1605
 
 
1606
 
FunctionPass*
1607
 
llvm::createX86MaxStackAlignmentHeuristicPass() { return new MSAH(); }