1 | /* |
2 | * Special support for eabi and SVR4 |
3 | * |
4 | * Copyright (C) 1995, 1996, 1998, 2000, 2001 Free Software Foundation, Inc. |
5 | * Copyright 2008 Freescale Semiconductor, Inc. |
6 | * Written By Michael Meissner |
7 | * |
8 | * Based on gcc/config/rs6000/crtsavres.asm from gcc |
9 | * 64 bit additions from reading the PPC elf64abi document. |
10 | * |
11 | * This file is free software; you can redistribute it and/or modify it |
12 | * under the terms of the GNU General Public License as published by the |
13 | * Free Software Foundation; either version 2, or (at your option) any |
14 | * later version. |
15 | * |
16 | * In addition to the permissions in the GNU General Public License, the |
17 | * Free Software Foundation gives you unlimited permission to link the |
18 | * compiled version of this file with other programs, and to distribute |
19 | * those programs without any restriction coming from the use of this |
20 | * file. (The General Public License restrictions do apply in other |
21 | * respects; for example, they cover modification of the file, and |
22 | * distribution when not linked into another program.) |
23 | * |
24 | * This file is distributed in the hope that it will be useful, but |
25 | * WITHOUT ANY WARRANTY; without even the implied warranty of |
26 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
27 | * General Public License for more details. |
28 | * |
29 | * You should have received a copy of the GNU General Public License |
30 | * along with this program; see the file COPYING. If not, write to |
31 | * the Free Software Foundation, 51 Franklin Street, Fifth Floor, |
32 | * Boston, MA 02110-1301, USA. |
33 | * |
34 | * As a special exception, if you link this library with files |
35 | * compiled with GCC to produce an executable, this does not cause |
36 | * the resulting executable to be covered by the GNU General Public License. |
37 | * This exception does not however invalidate any other reasons why |
38 | * the executable file might be covered by the GNU General Public License. |
39 | */ |
40 | |
41 | #include <asm/ppc_asm.h> |
42 | |
43 | .file "crtsavres.S" |
44 | |
45 | #ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE |
46 | |
47 | .section ".text" |
48 | |
49 | #ifndef CONFIG_PPC64 |
50 | |
51 | /* Routines for saving integer registers, called by the compiler. */ |
52 | /* Called with r11 pointing to the stack header word of the caller of the */ |
53 | /* function, just beyond the end of the integer save area. */ |
54 | |
55 | _GLOBAL(_savegpr_14) |
56 | _GLOBAL(_save32gpr_14) |
57 | stw 14,-72(11) /* save gp registers */ |
58 | _GLOBAL(_savegpr_15) |
59 | _GLOBAL(_save32gpr_15) |
60 | stw 15,-68(11) |
61 | _GLOBAL(_savegpr_16) |
62 | _GLOBAL(_save32gpr_16) |
63 | stw 16,-64(11) |
64 | _GLOBAL(_savegpr_17) |
65 | _GLOBAL(_save32gpr_17) |
66 | stw 17,-60(11) |
67 | _GLOBAL(_savegpr_18) |
68 | _GLOBAL(_save32gpr_18) |
69 | stw 18,-56(11) |
70 | _GLOBAL(_savegpr_19) |
71 | _GLOBAL(_save32gpr_19) |
72 | stw 19,-52(11) |
73 | _GLOBAL(_savegpr_20) |
74 | _GLOBAL(_save32gpr_20) |
75 | stw 20,-48(11) |
76 | _GLOBAL(_savegpr_21) |
77 | _GLOBAL(_save32gpr_21) |
78 | stw 21,-44(11) |
79 | _GLOBAL(_savegpr_22) |
80 | _GLOBAL(_save32gpr_22) |
81 | stw 22,-40(11) |
82 | _GLOBAL(_savegpr_23) |
83 | _GLOBAL(_save32gpr_23) |
84 | stw 23,-36(11) |
85 | _GLOBAL(_savegpr_24) |
86 | _GLOBAL(_save32gpr_24) |
87 | stw 24,-32(11) |
88 | _GLOBAL(_savegpr_25) |
89 | _GLOBAL(_save32gpr_25) |
90 | stw 25,-28(11) |
91 | _GLOBAL(_savegpr_26) |
92 | _GLOBAL(_save32gpr_26) |
93 | stw 26,-24(11) |
94 | _GLOBAL(_savegpr_27) |
95 | _GLOBAL(_save32gpr_27) |
96 | stw 27,-20(11) |
97 | _GLOBAL(_savegpr_28) |
98 | _GLOBAL(_save32gpr_28) |
99 | stw 28,-16(11) |
100 | _GLOBAL(_savegpr_29) |
101 | _GLOBAL(_save32gpr_29) |
102 | stw 29,-12(11) |
103 | _GLOBAL(_savegpr_30) |
104 | _GLOBAL(_save32gpr_30) |
105 | stw 30,-8(11) |
106 | _GLOBAL(_savegpr_31) |
107 | _GLOBAL(_save32gpr_31) |
108 | stw 31,-4(11) |
109 | blr |
110 | |
111 | /* Routines for restoring integer registers, called by the compiler. */ |
112 | /* Called with r11 pointing to the stack header word of the caller of the */ |
113 | /* function, just beyond the end of the integer restore area. */ |
114 | |
115 | _GLOBAL(_restgpr_14) |
116 | _GLOBAL(_rest32gpr_14) |
117 | lwz 14,-72(11) /* restore gp registers */ |
118 | _GLOBAL(_restgpr_15) |
119 | _GLOBAL(_rest32gpr_15) |
120 | lwz 15,-68(11) |
121 | _GLOBAL(_restgpr_16) |
122 | _GLOBAL(_rest32gpr_16) |
123 | lwz 16,-64(11) |
124 | _GLOBAL(_restgpr_17) |
125 | _GLOBAL(_rest32gpr_17) |
126 | lwz 17,-60(11) |
127 | _GLOBAL(_restgpr_18) |
128 | _GLOBAL(_rest32gpr_18) |
129 | lwz 18,-56(11) |
130 | _GLOBAL(_restgpr_19) |
131 | _GLOBAL(_rest32gpr_19) |
132 | lwz 19,-52(11) |
133 | _GLOBAL(_restgpr_20) |
134 | _GLOBAL(_rest32gpr_20) |
135 | lwz 20,-48(11) |
136 | _GLOBAL(_restgpr_21) |
137 | _GLOBAL(_rest32gpr_21) |
138 | lwz 21,-44(11) |
139 | _GLOBAL(_restgpr_22) |
140 | _GLOBAL(_rest32gpr_22) |
141 | lwz 22,-40(11) |
142 | _GLOBAL(_restgpr_23) |
143 | _GLOBAL(_rest32gpr_23) |
144 | lwz 23,-36(11) |
145 | _GLOBAL(_restgpr_24) |
146 | _GLOBAL(_rest32gpr_24) |
147 | lwz 24,-32(11) |
148 | _GLOBAL(_restgpr_25) |
149 | _GLOBAL(_rest32gpr_25) |
150 | lwz 25,-28(11) |
151 | _GLOBAL(_restgpr_26) |
152 | _GLOBAL(_rest32gpr_26) |
153 | lwz 26,-24(11) |
154 | _GLOBAL(_restgpr_27) |
155 | _GLOBAL(_rest32gpr_27) |
156 | lwz 27,-20(11) |
157 | _GLOBAL(_restgpr_28) |
158 | _GLOBAL(_rest32gpr_28) |
159 | lwz 28,-16(11) |
160 | _GLOBAL(_restgpr_29) |
161 | _GLOBAL(_rest32gpr_29) |
162 | lwz 29,-12(11) |
163 | _GLOBAL(_restgpr_30) |
164 | _GLOBAL(_rest32gpr_30) |
165 | lwz 30,-8(11) |
166 | _GLOBAL(_restgpr_31) |
167 | _GLOBAL(_rest32gpr_31) |
168 | lwz 31,-4(11) |
169 | blr |
170 | |
171 | /* Routines for restoring integer registers, called by the compiler. */ |
172 | /* Called with r11 pointing to the stack header word of the caller of the */ |
173 | /* function, just beyond the end of the integer restore area. */ |
174 | |
175 | _GLOBAL(_restgpr_14_x) |
176 | _GLOBAL(_rest32gpr_14_x) |
177 | lwz 14,-72(11) /* restore gp registers */ |
178 | _GLOBAL(_restgpr_15_x) |
179 | _GLOBAL(_rest32gpr_15_x) |
180 | lwz 15,-68(11) |
181 | _GLOBAL(_restgpr_16_x) |
182 | _GLOBAL(_rest32gpr_16_x) |
183 | lwz 16,-64(11) |
184 | _GLOBAL(_restgpr_17_x) |
185 | _GLOBAL(_rest32gpr_17_x) |
186 | lwz 17,-60(11) |
187 | _GLOBAL(_restgpr_18_x) |
188 | _GLOBAL(_rest32gpr_18_x) |
189 | lwz 18,-56(11) |
190 | _GLOBAL(_restgpr_19_x) |
191 | _GLOBAL(_rest32gpr_19_x) |
192 | lwz 19,-52(11) |
193 | _GLOBAL(_restgpr_20_x) |
194 | _GLOBAL(_rest32gpr_20_x) |
195 | lwz 20,-48(11) |
196 | _GLOBAL(_restgpr_21_x) |
197 | _GLOBAL(_rest32gpr_21_x) |
198 | lwz 21,-44(11) |
199 | _GLOBAL(_restgpr_22_x) |
200 | _GLOBAL(_rest32gpr_22_x) |
201 | lwz 22,-40(11) |
202 | _GLOBAL(_restgpr_23_x) |
203 | _GLOBAL(_rest32gpr_23_x) |
204 | lwz 23,-36(11) |
205 | _GLOBAL(_restgpr_24_x) |
206 | _GLOBAL(_rest32gpr_24_x) |
207 | lwz 24,-32(11) |
208 | _GLOBAL(_restgpr_25_x) |
209 | _GLOBAL(_rest32gpr_25_x) |
210 | lwz 25,-28(11) |
211 | _GLOBAL(_restgpr_26_x) |
212 | _GLOBAL(_rest32gpr_26_x) |
213 | lwz 26,-24(11) |
214 | _GLOBAL(_restgpr_27_x) |
215 | _GLOBAL(_rest32gpr_27_x) |
216 | lwz 27,-20(11) |
217 | _GLOBAL(_restgpr_28_x) |
218 | _GLOBAL(_rest32gpr_28_x) |
219 | lwz 28,-16(11) |
220 | _GLOBAL(_restgpr_29_x) |
221 | _GLOBAL(_rest32gpr_29_x) |
222 | lwz 29,-12(11) |
223 | _GLOBAL(_restgpr_30_x) |
224 | _GLOBAL(_rest32gpr_30_x) |
225 | lwz 30,-8(11) |
226 | _GLOBAL(_restgpr_31_x) |
227 | _GLOBAL(_rest32gpr_31_x) |
228 | lwz 0,4(11) |
229 | lwz 31,-4(11) |
230 | mtlr 0 |
231 | mr 1,11 |
232 | blr |
233 | |
234 | #ifdef CONFIG_ALTIVEC |
235 | /* Called with r0 pointing just beyond the end of the vector save area. */ |
236 | |
237 | _GLOBAL(_savevr_20) |
238 | li r11,-192 |
239 | stvx v20,r11,r0 |
240 | _GLOBAL(_savevr_21) |
241 | li r11,-176 |
242 | stvx v21,r11,r0 |
243 | _GLOBAL(_savevr_22) |
244 | li r11,-160 |
245 | stvx v22,r11,r0 |
246 | _GLOBAL(_savevr_23) |
247 | li r11,-144 |
248 | stvx v23,r11,r0 |
249 | _GLOBAL(_savevr_24) |
250 | li r11,-128 |
251 | stvx v24,r11,r0 |
252 | _GLOBAL(_savevr_25) |
253 | li r11,-112 |
254 | stvx v25,r11,r0 |
255 | _GLOBAL(_savevr_26) |
256 | li r11,-96 |
257 | stvx v26,r11,r0 |
258 | _GLOBAL(_savevr_27) |
259 | li r11,-80 |
260 | stvx v27,r11,r0 |
261 | _GLOBAL(_savevr_28) |
262 | li r11,-64 |
263 | stvx v28,r11,r0 |
264 | _GLOBAL(_savevr_29) |
265 | li r11,-48 |
266 | stvx v29,r11,r0 |
267 | _GLOBAL(_savevr_30) |
268 | li r11,-32 |
269 | stvx v30,r11,r0 |
270 | _GLOBAL(_savevr_31) |
271 | li r11,-16 |
272 | stvx v31,r11,r0 |
273 | blr |
274 | |
275 | _GLOBAL(_restvr_20) |
276 | li r11,-192 |
277 | lvx v20,r11,r0 |
278 | _GLOBAL(_restvr_21) |
279 | li r11,-176 |
280 | lvx v21,r11,r0 |
281 | _GLOBAL(_restvr_22) |
282 | li r11,-160 |
283 | lvx v22,r11,r0 |
284 | _GLOBAL(_restvr_23) |
285 | li r11,-144 |
286 | lvx v23,r11,r0 |
287 | _GLOBAL(_restvr_24) |
288 | li r11,-128 |
289 | lvx v24,r11,r0 |
290 | _GLOBAL(_restvr_25) |
291 | li r11,-112 |
292 | lvx v25,r11,r0 |
293 | _GLOBAL(_restvr_26) |
294 | li r11,-96 |
295 | lvx v26,r11,r0 |
296 | _GLOBAL(_restvr_27) |
297 | li r11,-80 |
298 | lvx v27,r11,r0 |
299 | _GLOBAL(_restvr_28) |
300 | li r11,-64 |
301 | lvx v28,r11,r0 |
302 | _GLOBAL(_restvr_29) |
303 | li r11,-48 |
304 | lvx v29,r11,r0 |
305 | _GLOBAL(_restvr_30) |
306 | li r11,-32 |
307 | lvx v30,r11,r0 |
308 | _GLOBAL(_restvr_31) |
309 | li r11,-16 |
310 | lvx v31,r11,r0 |
311 | blr |
312 | |
313 | #endif /* CONFIG_ALTIVEC */ |
314 | |
315 | #else /* CONFIG_PPC64 */ |
316 | |
317 | .globl _savegpr0_14 |
318 | _savegpr0_14: |
319 | std r14,-144(r1) |
320 | .globl _savegpr0_15 |
321 | _savegpr0_15: |
322 | std r15,-136(r1) |
323 | .globl _savegpr0_16 |
324 | _savegpr0_16: |
325 | std r16,-128(r1) |
326 | .globl _savegpr0_17 |
327 | _savegpr0_17: |
328 | std r17,-120(r1) |
329 | .globl _savegpr0_18 |
330 | _savegpr0_18: |
331 | std r18,-112(r1) |
332 | .globl _savegpr0_19 |
333 | _savegpr0_19: |
334 | std r19,-104(r1) |
335 | .globl _savegpr0_20 |
336 | _savegpr0_20: |
337 | std r20,-96(r1) |
338 | .globl _savegpr0_21 |
339 | _savegpr0_21: |
340 | std r21,-88(r1) |
341 | .globl _savegpr0_22 |
342 | _savegpr0_22: |
343 | std r22,-80(r1) |
344 | .globl _savegpr0_23 |
345 | _savegpr0_23: |
346 | std r23,-72(r1) |
347 | .globl _savegpr0_24 |
348 | _savegpr0_24: |
349 | std r24,-64(r1) |
350 | .globl _savegpr0_25 |
351 | _savegpr0_25: |
352 | std r25,-56(r1) |
353 | .globl _savegpr0_26 |
354 | _savegpr0_26: |
355 | std r26,-48(r1) |
356 | .globl _savegpr0_27 |
357 | _savegpr0_27: |
358 | std r27,-40(r1) |
359 | .globl _savegpr0_28 |
360 | _savegpr0_28: |
361 | std r28,-32(r1) |
362 | .globl _savegpr0_29 |
363 | _savegpr0_29: |
364 | std r29,-24(r1) |
365 | .globl _savegpr0_30 |
366 | _savegpr0_30: |
367 | std r30,-16(r1) |
368 | .globl _savegpr0_31 |
369 | _savegpr0_31: |
370 | std r31,-8(r1) |
371 | std r0,16(r1) |
372 | blr |
373 | |
374 | .globl _restgpr0_14 |
375 | _restgpr0_14: |
376 | ld r14,-144(r1) |
377 | .globl _restgpr0_15 |
378 | _restgpr0_15: |
379 | ld r15,-136(r1) |
380 | .globl _restgpr0_16 |
381 | _restgpr0_16: |
382 | ld r16,-128(r1) |
383 | .globl _restgpr0_17 |
384 | _restgpr0_17: |
385 | ld r17,-120(r1) |
386 | .globl _restgpr0_18 |
387 | _restgpr0_18: |
388 | ld r18,-112(r1) |
389 | .globl _restgpr0_19 |
390 | _restgpr0_19: |
391 | ld r19,-104(r1) |
392 | .globl _restgpr0_20 |
393 | _restgpr0_20: |
394 | ld r20,-96(r1) |
395 | .globl _restgpr0_21 |
396 | _restgpr0_21: |
397 | ld r21,-88(r1) |
398 | .globl _restgpr0_22 |
399 | _restgpr0_22: |
400 | ld r22,-80(r1) |
401 | .globl _restgpr0_23 |
402 | _restgpr0_23: |
403 | ld r23,-72(r1) |
404 | .globl _restgpr0_24 |
405 | _restgpr0_24: |
406 | ld r24,-64(r1) |
407 | .globl _restgpr0_25 |
408 | _restgpr0_25: |
409 | ld r25,-56(r1) |
410 | .globl _restgpr0_26 |
411 | _restgpr0_26: |
412 | ld r26,-48(r1) |
413 | .globl _restgpr0_27 |
414 | _restgpr0_27: |
415 | ld r27,-40(r1) |
416 | .globl _restgpr0_28 |
417 | _restgpr0_28: |
418 | ld r28,-32(r1) |
419 | .globl _restgpr0_29 |
420 | _restgpr0_29: |
421 | ld r0,16(r1) |
422 | ld r29,-24(r1) |
423 | mtlr r0 |
424 | ld r30,-16(r1) |
425 | ld r31,-8(r1) |
426 | blr |
427 | |
428 | .globl _restgpr0_30 |
429 | _restgpr0_30: |
430 | ld r30,-16(r1) |
431 | .globl _restgpr0_31 |
432 | _restgpr0_31: |
433 | ld r0,16(r1) |
434 | ld r31,-8(r1) |
435 | mtlr r0 |
436 | blr |
437 | |
438 | #ifdef CONFIG_ALTIVEC |
439 | /* Called with r0 pointing just beyond the end of the vector save area. */ |
440 | |
441 | .globl _savevr_20 |
442 | _savevr_20: |
443 | li r12,-192 |
444 | stvx v20,r12,r0 |
445 | .globl _savevr_21 |
446 | _savevr_21: |
447 | li r12,-176 |
448 | stvx v21,r12,r0 |
449 | .globl _savevr_22 |
450 | _savevr_22: |
451 | li r12,-160 |
452 | stvx v22,r12,r0 |
453 | .globl _savevr_23 |
454 | _savevr_23: |
455 | li r12,-144 |
456 | stvx v23,r12,r0 |
457 | .globl _savevr_24 |
458 | _savevr_24: |
459 | li r12,-128 |
460 | stvx v24,r12,r0 |
461 | .globl _savevr_25 |
462 | _savevr_25: |
463 | li r12,-112 |
464 | stvx v25,r12,r0 |
465 | .globl _savevr_26 |
466 | _savevr_26: |
467 | li r12,-96 |
468 | stvx v26,r12,r0 |
469 | .globl _savevr_27 |
470 | _savevr_27: |
471 | li r12,-80 |
472 | stvx v27,r12,r0 |
473 | .globl _savevr_28 |
474 | _savevr_28: |
475 | li r12,-64 |
476 | stvx v28,r12,r0 |
477 | .globl _savevr_29 |
478 | _savevr_29: |
479 | li r12,-48 |
480 | stvx v29,r12,r0 |
481 | .globl _savevr_30 |
482 | _savevr_30: |
483 | li r12,-32 |
484 | stvx v30,r12,r0 |
485 | .globl _savevr_31 |
486 | _savevr_31: |
487 | li r12,-16 |
488 | stvx v31,r12,r0 |
489 | blr |
490 | |
491 | .globl _restvr_20 |
492 | _restvr_20: |
493 | li r12,-192 |
494 | lvx v20,r12,r0 |
495 | .globl _restvr_21 |
496 | _restvr_21: |
497 | li r12,-176 |
498 | lvx v21,r12,r0 |
499 | .globl _restvr_22 |
500 | _restvr_22: |
501 | li r12,-160 |
502 | lvx v22,r12,r0 |
503 | .globl _restvr_23 |
504 | _restvr_23: |
505 | li r12,-144 |
506 | lvx v23,r12,r0 |
507 | .globl _restvr_24 |
508 | _restvr_24: |
509 | li r12,-128 |
510 | lvx v24,r12,r0 |
511 | .globl _restvr_25 |
512 | _restvr_25: |
513 | li r12,-112 |
514 | lvx v25,r12,r0 |
515 | .globl _restvr_26 |
516 | _restvr_26: |
517 | li r12,-96 |
518 | lvx v26,r12,r0 |
519 | .globl _restvr_27 |
520 | _restvr_27: |
521 | li r12,-80 |
522 | lvx v27,r12,r0 |
523 | .globl _restvr_28 |
524 | _restvr_28: |
525 | li r12,-64 |
526 | lvx v28,r12,r0 |
527 | .globl _restvr_29 |
528 | _restvr_29: |
529 | li r12,-48 |
530 | lvx v29,r12,r0 |
531 | .globl _restvr_30 |
532 | _restvr_30: |
533 | li r12,-32 |
534 | lvx v30,r12,r0 |
535 | .globl _restvr_31 |
536 | _restvr_31: |
537 | li r12,-16 |
538 | lvx v31,r12,r0 |
539 | blr |
540 | |
541 | #endif /* CONFIG_ALTIVEC */ |
542 | |
543 | #endif /* CONFIG_PPC64 */ |
544 | |
545 | #endif |
546 | |