annotate libffi/src/alpha/osf.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 osf.S - Copyright (c) 1998, 2001, 2007, 2008, 2011, 2014 Red Hat
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 Alpha/OSF 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,
kono
parents:
diff changeset
18 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
kono
parents:
diff changeset
19 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
kono
parents:
diff changeset
20 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
kono
parents:
diff changeset
21 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
kono
parents:
diff changeset
22 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kono
parents:
diff changeset
23 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
kono
parents:
diff changeset
24 DEALINGS IN THE SOFTWARE.
kono
parents:
diff changeset
25 ----------------------------------------------------------------------- */
kono
parents:
diff changeset
26
kono
parents:
diff changeset
27 #define LIBFFI_ASM
kono
parents:
diff changeset
28 #include <fficonfig.h>
kono
parents:
diff changeset
29 #include <ffi.h>
kono
parents:
diff changeset
30 #include <ffi_cfi.h>
kono
parents:
diff changeset
31 #include "internal.h"
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 .arch ev6
kono
parents:
diff changeset
34 .text
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 /* Aid in building a direct addressed jump table, 4 insns per entry. */
kono
parents:
diff changeset
37 .macro E index
kono
parents:
diff changeset
38 .align 4
kono
parents:
diff changeset
39 .org 99b + \index * 16
kono
parents:
diff changeset
40 .endm
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 /* ffi_call_osf (void *stack, void *frame, unsigned flags,
kono
parents:
diff changeset
43 void *raddr, void (*fnaddr)(void), void *closure)
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 Bit o trickiness here -- FRAME is the base of the stack frame
kono
parents:
diff changeset
46 for this function. This has been allocated by ffi_call. We also
kono
parents:
diff changeset
47 deallocate some of the stack that has been alloca'd. */
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 .align 4
kono
parents:
diff changeset
50 .globl ffi_call_osf
kono
parents:
diff changeset
51 .ent ffi_call_osf
kono
parents:
diff changeset
52 FFI_HIDDEN(ffi_call_osf)
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 ffi_call_osf:
kono
parents:
diff changeset
55 cfi_startproc
kono
parents:
diff changeset
56 cfi_def_cfa($17, 32)
kono
parents:
diff changeset
57 mov $16, $30
kono
parents:
diff changeset
58 stq $26, 0($17)
kono
parents:
diff changeset
59 stq $15, 8($17)
kono
parents:
diff changeset
60 mov $17, $15
kono
parents:
diff changeset
61 .prologue 0
kono
parents:
diff changeset
62 cfi_def_cfa_register($15)
kono
parents:
diff changeset
63 cfi_rel_offset($26, 0)
kono
parents:
diff changeset
64 cfi_rel_offset($15, 8)
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66 stq $18, 16($17) # save flags into frame
kono
parents:
diff changeset
67 stq $19, 24($17) # save rvalue into frame
kono
parents:
diff changeset
68 mov $20, $27 # fn into place for call
kono
parents:
diff changeset
69 mov $21, $1 # closure into static chain
kono
parents:
diff changeset
70
kono
parents:
diff changeset
71 # Load up all of the (potential) argument registers.
kono
parents:
diff changeset
72 ldq $16, 0($30)
kono
parents:
diff changeset
73 ldt $f16, 0($30)
kono
parents:
diff changeset
74 ldt $f17, 8($30)
kono
parents:
diff changeset
75 ldq $17, 8($30)
kono
parents:
diff changeset
76 ldt $f18, 16($30)
kono
parents:
diff changeset
77 ldq $18, 16($30)
kono
parents:
diff changeset
78 ldt $f19, 24($30)
kono
parents:
diff changeset
79 ldq $19, 24($30)
kono
parents:
diff changeset
80 ldt $f20, 32($30)
kono
parents:
diff changeset
81 ldq $20, 32($30)
kono
parents:
diff changeset
82 ldt $f21, 40($30)
kono
parents:
diff changeset
83 ldq $21, 40($30)
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 # Deallocate the register argument area.
kono
parents:
diff changeset
86 lda $30, 48($30)
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 jsr $26, ($27), 0
kono
parents:
diff changeset
89 0:
kono
parents:
diff changeset
90 ldah $29, 0($26) !gpdisp!1
kono
parents:
diff changeset
91 ldq $2, 24($15) # reload rvalue
kono
parents:
diff changeset
92 lda $29, 0($29) !gpdisp!1
kono
parents:
diff changeset
93 ldq $3, 16($15) # reload flags
kono
parents:
diff changeset
94 lda $1, 99f-0b($26)
kono
parents:
diff changeset
95 ldq $26, 0($15)
kono
parents:
diff changeset
96 ldq $15, 8($15)
kono
parents:
diff changeset
97 cfi_restore($26)
kono
parents:
diff changeset
98 cfi_restore($15)
kono
parents:
diff changeset
99 cfi_def_cfa($sp, 0)
kono
parents:
diff changeset
100 cmoveq $2, ALPHA_ST_VOID, $3 # mash null rvalue to void
kono
parents:
diff changeset
101 addq $3, $3, $3
kono
parents:
diff changeset
102 s8addq $3, $1, $1 # 99f + stcode * 16
kono
parents:
diff changeset
103 jmp $31, ($1), $st_int
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 .align 4
kono
parents:
diff changeset
106 99:
kono
parents:
diff changeset
107 E ALPHA_ST_VOID
kono
parents:
diff changeset
108 ret
kono
parents:
diff changeset
109 E ALPHA_ST_INT
kono
parents:
diff changeset
110 $st_int:
kono
parents:
diff changeset
111 stq $0, 0($2)
kono
parents:
diff changeset
112 ret
kono
parents:
diff changeset
113 E ALPHA_ST_FLOAT
kono
parents:
diff changeset
114 sts $f0, 0($2)
kono
parents:
diff changeset
115 ret
kono
parents:
diff changeset
116 E ALPHA_ST_DOUBLE
kono
parents:
diff changeset
117 stt $f0, 0($2)
kono
parents:
diff changeset
118 ret
kono
parents:
diff changeset
119 E ALPHA_ST_CPLXF
kono
parents:
diff changeset
120 sts $f0, 0($2)
kono
parents:
diff changeset
121 sts $f1, 4($2)
kono
parents:
diff changeset
122 ret
kono
parents:
diff changeset
123 E ALPHA_ST_CPLXD
kono
parents:
diff changeset
124 stt $f0, 0($2)
kono
parents:
diff changeset
125 stt $f1, 8($2)
kono
parents:
diff changeset
126 ret
kono
parents:
diff changeset
127
kono
parents:
diff changeset
128 cfi_endproc
kono
parents:
diff changeset
129 .end ffi_call_osf
kono
parents:
diff changeset
130
kono
parents:
diff changeset
131 /* ffi_closure_osf(...)
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 Receives the closure argument in $1. */
kono
parents:
diff changeset
134
kono
parents:
diff changeset
135 #define CLOSURE_FS (16*8)
kono
parents:
diff changeset
136
kono
parents:
diff changeset
137 .align 4
kono
parents:
diff changeset
138 .globl ffi_go_closure_osf
kono
parents:
diff changeset
139 .ent ffi_go_closure_osf
kono
parents:
diff changeset
140 FFI_HIDDEN(ffi_go_closure_osf)
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 ffi_go_closure_osf:
kono
parents:
diff changeset
143 cfi_startproc
kono
parents:
diff changeset
144 ldgp $29, 0($27)
kono
parents:
diff changeset
145 subq $30, CLOSURE_FS, $30
kono
parents:
diff changeset
146 cfi_adjust_cfa_offset(CLOSURE_FS)
kono
parents:
diff changeset
147 stq $26, 0($30)
kono
parents:
diff changeset
148 .prologue 1
kono
parents:
diff changeset
149 cfi_rel_offset($26, 0)
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 stq $16, 10*8($30)
kono
parents:
diff changeset
152 stq $17, 11*8($30)
kono
parents:
diff changeset
153 stq $18, 12*8($30)
kono
parents:
diff changeset
154
kono
parents:
diff changeset
155 ldq $16, 8($1) # load cif
kono
parents:
diff changeset
156 ldq $17, 16($1) # load fun
kono
parents:
diff changeset
157 mov $1, $18 # closure is user_data
kono
parents:
diff changeset
158 br $do_closure
kono
parents:
diff changeset
159
kono
parents:
diff changeset
160 cfi_endproc
kono
parents:
diff changeset
161 .end ffi_go_closure_osf
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 .align 4
kono
parents:
diff changeset
164 .globl ffi_closure_osf
kono
parents:
diff changeset
165 .ent ffi_closure_osf
kono
parents:
diff changeset
166 FFI_HIDDEN(ffi_closure_osf)
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168 ffi_closure_osf:
kono
parents:
diff changeset
169 cfi_startproc
kono
parents:
diff changeset
170 ldgp $29, 0($27)
kono
parents:
diff changeset
171 subq $30, CLOSURE_FS, $30
kono
parents:
diff changeset
172 cfi_adjust_cfa_offset(CLOSURE_FS)
kono
parents:
diff changeset
173 stq $26, 0($30)
kono
parents:
diff changeset
174 .prologue 1
kono
parents:
diff changeset
175 cfi_rel_offset($26, 0)
kono
parents:
diff changeset
176
kono
parents:
diff changeset
177 # Store all of the potential argument registers in va_list format.
kono
parents:
diff changeset
178 stq $16, 10*8($30)
kono
parents:
diff changeset
179 stq $17, 11*8($30)
kono
parents:
diff changeset
180 stq $18, 12*8($30)
kono
parents:
diff changeset
181
kono
parents:
diff changeset
182 ldq $16, 24($1) # load cif
kono
parents:
diff changeset
183 ldq $17, 32($1) # load fun
kono
parents:
diff changeset
184 ldq $18, 40($1) # load user_data
kono
parents:
diff changeset
185
kono
parents:
diff changeset
186 $do_closure:
kono
parents:
diff changeset
187 stq $19, 13*8($30)
kono
parents:
diff changeset
188 stq $20, 14*8($30)
kono
parents:
diff changeset
189 stq $21, 15*8($30)
kono
parents:
diff changeset
190 stt $f16, 4*8($30)
kono
parents:
diff changeset
191 stt $f17, 5*8($30)
kono
parents:
diff changeset
192 stt $f18, 6*8($30)
kono
parents:
diff changeset
193 stt $f19, 7*8($30)
kono
parents:
diff changeset
194 stt $f20, 8*8($30)
kono
parents:
diff changeset
195 stt $f21, 9*8($30)
kono
parents:
diff changeset
196
kono
parents:
diff changeset
197 # Call ffi_closure_osf_inner to do the bulk of the work.
kono
parents:
diff changeset
198 lda $19, 2*8($30)
kono
parents:
diff changeset
199 lda $20, 10*8($30)
kono
parents:
diff changeset
200 jsr $26, ffi_closure_osf_inner
kono
parents:
diff changeset
201 0:
kono
parents:
diff changeset
202 ldah $29, 0($26) !gpdisp!2
kono
parents:
diff changeset
203 lda $2, 99f-0b($26)
kono
parents:
diff changeset
204 s4addq $0, 0, $1 # ldcode * 4
kono
parents:
diff changeset
205 ldq $0, 16($30) # preload return value
kono
parents:
diff changeset
206 s4addq $1, $2, $1 # 99f + ldcode * 16
kono
parents:
diff changeset
207 lda $29, 0($29) !gpdisp!2
kono
parents:
diff changeset
208 ldq $26, 0($30)
kono
parents:
diff changeset
209 cfi_restore($26)
kono
parents:
diff changeset
210 jmp $31, ($1), $load_32
kono
parents:
diff changeset
211
kono
parents:
diff changeset
212 .macro epilogue
kono
parents:
diff changeset
213 addq $30, CLOSURE_FS, $30
kono
parents:
diff changeset
214 cfi_adjust_cfa_offset(-CLOSURE_FS)
kono
parents:
diff changeset
215 ret
kono
parents:
diff changeset
216 .align 4
kono
parents:
diff changeset
217 cfi_adjust_cfa_offset(CLOSURE_FS)
kono
parents:
diff changeset
218 .endm
kono
parents:
diff changeset
219
kono
parents:
diff changeset
220 .align 4
kono
parents:
diff changeset
221 99:
kono
parents:
diff changeset
222 E ALPHA_LD_VOID
kono
parents:
diff changeset
223 epilogue
kono
parents:
diff changeset
224
kono
parents:
diff changeset
225 E ALPHA_LD_INT64
kono
parents:
diff changeset
226 epilogue
kono
parents:
diff changeset
227
kono
parents:
diff changeset
228 E ALPHA_LD_INT32
kono
parents:
diff changeset
229 $load_32:
kono
parents:
diff changeset
230 sextl $0, $0
kono
parents:
diff changeset
231 epilogue
kono
parents:
diff changeset
232
kono
parents:
diff changeset
233 E ALPHA_LD_UINT16
kono
parents:
diff changeset
234 zapnot $0, 3, $0
kono
parents:
diff changeset
235 epilogue
kono
parents:
diff changeset
236
kono
parents:
diff changeset
237 E ALPHA_LD_SINT16
kono
parents:
diff changeset
238 #ifdef __alpha_bwx__
kono
parents:
diff changeset
239 sextw $0, $0
kono
parents:
diff changeset
240 #else
kono
parents:
diff changeset
241 sll $0, 48, $0
kono
parents:
diff changeset
242 sra $0, 48, $0
kono
parents:
diff changeset
243 #endif
kono
parents:
diff changeset
244 epilogue
kono
parents:
diff changeset
245
kono
parents:
diff changeset
246 E ALPHA_LD_UINT8
kono
parents:
diff changeset
247 and $0, 0xff, $0
kono
parents:
diff changeset
248 epilogue
kono
parents:
diff changeset
249
kono
parents:
diff changeset
250 E ALPHA_LD_SINT8
kono
parents:
diff changeset
251 #ifdef __alpha_bwx__
kono
parents:
diff changeset
252 sextb $0, $0
kono
parents:
diff changeset
253 #else
kono
parents:
diff changeset
254 sll $0, 56, $0
kono
parents:
diff changeset
255 sra $0, 56, $0
kono
parents:
diff changeset
256 #endif
kono
parents:
diff changeset
257 epilogue
kono
parents:
diff changeset
258
kono
parents:
diff changeset
259 E ALPHA_LD_FLOAT
kono
parents:
diff changeset
260 lds $f0, 16($sp)
kono
parents:
diff changeset
261 epilogue
kono
parents:
diff changeset
262
kono
parents:
diff changeset
263 E ALPHA_LD_DOUBLE
kono
parents:
diff changeset
264 ldt $f0, 16($sp)
kono
parents:
diff changeset
265 epilogue
kono
parents:
diff changeset
266
kono
parents:
diff changeset
267 E ALPHA_LD_CPLXF
kono
parents:
diff changeset
268 lds $f0, 16($sp)
kono
parents:
diff changeset
269 lds $f1, 20($sp)
kono
parents:
diff changeset
270 epilogue
kono
parents:
diff changeset
271
kono
parents:
diff changeset
272 E ALPHA_LD_CPLXD
kono
parents:
diff changeset
273 ldt $f0, 16($sp)
kono
parents:
diff changeset
274 ldt $f1, 24($sp)
kono
parents:
diff changeset
275 epilogue
kono
parents:
diff changeset
276
kono
parents:
diff changeset
277 cfi_endproc
kono
parents:
diff changeset
278 .end ffi_closure_osf
kono
parents:
diff changeset
279
kono
parents:
diff changeset
280 #if defined __ELF__ && defined __linux__
kono
parents:
diff changeset
281 .section .note.GNU-stack,"",@progbits
kono
parents:
diff changeset
282 #endif