1 //===-- PPCFrameInfo.h - Define TargetFrameInfo for PowerPC -----*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
11 //===----------------------------------------------------------------------===//
13 #ifndef POWERPC_FRAMEINFO_H
14 #define POWERPC_FRAMEINFO_H
17 #include "PPCSubtarget.h"
18 #include "llvm/Target/TargetFrameInfo.h"
19 #include "llvm/Target/TargetMachine.h"
20 #include "llvm/ADT/STLExtras.h"
24 class PPCFrameInfo
: public TargetFrameInfo
{
25 const TargetMachine
&TM
;
28 PPCFrameInfo(const TargetMachine
&tm
, bool LP64
)
29 : TargetFrameInfo(TargetFrameInfo::StackGrowsDown
, 16, 0), TM(tm
) {
32 /// getReturnSaveOffset - Return the previous frame offset to save the
34 static unsigned getReturnSaveOffset(bool isPPC64
, bool isDarwinABI
) {
36 return isPPC64
? 16 : 8;
38 return isPPC64
? 16 : 4;
41 /// getFramePointerSaveOffset - Return the previous frame offset to save the
43 static unsigned getFramePointerSaveOffset(bool isPPC64
, bool isDarwinABI
) {
44 // For the Darwin ABI:
45 // Use the TOC save slot in the PowerPC linkage area for saving the frame
46 // pointer (if needed.) LLVM does not generate code that uses the TOC (R2
47 // is treated as a caller saved register.)
49 return isPPC64
? 40 : 20;
51 // SVR4 ABI: First slot in the general register save area.
55 /// getLinkageSize - Return the size of the PowerPC ABI linkage area.
57 static unsigned getLinkageSize(bool isPPC64
, bool isDarwinABI
) {
58 if (isDarwinABI
|| isPPC64
)
59 return 6 * (isPPC64
? 8 : 4);
65 /// getMinCallArgumentsSize - Return the size of the minium PowerPC ABI
67 static unsigned getMinCallArgumentsSize(bool isPPC64
, bool isDarwinABI
) {
68 // For the Darwin ABI / 64-bit SVR4 ABI:
69 // The prolog code of the callee may store up to 8 GPR argument registers to
70 // the stack, allowing va_start to index over them in memory if its varargs.
71 // Because we cannot tell if this is needed on the caller side, we have to
72 // conservatively assume that it is needed. As such, make sure we have at
73 // least enough stack space for the caller to store the 8 GPRs.
74 if (isDarwinABI
|| isPPC64
)
75 return 8 * (isPPC64
? 8 : 4);
78 // There is no default stack allocated for the 8 first GPR arguments.
82 /// getMinCallFrameSize - Return the minimum size a call frame can be using
84 static unsigned getMinCallFrameSize(bool isPPC64
, bool isDarwinABI
) {
85 // The call frame needs to be at least big enough for linkage and 8 args.
86 return getLinkageSize(isPPC64
, isDarwinABI
) +
87 getMinCallArgumentsSize(isPPC64
, isDarwinABI
);
90 // With the SVR4 ABI, callee-saved registers have fixed offsets on the stack.
91 const std::pair
<unsigned, int> *
92 getCalleeSavedSpillSlots(unsigned &NumEntries
) const {
93 // Early exit if not using the SVR4 ABI.
94 if (!TM
.getSubtarget
<PPCSubtarget
>().isSVR4ABI()) {
99 static const std::pair
<unsigned, int> Offsets
[] = {
100 // Floating-point register save area offsets.
101 std::pair
<unsigned, int>(PPC::F31
, -8),
102 std::pair
<unsigned, int>(PPC::F30
, -16),
103 std::pair
<unsigned, int>(PPC::F29
, -24),
104 std::pair
<unsigned, int>(PPC::F28
, -32),
105 std::pair
<unsigned, int>(PPC::F27
, -40),
106 std::pair
<unsigned, int>(PPC::F26
, -48),
107 std::pair
<unsigned, int>(PPC::F25
, -56),
108 std::pair
<unsigned, int>(PPC::F24
, -64),
109 std::pair
<unsigned, int>(PPC::F23
, -72),
110 std::pair
<unsigned, int>(PPC::F22
, -80),
111 std::pair
<unsigned, int>(PPC::F21
, -88),
112 std::pair
<unsigned, int>(PPC::F20
, -96),
113 std::pair
<unsigned, int>(PPC::F19
, -104),
114 std::pair
<unsigned, int>(PPC::F18
, -112),
115 std::pair
<unsigned, int>(PPC::F17
, -120),
116 std::pair
<unsigned, int>(PPC::F16
, -128),
117 std::pair
<unsigned, int>(PPC::F15
, -136),
118 std::pair
<unsigned, int>(PPC::F14
, -144),
120 // General register save area offsets.
121 std::pair
<unsigned, int>(PPC::R31
, -4),
122 std::pair
<unsigned, int>(PPC::R30
, -8),
123 std::pair
<unsigned, int>(PPC::R29
, -12),
124 std::pair
<unsigned, int>(PPC::R28
, -16),
125 std::pair
<unsigned, int>(PPC::R27
, -20),
126 std::pair
<unsigned, int>(PPC::R26
, -24),
127 std::pair
<unsigned, int>(PPC::R25
, -28),
128 std::pair
<unsigned, int>(PPC::R24
, -32),
129 std::pair
<unsigned, int>(PPC::R23
, -36),
130 std::pair
<unsigned, int>(PPC::R22
, -40),
131 std::pair
<unsigned, int>(PPC::R21
, -44),
132 std::pair
<unsigned, int>(PPC::R20
, -48),
133 std::pair
<unsigned, int>(PPC::R19
, -52),
134 std::pair
<unsigned, int>(PPC::R18
, -56),
135 std::pair
<unsigned, int>(PPC::R17
, -60),
136 std::pair
<unsigned, int>(PPC::R16
, -64),
137 std::pair
<unsigned, int>(PPC::R15
, -68),
138 std::pair
<unsigned, int>(PPC::R14
, -72),
140 // CR save area offset.
141 // FIXME SVR4: Disable CR save area for now.
142 // std::pair<unsigned, int>(PPC::CR2, -4),
143 // std::pair<unsigned, int>(PPC::CR3, -4),
144 // std::pair<unsigned, int>(PPC::CR4, -4),
145 // std::pair<unsigned, int>(PPC::CR2LT, -4),
146 // std::pair<unsigned, int>(PPC::CR2GT, -4),
147 // std::pair<unsigned, int>(PPC::CR2EQ, -4),
148 // std::pair<unsigned, int>(PPC::CR2UN, -4),
149 // std::pair<unsigned, int>(PPC::CR3LT, -4),
150 // std::pair<unsigned, int>(PPC::CR3GT, -4),
151 // std::pair<unsigned, int>(PPC::CR3EQ, -4),
152 // std::pair<unsigned, int>(PPC::CR3UN, -4),
153 // std::pair<unsigned, int>(PPC::CR4LT, -4),
154 // std::pair<unsigned, int>(PPC::CR4GT, -4),
155 // std::pair<unsigned, int>(PPC::CR4EQ, -4),
156 // std::pair<unsigned, int>(PPC::CR4UN, -4),
158 // VRSAVE save area offset.
159 std::pair
<unsigned, int>(PPC::VRSAVE
, -4),
161 // Vector register save area
162 std::pair
<unsigned, int>(PPC::V31
, -16),
163 std::pair
<unsigned, int>(PPC::V30
, -32),
164 std::pair
<unsigned, int>(PPC::V29
, -48),
165 std::pair
<unsigned, int>(PPC::V28
, -64),
166 std::pair
<unsigned, int>(PPC::V27
, -80),
167 std::pair
<unsigned, int>(PPC::V26
, -96),
168 std::pair
<unsigned, int>(PPC::V25
, -112),
169 std::pair
<unsigned, int>(PPC::V24
, -128),
170 std::pair
<unsigned, int>(PPC::V23
, -144),
171 std::pair
<unsigned, int>(PPC::V22
, -160),
172 std::pair
<unsigned, int>(PPC::V21
, -176),
173 std::pair
<unsigned, int>(PPC::V20
, -192)
176 static const std::pair
<unsigned, int> Offsets64
[] = {
177 // Floating-point register save area offsets.
178 std::pair
<unsigned, int>(PPC::F31
, -8),
179 std::pair
<unsigned, int>(PPC::F30
, -16),
180 std::pair
<unsigned, int>(PPC::F29
, -24),
181 std::pair
<unsigned, int>(PPC::F28
, -32),
182 std::pair
<unsigned, int>(PPC::F27
, -40),
183 std::pair
<unsigned, int>(PPC::F26
, -48),
184 std::pair
<unsigned, int>(PPC::F25
, -56),
185 std::pair
<unsigned, int>(PPC::F24
, -64),
186 std::pair
<unsigned, int>(PPC::F23
, -72),
187 std::pair
<unsigned, int>(PPC::F22
, -80),
188 std::pair
<unsigned, int>(PPC::F21
, -88),
189 std::pair
<unsigned, int>(PPC::F20
, -96),
190 std::pair
<unsigned, int>(PPC::F19
, -104),
191 std::pair
<unsigned, int>(PPC::F18
, -112),
192 std::pair
<unsigned, int>(PPC::F17
, -120),
193 std::pair
<unsigned, int>(PPC::F16
, -128),
194 std::pair
<unsigned, int>(PPC::F15
, -136),
195 std::pair
<unsigned, int>(PPC::F14
, -144),
197 // General register save area offsets.
198 // FIXME 64-bit SVR4: Are 32-bit registers actually allocated in 64-bit
200 std::pair
<unsigned, int>(PPC::R31
, -4),
201 std::pair
<unsigned, int>(PPC::R30
, -12),
202 std::pair
<unsigned, int>(PPC::R29
, -20),
203 std::pair
<unsigned, int>(PPC::R28
, -28),
204 std::pair
<unsigned, int>(PPC::R27
, -36),
205 std::pair
<unsigned, int>(PPC::R26
, -44),
206 std::pair
<unsigned, int>(PPC::R25
, -52),
207 std::pair
<unsigned, int>(PPC::R24
, -60),
208 std::pair
<unsigned, int>(PPC::R23
, -68),
209 std::pair
<unsigned, int>(PPC::R22
, -76),
210 std::pair
<unsigned, int>(PPC::R21
, -84),
211 std::pair
<unsigned, int>(PPC::R20
, -92),
212 std::pair
<unsigned, int>(PPC::R19
, -100),
213 std::pair
<unsigned, int>(PPC::R18
, -108),
214 std::pair
<unsigned, int>(PPC::R17
, -116),
215 std::pair
<unsigned, int>(PPC::R16
, -124),
216 std::pair
<unsigned, int>(PPC::R15
, -132),
217 std::pair
<unsigned, int>(PPC::R14
, -140),
219 std::pair
<unsigned, int>(PPC::X31
, -8),
220 std::pair
<unsigned, int>(PPC::X30
, -16),
221 std::pair
<unsigned, int>(PPC::X29
, -24),
222 std::pair
<unsigned, int>(PPC::X28
, -32),
223 std::pair
<unsigned, int>(PPC::X27
, -40),
224 std::pair
<unsigned, int>(PPC::X26
, -48),
225 std::pair
<unsigned, int>(PPC::X25
, -56),
226 std::pair
<unsigned, int>(PPC::X24
, -64),
227 std::pair
<unsigned, int>(PPC::X23
, -72),
228 std::pair
<unsigned, int>(PPC::X22
, -80),
229 std::pair
<unsigned, int>(PPC::X21
, -88),
230 std::pair
<unsigned, int>(PPC::X20
, -96),
231 std::pair
<unsigned, int>(PPC::X19
, -104),
232 std::pair
<unsigned, int>(PPC::X18
, -112),
233 std::pair
<unsigned, int>(PPC::X17
, -120),
234 std::pair
<unsigned, int>(PPC::X16
, -128),
235 std::pair
<unsigned, int>(PPC::X15
, -136),
236 std::pair
<unsigned, int>(PPC::X14
, -144),
238 // CR save area offset.
239 // FIXME SVR4: Disable CR save area for now.
240 // std::pair<unsigned, int>(PPC::CR2, -4),
241 // std::pair<unsigned, int>(PPC::CR3, -4),
242 // std::pair<unsigned, int>(PPC::CR4, -4),
243 // std::pair<unsigned, int>(PPC::CR2LT, -4),
244 // std::pair<unsigned, int>(PPC::CR2GT, -4),
245 // std::pair<unsigned, int>(PPC::CR2EQ, -4),
246 // std::pair<unsigned, int>(PPC::CR2UN, -4),
247 // std::pair<unsigned, int>(PPC::CR3LT, -4),
248 // std::pair<unsigned, int>(PPC::CR3GT, -4),
249 // std::pair<unsigned, int>(PPC::CR3EQ, -4),
250 // std::pair<unsigned, int>(PPC::CR3UN, -4),
251 // std::pair<unsigned, int>(PPC::CR4LT, -4),
252 // std::pair<unsigned, int>(PPC::CR4GT, -4),
253 // std::pair<unsigned, int>(PPC::CR4EQ, -4),
254 // std::pair<unsigned, int>(PPC::CR4UN, -4),
256 // VRSAVE save area offset.
257 std::pair
<unsigned, int>(PPC::VRSAVE
, -4),
259 // Vector register save area
260 std::pair
<unsigned, int>(PPC::V31
, -16),
261 std::pair
<unsigned, int>(PPC::V30
, -32),
262 std::pair
<unsigned, int>(PPC::V29
, -48),
263 std::pair
<unsigned, int>(PPC::V28
, -64),
264 std::pair
<unsigned, int>(PPC::V27
, -80),
265 std::pair
<unsigned, int>(PPC::V26
, -96),
266 std::pair
<unsigned, int>(PPC::V25
, -112),
267 std::pair
<unsigned, int>(PPC::V24
, -128),
268 std::pair
<unsigned, int>(PPC::V23
, -144),
269 std::pair
<unsigned, int>(PPC::V22
, -160),
270 std::pair
<unsigned, int>(PPC::V21
, -176),
271 std::pair
<unsigned, int>(PPC::V20
, -192)
274 if (TM
.getSubtarget
<PPCSubtarget
>().isPPC64()) {
275 NumEntries
= array_lengthof(Offsets64
);
279 NumEntries
= array_lengthof(Offsets
);
286 } // End llvm namespace