annotate libffi/src/powerpc/aix.S @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* -----------------------------------------------------------------------
kono
parents:
diff changeset
2 aix.S - Copyright (c) 2002, 2009 Free Software Foundation, Inc.
kono
parents:
diff changeset
3 based on darwin.S by John Hornkvist
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 PowerPC Assembly glue.
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 Permission is hereby granted, free of charge, to any person obtaining
kono
parents:
diff changeset
8 a copy of this software and associated documentation files (the
kono
parents:
diff changeset
9 ``Software''), to deal in the Software without restriction, including
kono
parents:
diff changeset
10 without limitation the rights to use, copy, modify, merge, publish,
kono
parents:
diff changeset
11 distribute, sublicense, and/or sell copies of the Software, and to
kono
parents:
diff changeset
12 permit persons to whom the Software is furnished to do so, subject to
kono
parents:
diff changeset
13 the following conditions:
kono
parents:
diff changeset
14
kono
parents:
diff changeset
15 The above copyright notice and this permission notice shall be included
kono
parents:
diff changeset
16 in all copies or substantial portions of the Software.
kono
parents:
diff changeset
17
kono
parents:
diff changeset
18 THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
kono
parents:
diff changeset
19 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
kono
parents:
diff changeset
20 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
kono
parents:
diff changeset
21 IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
kono
parents:
diff changeset
22 OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
kono
parents:
diff changeset
23 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
kono
parents:
diff changeset
24 OTHER DEALINGS IN THE SOFTWARE.
kono
parents:
diff changeset
25 ----------------------------------------------------------------------- */
kono
parents:
diff changeset
26
kono
parents:
diff changeset
27 .set r0,0
kono
parents:
diff changeset
28 .set r1,1
kono
parents:
diff changeset
29 .set r2,2
kono
parents:
diff changeset
30 .set r3,3
kono
parents:
diff changeset
31 .set r4,4
kono
parents:
diff changeset
32 .set r5,5
kono
parents:
diff changeset
33 .set r6,6
kono
parents:
diff changeset
34 .set r7,7
kono
parents:
diff changeset
35 .set r8,8
kono
parents:
diff changeset
36 .set r9,9
kono
parents:
diff changeset
37 .set r10,10
kono
parents:
diff changeset
38 .set r11,11
kono
parents:
diff changeset
39 .set r12,12
kono
parents:
diff changeset
40 .set r13,13
kono
parents:
diff changeset
41 .set r14,14
kono
parents:
diff changeset
42 .set r15,15
kono
parents:
diff changeset
43 .set r16,16
kono
parents:
diff changeset
44 .set r17,17
kono
parents:
diff changeset
45 .set r18,18
kono
parents:
diff changeset
46 .set r19,19
kono
parents:
diff changeset
47 .set r20,20
kono
parents:
diff changeset
48 .set r21,21
kono
parents:
diff changeset
49 .set r22,22
kono
parents:
diff changeset
50 .set r23,23
kono
parents:
diff changeset
51 .set r24,24
kono
parents:
diff changeset
52 .set r25,25
kono
parents:
diff changeset
53 .set r26,26
kono
parents:
diff changeset
54 .set r27,27
kono
parents:
diff changeset
55 .set r28,28
kono
parents:
diff changeset
56 .set r29,29
kono
parents:
diff changeset
57 .set r30,30
kono
parents:
diff changeset
58 .set r31,31
kono
parents:
diff changeset
59 .set f0,0
kono
parents:
diff changeset
60 .set f1,1
kono
parents:
diff changeset
61 .set f2,2
kono
parents:
diff changeset
62 .set f3,3
kono
parents:
diff changeset
63 .set f4,4
kono
parents:
diff changeset
64 .set f5,5
kono
parents:
diff changeset
65 .set f6,6
kono
parents:
diff changeset
66 .set f7,7
kono
parents:
diff changeset
67 .set f8,8
kono
parents:
diff changeset
68 .set f9,9
kono
parents:
diff changeset
69 .set f10,10
kono
parents:
diff changeset
70 .set f11,11
kono
parents:
diff changeset
71 .set f12,12
kono
parents:
diff changeset
72 .set f13,13
kono
parents:
diff changeset
73 .set f14,14
kono
parents:
diff changeset
74 .set f15,15
kono
parents:
diff changeset
75 .set f16,16
kono
parents:
diff changeset
76 .set f17,17
kono
parents:
diff changeset
77 .set f18,18
kono
parents:
diff changeset
78 .set f19,19
kono
parents:
diff changeset
79 .set f20,20
kono
parents:
diff changeset
80 .set f21,21
kono
parents:
diff changeset
81
kono
parents:
diff changeset
82 .extern .ffi_prep_args
kono
parents:
diff changeset
83
kono
parents:
diff changeset
84 #define LIBFFI_ASM
kono
parents:
diff changeset
85 #include <fficonfig.h>
kono
parents:
diff changeset
86 #include <ffi.h>
kono
parents:
diff changeset
87 #define JUMPTARGET(name) name
kono
parents:
diff changeset
88 #define L(x) x
kono
parents:
diff changeset
89 .file "aix.S"
kono
parents:
diff changeset
90 .toc
kono
parents:
diff changeset
91
kono
parents:
diff changeset
92 /* void ffi_call_AIX(extended_cif *ecif, unsigned long bytes,
kono
parents:
diff changeset
93 * unsigned int flags, unsigned int *rvalue,
kono
parents:
diff changeset
94 * void (*fn)(),
kono
parents:
diff changeset
95 * void (*prep_args)(extended_cif*, unsigned *const));
kono
parents:
diff changeset
96 * r3=ecif, r4=bytes, r5=flags, r6=rvalue, r7=fn, r8=prep_args
kono
parents:
diff changeset
97 */
kono
parents:
diff changeset
98
kono
parents:
diff changeset
99 .csect .text[PR]
kono
parents:
diff changeset
100 .align 2
kono
parents:
diff changeset
101 .globl ffi_call_AIX
kono
parents:
diff changeset
102 .globl .ffi_call_AIX
kono
parents:
diff changeset
103 .csect ffi_call_AIX[DS]
kono
parents:
diff changeset
104 ffi_call_AIX:
kono
parents:
diff changeset
105 #ifdef __64BIT__
kono
parents:
diff changeset
106 .llong .ffi_call_AIX, TOC[tc0], 0
kono
parents:
diff changeset
107 .csect .text[PR]
kono
parents:
diff changeset
108 .ffi_call_AIX:
kono
parents:
diff changeset
109 .function .ffi_call_AIX,.ffi_call_AIX,16,044,LFE..0-LFB..0
kono
parents:
diff changeset
110 .bf __LINE__
kono
parents:
diff changeset
111 .line 1
kono
parents:
diff changeset
112 LFB..0:
kono
parents:
diff changeset
113 /* Save registers we use. */
kono
parents:
diff changeset
114 mflr r0
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 std r28,-32(r1)
kono
parents:
diff changeset
117 std r29,-24(r1)
kono
parents:
diff changeset
118 std r30,-16(r1)
kono
parents:
diff changeset
119 std r31, -8(r1)
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121 std r0, 16(r1)
kono
parents:
diff changeset
122 LCFI..0:
kono
parents:
diff changeset
123 mr r28, r1 /* our AP. */
kono
parents:
diff changeset
124 stdux r1, r1, r4
kono
parents:
diff changeset
125 LCFI..1:
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 /* Save arguments over call... */
kono
parents:
diff changeset
128 mr r31, r5 /* flags, */
kono
parents:
diff changeset
129 mr r30, r6 /* rvalue, */
kono
parents:
diff changeset
130 mr r29, r7 /* function address. */
kono
parents:
diff changeset
131 std r2, 40(r1)
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 /* Call ffi_prep_args. */
kono
parents:
diff changeset
134 mr r4, r1
kono
parents:
diff changeset
135 bl .ffi_prep_args
kono
parents:
diff changeset
136 nop
kono
parents:
diff changeset
137
kono
parents:
diff changeset
138 /* Now do the call. */
kono
parents:
diff changeset
139 ld r0, 0(r29)
kono
parents:
diff changeset
140 ld r2, 8(r29)
kono
parents:
diff changeset
141 ld r11, 16(r29)
kono
parents:
diff changeset
142 /* Set up cr1 with bits 4-7 of the flags. */
kono
parents:
diff changeset
143 mtcrf 0x40, r31
kono
parents:
diff changeset
144 mtctr r0
kono
parents:
diff changeset
145 /* Load all those argument registers. */
kono
parents:
diff changeset
146 /* We have set up a nice stack frame, just load it into registers. */
kono
parents:
diff changeset
147 ld r3, 40+(1*8)(r1)
kono
parents:
diff changeset
148 ld r4, 40+(2*8)(r1)
kono
parents:
diff changeset
149 ld r5, 40+(3*8)(r1)
kono
parents:
diff changeset
150 ld r6, 40+(4*8)(r1)
kono
parents:
diff changeset
151 nop
kono
parents:
diff changeset
152 ld r7, 40+(5*8)(r1)
kono
parents:
diff changeset
153 ld r8, 40+(6*8)(r1)
kono
parents:
diff changeset
154 ld r9, 40+(7*8)(r1)
kono
parents:
diff changeset
155 ld r10,40+(8*8)(r1)
kono
parents:
diff changeset
156
kono
parents:
diff changeset
157 L1:
kono
parents:
diff changeset
158 /* Load all the FP registers. */
kono
parents:
diff changeset
159 bf 6,L2 /* 2f + 0x18 */
kono
parents:
diff changeset
160 lfd f1,-32-(13*8)(r28)
kono
parents:
diff changeset
161 lfd f2,-32-(12*8)(r28)
kono
parents:
diff changeset
162 lfd f3,-32-(11*8)(r28)
kono
parents:
diff changeset
163 lfd f4,-32-(10*8)(r28)
kono
parents:
diff changeset
164 nop
kono
parents:
diff changeset
165 lfd f5,-32-(9*8)(r28)
kono
parents:
diff changeset
166 lfd f6,-32-(8*8)(r28)
kono
parents:
diff changeset
167 lfd f7,-32-(7*8)(r28)
kono
parents:
diff changeset
168 lfd f8,-32-(6*8)(r28)
kono
parents:
diff changeset
169 nop
kono
parents:
diff changeset
170 lfd f9,-32-(5*8)(r28)
kono
parents:
diff changeset
171 lfd f10,-32-(4*8)(r28)
kono
parents:
diff changeset
172 lfd f11,-32-(3*8)(r28)
kono
parents:
diff changeset
173 lfd f12,-32-(2*8)(r28)
kono
parents:
diff changeset
174 nop
kono
parents:
diff changeset
175 lfd f13,-32-(1*8)(r28)
kono
parents:
diff changeset
176
kono
parents:
diff changeset
177 L2:
kono
parents:
diff changeset
178 /* Make the call. */
kono
parents:
diff changeset
179 bctrl
kono
parents:
diff changeset
180 ld r2, 40(r1)
kono
parents:
diff changeset
181
kono
parents:
diff changeset
182 /* Now, deal with the return value. */
kono
parents:
diff changeset
183 mtcrf 0x01, r31
kono
parents:
diff changeset
184
kono
parents:
diff changeset
185 bt 30, L(done_return_value)
kono
parents:
diff changeset
186 bt 29, L(fp_return_value)
kono
parents:
diff changeset
187 std r3, 0(r30)
kono
parents:
diff changeset
188
kono
parents:
diff changeset
189 /* Fall through... */
kono
parents:
diff changeset
190
kono
parents:
diff changeset
191 L(done_return_value):
kono
parents:
diff changeset
192 /* Restore the registers we used and return. */
kono
parents:
diff changeset
193 mr r1, r28
kono
parents:
diff changeset
194 ld r0, 16(r28)
kono
parents:
diff changeset
195 ld r28, -32(r1)
kono
parents:
diff changeset
196 mtlr r0
kono
parents:
diff changeset
197 ld r29, -24(r1)
kono
parents:
diff changeset
198 ld r30, -16(r1)
kono
parents:
diff changeset
199 ld r31, -8(r1)
kono
parents:
diff changeset
200 blr
kono
parents:
diff changeset
201
kono
parents:
diff changeset
202 L(fp_return_value):
kono
parents:
diff changeset
203 bf 28, L(float_return_value)
kono
parents:
diff changeset
204 stfd f1, 0(r30)
kono
parents:
diff changeset
205 bf 31, L(done_return_value)
kono
parents:
diff changeset
206 stfd f2, 8(r30)
kono
parents:
diff changeset
207 b L(done_return_value)
kono
parents:
diff changeset
208 L(float_return_value):
kono
parents:
diff changeset
209 stfs f1, 0(r30)
kono
parents:
diff changeset
210 b L(done_return_value)
kono
parents:
diff changeset
211 LFE..0:
kono
parents:
diff changeset
212 #else /* ! __64BIT__ */
kono
parents:
diff changeset
213
kono
parents:
diff changeset
214 .long .ffi_call_AIX, TOC[tc0], 0
kono
parents:
diff changeset
215 .csect .text[PR]
kono
parents:
diff changeset
216 .ffi_call_AIX:
kono
parents:
diff changeset
217 .function .ffi_call_AIX,.ffi_call_AIX,16,044,LFE..0-LFB..0
kono
parents:
diff changeset
218 .bf __LINE__
kono
parents:
diff changeset
219 .line 1
kono
parents:
diff changeset
220 LFB..0:
kono
parents:
diff changeset
221 /* Save registers we use. */
kono
parents:
diff changeset
222 mflr r0
kono
parents:
diff changeset
223
kono
parents:
diff changeset
224 stw r28,-16(r1)
kono
parents:
diff changeset
225 stw r29,-12(r1)
kono
parents:
diff changeset
226 stw r30, -8(r1)
kono
parents:
diff changeset
227 stw r31, -4(r1)
kono
parents:
diff changeset
228
kono
parents:
diff changeset
229 stw r0, 8(r1)
kono
parents:
diff changeset
230 LCFI..0:
kono
parents:
diff changeset
231 mr r28, r1 /* out AP. */
kono
parents:
diff changeset
232 stwux r1, r1, r4
kono
parents:
diff changeset
233 LCFI..1:
kono
parents:
diff changeset
234
kono
parents:
diff changeset
235 /* Save arguments over call... */
kono
parents:
diff changeset
236 mr r31, r5 /* flags, */
kono
parents:
diff changeset
237 mr r30, r6 /* rvalue, */
kono
parents:
diff changeset
238 mr r29, r7 /* function address, */
kono
parents:
diff changeset
239 stw r2, 20(r1)
kono
parents:
diff changeset
240
kono
parents:
diff changeset
241 /* Call ffi_prep_args. */
kono
parents:
diff changeset
242 mr r4, r1
kono
parents:
diff changeset
243 bl .ffi_prep_args
kono
parents:
diff changeset
244 nop
kono
parents:
diff changeset
245
kono
parents:
diff changeset
246 /* Now do the call. */
kono
parents:
diff changeset
247 lwz r0, 0(r29)
kono
parents:
diff changeset
248 lwz r2, 4(r29)
kono
parents:
diff changeset
249 lwz r11, 8(r29)
kono
parents:
diff changeset
250 /* Set up cr1 with bits 4-7 of the flags. */
kono
parents:
diff changeset
251 mtcrf 0x40, r31
kono
parents:
diff changeset
252 mtctr r0
kono
parents:
diff changeset
253 /* Load all those argument registers. */
kono
parents:
diff changeset
254 /* We have set up a nice stack frame, just load it into registers. */
kono
parents:
diff changeset
255 lwz r3, 20+(1*4)(r1)
kono
parents:
diff changeset
256 lwz r4, 20+(2*4)(r1)
kono
parents:
diff changeset
257 lwz r5, 20+(3*4)(r1)
kono
parents:
diff changeset
258 lwz r6, 20+(4*4)(r1)
kono
parents:
diff changeset
259 nop
kono
parents:
diff changeset
260 lwz r7, 20+(5*4)(r1)
kono
parents:
diff changeset
261 lwz r8, 20+(6*4)(r1)
kono
parents:
diff changeset
262 lwz r9, 20+(7*4)(r1)
kono
parents:
diff changeset
263 lwz r10,20+(8*4)(r1)
kono
parents:
diff changeset
264
kono
parents:
diff changeset
265 L1:
kono
parents:
diff changeset
266 /* Load all the FP registers. */
kono
parents:
diff changeset
267 bf 6,L2 /* 2f + 0x18 */
kono
parents:
diff changeset
268 lfd f1,-16-(13*8)(r28)
kono
parents:
diff changeset
269 lfd f2,-16-(12*8)(r28)
kono
parents:
diff changeset
270 lfd f3,-16-(11*8)(r28)
kono
parents:
diff changeset
271 lfd f4,-16-(10*8)(r28)
kono
parents:
diff changeset
272 nop
kono
parents:
diff changeset
273 lfd f5,-16-(9*8)(r28)
kono
parents:
diff changeset
274 lfd f6,-16-(8*8)(r28)
kono
parents:
diff changeset
275 lfd f7,-16-(7*8)(r28)
kono
parents:
diff changeset
276 lfd f8,-16-(6*8)(r28)
kono
parents:
diff changeset
277 nop
kono
parents:
diff changeset
278 lfd f9,-16-(5*8)(r28)
kono
parents:
diff changeset
279 lfd f10,-16-(4*8)(r28)
kono
parents:
diff changeset
280 lfd f11,-16-(3*8)(r28)
kono
parents:
diff changeset
281 lfd f12,-16-(2*8)(r28)
kono
parents:
diff changeset
282 nop
kono
parents:
diff changeset
283 lfd f13,-16-(1*8)(r28)
kono
parents:
diff changeset
284
kono
parents:
diff changeset
285 L2:
kono
parents:
diff changeset
286 /* Make the call. */
kono
parents:
diff changeset
287 bctrl
kono
parents:
diff changeset
288 lwz r2, 20(r1)
kono
parents:
diff changeset
289
kono
parents:
diff changeset
290 /* Now, deal with the return value. */
kono
parents:
diff changeset
291 mtcrf 0x01, r31
kono
parents:
diff changeset
292
kono
parents:
diff changeset
293 bt 30, L(done_return_value)
kono
parents:
diff changeset
294 bt 29, L(fp_return_value)
kono
parents:
diff changeset
295 stw r3, 0(r30)
kono
parents:
diff changeset
296 bf 28, L(done_return_value)
kono
parents:
diff changeset
297 stw r4, 4(r30)
kono
parents:
diff changeset
298
kono
parents:
diff changeset
299 /* Fall through... */
kono
parents:
diff changeset
300
kono
parents:
diff changeset
301 L(done_return_value):
kono
parents:
diff changeset
302 /* Restore the registers we used and return. */
kono
parents:
diff changeset
303 mr r1, r28
kono
parents:
diff changeset
304 lwz r0, 8(r28)
kono
parents:
diff changeset
305 lwz r28,-16(r1)
kono
parents:
diff changeset
306 mtlr r0
kono
parents:
diff changeset
307 lwz r29,-12(r1)
kono
parents:
diff changeset
308 lwz r30, -8(r1)
kono
parents:
diff changeset
309 lwz r31, -4(r1)
kono
parents:
diff changeset
310 blr
kono
parents:
diff changeset
311
kono
parents:
diff changeset
312 L(fp_return_value):
kono
parents:
diff changeset
313 bf 28, L(float_return_value)
kono
parents:
diff changeset
314 stfd f1, 0(r30)
kono
parents:
diff changeset
315 b L(done_return_value)
kono
parents:
diff changeset
316 L(float_return_value):
kono
parents:
diff changeset
317 stfs f1, 0(r30)
kono
parents:
diff changeset
318 b L(done_return_value)
kono
parents:
diff changeset
319 LFE..0:
kono
parents:
diff changeset
320 #endif
kono
parents:
diff changeset
321 .ef __LINE__
kono
parents:
diff changeset
322 .long 0
kono
parents:
diff changeset
323 .byte 0,0,0,1,128,4,0,0
kono
parents:
diff changeset
324 /* END(ffi_call_AIX) */
kono
parents:
diff changeset
325
kono
parents:
diff changeset
326 /* void ffi_call_go_AIX(extended_cif *ecif, unsigned long bytes,
kono
parents:
diff changeset
327 * unsigned int flags, unsigned int *rvalue,
kono
parents:
diff changeset
328 * void (*fn)(),
kono
parents:
diff changeset
329 * void (*prep_args)(extended_cif*, unsigned *const),
kono
parents:
diff changeset
330 * void *closure);
kono
parents:
diff changeset
331 * r3=ecif, r4=bytes, r5=flags, r6=rvalue, r7=fn, r8=prep_args, r9=closure
kono
parents:
diff changeset
332 */
kono
parents:
diff changeset
333
kono
parents:
diff changeset
334 .csect .text[PR]
kono
parents:
diff changeset
335 .align 2
kono
parents:
diff changeset
336 .globl ffi_call_go_AIX
kono
parents:
diff changeset
337 .globl .ffi_call_go_AIX
kono
parents:
diff changeset
338 .csect ffi_call_go_AIX[DS]
kono
parents:
diff changeset
339 ffi_call_go_AIX:
kono
parents:
diff changeset
340 #ifdef __64BIT__
kono
parents:
diff changeset
341 .llong .ffi_call_go_AIX, TOC[tc0], 0
kono
parents:
diff changeset
342 .csect .text[PR]
kono
parents:
diff changeset
343 .ffi_call_go_AIX:
kono
parents:
diff changeset
344 .function .ffi_call_go_AIX,.ffi_call_go_AIX,16,044,LFE..1-LFB..1
kono
parents:
diff changeset
345 .bf __LINE__
kono
parents:
diff changeset
346 .line 1
kono
parents:
diff changeset
347 LFB..1:
kono
parents:
diff changeset
348 /* Save registers we use. */
kono
parents:
diff changeset
349 mflr r0
kono
parents:
diff changeset
350
kono
parents:
diff changeset
351 std r28,-32(r1)
kono
parents:
diff changeset
352 std r29,-24(r1)
kono
parents:
diff changeset
353 std r30,-16(r1)
kono
parents:
diff changeset
354 std r31, -8(r1)
kono
parents:
diff changeset
355
kono
parents:
diff changeset
356 std r9, 8(r1) /* closure, saved in cr field. */
kono
parents:
diff changeset
357 std r0, 16(r1)
kono
parents:
diff changeset
358 LCFI..2:
kono
parents:
diff changeset
359 mr r28, r1 /* our AP. */
kono
parents:
diff changeset
360 stdux r1, r1, r4
kono
parents:
diff changeset
361 LCFI..3:
kono
parents:
diff changeset
362
kono
parents:
diff changeset
363 /* Save arguments over call... */
kono
parents:
diff changeset
364 mr r31, r5 /* flags, */
kono
parents:
diff changeset
365 mr r30, r6 /* rvalue, */
kono
parents:
diff changeset
366 mr r29, r7 /* function address, */
kono
parents:
diff changeset
367 std r2, 40(r1)
kono
parents:
diff changeset
368
kono
parents:
diff changeset
369 /* Call ffi_prep_args. */
kono
parents:
diff changeset
370 mr r4, r1
kono
parents:
diff changeset
371 bl .ffi_prep_args
kono
parents:
diff changeset
372 nop
kono
parents:
diff changeset
373
kono
parents:
diff changeset
374 /* Now do the call. */
kono
parents:
diff changeset
375 ld r0, 0(r29)
kono
parents:
diff changeset
376 ld r2, 8(r29)
kono
parents:
diff changeset
377 ld r11, 8(r28) /* closure */
kono
parents:
diff changeset
378 /* Set up cr1 with bits 4-7 of the flags. */
kono
parents:
diff changeset
379 mtcrf 0x40, r31
kono
parents:
diff changeset
380 mtctr r0
kono
parents:
diff changeset
381 /* Load all those argument registers. */
kono
parents:
diff changeset
382 /* We have set up a nice stack frame, just load it into registers. */
kono
parents:
diff changeset
383 ld r3, 40+(1*8)(r1)
kono
parents:
diff changeset
384 ld r4, 40+(2*8)(r1)
kono
parents:
diff changeset
385 ld r5, 40+(3*8)(r1)
kono
parents:
diff changeset
386 ld r6, 40+(4*8)(r1)
kono
parents:
diff changeset
387 nop
kono
parents:
diff changeset
388 ld r7, 40+(5*8)(r1)
kono
parents:
diff changeset
389 ld r8, 40+(6*8)(r1)
kono
parents:
diff changeset
390 ld r9, 40+(7*8)(r1)
kono
parents:
diff changeset
391 ld r10,40+(8*8)(r1)
kono
parents:
diff changeset
392
kono
parents:
diff changeset
393 b L1
kono
parents:
diff changeset
394 LFE..1:
kono
parents:
diff changeset
395 #else /* ! __64BIT__ */
kono
parents:
diff changeset
396
kono
parents:
diff changeset
397 .long .ffi_call_go_AIX, TOC[tc0], 0
kono
parents:
diff changeset
398 .csect .text[PR]
kono
parents:
diff changeset
399 .ffi_call_go_AIX:
kono
parents:
diff changeset
400 .function .ffi_call_go_AIX,.ffi_call_go_AIX,16,044,LFE..1-LFB..1
kono
parents:
diff changeset
401 .bf __LINE__
kono
parents:
diff changeset
402 .line 1
kono
parents:
diff changeset
403 /* Save registers we use. */
kono
parents:
diff changeset
404 LFB..1:
kono
parents:
diff changeset
405 mflr r0
kono
parents:
diff changeset
406
kono
parents:
diff changeset
407 stw r28,-16(r1)
kono
parents:
diff changeset
408 stw r29,-12(r1)
kono
parents:
diff changeset
409 stw r30, -8(r1)
kono
parents:
diff changeset
410 stw r31, -4(r1)
kono
parents:
diff changeset
411
kono
parents:
diff changeset
412 stw r9, 4(r1) /* closure, saved in cr field. */
kono
parents:
diff changeset
413 stw r0, 8(r1)
kono
parents:
diff changeset
414 LCFI..2:
kono
parents:
diff changeset
415 mr r28, r1 /* out AP. */
kono
parents:
diff changeset
416 stwux r1, r1, r4
kono
parents:
diff changeset
417 LCFI..3:
kono
parents:
diff changeset
418
kono
parents:
diff changeset
419 /* Save arguments over call... */
kono
parents:
diff changeset
420 mr r31, r5 /* flags, */
kono
parents:
diff changeset
421 mr r30, r6 /* rvalue, */
kono
parents:
diff changeset
422 mr r29, r7 /* function address, */
kono
parents:
diff changeset
423 stw r2, 20(r1)
kono
parents:
diff changeset
424
kono
parents:
diff changeset
425 /* Call ffi_prep_args. */
kono
parents:
diff changeset
426 mr r4, r1
kono
parents:
diff changeset
427 bl .ffi_prep_args
kono
parents:
diff changeset
428 nop
kono
parents:
diff changeset
429
kono
parents:
diff changeset
430 /* Now do the call. */
kono
parents:
diff changeset
431 lwz r0, 0(r29)
kono
parents:
diff changeset
432 lwz r2, 4(r29)
kono
parents:
diff changeset
433 lwz r11, 4(r28) /* closure */
kono
parents:
diff changeset
434 /* Set up cr1 with bits 4-7 of the flags. */
kono
parents:
diff changeset
435 mtcrf 0x40, r31
kono
parents:
diff changeset
436 mtctr r0
kono
parents:
diff changeset
437 /* Load all those argument registers. */
kono
parents:
diff changeset
438 /* We have set up a nice stack frame, just load it into registers. */
kono
parents:
diff changeset
439 lwz r3, 20+(1*4)(r1)
kono
parents:
diff changeset
440 lwz r4, 20+(2*4)(r1)
kono
parents:
diff changeset
441 lwz r5, 20+(3*4)(r1)
kono
parents:
diff changeset
442 lwz r6, 20+(4*4)(r1)
kono
parents:
diff changeset
443 nop
kono
parents:
diff changeset
444 lwz r7, 20+(5*4)(r1)
kono
parents:
diff changeset
445 lwz r8, 20+(6*4)(r1)
kono
parents:
diff changeset
446 lwz r9, 20+(7*4)(r1)
kono
parents:
diff changeset
447 lwz r10,20+(8*4)(r1)
kono
parents:
diff changeset
448
kono
parents:
diff changeset
449 b L1
kono
parents:
diff changeset
450 LFE..1:
kono
parents:
diff changeset
451 #endif
kono
parents:
diff changeset
452 .ef __LINE__
kono
parents:
diff changeset
453 .long 0
kono
parents:
diff changeset
454 .byte 0,0,0,1,128,4,0,0
kono
parents:
diff changeset
455 /* END(ffi_call_go_AIX) */
kono
parents:
diff changeset
456
kono
parents:
diff changeset
457 .csect .text[PR]
kono
parents:
diff changeset
458 .align 2
kono
parents:
diff changeset
459 .globl ffi_call_DARWIN
kono
parents:
diff changeset
460 .globl .ffi_call_DARWIN
kono
parents:
diff changeset
461 .csect ffi_call_DARWIN[DS]
kono
parents:
diff changeset
462 ffi_call_DARWIN:
kono
parents:
diff changeset
463 #ifdef __64BIT__
kono
parents:
diff changeset
464 .llong .ffi_call_DARWIN, TOC[tc0], 0
kono
parents:
diff changeset
465 #else
kono
parents:
diff changeset
466 .long .ffi_call_DARWIN, TOC[tc0], 0
kono
parents:
diff changeset
467 #endif
kono
parents:
diff changeset
468 .csect .text[PR]
kono
parents:
diff changeset
469 .ffi_call_DARWIN:
kono
parents:
diff changeset
470 blr
kono
parents:
diff changeset
471 .long 0
kono
parents:
diff changeset
472 .byte 0,0,0,0,0,0,0,0
kono
parents:
diff changeset
473 /* END(ffi_call_DARWIN) */
kono
parents:
diff changeset
474
kono
parents:
diff changeset
475 /* EH frame stuff. */
kono
parents:
diff changeset
476
kono
parents:
diff changeset
477 #define LR_REGNO 0x41 /* Link Register (65), see rs6000.md */
kono
parents:
diff changeset
478 #ifdef __64BIT__
kono
parents:
diff changeset
479 #define PTRSIZE 8
kono
parents:
diff changeset
480 #define LOG2_PTRSIZE 3
kono
parents:
diff changeset
481 #define FDE_ENCODING 0x1c /* DW_EH_PE_pcrel|DW_EH_PE_sdata8 */
kono
parents:
diff changeset
482 #define EH_DATA_ALIGN_FACT 0x78 /* LEB128 -8 */
kono
parents:
diff changeset
483 #else
kono
parents:
diff changeset
484 #define PTRSIZE 4
kono
parents:
diff changeset
485 #define LOG2_PTRSIZE 2
kono
parents:
diff changeset
486 #define FDE_ENCODING 0x1b /* DW_EH_PE_pcrel|DW_EH_PE_sdata4 */
kono
parents:
diff changeset
487 #define EH_DATA_ALIGN_FACT 0x7c /* LEB128 -4 */
kono
parents:
diff changeset
488 #endif
kono
parents:
diff changeset
489 .csect _unwind.ro_[RO],4
kono
parents:
diff changeset
490 .align LOG2_PTRSIZE
kono
parents:
diff changeset
491 .globl _GLOBAL__F_libffi_src_powerpc_aix
kono
parents:
diff changeset
492 _GLOBAL__F_libffi_src_powerpc_aix:
kono
parents:
diff changeset
493 Lframe..1:
kono
parents:
diff changeset
494 .vbyte 4,LECIE..1-LSCIE..1 /* CIE Length */
kono
parents:
diff changeset
495 LSCIE..1:
kono
parents:
diff changeset
496 .vbyte 4,0 /* CIE Identifier Tag */
kono
parents:
diff changeset
497 .byte 0x3 /* CIE Version */
kono
parents:
diff changeset
498 .byte "zR" /* CIE Augmentation */
kono
parents:
diff changeset
499 .byte 0
kono
parents:
diff changeset
500 .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */
kono
parents:
diff changeset
501 .byte EH_DATA_ALIGN_FACT /* leb128 -4/-8; CIE Data Alignment Factor */
kono
parents:
diff changeset
502 .byte 0x41 /* CIE RA Column */
kono
parents:
diff changeset
503 .byte 0x1 /* uleb128 0x1; Augmentation size */
kono
parents:
diff changeset
504 .byte FDE_ENCODING /* FDE Encoding (pcrel|sdata4/8) */
kono
parents:
diff changeset
505 .byte 0xc /* DW_CFA_def_cfa */
kono
parents:
diff changeset
506 .byte 0x1 /* uleb128 0x1; Register r1 */
kono
parents:
diff changeset
507 .byte 0 /* uleb128 0x0; Offset 0 */
kono
parents:
diff changeset
508 .align LOG2_PTRSIZE
kono
parents:
diff changeset
509 LECIE..1:
kono
parents:
diff changeset
510 LSFDE..1:
kono
parents:
diff changeset
511 .vbyte 4,LEFDE..1-LASFDE..1 /* FDE Length */
kono
parents:
diff changeset
512 LASFDE..1:
kono
parents:
diff changeset
513 .vbyte 4,LASFDE..1-Lframe..1 /* FDE CIE offset */
kono
parents:
diff changeset
514 .vbyte PTRSIZE,LFB..0-$ /* FDE initial location */
kono
parents:
diff changeset
515 .vbyte PTRSIZE,LFE..0-LFB..0 /* FDE address range */
kono
parents:
diff changeset
516 .byte 0 /* uleb128 0x0; Augmentation size */
kono
parents:
diff changeset
517 .byte 0x4 /* DW_CFA_advance_loc4 */
kono
parents:
diff changeset
518 .vbyte 4,LCFI..0-LFB..0
kono
parents:
diff changeset
519 .byte 0x11 /* DW_CFA_def_offset_extended_sf */
kono
parents:
diff changeset
520 .byte LR_REGNO /* uleb128 LR_REGNO; Register LR */
kono
parents:
diff changeset
521 .byte 0x7e /* leb128 -2; Offset -2 (8/16) */
kono
parents:
diff changeset
522 .byte 0x9f /* DW_CFA_offset Register r31 */
kono
parents:
diff changeset
523 .byte 0x1 /* uleb128 0x1; Offset 1 (-4/-8) */
kono
parents:
diff changeset
524 .byte 0x9e /* DW_CFA_offset Register r30 */
kono
parents:
diff changeset
525 .byte 0x2 /* uleb128 0x2; Offset 2 (-8/-16) */
kono
parents:
diff changeset
526 .byte 0x9d /* DW_CFA_offset Register r29 */
kono
parents:
diff changeset
527 .byte 0x3 /* uleb128 0x3; Offset 3 (-12/-24) */
kono
parents:
diff changeset
528 .byte 0x9c /* DW_CFA_offset Register r28 */
kono
parents:
diff changeset
529 .byte 0x4 /* uleb128 0x4; Offset 4 (-16/-32) */
kono
parents:
diff changeset
530 .byte 0x4 /* DW_CFA_advance_loc4 */
kono
parents:
diff changeset
531 .vbyte 4,LCFI..1-LCFI..0
kono
parents:
diff changeset
532 .byte 0xd /* DW_CFA_def_cfa_register */
kono
parents:
diff changeset
533 .byte 0x1c /* uleb128 28; Register r28 */
kono
parents:
diff changeset
534 .align LOG2_PTRSIZE
kono
parents:
diff changeset
535 LEFDE..1:
kono
parents:
diff changeset
536 LSFDE..2:
kono
parents:
diff changeset
537 .vbyte 4,LEFDE..2-LASFDE..2 /* FDE Length */
kono
parents:
diff changeset
538 LASFDE..2:
kono
parents:
diff changeset
539 .vbyte 4,LASFDE..2-Lframe..1 /* FDE CIE offset */
kono
parents:
diff changeset
540 .vbyte PTRSIZE,LFB..1-$ /* FDE initial location */
kono
parents:
diff changeset
541 .vbyte PTRSIZE,LFE..1-LFB..1 /* FDE address range */
kono
parents:
diff changeset
542 .byte 0 /* uleb128 0x0; Augmentation size */
kono
parents:
diff changeset
543 .byte 0x4 /* DW_CFA_advance_loc4 */
kono
parents:
diff changeset
544 .vbyte 4,LCFI..2-LFB..1
kono
parents:
diff changeset
545 .byte 0x11 /* DW_CFA_def_offset_extended_sf */
kono
parents:
diff changeset
546 .byte LR_REGNO /* uleb128 LR_REGNO; Register LR */
kono
parents:
diff changeset
547 .byte 0x7e /* leb128 -2; Offset -2 (8/16) */
kono
parents:
diff changeset
548 .byte 0x9f /* DW_CFA_offset Register r31 */
kono
parents:
diff changeset
549 .byte 0x1 /* uleb128 0x1; Offset 1 (-4/-8) */
kono
parents:
diff changeset
550 .byte 0x9e /* DW_CFA_offset Register r30 */
kono
parents:
diff changeset
551 .byte 0x2 /* uleb128 0x2; Offset 2 (-8/-16) */
kono
parents:
diff changeset
552 .byte 0x9d /* DW_CFA_offset Register r29 */
kono
parents:
diff changeset
553 .byte 0x3 /* uleb128 0x3; Offset 3 (-12/-24) */
kono
parents:
diff changeset
554 .byte 0x9c /* DW_CFA_offset Register r28 */
kono
parents:
diff changeset
555 .byte 0x4 /* uleb128 0x4; Offset 4 (-16/-32) */
kono
parents:
diff changeset
556 .byte 0x4 /* DW_CFA_advance_loc4 */
kono
parents:
diff changeset
557 .vbyte 4,LCFI..3-LCFI..2
kono
parents:
diff changeset
558 .byte 0xd /* DW_CFA_def_cfa_register */
kono
parents:
diff changeset
559 .byte 0x1c /* uleb128 28; Register r28 */
kono
parents:
diff changeset
560 .align LOG2_PTRSIZE
kono
parents:
diff changeset
561 LEFDE..2:
kono
parents:
diff changeset
562 .vbyte 4,0 /* End of FDEs */
kono
parents:
diff changeset
563
kono
parents:
diff changeset
564 .csect .text[PR]
kono
parents:
diff changeset
565 .ref _GLOBAL__F_libffi_src_powerpc_aix /* Prevents garbage collection by AIX linker */
kono
parents:
diff changeset
566