Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/powerpc/lib/crtsavres.S
26424 views
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 __powerpc64__
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
547