1 /* -----------------------------------------------------------------------
2 aix.S - Copyright (c) 2002, 2009 Free Software Foundation, Inc.
3 based on darwin.S by John Hornkvist
7 Permission is hereby granted, free of charge, to any person obtaining
8 a copy of this software and associated documentation files (the
9 ``Software''), to deal in the Software without restriction, including
10 without limitation the rights to use, copy, modify, merge, publish,
11 distribute, sublicense, and/or sell copies of the Software, and to
12 permit persons to whom the Software is furnished to do so, subject to
13 the following conditions:
15 The above copyright notice and this permission notice shall be included
16 in all copies or substantial portions of the Software.
18 THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21 IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
22 OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
23 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24 OTHER DEALINGS IN THE SOFTWARE.
25 ----------------------------------------------------------------------- */
82 .extern .ffi_prep_args
85 #include <fficonfig.h>
87 #define JUMPTARGET(name) name
92 /* void ffi_call_AIX(extended_cif *ecif, unsigned long bytes,
93 * unsigned int flags, unsigned int *rvalue,
95 * void (*prep_args)(extended_cif*, unsigned *const));
96 * r3=ecif, r4=bytes, r5=flags, r6=rvalue, r7=fn, r8=prep_args
103 .csect ffi_call_AIX[DS]
106 .llong .ffi_call_AIX, TOC[tc0], 0
109 /* Save registers we use. */
118 mr r28, r1 /* our AP. */
121 /* Save arguments over call... */
122 mr r31, r5 /* flags, */
123 mr r30, r6 /* rvalue, */
124 mr r29, r7 /* function address. */
127 /* Call ffi_prep_args. */
132 /* Now do the call. */
136 /* Set up cr1 with bits 4-7 of the flags. */
139 /* Load all those argument registers. */
140 // We have set up a nice stack frame, just load it into registers.
152 /* Load all the FP registers. */
154 lfd f1,-32-(13*8)(r28)
155 lfd f2,-32-(12*8)(r28)
156 lfd f3,-32-(11*8)(r28)
157 lfd f4,-32-(10*8)(r28)
159 lfd f5,-32-(9*8)(r28)
160 lfd f6,-32-(8*8)(r28)
161 lfd f7,-32-(7*8)(r28)
162 lfd f8,-32-(6*8)(r28)
164 lfd f9,-32-(5*8)(r28)
165 lfd f10,-32-(4*8)(r28)
166 lfd f11,-32-(3*8)(r28)
167 lfd f12,-32-(2*8)(r28)
169 lfd f13,-32-(1*8)(r28)
176 /* Now, deal with the return value. */
179 bt 30, L(done_return_value)
180 bt 29, L(fp_return_value)
183 /* Fall through... */
185 L(done_return_value):
186 /* Restore the registers we used and return. */
197 bf 28, L(float_return_value)
199 bf 31, L(done_return_value)
201 b L(done_return_value)
202 L(float_return_value):
204 b L(done_return_value)
206 #else /* ! __64BIT__ */
208 .long .ffi_call_AIX, TOC[tc0], 0
211 /* Save registers we use. */
220 mr r28, r1 /* out AP. */
223 /* Save arguments over call... */
224 mr r31, r5 /* flags, */
225 mr r30, r6 /* rvalue, */
226 mr r29, r7 /* function address, */
229 /* Call ffi_prep_args. */
234 /* Now do the call. */
238 /* Set up cr1 with bits 4-7 of the flags. */
241 /* Load all those argument registers. */
242 // We have set up a nice stack frame, just load it into registers.
254 /* Load all the FP registers. */
256 lfd f1,-16-(13*8)(r28)
257 lfd f2,-16-(12*8)(r28)
258 lfd f3,-16-(11*8)(r28)
259 lfd f4,-16-(10*8)(r28)
261 lfd f5,-16-(9*8)(r28)
262 lfd f6,-16-(8*8)(r28)
263 lfd f7,-16-(7*8)(r28)
264 lfd f8,-16-(6*8)(r28)
266 lfd f9,-16-(5*8)(r28)
267 lfd f10,-16-(4*8)(r28)
268 lfd f11,-16-(3*8)(r28)
269 lfd f12,-16-(2*8)(r28)
271 lfd f13,-16-(1*8)(r28)
278 /* Now, deal with the return value. */
281 bt 30, L(done_return_value)
282 bt 29, L(fp_return_value)
284 bf 28, L(done_return_value)
287 /* Fall through... */
289 L(done_return_value):
290 /* Restore the registers we used and return. */
301 bf 28, L(float_return_value)
303 b L(done_return_value)
304 L(float_return_value):
306 b L(done_return_value)
309 .byte 0,0,0,1,128,4,0,0
314 .globl ffi_call_DARWIN
315 .globl .ffi_call_DARWIN
316 .csect ffi_call_DARWIN[DS]
319 .llong .ffi_call_DARWIN, TOC[tc0], 0
321 .long .ffi_call_DARWIN, TOC[tc0], 0
327 .byte 0,0,0,0,0,0,0,0
328 //END(ffi_call_DARWIN)