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