xref: /aosp_15_r20/external/libffi/src/arc/arcompact.S (revision 1fd5a2e1d639cd1ddf29dd0c484c123bbd850c21)
1*1fd5a2e1SPrashanth Swaminathan/* -----------------------------------------------------------------------
2*1fd5a2e1SPrashanth Swaminathan   arcompact.S - Copyright (c) 2013 Synposys, Inc. (www.synopsys.com)
3*1fd5a2e1SPrashanth Swaminathan
4*1fd5a2e1SPrashanth Swaminathan   ARCompact 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#define CNAME(x) x
33*1fd5a2e1SPrashanth Swaminathan#define ENTRY(x) .globl CNAME(x)` .type CNAME(x),%function` CNAME(x):
34*1fd5a2e1SPrashanth Swaminathan#endif
35*1fd5a2e1SPrashanth Swaminathan
36*1fd5a2e1SPrashanth Swaminathan.text
37*1fd5a2e1SPrashanth Swaminathan
38*1fd5a2e1SPrashanth Swaminathan        /* R0:   ffi_prep_args */
39*1fd5a2e1SPrashanth Swaminathan        /* R1:   &ecif */
40*1fd5a2e1SPrashanth Swaminathan        /* R2:   cif->bytes */
41*1fd5a2e1SPrashanth Swaminathan        /* R3:   fig->flags */
42*1fd5a2e1SPrashanth Swaminathan        /* R4:   ecif.rvalue */
43*1fd5a2e1SPrashanth Swaminathan        /* R5:   fn */
44*1fd5a2e1SPrashanth SwaminathanENTRY(ffi_call_ARCompact)
45*1fd5a2e1SPrashanth Swaminathan        /* Save registers.  */
46*1fd5a2e1SPrashanth Swaminathan        st.a       fp, [sp, -4]        /* fp + 20, fp */
47*1fd5a2e1SPrashanth Swaminathan        push_s     blink               /* fp + 16, blink */
48*1fd5a2e1SPrashanth Swaminathan        st.a       r4, [sp, -4]        /* fp + 12, ecif.rvalue */
49*1fd5a2e1SPrashanth Swaminathan        push_s     r3                  /* fp +  8, fig->flags */
50*1fd5a2e1SPrashanth Swaminathan        st.a       r5, [sp, -4]        /* fp +  4, fn */
51*1fd5a2e1SPrashanth Swaminathan        push_s     r2                  /* fp +  0, cif->bytes */
52*1fd5a2e1SPrashanth Swaminathan        mov        fp, sp
53*1fd5a2e1SPrashanth Swaminathan
54*1fd5a2e1SPrashanth Swaminathan        /* Make room for all of the new args.  */
55*1fd5a2e1SPrashanth Swaminathan        sub        sp, sp, r2
56*1fd5a2e1SPrashanth Swaminathan
57*1fd5a2e1SPrashanth Swaminathan        /* Place all of the ffi_prep_args in position.  */
58*1fd5a2e1SPrashanth Swaminathan        /* ffi_prep_args(char *stack, extended_cif *ecif) */
59*1fd5a2e1SPrashanth Swaminathan        /* R1 already set.  */
60*1fd5a2e1SPrashanth Swaminathan
61*1fd5a2e1SPrashanth Swaminathan        /* And call.  */
62*1fd5a2e1SPrashanth Swaminathan        jl_s.d     [r0]
63*1fd5a2e1SPrashanth Swaminathan        mov_s      r0, sp
64*1fd5a2e1SPrashanth Swaminathan
65*1fd5a2e1SPrashanth Swaminathan        ld.ab      r12, [fp, 4]        /* cif->bytes */
66*1fd5a2e1SPrashanth Swaminathan        ld.ab      r11, [fp, 4]        /* fn */
67*1fd5a2e1SPrashanth Swaminathan
68*1fd5a2e1SPrashanth Swaminathan        /* Move first 8 parameters in registers...  */
69*1fd5a2e1SPrashanth Swaminathan        ld_s       r0, [sp]
70*1fd5a2e1SPrashanth Swaminathan        ld_s       r1, [sp, 4]
71*1fd5a2e1SPrashanth Swaminathan        ld_s       r2, [sp, 8]
72*1fd5a2e1SPrashanth Swaminathan        ld_s       r3, [sp, 12]
73*1fd5a2e1SPrashanth Swaminathan        ld         r4, [sp, 16]
74*1fd5a2e1SPrashanth Swaminathan        ld         r5, [sp, 20]
75*1fd5a2e1SPrashanth Swaminathan        ld         r6, [sp, 24]
76*1fd5a2e1SPrashanth Swaminathan        ld         r7, [sp, 28]
77*1fd5a2e1SPrashanth Swaminathan
78*1fd5a2e1SPrashanth Swaminathan        /* ...and adjust the stack.  */
79*1fd5a2e1SPrashanth Swaminathan        min        r12, r12, 32
80*1fd5a2e1SPrashanth Swaminathan
81*1fd5a2e1SPrashanth Swaminathan        /* Call the function.  */
82*1fd5a2e1SPrashanth Swaminathan        jl.d       [r11]
83*1fd5a2e1SPrashanth Swaminathan        add        sp, sp, r12
84*1fd5a2e1SPrashanth Swaminathan
85*1fd5a2e1SPrashanth Swaminathan        mov        sp, fp
86*1fd5a2e1SPrashanth Swaminathan        pop_s      r3        /* fig->flags, return type */
87*1fd5a2e1SPrashanth Swaminathan        pop_s      r2        /* ecif.rvalue, pointer for return value */
88*1fd5a2e1SPrashanth Swaminathan
89*1fd5a2e1SPrashanth Swaminathan        /* If the return value pointer is NULL, assume no return value.  */
90*1fd5a2e1SPrashanth Swaminathan        breq.d     r2, 0, epilogue
91*1fd5a2e1SPrashanth Swaminathan        pop_s      blink
92*1fd5a2e1SPrashanth Swaminathan
93*1fd5a2e1SPrashanth Swaminathan        /* Return INT.  */
94*1fd5a2e1SPrashanth Swaminathan        brne       r3, FFI_TYPE_INT, return_double
95*1fd5a2e1SPrashanth Swaminathan        b.d        epilogue
96*1fd5a2e1SPrashanth Swaminathan        st_s       r0, [r2]
97*1fd5a2e1SPrashanth Swaminathan
98*1fd5a2e1SPrashanth Swaminathanreturn_double:
99*1fd5a2e1SPrashanth Swaminathan        brne       r3, FFI_TYPE_DOUBLE, epilogue
100*1fd5a2e1SPrashanth Swaminathan        st_s       r0, [r2]
101*1fd5a2e1SPrashanth Swaminathan        st_s       r1, [r2,4]
102*1fd5a2e1SPrashanth Swaminathan
103*1fd5a2e1SPrashanth Swaminathanepilogue:
104*1fd5a2e1SPrashanth Swaminathan        j_s.d      [blink]
105*1fd5a2e1SPrashanth Swaminathan        ld.ab      fp, [sp, 4]
106*1fd5a2e1SPrashanth Swaminathan
107*1fd5a2e1SPrashanth SwaminathanENTRY(ffi_closure_ARCompact)
108*1fd5a2e1SPrashanth Swaminathan        st.a       r0, [sp, -32]
109*1fd5a2e1SPrashanth Swaminathan        st_s       r1, [sp, 4]
110*1fd5a2e1SPrashanth Swaminathan        st_s       r2, [sp, 8]
111*1fd5a2e1SPrashanth Swaminathan        st_s       r3, [sp, 12]
112*1fd5a2e1SPrashanth Swaminathan        st         r4, [sp, 16]
113*1fd5a2e1SPrashanth Swaminathan        st         r5, [sp, 20]
114*1fd5a2e1SPrashanth Swaminathan        st         r6, [sp, 24]
115*1fd5a2e1SPrashanth Swaminathan        st         r7, [sp, 28]
116*1fd5a2e1SPrashanth Swaminathan
117*1fd5a2e1SPrashanth Swaminathan        /* pointer to arguments */
118*1fd5a2e1SPrashanth Swaminathan        mov_s      r2, sp
119*1fd5a2e1SPrashanth Swaminathan
120*1fd5a2e1SPrashanth Swaminathan        /* return value goes here */
121*1fd5a2e1SPrashanth Swaminathan        sub        sp, sp, 8
122*1fd5a2e1SPrashanth Swaminathan        mov_s      r1, sp
123*1fd5a2e1SPrashanth Swaminathan
124*1fd5a2e1SPrashanth Swaminathan        push_s     blink
125*1fd5a2e1SPrashanth Swaminathan
126*1fd5a2e1SPrashanth Swaminathan        bl.d       ffi_closure_inner_ARCompact
127*1fd5a2e1SPrashanth Swaminathan        mov_s      r0, r8                /* codeloc, set by trampoline */
128*1fd5a2e1SPrashanth Swaminathan
129*1fd5a2e1SPrashanth Swaminathan        pop_s      blink
130*1fd5a2e1SPrashanth Swaminathan
131*1fd5a2e1SPrashanth Swaminathan        /* set return value to r1:r0 */
132*1fd5a2e1SPrashanth Swaminathan        pop_s      r0
133*1fd5a2e1SPrashanth Swaminathan        pop_s      r1
134*1fd5a2e1SPrashanth Swaminathan        j_s.d      [blink]
135*1fd5a2e1SPrashanth Swaminathan        add_s      sp, sp, 32
136