xref: /aosp_15_r20/external/libffi/src/frv/eabi.S (revision 1fd5a2e1d639cd1ddf29dd0c484c123bbd850c21)
1*1fd5a2e1SPrashanth Swaminathan/* -----------------------------------------------------------------------
2*1fd5a2e1SPrashanth Swaminathan   eabi.S - Copyright (c) 2004  Anthony Green
3*1fd5a2e1SPrashanth Swaminathan
4*1fd5a2e1SPrashanth Swaminathan   FR-V 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	# gr8 :   ffi_prep_args
38*1fd5a2e1SPrashanth Swaminathan	# gr9 :   &ecif
39*1fd5a2e1SPrashanth Swaminathan	# gr10:   cif->bytes
40*1fd5a2e1SPrashanth Swaminathan	# gr11:   fig->flags
41*1fd5a2e1SPrashanth Swaminathan	# gr12:   ecif.rvalue
42*1fd5a2e1SPrashanth Swaminathan	# gr13:   fn
43*1fd5a2e1SPrashanth Swaminathan
44*1fd5a2e1SPrashanth Swaminathanffi_call_EABI:
45*1fd5a2e1SPrashanth Swaminathan	addi	sp, #-80, sp
46*1fd5a2e1SPrashanth Swaminathan	sti	fp, @(sp, #24)
47*1fd5a2e1SPrashanth Swaminathan	addi	sp, #24, fp
48*1fd5a2e1SPrashanth Swaminathan	movsg	lr, gr5
49*1fd5a2e1SPrashanth Swaminathan
50*1fd5a2e1SPrashanth Swaminathan	/* Make room for the new arguments.  */
51*1fd5a2e1SPrashanth Swaminathan	/* subi	sp, fp, gr10 */
52*1fd5a2e1SPrashanth Swaminathan
53*1fd5a2e1SPrashanth Swaminathan	/* Store return address and incoming args on stack.  */
54*1fd5a2e1SPrashanth Swaminathan	sti	gr5, @(fp, #8)
55*1fd5a2e1SPrashanth Swaminathan	sti	gr8, @(fp, #-4)
56*1fd5a2e1SPrashanth Swaminathan	sti	gr9, @(fp, #-8)
57*1fd5a2e1SPrashanth Swaminathan	sti	gr10, @(fp, #-12)
58*1fd5a2e1SPrashanth Swaminathan	sti	gr11, @(fp, #-16)
59*1fd5a2e1SPrashanth Swaminathan	sti	gr12, @(fp, #-20)
60*1fd5a2e1SPrashanth Swaminathan	sti	gr13, @(fp, #-24)
61*1fd5a2e1SPrashanth Swaminathan
62*1fd5a2e1SPrashanth Swaminathan	sub     sp, gr10, sp
63*1fd5a2e1SPrashanth Swaminathan
64*1fd5a2e1SPrashanth Swaminathan	/* Call ffi_prep_args.  */
65*1fd5a2e1SPrashanth Swaminathan	ldi	@(fp, #-4), gr4
66*1fd5a2e1SPrashanth Swaminathan	addi	sp, #0, gr8
67*1fd5a2e1SPrashanth Swaminathan	ldi	@(fp, #-8), gr9
68*1fd5a2e1SPrashanth Swaminathan#ifdef __FRV_FDPIC__
69*1fd5a2e1SPrashanth Swaminathan	ldd	@(gr4, gr0), gr14
70*1fd5a2e1SPrashanth Swaminathan	calll	@(gr14, gr0)
71*1fd5a2e1SPrashanth Swaminathan#else
72*1fd5a2e1SPrashanth Swaminathan	calll	@(gr4, gr0)
73*1fd5a2e1SPrashanth Swaminathan#endif
74*1fd5a2e1SPrashanth Swaminathan
75*1fd5a2e1SPrashanth Swaminathan	/* ffi_prep_args returns the new stack pointer.  */
76*1fd5a2e1SPrashanth Swaminathan	mov	gr8, gr4
77*1fd5a2e1SPrashanth Swaminathan
78*1fd5a2e1SPrashanth Swaminathan	ldi	@(sp, #0), gr8
79*1fd5a2e1SPrashanth Swaminathan	ldi	@(sp, #4), gr9
80*1fd5a2e1SPrashanth Swaminathan	ldi	@(sp, #8), gr10
81*1fd5a2e1SPrashanth Swaminathan	ldi	@(sp, #12), gr11
82*1fd5a2e1SPrashanth Swaminathan	ldi	@(sp, #16), gr12
83*1fd5a2e1SPrashanth Swaminathan	ldi	@(sp, #20), gr13
84*1fd5a2e1SPrashanth Swaminathan
85*1fd5a2e1SPrashanth Swaminathan	/* Always copy the return value pointer into the hidden
86*1fd5a2e1SPrashanth Swaminathan	   parameter register.  This is only strictly necessary
87*1fd5a2e1SPrashanth Swaminathan	   when we're returning an aggregate type, but it doesn't
88*1fd5a2e1SPrashanth Swaminathan	   hurt to do this all the time, and it saves a branch.  */
89*1fd5a2e1SPrashanth Swaminathan	ldi	@(fp, #-20), gr3
90*1fd5a2e1SPrashanth Swaminathan
91*1fd5a2e1SPrashanth Swaminathan	/* Use the ffi_prep_args return value for the new sp.  */
92*1fd5a2e1SPrashanth Swaminathan	mov	gr4, sp
93*1fd5a2e1SPrashanth Swaminathan
94*1fd5a2e1SPrashanth Swaminathan	/* Call the target function.  */
95*1fd5a2e1SPrashanth Swaminathan	ldi	@(fp, -24), gr4
96*1fd5a2e1SPrashanth Swaminathan#ifdef __FRV_FDPIC__
97*1fd5a2e1SPrashanth Swaminathan	ldd	@(gr4, gr0), gr14
98*1fd5a2e1SPrashanth Swaminathan	calll	@(gr14, gr0)
99*1fd5a2e1SPrashanth Swaminathan#else
100*1fd5a2e1SPrashanth Swaminathan	calll	@(gr4, gr0)
101*1fd5a2e1SPrashanth Swaminathan#endif
102*1fd5a2e1SPrashanth Swaminathan
103*1fd5a2e1SPrashanth Swaminathan	/* Store the result. */
104*1fd5a2e1SPrashanth Swaminathan	ldi	@(fp, #-16), gr10  /* fig->flags */
105*1fd5a2e1SPrashanth Swaminathan	ldi	@(fp, #-20), gr4   /* ecif.rvalue */
106*1fd5a2e1SPrashanth Swaminathan
107*1fd5a2e1SPrashanth Swaminathan	/* Is the return value stored in two registers?  */
108*1fd5a2e1SPrashanth Swaminathan	cmpi	gr10, #8, icc0
109*1fd5a2e1SPrashanth Swaminathan	bne	icc0, 0, .L2
110*1fd5a2e1SPrashanth Swaminathan	/*   Yes, save them.  */
111*1fd5a2e1SPrashanth Swaminathan	sti	gr8, @(gr4, #0)
112*1fd5a2e1SPrashanth Swaminathan	sti	gr9, @(gr4, #4)
113*1fd5a2e1SPrashanth Swaminathan	bra	.L3
114*1fd5a2e1SPrashanth Swaminathan.L2:
115*1fd5a2e1SPrashanth Swaminathan	/* Is the return value a structure?  */
116*1fd5a2e1SPrashanth Swaminathan	cmpi	gr10, #-1, icc0
117*1fd5a2e1SPrashanth Swaminathan	beq	icc0, 0, .L3
118*1fd5a2e1SPrashanth Swaminathan	/*   No, save a 4 byte return value.  */
119*1fd5a2e1SPrashanth Swaminathan	sti	gr8, @(gr4, #0)
120*1fd5a2e1SPrashanth Swaminathan.L3:
121*1fd5a2e1SPrashanth Swaminathan
122*1fd5a2e1SPrashanth Swaminathan	/* Restore the stack, and return.  */
123*1fd5a2e1SPrashanth Swaminathan	ldi	@(fp, 8), gr5
124*1fd5a2e1SPrashanth Swaminathan	ld	@(fp, gr0), fp
125*1fd5a2e1SPrashanth Swaminathan	addi	sp,#80,sp
126*1fd5a2e1SPrashanth Swaminathan	jmpl	@(gr5,gr0)
127*1fd5a2e1SPrashanth Swaminathan	.size ffi_call_EABI, .-ffi_call_EABI
128*1fd5a2e1SPrashanth Swaminathan
129