annotate libffi/src/powerpc/aix_closure.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_closure.S - Copyright (c) 2002, 2003, 2009 Free Software Foundation, Inc.
kono
parents:
diff changeset
3 based on darwin_closure.S
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_closure_helper_DARWIN
kono
parents:
diff changeset
83 .extern .ffi_go_closure_helper_DARWIN
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 #define LIBFFI_ASM
kono
parents:
diff changeset
86 #define JUMPTARGET(name) name
kono
parents:
diff changeset
87 #define L(x) x
kono
parents:
diff changeset
88 .file "aix_closure.S"
kono
parents:
diff changeset
89 .toc
kono
parents:
diff changeset
90 LC..60:
kono
parents:
diff changeset
91 .tc L..60[TC],L..60
kono
parents:
diff changeset
92 .csect .text[PR]
kono
parents:
diff changeset
93 .align 2
kono
parents:
diff changeset
94
kono
parents:
diff changeset
95 .csect .text[PR]
kono
parents:
diff changeset
96 .align 2
kono
parents:
diff changeset
97 .globl ffi_closure_ASM
kono
parents:
diff changeset
98 .globl .ffi_closure_ASM
kono
parents:
diff changeset
99 .csect ffi_closure_ASM[DS]
kono
parents:
diff changeset
100 ffi_closure_ASM:
kono
parents:
diff changeset
101 #ifdef __64BIT__
kono
parents:
diff changeset
102 .llong .ffi_closure_ASM, TOC[tc0], 0
kono
parents:
diff changeset
103 .csect .text[PR]
kono
parents:
diff changeset
104 .ffi_closure_ASM:
kono
parents:
diff changeset
105 .function .ffi_closure_ASM,.ffi_closure_ASM,16,044,LFE..0-LFB..0
kono
parents:
diff changeset
106 .bf __LINE__
kono
parents:
diff changeset
107 .line 1
kono
parents:
diff changeset
108 LFB..0:
kono
parents:
diff changeset
109 /* we want to build up an area for the parameters passed */
kono
parents:
diff changeset
110 /* in registers (both floating point and integer) */
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 /* we store gpr 3 to gpr 10 (aligned to 4)
kono
parents:
diff changeset
113 in the parents outgoing area */
kono
parents:
diff changeset
114 std r3, 48+(0*8)(r1)
kono
parents:
diff changeset
115 std r4, 48+(1*8)(r1)
kono
parents:
diff changeset
116 std r5, 48+(2*8)(r1)
kono
parents:
diff changeset
117 std r6, 48+(3*8)(r1)
kono
parents:
diff changeset
118 mflr r0
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 std r7, 48+(4*8)(r1)
kono
parents:
diff changeset
121 std r8, 48+(5*8)(r1)
kono
parents:
diff changeset
122 std r9, 48+(6*8)(r1)
kono
parents:
diff changeset
123 std r10, 48+(7*8)(r1)
kono
parents:
diff changeset
124 std r0, 16(r1) /* save the return address */
kono
parents:
diff changeset
125 LCFI..0:
kono
parents:
diff changeset
126 /* 48 Bytes (Linkage Area) */
kono
parents:
diff changeset
127 /* 64 Bytes (params) */
kono
parents:
diff changeset
128 /* 16 Bytes (result) */
kono
parents:
diff changeset
129 /* 104 Bytes (13*8 from FPR) */
kono
parents:
diff changeset
130 /* 8 Bytes (alignment) */
kono
parents:
diff changeset
131 /* 240 Bytes */
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 stdu r1, -240(r1) /* skip over caller save area
kono
parents:
diff changeset
134 keep stack aligned to 16 */
kono
parents:
diff changeset
135 LCFI..1:
kono
parents:
diff changeset
136
kono
parents:
diff changeset
137 /* next save fpr 1 to fpr 13 (aligned to 8) */
kono
parents:
diff changeset
138 stfd f1, 128+(0*8)(r1)
kono
parents:
diff changeset
139 stfd f2, 128+(1*8)(r1)
kono
parents:
diff changeset
140 stfd f3, 128+(2*8)(r1)
kono
parents:
diff changeset
141 stfd f4, 128+(3*8)(r1)
kono
parents:
diff changeset
142 stfd f5, 128+(4*8)(r1)
kono
parents:
diff changeset
143 stfd f6, 128+(5*8)(r1)
kono
parents:
diff changeset
144 stfd f7, 128+(6*8)(r1)
kono
parents:
diff changeset
145 stfd f8, 128+(7*8)(r1)
kono
parents:
diff changeset
146 stfd f9, 128+(8*8)(r1)
kono
parents:
diff changeset
147 stfd f10, 128+(9*8)(r1)
kono
parents:
diff changeset
148 stfd f11, 128+(10*8)(r1)
kono
parents:
diff changeset
149 stfd f12, 128+(11*8)(r1)
kono
parents:
diff changeset
150 stfd f13, 128+(12*8)(r1)
kono
parents:
diff changeset
151
kono
parents:
diff changeset
152 /* set up registers for the routine that actually does the work */
kono
parents:
diff changeset
153 /* get the context pointer from the trampoline */
kono
parents:
diff changeset
154 mr r3, r11
kono
parents:
diff changeset
155
kono
parents:
diff changeset
156 /* now load up the pointer to the result storage */
kono
parents:
diff changeset
157 addi r4, r1, 112
kono
parents:
diff changeset
158
kono
parents:
diff changeset
159 /* now load up the pointer to the saved gpr registers */
kono
parents:
diff changeset
160 addi r5, r1, 288
kono
parents:
diff changeset
161
kono
parents:
diff changeset
162 /* now load up the pointer to the saved fpr registers */
kono
parents:
diff changeset
163 addi r6, r1, 128
kono
parents:
diff changeset
164
kono
parents:
diff changeset
165 /* make the call */
kono
parents:
diff changeset
166 bl .ffi_closure_helper_DARWIN
kono
parents:
diff changeset
167 nop
kono
parents:
diff changeset
168
kono
parents:
diff changeset
169 .Ldoneclosure:
kono
parents:
diff changeset
170
kono
parents:
diff changeset
171 /* now r3 contains the return type */
kono
parents:
diff changeset
172 /* so use it to look up in a table */
kono
parents:
diff changeset
173 /* so we know how to deal with each type */
kono
parents:
diff changeset
174
kono
parents:
diff changeset
175 /* look up the proper starting point in table */
kono
parents:
diff changeset
176 /* by using return type as offset */
kono
parents:
diff changeset
177 lhz r3, 10(r3) /* load type from return type */
kono
parents:
diff changeset
178 ld r4, LC..60(2) /* get address of jump table */
kono
parents:
diff changeset
179 sldi r3, r3, 4 /* now multiply return type by 16 */
kono
parents:
diff changeset
180 ld r0, 240+16(r1) /* load return address */
kono
parents:
diff changeset
181 add r3, r3, r4 /* add contents of table to table address */
kono
parents:
diff changeset
182 mtctr r3
kono
parents:
diff changeset
183 bctr /* jump to it */
kono
parents:
diff changeset
184
kono
parents:
diff changeset
185 /* Each fragment must be exactly 16 bytes long (4 instructions).
kono
parents:
diff changeset
186 Align to 16 byte boundary for cache and dispatch efficiency. */
kono
parents:
diff changeset
187 .align 4
kono
parents:
diff changeset
188
kono
parents:
diff changeset
189 L..60:
kono
parents:
diff changeset
190 /* case FFI_TYPE_VOID */
kono
parents:
diff changeset
191 mtlr r0
kono
parents:
diff changeset
192 addi r1, r1, 240
kono
parents:
diff changeset
193 blr
kono
parents:
diff changeset
194 nop
kono
parents:
diff changeset
195
kono
parents:
diff changeset
196 /* case FFI_TYPE_INT */
kono
parents:
diff changeset
197 lwa r3, 112+4(r1)
kono
parents:
diff changeset
198 mtlr r0
kono
parents:
diff changeset
199 addi r1, r1, 240
kono
parents:
diff changeset
200 blr
kono
parents:
diff changeset
201
kono
parents:
diff changeset
202 /* case FFI_TYPE_FLOAT */
kono
parents:
diff changeset
203 lfs f1, 112+0(r1)
kono
parents:
diff changeset
204 mtlr r0
kono
parents:
diff changeset
205 addi r1, r1, 240
kono
parents:
diff changeset
206 blr
kono
parents:
diff changeset
207
kono
parents:
diff changeset
208 /* case FFI_TYPE_DOUBLE */
kono
parents:
diff changeset
209 lfd f1, 112+0(r1)
kono
parents:
diff changeset
210 mtlr r0
kono
parents:
diff changeset
211 addi r1, r1, 240
kono
parents:
diff changeset
212 blr
kono
parents:
diff changeset
213
kono
parents:
diff changeset
214 /* case FFI_TYPE_LONGDOUBLE */
kono
parents:
diff changeset
215 lfd f1, 112+0(r1)
kono
parents:
diff changeset
216 mtlr r0
kono
parents:
diff changeset
217 lfd f2, 112+8(r1)
kono
parents:
diff changeset
218 b L..finish
kono
parents:
diff changeset
219
kono
parents:
diff changeset
220 /* case FFI_TYPE_UINT8 */
kono
parents:
diff changeset
221 lbz r3, 112+7(r1)
kono
parents:
diff changeset
222 mtlr r0
kono
parents:
diff changeset
223 addi r1, r1, 240
kono
parents:
diff changeset
224 blr
kono
parents:
diff changeset
225
kono
parents:
diff changeset
226 /* case FFI_TYPE_SINT8 */
kono
parents:
diff changeset
227 lbz r3, 112+7(r1)
kono
parents:
diff changeset
228 mtlr r0
kono
parents:
diff changeset
229 extsb r3, r3
kono
parents:
diff changeset
230 b L..finish
kono
parents:
diff changeset
231
kono
parents:
diff changeset
232 /* case FFI_TYPE_UINT16 */
kono
parents:
diff changeset
233 lhz r3, 112+6(r1)
kono
parents:
diff changeset
234 mtlr r0
kono
parents:
diff changeset
235 L..finish:
kono
parents:
diff changeset
236 addi r1, r1, 240
kono
parents:
diff changeset
237 blr
kono
parents:
diff changeset
238
kono
parents:
diff changeset
239 /* case FFI_TYPE_SINT16 */
kono
parents:
diff changeset
240 lha r3, 112+6(r1)
kono
parents:
diff changeset
241 mtlr r0
kono
parents:
diff changeset
242 addi r1, r1, 240
kono
parents:
diff changeset
243 blr
kono
parents:
diff changeset
244
kono
parents:
diff changeset
245 /* case FFI_TYPE_UINT32 */
kono
parents:
diff changeset
246 lwz r3, 112+4(r1)
kono
parents:
diff changeset
247 mtlr r0
kono
parents:
diff changeset
248 addi r1, r1, 240
kono
parents:
diff changeset
249 blr
kono
parents:
diff changeset
250
kono
parents:
diff changeset
251 /* case FFI_TYPE_SINT32 */
kono
parents:
diff changeset
252 lwa r3, 112+4(r1)
kono
parents:
diff changeset
253 mtlr r0
kono
parents:
diff changeset
254 addi r1, r1, 240
kono
parents:
diff changeset
255 blr
kono
parents:
diff changeset
256
kono
parents:
diff changeset
257 /* case FFI_TYPE_UINT64 */
kono
parents:
diff changeset
258 ld r3, 112+0(r1)
kono
parents:
diff changeset
259 mtlr r0
kono
parents:
diff changeset
260 addi r1, r1, 240
kono
parents:
diff changeset
261 blr
kono
parents:
diff changeset
262
kono
parents:
diff changeset
263 /* case FFI_TYPE_SINT64 */
kono
parents:
diff changeset
264 ld r3, 112+0(r1)
kono
parents:
diff changeset
265 mtlr r0
kono
parents:
diff changeset
266 addi r1, r1, 240
kono
parents:
diff changeset
267 blr
kono
parents:
diff changeset
268
kono
parents:
diff changeset
269 /* case FFI_TYPE_STRUCT */
kono
parents:
diff changeset
270 mtlr r0
kono
parents:
diff changeset
271 addi r1, r1, 240
kono
parents:
diff changeset
272 blr
kono
parents:
diff changeset
273 nop
kono
parents:
diff changeset
274
kono
parents:
diff changeset
275 /* case FFI_TYPE_POINTER */
kono
parents:
diff changeset
276 ld r3, 112+0(r1)
kono
parents:
diff changeset
277 mtlr r0
kono
parents:
diff changeset
278 addi r1, r1, 240
kono
parents:
diff changeset
279 blr
kono
parents:
diff changeset
280 LFE..0:
kono
parents:
diff changeset
281
kono
parents:
diff changeset
282 #else /* ! __64BIT__ */
kono
parents:
diff changeset
283
kono
parents:
diff changeset
284 .long .ffi_closure_ASM, TOC[tc0], 0
kono
parents:
diff changeset
285 .csect .text[PR]
kono
parents:
diff changeset
286 .ffi_closure_ASM:
kono
parents:
diff changeset
287 .function .ffi_closure_ASM,.ffi_closure_ASM,16,044,LFE..0-LFB..0
kono
parents:
diff changeset
288 .bf __LINE__
kono
parents:
diff changeset
289 .line 1
kono
parents:
diff changeset
290 LFB..0:
kono
parents:
diff changeset
291 /* we want to build up an area for the parameters passed */
kono
parents:
diff changeset
292 /* in registers (both floating point and integer) */
kono
parents:
diff changeset
293
kono
parents:
diff changeset
294 /* we store gpr 3 to gpr 10 (aligned to 4)
kono
parents:
diff changeset
295 in the parents outgoing area */
kono
parents:
diff changeset
296 stw r3, 24+(0*4)(r1)
kono
parents:
diff changeset
297 stw r4, 24+(1*4)(r1)
kono
parents:
diff changeset
298 stw r5, 24+(2*4)(r1)
kono
parents:
diff changeset
299 stw r6, 24+(3*4)(r1)
kono
parents:
diff changeset
300 mflr r0
kono
parents:
diff changeset
301
kono
parents:
diff changeset
302 stw r7, 24+(4*4)(r1)
kono
parents:
diff changeset
303 stw r8, 24+(5*4)(r1)
kono
parents:
diff changeset
304 stw r9, 24+(6*4)(r1)
kono
parents:
diff changeset
305 stw r10, 24+(7*4)(r1)
kono
parents:
diff changeset
306 stw r0, 8(r1)
kono
parents:
diff changeset
307 LCFI..0:
kono
parents:
diff changeset
308 /* 24 Bytes (Linkage Area) */
kono
parents:
diff changeset
309 /* 32 Bytes (params) */
kono
parents:
diff changeset
310 /* 16 Bytes (result) */
kono
parents:
diff changeset
311 /* 104 Bytes (13*8 from FPR) */
kono
parents:
diff changeset
312 /* 176 Bytes */
kono
parents:
diff changeset
313
kono
parents:
diff changeset
314 stwu r1, -176(r1) /* skip over caller save area
kono
parents:
diff changeset
315 keep stack aligned to 16 */
kono
parents:
diff changeset
316 LCFI..1:
kono
parents:
diff changeset
317
kono
parents:
diff changeset
318 /* next save fpr 1 to fpr 13 (aligned to 8) */
kono
parents:
diff changeset
319 stfd f1, 72+(0*8)(r1)
kono
parents:
diff changeset
320 stfd f2, 72+(1*8)(r1)
kono
parents:
diff changeset
321 stfd f3, 72+(2*8)(r1)
kono
parents:
diff changeset
322 stfd f4, 72+(3*8)(r1)
kono
parents:
diff changeset
323 stfd f5, 72+(4*8)(r1)
kono
parents:
diff changeset
324 stfd f6, 72+(5*8)(r1)
kono
parents:
diff changeset
325 stfd f7, 72+(6*8)(r1)
kono
parents:
diff changeset
326 stfd f8, 72+(7*8)(r1)
kono
parents:
diff changeset
327 stfd f9, 72+(8*8)(r1)
kono
parents:
diff changeset
328 stfd f10, 72+(9*8)(r1)
kono
parents:
diff changeset
329 stfd f11, 72+(10*8)(r1)
kono
parents:
diff changeset
330 stfd f12, 72+(11*8)(r1)
kono
parents:
diff changeset
331 stfd f13, 72+(12*8)(r1)
kono
parents:
diff changeset
332
kono
parents:
diff changeset
333 /* set up registers for the routine that actually does the work */
kono
parents:
diff changeset
334 /* get the context pointer from the trampoline */
kono
parents:
diff changeset
335 mr r3, r11
kono
parents:
diff changeset
336
kono
parents:
diff changeset
337 /* now load up the pointer to the result storage */
kono
parents:
diff changeset
338 addi r4, r1, 56
kono
parents:
diff changeset
339
kono
parents:
diff changeset
340 /* now load up the pointer to the saved gpr registers */
kono
parents:
diff changeset
341 addi r5, r1, 200
kono
parents:
diff changeset
342
kono
parents:
diff changeset
343 /* now load up the pointer to the saved fpr registers */
kono
parents:
diff changeset
344 addi r6, r1, 72
kono
parents:
diff changeset
345
kono
parents:
diff changeset
346 /* make the call */
kono
parents:
diff changeset
347 bl .ffi_closure_helper_DARWIN
kono
parents:
diff changeset
348 nop
kono
parents:
diff changeset
349
kono
parents:
diff changeset
350 .Ldoneclosure:
kono
parents:
diff changeset
351
kono
parents:
diff changeset
352 /* now r3 contains the return type */
kono
parents:
diff changeset
353 /* so use it to look up in a table */
kono
parents:
diff changeset
354 /* so we know how to deal with each type */
kono
parents:
diff changeset
355
kono
parents:
diff changeset
356 /* look up the proper starting point in table */
kono
parents:
diff changeset
357 /* by using return type as offset */
kono
parents:
diff changeset
358 lhz r3, 6(r3) /* load type from return type */
kono
parents:
diff changeset
359 lwz r4, LC..60(2) /* get address of jump table */
kono
parents:
diff changeset
360 slwi r3, r3, 4 /* now multiply return type by 16 */
kono
parents:
diff changeset
361 lwz r0, 176+8(r1) /* load return address */
kono
parents:
diff changeset
362 add r3, r3, r4 /* add contents of table to table address */
kono
parents:
diff changeset
363 mtctr r3
kono
parents:
diff changeset
364 bctr /* jump to it */
kono
parents:
diff changeset
365
kono
parents:
diff changeset
366 /* Each fragment must be exactly 16 bytes long (4 instructions).
kono
parents:
diff changeset
367 Align to 16 byte boundary for cache and dispatch efficiency. */
kono
parents:
diff changeset
368 .align 4
kono
parents:
diff changeset
369
kono
parents:
diff changeset
370 L..60:
kono
parents:
diff changeset
371 /* case FFI_TYPE_VOID */
kono
parents:
diff changeset
372 mtlr r0
kono
parents:
diff changeset
373 addi r1, r1, 176
kono
parents:
diff changeset
374 blr
kono
parents:
diff changeset
375 nop
kono
parents:
diff changeset
376
kono
parents:
diff changeset
377 /* case FFI_TYPE_INT */
kono
parents:
diff changeset
378 lwz r3, 56+0(r1)
kono
parents:
diff changeset
379 mtlr r0
kono
parents:
diff changeset
380 addi r1, r1, 176
kono
parents:
diff changeset
381 blr
kono
parents:
diff changeset
382
kono
parents:
diff changeset
383 /* case FFI_TYPE_FLOAT */
kono
parents:
diff changeset
384 lfs f1, 56+0(r1)
kono
parents:
diff changeset
385 mtlr r0
kono
parents:
diff changeset
386 addi r1, r1, 176
kono
parents:
diff changeset
387 blr
kono
parents:
diff changeset
388
kono
parents:
diff changeset
389 /* case FFI_TYPE_DOUBLE */
kono
parents:
diff changeset
390 lfd f1, 56+0(r1)
kono
parents:
diff changeset
391 mtlr r0
kono
parents:
diff changeset
392 addi r1, r1, 176
kono
parents:
diff changeset
393 blr
kono
parents:
diff changeset
394
kono
parents:
diff changeset
395 /* case FFI_TYPE_LONGDOUBLE */
kono
parents:
diff changeset
396 lfd f1, 56+0(r1)
kono
parents:
diff changeset
397 mtlr r0
kono
parents:
diff changeset
398 lfd f2, 56+8(r1)
kono
parents:
diff changeset
399 b L..finish
kono
parents:
diff changeset
400
kono
parents:
diff changeset
401 /* case FFI_TYPE_UINT8 */
kono
parents:
diff changeset
402 lbz r3, 56+3(r1)
kono
parents:
diff changeset
403 mtlr r0
kono
parents:
diff changeset
404 addi r1, r1, 176
kono
parents:
diff changeset
405 blr
kono
parents:
diff changeset
406
kono
parents:
diff changeset
407 /* case FFI_TYPE_SINT8 */
kono
parents:
diff changeset
408 lbz r3, 56+3(r1)
kono
parents:
diff changeset
409 mtlr r0
kono
parents:
diff changeset
410 extsb r3, r3
kono
parents:
diff changeset
411 b L..finish
kono
parents:
diff changeset
412
kono
parents:
diff changeset
413 /* case FFI_TYPE_UINT16 */
kono
parents:
diff changeset
414 lhz r3, 56+2(r1)
kono
parents:
diff changeset
415 mtlr r0
kono
parents:
diff changeset
416 addi r1, r1, 176
kono
parents:
diff changeset
417 blr
kono
parents:
diff changeset
418
kono
parents:
diff changeset
419 /* case FFI_TYPE_SINT16 */
kono
parents:
diff changeset
420 lha r3, 56+2(r1)
kono
parents:
diff changeset
421 mtlr r0
kono
parents:
diff changeset
422 addi r1, r1, 176
kono
parents:
diff changeset
423 blr
kono
parents:
diff changeset
424
kono
parents:
diff changeset
425 /* case FFI_TYPE_UINT32 */
kono
parents:
diff changeset
426 lwz r3, 56+0(r1)
kono
parents:
diff changeset
427 mtlr r0
kono
parents:
diff changeset
428 addi r1, r1, 176
kono
parents:
diff changeset
429 blr
kono
parents:
diff changeset
430
kono
parents:
diff changeset
431 /* case FFI_TYPE_SINT32 */
kono
parents:
diff changeset
432 lwz r3, 56+0(r1)
kono
parents:
diff changeset
433 mtlr r0
kono
parents:
diff changeset
434 addi r1, r1, 176
kono
parents:
diff changeset
435 blr
kono
parents:
diff changeset
436
kono
parents:
diff changeset
437 /* case FFI_TYPE_UINT64 */
kono
parents:
diff changeset
438 lwz r3, 56+0(r1)
kono
parents:
diff changeset
439 mtlr r0
kono
parents:
diff changeset
440 lwz r4, 56+4(r1)
kono
parents:
diff changeset
441 b L..finish
kono
parents:
diff changeset
442
kono
parents:
diff changeset
443 /* case FFI_TYPE_SINT64 */
kono
parents:
diff changeset
444 lwz r3, 56+0(r1)
kono
parents:
diff changeset
445 mtlr r0
kono
parents:
diff changeset
446 lwz r4, 56+4(r1)
kono
parents:
diff changeset
447 b L..finish
kono
parents:
diff changeset
448
kono
parents:
diff changeset
449 /* case FFI_TYPE_STRUCT */
kono
parents:
diff changeset
450 mtlr r0
kono
parents:
diff changeset
451 addi r1, r1, 176
kono
parents:
diff changeset
452 blr
kono
parents:
diff changeset
453 nop
kono
parents:
diff changeset
454
kono
parents:
diff changeset
455 /* case FFI_TYPE_POINTER */
kono
parents:
diff changeset
456 lwz r3, 56+0(r1)
kono
parents:
diff changeset
457 mtlr r0
kono
parents:
diff changeset
458 L..finish:
kono
parents:
diff changeset
459 addi r1, r1, 176
kono
parents:
diff changeset
460 blr
kono
parents:
diff changeset
461 LFE..0:
kono
parents:
diff changeset
462 #endif
kono
parents:
diff changeset
463 .ef __LINE__
kono
parents:
diff changeset
464 /* END(ffi_closure_ASM) */
kono
parents:
diff changeset
465
kono
parents:
diff changeset
466
kono
parents:
diff changeset
467 .csect .text[PR]
kono
parents:
diff changeset
468 .align 2
kono
parents:
diff changeset
469 .globl ffi_go_closure_ASM
kono
parents:
diff changeset
470 .globl .ffi_go_closure_ASM
kono
parents:
diff changeset
471 .csect ffi_go_closure_ASM[DS]
kono
parents:
diff changeset
472 ffi_go_closure_ASM:
kono
parents:
diff changeset
473 #ifdef __64BIT__
kono
parents:
diff changeset
474 .llong .ffi_go_closure_ASM, TOC[tc0], 0
kono
parents:
diff changeset
475 .csect .text[PR]
kono
parents:
diff changeset
476 .ffi_go_closure_ASM:
kono
parents:
diff changeset
477 .function .ffi_go_closure_ASM,.ffi_go_closure_ASM,16,044,LFE..1-LFB..1
kono
parents:
diff changeset
478 .bf __LINE__
kono
parents:
diff changeset
479 .line 1
kono
parents:
diff changeset
480 LFB..1:
kono
parents:
diff changeset
481 /* we want to build up an area for the parameters passed */
kono
parents:
diff changeset
482 /* in registers (both floating point and integer) */
kono
parents:
diff changeset
483
kono
parents:
diff changeset
484 /* we store gpr 3 to gpr 10 (aligned to 4)
kono
parents:
diff changeset
485 in the parents outgoing area */
kono
parents:
diff changeset
486 std r3, 48+(0*8)(r1)
kono
parents:
diff changeset
487 std r4, 48+(1*8)(r1)
kono
parents:
diff changeset
488 std r5, 48+(2*8)(r1)
kono
parents:
diff changeset
489 std r6, 48+(3*8)(r1)
kono
parents:
diff changeset
490 mflr r0
kono
parents:
diff changeset
491
kono
parents:
diff changeset
492 std r7, 48+(4*8)(r1)
kono
parents:
diff changeset
493 std r8, 48+(5*8)(r1)
kono
parents:
diff changeset
494 std r9, 48+(6*8)(r1)
kono
parents:
diff changeset
495 std r10, 48+(7*8)(r1)
kono
parents:
diff changeset
496 std r0, 16(r1) /* save the return address */
kono
parents:
diff changeset
497 LCFI..2:
kono
parents:
diff changeset
498 /* 48 Bytes (Linkage Area) */
kono
parents:
diff changeset
499 /* 64 Bytes (params) */
kono
parents:
diff changeset
500 /* 16 Bytes (result) */
kono
parents:
diff changeset
501 /* 104 Bytes (13*8 from FPR) */
kono
parents:
diff changeset
502 /* 8 Bytes (alignment) */
kono
parents:
diff changeset
503 /* 240 Bytes */
kono
parents:
diff changeset
504
kono
parents:
diff changeset
505 stdu r1, -240(r1) /* skip over caller save area
kono
parents:
diff changeset
506 keep stack aligned to 16 */
kono
parents:
diff changeset
507 LCFI..3:
kono
parents:
diff changeset
508
kono
parents:
diff changeset
509 /* next save fpr 1 to fpr 13 (aligned to 8) */
kono
parents:
diff changeset
510 stfd f1, 128+(0*8)(r1)
kono
parents:
diff changeset
511 stfd f2, 128+(1*8)(r1)
kono
parents:
diff changeset
512 stfd f3, 128+(2*8)(r1)
kono
parents:
diff changeset
513 stfd f4, 128+(3*8)(r1)
kono
parents:
diff changeset
514 stfd f5, 128+(4*8)(r1)
kono
parents:
diff changeset
515 stfd f6, 128+(5*8)(r1)
kono
parents:
diff changeset
516 stfd f7, 128+(6*8)(r1)
kono
parents:
diff changeset
517 stfd f8, 128+(7*8)(r1)
kono
parents:
diff changeset
518 stfd f9, 128+(8*8)(r1)
kono
parents:
diff changeset
519 stfd f10, 128+(9*8)(r1)
kono
parents:
diff changeset
520 stfd f11, 128+(10*8)(r1)
kono
parents:
diff changeset
521 stfd f12, 128+(11*8)(r1)
kono
parents:
diff changeset
522 stfd f13, 128+(12*8)(r1)
kono
parents:
diff changeset
523
kono
parents:
diff changeset
524 /* set up registers for the routine that actually does the work */
kono
parents:
diff changeset
525 mr r3, r11 /* go closure */
kono
parents:
diff changeset
526
kono
parents:
diff changeset
527 /* now load up the pointer to the result storage */
kono
parents:
diff changeset
528 addi r4, r1, 112
kono
parents:
diff changeset
529
kono
parents:
diff changeset
530 /* now load up the pointer to the saved gpr registers */
kono
parents:
diff changeset
531 addi r5, r1, 288
kono
parents:
diff changeset
532
kono
parents:
diff changeset
533 /* now load up the pointer to the saved fpr registers */
kono
parents:
diff changeset
534 addi r6, r1, 128
kono
parents:
diff changeset
535
kono
parents:
diff changeset
536 /* make the call */
kono
parents:
diff changeset
537 bl .ffi_go_closure_helper_DARWIN
kono
parents:
diff changeset
538 nop
kono
parents:
diff changeset
539
kono
parents:
diff changeset
540 b .Ldoneclosure
kono
parents:
diff changeset
541 LFE..1:
kono
parents:
diff changeset
542
kono
parents:
diff changeset
543 #else /* ! __64BIT__ */
kono
parents:
diff changeset
544
kono
parents:
diff changeset
545 .long .ffi_go_closure_ASM, TOC[tc0], 0
kono
parents:
diff changeset
546 .csect .text[PR]
kono
parents:
diff changeset
547 .ffi_go_closure_ASM:
kono
parents:
diff changeset
548 .function .ffi_go_closure_ASM,.ffi_go_closure_ASM,16,044,LFE..1-LFB..1
kono
parents:
diff changeset
549 .bf __LINE__
kono
parents:
diff changeset
550 .line 1
kono
parents:
diff changeset
551 LFB..1:
kono
parents:
diff changeset
552 /* we want to build up an area for the parameters passed */
kono
parents:
diff changeset
553 /* in registers (both floating point and integer) */
kono
parents:
diff changeset
554
kono
parents:
diff changeset
555 /* we store gpr 3 to gpr 10 (aligned to 4)
kono
parents:
diff changeset
556 in the parents outgoing area */
kono
parents:
diff changeset
557 stw r3, 24+(0*4)(r1)
kono
parents:
diff changeset
558 stw r4, 24+(1*4)(r1)
kono
parents:
diff changeset
559 stw r5, 24+(2*4)(r1)
kono
parents:
diff changeset
560 stw r6, 24+(3*4)(r1)
kono
parents:
diff changeset
561 mflr r0
kono
parents:
diff changeset
562
kono
parents:
diff changeset
563 stw r7, 24+(4*4)(r1)
kono
parents:
diff changeset
564 stw r8, 24+(5*4)(r1)
kono
parents:
diff changeset
565 stw r9, 24+(6*4)(r1)
kono
parents:
diff changeset
566 stw r10, 24+(7*4)(r1)
kono
parents:
diff changeset
567 stw r0, 8(r1)
kono
parents:
diff changeset
568 LCFI..2:
kono
parents:
diff changeset
569 /* 24 Bytes (Linkage Area) */
kono
parents:
diff changeset
570 /* 32 Bytes (params) */
kono
parents:
diff changeset
571 /* 16 Bytes (result) */
kono
parents:
diff changeset
572 /* 104 Bytes (13*8 from FPR) */
kono
parents:
diff changeset
573 /* 176 Bytes */
kono
parents:
diff changeset
574
kono
parents:
diff changeset
575 stwu r1, -176(r1) /* skip over caller save area
kono
parents:
diff changeset
576 keep stack aligned to 16 */
kono
parents:
diff changeset
577 LCFI..3:
kono
parents:
diff changeset
578
kono
parents:
diff changeset
579 /* next save fpr 1 to fpr 13 (aligned to 8) */
kono
parents:
diff changeset
580 stfd f1, 72+(0*8)(r1)
kono
parents:
diff changeset
581 stfd f2, 72+(1*8)(r1)
kono
parents:
diff changeset
582 stfd f3, 72+(2*8)(r1)
kono
parents:
diff changeset
583 stfd f4, 72+(3*8)(r1)
kono
parents:
diff changeset
584 stfd f5, 72+(4*8)(r1)
kono
parents:
diff changeset
585 stfd f6, 72+(5*8)(r1)
kono
parents:
diff changeset
586 stfd f7, 72+(6*8)(r1)
kono
parents:
diff changeset
587 stfd f8, 72+(7*8)(r1)
kono
parents:
diff changeset
588 stfd f9, 72+(8*8)(r1)
kono
parents:
diff changeset
589 stfd f10, 72+(9*8)(r1)
kono
parents:
diff changeset
590 stfd f11, 72+(10*8)(r1)
kono
parents:
diff changeset
591 stfd f12, 72+(11*8)(r1)
kono
parents:
diff changeset
592 stfd f13, 72+(12*8)(r1)
kono
parents:
diff changeset
593
kono
parents:
diff changeset
594 /* set up registers for the routine that actually does the work */
kono
parents:
diff changeset
595 mr r3, 11 /* go closure */
kono
parents:
diff changeset
596
kono
parents:
diff changeset
597 /* now load up the pointer to the result storage */
kono
parents:
diff changeset
598 addi r4, r1, 56
kono
parents:
diff changeset
599
kono
parents:
diff changeset
600 /* now load up the pointer to the saved gpr registers */
kono
parents:
diff changeset
601 addi r5, r1, 200
kono
parents:
diff changeset
602
kono
parents:
diff changeset
603 /* now load up the pointer to the saved fpr registers */
kono
parents:
diff changeset
604 addi r6, r1, 72
kono
parents:
diff changeset
605
kono
parents:
diff changeset
606 /* make the call */
kono
parents:
diff changeset
607 bl .ffi_go_closure_helper_DARWIN
kono
parents:
diff changeset
608 nop
kono
parents:
diff changeset
609
kono
parents:
diff changeset
610 b .Ldoneclosure
kono
parents:
diff changeset
611 LFE..1:
kono
parents:
diff changeset
612 #endif
kono
parents:
diff changeset
613 .ef __LINE__
kono
parents:
diff changeset
614 /* END(ffi_go_closure_ASM) */
kono
parents:
diff changeset
615
kono
parents:
diff changeset
616 /* EH frame stuff. */
kono
parents:
diff changeset
617
kono
parents:
diff changeset
618 #define LR_REGNO 0x41 /* Link Register (65), see rs6000.md */
kono
parents:
diff changeset
619 #ifdef __64BIT__
kono
parents:
diff changeset
620 #define PTRSIZE 8
kono
parents:
diff changeset
621 #define LOG2_PTRSIZE 3
kono
parents:
diff changeset
622 #define CFA_OFFSET 0xf0,0x01 /* LEB128 240 */
kono
parents:
diff changeset
623 #define FDE_ENCODING 0x1c /* DW_EH_PE_pcrel|DW_EH_PE_sdata8 */
kono
parents:
diff changeset
624 #define EH_DATA_ALIGN_FACT 0x78 /* LEB128 -8 */
kono
parents:
diff changeset
625 #else
kono
parents:
diff changeset
626 #define PTRSIZE 4
kono
parents:
diff changeset
627 #define LOG2_PTRSIZE 2
kono
parents:
diff changeset
628 #define CFA_OFFSET 0xb0,0x01 /* LEB128 176 */
kono
parents:
diff changeset
629 #define FDE_ENCODING 0x1b /* DW_EH_PE_pcrel|DW_EH_PE_sdata4 */
kono
parents:
diff changeset
630 #define EH_DATA_ALIGN_FACT 0x7c /* LEB128 -4 */
kono
parents:
diff changeset
631 #endif
kono
parents:
diff changeset
632
kono
parents:
diff changeset
633 .csect _unwind.ro_[RO],4
kono
parents:
diff changeset
634 .align LOG2_PTRSIZE
kono
parents:
diff changeset
635 .globl _GLOBAL__F_libffi_src_powerpc_aix_closure
kono
parents:
diff changeset
636 _GLOBAL__F_libffi_src_powerpc_aix_closure:
kono
parents:
diff changeset
637 Lframe..1:
kono
parents:
diff changeset
638 .vbyte 4,LECIE..1-LSCIE..1 /* CIE Length */
kono
parents:
diff changeset
639 LSCIE..1:
kono
parents:
diff changeset
640 .vbyte 4,0 /* CIE Identifier Tag */
kono
parents:
diff changeset
641 .byte 0x3 /* CIE Version */
kono
parents:
diff changeset
642 .byte "zR" /* CIE Augmentation */
kono
parents:
diff changeset
643 .byte 0
kono
parents:
diff changeset
644 .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */
kono
parents:
diff changeset
645 .byte EH_DATA_ALIGN_FACT /* leb128 -4/-8; CIE Data Alignment Factor */
kono
parents:
diff changeset
646 .byte LR_REGNO /* CIE RA Column */
kono
parents:
diff changeset
647 .byte 0x1 /* uleb128 0x1; Augmentation size */
kono
parents:
diff changeset
648 .byte FDE_ENCODING /* FDE Encoding (pcrel|sdata4/8) */
kono
parents:
diff changeset
649 .byte 0xc /* DW_CFA_def_cfa */
kono
parents:
diff changeset
650 .byte 0x1 /* uleb128 0x1; Register r1 */
kono
parents:
diff changeset
651 .byte 0 /* uleb128 0x0; Offset 0 */
kono
parents:
diff changeset
652 .align LOG2_PTRSIZE
kono
parents:
diff changeset
653 LECIE..1:
kono
parents:
diff changeset
654 LSFDE..1:
kono
parents:
diff changeset
655 .vbyte 4,LEFDE..1-LASFDE..1 /* FDE Length */
kono
parents:
diff changeset
656 LASFDE..1:
kono
parents:
diff changeset
657 .vbyte 4,LASFDE..1-Lframe..1 /* FDE CIE offset */
kono
parents:
diff changeset
658 .vbyte PTRSIZE,LFB..0-$ /* FDE initial location */
kono
parents:
diff changeset
659 .vbyte PTRSIZE,LFE..0-LFB..0 /* FDE address range */
kono
parents:
diff changeset
660 .byte 0 /* uleb128 0x0; Augmentation size */
kono
parents:
diff changeset
661 .byte 0x4 /* DW_CFA_advance_loc4 */
kono
parents:
diff changeset
662 .vbyte 4,LCFI..1-LCFI..0
kono
parents:
diff changeset
663 .byte 0xe /* DW_CFA_def_cfa_offset */
kono
parents:
diff changeset
664 .byte CFA_OFFSET /* uleb128 176/240 */
kono
parents:
diff changeset
665 .byte 0x4 /* DW_CFA_advance_loc4 */
kono
parents:
diff changeset
666 .vbyte 4,LCFI..0-LFB..0
kono
parents:
diff changeset
667 .byte 0x11 /* DW_CFA_offset_extended_sf */
kono
parents:
diff changeset
668 .byte LR_REGNO /* uleb128 LR_REGNO; Register LR */
kono
parents:
diff changeset
669 .byte 0x7e /* leb128 -2; Offset -2 (8/16) */
kono
parents:
diff changeset
670 .align LOG2_PTRSIZE
kono
parents:
diff changeset
671 LEFDE..1:
kono
parents:
diff changeset
672 LSFDE..2:
kono
parents:
diff changeset
673 .vbyte 4,LEFDE..2-LASFDE..2 /* FDE Length */
kono
parents:
diff changeset
674 LASFDE..2:
kono
parents:
diff changeset
675 .vbyte 4,LASFDE..2-Lframe..1 /* FDE CIE offset */
kono
parents:
diff changeset
676 .vbyte PTRSIZE,LFB..1-$ /* FDE initial location */
kono
parents:
diff changeset
677 .vbyte PTRSIZE,LFE..1-LFB..1 /* FDE address range */
kono
parents:
diff changeset
678 .byte 0 /* uleb128 0x0; Augmentation size */
kono
parents:
diff changeset
679 .byte 0x4 /* DW_CFA_advance_loc4 */
kono
parents:
diff changeset
680 .vbyte 4,LCFI..3-LCFI..2
kono
parents:
diff changeset
681 .byte 0xe /* DW_CFA_def_cfa_offset */
kono
parents:
diff changeset
682 .byte CFA_OFFSET /* uleb128 176/240 */
kono
parents:
diff changeset
683 .byte 0x4 /* DW_CFA_advance_loc4 */
kono
parents:
diff changeset
684 .vbyte 4,LCFI..2-LFB..1
kono
parents:
diff changeset
685 .byte 0x11 /* DW_CFA_offset_extended_sf */
kono
parents:
diff changeset
686 .byte LR_REGNO /* uleb128 LR_REGNO; Register LR */
kono
parents:
diff changeset
687 .byte 0x7e /* leb128 -2; Offset -2 (8/16) */
kono
parents:
diff changeset
688 .align LOG2_PTRSIZE
kono
parents:
diff changeset
689 LEFDE..2:
kono
parents:
diff changeset
690 .vbyte 4,0 /* End of FDEs */
kono
parents:
diff changeset
691
kono
parents:
diff changeset
692 .csect .text[PR]
kono
parents:
diff changeset
693 .ref _GLOBAL__F_libffi_src_powerpc_aix_closure /* Prevents garbage collection by AIX linker */
kono
parents:
diff changeset
694