PPCRegisterInfo.cpp revision dac237e18209b697a8ba122d0ddd9cad4dfba1f8
121e463b2bf864671a87ebe386cb100ef9349a540Nate Begeman//===- PPCRegisterInfo.cpp - PowerPC Register Information -------*- C++ -*-===//
2b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman//
3f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman//                     The LLVM Compiler Infrastructure
4f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman//
8f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman//===----------------------------------------------------------------------===//
9f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman//
106f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman// This file contains the PowerPC implementation of the TargetRegisterInfo
116f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman// class.
12f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman//
13f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman//===----------------------------------------------------------------------===//
14f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
15f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman#define DEBUG_TYPE "reginfo"
162668959b8879097db368aec7d76c455260abc75bChris Lattner#include "PPC.h"
1726bd0d48a164c419462133270e3ec1c2401a34d7Chris Lattner#include "PPCInstrBuilder.h"
182f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey#include "PPCMachineFunctionInfo.h"
1916e71f2f70811c69c56052dd146324fe20e31db5Chris Lattner#include "PPCRegisterInfo.h"
202f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey#include "PPCFrameInfo.h"
21804e06704261f233111913a047ef7f7dec1b8725Chris Lattner#include "PPCSubtarget.h"
2230e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer#include "llvm/CallingConv.h"
23f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman#include "llvm/Constants.h"
241532f3ddd77c362dd5f613af06b4de636e3c5b0eDale Johannesen#include "llvm/Function.h"
25f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman#include "llvm/Type.h"
26f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman#include "llvm/CodeGen/ValueTypes.h"
27f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman#include "llvm/CodeGen/MachineInstrBuilder.h"
2844c3b9fdd416c79f4b67cde1aecfced5921efd81Jim Laskey#include "llvm/CodeGen/MachineModuleInfo.h"
29f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman#include "llvm/CodeGen/MachineFunction.h"
30f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman#include "llvm/CodeGen/MachineFrameInfo.h"
31f1d78e83356a412e525c30ac90dabf090a8cfc99Jim Laskey#include "llvm/CodeGen/MachineLocation.h"
3284bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner#include "llvm/CodeGen/MachineRegisterInfo.h"
337194aaf738a1b89441635340403f1c5b06ae18efBill Wendling#include "llvm/CodeGen/RegisterScavenging.h"
34f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman#include "llvm/Target/TargetFrameInfo.h"
35f9568d8700d5389799796262cde313bb5c7d588aChris Lattner#include "llvm/Target/TargetInstrInfo.h"
36f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman#include "llvm/Target/TargetMachine.h"
37f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman#include "llvm/Target/TargetOptions.h"
38551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/CommandLine.h"
39551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/Debug.h"
40dac237e18209b697a8ba122d0ddd9cad4dfba1f8Torok Edwin#include "llvm/Support/ErrorHandling.h"
41ae232e7a1055033436370c0b3aecf054fa44d5e7Nate Begeman#include "llvm/Support/MathExtras.h"
42dac237e18209b697a8ba122d0ddd9cad4dfba1f8Torok Edwin#include "llvm/Support/raw_ostream.h"
43b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng#include "llvm/ADT/BitVector.h"
44551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/ADT/STLExtras.h"
45f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman#include <cstdlib>
46f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukmanusing namespace llvm;
47f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
4882e4289fc7fed755442c215e9d3175c1badb831eDale Johannesen// FIXME This disables some code that aligns the stack to a boundary
4982e4289fc7fed755442c215e9d3175c1badb831eDale Johannesen// bigger than the default (16 bytes on Darwin) when there is a stack local
5082e4289fc7fed755442c215e9d3175c1badb831eDale Johannesen// of greater alignment.  This does not currently work, because the delta
5182e4289fc7fed755442c215e9d3175c1badb831eDale Johannesen// between old and new stack pointers is added to offsets that reference
5282e4289fc7fed755442c215e9d3175c1badb831eDale Johannesen// incoming parameters after the prolog is generated, and the code that
5382e4289fc7fed755442c215e9d3175c1badb831eDale Johannesen// does that doesn't handle a variable delta.  You don't want to do that
5482e4289fc7fed755442c215e9d3175c1badb831eDale Johannesen// anyway; a better approach is to reserve another register that retains
5582e4289fc7fed755442c215e9d3175c1badb831eDale Johannesen// to the incoming stack pointer, and reference parameters relative to that.
5682e4289fc7fed755442c215e9d3175c1badb831eDale Johannesen#define ALIGN_STACK 0
5782e4289fc7fed755442c215e9d3175c1badb831eDale Johannesen
58880d0f6018b6928bdcad291be60c801238619955Bill Wendling// FIXME (64-bit): Eventually enable by default.
594a66e9a57e679b4f3243bf2061daf53c70102030Bill Wendlingcl::opt<bool> EnablePPC32RS("enable-ppc32-regscavenger",
604a66e9a57e679b4f3243bf2061daf53c70102030Bill Wendling                            cl::init(false),
614a66e9a57e679b4f3243bf2061daf53c70102030Bill Wendling                            cl::desc("Enable PPC32 register scavenger"),
624a66e9a57e679b4f3243bf2061daf53c70102030Bill Wendling                            cl::Hidden);
634a66e9a57e679b4f3243bf2061daf53c70102030Bill Wendlingcl::opt<bool> EnablePPC64RS("enable-ppc64-regscavenger",
644a66e9a57e679b4f3243bf2061daf53c70102030Bill Wendling                            cl::init(false),
654a66e9a57e679b4f3243bf2061daf53c70102030Bill Wendling                            cl::desc("Enable PPC64 register scavenger"),
664a66e9a57e679b4f3243bf2061daf53c70102030Bill Wendling                            cl::Hidden);
674a66e9a57e679b4f3243bf2061daf53c70102030Bill Wendling#define EnableRegisterScavenging \
684a66e9a57e679b4f3243bf2061daf53c70102030Bill Wendling  ((EnablePPC32RS && !Subtarget.isPPC64()) || \
694a66e9a57e679b4f3243bf2061daf53c70102030Bill Wendling   (EnablePPC64RS && Subtarget.isPPC64()))
70880d0f6018b6928bdcad291be60c801238619955Bill Wendling
717194aaf738a1b89441635340403f1c5b06ae18efBill Wendling// FIXME (64-bit): Should be inlined.
727194aaf738a1b89441635340403f1c5b06ae18efBill Wendlingbool
737194aaf738a1b89441635340403f1c5b06ae18efBill WendlingPPCRegisterInfo::requiresRegisterScavenging(const MachineFunction &) const {
744a66e9a57e679b4f3243bf2061daf53c70102030Bill Wendling  return EnableRegisterScavenging;
757194aaf738a1b89441635340403f1c5b06ae18efBill Wendling}
767194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
77369503f8412bba4a0138074c97107c09cc4513e0Chris Lattner/// getRegisterNumbering - Given the enum value for some register, e.g.
78369503f8412bba4a0138074c97107c09cc4513e0Chris Lattner/// PPC::F14, return the number that it corresponds to (e.g. 14).
79369503f8412bba4a0138074c97107c09cc4513e0Chris Lattnerunsigned PPCRegisterInfo::getRegisterNumbering(unsigned RegEnum) {
80be6a039ad4c6314176b0834c341a25504fded32eChris Lattner  using namespace PPC;
81369503f8412bba4a0138074c97107c09cc4513e0Chris Lattner  switch (RegEnum) {
82a1998d1cbab495aad05c97b36836788809903b79Chris Lattner  case 0: return 0;
830404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R0 :  case X0 :  case F0 :  case V0 : case CR0:  case CR0LT: return  0;
840404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R1 :  case X1 :  case F1 :  case V1 : case CR1:  case CR0GT: return  1;
850404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R2 :  case X2 :  case F2 :  case V2 : case CR2:  case CR0EQ: return  2;
860404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R3 :  case X3 :  case F3 :  case V3 : case CR3:  case CR0UN: return  3;
870404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R4 :  case X4 :  case F4 :  case V4 : case CR4:  case CR1LT: return  4;
880404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R5 :  case X5 :  case F5 :  case V5 : case CR5:  case CR1GT: return  5;
890404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R6 :  case X6 :  case F6 :  case V6 : case CR6:  case CR1EQ: return  6;
900404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R7 :  case X7 :  case F7 :  case V7 : case CR7:  case CR1UN: return  7;
910404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R8 :  case X8 :  case F8 :  case V8 : case CR2LT: return  8;
920404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R9 :  case X9 :  case F9 :  case V9 : case CR2GT: return  9;
930404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R10:  case X10:  case F10:  case V10: case CR2EQ: return 10;
940404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R11:  case X11:  case F11:  case V11: case CR2UN: return 11;
950404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R12:  case X12:  case F12:  case V12: case CR3LT: return 12;
960404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R13:  case X13:  case F13:  case V13: case CR3GT: return 13;
970404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R14:  case X14:  case F14:  case V14: case CR3EQ: return 14;
980404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R15:  case X15:  case F15:  case V15: case CR3UN: return 15;
990404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R16:  case X16:  case F16:  case V16: case CR4LT: return 16;
1000404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R17:  case X17:  case F17:  case V17: case CR4GT: return 17;
1010404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R18:  case X18:  case F18:  case V18: case CR4EQ: return 18;
1020404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R19:  case X19:  case F19:  case V19: case CR4UN: return 19;
1030404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R20:  case X20:  case F20:  case V20: case CR5LT: return 20;
1040404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R21:  case X21:  case F21:  case V21: case CR5GT: return 21;
1050404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R22:  case X22:  case F22:  case V22: case CR5EQ: return 22;
1060404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R23:  case X23:  case F23:  case V23: case CR5UN: return 23;
1070404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R24:  case X24:  case F24:  case V24: case CR6LT: return 24;
1080404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R25:  case X25:  case F25:  case V25: case CR6GT: return 25;
1090404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R26:  case X26:  case F26:  case V26: case CR6EQ: return 26;
1100404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R27:  case X27:  case F27:  case V27: case CR6UN: return 27;
1110404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R28:  case X28:  case F28:  case V28: case CR7LT: return 28;
1120404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R29:  case X29:  case F29:  case V29: case CR7GT: return 29;
1130404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R30:  case X30:  case F30:  case V30: case CR7EQ: return 30;
1140404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray  case R31:  case X31:  case F31:  case V31: case CR7UN: return 31;
115be6a039ad4c6314176b0834c341a25504fded32eChris Lattner  default:
116dac237e18209b697a8ba122d0ddd9cad4dfba1f8Torok Edwin    LLVM_UNREACHABLE("Unhandled reg in PPCRegisterInfo::getRegisterNumbering!");
117369503f8412bba4a0138074c97107c09cc4513e0Chris Lattner  }
118369503f8412bba4a0138074c97107c09cc4513e0Chris Lattner}
119369503f8412bba4a0138074c97107c09cc4513e0Chris Lattner
1207ce45783531cfa81bfd7be561ea7e4738e8c6ca8Evan ChengPPCRegisterInfo::PPCRegisterInfo(const PPCSubtarget &ST,
1217ce45783531cfa81bfd7be561ea7e4738e8c6ca8Evan Cheng                                 const TargetInstrInfo &tii)
122804e06704261f233111913a047ef7f7dec1b8725Chris Lattner  : PPCGenRegisterInfo(PPC::ADJCALLSTACKDOWN, PPC::ADJCALLSTACKUP),
1237ce45783531cfa81bfd7be561ea7e4738e8c6ca8Evan Cheng    Subtarget(ST), TII(tii) {
124b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman  ImmToIdxMap[PPC::LD]   = PPC::LDX;    ImmToIdxMap[PPC::STD]  = PPC::STDX;
125f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  ImmToIdxMap[PPC::LBZ]  = PPC::LBZX;   ImmToIdxMap[PPC::STB]  = PPC::STBX;
126f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  ImmToIdxMap[PPC::LHZ]  = PPC::LHZX;   ImmToIdxMap[PPC::LHA]  = PPC::LHAX;
127f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  ImmToIdxMap[PPC::LWZ]  = PPC::LWZX;   ImmToIdxMap[PPC::LWA]  = PPC::LWAX;
128f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  ImmToIdxMap[PPC::LFS]  = PPC::LFSX;   ImmToIdxMap[PPC::LFD]  = PPC::LFDX;
129f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  ImmToIdxMap[PPC::STH]  = PPC::STHX;   ImmToIdxMap[PPC::STW]  = PPC::STWX;
130f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  ImmToIdxMap[PPC::STFS] = PPC::STFSX;  ImmToIdxMap[PPC::STFD] = PPC::STFDX;
1311d9d7427c4a4e3c7bdcfd1f725447f355e509c20Nate Begeman  ImmToIdxMap[PPC::ADDI] = PPC::ADD4;
13282d25148a7aab0b7e048ab9b774207b3766d1bbfBill Wendling
13382d25148a7aab0b7e048ab9b774207b3766d1bbfBill Wendling  // 64-bit
13482d25148a7aab0b7e048ab9b774207b3766d1bbfBill Wendling  ImmToIdxMap[PPC::LHA8] = PPC::LHAX8; ImmToIdxMap[PPC::LBZ8] = PPC::LBZX8;
13582d25148a7aab0b7e048ab9b774207b3766d1bbfBill Wendling  ImmToIdxMap[PPC::LHZ8] = PPC::LHZX8; ImmToIdxMap[PPC::LWZ8] = PPC::LWZX8;
13682d25148a7aab0b7e048ab9b774207b3766d1bbfBill Wendling  ImmToIdxMap[PPC::STB8] = PPC::STBX8; ImmToIdxMap[PPC::STH8] = PPC::STHX8;
13782d25148a7aab0b7e048ab9b774207b3766d1bbfBill Wendling  ImmToIdxMap[PPC::STW8] = PPC::STWX8; ImmToIdxMap[PPC::STDU] = PPC::STDUX;
13882d25148a7aab0b7e048ab9b774207b3766d1bbfBill Wendling  ImmToIdxMap[PPC::ADDI8] = PPC::ADD8; ImmToIdxMap[PPC::STD_32] = PPC::STDX_32;
139f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman}
140f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
141770bcc7b15adbc978800db70dbb1c3c22913b52cEvan Cheng/// getPointerRegClass - Return the register class to use to hold pointers.
142770bcc7b15adbc978800db70dbb1c3c22913b52cEvan Cheng/// This is used for addressing modes.
143770bcc7b15adbc978800db70dbb1c3c22913b52cEvan Chengconst TargetRegisterClass *PPCRegisterInfo::getPointerRegClass() const {
144770bcc7b15adbc978800db70dbb1c3c22913b52cEvan Cheng  if (Subtarget.isPPC64())
145770bcc7b15adbc978800db70dbb1c3c22913b52cEvan Cheng    return &PPC::G8RCRegClass;
146770bcc7b15adbc978800db70dbb1c3c22913b52cEvan Cheng  else
147770bcc7b15adbc978800db70dbb1c3c22913b52cEvan Cheng    return &PPC::GPRCRegClass;
148770bcc7b15adbc978800db70dbb1c3c22913b52cEvan Cheng}
149770bcc7b15adbc978800db70dbb1c3c22913b52cEvan Cheng
15064d80e3387f328d21cd9cc06464b5de7861e3f27Evan Chengconst unsigned*
15164d80e3387f328d21cd9cc06464b5de7861e3f27Evan ChengPPCRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
152804e06704261f233111913a047ef7f7dec1b8725Chris Lattner  // 32-bit Darwin calling convention.
1532a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller  static const unsigned Darwin32_CalleeSavedRegs[] = {
1542f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey              PPC::R13, PPC::R14, PPC::R15,
155804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    PPC::R16, PPC::R17, PPC::R18, PPC::R19,
156804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    PPC::R20, PPC::R21, PPC::R22, PPC::R23,
157804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    PPC::R24, PPC::R25, PPC::R26, PPC::R27,
158804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    PPC::R28, PPC::R29, PPC::R30, PPC::R31,
159804e06704261f233111913a047ef7f7dec1b8725Chris Lattner
160804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    PPC::F14, PPC::F15, PPC::F16, PPC::F17,
161804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    PPC::F18, PPC::F19, PPC::F20, PPC::F21,
162804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    PPC::F22, PPC::F23, PPC::F24, PPC::F25,
163804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    PPC::F26, PPC::F27, PPC::F28, PPC::F29,
164804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    PPC::F30, PPC::F31,
165804e06704261f233111913a047ef7f7dec1b8725Chris Lattner
166804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    PPC::CR2, PPC::CR3, PPC::CR4,
167804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    PPC::V20, PPC::V21, PPC::V22, PPC::V23,
168804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    PPC::V24, PPC::V25, PPC::V26, PPC::V27,
169804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    PPC::V28, PPC::V29, PPC::V30, PPC::V31,
170804e06704261f233111913a047ef7f7dec1b8725Chris Lattner
1710404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray    PPC::CR2LT, PPC::CR2GT, PPC::CR2EQ, PPC::CR2UN,
1720404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray    PPC::CR3LT, PPC::CR3GT, PPC::CR3EQ, PPC::CR3UN,
1730404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray    PPC::CR4LT, PPC::CR4GT, PPC::CR4EQ, PPC::CR4UN,
1740404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray
175804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    PPC::LR,  0
176804e06704261f233111913a047ef7f7dec1b8725Chris Lattner  };
1779f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner
1782a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller  static const unsigned SVR4_CalleeSavedRegs[] = {
179ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller                        PPC::R14, PPC::R15,
1809f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    PPC::R16, PPC::R17, PPC::R18, PPC::R19,
1819f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    PPC::R20, PPC::R21, PPC::R22, PPC::R23,
1829f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    PPC::R24, PPC::R25, PPC::R26, PPC::R27,
1839f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    PPC::R28, PPC::R29, PPC::R30, PPC::R31,
1849f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner
1859f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    PPC::F14, PPC::F15, PPC::F16, PPC::F17,
1869f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    PPC::F18, PPC::F19, PPC::F20, PPC::F21,
1879f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    PPC::F22, PPC::F23, PPC::F24, PPC::F25,
1889f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    PPC::F26, PPC::F27, PPC::F28, PPC::F29,
1899f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    PPC::F30, PPC::F31,
1909f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner
1919f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    PPC::CR2, PPC::CR3, PPC::CR4,
192ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
193ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    PPC::VRSAVE,
194ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1959f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    PPC::V20, PPC::V21, PPC::V22, PPC::V23,
1969f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    PPC::V24, PPC::V25, PPC::V26, PPC::V27,
1979f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    PPC::V28, PPC::V29, PPC::V30, PPC::V31,
1989f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner
1990404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray    PPC::CR2LT, PPC::CR2GT, PPC::CR2EQ, PPC::CR2UN,
2000404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray    PPC::CR3LT, PPC::CR3GT, PPC::CR3EQ, PPC::CR3UN,
2010404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray    PPC::CR4LT, PPC::CR4GT, PPC::CR4EQ, PPC::CR4UN,
2020404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray
2039f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    PPC::LR,  0
2049f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner  };
205804e06704261f233111913a047ef7f7dec1b8725Chris Lattner  // 64-bit Darwin calling convention.
2062a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller  static const unsigned Darwin64_CalleeSavedRegs[] = {
207bdc571b7d578091059aa7bc5c3a190ceb70f9542Chris Lattner    PPC::X14, PPC::X15,
208804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    PPC::X16, PPC::X17, PPC::X18, PPC::X19,
209804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    PPC::X20, PPC::X21, PPC::X22, PPC::X23,
210804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    PPC::X24, PPC::X25, PPC::X26, PPC::X27,
211804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    PPC::X28, PPC::X29, PPC::X30, PPC::X31,
212804e06704261f233111913a047ef7f7dec1b8725Chris Lattner
213804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    PPC::F14, PPC::F15, PPC::F16, PPC::F17,
214804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    PPC::F18, PPC::F19, PPC::F20, PPC::F21,
215804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    PPC::F22, PPC::F23, PPC::F24, PPC::F25,
216804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    PPC::F26, PPC::F27, PPC::F28, PPC::F29,
2170f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Cheng    PPC::F30, PPC::F31,
218804e06704261f233111913a047ef7f7dec1b8725Chris Lattner
219804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    PPC::CR2, PPC::CR3, PPC::CR4,
220804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    PPC::V20, PPC::V21, PPC::V22, PPC::V23,
221804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    PPC::V24, PPC::V25, PPC::V26, PPC::V27,
222804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    PPC::V28, PPC::V29, PPC::V30, PPC::V31,
223804e06704261f233111913a047ef7f7dec1b8725Chris Lattner
2240404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray    PPC::CR2LT, PPC::CR2GT, PPC::CR2EQ, PPC::CR2UN,
2250404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray    PPC::CR3LT, PPC::CR3GT, PPC::CR3EQ, PPC::CR3UN,
2260404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray    PPC::CR4LT, PPC::CR4GT, PPC::CR4EQ, PPC::CR4UN,
2270404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray
2286a5339ba656805a9cd3bf7d884f99bb87ec84e98Chris Lattner    PPC::LR8,  0
2290f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Cheng  };
230804e06704261f233111913a047ef7f7dec1b8725Chris Lattner
2312a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller  if (Subtarget.isDarwinABI())
2322a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller    return Subtarget.isPPC64() ? Darwin64_CalleeSavedRegs :
2332a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller                                 Darwin32_CalleeSavedRegs;
2349f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner
2352a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller  return SVR4_CalleeSavedRegs;
2360f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Cheng}
2370f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Cheng
2380f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Chengconst TargetRegisterClass* const*
2392365f51ed03afe6993bae962fdc2e5a956a64cd5Anton KorobeynikovPPCRegisterInfo::getCalleeSavedRegClasses(const MachineFunction *MF) const {
2402a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller  // 32-bit Darwin calling convention.
2412a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller  static const TargetRegisterClass * const Darwin32_CalleeSavedRegClasses[] = {
2422f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey                       &PPC::GPRCRegClass,&PPC::GPRCRegClass,&PPC::GPRCRegClass,
243804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    &PPC::GPRCRegClass,&PPC::GPRCRegClass,&PPC::GPRCRegClass,&PPC::GPRCRegClass,
244804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    &PPC::GPRCRegClass,&PPC::GPRCRegClass,&PPC::GPRCRegClass,&PPC::GPRCRegClass,
245804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    &PPC::GPRCRegClass,&PPC::GPRCRegClass,&PPC::GPRCRegClass,&PPC::GPRCRegClass,
246804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    &PPC::GPRCRegClass,&PPC::GPRCRegClass,&PPC::GPRCRegClass,&PPC::GPRCRegClass,
247804e06704261f233111913a047ef7f7dec1b8725Chris Lattner
248804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    &PPC::F8RCRegClass,&PPC::F8RCRegClass,&PPC::F8RCRegClass,&PPC::F8RCRegClass,
249804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    &PPC::F8RCRegClass,&PPC::F8RCRegClass,&PPC::F8RCRegClass,&PPC::F8RCRegClass,
250804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    &PPC::F8RCRegClass,&PPC::F8RCRegClass,&PPC::F8RCRegClass,&PPC::F8RCRegClass,
251804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    &PPC::F8RCRegClass,&PPC::F8RCRegClass,&PPC::F8RCRegClass,&PPC::F8RCRegClass,
252804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    &PPC::F8RCRegClass,&PPC::F8RCRegClass,
253804e06704261f233111913a047ef7f7dec1b8725Chris Lattner
254804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    &PPC::CRRCRegClass,&PPC::CRRCRegClass,&PPC::CRRCRegClass,
255804e06704261f233111913a047ef7f7dec1b8725Chris Lattner
256804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    &PPC::VRRCRegClass,&PPC::VRRCRegClass,&PPC::VRRCRegClass,&PPC::VRRCRegClass,
257804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    &PPC::VRRCRegClass,&PPC::VRRCRegClass,&PPC::VRRCRegClass,&PPC::VRRCRegClass,
258804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    &PPC::VRRCRegClass,&PPC::VRRCRegClass,&PPC::VRRCRegClass,&PPC::VRRCRegClass,
259804e06704261f233111913a047ef7f7dec1b8725Chris Lattner
2600404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray    &PPC::CRBITRCRegClass,&PPC::CRBITRCRegClass,&PPC::CRBITRCRegClass,
2610404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray    &PPC::CRBITRCRegClass,
2620404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray    &PPC::CRBITRCRegClass,&PPC::CRBITRCRegClass,&PPC::CRBITRCRegClass,
2630404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray    &PPC::CRBITRCRegClass,
2640404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray    &PPC::CRBITRCRegClass,&PPC::CRBITRCRegClass,&PPC::CRBITRCRegClass,
2650404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray    &PPC::CRBITRCRegClass,
2660404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray
267804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    &PPC::GPRCRegClass, 0
268804e06704261f233111913a047ef7f7dec1b8725Chris Lattner  };
269804e06704261f233111913a047ef7f7dec1b8725Chris Lattner
2702a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller  static const TargetRegisterClass * const SVR4_CalleeSavedRegClasses[] = {
271ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller                                          &PPC::GPRCRegClass,&PPC::GPRCRegClass,
2729f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    &PPC::GPRCRegClass,&PPC::GPRCRegClass,&PPC::GPRCRegClass,&PPC::GPRCRegClass,
2739f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    &PPC::GPRCRegClass,&PPC::GPRCRegClass,&PPC::GPRCRegClass,&PPC::GPRCRegClass,
2749f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    &PPC::GPRCRegClass,&PPC::GPRCRegClass,&PPC::GPRCRegClass,&PPC::GPRCRegClass,
2759f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    &PPC::GPRCRegClass,&PPC::GPRCRegClass,&PPC::GPRCRegClass,&PPC::GPRCRegClass,
2769f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner
2779f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    &PPC::F8RCRegClass,&PPC::F8RCRegClass,&PPC::F8RCRegClass,&PPC::F8RCRegClass,
2789f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    &PPC::F8RCRegClass,&PPC::F8RCRegClass,&PPC::F8RCRegClass,&PPC::F8RCRegClass,
2799f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    &PPC::F8RCRegClass,&PPC::F8RCRegClass,&PPC::F8RCRegClass,&PPC::F8RCRegClass,
2809f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    &PPC::F8RCRegClass,&PPC::F8RCRegClass,&PPC::F8RCRegClass,&PPC::F8RCRegClass,
2819f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    &PPC::F8RCRegClass,&PPC::F8RCRegClass,
2829f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner
2839f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    &PPC::CRRCRegClass,&PPC::CRRCRegClass,&PPC::CRRCRegClass,
2849f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner
285ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    &PPC::VRSAVERCRegClass,
286ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
2879f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    &PPC::VRRCRegClass,&PPC::VRRCRegClass,&PPC::VRRCRegClass,&PPC::VRRCRegClass,
2889f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    &PPC::VRRCRegClass,&PPC::VRRCRegClass,&PPC::VRRCRegClass,&PPC::VRRCRegClass,
2899f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    &PPC::VRRCRegClass,&PPC::VRRCRegClass,&PPC::VRRCRegClass,&PPC::VRRCRegClass,
2909f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner
2910404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray    &PPC::CRBITRCRegClass,&PPC::CRBITRCRegClass,&PPC::CRBITRCRegClass,
2920404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray    &PPC::CRBITRCRegClass,
2930404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray    &PPC::CRBITRCRegClass,&PPC::CRBITRCRegClass,&PPC::CRBITRCRegClass,
2940404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray    &PPC::CRBITRCRegClass,
2950404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray    &PPC::CRBITRCRegClass,&PPC::CRBITRCRegClass,&PPC::CRBITRCRegClass,
2960404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray    &PPC::CRBITRCRegClass,
2970404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray
2989f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    &PPC::GPRCRegClass, 0
2999f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner  };
3009f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner
3012a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller  // 64-bit Darwin calling convention.
3022a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller  static const TargetRegisterClass * const Darwin64_CalleeSavedRegClasses[] = {
303bdc571b7d578091059aa7bc5c3a190ceb70f9542Chris Lattner    &PPC::G8RCRegClass,&PPC::G8RCRegClass,
304804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    &PPC::G8RCRegClass,&PPC::G8RCRegClass,&PPC::G8RCRegClass,&PPC::G8RCRegClass,
305804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    &PPC::G8RCRegClass,&PPC::G8RCRegClass,&PPC::G8RCRegClass,&PPC::G8RCRegClass,
306804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    &PPC::G8RCRegClass,&PPC::G8RCRegClass,&PPC::G8RCRegClass,&PPC::G8RCRegClass,
307804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    &PPC::G8RCRegClass,&PPC::G8RCRegClass,&PPC::G8RCRegClass,&PPC::G8RCRegClass,
308804e06704261f233111913a047ef7f7dec1b8725Chris Lattner
309804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    &PPC::F8RCRegClass,&PPC::F8RCRegClass,&PPC::F8RCRegClass,&PPC::F8RCRegClass,
310804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    &PPC::F8RCRegClass,&PPC::F8RCRegClass,&PPC::F8RCRegClass,&PPC::F8RCRegClass,
311804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    &PPC::F8RCRegClass,&PPC::F8RCRegClass,&PPC::F8RCRegClass,&PPC::F8RCRegClass,
312804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    &PPC::F8RCRegClass,&PPC::F8RCRegClass,&PPC::F8RCRegClass,&PPC::F8RCRegClass,
313804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    &PPC::F8RCRegClass,&PPC::F8RCRegClass,
314804e06704261f233111913a047ef7f7dec1b8725Chris Lattner
315804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    &PPC::CRRCRegClass,&PPC::CRRCRegClass,&PPC::CRRCRegClass,
316804e06704261f233111913a047ef7f7dec1b8725Chris Lattner
317804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    &PPC::VRRCRegClass,&PPC::VRRCRegClass,&PPC::VRRCRegClass,&PPC::VRRCRegClass,
318804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    &PPC::VRRCRegClass,&PPC::VRRCRegClass,&PPC::VRRCRegClass,&PPC::VRRCRegClass,
319804e06704261f233111913a047ef7f7dec1b8725Chris Lattner    &PPC::VRRCRegClass,&PPC::VRRCRegClass,&PPC::VRRCRegClass,&PPC::VRRCRegClass,
320804e06704261f233111913a047ef7f7dec1b8725Chris Lattner
3210404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray    &PPC::CRBITRCRegClass,&PPC::CRBITRCRegClass,&PPC::CRBITRCRegClass,
3220404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray    &PPC::CRBITRCRegClass,
3230404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray    &PPC::CRBITRCRegClass,&PPC::CRBITRCRegClass,&PPC::CRBITRCRegClass,
3240404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray    &PPC::CRBITRCRegClass,
3250404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray    &PPC::CRBITRCRegClass,&PPC::CRBITRCRegClass,&PPC::CRBITRCRegClass,
3260404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray    &PPC::CRBITRCRegClass,
3270404cd97e4f6ebfe4f8057d4e21119d77654dff2Nicolas Geoffray
3286a5339ba656805a9cd3bf7d884f99bb87ec84e98Chris Lattner    &PPC::G8RCRegClass, 0
3290f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Cheng  };
3309f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner
3312a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller  if (Subtarget.isDarwinABI())
3322a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller    return Subtarget.isPPC64() ? Darwin64_CalleeSavedRegClasses :
3332a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller                                 Darwin32_CalleeSavedRegClasses;
3349f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner
3352a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller  return SVR4_CalleeSavedRegClasses;
3360f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Cheng}
3370f3ac8d8d4ce23eb2ae6f9d850f389250874eea5Evan Cheng
338b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng// needsFP - Return true if the specified function should have a dedicated frame
339b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng// pointer register.  This is true if the function has variable sized allocas or
340b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng// if frame pointer elimination is disabled.
341b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng//
342b371f457b0ea4a652a9f526ba4375c80ae542252Evan Chengstatic bool needsFP(const MachineFunction &MF) {
343b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  const MachineFrameInfo *MFI = MF.getFrameInfo();
34430e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer  return NoFramePointerElim || MFI->hasVarSizedObjects() ||
34530e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer    (PerformTailCallOpt && MF.getInfo<PPCFunctionInfo>()->hasFastCall());
346b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng}
347b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
3487194aaf738a1b89441635340403f1c5b06ae18efBill Wendlingstatic bool spillsCR(const MachineFunction &MF) {
3497194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  const PPCFunctionInfo *FuncInfo = MF.getInfo<PPCFunctionInfo>();
3507194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  return FuncInfo->isCRSpilled();
3517194aaf738a1b89441635340403f1c5b06ae18efBill Wendling}
3527194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
353b371f457b0ea4a652a9f526ba4375c80ae542252Evan ChengBitVector PPCRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
354b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  BitVector Reserved(getNumRegs());
355b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  Reserved.set(PPC::R0);
356b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  Reserved.set(PPC::R1);
357b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  Reserved.set(PPC::LR);
3587194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  Reserved.set(PPC::LR8);
359b384ab9ea113ad22a9c7034b98060c7470f0dcc5Dale Johannesen  Reserved.set(PPC::RM);
3607194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
361ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  // The SVR4 ABI reserves r2 and r13
3622a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller  if (Subtarget.isSVR4ABI()) {
363ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    Reserved.set(PPC::R2);  // System-reserved register
364ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    Reserved.set(PPC::R13); // Small Data Area pointer register
365ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  }
366ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
3677194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  // On PPC64, r13 is the thread pointer. Never allocate this register. Note
3687194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  // that this is over conservative, as it also prevents allocation of R31 when
3697194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  // the FP is not needed.
370b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  if (Subtarget.isPPC64()) {
371b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    Reserved.set(PPC::R13);
372b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    Reserved.set(PPC::R31);
3737194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
3744a66e9a57e679b4f3243bf2061daf53c70102030Bill Wendling    if (!EnableRegisterScavenging)
375880d0f6018b6928bdcad291be60c801238619955Bill Wendling      Reserved.set(PPC::R0);    // FIXME (64-bit): Remove
3767194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
3777194aaf738a1b89441635340403f1c5b06ae18efBill Wendling    Reserved.set(PPC::X0);
3787194aaf738a1b89441635340403f1c5b06ae18efBill Wendling    Reserved.set(PPC::X1);
3797194aaf738a1b89441635340403f1c5b06ae18efBill Wendling    Reserved.set(PPC::X13);
3807194aaf738a1b89441635340403f1c5b06ae18efBill Wendling    Reserved.set(PPC::X31);
381b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  }
3827194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
383b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  if (needsFP(MF))
384b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    Reserved.set(PPC::R31);
3857194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
386b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  return Reserved;
387b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng}
388b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
389f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman//===----------------------------------------------------------------------===//
390f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman// Stack Frame Processing methods
391f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman//===----------------------------------------------------------------------===//
392f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
3932f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey// hasFP - Return true if the specified function actually has a dedicated frame
3942f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey// pointer register.  This is true if the function needs a frame pointer and has
3952f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey// a non-zero stack size.
396dc77540d9506dc151d79b94bae88bd841880ef37Evan Chengbool PPCRegisterInfo::hasFP(const MachineFunction &MF) const {
3972f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  const MachineFrameInfo *MFI = MF.getFrameInfo();
3982f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  return MFI->getStackSize() && needsFP(MF);
3992f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey}
4002f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey
40173944fb22270697e75408cba52cca276be371a1fChris Lattner/// MustSaveLR - Return true if this function requires that we save the LR
4023fc027df4fca0355717515abb4d6e3753e6dee2aChris Lattner/// register onto the stack in the prolog and restore it in the epilog of the
4033fc027df4fca0355717515abb4d6e3753e6dee2aChris Lattner/// function.
404c12e5812be4dacc30781db84b045775c46580240Dale Johannesenstatic bool MustSaveLR(const MachineFunction &MF, unsigned LR) {
4053fc027df4fca0355717515abb4d6e3753e6dee2aChris Lattner  const PPCFunctionInfo *MFI = MF.getInfo<PPCFunctionInfo>();
4063fc027df4fca0355717515abb4d6e3753e6dee2aChris Lattner
407c12e5812be4dacc30781db84b045775c46580240Dale Johannesen  // We need a save/restore of LR if there is any def of LR (which is
408c12e5812be4dacc30781db84b045775c46580240Dale Johannesen  // defined by calls, including the PIC setup sequence), or if there is
409c12e5812be4dacc30781db84b045775c46580240Dale Johannesen  // some use of the LR stack slot (e.g. for builtin_return_address).
410c12e5812be4dacc30781db84b045775c46580240Dale Johannesen  // (LR comes in 32 and 64 bit versions.)
411c12e5812be4dacc30781db84b045775c46580240Dale Johannesen  MachineRegisterInfo::def_iterator RI = MF.getRegInfo().def_begin(LR);
412c12e5812be4dacc30781db84b045775c46580240Dale Johannesen  return RI !=MF.getRegInfo().def_end() || MFI->isLRStoreRequired();
41351fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey}
41451fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey
41530e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer
41630e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer
41721e463b2bf864671a87ebe386cb100ef9349a540Nate Begemanvoid PPCRegisterInfo::
418f2ccb77ee9d8ab35866dae111fa36929689c7511Misha BrukmaneliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
419f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman                              MachineBasicBlock::iterator I) const {
42030e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer  if (PerformTailCallOpt && I->getOpcode() == PPC::ADJCALLSTACKUP) {
421c12e5812be4dacc30781db84b045775c46580240Dale Johannesen    // Add (actually subtract) back the amount the callee popped on return.
42230e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer    if (int CalleeAmt =  I->getOperand(1).getImm()) {
42330e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      bool is64Bit = Subtarget.isPPC64();
42430e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      CalleeAmt *= -1;
42530e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      unsigned StackReg = is64Bit ? PPC::X1 : PPC::R1;
42630e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      unsigned TmpReg = is64Bit ? PPC::X0 : PPC::R0;
42730e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      unsigned ADDIInstr = is64Bit ? PPC::ADDI8 : PPC::ADDI;
42830e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      unsigned ADDInstr = is64Bit ? PPC::ADD8 : PPC::ADD4;
42930e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      unsigned LISInstr = is64Bit ? PPC::LIS8 : PPC::LIS;
43030e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      unsigned ORIInstr = is64Bit ? PPC::ORI8 : PPC::ORI;
431536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      MachineInstr *MI = I;
432536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      DebugLoc dl = MI->getDebugLoc();
43330e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer
43430e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      if (isInt16(CalleeAmt)) {
435536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen        BuildMI(MBB, I, dl, TII.get(ADDIInstr), StackReg).addReg(StackReg).
43630e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer          addImm(CalleeAmt);
43730e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      } else {
43830e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer        MachineBasicBlock::iterator MBBI = I;
439536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen        BuildMI(MBB, MBBI, dl, TII.get(LISInstr), TmpReg)
44030e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer          .addImm(CalleeAmt >> 16);
441536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen        BuildMI(MBB, MBBI, dl, TII.get(ORIInstr), TmpReg)
442587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling          .addReg(TmpReg, RegState::Kill)
44330e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer          .addImm(CalleeAmt & 0xFFFF);
444536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen        BuildMI(MBB, MBBI, dl, TII.get(ADDInstr))
44530e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer          .addReg(StackReg)
44630e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer          .addReg(StackReg)
44730e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer          .addReg(TmpReg);
44830e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      }
44930e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer    }
45030e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer  }
4512f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Simply discard ADJCALLSTACKDOWN, ADJCALLSTACKUP instructions.
452f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  MBB.erase(I);
453f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman}
454f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
4557194aaf738a1b89441635340403f1c5b06ae18efBill Wendling/// findScratchRegister - Find a 'free' PPC register. Try for a call-clobbered
4567194aaf738a1b89441635340403f1c5b06ae18efBill Wendling/// register first and then a spilled callee-saved register if that fails.
4577194aaf738a1b89441635340403f1c5b06ae18efBill Wendlingstatic
4587194aaf738a1b89441635340403f1c5b06ae18efBill Wendlingunsigned findScratchRegister(MachineBasicBlock::iterator II, RegScavenger *RS,
4597194aaf738a1b89441635340403f1c5b06ae18efBill Wendling                             const TargetRegisterClass *RC, int SPAdj) {
4607194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  assert(RS && "Register scavenging must be on");
4617194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  unsigned Reg = RS->FindUnusedReg(RC, true);
4627194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  // FIXME: move ARM callee-saved reg scan to target independent code, then
4637194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  // search for already spilled CS register here.
4647194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  if (Reg == 0)
4657194aaf738a1b89441635340403f1c5b06ae18efBill Wendling    Reg = RS->scavengeRegister(RC, II, SPAdj);
4667194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  return Reg;
4677194aaf738a1b89441635340403f1c5b06ae18efBill Wendling}
4687194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
4697194aaf738a1b89441635340403f1c5b06ae18efBill Wendling/// lowerDynamicAlloc - Generate the code for allocating an object in the
4702f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey/// current frame.  The sequence of code with be in the general form
4712f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey///
4720f8b53f19d29013ab18f3d444cea1e6305405611Dan Gohman///   addi   R0, SP, \#frameSize ; get the address of the previous frame
4732f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey///   stwxu  R0, SP, Rnegsize   ; add and update the SP with the negated size
4740f8b53f19d29013ab18f3d444cea1e6305405611Dan Gohman///   addi   Rnew, SP, \#maxCalFrameSize ; get the top of the allocation
4752f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey///
4767194aaf738a1b89441635340403f1c5b06ae18efBill Wendlingvoid PPCRegisterInfo::lowerDynamicAlloc(MachineBasicBlock::iterator II,
4777194aaf738a1b89441635340403f1c5b06ae18efBill Wendling                                        int SPAdj, RegScavenger *RS) const {
4782f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Get the instruction.
4792f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  MachineInstr &MI = *II;
4802f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Get the instruction's basic block.
4812f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  MachineBasicBlock &MBB = *MI.getParent();
4822f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Get the basic block's function.
4832f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  MachineFunction &MF = *MBB.getParent();
4842f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Get the frame info.
4852f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  MachineFrameInfo *MFI = MF.getFrameInfo();
4862f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Determine whether 64-bit pointers are used.
4872f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  bool LP64 = Subtarget.isPPC64();
488536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen  DebugLoc dl = MI.getDebugLoc();
4892f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey
490fab0439c62984b3dc851eb99c31c4f6edda092a1Evan Cheng  // Get the maximum call stack size.
4912f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  unsigned maxCallFrameSize = MFI->getMaxCallFrameSize();
4922f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Get the total frame size.
4932f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  unsigned FrameSize = MFI->getStackSize();
4942f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey
4952f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Get stack alignments.
4962f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  unsigned TargetAlign = MF.getTarget().getFrameInfo()->getStackAlignment();
4972f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  unsigned MaxAlign = MFI->getMaxAlignment();
498d6fa8c166ace05779ebefe511c615223b12fe7dbJim Laskey  assert(MaxAlign <= TargetAlign &&
499d6fa8c166ace05779ebefe511c615223b12fe7dbJim Laskey         "Dynamic alloca with large aligns not supported");
5002f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey
5012f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Determine the previous frame's address.  If FrameSize can't be
5022f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // represented as 16 bits or we need special alignment, then we load the
5032f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // previous frame's address from 0(SP).  Why not do an addis of the hi?
5042f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Because R0 is our only safe tmp register and addi/addis treat R0 as zero.
5052f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Constructing the constant and adding would take 3 instructions.
5062f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Fortunately, a frame greater than 32K is rare.
5077194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  const TargetRegisterClass *G8RC = &PPC::G8RCRegClass;
5087194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  const TargetRegisterClass *GPRC = &PPC::GPRCRegClass;
5097194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  const TargetRegisterClass *RC = LP64 ? G8RC : GPRC;
5107194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
5117194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  // FIXME (64-bit): Use "findScratchRegister"
5127194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  unsigned Reg;
5134a66e9a57e679b4f3243bf2061daf53c70102030Bill Wendling  if (EnableRegisterScavenging)
5147194aaf738a1b89441635340403f1c5b06ae18efBill Wendling    Reg = findScratchRegister(II, RS, RC, SPAdj);
5157194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  else
5167194aaf738a1b89441635340403f1c5b06ae18efBill Wendling    Reg = PPC::R0;
5177194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
5182f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  if (MaxAlign < TargetAlign && isInt16(FrameSize)) {
519536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen    BuildMI(MBB, II, dl, TII.get(PPC::ADDI), Reg)
5202f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey      .addReg(PPC::R31)
5212f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey      .addImm(FrameSize);
5222f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  } else if (LP64) {
5234a66e9a57e679b4f3243bf2061daf53c70102030Bill Wendling    if (EnableRegisterScavenging) // FIXME (64-bit): Use "true" part.
524536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, II, dl, TII.get(PPC::LD), Reg)
52571a2cb25ebc818383dd0f80475bc166f834e8d99Chris Lattner        .addImm(0)
52671a2cb25ebc818383dd0f80475bc166f834e8d99Chris Lattner        .addReg(PPC::X1);
527880d0f6018b6928bdcad291be60c801238619955Bill Wendling    else
528536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, II, dl, TII.get(PPC::LD), PPC::X0)
52971a2cb25ebc818383dd0f80475bc166f834e8d99Chris Lattner        .addImm(0)
53071a2cb25ebc818383dd0f80475bc166f834e8d99Chris Lattner        .addReg(PPC::X1);
5312f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  } else {
532536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen    BuildMI(MBB, II, dl, TII.get(PPC::LWZ), Reg)
5332f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey      .addImm(0)
5342f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey      .addReg(PPC::R1);
5352f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  }
5362f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey
5377194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  // Grow the stack and update the stack pointer link, then determine the
5387194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  // address of new allocated space.
5392f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  if (LP64) {
5404a66e9a57e679b4f3243bf2061daf53c70102030Bill Wendling    if (EnableRegisterScavenging) // FIXME (64-bit): Use "true" part.
541536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, II, dl, TII.get(PPC::STDUX))
542587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling        .addReg(Reg, RegState::Kill)
54371a2cb25ebc818383dd0f80475bc166f834e8d99Chris Lattner        .addReg(PPC::X1)
54471a2cb25ebc818383dd0f80475bc166f834e8d99Chris Lattner        .addReg(MI.getOperand(1).getReg());
545880d0f6018b6928bdcad291be60c801238619955Bill Wendling    else
546536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, II, dl, TII.get(PPC::STDUX))
547587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling        .addReg(PPC::X0, RegState::Kill)
54871a2cb25ebc818383dd0f80475bc166f834e8d99Chris Lattner        .addReg(PPC::X1)
54971a2cb25ebc818383dd0f80475bc166f834e8d99Chris Lattner        .addReg(MI.getOperand(1).getReg());
5507194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
5517194aaf738a1b89441635340403f1c5b06ae18efBill Wendling    if (!MI.getOperand(1).isKill())
552536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, II, dl, TII.get(PPC::ADDI8), MI.getOperand(0).getReg())
55371a2cb25ebc818383dd0f80475bc166f834e8d99Chris Lattner        .addReg(PPC::X1)
55471a2cb25ebc818383dd0f80475bc166f834e8d99Chris Lattner        .addImm(maxCallFrameSize);
5557194aaf738a1b89441635340403f1c5b06ae18efBill Wendling    else
5567194aaf738a1b89441635340403f1c5b06ae18efBill Wendling      // Implicitly kill the register.
557536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, II, dl, TII.get(PPC::ADDI8), MI.getOperand(0).getReg())
55871a2cb25ebc818383dd0f80475bc166f834e8d99Chris Lattner        .addReg(PPC::X1)
55971a2cb25ebc818383dd0f80475bc166f834e8d99Chris Lattner        .addImm(maxCallFrameSize)
560587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling        .addReg(MI.getOperand(1).getReg(), RegState::ImplicitKill);
5612f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  } else {
562536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen    BuildMI(MBB, II, dl, TII.get(PPC::STWUX))
563587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling      .addReg(Reg, RegState::Kill)
5642f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey      .addReg(PPC::R1)
5652f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey      .addReg(MI.getOperand(1).getReg());
5667194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
5677194aaf738a1b89441635340403f1c5b06ae18efBill Wendling    if (!MI.getOperand(1).isKill())
568536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, II, dl, TII.get(PPC::ADDI), MI.getOperand(0).getReg())
56971a2cb25ebc818383dd0f80475bc166f834e8d99Chris Lattner        .addReg(PPC::R1)
57071a2cb25ebc818383dd0f80475bc166f834e8d99Chris Lattner        .addImm(maxCallFrameSize);
5717194aaf738a1b89441635340403f1c5b06ae18efBill Wendling    else
5727194aaf738a1b89441635340403f1c5b06ae18efBill Wendling      // Implicitly kill the register.
573536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, II, dl, TII.get(PPC::ADDI), MI.getOperand(0).getReg())
57471a2cb25ebc818383dd0f80475bc166f834e8d99Chris Lattner        .addReg(PPC::R1)
57571a2cb25ebc818383dd0f80475bc166f834e8d99Chris Lattner        .addImm(maxCallFrameSize)
576587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling        .addReg(MI.getOperand(1).getReg(), RegState::ImplicitKill);
5772f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  }
5782f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey
5792f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Discard the DYNALLOC instruction.
5802f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  MBB.erase(II);
5812f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey}
5822f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey
5837194aaf738a1b89441635340403f1c5b06ae18efBill Wendling/// lowerCRSpilling - Generate the code for spilling a CR register. Instead of
5847194aaf738a1b89441635340403f1c5b06ae18efBill Wendling/// reserving a whole register (R0), we scrounge for one here. This generates
5857194aaf738a1b89441635340403f1c5b06ae18efBill Wendling/// code like this:
5867194aaf738a1b89441635340403f1c5b06ae18efBill Wendling///
5877194aaf738a1b89441635340403f1c5b06ae18efBill Wendling///   mfcr rA                  ; Move the conditional register into GPR rA.
5887194aaf738a1b89441635340403f1c5b06ae18efBill Wendling///   rlwinm rA, rA, SB, 0, 31 ; Shift the bits left so they are in CR0's slot.
5897194aaf738a1b89441635340403f1c5b06ae18efBill Wendling///   stw rA, FI               ; Store rA to the frame.
5907194aaf738a1b89441635340403f1c5b06ae18efBill Wendling///
5917194aaf738a1b89441635340403f1c5b06ae18efBill Wendlingvoid PPCRegisterInfo::lowerCRSpilling(MachineBasicBlock::iterator II,
5927194aaf738a1b89441635340403f1c5b06ae18efBill Wendling                                      unsigned FrameIndex, int SPAdj,
5937194aaf738a1b89441635340403f1c5b06ae18efBill Wendling                                      RegScavenger *RS) const {
5947194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  // Get the instruction.
5957194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  MachineInstr &MI = *II;       // ; SPILL_CR <SrcReg>, <offset>, <FI>
5967194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  // Get the instruction's basic block.
5977194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  MachineBasicBlock &MBB = *MI.getParent();
598536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen  DebugLoc dl = MI.getDebugLoc();
5997194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
6007194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  const TargetRegisterClass *G8RC = &PPC::G8RCRegClass;
6017194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  const TargetRegisterClass *GPRC = &PPC::GPRCRegClass;
6027194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  const TargetRegisterClass *RC = Subtarget.isPPC64() ? G8RC : GPRC;
6037194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  unsigned Reg = findScratchRegister(II, RS, RC, SPAdj);
6047194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
6052b5fab67c1a2d3ec1184c065e0a6bdaaaec9253aBill Wendling  // We need to store the CR in the low 4-bits of the saved value. First, issue
6062b5fab67c1a2d3ec1184c065e0a6bdaaaec9253aBill Wendling  // an MFCR to save all of the CRBits. Add an implicit kill of the CR.
6077194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  if (!MI.getOperand(0).isKill())
608536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen    BuildMI(MBB, II, dl, TII.get(PPC::MFCR), Reg);
6097194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  else
6107194aaf738a1b89441635340403f1c5b06ae18efBill Wendling    // Implicitly kill the CR register.
611536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen    BuildMI(MBB, II, dl, TII.get(PPC::MFCR), Reg)
612587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling      .addReg(MI.getOperand(0).getReg(), RegState::ImplicitKill);
6132b5fab67c1a2d3ec1184c065e0a6bdaaaec9253aBill Wendling
6147194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  // If the saved register wasn't CR0, shift the bits left so that they are in
6157194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  // CR0's slot.
6167194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  unsigned SrcReg = MI.getOperand(0).getReg();
6177194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  if (SrcReg != PPC::CR0)
6187194aaf738a1b89441635340403f1c5b06ae18efBill Wendling    // rlwinm rA, rA, ShiftBits, 0, 31.
619536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen    BuildMI(MBB, II, dl, TII.get(PPC::RLWINM), Reg)
620587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling      .addReg(Reg, RegState::Kill)
6217194aaf738a1b89441635340403f1c5b06ae18efBill Wendling      .addImm(PPCRegisterInfo::getRegisterNumbering(SrcReg) * 4)
6227194aaf738a1b89441635340403f1c5b06ae18efBill Wendling      .addImm(0)
6237194aaf738a1b89441635340403f1c5b06ae18efBill Wendling      .addImm(31);
6247194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
625536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen  addFrameReference(BuildMI(MBB, II, dl, TII.get(PPC::STW))
626587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling                    .addReg(Reg, getKillRegState(MI.getOperand(1).getImm())),
6277194aaf738a1b89441635340403f1c5b06ae18efBill Wendling                    FrameIndex);
6287194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
6297194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  // Discard the pseudo instruction.
6307194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  MBB.erase(II);
6317194aaf738a1b89441635340403f1c5b06ae18efBill Wendling}
6327194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
6335e6df4647e15c50daea9a8a4e7f4f417a266335cEvan Chengvoid PPCRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
63497de9138217d6f76f25100df272ec1a3c4d31aadEvan Cheng                                          int SPAdj, RegScavenger *RS) const {
63597de9138217d6f76f25100df272ec1a3c4d31aadEvan Cheng  assert(SPAdj == 0 && "Unexpected");
63697de9138217d6f76f25100df272ec1a3c4d31aadEvan Cheng
6372f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Get the instruction.
638f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  MachineInstr &MI = *II;
6392f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Get the instruction's basic block.
640f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  MachineBasicBlock &MBB = *MI.getParent();
6412f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Get the basic block's function.
642f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  MachineFunction &MF = *MBB.getParent();
6432f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Get the frame info.
6442f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  MachineFrameInfo *MFI = MF.getFrameInfo();
645536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen  DebugLoc dl = MI.getDebugLoc();
646b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman
6472f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Find out which operand is the frame index.
648f602a2566845dc57444b9d40538c947b5ed23111Chris Lattner  unsigned FIOperandNo = 0;
649d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman  while (!MI.getOperand(FIOperandNo).isFI()) {
650f602a2566845dc57444b9d40538c947b5ed23111Chris Lattner    ++FIOperandNo;
651f602a2566845dc57444b9d40538c947b5ed23111Chris Lattner    assert(FIOperandNo != MI.getNumOperands() &&
652f602a2566845dc57444b9d40538c947b5ed23111Chris Lattner           "Instr doesn't have FrameIndex operand!");
653f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  }
6542f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Take into account whether it's an add or mem instruction
655f602a2566845dc57444b9d40538c947b5ed23111Chris Lattner  unsigned OffsetOperandNo = (FIOperandNo == 2) ? 1 : 2;
6569aa2895360bd3951fc4f204d8699b84fd9ea6ba5Chris Lattner  if (MI.getOpcode() == TargetInstrInfo::INLINEASM)
657f602a2566845dc57444b9d40538c947b5ed23111Chris Lattner    OffsetOperandNo = FIOperandNo-1;
6587194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
6592f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Get the frame index.
6608aa797aa51cd4ea1ec6f46f4891a6897944b75b2Chris Lattner  int FrameIndex = MI.getOperand(FIOperandNo).getIndex();
6617194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
6622f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Get the frame pointer save index.  Users of this index are primarily
6632f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // DYNALLOC instructions.
6642f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  PPCFunctionInfo *FI = MF.getInfo<PPCFunctionInfo>();
6652f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  int FPSI = FI->getFramePointerSaveIndex();
6662f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Get the instruction opcode.
6672f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  unsigned OpC = MI.getOpcode();
6682f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey
6692f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Special case for dynamic alloca.
6702f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  if (FPSI && FrameIndex == FPSI &&
6712f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey      (OpC == PPC::DYNALLOC || OpC == PPC::DYNALLOC8)) {
6727194aaf738a1b89441635340403f1c5b06ae18efBill Wendling    lowerDynamicAlloc(II, SPAdj, RS);
6737194aaf738a1b89441635340403f1c5b06ae18efBill Wendling    return;
6747194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  }
6757194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
6767194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  // Special case for pseudo-op SPILL_CR.
6774a66e9a57e679b4f3243bf2061daf53c70102030Bill Wendling  if (EnableRegisterScavenging) // FIXME (64-bit): Enable by default.
678880d0f6018b6928bdcad291be60c801238619955Bill Wendling    if (OpC == PPC::SPILL_CR) {
679880d0f6018b6928bdcad291be60c801238619955Bill Wendling      lowerCRSpilling(II, FrameIndex, SPAdj, RS);
680880d0f6018b6928bdcad291be60c801238619955Bill Wendling      return;
681880d0f6018b6928bdcad291be60c801238619955Bill Wendling    }
682f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
683f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  // Replace the FrameIndex with base register with GPR1 (SP) or GPR31 (FP).
684f602a2566845dc57444b9d40538c947b5ed23111Chris Lattner  MI.getOperand(FIOperandNo).ChangeToRegister(hasFP(MF) ? PPC::R31 : PPC::R1,
685f602a2566845dc57444b9d40538c947b5ed23111Chris Lattner                                              false);
686f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
6877ffa9abdadd7e51726240b6a8352abda8edde869Chris Lattner  // Figure out if the offset in the instruction is shifted right two bits. This
6887ffa9abdadd7e51726240b6a8352abda8edde869Chris Lattner  // is true for instructions like "STD", which the machine implicitly adds two
6897ffa9abdadd7e51726240b6a8352abda8edde869Chris Lattner  // low zeros to.
6907ffa9abdadd7e51726240b6a8352abda8edde869Chris Lattner  bool isIXAddr = false;
6912f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  switch (OpC) {
6927ffa9abdadd7e51726240b6a8352abda8edde869Chris Lattner  case PPC::LWA:
6937ffa9abdadd7e51726240b6a8352abda8edde869Chris Lattner  case PPC::LD:
6947ffa9abdadd7e51726240b6a8352abda8edde869Chris Lattner  case PPC::STD:
6957ffa9abdadd7e51726240b6a8352abda8edde869Chris Lattner  case PPC::STD_32:
6967ffa9abdadd7e51726240b6a8352abda8edde869Chris Lattner    isIXAddr = true;
6977ffa9abdadd7e51726240b6a8352abda8edde869Chris Lattner    break;
6987ffa9abdadd7e51726240b6a8352abda8edde869Chris Lattner  }
6997ffa9abdadd7e51726240b6a8352abda8edde869Chris Lattner
700f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  // Now add the frame object offset to the offset from r1.
7012f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  int Offset = MFI->getObjectOffset(FrameIndex);
7027ffa9abdadd7e51726240b6a8352abda8edde869Chris Lattner  if (!isIXAddr)
7039a1ceaedc282f0cae31f2723f4d6c00c7b88fe90Chris Lattner    Offset += MI.getOperand(OffsetOperandNo).getImm();
7047ffa9abdadd7e51726240b6a8352abda8edde869Chris Lattner  else
7059a1ceaedc282f0cae31f2723f4d6c00c7b88fe90Chris Lattner    Offset += MI.getOperand(OffsetOperandNo).getImm() << 2;
706f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
707f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  // If we're not using a Frame Pointer that has been set to the value of the
708f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  // SP before having the stack size subtracted from it, then add the stack size
709f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  // to Offset to get the correct offset.
7102f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  Offset += MFI->getStackSize();
711b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman
712789db09cde5f0cb2a0a5fc175c1141c760a3e807Chris Lattner  // If we can, encode the offset directly into the instruction.  If this is a
713789db09cde5f0cb2a0a5fc175c1141c760a3e807Chris Lattner  // normal PPC "ri" instruction, any 16-bit value can be safely encoded.  If
714789db09cde5f0cb2a0a5fc175c1141c760a3e807Chris Lattner  // this is a PPC64 "ix" instruction, only a 16-bit value with the low two bits
715789db09cde5f0cb2a0a5fc175c1141c760a3e807Chris Lattner  // clear can be encoded.  This is extremely uncommon, because normally you
716789db09cde5f0cb2a0a5fc175c1141c760a3e807Chris Lattner  // only "std" to a stack slot that is at least 4-byte aligned, but it can
717789db09cde5f0cb2a0a5fc175c1141c760a3e807Chris Lattner  // happen in invalid code.
718d96428597b9a4bcf3c0702bbb497796b922c2e91Chris Lattner  if (isInt16(Offset) && (!isIXAddr || (Offset & 3) == 0)) {
719789db09cde5f0cb2a0a5fc175c1141c760a3e807Chris Lattner    if (isIXAddr)
720f602a2566845dc57444b9d40538c947b5ed23111Chris Lattner      Offset >>= 2;    // The actual encoded value has the low two bits zero.
721f602a2566845dc57444b9d40538c947b5ed23111Chris Lattner    MI.getOperand(OffsetOperandNo).ChangeToImmediate(Offset);
722789db09cde5f0cb2a0a5fc175c1141c760a3e807Chris Lattner    return;
723789db09cde5f0cb2a0a5fc175c1141c760a3e807Chris Lattner  }
7247194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
7257194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  // The offset doesn't fit into a single register, scavenge one to build the
7267194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  // offset in.
7277194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  // FIXME: figure out what SPAdj is doing here.
7287194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
7297194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  // FIXME (64-bit): Use "findScratchRegister".
7307194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  unsigned SReg;
7314a66e9a57e679b4f3243bf2061daf53c70102030Bill Wendling  if (EnableRegisterScavenging)
7327194aaf738a1b89441635340403f1c5b06ae18efBill Wendling    SReg = findScratchRegister(II, RS, &PPC::GPRCRegClass, SPAdj);
7337194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  else
7347194aaf738a1b89441635340403f1c5b06ae18efBill Wendling    SReg = PPC::R0;
7357194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
7367194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  // Insert a set of rA with the full offset value before the ld, st, or add
737536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen  BuildMI(MBB, II, dl, TII.get(PPC::LIS), SReg)
7387194aaf738a1b89441635340403f1c5b06ae18efBill Wendling    .addImm(Offset >> 16);
739536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen  BuildMI(MBB, II, dl, TII.get(PPC::ORI), SReg)
740587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling    .addReg(SReg, RegState::Kill)
7417194aaf738a1b89441635340403f1c5b06ae18efBill Wendling    .addImm(Offset);
7427194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
7437194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  // Convert into indexed form of the instruction:
7447194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  //
7457194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  //   sth 0:rA, 1:imm 2:(rB) ==> sthx 0:rA, 2:rB, 1:r0
7467194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  //   addi 0:rA 1:rB, 2, imm ==> add 0:rA, 1:rB, 2:r0
747789db09cde5f0cb2a0a5fc175c1141c760a3e807Chris Lattner  unsigned OperandBase;
7487194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
749789db09cde5f0cb2a0a5fc175c1141c760a3e807Chris Lattner  if (OpC != TargetInstrInfo::INLINEASM) {
750789db09cde5f0cb2a0a5fc175c1141c760a3e807Chris Lattner    assert(ImmToIdxMap.count(OpC) &&
751789db09cde5f0cb2a0a5fc175c1141c760a3e807Chris Lattner           "No indexed form of load or store available!");
752789db09cde5f0cb2a0a5fc175c1141c760a3e807Chris Lattner    unsigned NewOpcode = ImmToIdxMap.find(OpC)->second;
7535080f4d9919d39b367891dc51e739c571a66036cChris Lattner    MI.setDesc(TII.get(NewOpcode));
754789db09cde5f0cb2a0a5fc175c1141c760a3e807Chris Lattner    OperandBase = 1;
755f602a2566845dc57444b9d40538c947b5ed23111Chris Lattner  } else {
756789db09cde5f0cb2a0a5fc175c1141c760a3e807Chris Lattner    OperandBase = OffsetOperandNo;
757f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  }
758789db09cde5f0cb2a0a5fc175c1141c760a3e807Chris Lattner
759789db09cde5f0cb2a0a5fc175c1141c760a3e807Chris Lattner  unsigned StackReg = MI.getOperand(FIOperandNo).getReg();
760789db09cde5f0cb2a0a5fc175c1141c760a3e807Chris Lattner  MI.getOperand(OperandBase).ChangeToRegister(StackReg, false);
7617194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  MI.getOperand(OperandBase + 1).ChangeToRegister(SReg, false);
762f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman}
763f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
764f7d2372b7407c7f8966df39a2b5a067c72bd6b9bChris Lattner/// VRRegNo - Map from a numbered VR register to its enum value.
765f7d2372b7407c7f8966df39a2b5a067c72bd6b9bChris Lattner///
766f7d2372b7407c7f8966df39a2b5a067c72bd6b9bChris Lattnerstatic const unsigned short VRRegNo[] = {
767b47e0897a090d31d952957ba873db6c1e487b50eChris Lattner PPC::V0 , PPC::V1 , PPC::V2 , PPC::V3 , PPC::V4 , PPC::V5 , PPC::V6 , PPC::V7 ,
768b47e0897a090d31d952957ba873db6c1e487b50eChris Lattner PPC::V8 , PPC::V9 , PPC::V10, PPC::V11, PPC::V12, PPC::V13, PPC::V14, PPC::V15,
769f7d2372b7407c7f8966df39a2b5a067c72bd6b9bChris Lattner PPC::V16, PPC::V17, PPC::V18, PPC::V19, PPC::V20, PPC::V21, PPC::V22, PPC::V23,
770f7d2372b7407c7f8966df39a2b5a067c72bd6b9bChris Lattner PPC::V24, PPC::V25, PPC::V26, PPC::V27, PPC::V28, PPC::V29, PPC::V30, PPC::V31
771f7d2372b7407c7f8966df39a2b5a067c72bd6b9bChris Lattner};
772f7d2372b7407c7f8966df39a2b5a067c72bd6b9bChris Lattner
773f9568d8700d5389799796262cde313bb5c7d588aChris Lattner/// RemoveVRSaveCode - We have found that this function does not need any code
774f9568d8700d5389799796262cde313bb5c7d588aChris Lattner/// to manipulate the VRSAVE register, even though it uses vector registers.
775f9568d8700d5389799796262cde313bb5c7d588aChris Lattner/// This can happen when the only registers used are known to be live in or out
776f9568d8700d5389799796262cde313bb5c7d588aChris Lattner/// of the function.  Remove all of the VRSAVE related code from the function.
777f9568d8700d5389799796262cde313bb5c7d588aChris Lattnerstatic void RemoveVRSaveCode(MachineInstr *MI) {
778f9568d8700d5389799796262cde313bb5c7d588aChris Lattner  MachineBasicBlock *Entry = MI->getParent();
779f9568d8700d5389799796262cde313bb5c7d588aChris Lattner  MachineFunction *MF = Entry->getParent();
780f9568d8700d5389799796262cde313bb5c7d588aChris Lattner
781f9568d8700d5389799796262cde313bb5c7d588aChris Lattner  // We know that the MTVRSAVE instruction immediately follows MI.  Remove it.
782f9568d8700d5389799796262cde313bb5c7d588aChris Lattner  MachineBasicBlock::iterator MBBI = MI;
783f9568d8700d5389799796262cde313bb5c7d588aChris Lattner  ++MBBI;
784f9568d8700d5389799796262cde313bb5c7d588aChris Lattner  assert(MBBI != Entry->end() && MBBI->getOpcode() == PPC::MTVRSAVE);
785f9568d8700d5389799796262cde313bb5c7d588aChris Lattner  MBBI->eraseFromParent();
786f9568d8700d5389799796262cde313bb5c7d588aChris Lattner
787f9568d8700d5389799796262cde313bb5c7d588aChris Lattner  bool RemovedAllMTVRSAVEs = true;
788f9568d8700d5389799796262cde313bb5c7d588aChris Lattner  // See if we can find and remove the MTVRSAVE instruction from all of the
789f9568d8700d5389799796262cde313bb5c7d588aChris Lattner  // epilog blocks.
790f9568d8700d5389799796262cde313bb5c7d588aChris Lattner  for (MachineFunction::iterator I = MF->begin(), E = MF->end(); I != E; ++I) {
791f9568d8700d5389799796262cde313bb5c7d588aChris Lattner    // If last instruction is a return instruction, add an epilogue
792749c6f6b5ed301c84aac562e414486549d7b98ebChris Lattner    if (!I->empty() && I->back().getDesc().isReturn()) {
793f9568d8700d5389799796262cde313bb5c7d588aChris Lattner      bool FoundIt = false;
794f9568d8700d5389799796262cde313bb5c7d588aChris Lattner      for (MBBI = I->end(); MBBI != I->begin(); ) {
795f9568d8700d5389799796262cde313bb5c7d588aChris Lattner        --MBBI;
796f9568d8700d5389799796262cde313bb5c7d588aChris Lattner        if (MBBI->getOpcode() == PPC::MTVRSAVE) {
797f9568d8700d5389799796262cde313bb5c7d588aChris Lattner          MBBI->eraseFromParent();  // remove it.
798f9568d8700d5389799796262cde313bb5c7d588aChris Lattner          FoundIt = true;
799f9568d8700d5389799796262cde313bb5c7d588aChris Lattner          break;
800f9568d8700d5389799796262cde313bb5c7d588aChris Lattner        }
801f9568d8700d5389799796262cde313bb5c7d588aChris Lattner      }
802f9568d8700d5389799796262cde313bb5c7d588aChris Lattner      RemovedAllMTVRSAVEs &= FoundIt;
803f9568d8700d5389799796262cde313bb5c7d588aChris Lattner    }
804f9568d8700d5389799796262cde313bb5c7d588aChris Lattner  }
805f9568d8700d5389799796262cde313bb5c7d588aChris Lattner
806f9568d8700d5389799796262cde313bb5c7d588aChris Lattner  // If we found and removed all MTVRSAVE instructions, remove the read of
807f9568d8700d5389799796262cde313bb5c7d588aChris Lattner  // VRSAVE as well.
808f9568d8700d5389799796262cde313bb5c7d588aChris Lattner  if (RemovedAllMTVRSAVEs) {
809f9568d8700d5389799796262cde313bb5c7d588aChris Lattner    MBBI = MI;
810f9568d8700d5389799796262cde313bb5c7d588aChris Lattner    assert(MBBI != Entry->begin() && "UPDATE_VRSAVE is first instr in block?");
811f9568d8700d5389799796262cde313bb5c7d588aChris Lattner    --MBBI;
812f9568d8700d5389799796262cde313bb5c7d588aChris Lattner    assert(MBBI->getOpcode() == PPC::MFVRSAVE && "VRSAVE instrs wandered?");
813f9568d8700d5389799796262cde313bb5c7d588aChris Lattner    MBBI->eraseFromParent();
814f9568d8700d5389799796262cde313bb5c7d588aChris Lattner  }
815f9568d8700d5389799796262cde313bb5c7d588aChris Lattner
816f9568d8700d5389799796262cde313bb5c7d588aChris Lattner  // Finally, nuke the UPDATE_VRSAVE.
817f9568d8700d5389799796262cde313bb5c7d588aChris Lattner  MI->eraseFromParent();
818f9568d8700d5389799796262cde313bb5c7d588aChris Lattner}
819f9568d8700d5389799796262cde313bb5c7d588aChris Lattner
8201877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner// HandleVRSaveUpdate - MI is the UPDATE_VRSAVE instruction introduced by the
8211877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner// instruction selector.  Based on the vector registers that have been used,
8221877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner// transform this into the appropriate ORI instruction.
8236c087e5585b227f3c1d8278304c7cfbc7cd4f6e8Evan Chengstatic void HandleVRSaveUpdate(MachineInstr *MI, const TargetInstrInfo &TII) {
8246c087e5585b227f3c1d8278304c7cfbc7cd4f6e8Evan Cheng  MachineFunction *MF = MI->getParent()->getParent();
825536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen  DebugLoc dl = MI->getDebugLoc();
8266c087e5585b227f3c1d8278304c7cfbc7cd4f6e8Evan Cheng
8271877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner  unsigned UsedRegMask = 0;
828f7d2372b7407c7f8966df39a2b5a067c72bd6b9bChris Lattner  for (unsigned i = 0; i != 32; ++i)
82984bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner    if (MF->getRegInfo().isPhysRegUsed(VRRegNo[i]))
830f7d2372b7407c7f8966df39a2b5a067c72bd6b9bChris Lattner      UsedRegMask |= 1 << (31-i);
831f7d2372b7407c7f8966df39a2b5a067c72bd6b9bChris Lattner
832402504b1ba250839102ba384be0210d248b6e3e8Chris Lattner  // Live in and live out values already must be in the mask, so don't bother
833402504b1ba250839102ba384be0210d248b6e3e8Chris Lattner  // marking them.
83484bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner  for (MachineRegisterInfo::livein_iterator
83584bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner       I = MF->getRegInfo().livein_begin(),
83684bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner       E = MF->getRegInfo().livein_end(); I != E; ++I) {
837402504b1ba250839102ba384be0210d248b6e3e8Chris Lattner    unsigned RegNo = PPCRegisterInfo::getRegisterNumbering(I->first);
838402504b1ba250839102ba384be0210d248b6e3e8Chris Lattner    if (VRRegNo[RegNo] == I->first)        // If this really is a vector reg.
839402504b1ba250839102ba384be0210d248b6e3e8Chris Lattner      UsedRegMask &= ~(1 << (31-RegNo));   // Doesn't need to be marked.
840402504b1ba250839102ba384be0210d248b6e3e8Chris Lattner  }
84184bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner  for (MachineRegisterInfo::liveout_iterator
84284bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner       I = MF->getRegInfo().liveout_begin(),
84384bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner       E = MF->getRegInfo().liveout_end(); I != E; ++I) {
844402504b1ba250839102ba384be0210d248b6e3e8Chris Lattner    unsigned RegNo = PPCRegisterInfo::getRegisterNumbering(*I);
845402504b1ba250839102ba384be0210d248b6e3e8Chris Lattner    if (VRRegNo[RegNo] == *I)              // If this really is a vector reg.
846402504b1ba250839102ba384be0210d248b6e3e8Chris Lattner      UsedRegMask &= ~(1 << (31-RegNo));   // Doesn't need to be marked.
847402504b1ba250839102ba384be0210d248b6e3e8Chris Lattner  }
848402504b1ba250839102ba384be0210d248b6e3e8Chris Lattner
8491877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner  // If no registers are used, turn this into a copy.
8501877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner  if (UsedRegMask == 0) {
851f9568d8700d5389799796262cde313bb5c7d588aChris Lattner    // Remove all VRSAVE code.
852f9568d8700d5389799796262cde313bb5c7d588aChris Lattner    RemoveVRSaveCode(MI);
853f9568d8700d5389799796262cde313bb5c7d588aChris Lattner    return;
8547194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  }
8557194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
8567194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  unsigned SrcReg = MI->getOperand(1).getReg();
8577194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  unsigned DstReg = MI->getOperand(0).getReg();
8587194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
8597194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  if ((UsedRegMask & 0xFFFF) == UsedRegMask) {
8607194aaf738a1b89441635340403f1c5b06ae18efBill Wendling    if (DstReg != SrcReg)
861536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(*MI->getParent(), MI, dl, TII.get(PPC::ORI), DstReg)
8627194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(SrcReg)
8637194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addImm(UsedRegMask);
8647194aaf738a1b89441635340403f1c5b06ae18efBill Wendling    else
865536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(*MI->getParent(), MI, dl, TII.get(PPC::ORI), DstReg)
866587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling        .addReg(SrcReg, RegState::Kill)
8677194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addImm(UsedRegMask);
8681877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner  } else if ((UsedRegMask & 0xFFFF0000) == UsedRegMask) {
8697194aaf738a1b89441635340403f1c5b06ae18efBill Wendling    if (DstReg != SrcReg)
870536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(*MI->getParent(), MI, dl, TII.get(PPC::ORIS), DstReg)
8717194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(SrcReg)
8727194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addImm(UsedRegMask >> 16);
8737194aaf738a1b89441635340403f1c5b06ae18efBill Wendling    else
874536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(*MI->getParent(), MI, dl, TII.get(PPC::ORIS), DstReg)
875587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling        .addReg(SrcReg, RegState::Kill)
8767194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addImm(UsedRegMask >> 16);
8771877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner  } else {
8787194aaf738a1b89441635340403f1c5b06ae18efBill Wendling    if (DstReg != SrcReg)
879536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(*MI->getParent(), MI, dl, TII.get(PPC::ORIS), DstReg)
8807194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(SrcReg)
8817194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addImm(UsedRegMask >> 16);
8827194aaf738a1b89441635340403f1c5b06ae18efBill Wendling    else
883536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(*MI->getParent(), MI, dl, TII.get(PPC::ORIS), DstReg)
884587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling        .addReg(SrcReg, RegState::Kill)
8857194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addImm(UsedRegMask >> 16);
8867194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
887536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen    BuildMI(*MI->getParent(), MI, dl, TII.get(PPC::ORI), DstReg)
888587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling      .addReg(DstReg, RegState::Kill)
8897194aaf738a1b89441635340403f1c5b06ae18efBill Wendling      .addImm(UsedRegMask & 0xFFFF);
8901877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner  }
8911877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner
8921877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner  // Remove the old UPDATE_VRSAVE instruction.
893f9568d8700d5389799796262cde313bb5c7d588aChris Lattner  MI->eraseFromParent();
8941877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner}
8951877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner
8962f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey/// determineFrameLayout - Determine the size of the frame and maximum call
8972f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey/// frame size.
8982f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskeyvoid PPCRegisterInfo::determineFrameLayout(MachineFunction &MF) const {
8992f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  MachineFrameInfo *MFI = MF.getFrameInfo();
9002f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey
9012f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Get the number of bytes to allocate from the FrameInfo
9022f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  unsigned FrameSize = MFI->getStackSize();
9032f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey
9042f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Get the alignments provided by the target, and the maximum alignment
9052f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // (if any) of the fixed frame objects.
9062f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  unsigned MaxAlign = MFI->getMaxAlignment();
90799403b6964aead64c1039a8f4007437ef96dfd88Evan Cheng  unsigned TargetAlign = MF.getTarget().getFrameInfo()->getStackAlignment();
90899403b6964aead64c1039a8f4007437ef96dfd88Evan Cheng  unsigned AlignMask = TargetAlign - 1;  //
9092f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey
9102f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // If we are a leaf function, and use up to 224 bytes of stack space,
9112f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // don't have a frame pointer, calls, or dynamic alloca then we do not need
9122f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // to adjust the stack pointer (we fit in the Red Zone).
913d18e31ae17390d9c6f6cf93d18badf962452031dDevang Patel  bool DisableRedZone = MF.getFunction()->hasFnAttr(Attribute::NoRedZone);
914ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  // FIXME SVR4 The SVR4 ABI has no red zone.
9159e79091f1a2c8a4ef0d238dbddaea273d27ef404Dan Gohman  if (!DisableRedZone &&
9169e79091f1a2c8a4ef0d238dbddaea273d27ef404Dan Gohman      FrameSize <= 224 &&                          // Fits in red zone.
91782e4289fc7fed755442c215e9d3175c1badb831eDale Johannesen      !MFI->hasVarSizedObjects() &&                // No dynamic alloca.
91882e4289fc7fed755442c215e9d3175c1badb831eDale Johannesen      !MFI->hasCalls() &&                          // No calls.
91982e4289fc7fed755442c215e9d3175c1badb831eDale Johannesen      (!ALIGN_STACK || MaxAlign <= TargetAlign)) { // No special alignment.
9202f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey    // No need for frame
9212f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey    MFI->setStackSize(0);
9222f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey    return;
9232f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  }
9242f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey
9252f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Get the maximum call frame size of all the calls.
9262f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  unsigned maxCallFrameSize = MFI->getMaxCallFrameSize();
9272f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey
9282f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Maximum call frame needs to be at least big enough for linkage and 8 args.
9292f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  unsigned minCallFrameSize =
9309f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    PPCFrameInfo::getMinCallFrameSize(Subtarget.isPPC64(),
9312a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller                                      Subtarget.isDarwinABI());
9322f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  maxCallFrameSize = std::max(maxCallFrameSize, minCallFrameSize);
9332f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey
9342f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // If we have dynamic alloca then maxCallFrameSize needs to be aligned so
9352f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // that allocations will be aligned.
9362f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  if (MFI->hasVarSizedObjects())
9372f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey    maxCallFrameSize = (maxCallFrameSize + AlignMask) & ~AlignMask;
9382f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey
9392f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Update maximum call frame size.
9402f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  MFI->setMaxCallFrameSize(maxCallFrameSize);
9412f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey
9422f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Include call frame size in total.
9432f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  FrameSize += maxCallFrameSize;
9449f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner
9452f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Make sure the frame is aligned.
9462f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  FrameSize = (FrameSize + AlignMask) & ~AlignMask;
9472f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey
9482f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Update frame info.
9492f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  MFI->setStackSize(FrameSize);
9502f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey}
951f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
9527194aaf738a1b89441635340403f1c5b06ae18efBill Wendlingvoid
9537194aaf738a1b89441635340403f1c5b06ae18efBill WendlingPPCRegisterInfo::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
9547194aaf738a1b89441635340403f1c5b06ae18efBill Wendling                                                      RegScavenger *RS) const {
955d313a9b1484c52e3f784de5064ce86bdbd9b26dcJim Laskey  //  Save and clear the LR state.
956d313a9b1484c52e3f784de5064ce86bdbd9b26dcJim Laskey  PPCFunctionInfo *FI = MF.getInfo<PPCFunctionInfo>();
957d313a9b1484c52e3f784de5064ce86bdbd9b26dcJim Laskey  unsigned LR = getRARegister();
958c12e5812be4dacc30781db84b045775c46580240Dale Johannesen  FI->setMustSaveLR(MustSaveLR(MF, LR));
95984bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner  MF.getRegInfo().setPhysRegUnused(LR);
96082d4264c1fe71480bcaa63235e385a01e38dbe8cNicolas Geoffray
96182d4264c1fe71480bcaa63235e385a01e38dbe8cNicolas Geoffray  //  Save R31 if necessary
96282d4264c1fe71480bcaa63235e385a01e38dbe8cNicolas Geoffray  int FPSI = FI->getFramePointerSaveIndex();
96382d4264c1fe71480bcaa63235e385a01e38dbe8cNicolas Geoffray  bool IsPPC64 = Subtarget.isPPC64();
9642a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller  bool IsSVR4ABI = Subtarget.isSVR4ABI();
9652a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller  bool isDarwinABI  = Subtarget.isDarwinABI();
9667194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  MachineFrameInfo *MFI = MF.getFrameInfo();
96782d4264c1fe71480bcaa63235e385a01e38dbe8cNicolas Geoffray
96882d4264c1fe71480bcaa63235e385a01e38dbe8cNicolas Geoffray  // If the frame pointer save index hasn't been defined yet.
9692a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller  if (!FPSI && needsFP(MF) && IsSVR4ABI) {
97082d4264c1fe71480bcaa63235e385a01e38dbe8cNicolas Geoffray    // Find out what the fix offset of the frame pointer save area.
971ec58d9f9ddfbfe16ea40822164f340b256c89191Nicolas Geoffray    int FPOffset = PPCFrameInfo::getFramePointerSaveOffset(IsPPC64,
9722a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller                                                           isDarwinABI);
97382d4264c1fe71480bcaa63235e385a01e38dbe8cNicolas Geoffray    // Allocate the frame index for frame pointer save area.
97482d4264c1fe71480bcaa63235e385a01e38dbe8cNicolas Geoffray    FPSI = MF.getFrameInfo()->CreateFixedObject(IsPPC64? 8 : 4, FPOffset);
97582d4264c1fe71480bcaa63235e385a01e38dbe8cNicolas Geoffray    // Save the result.
97682d4264c1fe71480bcaa63235e385a01e38dbe8cNicolas Geoffray    FI->setFramePointerSaveIndex(FPSI);
97782d4264c1fe71480bcaa63235e385a01e38dbe8cNicolas Geoffray  }
97882d4264c1fe71480bcaa63235e385a01e38dbe8cNicolas Geoffray
97930e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer  // Reserve stack space to move the linkage area to in case of a tail call.
98030e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer  int TCSPDelta = 0;
981ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  if (PerformTailCallOpt && (TCSPDelta = FI->getTailCallSPDelta()) < 0) {
982ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    MF.getFrameInfo()->CreateFixedObject(-1 * TCSPDelta, TCSPDelta);
98330e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer  }
984ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
9857194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  // Reserve a slot closest to SP or frame pointer if we have a dynalloc or
9867194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  // a large stack, which will require scavenging a register to materialize a
9877194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  // large offset.
9887194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  // FIXME: this doesn't actually check stack size, so is a bit pessimistic
9897194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  // FIXME: doesn't detect whether or not we need to spill vXX, which requires
9907194aaf738a1b89441635340403f1c5b06ae18efBill Wendling  //        r0 for now.
9917194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
9924a66e9a57e679b4f3243bf2061daf53c70102030Bill Wendling  if (EnableRegisterScavenging) // FIXME (64-bit): Enable.
993880d0f6018b6928bdcad291be60c801238619955Bill Wendling    if (needsFP(MF) || spillsCR(MF)) {
994880d0f6018b6928bdcad291be60c801238619955Bill Wendling      const TargetRegisterClass *GPRC = &PPC::GPRCRegClass;
995880d0f6018b6928bdcad291be60c801238619955Bill Wendling      const TargetRegisterClass *G8RC = &PPC::G8RCRegClass;
996880d0f6018b6928bdcad291be60c801238619955Bill Wendling      const TargetRegisterClass *RC = IsPPC64 ? G8RC : GPRC;
997880d0f6018b6928bdcad291be60c801238619955Bill Wendling      RS->setScavengingFrameIndex(MFI->CreateStackObject(RC->getSize(),
99871a2cb25ebc818383dd0f80475bc166f834e8d99Chris Lattner                                                         RC->getAlignment()));
999880d0f6018b6928bdcad291be60c801238619955Bill Wendling    }
1000d313a9b1484c52e3f784de5064ce86bdbd9b26dcJim Laskey}
1001d313a9b1484c52e3f784de5064ce86bdbd9b26dcJim Laskey
10027194aaf738a1b89441635340403f1c5b06ae18efBill Wendlingvoid
1003ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann SchellerPPCRegisterInfo::processFunctionBeforeFrameFinalized(MachineFunction &MF)
1004ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller                                                     const {
1005ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  // Early exit if not using the SVR4 ABI.
10062a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller  if (!Subtarget.isSVR4ABI()) {
1007ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    return;
1008ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  }
1009ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1010ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  // Get callee saved register information.
1011ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  MachineFrameInfo *FFI = MF.getFrameInfo();
1012ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  const std::vector<CalleeSavedInfo> &CSI = FFI->getCalleeSavedInfo();
1013ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1014ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  // Early exit if no callee saved registers are modified!
1015ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  if (CSI.empty() && !needsFP(MF)) {
1016ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    return;
1017ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  }
1018ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1019ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  unsigned MinGPR = PPC::R31;
1020ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  unsigned MinFPR = PPC::F31;
1021ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  unsigned MinVR = PPC::V31;
1022ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1023ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  bool HasGPSaveArea = false;
1024ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  bool HasFPSaveArea = false;
1025ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  bool HasCRSaveArea = false;
1026ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  bool HasVRSAVESaveArea = false;
1027ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  bool HasVRSaveArea = false;
1028ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1029ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  SmallVector<CalleeSavedInfo, 18> GPRegs;
1030ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  SmallVector<CalleeSavedInfo, 18> FPRegs;
1031ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  SmallVector<CalleeSavedInfo, 18> VRegs;
1032ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1033ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  for (unsigned i = 0, e = CSI.size(); i != e; ++i) {
1034ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    unsigned Reg = CSI[i].getReg();
1035ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    const TargetRegisterClass *RC = CSI[i].getRegClass();
1036ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1037ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    if (RC == PPC::GPRCRegisterClass) {
1038ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      HasGPSaveArea = true;
1039ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1040ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      GPRegs.push_back(CSI[i]);
1041ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1042ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      if (Reg < MinGPR) {
1043ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller        MinGPR = Reg;
1044ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      }
1045ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    } else if (RC == PPC::F8RCRegisterClass) {
1046ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      HasFPSaveArea = true;
1047ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1048ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      FPRegs.push_back(CSI[i]);
1049ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1050ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      if (Reg < MinFPR) {
1051ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller        MinFPR = Reg;
1052ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      }
10536a3a1ba97e996bfdc061f9a51bd4cf4915962913Tilmann Scheller// FIXME SVR4: Disable CR save area for now.
10546a3a1ba97e996bfdc061f9a51bd4cf4915962913Tilmann Scheller    } else if (   RC == PPC::CRBITRCRegisterClass
1055ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller               || RC == PPC::CRRCRegisterClass) {
10566a3a1ba97e996bfdc061f9a51bd4cf4915962913Tilmann Scheller//      HasCRSaveArea = true;
1057ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    } else if (RC == PPC::VRSAVERCRegisterClass) {
1058ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      HasVRSAVESaveArea = true;
1059ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    } else if (RC == PPC::VRRCRegisterClass) {
1060ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      HasVRSaveArea = true;
1061ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1062ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      VRegs.push_back(CSI[i]);
1063ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1064ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      if (Reg < MinVR) {
1065ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller        MinVR = Reg;
1066ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      }
1067ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    } else {
1068ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      assert(0 && "Unknown RegisterClass!");
1069ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    }
1070ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  }
1071ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1072ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  PPCFunctionInfo *PFI = MF.getInfo<PPCFunctionInfo>();
1073ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1074ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  int64_t LowerBound = 0;
1075ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1076ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  // Take into account stack space reserved for tail calls.
1077ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  int TCSPDelta = 0;
1078ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  if (PerformTailCallOpt && (TCSPDelta = PFI->getTailCallSPDelta()) < 0) {
1079ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    LowerBound = TCSPDelta;
1080ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  }
1081ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1082ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  // The Floating-point register save area is right below the back chain word
1083ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  // of the previous stack frame.
1084ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  if (HasFPSaveArea) {
1085ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    for (unsigned i = 0, e = FPRegs.size(); i != e; ++i) {
1086ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      int FI = FPRegs[i].getFrameIdx();
1087ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1088ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      FFI->setObjectOffset(FI, LowerBound + FFI->getObjectOffset(FI));
1089ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    }
1090ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1091ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    LowerBound -= (31 - getRegisterNumbering(MinFPR) + 1) * 8;
1092ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  }
1093ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1094ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  // Check whether the frame pointer register is allocated. If so, make sure it
1095ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  // is spilled to the correct offset.
1096ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  if (needsFP(MF)) {
1097ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    HasGPSaveArea = true;
1098ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1099ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    int FI = PFI->getFramePointerSaveIndex();
1100ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    assert(FI && "No Frame Pointer Save Slot!");
1101ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1102ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    FFI->setObjectOffset(FI, LowerBound + FFI->getObjectOffset(FI));
1103ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  }
1104ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1105ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  // General register save area starts right below the Floating-point
1106ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  // register save area.
1107ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  if (HasGPSaveArea) {
1108ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    // Move general register save area spill slots down, taking into account
1109ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    // the size of the Floating-point register save area.
1110ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    for (unsigned i = 0, e = GPRegs.size(); i != e; ++i) {
1111ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      int FI = GPRegs[i].getFrameIdx();
1112ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1113ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      FFI->setObjectOffset(FI, LowerBound + FFI->getObjectOffset(FI));
1114ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    }
1115ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1116ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    LowerBound -= (31 - getRegisterNumbering(MinGPR) + 1) * 4;
1117ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  }
1118ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1119ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  // The CR save area is below the general register save area.
1120ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  if (HasCRSaveArea) {
1121ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    // FIXME SVR4: Is it actually possible to have multiple elements in CSI
1122ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    //             which have the CR/CRBIT register class?
1123ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    // Adjust the frame index of the CR spill slot.
1124ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    for (unsigned i = 0, e = CSI.size(); i != e; ++i) {
1125ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      const TargetRegisterClass *RC = CSI[i].getRegClass();
1126ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1127ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      if (RC == PPC::CRBITRCRegisterClass || RC == PPC::CRRCRegisterClass) {
1128ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller        int FI = CSI[i].getFrameIdx();
1129ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1130ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller        FFI->setObjectOffset(FI, LowerBound + FFI->getObjectOffset(FI));
1131ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      }
1132ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    }
1133ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1134ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    LowerBound -= 4; // The CR save area is always 4 bytes long.
1135ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  }
1136ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1137ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  if (HasVRSAVESaveArea) {
1138ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    // FIXME SVR4: Is it actually possible to have multiple elements in CSI
1139ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    //             which have the VRSAVE register class?
1140ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    // Adjust the frame index of the VRSAVE spill slot.
1141ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    for (unsigned i = 0, e = CSI.size(); i != e; ++i) {
1142ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      const TargetRegisterClass *RC = CSI[i].getRegClass();
1143ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1144ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      if (RC == PPC::VRSAVERCRegisterClass) {
1145ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller        int FI = CSI[i].getFrameIdx();
1146ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1147ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller        FFI->setObjectOffset(FI, LowerBound + FFI->getObjectOffset(FI));
1148ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      }
1149ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    }
1150ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1151ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    LowerBound -= 4; // The VRSAVE save area is always 4 bytes long.
1152ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  }
1153ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1154ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  if (HasVRSaveArea) {
1155ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    // Insert alignment padding, we need 16-byte alignment.
1156ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    LowerBound = (LowerBound - 15) & ~(15);
1157ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1158ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    for (unsigned i = 0, e = VRegs.size(); i != e; ++i) {
1159ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      int FI = VRegs[i].getFrameIdx();
1160ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1161ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      FFI->setObjectOffset(FI, LowerBound + FFI->getObjectOffset(FI));
1162ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    }
1163ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  }
1164ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller}
1165ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1166ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Schellervoid
11677194aaf738a1b89441635340403f1c5b06ae18efBill WendlingPPCRegisterInfo::emitPrologue(MachineFunction &MF) const {
1168f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  MachineBasicBlock &MBB = MF.front();   // Prolog goes in entry BB
1169f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  MachineBasicBlock::iterator MBBI = MBB.begin();
1170f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  MachineFrameInfo *MFI = MF.getFrameInfo();
117144c3b9fdd416c79f4b67cde1aecfced5921efd81Jim Laskey  MachineModuleInfo *MMI = MFI->getMachineModuleInfo();
1172536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen  DebugLoc dl = DebugLoc::getUnknownLoc();
1173e00406281d94ebb9c69b7803311936f07994da43Dale Johannesen  bool needsFrameMoves = (MMI && MMI->hasDebugInfo()) ||
11744e1b79459fcf72216cdc42a59953e172c60e15caDale Johannesen       !MF.getFunction()->doesNotThrow() ||
11753541af73b6b8a083cf2d7784438d60e8bcce3883Dale Johannesen       UnwindTablesMandatory;
11764f91a4c497fb1032550b7f163004efc5fce1d7f1Chris Lattner
1177072200c36dd96b94e772029fd72edf9fa120c467Jim Laskey  // Prepare for frame info.
11785e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey  unsigned FrameLabelId = 0;
11797194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
11804f91a4c497fb1032550b7f163004efc5fce1d7f1Chris Lattner  // Scan the prolog, looking for an UPDATE_VRSAVE instruction.  If we find it,
11814f91a4c497fb1032550b7f163004efc5fce1d7f1Chris Lattner  // process it.
11828aa777d5ea8e73e2edf79fd35fd6b5c4e9949ca7Chris Lattner  for (unsigned i = 0; MBBI != MBB.end(); ++i, ++MBBI) {
11831877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner    if (MBBI->getOpcode() == PPC::UPDATE_VRSAVE) {
11846c087e5585b227f3c1d8278304c7cfbc7cd4f6e8Evan Cheng      HandleVRSaveUpdate(MBBI, TII);
11851877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner      break;
11861877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner    }
11871877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner  }
11881877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner
11891877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner  // Move MBBI back to the beginning of the function.
11901877ec9b02511e111998596b9ba9c3a2275d6a92Chris Lattner  MBBI = MBB.begin();
11917194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
11922f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Work out frame sizes.
11932f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  determineFrameLayout(MF);
11942f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  unsigned FrameSize = MFI->getStackSize();
1195ae232e7a1055033436370c0b3aecf054fa44d5e7Nate Begeman
11962f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  int NegFrameSize = -FrameSize;
119751fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey
119851fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey  // Get processor type.
119951fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey  bool IsPPC64 = Subtarget.isPPC64();
12009f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner  // Get operating system
12012a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller  bool isDarwinABI = Subtarget.isDarwinABI();
1202c12e5812be4dacc30781db84b045775c46580240Dale Johannesen  // Check if the link register (LR) must be saved.
1203c12e5812be4dacc30781db84b045775c46580240Dale Johannesen  PPCFunctionInfo *FI = MF.getInfo<PPCFunctionInfo>();
1204c12e5812be4dacc30781db84b045775c46580240Dale Johannesen  bool MustSaveLR = FI->mustSaveLR();
12052f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Do we have a frame pointer for this function?
1206d313a9b1484c52e3f784de5064ce86bdbd9b26dcJim Laskey  bool HasFP = hasFP(MF) && FrameSize;
120751fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey
12082a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller  int LROffset = PPCFrameInfo::getReturnSaveOffset(IsPPC64, isDarwinABI);
1209ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1210ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  int FPOffset = 0;
1211ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  if (HasFP) {
12122a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller    if (Subtarget.isSVR4ABI()) {
1213ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      MachineFrameInfo *FFI = MF.getFrameInfo();
1214ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      int FPIndex = FI->getFramePointerSaveIndex();
1215ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      assert(FPIndex && "No Frame Pointer Save Slot!");
1216ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      FPOffset = FFI->getObjectOffset(FPIndex);
1217ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    } else {
12182a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller      FPOffset = PPCFrameInfo::getFramePointerSaveOffset(IsPPC64, isDarwinABI);
1219ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    }
1220ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  }
12217194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
122251fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey  if (IsPPC64) {
1223c12e5812be4dacc30781db84b045775c46580240Dale Johannesen    if (MustSaveLR)
1224536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, MBBI, dl, TII.get(PPC::MFLR8), PPC::X0);
122551fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey
122651fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey    if (HasFP)
1227536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, MBBI, dl, TII.get(PPC::STD))
12287194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(PPC::X31)
12297194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addImm(FPOffset/4)
12307194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(PPC::X1);
123151fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey
1232c12e5812be4dacc30781db84b045775c46580240Dale Johannesen    if (MustSaveLR)
1233536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, MBBI, dl, TII.get(PPC::STD))
12347194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(PPC::X0)
12357194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addImm(LROffset / 4)
12367194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(PPC::X1);
123751fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey  } else {
1238c12e5812be4dacc30781db84b045775c46580240Dale Johannesen    if (MustSaveLR)
1239536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, MBBI, dl, TII.get(PPC::MFLR), PPC::R0);
124051fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey
124151fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey    if (HasFP)
1242536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, MBBI, dl, TII.get(PPC::STW))
12437194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(PPC::R31)
12447194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addImm(FPOffset)
12457194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(PPC::R1);
1246f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
1247c12e5812be4dacc30781db84b045775c46580240Dale Johannesen    if (MustSaveLR)
1248536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, MBBI, dl, TII.get(PPC::STW))
12497194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(PPC::R0)
12507194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addImm(LROffset)
12517194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(PPC::R1);
125254eed36da595f09c46a46b2b0b15757ea486b4c1Nate Begeman  }
12532f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey
1254d313a9b1484c52e3f784de5064ce86bdbd9b26dcJim Laskey  // Skip if a leaf routine.
1255d313a9b1484c52e3f784de5064ce86bdbd9b26dcJim Laskey  if (!FrameSize) return;
1256d313a9b1484c52e3f784de5064ce86bdbd9b26dcJim Laskey
12572f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Get stack alignments.
12582f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  unsigned TargetAlign = MF.getTarget().getFrameInfo()->getStackAlignment();
12592f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  unsigned MaxAlign = MFI->getMaxAlignment();
1260f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
1261e00406281d94ebb9c69b7803311936f07994da43Dale Johannesen  if (needsFrameMoves) {
12625e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey    // Mark effective beginning of when frame pointer becomes valid.
126344c3b9fdd416c79f4b67cde1aecfced5921efd81Jim Laskey    FrameLabelId = MMI->NextLabelID();
1264536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen    BuildMI(MBB, MBBI, dl, TII.get(PPC::DBG_LABEL)).addImm(FrameLabelId);
12655e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey  }
12665e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey
12672f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // Adjust stack pointer: r1 += NegFrameSize.
1268030514cd96e9b8bb08fd9585d890bd7a5f0dbb77Nate Begeman  // If there is a preferred stack alignment, align R1 now
126951fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey  if (!IsPPC64) {
1270a94a203f346e65d40c4c3fe478c5d8d7a2ff5df6Chris Lattner    // PPC32.
127182e4289fc7fed755442c215e9d3175c1badb831eDale Johannesen    if (ALIGN_STACK && MaxAlign > TargetAlign) {
12722f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey      assert(isPowerOf2_32(MaxAlign)&&isInt16(MaxAlign)&&"Invalid alignment!");
12732f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey      assert(isInt16(NegFrameSize) && "Unhandled stack size and alignment!");
12747194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
1275536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, MBBI, dl, TII.get(PPC::RLWINM), PPC::R0)
12767194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(PPC::R1)
12777194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addImm(0)
12787194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addImm(32 - Log2_32(MaxAlign))
12797194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addImm(31);
1280536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, MBBI, dl, TII.get(PPC::SUBFIC) ,PPC::R0)
1281587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling        .addReg(PPC::R0, RegState::Kill)
12822f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey        .addImm(NegFrameSize);
1283536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, MBBI, dl, TII.get(PPC::STWUX))
12847194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(PPC::R1)
12857194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(PPC::R1)
12867194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(PPC::R0);
12872f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey    } else if (isInt16(NegFrameSize)) {
1288536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, MBBI, dl, TII.get(PPC::STWU), PPC::R1)
12897194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(PPC::R1)
12907194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addImm(NegFrameSize)
12917194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(PPC::R1);
1292a94a203f346e65d40c4c3fe478c5d8d7a2ff5df6Chris Lattner    } else {
1293536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, MBBI, dl, TII.get(PPC::LIS), PPC::R0)
12947194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addImm(NegFrameSize >> 16);
1295536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, MBBI, dl, TII.get(PPC::ORI), PPC::R0)
1296587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling        .addReg(PPC::R0, RegState::Kill)
12972f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey        .addImm(NegFrameSize & 0xFFFF);
1298536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, MBBI, dl, TII.get(PPC::STWUX))
12997194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(PPC::R1)
13007194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(PPC::R1)
1301a94a203f346e65d40c4c3fe478c5d8d7a2ff5df6Chris Lattner        .addReg(PPC::R0);
1302a94a203f346e65d40c4c3fe478c5d8d7a2ff5df6Chris Lattner    }
1303a94a203f346e65d40c4c3fe478c5d8d7a2ff5df6Chris Lattner  } else {    // PPC64.
130482e4289fc7fed755442c215e9d3175c1badb831eDale Johannesen    if (ALIGN_STACK && MaxAlign > TargetAlign) {
13052f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey      assert(isPowerOf2_32(MaxAlign)&&isInt16(MaxAlign)&&"Invalid alignment!");
13062f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey      assert(isInt16(NegFrameSize) && "Unhandled stack size and alignment!");
13077194aaf738a1b89441635340403f1c5b06ae18efBill Wendling
1308536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, MBBI, dl, TII.get(PPC::RLDICL), PPC::X0)
13097194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(PPC::X1)
13107194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addImm(0)
13117194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addImm(64 - Log2_32(MaxAlign));
1312536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, MBBI, dl, TII.get(PPC::SUBFIC8), PPC::X0)
13137194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(PPC::X0)
13142f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey        .addImm(NegFrameSize);
1315536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, MBBI, dl, TII.get(PPC::STDUX))
13167194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(PPC::X1)
13177194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(PPC::X1)
13187194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(PPC::X0);
13192ff5cdb16cea04f562402c2a33732840857a66e2Jim Laskey    } else if (isInt16(NegFrameSize)) {
1320536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, MBBI, dl, TII.get(PPC::STDU), PPC::X1)
13217194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(PPC::X1)
13227194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addImm(NegFrameSize / 4)
13237194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(PPC::X1);
1324a94a203f346e65d40c4c3fe478c5d8d7a2ff5df6Chris Lattner    } else {
1325536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, MBBI, dl, TII.get(PPC::LIS8), PPC::X0)
13267194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addImm(NegFrameSize >> 16);
1327536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, MBBI, dl, TII.get(PPC::ORI8), PPC::X0)
1328587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling        .addReg(PPC::X0, RegState::Kill)
13292f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey        .addImm(NegFrameSize & 0xFFFF);
1330536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, MBBI, dl, TII.get(PPC::STDUX))
13317194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(PPC::X1)
13327194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(PPC::X1)
1333a94a203f346e65d40c4c3fe478c5d8d7a2ff5df6Chris Lattner        .addReg(PPC::X0);
1334a94a203f346e65d40c4c3fe478c5d8d7a2ff5df6Chris Lattner    }
1335f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  }
1336ae232e7a1055033436370c0b3aecf054fa44d5e7Nate Begeman
1337e00406281d94ebb9c69b7803311936f07994da43Dale Johannesen  if (needsFrameMoves) {
133844c3b9fdd416c79f4b67cde1aecfced5921efd81Jim Laskey    std::vector<MachineMove> &Moves = MMI->getFrameMoves();
13394188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey
13405e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey    if (NegFrameSize) {
13415e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey      // Show update of SP.
13425e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey      MachineLocation SPDst(MachineLocation::VirtualFP);
13435e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey      MachineLocation SPSrc(MachineLocation::VirtualFP, NegFrameSize);
13445e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey      Moves.push_back(MachineMove(FrameLabelId, SPDst, SPSrc));
13455e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey    } else {
13465e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey      MachineLocation SP(IsPPC64 ? PPC::X31 : PPC::R31);
13475e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey      Moves.push_back(MachineMove(FrameLabelId, SP, SP));
13485e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey    }
13494c2c9031acd1314440cdd0952182fa39b4efe90dJim Laskey
13505e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey    if (HasFP) {
13515e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey      MachineLocation FPDst(MachineLocation::VirtualFP, FPOffset);
13525e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey      MachineLocation FPSrc(IsPPC64 ? PPC::X31 : PPC::R31);
13535e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey      Moves.push_back(MachineMove(FrameLabelId, FPDst, FPSrc));
13545e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey    }
1355ce50a165c784d71abf1b2f981be18f867787d972Jim Laskey
1356ce50a165c784d71abf1b2f981be18f867787d972Jim Laskey    // Add callee saved registers to move list.
1357ce50a165c784d71abf1b2f981be18f867787d972Jim Laskey    const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
1358ce50a165c784d71abf1b2f981be18f867787d972Jim Laskey    for (unsigned I = 0, E = CSI.size(); I != E; ++I) {
13595e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey      int Offset = MFI->getObjectOffset(CSI[I].getFrameIdx());
13605e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey      unsigned Reg = CSI[I].getReg();
1361b384ab9ea113ad22a9c7034b98060c7470f0dcc5Dale Johannesen      if (Reg == PPC::LR || Reg == PPC::LR8 || Reg == PPC::RM) continue;
13625e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey      MachineLocation CSDst(MachineLocation::VirtualFP, Offset);
13635e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey      MachineLocation CSSrc(Reg);
13645e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey      Moves.push_back(MachineMove(FrameLabelId, CSDst, CSSrc));
1365ce50a165c784d71abf1b2f981be18f867787d972Jim Laskey    }
13665e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey
1367b82313fdc21e8190768addf0f16710b94f0e1441Jim Laskey    MachineLocation LRDst(MachineLocation::VirtualFP, LROffset);
1368b82313fdc21e8190768addf0f16710b94f0e1441Jim Laskey    MachineLocation LRSrc(IsPPC64 ? PPC::LR8 : PPC::LR);
1369b82313fdc21e8190768addf0f16710b94f0e1441Jim Laskey    Moves.push_back(MachineMove(FrameLabelId, LRDst, LRSrc));
1370b82313fdc21e8190768addf0f16710b94f0e1441Jim Laskey
13715e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey    // Mark effective beginning of when frame pointer is ready.
137244c3b9fdd416c79f4b67cde1aecfced5921efd81Jim Laskey    unsigned ReadyLabelId = MMI->NextLabelID();
1373536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen    BuildMI(MBB, MBBI, dl, TII.get(PPC::DBG_LABEL)).addImm(ReadyLabelId);
13745e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey
13755e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey    MachineLocation FPDst(HasFP ? (IsPPC64 ? PPC::X31 : PPC::R31) :
13765e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey                                  (IsPPC64 ? PPC::X1 : PPC::R1));
13775e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey    MachineLocation FPSrc(MachineLocation::VirtualFP);
13785e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey    Moves.push_back(MachineMove(ReadyLabelId, FPDst, FPSrc));
13794188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  }
13802f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey
13812f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  // If there is a frame pointer, copy R1 into R31
13824f91a4c497fb1032550b7f163004efc5fce1d7f1Chris Lattner  if (HasFP) {
138351fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey    if (!IsPPC64) {
1384536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, MBBI, dl, TII.get(PPC::OR), PPC::R31)
13857194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(PPC::R1)
1386c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng        .addReg(PPC::R1);
1387a94a203f346e65d40c4c3fe478c5d8d7a2ff5df6Chris Lattner    } else {
1388536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, MBBI, dl, TII.get(PPC::OR8), PPC::X31)
13897194aaf738a1b89441635340403f1c5b06ae18efBill Wendling        .addReg(PPC::X1)
1390c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng        .addReg(PPC::X1);
1391a94a203f346e65d40c4c3fe478c5d8d7a2ff5df6Chris Lattner    }
1392f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  }
1393f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman}
1394f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
139521e463b2bf864671a87ebe386cb100ef9349a540Nate Begemanvoid PPCRegisterInfo::emitEpilogue(MachineFunction &MF,
139621e463b2bf864671a87ebe386cb100ef9349a540Nate Begeman                                   MachineBasicBlock &MBB) const {
1397f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  MachineBasicBlock::iterator MBBI = prior(MBB.end());
139830e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer  unsigned RetOpcode = MBBI->getOpcode();
1399536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen  DebugLoc dl = DebugLoc::getUnknownLoc();
140030e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer
140130e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer  assert( (RetOpcode == PPC::BLR ||
140230e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer           RetOpcode == PPC::TCRETURNri ||
140330e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer           RetOpcode == PPC::TCRETURNdi ||
140430e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer           RetOpcode == PPC::TCRETURNai ||
140530e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer           RetOpcode == PPC::TCRETURNri8 ||
140630e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer           RetOpcode == PPC::TCRETURNdi8 ||
140730e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer           RetOpcode == PPC::TCRETURNai8) &&
1408f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman         "Can only insert epilog into returning blocks");
1409b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman
1410030514cd96e9b8bb08fd9585d890bd7a5f0dbb77Nate Begeman  // Get alignment info so we know how to restore r1
1411030514cd96e9b8bb08fd9585d890bd7a5f0dbb77Nate Begeman  const MachineFrameInfo *MFI = MF.getFrameInfo();
1412030514cd96e9b8bb08fd9585d890bd7a5f0dbb77Nate Begeman  unsigned TargetAlign = MF.getTarget().getFrameInfo()->getStackAlignment();
14132f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  unsigned MaxAlign = MFI->getMaxAlignment();
1414030514cd96e9b8bb08fd9585d890bd7a5f0dbb77Nate Begeman
141564da172b1435d132ce867dcd5c652577664b55a3Chris Lattner  // Get the number of bytes allocated from the FrameInfo.
141630e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer  int FrameSize = MFI->getStackSize();
1417f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
141851fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey  // Get processor type.
141951fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey  bool IsPPC64 = Subtarget.isPPC64();
14209f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner  // Get operating system
14212a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller  bool isDarwinABI = Subtarget.isDarwinABI();
1422c12e5812be4dacc30781db84b045775c46580240Dale Johannesen  // Check if the link register (LR) has been saved.
1423c12e5812be4dacc30781db84b045775c46580240Dale Johannesen  PPCFunctionInfo *FI = MF.getInfo<PPCFunctionInfo>();
1424c12e5812be4dacc30781db84b045775c46580240Dale Johannesen  bool MustSaveLR = FI->mustSaveLR();
142551fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey  // Do we have a frame pointer for this function?
1426d313a9b1484c52e3f784de5064ce86bdbd9b26dcJim Laskey  bool HasFP = hasFP(MF) && FrameSize;
14279f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner
14282a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller  int LROffset = PPCFrameInfo::getReturnSaveOffset(IsPPC64, isDarwinABI);
1429ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
1430ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  int FPOffset = 0;
1431ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  if (HasFP) {
14322a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller    if (Subtarget.isSVR4ABI()) {
1433ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      MachineFrameInfo *FFI = MF.getFrameInfo();
1434ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      int FPIndex = FI->getFramePointerSaveIndex();
1435ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      assert(FPIndex && "No Frame Pointer Save Slot!");
1436ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      FPOffset = FFI->getObjectOffset(FPIndex);
1437ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    } else {
14382a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller      FPOffset = PPCFrameInfo::getFramePointerSaveOffset(IsPPC64, isDarwinABI);
1439ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    }
1440ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  }
14419f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner
144230e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer  bool UsesTCRet =  RetOpcode == PPC::TCRETURNri ||
144330e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer    RetOpcode == PPC::TCRETURNdi ||
144430e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer    RetOpcode == PPC::TCRETURNai ||
144530e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer    RetOpcode == PPC::TCRETURNri8 ||
144630e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer    RetOpcode == PPC::TCRETURNdi8 ||
144730e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer    RetOpcode == PPC::TCRETURNai8;
144830e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer
144930e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer  if (UsesTCRet) {
145030e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer    int MaxTCRetDelta = FI->getTailCallSPDelta();
145130e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer    MachineOperand &StackAdjust = MBBI->getOperand(1);
1452d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman    assert(StackAdjust.isImm() && "Expecting immediate value.");
145330e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer    // Adjust stack pointer.
145430e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer    int StackAdj = StackAdjust.getImm();
145530e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer    int Delta = StackAdj - MaxTCRetDelta;
145630e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer    assert((Delta >= 0) && "Delta must be positive");
145730e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer    if (MaxTCRetDelta>0)
145830e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      FrameSize += (StackAdj +Delta);
145930e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer    else
146030e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      FrameSize += StackAdj;
146130e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer  }
146230e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer
1463d313a9b1484c52e3f784de5064ce86bdbd9b26dcJim Laskey  if (FrameSize) {
1464d313a9b1484c52e3f784de5064ce86bdbd9b26dcJim Laskey    // The loaded (or persistent) stack pointer value is offset by the 'stwu'
1465d313a9b1484c52e3f784de5064ce86bdbd9b26dcJim Laskey    // on entry to the function.  Add this offset back now.
146630e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer    if (!IsPPC64) {
146730e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      // If this function contained a fastcc call and PerformTailCallOpt is
146830e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      // enabled (=> hasFastCall()==true) the fastcc call might contain a tail
146930e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      // call which invalidates the stack pointer value in SP(0). So we use the
147030e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      // value of R31 in this case.
147130e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      if (FI->hasFastCall() && isInt16(FrameSize)) {
147230e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer        assert(hasFP(MF) && "Expecting a valid the frame pointer.");
1473536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen        BuildMI(MBB, MBBI, dl, TII.get(PPC::ADDI), PPC::R1)
147430e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer          .addReg(PPC::R31).addImm(FrameSize);
147530e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      } else if(FI->hasFastCall()) {
1476536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen        BuildMI(MBB, MBBI, dl, TII.get(PPC::LIS), PPC::R0)
147730e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer          .addImm(FrameSize >> 16);
1478536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen        BuildMI(MBB, MBBI, dl, TII.get(PPC::ORI), PPC::R0)
1479587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling          .addReg(PPC::R0, RegState::Kill)
148030e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer          .addImm(FrameSize & 0xFFFF);
1481536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen        BuildMI(MBB, MBBI, dl, TII.get(PPC::ADD4))
148230e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer          .addReg(PPC::R1)
148330e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer          .addReg(PPC::R31)
148430e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer          .addReg(PPC::R0);
148530e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      } else if (isInt16(FrameSize) &&
148630e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer                 (!ALIGN_STACK || TargetAlign >= MaxAlign) &&
148730e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer                 !MFI->hasVarSizedObjects()) {
1488536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen        BuildMI(MBB, MBBI, dl, TII.get(PPC::ADDI), PPC::R1)
148930e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer          .addReg(PPC::R1).addImm(FrameSize);
1490d313a9b1484c52e3f784de5064ce86bdbd9b26dcJim Laskey      } else {
1491536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen        BuildMI(MBB, MBBI, dl, TII.get(PPC::LWZ),PPC::R1)
1492536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen          .addImm(0).addReg(PPC::R1);
1493d313a9b1484c52e3f784de5064ce86bdbd9b26dcJim Laskey      }
149451fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey    } else {
149530e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      if (FI->hasFastCall() && isInt16(FrameSize)) {
149630e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer        assert(hasFP(MF) && "Expecting a valid the frame pointer.");
1497536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen        BuildMI(MBB, MBBI, dl, TII.get(PPC::ADDI8), PPC::X1)
149830e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer          .addReg(PPC::X31).addImm(FrameSize);
149930e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      } else if(FI->hasFastCall()) {
1500536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen        BuildMI(MBB, MBBI, dl, TII.get(PPC::LIS8), PPC::X0)
150130e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer          .addImm(FrameSize >> 16);
1502536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen        BuildMI(MBB, MBBI, dl, TII.get(PPC::ORI8), PPC::X0)
1503587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling          .addReg(PPC::X0, RegState::Kill)
150430e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer          .addImm(FrameSize & 0xFFFF);
1505536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen        BuildMI(MBB, MBBI, dl, TII.get(PPC::ADD8))
150630e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer          .addReg(PPC::X1)
150730e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer          .addReg(PPC::X31)
150830e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer          .addReg(PPC::X0);
150930e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      } else if (isInt16(FrameSize) && TargetAlign >= MaxAlign &&
1510d313a9b1484c52e3f784de5064ce86bdbd9b26dcJim Laskey            !MFI->hasVarSizedObjects()) {
1511536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen        BuildMI(MBB, MBBI, dl, TII.get(PPC::ADDI8), PPC::X1)
1512d313a9b1484c52e3f784de5064ce86bdbd9b26dcJim Laskey           .addReg(PPC::X1).addImm(FrameSize);
1513d313a9b1484c52e3f784de5064ce86bdbd9b26dcJim Laskey      } else {
1514536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen        BuildMI(MBB, MBBI, dl, TII.get(PPC::LD), PPC::X1)
1515536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen           .addImm(0).addReg(PPC::X1);
1516d313a9b1484c52e3f784de5064ce86bdbd9b26dcJim Laskey      }
15172f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey    }
151851fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey  }
151951fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey
152051fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey  if (IsPPC64) {
1521c12e5812be4dacc30781db84b045775c46580240Dale Johannesen    if (MustSaveLR)
1522536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, MBBI, dl, TII.get(PPC::LD), PPC::X0)
152351fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey        .addImm(LROffset/4).addReg(PPC::X1);
152451fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey
152551fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey    if (HasFP)
1526536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, MBBI, dl, TII.get(PPC::LD), PPC::X31)
152751fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey        .addImm(FPOffset/4).addReg(PPC::X1);
152851fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey
1529c12e5812be4dacc30781db84b045775c46580240Dale Johannesen    if (MustSaveLR)
1530536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, MBBI, dl, TII.get(PPC::MTLR8)).addReg(PPC::X0);
153151fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey  } else {
1532c12e5812be4dacc30781db84b045775c46580240Dale Johannesen    if (MustSaveLR)
1533536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, MBBI, dl, TII.get(PPC::LWZ), PPC::R0)
153451fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey          .addImm(LROffset).addReg(PPC::R1);
153551fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey
153651fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey    if (HasFP)
1537536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, MBBI, dl, TII.get(PPC::LWZ), PPC::R31)
153851fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey          .addImm(FPOffset).addReg(PPC::R1);
153951fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey
1540c12e5812be4dacc30781db84b045775c46580240Dale Johannesen    if (MustSaveLR)
1541536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen      BuildMI(MBB, MBBI, dl, TII.get(PPC::MTLR)).addReg(PPC::R0);
1542f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  }
154330e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer
154430e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer  // Callee pop calling convention. Pop parameter/linkage area. Used for tail
154530e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer  // call optimization
154630e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer  if (PerformTailCallOpt && RetOpcode == PPC::BLR &&
154730e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      MF.getFunction()->getCallingConv() == CallingConv::Fast) {
154830e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer     PPCFunctionInfo *FI = MF.getInfo<PPCFunctionInfo>();
154930e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer     unsigned CallerAllocatedAmt = FI->getMinReservedArea();
155030e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer     unsigned StackReg = IsPPC64 ? PPC::X1 : PPC::R1;
155130e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer     unsigned FPReg = IsPPC64 ? PPC::X31 : PPC::R31;
155230e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer     unsigned TmpReg = IsPPC64 ? PPC::X0 : PPC::R0;
155330e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer     unsigned ADDIInstr = IsPPC64 ? PPC::ADDI8 : PPC::ADDI;
155430e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer     unsigned ADDInstr = IsPPC64 ? PPC::ADD8 : PPC::ADD4;
155530e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer     unsigned LISInstr = IsPPC64 ? PPC::LIS8 : PPC::LIS;
155630e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer     unsigned ORIInstr = IsPPC64 ? PPC::ORI8 : PPC::ORI;
155730e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer
155830e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer     if (CallerAllocatedAmt && isInt16(CallerAllocatedAmt)) {
1559536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen       BuildMI(MBB, MBBI, dl, TII.get(ADDIInstr), StackReg)
156030e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer         .addReg(StackReg).addImm(CallerAllocatedAmt);
156130e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer     } else {
1562536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen       BuildMI(MBB, MBBI, dl, TII.get(LISInstr), TmpReg)
156330e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer          .addImm(CallerAllocatedAmt >> 16);
1564536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen       BuildMI(MBB, MBBI, dl, TII.get(ORIInstr), TmpReg)
1565587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling          .addReg(TmpReg, RegState::Kill)
156630e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer          .addImm(CallerAllocatedAmt & 0xFFFF);
1567536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen       BuildMI(MBB, MBBI, dl, TII.get(ADDInstr))
156830e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer          .addReg(StackReg)
156930e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer          .addReg(FPReg)
157030e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer          .addReg(TmpReg);
157130e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer     }
157230e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer  } else if (RetOpcode == PPC::TCRETURNdi) {
157330e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer    MBBI = prior(MBB.end());
157430e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer    MachineOperand &JumpTarget = MBBI->getOperand(0);
1575536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen    BuildMI(MBB, MBBI, dl, TII.get(PPC::TAILB)).
157630e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      addGlobalAddress(JumpTarget.getGlobal(), JumpTarget.getOffset());
157730e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer  } else if (RetOpcode == PPC::TCRETURNri) {
157830e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer    MBBI = prior(MBB.end());
1579022a27e363dcd3b8d4f7e6426559ab29d7a86d70Chris Lattner    assert(MBBI->getOperand(0).isReg() && "Expecting register operand.");
1580536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen    BuildMI(MBB, MBBI, dl, TII.get(PPC::TAILBCTR));
158130e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer  } else if (RetOpcode == PPC::TCRETURNai) {
158230e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer    MBBI = prior(MBB.end());
158330e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer    MachineOperand &JumpTarget = MBBI->getOperand(0);
1584536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen    BuildMI(MBB, MBBI, dl, TII.get(PPC::TAILBA)).addImm(JumpTarget.getImm());
158530e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer  } else if (RetOpcode == PPC::TCRETURNdi8) {
158630e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer    MBBI = prior(MBB.end());
158730e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer    MachineOperand &JumpTarget = MBBI->getOperand(0);
1588536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen    BuildMI(MBB, MBBI, dl, TII.get(PPC::TAILB8)).
158930e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      addGlobalAddress(JumpTarget.getGlobal(), JumpTarget.getOffset());
159030e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer  } else if (RetOpcode == PPC::TCRETURNri8) {
159130e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer    MBBI = prior(MBB.end());
1592022a27e363dcd3b8d4f7e6426559ab29d7a86d70Chris Lattner    assert(MBBI->getOperand(0).isReg() && "Expecting register operand.");
1593536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen    BuildMI(MBB, MBBI, dl, TII.get(PPC::TAILBCTR8));
159430e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer  } else if (RetOpcode == PPC::TCRETURNai8) {
159530e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer    MBBI = prior(MBB.end());
159630e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer    MachineOperand &JumpTarget = MBBI->getOperand(0);
1597536a2f1f8467a17f6d145bd83f25faae1f689839Dale Johannesen    BuildMI(MBB, MBBI, dl, TII.get(PPC::TAILBA8)).addImm(JumpTarget.getImm());
159830e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer  }
1599f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman}
1600f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
16014188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskeyunsigned PPCRegisterInfo::getRARegister() const {
16026a5339ba656805a9cd3bf7d884f99bb87ec84e98Chris Lattner  return !Subtarget.isPPC64() ? PPC::LR : PPC::LR8;
16034188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey}
16044188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey
1605a99791886d5d4af2b900cd8cc1c9ed1677b6f0f4Jim Laskeyunsigned PPCRegisterInfo::getFrameRegister(MachineFunction &MF) const {
1606a94a203f346e65d40c4c3fe478c5d8d7a2ff5df6Chris Lattner  if (!Subtarget.isPPC64())
1607a94a203f346e65d40c4c3fe478c5d8d7a2ff5df6Chris Lattner    return hasFP(MF) ? PPC::R31 : PPC::R1;
1608a94a203f346e65d40c4c3fe478c5d8d7a2ff5df6Chris Lattner  else
1609a94a203f346e65d40c4c3fe478c5d8d7a2ff5df6Chris Lattner    return hasFP(MF) ? PPC::X31 : PPC::X1;
16104188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey}
16114188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey
16125e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskeyvoid PPCRegisterInfo::getInitialFrameState(std::vector<MachineMove> &Moves)
16134188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey                                                                         const {
16144c2c9031acd1314440cdd0952182fa39b4efe90dJim Laskey  // Initial state of the frame pointer is R1.
16154188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  MachineLocation Dst(MachineLocation::VirtualFP);
16164188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  MachineLocation Src(PPC::R1, 0);
16175e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey  Moves.push_back(MachineMove(0, Dst, Src));
1618f1d78e83356a412e525c30ac90dabf090a8cfc99Jim Laskey}
1619f1d78e83356a412e525c30ac90dabf090a8cfc99Jim Laskey
162062819f31440fe1b1415473a89b8683b5b690d5faJim Laskeyunsigned PPCRegisterInfo::getEHExceptionRegister() const {
162162819f31440fe1b1415473a89b8683b5b690d5faJim Laskey  return !Subtarget.isPPC64() ? PPC::R3 : PPC::X3;
162262819f31440fe1b1415473a89b8683b5b690d5faJim Laskey}
162362819f31440fe1b1415473a89b8683b5b690d5faJim Laskey
162462819f31440fe1b1415473a89b8683b5b690d5faJim Laskeyunsigned PPCRegisterInfo::getEHHandlerRegister() const {
162562819f31440fe1b1415473a89b8683b5b690d5faJim Laskey  return !Subtarget.isPPC64() ? PPC::R4 : PPC::X4;
162662819f31440fe1b1415473a89b8683b5b690d5faJim Laskey}
162762819f31440fe1b1415473a89b8683b5b690d5faJim Laskey
1628b97aec663b1591e71c9ddee6dbb327d1b827eda5Dale Johannesenint PPCRegisterInfo::getDwarfRegNum(unsigned RegNum, bool isEH) const {
16293809fbe789cd8d1c5b71d9428401799564aed26cAnton Korobeynikov  // FIXME: Most probably dwarf numbers differs for Linux and Darwin
16303809fbe789cd8d1c5b71d9428401799564aed26cAnton Korobeynikov  return PPCGenRegisterInfo::getDwarfRegNumFull(RegNum, 0);
1631f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov}
1632f191c80cd79ee35e47b5a4feed98d687782dfe85Anton Korobeynikov
16334c7b43b43fdf943c7298718e15ab5d6dfe345be7Chris Lattner#include "PPCGenRegisterInfo.inc"
1634f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
1635