131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- PPCFrameLowering.h - Define frame lowering for PowerPC --*- C++ -*-===//
2b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman//
3ca068e861b7f1184d31f6c8f26f88feb076badf1Nate Begeman//                     The LLVM Compiler Infrastructure
4ca068e861b7f1184d31f6c8f26f88feb076badf1Nate Begeman//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman//
8ca068e861b7f1184d31f6c8f26f88feb076badf1Nate Begeman//===----------------------------------------------------------------------===//
9ca068e861b7f1184d31f6c8f26f88feb076badf1Nate Begeman//
10ca068e861b7f1184d31f6c8f26f88feb076badf1Nate Begeman//
1121e463b2bf864671a87ebe386cb100ef9349a540Nate Begeman//===----------------------------------------------------------------------===//
12ca068e861b7f1184d31f6c8f26f88feb076badf1Nate Begeman
13ca068e861b7f1184d31f6c8f26f88feb076badf1Nate Begeman#ifndef POWERPC_FRAMEINFO_H
14ca068e861b7f1184d31f6c8f26f88feb076badf1Nate Begeman#define POWERPC_FRAMEINFO_H
15ca068e861b7f1184d31f6c8f26f88feb076badf1Nate Begeman
162668959b8879097db368aec7d76c455260abc75bChris Lattner#include "PPC.h"
17ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller#include "PPCSubtarget.h"
1816c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov#include "llvm/Target/TargetFrameLowering.h"
19ca068e861b7f1184d31f6c8f26f88feb076badf1Nate Begeman#include "llvm/Target/TargetMachine.h"
20ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller#include "llvm/ADT/STLExtras.h"
21ca068e861b7f1184d31f6c8f26f88feb076badf1Nate Begeman
22ca068e861b7f1184d31f6c8f26f88feb076badf1Nate Begemannamespace llvm {
2333464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  class PPCSubtarget;
24ca068e861b7f1184d31f6c8f26f88feb076badf1Nate Begeman
2516c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikovclass PPCFrameLowering: public TargetFrameLowering {
2633464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  const PPCSubtarget &Subtarget;
27b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman
28ca068e861b7f1184d31f6c8f26f88feb076badf1Nate Begemanpublic:
2916c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov  PPCFrameLowering(const PPCSubtarget &sti)
3016c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov    : TargetFrameLowering(TargetFrameLowering::StackGrowsDown, 16, 0),
3116c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov      Subtarget(sti) {
32ca068e861b7f1184d31f6c8f26f88feb076badf1Nate Begeman  }
33ca068e861b7f1184d31f6c8f26f88feb076badf1Nate Begeman
3433464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  void determineFrameLayout(MachineFunction &MF) const;
3533464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
3633464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  /// emitProlog/emitEpilog - These methods insert prolog and epilog code into
3733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  /// the function.
3833464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  void emitPrologue(MachineFunction &MF) const;
3933464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
4033464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
41d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov  bool hasFP(const MachineFunction &MF) const;
42c8bd78c16ba0489835f2eb6101d9bdb96301cfe7Anton Korobeynikov  bool needsFP(const MachineFunction &MF) const;
43d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov
4494c5ae08750f314bc3cf1bf882b686244a3927d9Anton Korobeynikov  void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
4594c5ae08750f314bc3cf1bf882b686244a3927d9Anton Korobeynikov                                            RegScavenger *RS = NULL) const;
4694c5ae08750f314bc3cf1bf882b686244a3927d9Anton Korobeynikov  void processFunctionBeforeFrameFinalized(MachineFunction &MF) const;
4794c5ae08750f314bc3cf1bf882b686244a3927d9Anton Korobeynikov
4833464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  /// targetHandlesStackFrameRounding - Returns true if the target is
4933464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  /// responsible for rounding up the stack frame (probably at emitPrologue
5033464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  /// time).
5133464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  bool targetHandlesStackFrameRounding() const { return true; }
5233464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
5351fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey  /// getReturnSaveOffset - Return the previous frame offset to save the
5451fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey  /// return address.
556b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller  static unsigned getReturnSaveOffset(bool isPPC64, bool isDarwinABI) {
562a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller    if (isDarwinABI)
576b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller      return isPPC64 ? 16 : 8;
582a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller    // SVR4 ABI:
596b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller    return isPPC64 ? 16 : 4;
60ca068e861b7f1184d31f6c8f26f88feb076badf1Nate Begeman  }
6151fe9d9aa432cbde6497cad4ea5c8f0276c67b82Jim Laskey
622f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  /// getFramePointerSaveOffset - Return the previous frame offset to save the
632f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  /// frame pointer.
646b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller  static unsigned getFramePointerSaveOffset(bool isPPC64, bool isDarwinABI) {
652a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller    // For the Darwin ABI:
66f7801b493ef94c3a7edf8d57cc564f08fce6e624Dale Johannesen    // We cannot use the TOC save slot (offset +20) in the PowerPC linkage area
67f7801b493ef94c3a7edf8d57cc564f08fce6e624Dale Johannesen    // for saving the frame pointer (if needed.)  While the published ABI has
68f7801b493ef94c3a7edf8d57cc564f08fce6e624Dale Johannesen    // not used this slot since at least MacOSX 10.2, there is older code
69f7801b493ef94c3a7edf8d57cc564f08fce6e624Dale Johannesen    // around that does use it, and that needs to continue to work.
702a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller    if (isDarwinABI)
71f7801b493ef94c3a7edf8d57cc564f08fce6e624Dale Johannesen      return isPPC64 ? -8U : -4U;
7278b4fee8fd040d802e027da7bef3f707b12d8df5Anton Korobeynikov
736b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller    // SVR4 ABI: First slot in the general register save area.
74cfcb7997ad4a829de4abd55903863db3c9d414efTilmann Scheller    return isPPC64 ? -8U : -4U;
752f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  }
7678b4fee8fd040d802e027da7bef3f707b12d8df5Anton Korobeynikov
772f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  /// getLinkageSize - Return the size of the PowerPC ABI linkage area.
782f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  ///
796b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller  static unsigned getLinkageSize(bool isPPC64, bool isDarwinABI) {
806b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller    if (isDarwinABI || isPPC64)
816b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller      return 6 * (isPPC64 ? 8 : 4);
8278b4fee8fd040d802e027da7bef3f707b12d8df5Anton Korobeynikov
832a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller    // SVR4 ABI:
84ec58d9f9ddfbfe16ea40822164f340b256c89191Nicolas Geoffray    return 8;
852f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  }
862f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey
872f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  /// getMinCallArgumentsSize - Return the size of the minium PowerPC ABI
882f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  /// argument area.
896b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller  static unsigned getMinCallArgumentsSize(bool isPPC64, bool isDarwinABI) {
906b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller    // For the Darwin ABI / 64-bit SVR4 ABI:
919f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    // The prolog code of the callee may store up to 8 GPR argument registers to
929f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    // the stack, allowing va_start to index over them in memory if its varargs.
939f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    // Because we cannot tell if this is needed on the caller side, we have to
949f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    // conservatively assume that it is needed.  As such, make sure we have at
959f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    // least enough stack space for the caller to store the 8 GPRs.
966b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller    if (isDarwinABI || isPPC64)
976b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller      return 8 * (isPPC64 ? 8 : 4);
9878b4fee8fd040d802e027da7bef3f707b12d8df5Anton Korobeynikov
996b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller    // 32-bit SVR4 ABI:
1009f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    // There is no default stack allocated for the 8 first GPR arguments.
1019f0bc659c8d2f1e401a9690e4900b0fd2a70bdfeChris Lattner    return 0;
1022f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  }
1032f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey
1042f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  /// getMinCallFrameSize - Return the minimum size a call frame can be using
1052f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  /// the PowerPC ABI.
1066b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller  static unsigned getMinCallFrameSize(bool isPPC64, bool isDarwinABI) {
1072f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey    // The call frame needs to be at least big enough for linkage and 8 args.
1086b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller    return getLinkageSize(isPPC64, isDarwinABI) +
1096b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller           getMinCallArgumentsSize(isPPC64, isDarwinABI);
1102f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey  }
111ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
112ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  // With the SVR4 ABI, callee-saved registers have fixed offsets on the stack.
1138ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller  const SpillSlot *
114ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  getCalleeSavedSpillSlots(unsigned &NumEntries) const {
11533464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov    if (Subtarget.isDarwinABI()) {
116f7801b493ef94c3a7edf8d57cc564f08fce6e624Dale Johannesen      NumEntries = 1;
11733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov      if (Subtarget.isPPC64()) {
1180106a0aafe8a169ad39736ddeb591ccde7cdca97Dale Johannesen        static const SpillSlot darwin64Offsets = {PPC::X31, -8};
1190106a0aafe8a169ad39736ddeb591ccde7cdca97Dale Johannesen        return &darwin64Offsets;
120f7801b493ef94c3a7edf8d57cc564f08fce6e624Dale Johannesen      } else {
1210106a0aafe8a169ad39736ddeb591ccde7cdca97Dale Johannesen        static const SpillSlot darwinOffsets = {PPC::R31, -4};
1220106a0aafe8a169ad39736ddeb591ccde7cdca97Dale Johannesen        return &darwinOffsets;
123f7801b493ef94c3a7edf8d57cc564f08fce6e624Dale Johannesen      }
124f7801b493ef94c3a7edf8d57cc564f08fce6e624Dale Johannesen    }
125f7801b493ef94c3a7edf8d57cc564f08fce6e624Dale Johannesen
126ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    // Early exit if not using the SVR4 ABI.
12733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov    if (!Subtarget.isSVR4ABI()) {
128ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      NumEntries = 0;
129ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      return 0;
130ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    }
1318ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller
1328ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller    static const SpillSlot Offsets[] = {
133ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      // Floating-point register save area offsets.
1348ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F31, -8},
1358ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F30, -16},
1368ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F29, -24},
1378ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F28, -32},
1388ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F27, -40},
1398ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F26, -48},
1408ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F25, -56},
1418ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F24, -64},
1428ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F23, -72},
1438ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F22, -80},
1448ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F21, -88},
1458ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F20, -96},
1468ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F19, -104},
1478ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F18, -112},
1488ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F17, -120},
1498ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F16, -128},
1508ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F15, -136},
1518ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F14, -144},
1528ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller
153ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      // General register save area offsets.
1548ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R31, -4},
1558ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R30, -8},
1568ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R29, -12},
1578ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R28, -16},
1588ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R27, -20},
1598ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R26, -24},
1608ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R25, -28},
1618ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R24, -32},
1628ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R23, -36},
1638ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R22, -40},
1648ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R21, -44},
1658ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R20, -48},
1668ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R19, -52},
1678ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R18, -56},
1688ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R17, -60},
1698ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R16, -64},
1708ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R15, -68},
1718ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R14, -72},
172ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
173ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      // CR save area offset.
1746a3a1ba97e996bfdc061f9a51bd4cf4915962913Tilmann Scheller      // FIXME SVR4: Disable CR save area for now.
1758ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR2, -4},
1768ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR3, -4},
1778ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR4, -4},
1788ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR2LT, -4},
1798ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR2GT, -4},
1808ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR2EQ, -4},
1818ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR2UN, -4},
1828ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR3LT, -4},
1838ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR3GT, -4},
1848ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR3EQ, -4},
1858ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR3UN, -4},
1868ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR4LT, -4},
1878ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR4GT, -4},
1888ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR4EQ, -4},
1898ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR4UN, -4},
190ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller
191ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      // VRSAVE save area offset.
1928ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::VRSAVE, -4},
1938ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller
194ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller      // Vector register save area
1958ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::V31, -16},
1968ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::V30, -32},
1978ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::V29, -48},
1988ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::V28, -64},
1998ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::V27, -80},
2008ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::V26, -96},
2018ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::V25, -112},
2028ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::V24, -128},
2038ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::V23, -144},
2048ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::V22, -160},
2058ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::V21, -176},
2068ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::V20, -192}
207ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller    };
2088ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller
2098ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller    static const SpillSlot Offsets64[] = {
2106b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller      // Floating-point register save area offsets.
2118ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F31, -8},
2128ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F30, -16},
2138ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F29, -24},
2148ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F28, -32},
2158ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F27, -40},
2168ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F26, -48},
2178ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F25, -56},
2188ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F24, -64},
2198ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F23, -72},
2208ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F22, -80},
2218ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F21, -88},
2228ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F20, -96},
2238ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F19, -104},
2248ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F18, -112},
2258ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F17, -120},
2268ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F16, -128},
2278ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F15, -136},
2288ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::F14, -144},
2296b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller
2306b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller      // General register save area offsets.
2316b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller      // FIXME 64-bit SVR4: Are 32-bit registers actually allocated in 64-bit
2326b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller      //                    mode?
2338ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R31, -4},
2348ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R30, -12},
2358ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R29, -20},
2368ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R28, -28},
2378ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R27, -36},
2388ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R26, -44},
2398ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R25, -52},
2408ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R24, -60},
2418ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R23, -68},
2428ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R22, -76},
2438ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R21, -84},
2448ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R20, -92},
2458ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R19, -100},
2468ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R18, -108},
2478ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R17, -116},
2488ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R16, -124},
2498ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R15, -132},
2508ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::R14, -140},
2516b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller
2528ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::X31, -8},
2538ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::X30, -16},
2548ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::X29, -24},
2558ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::X28, -32},
2568ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::X27, -40},
2578ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::X26, -48},
2588ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::X25, -56},
2598ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::X24, -64},
2608ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::X23, -72},
2618ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::X22, -80},
2628ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::X21, -88},
2638ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::X20, -96},
2648ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::X19, -104},
2658ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::X18, -112},
2668ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::X17, -120},
2678ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::X16, -128},
2688ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::X15, -136},
2698ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::X14, -144},
2706b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller
2716b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller      // CR save area offset.
2726b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller      // FIXME SVR4: Disable CR save area for now.
2738ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR2, -4},
2748ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR3, -4},
2758ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR4, -4},
2768ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR2LT, -4},
2778ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR2GT, -4},
2788ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR2EQ, -4},
2798ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR2UN, -4},
2808ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR3LT, -4},
2818ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR3GT, -4},
2828ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR3EQ, -4},
2838ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR3UN, -4},
2848ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR4LT, -4},
2858ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR4GT, -4},
2868ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR4EQ, -4},
2878ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller//      {PPC::CR4UN, -4},
2886b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller
2896b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller      // VRSAVE save area offset.
2908ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::VRSAVE, -4},
2916b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller
2926b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller      // Vector register save area
2938ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::V31, -16},
2948ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::V30, -32},
2958ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::V29, -48},
2968ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::V28, -64},
2978ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::V27, -80},
2988ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::V26, -96},
2998ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::V25, -112},
3008ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::V24, -128},
3018ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::V23, -144},
3028ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::V22, -160},
3038ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::V21, -176},
3048ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller      {PPC::V20, -192}
3056b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller    };
3068ff95de83cbe85d939535d2f4fb5f9b2b721081aTilmann Scheller
30733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov    if (Subtarget.isPPC64()) {
3086b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller      NumEntries = array_lengthof(Offsets64);
3096b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller
3106b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller      return Offsets64;
3116b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller    } else {
3126b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller      NumEntries = array_lengthof(Offsets);
3136b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller
3146b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller      return Offsets;
3156b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller    }
316ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller  }
317ca068e861b7f1184d31f6c8f26f88feb076badf1Nate Begeman};
318ca068e861b7f1184d31f6c8f26f88feb076badf1Nate Begeman
319ca068e861b7f1184d31f6c8f26f88feb076badf1Nate Begeman} // End llvm namespace
320ca068e861b7f1184d31f6c8f26f88feb076badf1Nate Begeman
321ca068e861b7f1184d31f6c8f26f88feb076badf1Nate Begeman#endif
322