annotate libffi/src/arc/arcompact.S @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* -----------------------------------------------------------------------
kono
parents:
diff changeset
2 arcompact.S - Copyright (c) 2013 Synposys, Inc. (www.synopsys.com)
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 ARCompact Foreign Function Interface
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 Permission is hereby granted, free of charge, to any person obtaining
kono
parents:
diff changeset
7 a copy of this software and associated documentation files (the
kono
parents:
diff changeset
8 ``Software''), to deal in the Software without restriction, including
kono
parents:
diff changeset
9 without limitation the rights to use, copy, modify, merge, publish,
kono
parents:
diff changeset
10 distribute, sublicense, and/or sell copies of the Software, and to
kono
parents:
diff changeset
11 permit persons to whom the Software is furnished to do so, subject to
kono
parents:
diff changeset
12 the following conditions:
kono
parents:
diff changeset
13
kono
parents:
diff changeset
14 The above copyright notice and this permission notice shall be included
kono
parents:
diff changeset
15 in all copies or substantial portions of the Software.
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
kono
parents:
diff changeset
18 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
kono
parents:
diff changeset
19 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
kono
parents:
diff changeset
20 IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR
kono
parents:
diff changeset
21 OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
kono
parents:
diff changeset
22 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
kono
parents:
diff changeset
23 OTHER DEALINGS IN THE SOFTWARE.
kono
parents:
diff changeset
24 ----------------------------------------------------------------------- */
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 #define LIBFFI_ASM
kono
parents:
diff changeset
27 #include <fficonfig.h>
kono
parents:
diff changeset
28 #include <ffi.h>
kono
parents:
diff changeset
29 #ifdef HAVE_MACHINE_ASM_H
kono
parents:
diff changeset
30 #include <machine/asm.h>
kono
parents:
diff changeset
31 #else
kono
parents:
diff changeset
32 #define CNAME(x) x
kono
parents:
diff changeset
33 #define ENTRY(x) .globl CNAME(x)` .type CNAME(x),%function` CNAME(x):
kono
parents:
diff changeset
34 #endif
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 .text
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 /* R0: ffi_prep_args */
kono
parents:
diff changeset
39 /* R1: &ecif */
kono
parents:
diff changeset
40 /* R2: cif->bytes */
kono
parents:
diff changeset
41 /* R3: fig->flags */
kono
parents:
diff changeset
42 /* R4: ecif.rvalue */
kono
parents:
diff changeset
43 /* R5: fn */
kono
parents:
diff changeset
44 ENTRY(ffi_call_ARCompact)
kono
parents:
diff changeset
45 /* Save registers. */
kono
parents:
diff changeset
46 st.a fp, [sp, -4] /* fp + 20, fp */
kono
parents:
diff changeset
47 push_s blink /* fp + 16, blink */
kono
parents:
diff changeset
48 st.a r4, [sp, -4] /* fp + 12, ecif.rvalue */
kono
parents:
diff changeset
49 push_s r3 /* fp + 8, fig->flags */
kono
parents:
diff changeset
50 st.a r5, [sp, -4] /* fp + 4, fn */
kono
parents:
diff changeset
51 push_s r2 /* fp + 0, cif->bytes */
kono
parents:
diff changeset
52 mov fp, sp
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 /* Make room for all of the new args. */
kono
parents:
diff changeset
55 sub sp, sp, r2
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 /* Place all of the ffi_prep_args in position. */
kono
parents:
diff changeset
58 /* ffi_prep_args(char *stack, extended_cif *ecif) */
kono
parents:
diff changeset
59 /* R1 already set. */
kono
parents:
diff changeset
60
kono
parents:
diff changeset
61 /* And call. */
kono
parents:
diff changeset
62 jl_s.d [r0]
kono
parents:
diff changeset
63 mov_s r0, sp
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 ld.ab r12, [fp, 4] /* cif->bytes */
kono
parents:
diff changeset
66 ld.ab r11, [fp, 4] /* fn */
kono
parents:
diff changeset
67
kono
parents:
diff changeset
68 /* Move first 8 parameters in registers... */
kono
parents:
diff changeset
69 ld_s r0, [sp]
kono
parents:
diff changeset
70 ld_s r1, [sp, 4]
kono
parents:
diff changeset
71 ld_s r2, [sp, 8]
kono
parents:
diff changeset
72 ld_s r3, [sp, 12]
kono
parents:
diff changeset
73 ld r4, [sp, 16]
kono
parents:
diff changeset
74 ld r5, [sp, 20]
kono
parents:
diff changeset
75 ld r6, [sp, 24]
kono
parents:
diff changeset
76 ld r7, [sp, 28]
kono
parents:
diff changeset
77
kono
parents:
diff changeset
78 /* ...and adjust the stack. */
kono
parents:
diff changeset
79 min r12, r12, 32
kono
parents:
diff changeset
80
kono
parents:
diff changeset
81 /* Call the function. */
kono
parents:
diff changeset
82 jl.d [r11]
kono
parents:
diff changeset
83 add sp, sp, r12
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 mov sp, fp
kono
parents:
diff changeset
86 pop_s r3 /* fig->flags, return type */
kono
parents:
diff changeset
87 pop_s r2 /* ecif.rvalue, pointer for return value */
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 /* If the return value pointer is NULL, assume no return value. */
kono
parents:
diff changeset
90 breq.d r2, 0, epilogue
kono
parents:
diff changeset
91 pop_s blink
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 /* Return INT. */
kono
parents:
diff changeset
94 brne r3, FFI_TYPE_INT, return_double
kono
parents:
diff changeset
95 b.d epilogue
kono
parents:
diff changeset
96 st_s r0, [r2]
kono
parents:
diff changeset
97
kono
parents:
diff changeset
98 return_double:
kono
parents:
diff changeset
99 brne r3, FFI_TYPE_DOUBLE, epilogue
kono
parents:
diff changeset
100 st_s r0, [r2]
kono
parents:
diff changeset
101 st_s r1, [r2,4]
kono
parents:
diff changeset
102
kono
parents:
diff changeset
103 epilogue:
kono
parents:
diff changeset
104 j_s.d [blink]
kono
parents:
diff changeset
105 ld.ab fp, [sp, 4]
kono
parents:
diff changeset
106
kono
parents:
diff changeset
107 ENTRY(ffi_closure_ARCompact)
kono
parents:
diff changeset
108 st.a r0, [sp, -32]
kono
parents:
diff changeset
109 st_s r1, [sp, 4]
kono
parents:
diff changeset
110 st_s r2, [sp, 8]
kono
parents:
diff changeset
111 st_s r3, [sp, 12]
kono
parents:
diff changeset
112 st r4, [sp, 16]
kono
parents:
diff changeset
113 st r5, [sp, 20]
kono
parents:
diff changeset
114 st r6, [sp, 24]
kono
parents:
diff changeset
115 st r7, [sp, 28]
kono
parents:
diff changeset
116
kono
parents:
diff changeset
117 /* pointer to arguments */
kono
parents:
diff changeset
118 mov_s r2, sp
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 /* return value goes here */
kono
parents:
diff changeset
121 sub sp, sp, 8
kono
parents:
diff changeset
122 mov_s r1, sp
kono
parents:
diff changeset
123
kono
parents:
diff changeset
124 push_s blink
kono
parents:
diff changeset
125
kono
parents:
diff changeset
126 bl.d ffi_closure_inner_ARCompact
kono
parents:
diff changeset
127 mov_s r0, r8 /* codeloc, set by trampoline */
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 pop_s blink
kono
parents:
diff changeset
130
kono
parents:
diff changeset
131 /* set return value to r1:r0 */
kono
parents:
diff changeset
132 pop_s r0
kono
parents:
diff changeset
133 pop_s r1
kono
parents:
diff changeset
134 j_s.d [blink]
kono
parents:
diff changeset
135 add_s sp, sp, 32