xref: /aosp_15_r20/external/libffi/src/m32r/sysv.S (revision 1fd5a2e1d639cd1ddf29dd0c484c123bbd850c21)
1*1fd5a2e1SPrashanth Swaminathan/* -----------------------------------------------------------------------
2*1fd5a2e1SPrashanth Swaminathan   sysv.S - Copyright (c) 2004 Renesas Technology
3*1fd5a2e1SPrashanth Swaminathan
4*1fd5a2e1SPrashanth Swaminathan   M32R Foreign Function Interface
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 RENESAS TECHNOLOGY 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#ifdef HAVE_MACHINE_ASM_H
30*1fd5a2e1SPrashanth Swaminathan#include <machine/asm.h>
31*1fd5a2e1SPrashanth Swaminathan#else
32*1fd5a2e1SPrashanth Swaminathan/* XXX these lose for some platforms, I'm sure.  */
33*1fd5a2e1SPrashanth Swaminathan#define CNAME(x) x
34*1fd5a2e1SPrashanth Swaminathan#define ENTRY(x) .globl CNAME(x)! .type CNAME(x),%function! CNAME(x):
35*1fd5a2e1SPrashanth Swaminathan#endif
36*1fd5a2e1SPrashanth Swaminathan
37*1fd5a2e1SPrashanth Swaminathan.text
38*1fd5a2e1SPrashanth Swaminathan
39*1fd5a2e1SPrashanth Swaminathan	/* R0:   ffi_prep_args */
40*1fd5a2e1SPrashanth Swaminathan	/* R1:   &ecif */
41*1fd5a2e1SPrashanth Swaminathan	/* R2:   cif->bytes */
42*1fd5a2e1SPrashanth Swaminathan	/* R3:   fig->flags */
43*1fd5a2e1SPrashanth Swaminathan	/* sp+0: ecif.rvalue */
44*1fd5a2e1SPrashanth Swaminathan	/* sp+4: fn */
45*1fd5a2e1SPrashanth Swaminathan
46*1fd5a2e1SPrashanth Swaminathan	/* This assumes we are using gas.  */
47*1fd5a2e1SPrashanth SwaminathanENTRY(ffi_call_SYSV)
48*1fd5a2e1SPrashanth Swaminathan	/* Save registers.  */
49*1fd5a2e1SPrashanth Swaminathan	push	fp
50*1fd5a2e1SPrashanth Swaminathan	push	lr
51*1fd5a2e1SPrashanth Swaminathan	push	r3
52*1fd5a2e1SPrashanth Swaminathan	push	r2
53*1fd5a2e1SPrashanth Swaminathan	push	r1
54*1fd5a2e1SPrashanth Swaminathan	push	r0
55*1fd5a2e1SPrashanth Swaminathan	mv	fp, sp
56*1fd5a2e1SPrashanth Swaminathan
57*1fd5a2e1SPrashanth Swaminathan	/* Make room for all of the new args.  */
58*1fd5a2e1SPrashanth Swaminathan	sub	sp, r2
59*1fd5a2e1SPrashanth Swaminathan
60*1fd5a2e1SPrashanth Swaminathan	/* Place all of the ffi_prep_args in position.  */
61*1fd5a2e1SPrashanth Swaminathan	mv	lr, r0
62*1fd5a2e1SPrashanth Swaminathan	mv	r0, sp
63*1fd5a2e1SPrashanth Swaminathan	/* R1 already set.  */
64*1fd5a2e1SPrashanth Swaminathan
65*1fd5a2e1SPrashanth Swaminathan	/* And call.  */
66*1fd5a2e1SPrashanth Swaminathan	jl	lr
67*1fd5a2e1SPrashanth Swaminathan
68*1fd5a2e1SPrashanth Swaminathan	/* Move first 4 parameters in registers...  */
69*1fd5a2e1SPrashanth Swaminathan	ld	r0, @(0,sp)
70*1fd5a2e1SPrashanth Swaminathan	ld	r1, @(4,sp)
71*1fd5a2e1SPrashanth Swaminathan	ld	r2, @(8,sp)
72*1fd5a2e1SPrashanth Swaminathan        ld	r3, @(12,sp)
73*1fd5a2e1SPrashanth Swaminathan
74*1fd5a2e1SPrashanth Swaminathan	/* ...and adjust the stack.  */
75*1fd5a2e1SPrashanth Swaminathan	ld	lr, @(8,fp)
76*1fd5a2e1SPrashanth Swaminathan        cmpi	lr, #16
77*1fd5a2e1SPrashanth Swaminathan	bc	adjust_stack
78*1fd5a2e1SPrashanth Swaminathan	ldi	lr, #16
79*1fd5a2e1SPrashanth Swaminathanadjust_stack:
80*1fd5a2e1SPrashanth Swaminathan        add	sp, lr
81*1fd5a2e1SPrashanth Swaminathan
82*1fd5a2e1SPrashanth Swaminathan	/* Call the function.  */
83*1fd5a2e1SPrashanth Swaminathan	ld	lr, @(28,fp)
84*1fd5a2e1SPrashanth Swaminathan	jl	lr
85*1fd5a2e1SPrashanth Swaminathan
86*1fd5a2e1SPrashanth Swaminathan	/* Remove the space we pushed for the args.  */
87*1fd5a2e1SPrashanth Swaminathan	mv	sp, fp
88*1fd5a2e1SPrashanth Swaminathan
89*1fd5a2e1SPrashanth Swaminathan	/* Load R2 with the pointer to storage for the return value.  */
90*1fd5a2e1SPrashanth Swaminathan	ld	r2, @(24,sp)
91*1fd5a2e1SPrashanth Swaminathan
92*1fd5a2e1SPrashanth Swaminathan	/* Load R3 with the return type code.  */
93*1fd5a2e1SPrashanth Swaminathan	ld	r3, @(12,sp)
94*1fd5a2e1SPrashanth Swaminathan
95*1fd5a2e1SPrashanth Swaminathan	/* If the return value pointer is NULL, assume no return value.  */
96*1fd5a2e1SPrashanth Swaminathan	beqz	r2, epilogue
97*1fd5a2e1SPrashanth Swaminathan
98*1fd5a2e1SPrashanth Swaminathan	/* Return INT.  */
99*1fd5a2e1SPrashanth Swaminathan	ldi	r4, #FFI_TYPE_INT
100*1fd5a2e1SPrashanth Swaminathan	bne	r3, r4, return_double
101*1fd5a2e1SPrashanth Swaminathan	st	r0, @r2
102*1fd5a2e1SPrashanth Swaminathan	bra	epilogue
103*1fd5a2e1SPrashanth Swaminathan
104*1fd5a2e1SPrashanth Swaminathanreturn_double:
105*1fd5a2e1SPrashanth Swaminathan	/* Return DOUBLE or LONGDOUBLE.  */
106*1fd5a2e1SPrashanth Swaminathan	ldi	r4, #FFI_TYPE_DOUBLE
107*1fd5a2e1SPrashanth Swaminathan	bne	r3, r4, epilogue
108*1fd5a2e1SPrashanth Swaminathan	st	r0, @r2
109*1fd5a2e1SPrashanth Swaminathan	st	r1, @(4,r2)
110*1fd5a2e1SPrashanth Swaminathan
111*1fd5a2e1SPrashanth Swaminathanepilogue:
112*1fd5a2e1SPrashanth Swaminathan	pop	r0
113*1fd5a2e1SPrashanth Swaminathan	pop	r1
114*1fd5a2e1SPrashanth Swaminathan	pop	r2
115*1fd5a2e1SPrashanth Swaminathan	pop	r3
116*1fd5a2e1SPrashanth Swaminathan	pop	lr
117*1fd5a2e1SPrashanth Swaminathan	pop	fp
118*1fd5a2e1SPrashanth Swaminathan        jmp lr
119*1fd5a2e1SPrashanth Swaminathan
120*1fd5a2e1SPrashanth Swaminathan.ffi_call_SYSV_end:
121*1fd5a2e1SPrashanth Swaminathan        .size    CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
122