xref: /aosp_15_r20/external/libffi/src/moxie/eabi.S (revision 1fd5a2e1d639cd1ddf29dd0c484c123bbd850c21)
1*1fd5a2e1SPrashanth Swaminathan/* -----------------------------------------------------------------------
2*1fd5a2e1SPrashanth Swaminathan   eabi.S - Copyright (c) 2012, 2013  Anthony Green
3*1fd5a2e1SPrashanth Swaminathan
4*1fd5a2e1SPrashanth Swaminathan   Moxie Assembly glue.
5*1fd5a2e1SPrashanth Swaminathan
6*1fd5a2e1SPrashanth Swaminathan   Permission is hereby granted, free of charge, to any person obtaining
7*1fd5a2e1SPrashanth Swaminathan   a copy of this software and associated documentation files (the
8*1fd5a2e1SPrashanth Swaminathan   ``Software''), to deal in the Software without restriction, including
9*1fd5a2e1SPrashanth Swaminathan   without limitation the rights to use, copy, modify, merge, publish,
10*1fd5a2e1SPrashanth Swaminathan   distribute, sublicense, and/or sell copies of the Software, and to
11*1fd5a2e1SPrashanth Swaminathan   permit persons to whom the Software is furnished to do so, subject to
12*1fd5a2e1SPrashanth Swaminathan   the following conditions:
13*1fd5a2e1SPrashanth Swaminathan
14*1fd5a2e1SPrashanth Swaminathan   The above copyright notice and this permission notice shall be included
15*1fd5a2e1SPrashanth Swaminathan   in all copies or substantial portions of the Software.
16*1fd5a2e1SPrashanth Swaminathan
17*1fd5a2e1SPrashanth Swaminathan   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
18*1fd5a2e1SPrashanth Swaminathan   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19*1fd5a2e1SPrashanth Swaminathan   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20*1fd5a2e1SPrashanth Swaminathan   IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
21*1fd5a2e1SPrashanth Swaminathan   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22*1fd5a2e1SPrashanth Swaminathan   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23*1fd5a2e1SPrashanth Swaminathan   OTHER DEALINGS IN THE SOFTWARE.
24*1fd5a2e1SPrashanth Swaminathan   ----------------------------------------------------------------------- */
25*1fd5a2e1SPrashanth Swaminathan
26*1fd5a2e1SPrashanth Swaminathan#define LIBFFI_ASM
27*1fd5a2e1SPrashanth Swaminathan#include <fficonfig.h>
28*1fd5a2e1SPrashanth Swaminathan#include <ffi.h>
29*1fd5a2e1SPrashanth Swaminathan
30*1fd5a2e1SPrashanth Swaminathan	.globl ffi_prep_args_EABI
31*1fd5a2e1SPrashanth Swaminathan
32*1fd5a2e1SPrashanth Swaminathan	.text
33*1fd5a2e1SPrashanth Swaminathan	.p2align 4
34*1fd5a2e1SPrashanth Swaminathan	.globl ffi_call_EABI
35*1fd5a2e1SPrashanth Swaminathan	.type ffi_call_EABI, @function
36*1fd5a2e1SPrashanth Swaminathan
37*1fd5a2e1SPrashanth Swaminathan	# $r0 :   ffi_prep_args
38*1fd5a2e1SPrashanth Swaminathan	# $r1 :   &ecif
39*1fd5a2e1SPrashanth Swaminathan	# $r2 :   cif->bytes
40*1fd5a2e1SPrashanth Swaminathan	# $r3 :   fig->flags
41*1fd5a2e1SPrashanth Swaminathan	# $r4 :   ecif.rvalue
42*1fd5a2e1SPrashanth Swaminathan	# $r5 :   fn
43*1fd5a2e1SPrashanth Swaminathan
44*1fd5a2e1SPrashanth Swaminathanffi_call_EABI:
45*1fd5a2e1SPrashanth Swaminathan	push	$sp, $r6
46*1fd5a2e1SPrashanth Swaminathan	push	$sp, $r7
47*1fd5a2e1SPrashanth Swaminathan	push	$sp, $r8
48*1fd5a2e1SPrashanth Swaminathan	dec	$sp, 24
49*1fd5a2e1SPrashanth Swaminathan
50*1fd5a2e1SPrashanth Swaminathan	/* Store incoming args on stack.  */
51*1fd5a2e1SPrashanth Swaminathan	sto.l	0($sp), $r0 /* ffi_prep_args */
52*1fd5a2e1SPrashanth Swaminathan	sto.l	4($sp), $r1 /* ecif */
53*1fd5a2e1SPrashanth Swaminathan	sto.l	8($sp), $r2 /* bytes */
54*1fd5a2e1SPrashanth Swaminathan	sto.l	12($sp), $r3 /* flags */
55*1fd5a2e1SPrashanth Swaminathan	sto.l	16($sp), $r4 /* &rvalue */
56*1fd5a2e1SPrashanth Swaminathan	sto.l	20($sp), $r5 /* fn */
57*1fd5a2e1SPrashanth Swaminathan
58*1fd5a2e1SPrashanth Swaminathan	/* Call ffi_prep_args.  */
59*1fd5a2e1SPrashanth Swaminathan	mov 	$r6, $r4 /* Save result buffer */
60*1fd5a2e1SPrashanth Swaminathan	mov	$r7, $r5 /* Save the target fn */
61*1fd5a2e1SPrashanth Swaminathan	mov	$r8, $r3 /* Save the flags */
62*1fd5a2e1SPrashanth Swaminathan	sub	$sp, $r2 /* Allocate stack space */
63*1fd5a2e1SPrashanth Swaminathan	mov	$r0, $sp /* We can stomp over $r0 */
64*1fd5a2e1SPrashanth Swaminathan	/* $r1 is already set up */
65*1fd5a2e1SPrashanth Swaminathan	jsra 	ffi_prep_args
66*1fd5a2e1SPrashanth Swaminathan
67*1fd5a2e1SPrashanth Swaminathan	/* Load register arguments.  */
68*1fd5a2e1SPrashanth Swaminathan	ldo.l	$r0, 0($sp)
69*1fd5a2e1SPrashanth Swaminathan	ldo.l	$r1, 4($sp)
70*1fd5a2e1SPrashanth Swaminathan	ldo.l	$r2, 8($sp)
71*1fd5a2e1SPrashanth Swaminathan	ldo.l	$r3, 12($sp)
72*1fd5a2e1SPrashanth Swaminathan	ldo.l	$r4, 16($sp)
73*1fd5a2e1SPrashanth Swaminathan	ldo.l	$r5, 20($sp)
74*1fd5a2e1SPrashanth Swaminathan
75*1fd5a2e1SPrashanth Swaminathan	/* Call the target function.  */
76*1fd5a2e1SPrashanth Swaminathan	jsr	$r7
77*1fd5a2e1SPrashanth Swaminathan
78*1fd5a2e1SPrashanth Swaminathan	ldi.l	$r7, 0xffffffff
79*1fd5a2e1SPrashanth Swaminathan	cmp	$r8, $r7
80*1fd5a2e1SPrashanth Swaminathan	beq	retstruct
81*1fd5a2e1SPrashanth Swaminathan
82*1fd5a2e1SPrashanth Swaminathan	ldi.l	$r7, 4
83*1fd5a2e1SPrashanth Swaminathan	cmp	$r8, $r7
84*1fd5a2e1SPrashanth Swaminathan	bgt	ret2reg
85*1fd5a2e1SPrashanth Swaminathan
86*1fd5a2e1SPrashanth Swaminathan	st.l	($r6), $r0
87*1fd5a2e1SPrashanth Swaminathan	jmpa	retdone
88*1fd5a2e1SPrashanth Swaminathan
89*1fd5a2e1SPrashanth Swaminathanret2reg:
90*1fd5a2e1SPrashanth Swaminathan	st.l	($r6), $r0
91*1fd5a2e1SPrashanth Swaminathan	sto.l	4($r6), $r1
92*1fd5a2e1SPrashanth Swaminathan
93*1fd5a2e1SPrashanth Swaminathanretstruct:
94*1fd5a2e1SPrashanth Swaminathanretdone:
95*1fd5a2e1SPrashanth Swaminathan	/* Return.  */
96*1fd5a2e1SPrashanth Swaminathan	ldo.l	$r6, -4($fp)
97*1fd5a2e1SPrashanth Swaminathan	ldo.l	$r7, -8($fp)
98*1fd5a2e1SPrashanth Swaminathan	ldo.l	$r8, -12($fp)
99*1fd5a2e1SPrashanth Swaminathan	ret
100*1fd5a2e1SPrashanth Swaminathan	.size ffi_call_EABI, .-ffi_call_EABI
101*1fd5a2e1SPrashanth Swaminathan
102