Skip to content

Commit c4df19c

Browse files
clazissNuno Cardosoluismgsilva
authored
Update ARC's libffi port (libffi#771)
* Add support for ARC and ARC64 Add support for ARC/ARC32/ARC64 * Implementation of GO Closure for ARC/ARC32/ARC64 Architectures --------- Co-authored-by: Nuno Cardoso <[email protected]> Co-authored-by: Luis Silva <[email protected]>
1 parent 2375206 commit c4df19c

File tree

3 files changed

+508
-242
lines changed

3 files changed

+508
-242
lines changed

src/arc/arcompact.S

Lines changed: 169 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -33,103 +33,178 @@
3333
#define ENTRY(x) .globl CNAME(x)` .type CNAME(x),%function` CNAME(x):
3434
#endif
3535

36+
#if __SIZEOF_POINTER__ == 8
37+
#define PTRS 8
38+
#define FLTS 8
39+
#define LARG ldl
40+
#define SARG stl
41+
#define ADDPTR addl
42+
#define MOVPTR movl_s
43+
#else
44+
#define PTRS 4
45+
#define FLTS 4
46+
#define LARG ld
47+
#define SARG st
48+
#define ADDPTR add
49+
#define MOVPTR mov_s
50+
#endif
51+
52+
#define FRAME_LEN (8 * PTRS + 16)
53+
3654
.text
3755

38-
/* R0: ffi_prep_args */
39-
/* R1: &ecif */
40-
/* R2: cif->bytes */
41-
/* R3: fig->flags */
42-
/* R4: ecif.rvalue */
43-
/* R5: fn */
44-
ENTRY(ffi_call_ARCompact)
56+
ENTRY(ffi_call_asm)
57+
.cfi_startproc
58+
4559
/* Save registers. */
46-
st.a fp, [sp, -4] /* fp + 20, fp */
47-
push_s blink /* fp + 16, blink */
48-
st.a r4, [sp, -4] /* fp + 12, ecif.rvalue */
49-
push_s r3 /* fp + 8, fig->flags */
50-
st.a r5, [sp, -4] /* fp + 4, fn */
51-
push_s r2 /* fp + 0, cif->bytes */
52-
mov fp, sp
53-
54-
/* Make room for all of the new args. */
55-
sub sp, sp, r2
56-
57-
/* Place all of the ffi_prep_args in position. */
58-
/* ffi_prep_args(char *stack, extended_cif *ecif) */
59-
/* R1 already set. */
60-
61-
/* And call. */
62-
jl_s.d [r0]
63-
mov_s r0, sp
64-
65-
ld.ab r12, [fp, 4] /* cif->bytes */
66-
ld.ab r11, [fp, 4] /* fn */
67-
68-
/* Move first 8 parameters in registers... */
69-
ld_s r0, [sp]
70-
ld_s r1, [sp, 4]
71-
ld_s r2, [sp, 8]
72-
ld_s r3, [sp, 12]
73-
ld r4, [sp, 16]
74-
ld r5, [sp, 20]
75-
ld r6, [sp, 24]
76-
ld r7, [sp, 28]
77-
78-
/* ...and adjust the stack. */
79-
min r12, r12, 32
60+
.cfi_def_cfa r1, FRAME_LEN
61+
SARG fp, [r1, FRAME_LEN - 2*PTRS]
62+
.cfi_offset fp, -2*PTRS
63+
SARG blink, [r1, FRAME_LEN - 1*PTRS]
64+
.cfi_offset blink, -1*PTRS
65+
ADDPTR fp, r1, FRAME_LEN
66+
MOVPTR sp, r0
67+
.cfi_def_cfa fp, 0
68+
69+
/* Load arguments. */
70+
MOVPTR r11, r2 /* fn */
71+
MOVPTR r12, r3 /* closure */
72+
73+
/* Save arguments. */
74+
LARG r0, [fp, -FRAME_LEN+0*PTRS]
75+
LARG r1, [fp, -FRAME_LEN+1*PTRS]
76+
LARG r2, [fp, -FRAME_LEN+2*PTRS]
77+
LARG r3, [fp, -FRAME_LEN+3*PTRS]
78+
LARG r4, [fp, -FRAME_LEN+4*PTRS]
79+
LARG r5, [fp, -FRAME_LEN+5*PTRS]
80+
LARG r6, [fp, -FRAME_LEN+6*PTRS]
81+
LARG r7, [fp, -FRAME_LEN+7*PTRS]
8082

8183
/* Call the function. */
82-
jl.d [r11]
83-
add sp, sp, r12
84-
85-
mov sp, fp
86-
pop_s r3 /* fig->flags, return type */
87-
pop_s r2 /* ecif.rvalue, pointer for return value */
88-
89-
/* If the return value pointer is NULL, assume no return value. */
90-
breq.d r2, 0, epilogue
91-
pop_s blink
92-
93-
/* Return INT. */
94-
brne r3, FFI_TYPE_INT, return_double
95-
b.d epilogue
96-
st_s r0, [r2]
97-
98-
return_double:
99-
brne r3, FFI_TYPE_DOUBLE, epilogue
100-
st_s r0, [r2]
101-
st_s r1, [r2,4]
102-
103-
epilogue:
104-
j_s.d [blink]
105-
ld.ab fp, [sp, 4]
106-
107-
ENTRY(ffi_closure_ARCompact)
108-
st.a r0, [sp, -32]
109-
st_s r1, [sp, 4]
110-
st_s r2, [sp, 8]
111-
st_s r3, [sp, 12]
112-
st r4, [sp, 16]
113-
st r5, [sp, 20]
114-
st r6, [sp, 24]
115-
st r7, [sp, 28]
116-
117-
/* pointer to arguments */
118-
mov_s r2, sp
119-
120-
/* return value goes here */
121-
sub sp, sp, 8
122-
mov_s r1, sp
123-
124-
push_s blink
84+
jl [r11]
85+
86+
/* Save return value (r0/r1) */
87+
SARG r0, [fp, -FRAME_LEN+0*PTRS]
88+
SARG r1, [fp, -FRAME_LEN+1*PTRS]
89+
90+
/* Restore and return. */
91+
add sp, fp, -FRAME_LEN
92+
.cfi_def_cfa sp, FRAME_LEN
93+
LARG blink, [fp, -1*PTRS]
94+
.cfi_restore blink
95+
LARG fp, [fp, -2*PTRS]
96+
.cfi_restore fp
97+
j_s [blink]
98+
.cfi_endproc
99+
.size ffi_call_asm, .-ffi_call_asm
100+
101+
/*
102+
ffi_closure_asm. Expects address of the passed-in ffi_closure in r8.
103+
void ffi_closure_inner (ffi_cif *cif,
104+
void (*fun) (ffi_cif *, void *, void **, void *),
105+
void *user_data,
106+
size_t *stackargs, struct call_context *regargs)
107+
*/
108+
109+
ENTRY(ffi_closure_asm)
110+
.cfi_startproc
111+
112+
ADDPTR sp, sp, -FRAME_LEN
113+
.cfi_def_cfa_offset FRAME_LEN
114+
115+
/* Make a frame. */
116+
SARG fp, [sp, FRAME_LEN-2*PTRS]
117+
.cfi_offset fp, -2*PTRS
118+
SARG blink, [sp, FRAME_LEN-1*PTRS]
119+
.cfi_offset blink, -1*PTRS
120+
ADDPTR fp, sp, FRAME_LEN
121+
122+
/* Save arguments. */
123+
SARG r0, [sp, 0*PTRS]
124+
SARG r1, [sp, 1*PTRS]
125+
SARG r2, [sp, 2*PTRS]
126+
SARG r3, [sp, 3*PTRS]
127+
SARG r4, [sp, 4*PTRS]
128+
SARG r5, [sp, 5*PTRS]
129+
SARG r6, [sp, 6*PTRS]
130+
SARG r7, [sp, 7*PTRS]
131+
132+
/* Enter C. */
133+
LARG r0, [r8, FFI_TRAMPOLINE_SIZE+0*PTRS]
134+
LARG r1, [r8, FFI_TRAMPOLINE_SIZE+1*PTRS]
135+
LARG r2, [r8, FFI_TRAMPOLINE_SIZE+2*PTRS]
136+
ADDPTR r3, sp, FRAME_LEN
137+
MOVPTR r4, sp
138+
139+
/* Call the C code. */
140+
bl ffi_closure_inner
125141

126-
bl.d ffi_closure_inner_ARCompact
127-
mov_s r0, r8 /* codeloc, set by trampoline */
128-
129-
pop_s blink
130-
131-
/* set return value to r1:r0 */
132-
pop_s r0
133-
pop_s r1
134-
j_s.d [blink]
135-
add_s sp, sp, 32
142+
/* Return values. */
143+
LARG r0, [sp, 0*PTRS]
144+
LARG r1, [sp, 1*PTRS]
145+
146+
/* Restore and return. */
147+
LARG blink, [sp, FRAME_LEN-1*PTRS]
148+
.cfi_restore blink
149+
LARG fp, [sp, FRAME_LEN-2*PTRS]
150+
.cfi_restore fp
151+
ADDPTR sp, sp, FRAME_LEN
152+
.cfi_def_cfa_offset 0
153+
j_s [blink]
154+
.cfi_endproc
155+
.size ffi_closure_asm, .-ffi_closure_asm
156+
157+
/*
158+
ffi_go_closure_asm. Expects address of the passed-in ffi_go_closure in r12.
159+
void ffi_closure_inner (ffi_cif *cif,
160+
void (*fun) (ffi_cif *, void *, void **, void *),
161+
void *user_data,
162+
size_t *stackargs, struct call_context *regargs)
163+
*/
164+
165+
ENTRY(ffi_go_closure_asm)
166+
.cfi_startproc
167+
168+
ADDPTR sp, sp, -FRAME_LEN
169+
.cfi_def_cfa_offset FRAME_LEN
170+
171+
/* make a frame */
172+
SARG fp, [sp, FRAME_LEN-2*PTRS]
173+
.cfi_offset fp, -2*PTRS
174+
SARG blink, [sp, FRAME_LEN-1*PTRS]
175+
.cfi_offset blink, -1*PTRS
176+
ADDPTR fp, sp, FRAME_LEN
177+
178+
/* save arguments */
179+
SARG r0, [sp, 0*PTRS]
180+
SARG r1, [sp, 1*PTRS]
181+
SARG r2, [sp, 2*PTRS]
182+
SARG r3, [sp, 3*PTRS]
183+
SARG r4, [sp, 4*PTRS]
184+
SARG r5, [sp, 5*PTRS]
185+
SARG r6, [sp, 6*PTRS]
186+
SARG r7, [sp, 7*PTRS]
187+
188+
/* enter C */
189+
LARG r0, [r12, 1*PTRS]
190+
LARG r1, [r12, 2*PTRS]
191+
MOVPTR r2, r12
192+
ADDPTR r3, sp, FRAME_LEN
193+
MOVPTR r4, sp
194+
195+
bl ffi_closure_inner
196+
197+
/* Return values. */
198+
LARG r0, [sp, 0*PTRS]
199+
LARG r1, [sp, 1*PTRS]
200+
201+
202+
LARG blink, [sp, FRAME_LEN-1*PTRS]
203+
.cfi_restore blink
204+
LARG fp, [sp, FRAME_LEN-2*PTRS]
205+
.cfi_restore fp
206+
ADDPTR sp, sp, FRAME_LEN
207+
.cfi_def_cfa_offset 0
208+
j_s [blink]
209+
.cfi_endproc
210+
.size ffi_go_closure_asm, .-ffi_go_closure_asm

0 commit comments

Comments
 (0)