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