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 | * |
10 | * This file is free software; you can redistribute it and/or modify it |
11 | * under the terms of the GNU General Public License as published by the |
12 | * Free Software Foundation; either version 2, or (at your option) any |
13 | * later version. |
14 | * |
15 | * In addition to the permissions in the GNU General Public License, the |
16 | * Free Software Foundation gives you unlimited permission to link the |
17 | * compiled version of this file with other programs, and to distribute |
18 | * those programs without any restriction coming from the use of this |
19 | * file. (The General Public License restrictions do apply in other |
20 | * respects; for example, they cover modification of the file, and |
21 | * distribution when not linked into another program.) |
22 | * |
23 | * This file is distributed in the hope that it will be useful, but |
24 | * WITHOUT ANY WARRANTY; without even the implied warranty of |
25 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
26 | * General Public License for more details. |
27 | * |
28 | * You should have received a copy of the GNU General Public License |
29 | * along with this program; see the file COPYING. If not, write to |
30 | * the Free Software Foundation, 51 Franklin Street, Fifth Floor, |
31 | * Boston, MA 02110-1301, USA. |
32 | * |
33 | * As a special exception, if you link this library with files |
34 | * compiled with GCC to produce an executable, this does not cause |
35 | * the resulting executable to be covered by the GNU General Public License. |
36 | * This exception does not however invalidate any other reasons why |
37 | * the executable file might be covered by the GNU General Public License. |
38 | */ |
39 | |
40 | #ifdef __powerpc64__ |
41 | #error "On PPC64, FPR save/restore functions are provided by the linker." |
42 | #endif |
43 | |
44 | .file "crtsavres.S" |
45 | .section ".text" |
46 | |
47 | #define _GLOBAL(name) \ |
48 | .type name,@function; \ |
49 | .globl name; \ |
50 | name: |
51 | |
52 | /* Routines for saving integer registers, called by the compiler. */ |
53 | /* Called with r11 pointing to the stack header word of the caller of the */ |
54 | /* function, just beyond the end of the integer save area. */ |
55 | |
56 | _GLOBAL(_savegpr_14) |
57 | _GLOBAL(_save32gpr_14) |
58 | stw 14,-72(11) /* save gp registers */ |
59 | _GLOBAL(_savegpr_15) |
60 | _GLOBAL(_save32gpr_15) |
61 | stw 15,-68(11) |
62 | _GLOBAL(_savegpr_16) |
63 | _GLOBAL(_save32gpr_16) |
64 | stw 16,-64(11) |
65 | _GLOBAL(_savegpr_17) |
66 | _GLOBAL(_save32gpr_17) |
67 | stw 17,-60(11) |
68 | _GLOBAL(_savegpr_18) |
69 | _GLOBAL(_save32gpr_18) |
70 | stw 18,-56(11) |
71 | _GLOBAL(_savegpr_19) |
72 | _GLOBAL(_save32gpr_19) |
73 | stw 19,-52(11) |
74 | _GLOBAL(_savegpr_20) |
75 | _GLOBAL(_save32gpr_20) |
76 | stw 20,-48(11) |
77 | _GLOBAL(_savegpr_21) |
78 | _GLOBAL(_save32gpr_21) |
79 | stw 21,-44(11) |
80 | _GLOBAL(_savegpr_22) |
81 | _GLOBAL(_save32gpr_22) |
82 | stw 22,-40(11) |
83 | _GLOBAL(_savegpr_23) |
84 | _GLOBAL(_save32gpr_23) |
85 | stw 23,-36(11) |
86 | _GLOBAL(_savegpr_24) |
87 | _GLOBAL(_save32gpr_24) |
88 | stw 24,-32(11) |
89 | _GLOBAL(_savegpr_25) |
90 | _GLOBAL(_save32gpr_25) |
91 | stw 25,-28(11) |
92 | _GLOBAL(_savegpr_26) |
93 | _GLOBAL(_save32gpr_26) |
94 | stw 26,-24(11) |
95 | _GLOBAL(_savegpr_27) |
96 | _GLOBAL(_save32gpr_27) |
97 | stw 27,-20(11) |
98 | _GLOBAL(_savegpr_28) |
99 | _GLOBAL(_save32gpr_28) |
100 | stw 28,-16(11) |
101 | _GLOBAL(_savegpr_29) |
102 | _GLOBAL(_save32gpr_29) |
103 | stw 29,-12(11) |
104 | _GLOBAL(_savegpr_30) |
105 | _GLOBAL(_save32gpr_30) |
106 | stw 30,-8(11) |
107 | _GLOBAL(_savegpr_31) |
108 | _GLOBAL(_save32gpr_31) |
109 | stw 31,-4(11) |
110 | blr |
111 | |
112 | /* Routines for restoring integer registers, called by the compiler. */ |
113 | /* Called with r11 pointing to the stack header word of the caller of the */ |
114 | /* function, just beyond the end of the integer restore area. */ |
115 | |
116 | _GLOBAL(_restgpr_14) |
117 | _GLOBAL(_rest32gpr_14) |
118 | lwz 14,-72(11) /* restore gp registers */ |
119 | _GLOBAL(_restgpr_15) |
120 | _GLOBAL(_rest32gpr_15) |
121 | lwz 15,-68(11) |
122 | _GLOBAL(_restgpr_16) |
123 | _GLOBAL(_rest32gpr_16) |
124 | lwz 16,-64(11) |
125 | _GLOBAL(_restgpr_17) |
126 | _GLOBAL(_rest32gpr_17) |
127 | lwz 17,-60(11) |
128 | _GLOBAL(_restgpr_18) |
129 | _GLOBAL(_rest32gpr_18) |
130 | lwz 18,-56(11) |
131 | _GLOBAL(_restgpr_19) |
132 | _GLOBAL(_rest32gpr_19) |
133 | lwz 19,-52(11) |
134 | _GLOBAL(_restgpr_20) |
135 | _GLOBAL(_rest32gpr_20) |
136 | lwz 20,-48(11) |
137 | _GLOBAL(_restgpr_21) |
138 | _GLOBAL(_rest32gpr_21) |
139 | lwz 21,-44(11) |
140 | _GLOBAL(_restgpr_22) |
141 | _GLOBAL(_rest32gpr_22) |
142 | lwz 22,-40(11) |
143 | _GLOBAL(_restgpr_23) |
144 | _GLOBAL(_rest32gpr_23) |
145 | lwz 23,-36(11) |
146 | _GLOBAL(_restgpr_24) |
147 | _GLOBAL(_rest32gpr_24) |
148 | lwz 24,-32(11) |
149 | _GLOBAL(_restgpr_25) |
150 | _GLOBAL(_rest32gpr_25) |
151 | lwz 25,-28(11) |
152 | _GLOBAL(_restgpr_26) |
153 | _GLOBAL(_rest32gpr_26) |
154 | lwz 26,-24(11) |
155 | _GLOBAL(_restgpr_27) |
156 | _GLOBAL(_rest32gpr_27) |
157 | lwz 27,-20(11) |
158 | _GLOBAL(_restgpr_28) |
159 | _GLOBAL(_rest32gpr_28) |
160 | lwz 28,-16(11) |
161 | _GLOBAL(_restgpr_29) |
162 | _GLOBAL(_rest32gpr_29) |
163 | lwz 29,-12(11) |
164 | _GLOBAL(_restgpr_30) |
165 | _GLOBAL(_rest32gpr_30) |
166 | lwz 30,-8(11) |
167 | _GLOBAL(_restgpr_31) |
168 | _GLOBAL(_rest32gpr_31) |
169 | lwz 31,-4(11) |
170 | blr |
171 | |
172 | /* Routines for restoring integer registers, called by the compiler. */ |
173 | /* Called with r11 pointing to the stack header word of the caller of the */ |
174 | /* function, just beyond the end of the integer restore area. */ |
175 | |
176 | _GLOBAL(_restgpr_14_x) |
177 | _GLOBAL(_rest32gpr_14_x) |
178 | lwz 14,-72(11) /* restore gp registers */ |
179 | _GLOBAL(_restgpr_15_x) |
180 | _GLOBAL(_rest32gpr_15_x) |
181 | lwz 15,-68(11) |
182 | _GLOBAL(_restgpr_16_x) |
183 | _GLOBAL(_rest32gpr_16_x) |
184 | lwz 16,-64(11) |
185 | _GLOBAL(_restgpr_17_x) |
186 | _GLOBAL(_rest32gpr_17_x) |
187 | lwz 17,-60(11) |
188 | _GLOBAL(_restgpr_18_x) |
189 | _GLOBAL(_rest32gpr_18_x) |
190 | lwz 18,-56(11) |
191 | _GLOBAL(_restgpr_19_x) |
192 | _GLOBAL(_rest32gpr_19_x) |
193 | lwz 19,-52(11) |
194 | _GLOBAL(_restgpr_20_x) |
195 | _GLOBAL(_rest32gpr_20_x) |
196 | lwz 20,-48(11) |
197 | _GLOBAL(_restgpr_21_x) |
198 | _GLOBAL(_rest32gpr_21_x) |
199 | lwz 21,-44(11) |
200 | _GLOBAL(_restgpr_22_x) |
201 | _GLOBAL(_rest32gpr_22_x) |
202 | lwz 22,-40(11) |
203 | _GLOBAL(_restgpr_23_x) |
204 | _GLOBAL(_rest32gpr_23_x) |
205 | lwz 23,-36(11) |
206 | _GLOBAL(_restgpr_24_x) |
207 | _GLOBAL(_rest32gpr_24_x) |
208 | lwz 24,-32(11) |
209 | _GLOBAL(_restgpr_25_x) |
210 | _GLOBAL(_rest32gpr_25_x) |
211 | lwz 25,-28(11) |
212 | _GLOBAL(_restgpr_26_x) |
213 | _GLOBAL(_rest32gpr_26_x) |
214 | lwz 26,-24(11) |
215 | _GLOBAL(_restgpr_27_x) |
216 | _GLOBAL(_rest32gpr_27_x) |
217 | lwz 27,-20(11) |
218 | _GLOBAL(_restgpr_28_x) |
219 | _GLOBAL(_rest32gpr_28_x) |
220 | lwz 28,-16(11) |
221 | _GLOBAL(_restgpr_29_x) |
222 | _GLOBAL(_rest32gpr_29_x) |
223 | lwz 29,-12(11) |
224 | _GLOBAL(_restgpr_30_x) |
225 | _GLOBAL(_rest32gpr_30_x) |
226 | lwz 30,-8(11) |
227 | _GLOBAL(_restgpr_31_x) |
228 | _GLOBAL(_rest32gpr_31_x) |
229 | lwz 0,4(11) |
230 | lwz 31,-4(11) |
231 | mtlr 0 |
232 | mr 1,11 |
233 | blr |
234 | |