1 | /* Copyright (C) 2005-2006 Clozure Associates and contributors */ |
---|
2 | /* This file is part of OpenMCL. */ |
---|
3 | |
---|
4 | /* OpenMCL is licensed under the terms of the Lisp Lesser GNU Public */ |
---|
5 | /* License , known as the LLGPL and distributed with OpenMCL as the */ |
---|
6 | /* file "LICENSE". The LLGPL consists of a preamble and the LGPL, */ |
---|
7 | /* which is distributed with OpenMCL as the file "LGPL". Where these */ |
---|
8 | /* conflict, the preamble takes precedence. */ |
---|
9 | |
---|
10 | /* OpenMCL is referenced in the preamble as the "LIBRARY." */ |
---|
11 | |
---|
12 | /* The LLGPL is also available online at */ |
---|
13 | /* http://opensource.franz.com/preamble.html */ |
---|
14 | |
---|
15 | |
---|
16 | |
---|
17 | include(lisp.s) |
---|
18 | _beginfile |
---|
19 | |
---|
20 | .align 2 |
---|
21 | define([_spentry],[ifdef([__func_name],[_endfn],[]) |
---|
22 | .p2align 3 |
---|
23 | _exportfn(_SP$1) |
---|
24 | .line __line__ |
---|
25 | ]) |
---|
26 | |
---|
27 | |
---|
28 | define([_endsubp],[ |
---|
29 | _endfn(_SP$1) |
---|
30 | # __line__ |
---|
31 | ]) |
---|
32 | |
---|
33 | define([jump_builtin],[ |
---|
34 | ref_nrs_value(builtin_functions,%fname) |
---|
35 | set_nargs($2) |
---|
36 | vrefr(%fname,%fname,$1) |
---|
37 | jump_fname() |
---|
38 | ]) |
---|
39 | |
---|
40 | |
---|
41 | |
---|
42 | _spentry(bad_funcall) |
---|
43 | .globl C(bad_funcall) |
---|
44 | __(tra(C(bad_funcall))) |
---|
45 | __(uuo_error_not_callable) |
---|
46 | _endsubp(bad_funcall) |
---|
47 | |
---|
48 | /* %arg_z has overflowed by one bit. Make a bignum with 2 (32-bit) digits. */ |
---|
49 | |
---|
50 | _spentry(fix_overflow) |
---|
51 | C(fix_one_bit_overflow): |
---|
52 | __(movq $two_digit_bignum_header,%imm0) |
---|
53 | __(Misc_Alloc_Fixed([],aligned_bignum_size(2))) |
---|
54 | __(unbox_fixnum(%arg_z,%imm0)) |
---|
55 | __(movq $0xe000000000000000,%imm1) |
---|
56 | __(mov %temp0,%arg_z) |
---|
57 | __(xorq %imm1,%imm0) |
---|
58 | __(movq %imm0,misc_data_offset(%arg_z)) |
---|
59 | __(ret) |
---|
60 | _endsubp(fix_overflow) |
---|
61 | |
---|
62 | |
---|
63 | /* Make a lisp integer (fixnum or two-digit bignum) from the signed */ |
---|
64 | /* 64-bit value in %imm0. */ |
---|
65 | |
---|
66 | _spentry(makes64) |
---|
67 | __(movq %imm0,%imm1) |
---|
68 | __(shlq $fixnumshift,%imm1) |
---|
69 | __(movq %imm1,%arg_z) |
---|
70 | __(sarq $fixnumshift,%imm1) |
---|
71 | __(cmpq %imm1,%imm0) |
---|
72 | __(jz,pt 0f) |
---|
73 | __(movd %imm0,%mm0) |
---|
74 | __(movq $two_digit_bignum_header,%imm0) |
---|
75 | __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(2))) |
---|
76 | __(movq %mm0,misc_data_offset(%arg_z)) |
---|
77 | 0: __(repret) |
---|
78 | _endsubp(makes64) |
---|
79 | |
---|
80 | |
---|
81 | |
---|
82 | /* %imm1:%imm0 constitute a signed integer, almost certainly a bignum. */ |
---|
83 | /* Make a lisp integer out of those 128 bits .. */ |
---|
84 | |
---|
85 | _startfn(C(makes128)) |
---|
86 | |
---|
87 | /* We're likely to have to make a bignum out of the integer in %imm1 and */ |
---|
88 | /* %imm0. We'll need to use %imm0 and %imm1 to cons the bignum, and */ |
---|
89 | /* will need to do some arithmetic (determining significant bigits) */ |
---|
90 | /* on %imm0 and %imm1 in order to know how large that bignum needs to be. */ |
---|
91 | /* Cache %imm0 and %imm1 in %mm0 and %mm1. */ |
---|
92 | |
---|
93 | __(movd %imm0,%mm0) |
---|
94 | __(movd %imm1,%mm1) |
---|
95 | |
---|
96 | /* If %imm1 is just a sign extension of %imm0, make a 64-bit signed integer. */ |
---|
97 | |
---|
98 | __(sarq $63,%imm0) |
---|
99 | __(cmpq %imm0,%imm1) |
---|
100 | __(movd %mm0,%imm0) |
---|
101 | __(je _SPmakes64) |
---|
102 | |
---|
103 | /* Otherwise, if the high 32 bits of %imm1 are a sign-extension of the */ |
---|
104 | /* low 32 bits of %imm1, make a 3-digit bignum. If the upper 32 bits */ |
---|
105 | /* of %imm1 are significant, make a 4 digit bignum */ |
---|
106 | |
---|
107 | __(movq %imm1,%imm0) |
---|
108 | __(shlq $32,%imm0) |
---|
109 | __(sarq $32,%imm0) |
---|
110 | __(cmpq %imm0,%imm1) |
---|
111 | __(jz 3f) |
---|
112 | __(mov $four_digit_bignum_header,%imm0) |
---|
113 | __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(4))) |
---|
114 | __(movq %mm0,misc_data_offset(%arg_z)) |
---|
115 | __(movq %mm1,misc_data_offset+8(%arg_z)) |
---|
116 | __(ret) |
---|
117 | 3: __(mov $three_digit_bignum_header,%imm0) |
---|
118 | __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(3))) |
---|
119 | __(movq %mm0,misc_data_offset(%arg_z)) |
---|
120 | __(movd %mm1,misc_data_offset+8(%arg_z)) |
---|
121 | __(ret) |
---|
122 | _endfn |
---|
123 | |
---|
124 | |
---|
125 | /* %imm1:%imm0 constitute an unsigned integer, almost certainly a bignum. */ |
---|
126 | /* Make a lisp integer out of those 128 bits .. */ |
---|
127 | |
---|
128 | _startfn(C(makeu128)) |
---|
129 | |
---|
130 | /* We're likely to have to make a bignum out of the integer in %imm1 and */ |
---|
131 | /* %imm0. We'll need to use %imm0 and %imm1 to cons the bignum, and */ |
---|
132 | /* will need to do some arithmetic (determining significant bigits) */ |
---|
133 | /* on %imm0 and %imm1 in order to know how large that bignum needs to be. */ |
---|
134 | /* Cache %imm0 and %imm1 in %mm0 and %mm1. */ |
---|
135 | |
---|
136 | /* If the high word is 0, make an unsigned-byte 64 ... */ |
---|
137 | |
---|
138 | __(testq %imm1,%imm1) |
---|
139 | __(jz _SPmakeu64) |
---|
140 | |
---|
141 | __(movd %imm0,%mm0) |
---|
142 | __(movd %imm1,%mm1) |
---|
143 | |
---|
144 | __(js 5f) /* Sign bit set in %imm1. Need 5 digits */ |
---|
145 | __(bsrq %imm1,%imm0) |
---|
146 | __(rcmpb(%imm0_b,$31)) |
---|
147 | __(jae 4f) /* Some high bits in %imm1. Need 4 digits */ |
---|
148 | __(testl %imm1_l,%imm1_l) |
---|
149 | __(movd %mm0,%imm0) |
---|
150 | __(jz _SPmakeu64) |
---|
151 | |
---|
152 | /* Need 3 digits */ |
---|
153 | |
---|
154 | __(movq $three_digit_bignum_header,%imm0) |
---|
155 | __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(3))) |
---|
156 | __(movq %mm0,misc_data_offset(%arg_z)) |
---|
157 | __(movd %mm1,misc_data_offset+8(%arg_z)) |
---|
158 | __(ret) |
---|
159 | 4: __(movq $four_digit_bignum_header,%imm0) |
---|
160 | __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(4))) |
---|
161 | __(jmp 6f) |
---|
162 | 5: __(movq $five_digit_bignum_header,%imm0) |
---|
163 | __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(5))) |
---|
164 | 6: __(movq %mm0,misc_data_offset(%arg_z)) |
---|
165 | __(movq %mm0,misc_data_offset+8(%arg_z)) |
---|
166 | __(ret) |
---|
167 | _endfn |
---|
168 | |
---|
169 | _spentry(misc_ref) |
---|
170 | __(movb $tagmask,%imm0_b) |
---|
171 | __(andb %arg_y_b,%imm0_b) |
---|
172 | __(cmpb $tag_misc,%imm0_b) |
---|
173 | __(jne 0f) |
---|
174 | __(testb $fixnummask,%arg_z_b) |
---|
175 | __(jne 1f) |
---|
176 | __(movq misc_header_offset(%arg_y),%imm0) |
---|
177 | __(xorb %imm0_b,%imm0_b) |
---|
178 | __(shrq $num_subtag_bits-fixnumshift,%imm0) |
---|
179 | __(cmpq %imm0,%arg_z) |
---|
180 | __(jae 2f) |
---|
181 | __(movb misc_subtag_offset(%arg_y),%imm1_b) |
---|
182 | __(jmp C(misc_ref_common)) |
---|
183 | |
---|
184 | 0: __(uuo_error_reg_not_tag(Rarg_y,tag_misc)) |
---|
185 | 1: __(uuo_error_reg_not_fixnum(Rarg_z)) |
---|
186 | 2: __(uuo_error_vector_bounds(Rarg_z,Rarg_y)) |
---|
187 | _endsubp(misc_ref) |
---|
188 | |
---|
189 | /* %imm1.b = subtag, %arg_y = uvector, %arg_z = index. */ |
---|
190 | /* Bounds/type-checking done in caller */ |
---|
191 | |
---|
192 | _startfn(C(misc_ref_common)) |
---|
193 | __(movzbl %imm1_b,%imm1_l) |
---|
194 | __(lea local_label(misc_ref_jmp)(%rip),%imm2) |
---|
195 | __(jmp *(%imm2,%imm1,8)) |
---|
196 | .p2align 3 |
---|
197 | local_label(misc_ref_jmp): |
---|
198 | /* 00-0f */ |
---|
199 | .quad local_label(misc_ref_invalid) /* 00 even_fixnum */ |
---|
200 | .quad local_label(misc_ref_invalid) /* 01 imm_1 */ |
---|
201 | .quad local_label(misc_ref_invalid) /* 02 imm_2 */ |
---|
202 | .quad local_label(misc_ref_invalid) /* 03 cons */ |
---|
203 | .quad local_label(misc_ref_invalid) /* 04 tra_0 */ |
---|
204 | .quad local_label(misc_ref_invalid) /* 05 nodeheader_0 */ |
---|
205 | .quad local_label(misc_ref_invalid) /* 06 nodeheader_1 */ |
---|
206 | .quad local_label(misc_ref_invalid) /* 07 immheader_0 */ |
---|
207 | .quad local_label(misc_ref_invalid) /* 08 odd_fixnum */ |
---|
208 | .quad local_label(misc_ref_invalid) /* 09 immheader_1 */ |
---|
209 | .quad local_label(misc_ref_invalid) /* 0a immheader_2 */ |
---|
210 | .quad local_label(misc_ref_invalid) /* 0b nil */ |
---|
211 | .quad local_label(misc_ref_invalid) /* 0c tra_1 */ |
---|
212 | .quad local_label(misc_ref_invalid) /* 0d misc */ |
---|
213 | .quad local_label(misc_ref_invalid) /* 0e symbol */ |
---|
214 | .quad local_label(misc_ref_invalid) /* 0f function */ |
---|
215 | /* 10-1f */ |
---|
216 | .quad local_label(misc_ref_invalid) /* 10 even_fixnum */ |
---|
217 | .quad local_label(misc_ref_invalid) /* 11 imm_1 */ |
---|
218 | .quad local_label(misc_ref_invalid) /* 12 imm_2 */ |
---|
219 | .quad local_label(misc_ref_invalid) /* 13 cons */ |
---|
220 | .quad local_label(misc_ref_invalid) /* 14 tra_0 */ |
---|
221 | .quad local_label(misc_ref_node) /* 15 symbol_vector */ |
---|
222 | .quad local_label(misc_ref_node) /* 16 ratio */ |
---|
223 | .quad local_label(misc_ref_invalid) /* 17 immheader_0 */ |
---|
224 | .quad local_label(misc_ref_invalid) /* 18 odd_fixnum */ |
---|
225 | .quad local_label(misc_ref_u32) /* 19 bignum */ |
---|
226 | .quad local_label(misc_ref_u64) /* 1a macptr */ |
---|
227 | .quad local_label(misc_ref_invalid) /* 1b nil */ |
---|
228 | .quad local_label(misc_ref_invalid) /* 1c tra_1 */ |
---|
229 | .quad local_label(misc_ref_invalid) /* 1d misc */ |
---|
230 | .quad local_label(misc_ref_invalid) /* 1e symbol */ |
---|
231 | .quad local_label(misc_ref_invalid) /* 1f function */ |
---|
232 | /* 20-2f */ |
---|
233 | .quad local_label(misc_ref_invalid) /* 20 even_fixnum */ |
---|
234 | .quad local_label(misc_ref_invalid) /* 21 imm_1 */ |
---|
235 | .quad local_label(misc_ref_invalid) /* 22 imm_2 */ |
---|
236 | .quad local_label(misc_ref_invalid) /* 23 cons */ |
---|
237 | .quad local_label(misc_ref_invalid) /* 24 tra_0 */ |
---|
238 | .quad local_label(misc_ref_node) /* 25 catch_frame */ |
---|
239 | .quad local_label(misc_ref_node) /* 26 complex */ |
---|
240 | .quad local_label(misc_ref_invalid) /* 27 immheader_0 */ |
---|
241 | .quad local_label(misc_ref_invalid) /* 28 odd_fixnum */ |
---|
242 | .quad local_label(misc_ref_u32) /* 29 double_float */ |
---|
243 | .quad local_label(misc_ref_u64) /* 2a dead_macptr */ |
---|
244 | .quad local_label(misc_ref_invalid) /* 2b nil */ |
---|
245 | .quad local_label(misc_ref_invalid) /* 2c tra_1 */ |
---|
246 | .quad local_label(misc_ref_invalid) /* 2d misc */ |
---|
247 | .quad local_label(misc_ref_invalid) /* 2e symbol */ |
---|
248 | .quad local_label(misc_ref_invalid) /* 2f function */ |
---|
249 | /* 30-3f */ |
---|
250 | .quad local_label(misc_ref_invalid) /* 30 even_fixnum */ |
---|
251 | .quad local_label(misc_ref_invalid) /* 31 imm_1 */ |
---|
252 | .quad local_label(misc_ref_invalid) /* 32 imm_2 */ |
---|
253 | .quad local_label(misc_ref_invalid) /* 33 cons */ |
---|
254 | .quad local_label(misc_ref_invalid) /* 34 tra_0 */ |
---|
255 | .quad local_label(misc_ref_node) /* 35 hash_vector */ |
---|
256 | .quad local_label(misc_ref_node) /* 36 struct */ |
---|
257 | .quad local_label(misc_ref_invalid) /* 37 immheader_0 */ |
---|
258 | .quad local_label(misc_ref_invalid) /* 38 odd_fixnum */ |
---|
259 | .quad local_label(misc_ref_u32) /* 39 xcode_vector */ |
---|
260 | .quad local_label(misc_ref_invalid) /* 3a immheader_2 */ |
---|
261 | .quad local_label(misc_ref_invalid) /* 3b nil */ |
---|
262 | .quad local_label(misc_ref_invalid) /* 3c tra_1 */ |
---|
263 | .quad local_label(misc_ref_invalid) /* 3d misc */ |
---|
264 | .quad local_label(misc_ref_invalid) /* 3e symbol */ |
---|
265 | .quad local_label(misc_ref_invalid) /* 3f function */ |
---|
266 | /* 40-4f */ |
---|
267 | .quad local_label(misc_ref_invalid) /* 40 even_fixnum */ |
---|
268 | .quad local_label(misc_ref_invalid) /* 41 imm_1 */ |
---|
269 | .quad local_label(misc_ref_invalid) /* 42 imm_2 */ |
---|
270 | .quad local_label(misc_ref_invalid) /* 43 cons */ |
---|
271 | .quad local_label(misc_ref_invalid) /* 44 tra_0 */ |
---|
272 | .quad local_label(misc_ref_node) /* 45 pool */ |
---|
273 | .quad local_label(misc_ref_node) /* 46 istruct */ |
---|
274 | .quad local_label(misc_ref_invalid) /* 47 immheader_0 */ |
---|
275 | .quad local_label(misc_ref_invalid) /* 48 odd_fixnum */ |
---|
276 | .quad local_label(misc_ref_invalid) /* 49 immheader_1 */ |
---|
277 | .quad local_label(misc_ref_invalid) /* 4a immheader_2 */ |
---|
278 | .quad local_label(misc_ref_invalid) /* 4b nil */ |
---|
279 | .quad local_label(misc_ref_invalid) /* 4c tra_1 */ |
---|
280 | .quad local_label(misc_ref_invalid) /* 4d misc */ |
---|
281 | .quad local_label(misc_ref_invalid) /* 4e symbol */ |
---|
282 | .quad local_label(misc_ref_invalid) /* 4f function */ |
---|
283 | /* 50-5f */ |
---|
284 | .quad local_label(misc_ref_invalid) /* 50 even_fixnum */ |
---|
285 | .quad local_label(misc_ref_invalid) /* 51 imm_1 */ |
---|
286 | .quad local_label(misc_ref_invalid) /* 52 imm_2 */ |
---|
287 | .quad local_label(misc_ref_invalid) /* 53 cons */ |
---|
288 | .quad local_label(misc_ref_invalid) /* 54 tra_0 */ |
---|
289 | .quad local_label(misc_ref_node) /* 55 weak */ |
---|
290 | .quad local_label(misc_ref_node) /* 56 value_cell */ |
---|
291 | .quad local_label(misc_ref_invalid) /* 57 immheader_0 */ |
---|
292 | .quad local_label(misc_ref_invalid) /* 58 odd_fixnum */ |
---|
293 | .quad local_label(misc_ref_invalid) /* 59 immheader_1 */ |
---|
294 | .quad local_label(misc_ref_invalid) /* 5a immheader_2 */ |
---|
295 | .quad local_label(misc_ref_invalid) /* 5b nil */ |
---|
296 | .quad local_label(misc_ref_invalid) /* 5c tra_1 */ |
---|
297 | .quad local_label(misc_ref_invalid) /* 5d misc */ |
---|
298 | .quad local_label(misc_ref_invalid) /* 5e symbol */ |
---|
299 | .quad local_label(misc_ref_invalid) /* 5f function */ |
---|
300 | /* 60-6f */ |
---|
301 | .quad local_label(misc_ref_invalid) /* 60 even_fixnum */ |
---|
302 | .quad local_label(misc_ref_invalid) /* 61 imm_1 */ |
---|
303 | .quad local_label(misc_ref_invalid) /* 62 imm_2 */ |
---|
304 | .quad local_label(misc_ref_invalid) /* 63 cons */ |
---|
305 | .quad local_label(misc_ref_invalid) /* 64 tra_0 */ |
---|
306 | .quad local_label(misc_ref_node) /* 65 package */ |
---|
307 | .quad local_label(misc_ref_node) /* 66 xfunction */ |
---|
308 | .quad local_label(misc_ref_invalid) /* 67 immheader_0 */ |
---|
309 | .quad local_label(misc_ref_invalid) /* 68 odd_fixnum */ |
---|
310 | .quad local_label(misc_ref_invalid) /* 69 immheader_1 */ |
---|
311 | .quad local_label(misc_ref_invalid) /* 6a immheader_2 */ |
---|
312 | .quad local_label(misc_ref_invalid) /* 6b nil */ |
---|
313 | .quad local_label(misc_ref_invalid) /* 6c tra_1 */ |
---|
314 | .quad local_label(misc_ref_invalid) /* 6d misc */ |
---|
315 | .quad local_label(misc_ref_invalid) /* 6e symbol */ |
---|
316 | .quad local_label(misc_ref_invalid) /* 6f function */ |
---|
317 | /* 70-7f */ |
---|
318 | .quad local_label(misc_ref_invalid) /* 70 even_fixnum */ |
---|
319 | .quad local_label(misc_ref_invalid) /* 71 imm_1 */ |
---|
320 | .quad local_label(misc_ref_invalid) /* 72 imm_2 */ |
---|
321 | .quad local_label(misc_ref_invalid) /* 73 cons */ |
---|
322 | .quad local_label(misc_ref_invalid) /* 74 tra_0 */ |
---|
323 | .quad local_label(misc_ref_node) /* 75 slot_vector */ |
---|
324 | .quad local_label(misc_ref_node) /* 76 lock */ |
---|
325 | .quad local_label(misc_ref_invalid) /* 77 immheader_0 */ |
---|
326 | .quad local_label(misc_ref_invalid) /* 78 odd_fixnum */ |
---|
327 | .quad local_label(misc_ref_invalid) /* 79 immheader_1 */ |
---|
328 | .quad local_label(misc_ref_invalid) /* 7a immheader_2 */ |
---|
329 | .quad local_label(misc_ref_invalid) /* 7b nil */ |
---|
330 | .quad local_label(misc_ref_invalid) /* 7c tra_1 */ |
---|
331 | .quad local_label(misc_ref_invalid) /* 7d misc */ |
---|
332 | .quad local_label(misc_ref_invalid) /* 7e symbol */ |
---|
333 | .quad local_label(misc_ref_invalid) /* 7f function */ |
---|
334 | /* 80-8f */ |
---|
335 | .quad local_label(misc_ref_invalid) /* 80 even_fixnum */ |
---|
336 | .quad local_label(misc_ref_invalid) /* 81 imm_1 */ |
---|
337 | .quad local_label(misc_ref_invalid) /* 82 imm_2 */ |
---|
338 | .quad local_label(misc_ref_invalid) /* 83 cons */ |
---|
339 | .quad local_label(misc_ref_invalid) /* 84 tra_0 */ |
---|
340 | .quad local_label(misc_ref_node) /* 85 lisp_thread */ |
---|
341 | .quad local_label(misc_ref_node) /* 86 instance */ |
---|
342 | .quad local_label(misc_ref_invalid) /* 87 immheader_0 */ |
---|
343 | .quad local_label(misc_ref_invalid) /* 88 odd_fixnum */ |
---|
344 | .quad local_label(misc_ref_invalid) /* 89 immheader_1 */ |
---|
345 | .quad local_label(misc_ref_invalid) /* 8a immheader_2 */ |
---|
346 | .quad local_label(misc_ref_invalid) /* 8b nil */ |
---|
347 | .quad local_label(misc_ref_invalid) /* 8c tra_1 */ |
---|
348 | .quad local_label(misc_ref_invalid) /* 8d misc */ |
---|
349 | .quad local_label(misc_ref_invalid) /* 8e symbol */ |
---|
350 | .quad local_label(misc_ref_invalid) /* 8f function */ |
---|
351 | /* 90-9f */ |
---|
352 | .quad local_label(misc_ref_invalid) /* 90 even_fixnum */ |
---|
353 | .quad local_label(misc_ref_invalid) /* 91 imm_1 */ |
---|
354 | .quad local_label(misc_ref_invalid) /* 92 imm_2 */ |
---|
355 | .quad local_label(misc_ref_invalid) /* 93 cons */ |
---|
356 | .quad local_label(misc_ref_invalid) /* 94 tra_0 */ |
---|
357 | .quad local_label(misc_ref_function) /* 95 function_vector */ |
---|
358 | .quad local_label(misc_ref_invalid) /* 96 nodeheader_1 */ |
---|
359 | .quad local_label(misc_ref_invalid) /* 97 immheader_0 */ |
---|
360 | .quad local_label(misc_ref_invalid) /* 98 odd_fixnum */ |
---|
361 | .quad local_label(misc_ref_invalid) /* 99 immheader_1 */ |
---|
362 | .quad local_label(misc_ref_invalid) /* 9a immheader_2 */ |
---|
363 | .quad local_label(misc_ref_invalid) /* 9b nil */ |
---|
364 | .quad local_label(misc_ref_invalid) /* 9c tra_1 */ |
---|
365 | .quad local_label(misc_ref_invalid) /* 9d misc */ |
---|
366 | .quad local_label(misc_ref_invalid) /* 9e symbol */ |
---|
367 | .quad local_label(misc_ref_invalid) /* 9f function */ |
---|
368 | /* a0-af */ |
---|
369 | .quad local_label(misc_ref_invalid) /* a0 even_fixnum */ |
---|
370 | .quad local_label(misc_ref_invalid) /* a1 imm_1 */ |
---|
371 | .quad local_label(misc_ref_invalid) /* a2 imm_2 */ |
---|
372 | .quad local_label(misc_ref_invalid) /* a3 cons */ |
---|
373 | .quad local_label(misc_ref_invalid) /* a4 tra_0 */ |
---|
374 | .quad local_label(misc_ref_node) /* a5 arrayH */ |
---|
375 | .quad local_label(misc_ref_node) /* a6 vectorH */ |
---|
376 | .quad local_label(misc_ref_s16) /* a7 s16 */ |
---|
377 | .quad local_label(misc_ref_invalid) /* a8 odd_fixnum */ |
---|
378 | .quad local_label(misc_ref_invalid) /* a9 immheader_1 */ |
---|
379 | .quad local_label(misc_ref_invalid) /* aa immheader_2 */ |
---|
380 | .quad local_label(misc_ref_invalid) /* ab nil */ |
---|
381 | .quad local_label(misc_ref_invalid) /* ac tra_1 */ |
---|
382 | .quad local_label(misc_ref_invalid) /* ad misc */ |
---|
383 | .quad local_label(misc_ref_invalid) /* ae symbol */ |
---|
384 | .quad local_label(misc_ref_invalid) /* af function */ |
---|
385 | /* b0-bf */ |
---|
386 | .quad local_label(misc_ref_invalid) /* b0 even_fixnum */ |
---|
387 | .quad local_label(misc_ref_invalid) /* b1 imm_1 */ |
---|
388 | .quad local_label(misc_ref_invalid) /* b2 imm_2 */ |
---|
389 | .quad local_label(misc_ref_invalid) /* b3 cons */ |
---|
390 | .quad local_label(misc_ref_invalid) /* b4 tra_0 */ |
---|
391 | .quad local_label(misc_ref_invalid) /* b5 nodeheader_0 */ |
---|
392 | .quad local_label(misc_ref_node) /* b6 simple_vector */ |
---|
393 | .quad local_label(misc_ref_u16) /* b7 immheader_0 */ |
---|
394 | .quad local_label(misc_ref_invalid) /* b8 odd_fixnum */ |
---|
395 | .quad local_label(misc_ref_invalid) /* b9 immheader_1 */ |
---|
396 | .quad local_label(misc_ref_invalid) /* ba immheader_2 */ |
---|
397 | .quad local_label(misc_ref_invalid) /* bb nil */ |
---|
398 | .quad local_label(misc_ref_invalid) /* bc tra_1 */ |
---|
399 | .quad local_label(misc_ref_invalid) /* bd misc */ |
---|
400 | .quad local_label(misc_ref_invalid) /* be symbol */ |
---|
401 | .quad local_label(misc_ref_invalid) /* bf function */ |
---|
402 | /* c0-cf */ |
---|
403 | .quad local_label(misc_ref_invalid) /* c0 even_fixnum */ |
---|
404 | .quad local_label(misc_ref_invalid) /* c1 imm_1 */ |
---|
405 | .quad local_label(misc_ref_invalid) /* c2 imm_2 */ |
---|
406 | .quad local_label(misc_ref_invalid) /* c3 cons */ |
---|
407 | .quad local_label(misc_ref_invalid) /* c4 tra_0 */ |
---|
408 | .quad local_label(misc_ref_invalid) /* c5 nodeheader_0 */ |
---|
409 | .quad local_label(misc_ref_invalid) /* c6 nodeheader_1 */ |
---|
410 | .quad local_label(misc_ref_string) /* c7 simple_base_string */ |
---|
411 | .quad local_label(misc_ref_invalid) /* c8 odd_fixnum */ |
---|
412 | .quad local_label(misc_ref_new_string) /* c9 new_string_1 */ |
---|
413 | .quad local_label(misc_ref_fixnum_vector) /* ca fixnum_vector */ |
---|
414 | .quad local_label(misc_ref_invalid) /* cb nil */ |
---|
415 | .quad local_label(misc_ref_invalid) /* cc tra_1 */ |
---|
416 | .quad local_label(misc_ref_invalid) /* cd misc */ |
---|
417 | .quad local_label(misc_ref_invalid) /* ce symbol */ |
---|
418 | .quad local_label(misc_ref_invalid) /* cf function */ |
---|
419 | /* d0-df */ |
---|
420 | .quad local_label(misc_ref_invalid) /* d0 even_fixnum */ |
---|
421 | .quad local_label(misc_ref_invalid) /* d1 imm_1 */ |
---|
422 | .quad local_label(misc_ref_invalid) /* d2 imm_2 */ |
---|
423 | .quad local_label(misc_ref_invalid) /* d3 cons */ |
---|
424 | .quad local_label(misc_ref_invalid) /* d4 tra_0 */ |
---|
425 | .quad local_label(misc_ref_invalid) /* d5 nodeheader_0 */ |
---|
426 | .quad local_label(misc_ref_invalid) /* d6 nodeheader_1 */ |
---|
427 | .quad local_label(misc_ref_s8) /* d7 s8 */ |
---|
428 | .quad local_label(misc_ref_invalid) /* d8 odd_fixnum */ |
---|
429 | .quad local_label(misc_ref_s32) /* d9 s32 */ |
---|
430 | .quad local_label(misc_ref_s64) /* da s64 */ |
---|
431 | .quad local_label(misc_ref_invalid) /* db nil */ |
---|
432 | .quad local_label(misc_ref_invalid) /* dc tra_1 */ |
---|
433 | .quad local_label(misc_ref_invalid) /* dd misc */ |
---|
434 | .quad local_label(misc_ref_invalid) /* de symbol */ |
---|
435 | .quad local_label(misc_ref_invalid) /* df function */ |
---|
436 | /* e0-ef */ |
---|
437 | .quad local_label(misc_ref_invalid) /* e0 even_fixnum */ |
---|
438 | .quad local_label(misc_ref_invalid) /* e1 imm_1 */ |
---|
439 | .quad local_label(misc_ref_invalid) /* e2 imm_2 */ |
---|
440 | .quad local_label(misc_ref_invalid) /* e3 cons */ |
---|
441 | .quad local_label(misc_ref_invalid) /* e4 tra_0 */ |
---|
442 | .quad local_label(misc_ref_invalid) /* e5 nodeheader_0 */ |
---|
443 | .quad local_label(misc_ref_invalid) /* e6 nodeheader_1 */ |
---|
444 | .quad local_label(misc_ref_u8) /* e7 u8 */ |
---|
445 | .quad local_label(misc_ref_invalid) /* e8 odd_fixnum */ |
---|
446 | .quad local_label(misc_ref_u32) /* e9 u32 */ |
---|
447 | .quad local_label(misc_ref_u64) /* ea u64 */ |
---|
448 | .quad local_label(misc_ref_invalid) /* eb nil */ |
---|
449 | .quad local_label(misc_ref_invalid) /* ec tra_1 */ |
---|
450 | .quad local_label(misc_ref_invalid) /* ed misc */ |
---|
451 | .quad local_label(misc_ref_invalid) /* ee symbol */ |
---|
452 | .quad local_label(misc_ref_invalid) /* ef function */ |
---|
453 | /* f0-ff */ |
---|
454 | .quad local_label(misc_ref_invalid) /* f0 even_fixnum */ |
---|
455 | .quad local_label(misc_ref_invalid) /* f1 imm_1 */ |
---|
456 | .quad local_label(misc_ref_invalid) /* f2 imm_2 */ |
---|
457 | .quad local_label(misc_ref_invalid) /* f3 cons */ |
---|
458 | .quad local_label(misc_ref_invalid) /* f4 tra_0 */ |
---|
459 | .quad local_label(misc_ref_invalid) /* f5 nodeheader_0 */ |
---|
460 | .quad local_label(misc_ref_invalid) /* f6 nodeheader_1 */ |
---|
461 | .quad local_label(misc_ref_bit_vector) /* f7 bitvector */ |
---|
462 | .quad local_label(misc_ref_invalid) /* f8 odd_fixnum */ |
---|
463 | .quad local_label(misc_ref_single_float_vector) /* f9 single_float */ |
---|
464 | .quad local_label(misc_ref_double_float_vector) /* fa double_float */ |
---|
465 | .quad local_label(misc_ref_invalid) /* fb nil */ |
---|
466 | .quad local_label(misc_ref_invalid) /* fc tra_1 */ |
---|
467 | .quad local_label(misc_ref_invalid) /* fd misc */ |
---|
468 | .quad local_label(misc_ref_invalid) /* fe symbol */ |
---|
469 | .quad local_label(misc_ref_invalid) /* ff function */ |
---|
470 | |
---|
471 | |
---|
472 | /* Node vector. Functions are funny: the first N words */ |
---|
473 | /* are treated as (UNSIGNED-BYTE 64), where N is the low */ |
---|
474 | /* 32 bits of the first word. */ |
---|
475 | |
---|
476 | local_label(misc_ref_function): |
---|
477 | __(movl misc_data_offset(%arg_y),%imm0_l) |
---|
478 | __(shl $fixnumshift,%imm0) |
---|
479 | __(rcmpq(%arg_z,%imm0)) |
---|
480 | __(jb local_label(misc_ref_u64)) |
---|
481 | local_label(misc_ref_node): |
---|
482 | __(movq misc_data_offset(%arg_y,%arg_z),%arg_z) |
---|
483 | __(ret) |
---|
484 | local_label(misc_ref_u64): |
---|
485 | __(movq misc_data_offset(%arg_y,%arg_z),%imm0) |
---|
486 | __(jmp _SPmakeu64) |
---|
487 | local_label(misc_ref_double_float_vector): |
---|
488 | __(movsd misc_data_offset(%arg_y,%arg_z),%fp1) |
---|
489 | __(movq $double_float_header,%imm0) |
---|
490 | __(Misc_Alloc_Fixed(%arg_z,double_float.size)) |
---|
491 | __(movsd %fp1,double_float.value(%arg_z)) |
---|
492 | __(ret) |
---|
493 | local_label(misc_ref_fixnum_vector): |
---|
494 | __(movq misc_data_offset(%arg_y,%arg_z),%imm0) |
---|
495 | __(box_fixnum(%imm0,%arg_z)) |
---|
496 | __(ret) |
---|
497 | local_label(misc_ref_s64): |
---|
498 | __(movq misc_data_offset(%arg_y,%arg_z),%imm0) |
---|
499 | __(jmp _SPmakes64) |
---|
500 | local_label(misc_ref_u32): |
---|
501 | __(movq %arg_z,%imm0) |
---|
502 | __(shr $1,%imm0) |
---|
503 | __(movl misc_data_offset(%arg_y,%imm0),%imm0_l) |
---|
504 | __(box_fixnum(%imm0,%arg_z)) |
---|
505 | __(ret) |
---|
506 | local_label(misc_ref_s32): |
---|
507 | __(movq %arg_z,%imm0) |
---|
508 | __(shr $1,%imm0) |
---|
509 | __(movslq misc_data_offset(%arg_y,%imm0),%imm0) |
---|
510 | __(box_fixnum(%imm0,%arg_z)) |
---|
511 | __(ret) |
---|
512 | local_label(misc_ref_single_float_vector): |
---|
513 | __(movq %arg_z,%imm0) |
---|
514 | __(shr $1,%imm0) |
---|
515 | __(movsd misc_data_offset(%arg_y,%imm0),%fp1) |
---|
516 | __(movd %fp1,%imm0_l) |
---|
517 | __(shl $32,%imm0) |
---|
518 | __(lea subtag_single_float(%imm0),%arg_z) |
---|
519 | __(ret) |
---|
520 | local_label(misc_ref_u8): |
---|
521 | __(movq %arg_z,%imm0) |
---|
522 | __(shr $3,%imm0) |
---|
523 | __(movzbl misc_data_offset(%arg_y,%imm0),%imm0_l) |
---|
524 | __(box_fixnum(%imm0,%arg_z)) |
---|
525 | __(ret) |
---|
526 | local_label(misc_ref_s8): |
---|
527 | __(movq %arg_z,%imm0) |
---|
528 | __(shr $3,%imm0) |
---|
529 | __(movsbq misc_data_offset(%arg_y,%imm0),%imm0) |
---|
530 | __(box_fixnum(%imm0,%arg_z)) |
---|
531 | __(ret) |
---|
532 | local_label(misc_ref_string): |
---|
533 | __(movq %arg_z,%imm0) |
---|
534 | __(shr $3,%imm0) |
---|
535 | __(movzbl misc_data_offset(%arg_y,%imm0),%imm0_l) |
---|
536 | __(shlq $charcode_shift,%imm0) |
---|
537 | __(leaq subtag_character(%imm0),%arg_z) |
---|
538 | __(ret) |
---|
539 | local_label(misc_ref_new_string): |
---|
540 | __(movq %arg_z,%imm0) |
---|
541 | __(shr $1,%imm0) |
---|
542 | __(movl misc_data_offset(%arg_y,%imm0),%imm0_l) |
---|
543 | __(shlq $charcode_shift,%imm0) |
---|
544 | __(leaq subtag_character(%imm0),%arg_z) |
---|
545 | __(ret) |
---|
546 | local_label(misc_ref_u16): |
---|
547 | __(movq %arg_z,%imm0) |
---|
548 | __(shrq $2,%imm0) |
---|
549 | __(movzwl misc_data_offset(%arg_y,%imm0),%imm0_l) |
---|
550 | __(box_fixnum(%imm0,%arg_z)) |
---|
551 | __(ret) |
---|
552 | local_label(misc_ref_s16): |
---|
553 | __(movq %arg_z,%imm0) |
---|
554 | __(shrq $2,%imm0) |
---|
555 | __(movswq misc_data_offset(%arg_y,%imm0),%imm0) |
---|
556 | __(box_fixnum(%imm0,%arg_z)) |
---|
557 | __(ret) |
---|
558 | local_label(misc_ref_bit_vector): |
---|
559 | __(unbox_fixnum(%arg_z,%imm0)) |
---|
560 | __(btq %imm0,misc_data_offset(%arg_y)) |
---|
561 | __(setc %imm0_b) |
---|
562 | __(movzbl %imm0_b,%imm0_l) |
---|
563 | __(imull $fixnumone,%imm0_l,%arg_z_l) |
---|
564 | __(ret) |
---|
565 | local_label(misc_ref_invalid): |
---|
566 | __(movq $XBADVEC,%arg_x) |
---|
567 | __(set_nargs(3)) |
---|
568 | __(jmp _SPksignalerr) |
---|
569 | _endfn(C(misc_ref_common)) |
---|
570 | |
---|
571 | /* like misc_ref, only the boxed subtag is in arg_x. */ |
---|
572 | |
---|
573 | _spentry(subtag_misc_ref) |
---|
574 | __(movb $tagmask,%imm0_b) |
---|
575 | __(andb %arg_y_b,%imm0_b) |
---|
576 | __(cmpb $tag_misc,%imm0_b) |
---|
577 | __(jne 0f) |
---|
578 | __(testb $fixnummask,%arg_z_b) |
---|
579 | __(jne 1f) |
---|
580 | __(movq misc_header_offset(%arg_y),%imm0) |
---|
581 | __(xorb %imm0_b,%imm0_b) |
---|
582 | __(shrq $num_subtag_bits-fixnumshift,%imm0) |
---|
583 | __(cmpq %imm0,%arg_z) |
---|
584 | __(jae 2f) |
---|
585 | __(unbox_fixnum(%arg_x,%imm1)) |
---|
586 | __(jmp C(misc_ref_common)) |
---|
587 | 0: __(uuo_error_reg_not_tag(Rarg_y,tag_misc)) |
---|
588 | 1: __(uuo_error_reg_not_fixnum(Rarg_z)) |
---|
589 | 2: __(uuo_error_vector_bounds(Rarg_z,Rarg_y)) |
---|
590 | |
---|
591 | _endsubp(subtag_misc_ref) |
---|
592 | |
---|
593 | _spentry(subtag_misc_set) |
---|
594 | __(movb $tagmask,%imm0_b) |
---|
595 | __(andb %arg_x_b,%imm0_b) |
---|
596 | __(cmpb $tag_misc,%imm0_b) |
---|
597 | __(jne 0f) |
---|
598 | __(testb $fixnummask,%arg_y_b) |
---|
599 | __(jne 1f) |
---|
600 | __(movq misc_header_offset(%arg_x),%imm0) |
---|
601 | __(xorb %imm0_b,%imm0_b) |
---|
602 | __(shrq $num_subtag_bits-fixnumshift,%imm0) |
---|
603 | __(cmpq %imm0,%arg_y) |
---|
604 | __(jae 2f) |
---|
605 | __(unbox_fixnum(%temp0,%imm1)) |
---|
606 | __(jmp C(misc_set_common)) |
---|
607 | 0: __(uuo_error_reg_not_tag(Rarg_x,tag_misc)) |
---|
608 | 1: __(uuo_error_reg_not_fixnum(Rarg_y)) |
---|
609 | 2: __(uuo_error_vector_bounds(Rarg_y,Rarg_x)) |
---|
610 | _endsubp(subtag_misc_set) |
---|
611 | |
---|
612 | _spentry(misc_set) |
---|
613 | __(movb $tagmask,%imm0_b) |
---|
614 | __(andb %arg_x_b,%imm0_b) |
---|
615 | __(cmpb $tag_misc,%imm0_b) |
---|
616 | __(jne 0f) |
---|
617 | __(testb $fixnummask,%arg_y_b) |
---|
618 | __(jne 1f) |
---|
619 | __(movq misc_header_offset(%arg_x),%imm0) |
---|
620 | __(xorb %imm0_b,%imm0_b) |
---|
621 | __(shrq $num_subtag_bits-fixnumshift,%imm0) |
---|
622 | __(cmpq %imm0,%arg_y) |
---|
623 | __(jae 2f) |
---|
624 | __(movb misc_subtag_offset(%arg_x),%imm1_b) |
---|
625 | __(jmp C(misc_set_common)) |
---|
626 | |
---|
627 | 0: __(uuo_error_reg_not_tag(Rarg_x,tag_misc)) |
---|
628 | 1: __(uuo_error_reg_not_fixnum(Rarg_y)) |
---|
629 | 2: __(uuo_error_vector_bounds(Rarg_y,Rarg_x)) |
---|
630 | _endsubp(misc_set) |
---|
631 | |
---|
632 | _startfn(C(misc_set_common)) |
---|
633 | __(movzbl %imm1_b,%imm1_l) |
---|
634 | __(lea local_label(misc_set_jmp)(%rip),%imm2) |
---|
635 | __(jmp *(%imm2,%imm1,8)) |
---|
636 | .p2align 3 |
---|
637 | local_label(misc_set_jmp): |
---|
638 | /* 00-0f */ |
---|
639 | .quad local_label(misc_set_invalid) /* 00 even_fixnum */ |
---|
640 | .quad local_label(misc_set_invalid) /* 01 imm_1 */ |
---|
641 | .quad local_label(misc_set_invalid) /* 02 imm_2 */ |
---|
642 | .quad local_label(misc_set_invalid) /* 03 cons */ |
---|
643 | .quad local_label(misc_set_invalid) /* 04 tra_0 */ |
---|
644 | .quad local_label(misc_set_invalid) /* 05 nodeheader_0 */ |
---|
645 | .quad local_label(misc_set_invalid) /* 06 nodeheader_1 */ |
---|
646 | .quad local_label(misc_set_invalid) /* 07 immheader_0 */ |
---|
647 | .quad local_label(misc_set_invalid) /* 08 odd_fixnum */ |
---|
648 | .quad local_label(misc_set_invalid) /* 09 immheader_1 */ |
---|
649 | .quad local_label(misc_set_invalid) /* 0a immheader_2 */ |
---|
650 | .quad local_label(misc_set_invalid) /* 0b nil */ |
---|
651 | .quad local_label(misc_set_invalid) /* 0c tra_1 */ |
---|
652 | .quad local_label(misc_set_invalid) /* 0d misc */ |
---|
653 | .quad local_label(misc_set_invalid) /* 0e symbol */ |
---|
654 | .quad local_label(misc_set_invalid) /* 0f function */ |
---|
655 | /* 10-1f */ |
---|
656 | .quad local_label(misc_set_invalid) /* 10 even_fixnum */ |
---|
657 | .quad local_label(misc_set_invalid) /* 11 imm_1 */ |
---|
658 | .quad local_label(misc_set_invalid) /* 12 imm_2 */ |
---|
659 | .quad local_label(misc_set_invalid) /* 13 cons */ |
---|
660 | .quad local_label(misc_set_invalid) /* 14 tra_0 */ |
---|
661 | .quad _SPgvset /* 15 symbol_vector */ |
---|
662 | .quad _SPgvset /* 16 ratio */ |
---|
663 | .quad local_label(misc_set_invalid) /* 17 immheader_0 */ |
---|
664 | .quad local_label(misc_set_invalid) /* 18 odd_fixnum */ |
---|
665 | .quad local_label(misc_set_u32) /* 19 bignum */ |
---|
666 | .quad local_label(misc_set_u64) /* 1a macptr */ |
---|
667 | .quad local_label(misc_set_invalid) /* 1b nil */ |
---|
668 | .quad local_label(misc_set_invalid) /* 1c tra_1 */ |
---|
669 | .quad local_label(misc_set_invalid) /* 1d misc */ |
---|
670 | .quad local_label(misc_set_invalid) /* 1e symbol */ |
---|
671 | .quad local_label(misc_set_invalid) /* 1f function */ |
---|
672 | /* 20-2f */ |
---|
673 | .quad local_label(misc_set_invalid) /* 20 even_fixnum */ |
---|
674 | .quad local_label(misc_set_invalid) /* 21 imm_1 */ |
---|
675 | .quad local_label(misc_set_invalid) /* 22 imm_2 */ |
---|
676 | .quad local_label(misc_set_invalid) /* 23 cons */ |
---|
677 | .quad local_label(misc_set_invalid) /* 24 tra_0 */ |
---|
678 | .quad _SPgvset /* 25 catch_frame */ |
---|
679 | .quad _SPgvset /* 26 complex */ |
---|
680 | .quad local_label(misc_set_invalid) /* 27 immheader_0 */ |
---|
681 | .quad local_label(misc_set_invalid) /* 28 odd_fixnum */ |
---|
682 | .quad local_label(misc_set_u32) /* 29 double_float */ |
---|
683 | .quad local_label(misc_set_u64) /* 2a dead_macptr */ |
---|
684 | .quad local_label(misc_set_invalid) /* 2b nil */ |
---|
685 | .quad local_label(misc_set_invalid) /* 2c tra_1 */ |
---|
686 | .quad local_label(misc_set_invalid) /* 2d misc */ |
---|
687 | .quad local_label(misc_set_invalid) /* 2e symbol */ |
---|
688 | .quad local_label(misc_set_invalid) /* 2f function */ |
---|
689 | /* 30-3f */ |
---|
690 | .quad local_label(misc_set_invalid) /* 30 even_fixnum */ |
---|
691 | .quad local_label(misc_set_invalid) /* 31 imm_1 */ |
---|
692 | .quad local_label(misc_set_invalid) /* 32 imm_2 */ |
---|
693 | .quad local_label(misc_set_invalid) /* 33 cons */ |
---|
694 | .quad local_label(misc_set_invalid) /* 34 tra_0 */ |
---|
695 | .quad _SPgvset /* 35 hash_vector */ |
---|
696 | .quad _SPgvset /* 36 struct */ |
---|
697 | .quad local_label(misc_set_invalid) /* 37 immheader_0 */ |
---|
698 | .quad local_label(misc_set_invalid) /* 38 odd_fixnum */ |
---|
699 | .quad local_label(misc_set_u32) /* 39 xcode_vector */ |
---|
700 | .quad local_label(misc_set_invalid) /* 3a immheader_2 */ |
---|
701 | .quad local_label(misc_set_invalid) /* 3b nil */ |
---|
702 | .quad local_label(misc_set_invalid) /* 3c tra_1 */ |
---|
703 | .quad local_label(misc_set_invalid) /* 3d misc */ |
---|
704 | .quad local_label(misc_set_invalid) /* 3e symbol */ |
---|
705 | .quad local_label(misc_set_invalid) /* 3f function */ |
---|
706 | /* 40-4f */ |
---|
707 | .quad local_label(misc_set_invalid) /* 40 even_fixnum */ |
---|
708 | .quad local_label(misc_set_invalid) /* 41 imm_1 */ |
---|
709 | .quad local_label(misc_set_invalid) /* 42 imm_2 */ |
---|
710 | .quad local_label(misc_set_invalid) /* 43 cons */ |
---|
711 | .quad local_label(misc_set_invalid) /* 44 tra_0 */ |
---|
712 | .quad _SPgvset /* 45 pool */ |
---|
713 | .quad _SPgvset /* 46 istruct */ |
---|
714 | .quad local_label(misc_set_invalid) /* 47 immheader_0 */ |
---|
715 | .quad local_label(misc_set_invalid) /* 48 odd_fixnum */ |
---|
716 | .quad local_label(misc_set_invalid) /* 49 immheader_1 */ |
---|
717 | .quad local_label(misc_set_invalid) /* 4a immheader_2 */ |
---|
718 | .quad local_label(misc_set_invalid) /* 4b nil */ |
---|
719 | .quad local_label(misc_set_invalid) /* 4c tra_1 */ |
---|
720 | .quad local_label(misc_set_invalid) /* 4d misc */ |
---|
721 | .quad local_label(misc_set_invalid) /* 4e symbol */ |
---|
722 | .quad local_label(misc_set_invalid) /* 4f function */ |
---|
723 | /* 50-5f */ |
---|
724 | .quad local_label(misc_set_invalid) /* 50 even_fixnum */ |
---|
725 | .quad local_label(misc_set_invalid) /* 51 imm_1 */ |
---|
726 | .quad local_label(misc_set_invalid) /* 52 imm_2 */ |
---|
727 | .quad local_label(misc_set_invalid) /* 53 cons */ |
---|
728 | .quad local_label(misc_set_invalid) /* 54 tra_0 */ |
---|
729 | .quad _SPgvset /* 55 weak */ |
---|
730 | .quad _SPgvset /* 56 value_cell */ |
---|
731 | .quad local_label(misc_set_invalid) /* 57 immheader_0 */ |
---|
732 | .quad local_label(misc_set_invalid) /* 58 odd_fixnum */ |
---|
733 | .quad local_label(misc_set_invalid) /* 59 immheader_1 */ |
---|
734 | .quad local_label(misc_set_invalid) /* 5a immheader_2 */ |
---|
735 | .quad local_label(misc_set_invalid) /* 5b nil */ |
---|
736 | .quad local_label(misc_set_invalid) /* 5c tra_1 */ |
---|
737 | .quad local_label(misc_set_invalid) /* 5d misc */ |
---|
738 | .quad local_label(misc_set_invalid) /* 5e symbol */ |
---|
739 | .quad local_label(misc_set_invalid) /* 5f function */ |
---|
740 | /* 60-6f */ |
---|
741 | .quad local_label(misc_set_invalid) /* 60 even_fixnum */ |
---|
742 | .quad local_label(misc_set_invalid) /* 61 imm_1 */ |
---|
743 | .quad local_label(misc_set_invalid) /* 62 imm_2 */ |
---|
744 | .quad local_label(misc_set_invalid) /* 63 cons */ |
---|
745 | .quad local_label(misc_set_invalid) /* 64 tra_0 */ |
---|
746 | .quad _SPgvset /* 65 package */ |
---|
747 | .quad _SPgvset /* 66 xfunction */ |
---|
748 | .quad local_label(misc_set_invalid) /* 67 immheader_0 */ |
---|
749 | .quad local_label(misc_set_invalid) /* 68 odd_fixnum */ |
---|
750 | .quad local_label(misc_set_invalid) /* 69 immheader_1 */ |
---|
751 | .quad local_label(misc_set_invalid) /* 6a immheader_2 */ |
---|
752 | .quad local_label(misc_set_invalid) /* 6b nil */ |
---|
753 | .quad local_label(misc_set_invalid) /* 6c tra_1 */ |
---|
754 | .quad local_label(misc_set_invalid) /* 6d misc */ |
---|
755 | .quad local_label(misc_set_invalid) /* 6e symbol */ |
---|
756 | .quad local_label(misc_set_invalid) /* 6f function */ |
---|
757 | /* 70-7f */ |
---|
758 | .quad local_label(misc_set_invalid) /* 70 even_fixnum */ |
---|
759 | .quad local_label(misc_set_invalid) /* 71 imm_1 */ |
---|
760 | .quad local_label(misc_set_invalid) /* 72 imm_2 */ |
---|
761 | .quad local_label(misc_set_invalid) /* 73 cons */ |
---|
762 | .quad local_label(misc_set_invalid) /* 74 tra_0 */ |
---|
763 | .quad _SPgvset /* 75 slot_vector */ |
---|
764 | .quad _SPgvset /* 76 lock */ |
---|
765 | .quad local_label(misc_set_invalid) /* 77 immheader_0 */ |
---|
766 | .quad local_label(misc_set_invalid) /* 78 odd_fixnum */ |
---|
767 | .quad local_label(misc_set_invalid) /* 79 immheader_1 */ |
---|
768 | .quad local_label(misc_set_invalid) /* 7a immheader_2 */ |
---|
769 | .quad local_label(misc_set_invalid) /* 7b nil */ |
---|
770 | .quad local_label(misc_set_invalid) /* 7c tra_1 */ |
---|
771 | .quad local_label(misc_set_invalid) /* 7d misc */ |
---|
772 | .quad local_label(misc_set_invalid) /* 7e symbol */ |
---|
773 | .quad local_label(misc_set_invalid) /* 7f function */ |
---|
774 | /* 80-8f */ |
---|
775 | .quad local_label(misc_set_invalid) /* 80 even_fixnum */ |
---|
776 | .quad local_label(misc_set_invalid) /* 81 imm_1 */ |
---|
777 | .quad local_label(misc_set_invalid) /* 82 imm_2 */ |
---|
778 | .quad local_label(misc_set_invalid) /* 83 cons */ |
---|
779 | .quad local_label(misc_set_invalid) /* 84 tra_0 */ |
---|
780 | .quad _SPgvset /* 85 lisp_thread */ |
---|
781 | .quad _SPgvset /* 86 instance */ |
---|
782 | .quad local_label(misc_set_invalid) /* 87 immheader_0 */ |
---|
783 | .quad local_label(misc_set_invalid) /* 88 odd_fixnum */ |
---|
784 | .quad local_label(misc_set_invalid) /* 89 immheader_1 */ |
---|
785 | .quad local_label(misc_set_invalid) /* 8a immheader_2 */ |
---|
786 | .quad local_label(misc_set_invalid) /* 8b nil */ |
---|
787 | .quad local_label(misc_set_invalid) /* 8c tra_1 */ |
---|
788 | .quad local_label(misc_set_invalid) /* 8d misc */ |
---|
789 | .quad local_label(misc_set_invalid) /* 8e symbol */ |
---|
790 | .quad local_label(misc_set_invalid) /* 8f function */ |
---|
791 | /* 90-9f */ |
---|
792 | .quad local_label(misc_set_invalid) /* 90 even_fixnum */ |
---|
793 | .quad local_label(misc_set_invalid) /* 91 imm_1 */ |
---|
794 | .quad local_label(misc_set_invalid) /* 92 imm_2 */ |
---|
795 | .quad local_label(misc_set_invalid) /* 93 cons */ |
---|
796 | .quad local_label(misc_set_invalid) /* 94 tra_0 */ |
---|
797 | .quad local_label(misc_set_function) /* 95 function_vector */ |
---|
798 | .quad local_label(misc_set_invalid) /* 96 nodeheader_1 */ |
---|
799 | .quad local_label(misc_set_invalid) /* 97 immheader_0 */ |
---|
800 | .quad local_label(misc_set_invalid) /* 98 odd_fixnum */ |
---|
801 | .quad local_label(misc_set_invalid) /* 99 immheader_1 */ |
---|
802 | .quad local_label(misc_set_invalid) /* 9a immheader_2 */ |
---|
803 | .quad local_label(misc_set_invalid) /* 9b nil */ |
---|
804 | .quad local_label(misc_set_invalid) /* 9c tra_1 */ |
---|
805 | .quad local_label(misc_set_invalid) /* 9d misc */ |
---|
806 | .quad local_label(misc_set_invalid) /* 9e symbol */ |
---|
807 | .quad local_label(misc_set_invalid) /* 9f function */ |
---|
808 | /* a0-af */ |
---|
809 | .quad local_label(misc_set_invalid) /* a0 even_fixnum */ |
---|
810 | .quad local_label(misc_set_invalid) /* a1 imm_1 */ |
---|
811 | .quad local_label(misc_set_invalid) /* a2 imm_2 */ |
---|
812 | .quad local_label(misc_set_invalid) /* a3 cons */ |
---|
813 | .quad local_label(misc_set_invalid) /* a4 tra_0 */ |
---|
814 | .quad _SPgvset /* a5 arrayH */ |
---|
815 | .quad _SPgvset /* a6 vectorH */ |
---|
816 | .quad local_label(misc_set_s16) /* a7 s16 */ |
---|
817 | .quad local_label(misc_set_invalid) /* a8 odd_fixnum */ |
---|
818 | .quad local_label(misc_set_invalid) /* a9 immheader_1 */ |
---|
819 | .quad local_label(misc_set_invalid) /* aa immheader_2 */ |
---|
820 | .quad local_label(misc_set_invalid) /* ab nil */ |
---|
821 | .quad local_label(misc_set_invalid) /* ac tra_1 */ |
---|
822 | .quad local_label(misc_set_invalid) /* ad misc */ |
---|
823 | .quad local_label(misc_set_invalid) /* ae symbol */ |
---|
824 | .quad local_label(misc_set_invalid) /* af function */ |
---|
825 | /* b0-bf */ |
---|
826 | .quad local_label(misc_set_invalid) /* b0 even_fixnum */ |
---|
827 | .quad local_label(misc_set_invalid) /* b1 imm_1 */ |
---|
828 | .quad local_label(misc_set_invalid) /* b2 imm_2 */ |
---|
829 | .quad local_label(misc_set_invalid) /* b3 cons */ |
---|
830 | .quad local_label(misc_set_invalid) /* b4 tra_0 */ |
---|
831 | .quad local_label(misc_set_invalid) /* b5 nodeheader_0 */ |
---|
832 | .quad _SPgvset /* b6 simple_vector */ |
---|
833 | .quad local_label(misc_set_u16) /* b7 immheader_0 */ |
---|
834 | .quad local_label(misc_set_invalid) /* b8 odd_fixnum */ |
---|
835 | .quad local_label(misc_set_invalid) /* b9 immheader_1 */ |
---|
836 | .quad local_label(misc_set_invalid) /* ba immheader_2 */ |
---|
837 | .quad local_label(misc_set_invalid) /* bb nil */ |
---|
838 | .quad local_label(misc_set_invalid) /* bc tra_1 */ |
---|
839 | .quad local_label(misc_set_invalid) /* bd misc */ |
---|
840 | .quad local_label(misc_set_invalid) /* be symbol */ |
---|
841 | .quad local_label(misc_set_invalid) /* bf function */ |
---|
842 | /* c0-cf */ |
---|
843 | .quad local_label(misc_set_invalid) /* c0 even_fixnum */ |
---|
844 | .quad local_label(misc_set_invalid) /* c1 imm_1 */ |
---|
845 | .quad local_label(misc_set_invalid) /* c2 imm_2 */ |
---|
846 | .quad local_label(misc_set_invalid) /* c3 cons */ |
---|
847 | .quad local_label(misc_set_invalid) /* c4 tra_0 */ |
---|
848 | .quad local_label(misc_set_invalid) /* c5 nodeheader_0 */ |
---|
849 | .quad local_label(misc_set_invalid) /* c6 nodeheader_1 */ |
---|
850 | .quad local_label(misc_set_string) /* c7 simple_base_string */ |
---|
851 | .quad local_label(misc_set_invalid) /* c8 odd_fixnum */ |
---|
852 | .quad local_label(misc_set_new_string) /* c9 new_strin */ |
---|
853 | .quad local_label(misc_set_fixnum_vector) /* ca fixnum_vector */ |
---|
854 | .quad local_label(misc_set_invalid) /* cb nil */ |
---|
855 | .quad local_label(misc_set_invalid) /* cc tra_1 */ |
---|
856 | .quad local_label(misc_set_invalid) /* cd misc */ |
---|
857 | .quad local_label(misc_set_invalid) /* ce symbol */ |
---|
858 | .quad local_label(misc_set_invalid) /* cf function */ |
---|
859 | /* d0-df */ |
---|
860 | .quad local_label(misc_set_invalid) /* d0 even_fixnum */ |
---|
861 | .quad local_label(misc_set_invalid) /* d1 imm_1 */ |
---|
862 | .quad local_label(misc_set_invalid) /* d2 imm_2 */ |
---|
863 | .quad local_label(misc_set_invalid) /* d3 cons */ |
---|
864 | .quad local_label(misc_set_invalid) /* d4 tra_0 */ |
---|
865 | .quad local_label(misc_set_invalid) /* d5 nodeheader_0 */ |
---|
866 | .quad local_label(misc_set_invalid) /* d6 nodeheader_1 */ |
---|
867 | .quad local_label(misc_set_s8) /* d7 s8 */ |
---|
868 | .quad local_label(misc_set_invalid) /* d8 odd_fixnum */ |
---|
869 | .quad local_label(misc_set_s32) /* d9 s32 */ |
---|
870 | .quad local_label(misc_set_s64) /* da s64 */ |
---|
871 | .quad local_label(misc_set_invalid) /* db nil */ |
---|
872 | .quad local_label(misc_set_invalid) /* dc tra_1 */ |
---|
873 | .quad local_label(misc_set_invalid) /* dd misc */ |
---|
874 | .quad local_label(misc_set_invalid) /* de symbol */ |
---|
875 | .quad local_label(misc_set_invalid) /* df function */ |
---|
876 | /* e0-ef */ |
---|
877 | .quad local_label(misc_set_invalid) /* e0 even_fixnum */ |
---|
878 | .quad local_label(misc_set_invalid) /* e1 imm_1 */ |
---|
879 | .quad local_label(misc_set_invalid) /* e2 imm_2 */ |
---|
880 | .quad local_label(misc_set_invalid) /* e3 cons */ |
---|
881 | .quad local_label(misc_set_invalid) /* e4 tra_0 */ |
---|
882 | .quad local_label(misc_set_invalid) /* e5 nodeheader_0 */ |
---|
883 | .quad local_label(misc_set_invalid) /* e6 nodeheader_1 */ |
---|
884 | .quad local_label(misc_set_u8) /* e7 u8 */ |
---|
885 | .quad local_label(misc_set_invalid) /* e8 odd_fixnum */ |
---|
886 | .quad local_label(misc_set_u32) /* e9 u32 */ |
---|
887 | .quad local_label(misc_set_u64) /* ea u64 */ |
---|
888 | .quad local_label(misc_set_invalid) /* eb nil */ |
---|
889 | .quad local_label(misc_set_invalid) /* ec tra_1 */ |
---|
890 | .quad local_label(misc_set_invalid) /* ed misc */ |
---|
891 | .quad local_label(misc_set_invalid) /* ee symbol */ |
---|
892 | .quad local_label(misc_set_invalid) /* ef function */ |
---|
893 | /* f0-ff */ |
---|
894 | .quad local_label(misc_set_invalid) /* f0 even_fixnum */ |
---|
895 | .quad local_label(misc_set_invalid) /* f1 imm_1 */ |
---|
896 | .quad local_label(misc_set_invalid) /* f2 imm_2 */ |
---|
897 | .quad local_label(misc_set_invalid) /* f3 cons */ |
---|
898 | .quad local_label(misc_set_invalid) /* f4 tra_0 */ |
---|
899 | .quad local_label(misc_set_invalid) /* f5 nodeheader_0 */ |
---|
900 | .quad local_label(misc_set_invalid) /* f6 nodeheader_1 */ |
---|
901 | .quad local_label(misc_set_bit_vector) /* f7 bitvector */ |
---|
902 | .quad local_label(misc_set_invalid) /* f8 odd_fixnum */ |
---|
903 | .quad local_label(misc_set_single_float_vector) /* f9 single_float */ |
---|
904 | .quad local_label(misc_set_double_float_vector) /* fa double_float */ |
---|
905 | .quad local_label(misc_set_invalid) /* fb nil */ |
---|
906 | .quad local_label(misc_set_invalid) /* fc tra_1 */ |
---|
907 | .quad local_label(misc_set_invalid) /* fd misc */ |
---|
908 | .quad local_label(misc_set_invalid) /* fe symbol */ |
---|
909 | .quad local_label(misc_set_invalid) /* ff function */ |
---|
910 | |
---|
911 | local_label(misc_set_function): |
---|
912 | /* Functions are funny: the first N words */ |
---|
913 | /* are treated as (UNSIGNED-BYTE 64), where N is the low */ |
---|
914 | /* 32 bits of the first word. */ |
---|
915 | __(movl misc_data_offset(%arg_x),%imm0_l) |
---|
916 | __(shl $fixnumshift,%imm0) |
---|
917 | __(rcmpq(%arg_y,%imm0)) |
---|
918 | __(jae _SPgvset) |
---|
919 | local_label(misc_set_u64): |
---|
920 | __(movq $~(target_most_positive_fixnum << fixnumshift),%imm0) |
---|
921 | __(testq %arg_z,%imm0) |
---|
922 | __(movq %arg_z,%imm0) |
---|
923 | __(jne 1f) |
---|
924 | __(sarq $fixnumshift,%imm0) |
---|
925 | __(jmp 9f) |
---|
926 | 1: __(andb $tagmask,%imm0_b) |
---|
927 | __(cmpb $tag_misc,%imm0_b) |
---|
928 | __(jne local_label(misc_set_bad)) |
---|
929 | __(movb misc_subtag_offset(%arg_z),%imm0_b) |
---|
930 | __(cmpb $subtag_bignum,%imm0_b) |
---|
931 | __(jne local_label(misc_set_bad)) |
---|
932 | __(movq misc_header_offset(%arg_z),%imm0) |
---|
933 | __(cmpq $three_digit_bignum_header,%imm0) |
---|
934 | __(je 3f) |
---|
935 | __(cmpq $two_digit_bignum_header,%imm0) |
---|
936 | __(jne local_label(misc_set_bad)) |
---|
937 | __(movq misc_data_offset(%arg_z),%imm0) |
---|
938 | __(testq %imm0,%imm0) |
---|
939 | __(js local_label(misc_set_bad)) |
---|
940 | __(jmp 9f) |
---|
941 | 3: __(movq misc_data_offset(%arg_z),%imm0) |
---|
942 | __(cmpl $0,misc_data_offset+8(%arg_z)) |
---|
943 | __(jne local_label(misc_set_bad)) |
---|
944 | 9: __(movq %imm0,misc_data_offset(%arg_x,%arg_y)) |
---|
945 | __(ret) |
---|
946 | local_label(misc_set_fixnum_vector): |
---|
947 | __(movq %arg_z,%imm0) |
---|
948 | __(sarq $fixnumshift,%imm0) |
---|
949 | __(testb $fixnummask,%arg_z_b) |
---|
950 | __(jne local_label(misc_set_bad)) |
---|
951 | __(movq %imm0,misc_data_offset(%arg_x,%arg_y)) |
---|
952 | __(ret) |
---|
953 | local_label(misc_set_s64): |
---|
954 | __(movq %arg_z,%imm0) |
---|
955 | __(sarq $fixnumshift,%imm0) |
---|
956 | __(testb $fixnummask,%arg_z_b) |
---|
957 | __(je 9f) |
---|
958 | 1: __(movb %arg_z_b,%imm0_b) |
---|
959 | __(andb $tagmask,%imm0_b) |
---|
960 | __(cmpb $tag_misc,%imm0_b) |
---|
961 | __(jne local_label(misc_set_bad)) |
---|
962 | __(movb misc_subtag_offset(%arg_z),%imm0_b) |
---|
963 | __(cmpb $subtag_bignum,%imm0_b) |
---|
964 | __(jne local_label(misc_set_bad)) |
---|
965 | __(movq misc_header_offset(%arg_z),%imm0) |
---|
966 | __(cmpq $two_digit_bignum_header,%imm0) |
---|
967 | __(movq misc_data_offset(%arg_z),%imm0) |
---|
968 | __(jne local_label(misc_set_bad)) |
---|
969 | 9: __(movq %imm0,misc_data_offset(%arg_x,%arg_y)) |
---|
970 | __(ret) |
---|
971 | local_label(misc_set_bad): |
---|
972 | __(movq %arg_z,%arg_y) |
---|
973 | __(movq %arg_x,%arg_z) |
---|
974 | __(movq $XNOTELT,%arg_x) |
---|
975 | __(set_nargs(3)) |
---|
976 | __(jmp _SPksignalerr) |
---|
977 | local_label(misc_set_double_float_vector): |
---|
978 | __(extract_lisptag(%arg_z,%imm0)) |
---|
979 | __(cmpb $tag_misc,%imm0_b) |
---|
980 | __(jne local_label(misc_set_bad)) |
---|
981 | __(movb misc_subtag_offset(%arg_z),%imm0_b) |
---|
982 | __(cmpb $subtag_double_float,%imm0_b) |
---|
983 | __(jne local_label(misc_set_bad)) |
---|
984 | __(movq double_float.value(%arg_z),%imm0) |
---|
985 | __(movq %imm0,misc_dfloat_offset(%arg_x,%arg_y)) |
---|
986 | __(ret) |
---|
987 | local_label(misc_set_s32): |
---|
988 | __(movq %arg_z,%imm0) |
---|
989 | __(movq %arg_y,%imm1) |
---|
990 | __(shlq $64-(32+fixnumshift),%imm0) |
---|
991 | __(shrq $1,%imm1) |
---|
992 | __(sarq $64-(32+fixnumshift),%imm0) |
---|
993 | __(cmpq %imm0,%arg_z) |
---|
994 | __(jne local_label(misc_set_bad)) |
---|
995 | __(testb $fixnummask,%arg_z_b) |
---|
996 | __(jne local_label(misc_set_bad)) |
---|
997 | __(shr $fixnumshift,%imm0) |
---|
998 | __(movl %imm0_l,misc_data_offset(%arg_x,%imm1)) |
---|
999 | __(ret) |
---|
1000 | local_label(misc_set_single_float_vector): |
---|
1001 | __(cmpb $tag_single_float,%arg_z_b) |
---|
1002 | __(movq %arg_z,%imm0) |
---|
1003 | __(movq %arg_y,%imm1) |
---|
1004 | __(jne local_label(misc_set_bad)) |
---|
1005 | __(shrq $1,%imm1) |
---|
1006 | __(shr $32,%imm0) |
---|
1007 | __(movl %imm0_l,misc_data_offset(%arg_x,%imm1)) |
---|
1008 | __(ret) |
---|
1009 | local_label(misc_set_u32): |
---|
1010 | __(movq %arg_y,%imm1) |
---|
1011 | __(movq $~(0xffffffff<<fixnumshift),%imm0) |
---|
1012 | __(shrq $1,%imm1) |
---|
1013 | __(testq %imm0,%arg_z) |
---|
1014 | __(jne local_label(misc_set_bad)) |
---|
1015 | __(unbox_fixnum(%arg_z,%imm0)) |
---|
1016 | __(movl %imm0_l,misc_data_offset(%arg_x,%imm1)) |
---|
1017 | __(ret) |
---|
1018 | local_label(misc_set_bit_vector): |
---|
1019 | __(testq $~fixnumone,%arg_z) |
---|
1020 | __(jne local_label(misc_set_bad)) |
---|
1021 | __(unbox_fixnum(%arg_y,%imm0)) |
---|
1022 | __(testb %arg_z_b,%arg_z_b) |
---|
1023 | __(je local_label(misc_set_clr_bit)) |
---|
1024 | local_label(misc_set_set_bit): |
---|
1025 | __(btsq %imm0,misc_data_offset(%arg_x)) |
---|
1026 | __(ret) |
---|
1027 | local_label(misc_set_clr_bit): |
---|
1028 | __(btrq %imm0,misc_data_offset(%arg_x)) |
---|
1029 | __(ret) |
---|
1030 | local_label(misc_set_u8): |
---|
1031 | __(testq $~(0xff<<fixnumshift),%arg_z) |
---|
1032 | __(jne local_label(misc_set_bad)) |
---|
1033 | __(movq %arg_y,%imm1) |
---|
1034 | __(unbox_fixnum(%arg_z,%imm0)) |
---|
1035 | __(shrq $3,%imm1) |
---|
1036 | __(movb %imm0_b,misc_data_offset(%arg_x,%imm1)) |
---|
1037 | __(ret) |
---|
1038 | local_label(misc_set_s8): |
---|
1039 | __(movq %arg_z,%imm0) |
---|
1040 | __(shlq $64-(8+fixnumshift),%imm0) |
---|
1041 | __(sarq $64-(8+fixnumshift),%imm0) |
---|
1042 | __(cmpq %arg_z,%imm0) |
---|
1043 | __(jne local_label(misc_set_bad)) |
---|
1044 | __(testb $fixnummask,%arg_z_b) |
---|
1045 | __(jne local_label(misc_set_bad)) |
---|
1046 | __(movq %arg_y,%imm1) |
---|
1047 | __(shrq $fixnumshift,%imm0) |
---|
1048 | __(shrq $3,%imm1) |
---|
1049 | __(movb %imm0_b,misc_data_offset(%arg_x,%imm1)) |
---|
1050 | __(ret) |
---|
1051 | local_label(misc_set_string): |
---|
1052 | __(cmpb $subtag_character,%arg_z_b) |
---|
1053 | __(movq %arg_z,%imm0) |
---|
1054 | __(jne local_label(misc_set_bad)) |
---|
1055 | __(movq %arg_y,%imm1) |
---|
1056 | __(shrq $charcode_shift,%imm0) |
---|
1057 | __(shrq $3,%imm1) |
---|
1058 | __(movb %imm0_b,misc_data_offset(%arg_x,%imm1)) |
---|
1059 | __(ret) |
---|
1060 | local_label(misc_set_new_string): |
---|
1061 | __(cmpb $subtag_character,%arg_z_b) |
---|
1062 | __(movq %arg_z,%imm0) |
---|
1063 | __(jne local_label(misc_set_bad)) |
---|
1064 | __(movq %arg_y,%imm1) |
---|
1065 | __(shrq $charcode_shift,%imm0) |
---|
1066 | __(shrq $1,%imm1) |
---|
1067 | __(movl %imm0_l,misc_data_offset(%arg_x,%imm1)) |
---|
1068 | __(ret) |
---|
1069 | local_label(misc_set_s16): |
---|
1070 | __(movq %arg_z,%imm0) |
---|
1071 | __(movq %arg_y,%imm1) |
---|
1072 | __(shlq $64-(16+fixnumshift),%imm0) |
---|
1073 | __(shrq $2,%imm1) |
---|
1074 | __(sarq $64-(16+fixnumshift),%imm0) |
---|
1075 | __(cmpq %arg_z,%imm0) |
---|
1076 | __(jne local_label(misc_set_bad)) |
---|
1077 | __(testb $fixnummask,%arg_z_b) |
---|
1078 | __(jne local_label(misc_set_bad)) |
---|
1079 | __(shrq $fixnumshift,%imm0) |
---|
1080 | __(movw %imm0_w,misc_data_offset(%arg_x,%imm1)) |
---|
1081 | __(ret) |
---|
1082 | local_label(misc_set_u16): |
---|
1083 | __(movq %arg_y,%imm1) |
---|
1084 | __(testq $~(0xffff<<fixnumshift),%arg_z) |
---|
1085 | __(jne local_label(misc_set_bad)) |
---|
1086 | __(shrq $2,%imm1) |
---|
1087 | __(unbox_fixnum(%arg_z,%imm0)) |
---|
1088 | __(movw %imm0_w,misc_data_offset(%arg_x,%imm1)) |
---|
1089 | __(ret) |
---|
1090 | local_label(misc_set_invalid): |
---|
1091 | __(push $XSETBADVEC) |
---|
1092 | __(set_nargs(4)) |
---|
1093 | __(jmp _SPksignalerr) |
---|
1094 | _endfn(C(misc_set_common)) |
---|
1095 | |
---|
1096 | /* ret1valn returns "1 multiple value" when a called function does not */ |
---|
1097 | /* return multiple values. Its presence on the stack (as a return address) */ |
---|
1098 | /* identifies the stack frame to code which returns multiple values. */ |
---|
1099 | |
---|
1100 | _spentry(Fret1valn) |
---|
1101 | .globl C(ret1valn) |
---|
1102 | __(tra(C(ret1valn))) |
---|
1103 | __(movq (%rsp),%ra0) |
---|
1104 | __(movq %arg_z,(%rsp)) |
---|
1105 | __(set_nargs(1)) |
---|
1106 | __(jmpq *%ra0) |
---|
1107 | _endsubp(Fret1valn) |
---|
1108 | |
---|
1109 | |
---|
1110 | _spentry(nvalret) |
---|
1111 | .globl C(nvalret) |
---|
1112 | C(nvalret): |
---|
1113 | __(ref_global(ret1val_addr,%temp1)) |
---|
1114 | __(cmpq lisp_frame.savera0(%rbp),%temp1) |
---|
1115 | __(je 1f) |
---|
1116 | __(testl %nargs,%nargs) |
---|
1117 | __(movl $nil_value,%arg_z_l) |
---|
1118 | __(cmovneq -node_size(%rsp,%nargs_q),%arg_z) |
---|
1119 | __(leaveq) |
---|
1120 | __(ret) |
---|
1121 | |
---|
1122 | |
---|
1123 | /* actually need to return values ; always need to copy */ |
---|
1124 | 1: __(leaq 2*node_size(%rbp),%imm1) |
---|
1125 | __(movq (%imm1),%ra0) |
---|
1126 | __(addq $node_size,%imm1) |
---|
1127 | __(movq 0(%rbp),%rbp) |
---|
1128 | __(leaq (%rsp,%nargs_q),%temp0) |
---|
1129 | __(xorl %imm0_l,%imm0_l) |
---|
1130 | __(jmp 3f) |
---|
1131 | 2: __(movq -node_size(%temp0),%temp1) |
---|
1132 | __(subq $node_size,%temp0) |
---|
1133 | __(addl $node_size,%imm0_l) |
---|
1134 | __(movq %temp1,-node_size(%imm1)) |
---|
1135 | __(subq $node_size,%imm1) |
---|
1136 | 3: __(cmpl %imm0_l,%nargs) ; |
---|
1137 | __(jne 2b) |
---|
1138 | __(movq %imm1,%rsp) |
---|
1139 | __(jmp *%ra0) |
---|
1140 | _endsubp(nvalret) |
---|
1141 | |
---|
1142 | _spentry(jmpsym) |
---|
1143 | __(jump_fname()) |
---|
1144 | _endsubp(jmpsym) |
---|
1145 | |
---|
1146 | _spentry(jmpnfn) |
---|
1147 | __(movq %temp0,%fn) |
---|
1148 | __(jmp *%fn) |
---|
1149 | _endsubp(jmpnfn) |
---|
1150 | |
---|
1151 | _spentry(funcall) |
---|
1152 | __(do_funcall()) |
---|
1153 | _endsubp(funcall) |
---|
1154 | |
---|
1155 | _spentry(mkcatch1v) |
---|
1156 | __(nMake_Catch(0)) |
---|
1157 | __(ret) |
---|
1158 | _endsubp(mkcatch1v) |
---|
1159 | |
---|
1160 | _spentry(mkunwind) |
---|
1161 | __(movq $undefined,%arg_z) |
---|
1162 | __(Make_Catch(fixnumone)) |
---|
1163 | __(jmp *%ra0) |
---|
1164 | _endsubp(mkunwind) |
---|
1165 | |
---|
1166 | /* this takes a return address in %ra0; it's "new" in that it does the |
---|
1167 | double binding of *interrupt-level* out-of-line */ |
---|
1168 | _spentry(nmkunwind) |
---|
1169 | __(movq rcontext(tcr.tlb_pointer),%arg_x) |
---|
1170 | __(movq INTERRUPT_LEVEL_BINDING_INDEX(%arg_x),%arg_y) |
---|
1171 | __(push %arg_y) |
---|
1172 | __(push $INTERRUPT_LEVEL_BINDING_INDEX) |
---|
1173 | __(push rcontext(tcr.db_link)) |
---|
1174 | __(movq %rsp,rcontext(tcr.db_link)) |
---|
1175 | __(movq $-1<<fixnumshift,INTERRUPT_LEVEL_BINDING_INDEX(%arg_x)) |
---|
1176 | __(movq $undefined,%arg_z) |
---|
1177 | __(Make_Catch(fixnumone)) |
---|
1178 | __(movq %arg_y,%arg_z) |
---|
1179 | __(jmp _SPbind_interrupt_level) |
---|
1180 | _endsubp(nmkunwind) |
---|
1181 | |
---|
1182 | _spentry(mkcatchmv) |
---|
1183 | __(nMake_Catch(fixnumone)) |
---|
1184 | __(ret) |
---|
1185 | _endsubp(mkcatchmv) |
---|
1186 | |
---|
1187 | _spentry(throw) |
---|
1188 | __(movq rcontext(tcr.catch_top),%imm1) |
---|
1189 | __(xorl %imm0_l,%imm0_l) |
---|
1190 | __(movq (%rsp,%nargs_q),%temp0) /* temp0 = tag */ |
---|
1191 | __(jmp local_label(_throw_test)) |
---|
1192 | local_label(_throw_loop): |
---|
1193 | __(cmpq %temp0,catch_frame.catch_tag(%imm1)) |
---|
1194 | __(je local_label(_throw_found)) |
---|
1195 | __(movq catch_frame.link(%imm1),%imm1) |
---|
1196 | __(addq $fixnum_one,%imm0) |
---|
1197 | local_label(_throw_test): |
---|
1198 | __(testq %imm1,%imm1) |
---|
1199 | __(jne local_label(_throw_loop)) |
---|
1200 | __(push %ra0) |
---|
1201 | __(uuo_error_reg_not_tag(Rtemp0,subtag_catch_frame)) |
---|
1202 | __(pop %ra0) |
---|
1203 | __(jmp _SPthrow) |
---|
1204 | local_label(_throw_found): |
---|
1205 | __(testb $fulltagmask,catch_frame.mvflag(%imm1)) |
---|
1206 | __(jne local_label(_throw_multiple)) |
---|
1207 | __(testl %nargs,%nargs) |
---|
1208 | __(movl $nil_value,%arg_z_l) |
---|
1209 | __(je local_label(_throw_one_value)) |
---|
1210 | __(movq -node_size(%rsp,%nargs_q),%arg_z) |
---|
1211 | __(add %nargs_q,%rsp) |
---|
1212 | local_label(_throw_one_value): |
---|
1213 | __(lea local_label(_threw_one_value)(%rip),%ra0) |
---|
1214 | __(jmp _SPnthrow1value) |
---|
1215 | __(tra(local_label(_threw_one_value))) |
---|
1216 | __(movq rcontext(tcr.catch_top),%temp0) |
---|
1217 | __(movq catch_frame.db_link(%temp0),%imm0) |
---|
1218 | __(movq rcontext(tcr.db_link),%imm1) |
---|
1219 | __(cmpq %imm0,%imm1) |
---|
1220 | __(jz local_label(_threw_one_value_dont_unbind)) |
---|
1221 | __(lea local_label(_threw_one_value_dont_unbind)(%rip),%ra0) |
---|
1222 | __(push %ra0) |
---|
1223 | __(jmp _SPunbind_to) |
---|
1224 | __(tra(local_label(_threw_one_value_dont_unbind))) |
---|
1225 | __(movq catch_frame.rbp(%temp0),%rbp) |
---|
1226 | __(movq catch_frame.foreign_sp(%temp0),%imm0) |
---|
1227 | __(movq catch_frame.xframe(%temp0),%imm1) |
---|
1228 | __(movq %imm0,rcontext(tcr.foreign_sp)) |
---|
1229 | __(movq %imm1,rcontext(tcr.xframe)) |
---|
1230 | __(movq catch_frame.rsp(%temp0),%rsp) |
---|
1231 | __(movq catch_frame.link(%temp0),%imm1) |
---|
1232 | __(movq catch_frame._save0(%temp0),%save0) |
---|
1233 | __(movq catch_frame._save1(%temp0),%save1) |
---|
1234 | __(movq catch_frame._save2(%temp0),%save2) |
---|
1235 | __ifndef([WINDOWS]) |
---|
1236 | __(movq catch_frame._save3(%temp0),%save3) |
---|
1237 | __endif |
---|
1238 | __(movq %imm1,rcontext(tcr.catch_top)) |
---|
1239 | __(movq catch_frame.pc(%temp0),%ra0) |
---|
1240 | __(lea -(tsp_frame.fixed_overhead+fulltag_misc)(%temp0),%imm1) |
---|
1241 | __(movq (%imm1),%imm1) |
---|
1242 | __(movq %imm1,rcontext(tcr.save_tsp)) |
---|
1243 | __(movq %imm1,rcontext(tcr.next_tsp)) |
---|
1244 | __(jmp *%ra0) |
---|
1245 | local_label(_throw_multiple): |
---|
1246 | __(lea local_label(_threw_multiple)(%rip),%ra0) |
---|
1247 | __(jmp _SPnthrowvalues) |
---|
1248 | __(tra(local_label(_threw_multiple))) |
---|
1249 | __(movq rcontext(tcr.catch_top),%temp0) |
---|
1250 | __(movq catch_frame.db_link(%temp0),%imm0) |
---|
1251 | __(movq rcontext(tcr.db_link),%imm1) |
---|
1252 | __(cmpq %imm0,%imm1) |
---|
1253 | __(je local_label(_threw_multiple_dont_unbind)) |
---|
1254 | __(leaq local_label(_threw_multiple_dont_unbind)(%rip),%ra0) |
---|
1255 | __(push %ra0) |
---|
1256 | __(jmp _SPunbind_to) |
---|
1257 | __(tra(local_label(_threw_multiple_dont_unbind))) |
---|
1258 | /* Copy multiple values from the current %rsp to the target %rsp */ |
---|
1259 | __(lea (%rsp,%nargs_q),%imm0) |
---|
1260 | __(movq catch_frame.rsp(%temp0),%imm1) |
---|
1261 | __(jmp local_label(_threw_multiple_push_test)) |
---|
1262 | local_label(_threw_multiple_push_loop): |
---|
1263 | __(subq $node_size,%imm0) |
---|
1264 | __(subq $node_size,%imm1) |
---|
1265 | __(movq (%imm0),%arg_z) |
---|
1266 | __(movq %arg_z,(%imm1)) |
---|
1267 | local_label(_threw_multiple_push_test): |
---|
1268 | __(cmpq %imm0,%rsp) |
---|
1269 | __(jne local_label(_threw_multiple_push_loop)) |
---|
1270 | /* target %rsp is now in %imm1 */ |
---|
1271 | __(movq catch_frame.rbp(%temp0),%rbp) |
---|
1272 | __(movq catch_frame.foreign_sp(%temp0),%imm0) |
---|
1273 | __(movq %imm0,rcontext(tcr.foreign_sp)) |
---|
1274 | __(movq catch_frame.xframe(%temp0),%imm0) |
---|
1275 | __(movq %imm0,rcontext(tcr.xframe)) |
---|
1276 | __(movq %imm1,%rsp) |
---|
1277 | __(movq catch_frame.link(%temp0),%imm1) |
---|
1278 | __(movq catch_frame._save0(%temp0),%save0) |
---|
1279 | __(movq catch_frame._save1(%temp0),%save1) |
---|
1280 | __(movq catch_frame._save2(%temp0),%save2) |
---|
1281 | __ifndef([WINDOWS]) |
---|
1282 | __(movq catch_frame._save3(%temp0),%save3) |
---|
1283 | __endif |
---|
1284 | __(movq %imm1,rcontext(tcr.catch_top)) |
---|
1285 | __(movq catch_frame.pc(%temp0),%ra0) |
---|
1286 | __(lea -(tsp_frame.fixed_overhead+fulltag_misc)(%temp0),%imm1) |
---|
1287 | __(movq (%imm1),%imm1) |
---|
1288 | __(movq %imm1,rcontext(tcr.save_tsp)) |
---|
1289 | __(movq %imm1,rcontext(tcr.next_tsp)) |
---|
1290 | __(jmp *%ra0) |
---|
1291 | _endsubp(throw) |
---|
1292 | |
---|
1293 | /* This takes N multiple values atop the vstack. */ |
---|
1294 | _spentry(nthrowvalues) |
---|
1295 | __(movb $1,rcontext(tcr.unwinding)) |
---|
1296 | local_label(_nthrowv_nextframe): |
---|
1297 | __(subq $fixnumone,%imm0) |
---|
1298 | __(js local_label(_nthrowv_done)) |
---|
1299 | __(movd %imm0,%mm1) |
---|
1300 | __(movq rcontext(tcr.catch_top),%temp0) |
---|
1301 | __(movq catch_frame.link(%temp0),%imm1) |
---|
1302 | __(movq catch_frame.db_link(%temp0),%imm0) |
---|
1303 | __(movq %imm1,rcontext(tcr.catch_top)) |
---|
1304 | __(cmpq %imm0,rcontext(tcr.db_link)) |
---|
1305 | __(jz local_label(_nthrowv_dont_unbind)) |
---|
1306 | __(push %ra0) |
---|
1307 | __(leaq local_label(_nthrowv_back_from_unbind)(%rip),%ra0) |
---|
1308 | __(push %ra0) |
---|
1309 | __(jmp _SPunbind_to) |
---|
1310 | __(tra(local_label(_nthrowv_back_from_unbind))) |
---|
1311 | |
---|
1312 | __(pop %ra0) |
---|
1313 | local_label(_nthrowv_dont_unbind): |
---|
1314 | __(cmpb $unbound_marker,catch_frame.catch_tag(%temp0)) |
---|
1315 | __(je local_label(_nthrowv_do_unwind)) |
---|
1316 | /* A catch frame. If the last one, restore context from there. */ |
---|
1317 | __(movd %mm1,%imm0) |
---|
1318 | __(testq %imm0,%imm0) /* last catch frame ? */ |
---|
1319 | __(jne local_label(_nthrowv_skip)) |
---|
1320 | __(movq catch_frame.xframe(%temp0),%save0) |
---|
1321 | __(movq %save0,rcontext(tcr.xframe)) |
---|
1322 | __(leaq (%rsp,%nargs_q),%save1) |
---|
1323 | __(movq catch_frame.rsp(%temp0),%save2) |
---|
1324 | __(movq %nargs_q,%save0) |
---|
1325 | __(jmp local_label(_nthrowv_push_test)) |
---|
1326 | local_label(_nthrowv_push_loop): |
---|
1327 | __(subq $node_size,%save1) |
---|
1328 | __(subq $node_size,%save2) |
---|
1329 | __(movq (%save1),%temp1) |
---|
1330 | __(movq %temp1,(%save2)) |
---|
1331 | local_label(_nthrowv_push_test): |
---|
1332 | __(subq $node_size,%save0) |
---|
1333 | __(jns local_label(_nthrowv_push_loop)) |
---|
1334 | __(movq catch_frame.xframe(%temp0),%save0) |
---|
1335 | __(movq %save0,rcontext(tcr.xframe)) |
---|
1336 | __(movq %save2,%rsp) |
---|
1337 | __(movq catch_frame.rbp(%temp0),%rbp) |
---|
1338 | __ifndef([WINDOWS]) |
---|
1339 | __(movq catch_frame._save3(%temp0),%save3) |
---|
1340 | __endif |
---|
1341 | __(movq catch_frame._save2(%temp0),%save2) |
---|
1342 | __(movq catch_frame._save1(%temp0),%save1) |
---|
1343 | __(movq catch_frame._save0(%temp0),%save0) |
---|
1344 | __(movq catch_frame.foreign_sp(%temp0),%stack_temp) |
---|
1345 | __(movq %stack_temp,rcontext(tcr.foreign_sp)) |
---|
1346 | local_label(_nthrowv_skip): |
---|
1347 | __(movq -(tsp_frame.fixed_overhead+fulltag_misc)(%temp0),%imm1) |
---|
1348 | __(movq %imm1,rcontext(tcr.save_tsp)) |
---|
1349 | __(movq %imm1,rcontext(tcr.next_tsp)) |
---|
1350 | __(movd %mm1,%imm0) |
---|
1351 | __(jmp local_label(_nthrowv_nextframe)) |
---|
1352 | local_label(_nthrowv_do_unwind): |
---|
1353 | /* This is harder. Call the cleanup code with the multiple values and */ |
---|
1354 | /* nargs, the throw count, and the caller's return address in a temp */ |
---|
1355 | /* stack frame. */ |
---|
1356 | __(leaq (%rsp,%nargs_q),%save1) |
---|
1357 | __(push catch_frame._save0(%temp0)) |
---|
1358 | __(push catch_frame._save1(%temp0)) |
---|
1359 | __(push catch_frame._save2(%temp0)) |
---|
1360 | __ifndef([WINDOWS]) |
---|
1361 | __(push catch_frame._save3(%temp0)) |
---|
1362 | __endif |
---|
1363 | __(push catch_frame.pc(%temp0)) |
---|
1364 | __(movq catch_frame.rbp(%temp0),%rbp) |
---|
1365 | __(movq catch_frame.xframe(%temp0),%stack_temp) |
---|
1366 | __(movq catch_frame.rsp(%temp0),%arg_x) |
---|
1367 | __(movq %stack_temp,rcontext(tcr.xframe)) |
---|
1368 | __(movq catch_frame.foreign_sp(%temp0),%stack_temp) |
---|
1369 | __(movq %stack_temp,rcontext(tcr.foreign_sp)) |
---|
1370 | /* Discard the catch frame, so we can build a temp frame */ |
---|
1371 | __(movq -(tsp_frame.fixed_overhead+fulltag_misc)(%temp0),%imm1) |
---|
1372 | __(movq %imm1,rcontext(tcr.save_tsp)) |
---|
1373 | __(movq %imm1,rcontext(tcr.next_tsp)) |
---|
1374 | /* tsp overhead, nargs, throw count, ra0 */ |
---|
1375 | __(dnode_align(%nargs_q,(tsp_frame.fixed_overhead+(3*node_size)),%imm0)) |
---|
1376 | __(TSP_Alloc_Var(%imm0,%imm1)) |
---|
1377 | |
---|
1378 | __(movq %nargs_q,(%imm1)) |
---|
1379 | __(movq %ra0,node_size(%imm1)) |
---|
1380 | __(movq %mm1,node_size*2(%imm1)) |
---|
1381 | __(leaq node_size*3(%imm1),%imm1) |
---|
1382 | __(jmp local_label(_nthrowv_tpushtest)) |
---|
1383 | local_label(_nthrowv_tpushloop): |
---|
1384 | __(movq -node_size(%save1),%temp0) |
---|
1385 | __(subq $node_size,%save1) |
---|
1386 | __(movq %temp0,(%imm1)) |
---|
1387 | __(addq $node_size,%imm1) |
---|
1388 | local_label(_nthrowv_tpushtest): |
---|
1389 | __(subl $node_size,%nargs) |
---|
1390 | __(jns local_label(_nthrowv_tpushloop)) |
---|
1391 | __(pop %xfn) |
---|
1392 | __ifndef([WINDOWS]) |
---|
1393 | __(pop %save3) |
---|
1394 | __endif |
---|
1395 | __(pop %save2) |
---|
1396 | __(pop %save1) |
---|
1397 | __(pop %save0) |
---|
1398 | __(movq %arg_x,%rsp) |
---|
1399 | /* Ready to call cleanup code. set up tra, jmp to %xfn */ |
---|
1400 | __(leaq local_label(_nthrowv_called_cleanup)(%rip),%ra0) |
---|
1401 | __(push %ra0) |
---|
1402 | __(movb $0,rcontext(tcr.unwinding)) |
---|
1403 | __(jmp *%xfn) |
---|
1404 | __(tra(local_label(_nthrowv_called_cleanup))) |
---|
1405 | |
---|
1406 | __(movb $1,rcontext(tcr.unwinding)) |
---|
1407 | __(movq rcontext(tcr.save_tsp),%imm1) |
---|
1408 | __(movq tsp_frame.data_offset+(0*node_size)(%imm1),%nargs_q) |
---|
1409 | __(movq tsp_frame.data_offset+(1*node_size)(%imm1),%ra0) |
---|
1410 | __(movq tsp_frame.data_offset+(2*node_size)(%imm1),%mm1) |
---|
1411 | __(movq %nargs_q,%imm0) |
---|
1412 | __(addq $tsp_frame.fixed_overhead+(node_size*3),%imm1) |
---|
1413 | __(jmp local_label(_nthrowv_tpoptest)) |
---|
1414 | local_label(_nthrowv_tpoploop): |
---|
1415 | __(push (%imm1)) |
---|
1416 | __(addq $node_size,%imm1) |
---|
1417 | local_label(_nthrowv_tpoptest): |
---|
1418 | __(subq $node_size,%imm0) |
---|
1419 | __(jns local_label(_nthrowv_tpoploop)) |
---|
1420 | __(movq rcontext(tcr.save_tsp),%imm1) |
---|
1421 | __(movq (%imm1),%imm1) |
---|
1422 | __(movq %imm1,rcontext(tcr.save_tsp)) |
---|
1423 | __(movq %imm1,rcontext(tcr.next_tsp)) |
---|
1424 | __(movd %mm1,%imm0) |
---|
1425 | __(jmp local_label(_nthrowv_nextframe)) |
---|
1426 | local_label(_nthrowv_done): |
---|
1427 | __(movb $0,rcontext(tcr.unwinding)) |
---|
1428 | __(check_pending_interrupt(%imm0)) |
---|
1429 | local_label(_nthrowv_return): |
---|
1430 | __(jmp *%ra0) |
---|
1431 | _endsubp(nthrowvalues) |
---|
1432 | |
---|
1433 | /* This is a (slight) optimization. When running an unwind-protect, */ |
---|
1434 | /* save the single value and the throw count in the tstack frame. */ |
---|
1435 | /* Note that this takes a single value in arg_z. */ |
---|
1436 | |
---|
1437 | _spentry(nthrow1value) |
---|
1438 | __(movb $1,rcontext(tcr.unwinding)) |
---|
1439 | local_label(_nthrow1v_nextframe): |
---|
1440 | __(subq $fixnumone,%imm0) |
---|
1441 | __(js local_label(_nthrow1v_done)) |
---|
1442 | __(movd %imm0,%mm1) |
---|
1443 | __(movq rcontext(tcr.catch_top),%temp0) |
---|
1444 | __(movq catch_frame.link(%temp0),%imm1) |
---|
1445 | __(movq catch_frame.db_link(%temp0),%imm0) |
---|
1446 | __(movq %imm1,rcontext(tcr.catch_top)) |
---|
1447 | __(cmpq %imm0,rcontext(tcr.db_link)) |
---|
1448 | __(jz local_label(_nthrow1v_dont_unbind)) |
---|
1449 | __(push %ra0) |
---|
1450 | __(leaq local_label(_nthrow1v_back_from_unbind)(%rip),%ra0) |
---|
1451 | __(push %ra0) |
---|
1452 | __(jmp _SPunbind_to) |
---|
1453 | __(tra(local_label(_nthrow1v_back_from_unbind))) |
---|
1454 | |
---|
1455 | __(pop %ra0) |
---|
1456 | local_label(_nthrow1v_dont_unbind): |
---|
1457 | __(cmpb $unbound_marker,catch_frame.catch_tag(%temp0)) |
---|
1458 | __(je local_label(_nthrow1v_do_unwind)) |
---|
1459 | /* A catch frame. If the last one, restore context from there. */ |
---|
1460 | __(movd %mm1,%imm0) |
---|
1461 | __(testq %imm0,%imm0) /* last catch frame ? */ |
---|
1462 | __(jne local_label(_nthrow1v_skip)) |
---|
1463 | __(movq catch_frame.xframe(%temp0),%save0) |
---|
1464 | __(movq %save0,rcontext(tcr.xframe)) |
---|
1465 | __(leaq (%rsp,%nargs_q),%save1) |
---|
1466 | __(movq catch_frame.xframe(%temp0),%save0) |
---|
1467 | __(movq %save0,rcontext(tcr.xframe)) |
---|
1468 | __(movq catch_frame.rsp(%temp0),%rsp) |
---|
1469 | __(movq catch_frame.rbp(%temp0),%rbp) |
---|
1470 | __ifndef([WINDOWS]) |
---|
1471 | __(movq catch_frame._save3(%temp0),%save3) |
---|
1472 | __endif |
---|
1473 | __(movq catch_frame._save2(%temp0),%save2) |
---|
1474 | __(movq catch_frame._save1(%temp0),%save1) |
---|
1475 | __(movq catch_frame._save0(%temp0),%save0) |
---|
1476 | __(movq catch_frame.foreign_sp(%temp0),%stack_temp) |
---|
1477 | __(movq %stack_temp,rcontext(tcr.foreign_sp)) |
---|
1478 | local_label(_nthrow1v_skip): |
---|
1479 | __(movq -(tsp_frame.fixed_overhead+fulltag_misc)(%temp0),%imm1) |
---|
1480 | __(movq %imm1,rcontext(tcr.save_tsp)) |
---|
1481 | __(movq %imm1,rcontext(tcr.next_tsp)) |
---|
1482 | __(movd %mm1,%imm0) |
---|
1483 | __(jmp local_label(_nthrow1v_nextframe)) |
---|
1484 | local_label(_nthrow1v_do_unwind): |
---|
1485 | |
---|
1486 | /* This is harder, but not as hard (not as much BLTing) as the */ |
---|
1487 | /* multiple-value case. */ |
---|
1488 | |
---|
1489 | __(movq catch_frame.xframe(%temp0),%save0) |
---|
1490 | __(movq %save0,rcontext(tcr.xframe)) |
---|
1491 | __(movq catch_frame._save0(%temp0),%save0) |
---|
1492 | __(movq catch_frame._save1(%temp0),%save1) |
---|
1493 | __(movq catch_frame._save2(%temp0),%save2) |
---|
1494 | __ifndef([WINDOWS]) |
---|
1495 | __(movq catch_frame._save3(%temp0),%save3) |
---|
1496 | __endif |
---|
1497 | __(movq catch_frame.pc(%temp0),%xfn) |
---|
1498 | __(movq catch_frame.rbp(%temp0),%rbp) |
---|
1499 | __(movq catch_frame.rsp(%temp0),%rsp) |
---|
1500 | __(movq catch_frame.foreign_sp(%temp0),%stack_temp) |
---|
1501 | __(movq %stack_temp,rcontext(tcr.foreign_sp)) |
---|
1502 | /* Discard the catch frame, so we can build a temp frame */ |
---|
1503 | __(movq -(tsp_frame.fixed_overhead+fulltag_misc)(%temp0),%imm1) |
---|
1504 | __(movq %imm1,rcontext(tcr.save_tsp)) |
---|
1505 | __(movq %imm1,rcontext(tcr.next_tsp)) |
---|
1506 | __(TSP_Alloc_Fixed((3*node_size),%imm1)) |
---|
1507 | __(addq $tsp_frame.fixed_overhead,%imm1) |
---|
1508 | __(movq %ra0,(%imm1)) |
---|
1509 | __(movq %mm1,node_size*1(%imm1)) |
---|
1510 | __(movq %arg_z,node_size*2(%imm1)) |
---|
1511 | /* Ready to call cleanup code. set up tra, jmp to %xfn */ |
---|
1512 | __(leaq local_label(_nthrow1v_called_cleanup)(%rip),%ra0) |
---|
1513 | __(movb $0,rcontext(tcr.unwinding)) |
---|
1514 | __(push %ra0) |
---|
1515 | __(jmp *%xfn) |
---|
1516 | __(tra(local_label(_nthrow1v_called_cleanup))) |
---|
1517 | |
---|
1518 | __(movb $1,rcontext(tcr.unwinding)) |
---|
1519 | __(movq rcontext(tcr.save_tsp),%imm1) |
---|
1520 | __(movq tsp_frame.data_offset+(0*node_size)(%imm1),%ra0) |
---|
1521 | __(movq tsp_frame.data_offset+(1*node_size)(%imm1),%mm1) |
---|
1522 | __(movq tsp_frame.data_offset+(2*node_size)(%imm1),%arg_z) |
---|
1523 | |
---|
1524 | __(movq (%imm1),%imm1) |
---|
1525 | __(movq %imm1,rcontext(tcr.save_tsp)) |
---|
1526 | __(movq %imm1,rcontext(tcr.next_tsp)) |
---|
1527 | __(movd %mm1,%imm0) |
---|
1528 | __(jmp local_label(_nthrow1v_nextframe)) |
---|
1529 | local_label(_nthrow1v_done): |
---|
1530 | __(movb $0,rcontext(tcr.unwinding)) |
---|
1531 | __(check_pending_interrupt(%imm0)) |
---|
1532 | local_label(_nthrow1v_return): |
---|
1533 | __(jmp *%ra0) |
---|
1534 | _endsubp(nthrow1value) |
---|
1535 | |
---|
1536 | /* This never affects the symbol's vcell */ |
---|
1537 | /* Non-null symbol in arg_y, new value in arg_z */ |
---|
1538 | |
---|
1539 | _spentry(bind) |
---|
1540 | __(movq symbol.binding_index(%arg_y),%temp0) |
---|
1541 | __(cmpq rcontext(tcr.tlb_limit),%temp0) |
---|
1542 | __(jb,pt 0f) |
---|
1543 | __(push %temp0) |
---|
1544 | __(tlb_too_small()) |
---|
1545 | 0: __(testq %temp0,%temp0) |
---|
1546 | __(jz 9f) |
---|
1547 | __(movq rcontext(tcr.tlb_pointer),%temp1) |
---|
1548 | __(push (%temp1,%temp0)) |
---|
1549 | __(push %temp0) |
---|
1550 | __(push rcontext(tcr.db_link)) |
---|
1551 | __(movq %rsp,rcontext(tcr.db_link)) |
---|
1552 | __(movq %arg_z,(%temp1,%temp0)) |
---|
1553 | __(jmp *%ra0) |
---|
1554 | 9: |
---|
1555 | __(movq %arg_y,%arg_z) |
---|
1556 | __(movq $XSYMNOBIND,%arg_y) |
---|
1557 | __(set_nargs(2)) |
---|
1558 | __(push %ra0) |
---|
1559 | __(jmp _SPksignalerr) |
---|
1560 | _endsubp(bind) |
---|
1561 | |
---|
1562 | /* arg_z = symbol: bind it to its current value */ |
---|
1563 | |
---|
1564 | _spentry(bind_self) |
---|
1565 | __(movq symbol.binding_index(%arg_z),%temp0) |
---|
1566 | __(cmpq rcontext(tcr.tlb_limit),%temp0) |
---|
1567 | __(jb,pt 0f) |
---|
1568 | __(push %temp0) |
---|
1569 | __(tlb_too_small()) |
---|
1570 | 0: __(testq %temp0,%temp0) |
---|
1571 | __(jz 9f) |
---|
1572 | __(movq rcontext(tcr.tlb_pointer),%temp1) |
---|
1573 | __(cmpb $no_thread_local_binding_marker,(%temp0,%temp1)) |
---|
1574 | __(jz 2f) |
---|
1575 | __(push (%temp1,%temp0)) |
---|
1576 | __(push %temp0) |
---|
1577 | __(push rcontext(tcr.db_link)) |
---|
1578 | __(movq %rsp,rcontext(tcr.db_link)) |
---|
1579 | __(jmp *%ra0) |
---|
1580 | 2: __(movq symbol.vcell(%arg_z),%arg_y) |
---|
1581 | __(push (%temp1,%temp0)) |
---|
1582 | __(push %temp0) |
---|
1583 | __(push rcontext(tcr.db_link)) |
---|
1584 | __(movq %arg_y,(%temp1,%temp0)) |
---|
1585 | __(movq %rsp,rcontext(tcr.db_link)) |
---|
1586 | __(jmp *%ra0) |
---|
1587 | 9: __(movq $XSYMNOBIND,%arg_y) |
---|
1588 | __(set_nargs(2)) |
---|
1589 | __(push %ra0) |
---|
1590 | __(jmp _SPksignalerr) |
---|
1591 | _endsubp(bind_self) |
---|
1592 | |
---|
1593 | _spentry(bind_nil) |
---|
1594 | __(movq symbol.binding_index(%arg_z),%temp0) |
---|
1595 | __(cmpq rcontext(tcr.tlb_limit),%temp0) |
---|
1596 | __(jb,pt 0f) |
---|
1597 | __(push %temp0) |
---|
1598 | __(tlb_too_small()) |
---|
1599 | 0: __(testq %temp0,%temp0) |
---|
1600 | __(jz 9f) |
---|
1601 | __(movq rcontext(tcr.tlb_pointer),%temp1) |
---|
1602 | __(push (%temp1,%temp0)) |
---|
1603 | __(push %temp0) |
---|
1604 | __(push rcontext(tcr.db_link)) |
---|
1605 | __(movq %rsp,rcontext(tcr.db_link)) |
---|
1606 | __(movq $nil_value,(%temp1,%temp0)) |
---|
1607 | __(jmp *%ra0) |
---|
1608 | 9: __(movq $XSYMNOBIND,%arg_y) |
---|
1609 | __(set_nargs(2)) |
---|
1610 | __(push %ra0) |
---|
1611 | __(jmp _SPksignalerr) |
---|
1612 | _endsubp(bind_nil) |
---|
1613 | |
---|
1614 | _spentry(bind_self_boundp_check) |
---|
1615 | __(movq symbol.binding_index(%arg_z),%temp0) |
---|
1616 | __(cmpq rcontext(tcr.tlb_limit),%temp0) |
---|
1617 | __(jb,pt 0f) |
---|
1618 | __(push %temp0) |
---|
1619 | __(tlb_too_small()) |
---|
1620 | 0: __(testq %temp0,%temp0) |
---|
1621 | __(jz 9f) |
---|
1622 | __(movq rcontext(tcr.tlb_pointer),%temp1) |
---|
1623 | __(cmpb $no_thread_local_binding_marker,(%temp1,%temp0)) |
---|
1624 | __(je 2f) |
---|
1625 | __(cmpb $unbound_marker,(%temp1,%temp0)) |
---|
1626 | __(je 8f) |
---|
1627 | __(push (%temp1,%temp0)) |
---|
1628 | __(push %temp0) |
---|
1629 | __(push rcontext(tcr.db_link)) |
---|
1630 | __(movq %rsp,rcontext(tcr.db_link)) |
---|
1631 | __(jmp *%ra0) |
---|
1632 | 2: __(movq symbol.vcell(%arg_z),%arg_y) |
---|
1633 | __(cmpb $unbound_marker,%arg_y_b) |
---|
1634 | __(jz 8f) |
---|
1635 | __(push (%temp1,%temp0)) |
---|
1636 | __(push %temp0) |
---|
1637 | __(push rcontext(tcr.db_link)) |
---|
1638 | __(movq %rsp,rcontext(tcr.db_link)) |
---|
1639 | __(movq %arg_y,(%temp1,%temp0)) |
---|
1640 | __(jmp *%ra0) |
---|
1641 | 8: __(push %ra0) |
---|
1642 | __(uuo_error_reg_unbound(Rarg_z)) |
---|
1643 | |
---|
1644 | 9: __(movq $XSYMNOBIND,%arg_y) |
---|
1645 | __(set_nargs(2)) |
---|
1646 | __(push %ra0) |
---|
1647 | __(jmp _SPksignalerr) |
---|
1648 | _endsubp(bind_self_boundp_check) |
---|
1649 | |
---|
1650 | _spentry(conslist) |
---|
1651 | __(movl $nil_value,%arg_z_l) |
---|
1652 | __(testl %nargs,%nargs) |
---|
1653 | __(jmp 2f) |
---|
1654 | 1: __(pop %arg_y) |
---|
1655 | __(Cons(%arg_y,%arg_z,%arg_z)) |
---|
1656 | __(subl $node_size,%nargs) |
---|
1657 | 2: __(jnz 1b) |
---|
1658 | __(jmp *%ra0) |
---|
1659 | _endsubp(conslist) |
---|
1660 | |
---|
1661 | /* do list*: last arg in arg_z, all others pushed, nargs set to #args pushed. */ |
---|
1662 | /* Cons, one cons cell at at time. Maybe optimize this later. */ |
---|
1663 | |
---|
1664 | _spentry(conslist_star) |
---|
1665 | __(testl %nargs,%nargs) |
---|
1666 | __(jmp 2f) |
---|
1667 | 1: __(pop %arg_y) |
---|
1668 | __(Cons(%arg_y,%arg_z,%arg_z)) |
---|
1669 | __(subl $node_size,%nargs) |
---|
1670 | 2: __(jnz 1b) |
---|
1671 | __(jmp *%ra0) |
---|
1672 | _endsubp(conslist_star) |
---|
1673 | |
---|
1674 | /* We always have to create a tsp frame (even if nargs is 0), so the compiler */ |
---|
1675 | /* doesn't get confused. */ |
---|
1676 | _spentry(stkconslist) |
---|
1677 | __(movq %nargs_q,%imm1) |
---|
1678 | __(addq %imm1,%imm1) |
---|
1679 | __(movl $nil_value,%arg_z_l) |
---|
1680 | __(dnode_align(%imm1,tsp_frame.fixed_overhead,%imm1)) |
---|
1681 | __(TSP_Alloc_Var(%imm1,%imm0)) |
---|
1682 | __(addq $fulltag_cons,%imm0) |
---|
1683 | __(testl %nargs,%nargs) |
---|
1684 | __(jmp 2f) |
---|
1685 | 1: __(pop %temp0) |
---|
1686 | __(_rplaca(%imm0,%temp0)) |
---|
1687 | __(_rplacd(%imm0,%arg_z)) |
---|
1688 | __(movq %imm0,%arg_z) |
---|
1689 | __(add $cons.size,%imm0) |
---|
1690 | __(subl $node_size,%nargs) |
---|
1691 | 2: __(jne 1b) |
---|
1692 | __(jmp *%ra0) |
---|
1693 | _endsubp(stkconslist) |
---|
1694 | |
---|
1695 | /* do list*: last arg in arg_z, all others vpushed, */ |
---|
1696 | /* nargs set to #args vpushed. */ |
---|
1697 | |
---|
1698 | _spentry(stkconslist_star) |
---|
1699 | __(movq %nargs_q,%imm1) |
---|
1700 | __(addq %imm1,%imm1) |
---|
1701 | __(dnode_align(%imm1,tsp_frame.fixed_overhead,%imm1)) |
---|
1702 | __(TSP_Alloc_Var(%imm1,%imm0)) |
---|
1703 | __(addq $fulltag_cons,%imm0) |
---|
1704 | __(testl %nargs,%nargs) |
---|
1705 | __(jmp 2f) |
---|
1706 | 1: __(pop %temp0) |
---|
1707 | __(_rplaca(%imm0,%temp0)) |
---|
1708 | __(_rplacd(%imm0,%arg_z)) |
---|
1709 | __(movq %imm0,%arg_z) |
---|
1710 | __(addq $cons.size,%imm0) |
---|
1711 | __(subl $node_size,%nargs) |
---|
1712 | 2: __(jne 1b) |
---|
1713 | __(jmp *%ra0) |
---|
1714 | _endsubp(stkconslist_star) |
---|
1715 | |
---|
1716 | /* Make a stack-consed simple-vector out of the NARGS objects */ |
---|
1717 | /* on top of the vstack; return it in arg_z. */ |
---|
1718 | |
---|
1719 | _spentry(mkstackv) |
---|
1720 | __(dnode_align(%nargs_q,tsp_frame.fixed_overhead+node_size,%imm1)) |
---|
1721 | __(TSP_Alloc_Var(%imm1,%temp0)) |
---|
1722 | __(movl %nargs,%imm0_l) |
---|
1723 | __(shlq $(num_subtag_bits-fixnumshift),%imm0) |
---|
1724 | __(movb $subtag_simple_vector,%imm0_b) |
---|
1725 | __(movq %imm0,(%temp0)) |
---|
1726 | __(leaq fulltag_misc(%temp0),%arg_z) |
---|
1727 | __(testl %nargs,%nargs) |
---|
1728 | __(leaq misc_data_offset(%arg_z,%nargs_q),%imm1) |
---|
1729 | __(jmp 2f) |
---|
1730 | 1: __(pop -node_size(%imm1)) |
---|
1731 | __(subl $node_size,%nargs) |
---|
1732 | __(leaq -node_size(%imm1),%imm1) |
---|
1733 | 2: __(jne 1b) |
---|
1734 | __(jmp *%ra0) |
---|
1735 | _endsubp(mkstackv) |
---|
1736 | |
---|
1737 | |
---|
1738 | .globl C(egc_write_barrier_start) |
---|
1739 | C(egc_write_barrier_start): |
---|
1740 | /* */ |
---|
1741 | /* The function pc_luser_xp() - which is used to ensure that suspended threads */ |
---|
1742 | /* are suspended in a GC-safe way - has to treat these subprims (which implement */ |
---|
1743 | /* the EGC write-barrier) specially. Specifically, a store that might introduce */ |
---|
1744 | /* an intergenerational reference (a young pointer stored in an old object) has */ |
---|
1745 | /* to "memoize" that reference by setting a bit in the global "refbits" bitmap. */ |
---|
1746 | /* This has to happen atomically, and has to happen atomically wrt GC. */ |
---|
1747 | |
---|
1748 | /* Note that updating a word in a bitmap is itself not atomic, unless we use */ |
---|
1749 | /* interlocked loads and stores. */ |
---|
1750 | |
---|
1751 | |
---|
1752 | |
---|
1753 | /* For RPLACA and RPLACD, things are fairly simple: regardless of where we are */ |
---|
1754 | /* in the function, we can do the store (even if it's already been done) and */ |
---|
1755 | /* calculate whether or not we need to set the bit out-of-line. (Actually */ |
---|
1756 | /* setting the bit needs to be done atomically, unless we're sure that other */ |
---|
1757 | /* threads are suspended.) */ |
---|
1758 | /* We can unconditionally set the suspended thread's RIP to the return address. */ |
---|
1759 | |
---|
1760 | |
---|
1761 | _spentry(rplaca) |
---|
1762 | .globl C(egc_rplaca) |
---|
1763 | C(egc_rplaca): |
---|
1764 | __(rcmpq(%arg_z,%arg_y)) |
---|
1765 | __(_rplaca(%arg_y,%arg_z)) |
---|
1766 | __(ja 1f) |
---|
1767 | 0: __(repret) |
---|
1768 | 1: __(movq %arg_y,%imm0) |
---|
1769 | __(subq lisp_global(heap_start),%imm0) |
---|
1770 | __(shrq $dnode_shift,%imm0) |
---|
1771 | __(cmpq lisp_global(oldspace_dnode_count),%imm0) |
---|
1772 | __(jae 0b) |
---|
1773 | __(ref_global(refbits,%temp0)) |
---|
1774 | __(movq %imm0,%imm1) |
---|
1775 | __(andl $63,%imm0_l) |
---|
1776 | __(shrq $bitmap_shift,%imm1) |
---|
1777 | __(xorb $63,%imm0_b) |
---|
1778 | __(lock) |
---|
1779 | __(btsq %imm0,(%temp0,%imm1,8)) |
---|
1780 | __(ret) |
---|
1781 | _endsubp(rplaca) |
---|
1782 | |
---|
1783 | _spentry(rplacd) |
---|
1784 | .globl C(egc_rplacd) |
---|
1785 | C(egc_rplacd): |
---|
1786 | __(rcmpq(%arg_z,%arg_y)) |
---|
1787 | __(_rplacd(%arg_y,%arg_z)) |
---|
1788 | __(ja 1f) |
---|
1789 | 0: __(repret) |
---|
1790 | 1: __(movq %arg_y,%imm0) |
---|
1791 | __(subq lisp_global(heap_start),%imm0) |
---|
1792 | __(shrq $dnode_shift,%imm0) |
---|
1793 | __(cmpq lisp_global(oldspace_dnode_count),%imm0) |
---|
1794 | __(jae 0b) |
---|
1795 | __(ref_global(refbits,%temp0)) |
---|
1796 | __(movq %imm0,%imm1) |
---|
1797 | __(andl $63,%imm0_l) |
---|
1798 | __(shrq $bitmap_shift,%imm1) |
---|
1799 | __(xorb $63,%imm0_b) |
---|
1800 | __(lock) |
---|
1801 | __(btsq %imm0,(%temp0,%imm1,8)) |
---|
1802 | __(ret) |
---|
1803 | _endsubp(rplacd) |
---|
1804 | |
---|
1805 | /* Storing into a gvector can be handled the same way as storing into a CONS. */ |
---|
1806 | |
---|
1807 | |
---|
1808 | _spentry(gvset) |
---|
1809 | .globl C(egc_gvset) |
---|
1810 | C(egc_gvset): |
---|
1811 | __(rcmpq(%arg_z,%arg_x)) |
---|
1812 | __(movq %arg_z,misc_data_offset(%arg_x,%arg_y)) |
---|
1813 | __(ja 1f) |
---|
1814 | 0: __(repret) |
---|
1815 | 1: __(lea misc_data_offset(%arg_x,%arg_y),%imm0) |
---|
1816 | __(subq lisp_global(heap_start),%imm0) |
---|
1817 | __(shrq $dnode_shift,%imm0) |
---|
1818 | __(cmpq lisp_global(oldspace_dnode_count),%imm0) |
---|
1819 | __(jae 0b) |
---|
1820 | __(ref_global(refbits,%temp0)) |
---|
1821 | __(movq %imm0,%imm1) |
---|
1822 | __(andl $63,%imm0_l) |
---|
1823 | __(shrq $bitmap_shift,%imm1) |
---|
1824 | __(xorb $63,%imm0_b) |
---|
1825 | __(lock) |
---|
1826 | __(btsq %imm0,(%temp0,%imm1,8)) |
---|
1827 | __(ret) |
---|
1828 | _endsubp(gvset) |
---|
1829 | |
---|
1830 | /* This is a special case of storing into a gvector: if we need to */ |
---|
1831 | /* memoize the store, record the address of the hash-table vector */ |
---|
1832 | /* in the refmap, as well. */ |
---|
1833 | |
---|
1834 | |
---|
1835 | _spentry(set_hash_key) |
---|
1836 | .globl C(egc_set_hash_key) |
---|
1837 | C(egc_set_hash_key): |
---|
1838 | __(rcmpq(%arg_z,%arg_x)) |
---|
1839 | __(movq %arg_z,misc_data_offset(%arg_x,%arg_y)) |
---|
1840 | __(ja 1f) |
---|
1841 | 0: __(repret) |
---|
1842 | 1: __(lea misc_data_offset(%arg_x,%arg_y),%imm0) |
---|
1843 | __(subq lisp_global(heap_start),%imm0) |
---|
1844 | __(shrq $dnode_shift,%imm0) |
---|
1845 | __(cmpq lisp_global(oldspace_dnode_count),%imm0) |
---|
1846 | __(jae 0b) |
---|
1847 | __(ref_global(refbits,%temp0)) |
---|
1848 | __(movq %imm0,%imm1) |
---|
1849 | __(andl $63,%imm0_l) |
---|
1850 | __(shrq $bitmap_shift,%imm1) |
---|
1851 | __(xorb $63,%imm0_b) |
---|
1852 | __(lock) |
---|
1853 | __( btsq %imm0,(%temp0,%imm1,8)) |
---|
1854 | /* Now memoize the address of the hash vector */ |
---|
1855 | __(movq %arg_x,%imm0) |
---|
1856 | __(subq lisp_global(heap_start),%imm0) |
---|
1857 | __(shrq $dnode_shift,%imm0) |
---|
1858 | __(movq %imm0,%imm1) |
---|
1859 | __(andl $63,%imm0_l) |
---|
1860 | __(shrq $bitmap_shift,%imm1) |
---|
1861 | __(xorb $63,%imm0_b) |
---|
1862 | __(lock) |
---|
1863 | __(btsq %imm0,(%temp0,%imm1,8)) |
---|
1864 | __(ret) |
---|
1865 | _endsubp(set_hash_key) |
---|
1866 | |
---|
1867 | /* This is a little trickier: if this is interrupted, we need to know */ |
---|
1868 | /* whether or not the STORE-CONDITIONAL (cmpxchgq) has won or not. */ |
---|
1869 | /* If we're interrupted before the PC has reached the "success_test" label, */ |
---|
1870 | /* repeat (luser the PC back to .SPstore_node_conditional.) If we're at that */ |
---|
1871 | /* label with the Z flag set, we won and (may) need to memoize. */ |
---|
1872 | |
---|
1873 | _spentry(store_node_conditional) |
---|
1874 | .globl C(egc_store_node_conditional) |
---|
1875 | C(egc_store_node_conditional): |
---|
1876 | __(unbox_fixnum(%temp0,%imm1)) |
---|
1877 | 0: __(movq (%arg_x,%imm1),%temp1) |
---|
1878 | __(cmpq %arg_y,%temp1) |
---|
1879 | __(movq %temp1,%imm0) |
---|
1880 | __(jne 3f) |
---|
1881 | __(lock) |
---|
1882 | __(cmpxchgq %arg_z,(%arg_x,%imm1)) |
---|
1883 | .globl C(egc_store_node_conditional_success_test) |
---|
1884 | C(egc_store_node_conditional_success_test): |
---|
1885 | __(jne 0b) |
---|
1886 | __(lea (%arg_x,%imm1),%imm0) |
---|
1887 | __(subq lisp_global(heap_start),%imm0) |
---|
1888 | __(shrq $dnode_shift,%imm0) |
---|
1889 | __(cmpq lisp_global(oldspace_dnode_count),%imm0) |
---|
1890 | __(ref_global(refbits,%temp1)) |
---|
1891 | __(jae 2f) |
---|
1892 | __(movq %imm0,%imm1) |
---|
1893 | __(andl $63,%imm0_l) |
---|
1894 | __(shrq $bitmap_shift,%imm1) |
---|
1895 | __(xorb $63,%imm0_b) |
---|
1896 | __(lock) |
---|
1897 | __(btsq %imm0,(%temp1,%imm1,8)) |
---|
1898 | .globl C(egc_write_barrier_end) |
---|
1899 | C(egc_write_barrier_end): |
---|
1900 | 2: __(movl $t_value,%arg_z_l) |
---|
1901 | __(ret) |
---|
1902 | 3: __(movl $nil_value,%arg_z_l) |
---|
1903 | __(ret) |
---|
1904 | _endsubp(store_node_conditional) |
---|
1905 | |
---|
1906 | _spentry(setqsym) |
---|
1907 | __(btq $sym_vbit_const,symbol.flags(%arg_y)) |
---|
1908 | __(jae _SPspecset) |
---|
1909 | __(movq %arg_y,%arg_z) |
---|
1910 | __(movq $XCONST,%arg_y) |
---|
1911 | __(set_nargs(2)) |
---|
1912 | __(jmp _SPksignalerr) |
---|
1913 | _endsubp(setqsym) |
---|
1914 | |
---|
1915 | _spentry(progvsave) |
---|
1916 | /* Error if arg_z isn't a proper list. That's unlikely, */ |
---|
1917 | /* but it's better to check now than to crash later. */ |
---|
1918 | |
---|
1919 | __(compare_reg_to_nil(%arg_z)) |
---|
1920 | __(movq %arg_z,%arg_x) /* fast */ |
---|
1921 | __(movq %arg_z,%temp1) /* slow */ |
---|
1922 | __(je 9f) /* Null list is proper */ |
---|
1923 | 0: |
---|
1924 | __(extract_lisptag(%arg_x,%imm0)) |
---|
1925 | __(cmpb $tag_list,%imm0_b) |
---|
1926 | __(jne 8f) |
---|
1927 | __(compare_reg_to_nil(%arg_x)) |
---|
1928 | __(je 9f) |
---|
1929 | __(_cdr(%arg_x,%temp0)) /* (null (cdr fast)) ? */ |
---|
1930 | __(compare_reg_to_nil(%temp0)) |
---|
1931 | __(je 9f) |
---|
1932 | __(extract_lisptag(%temp0,%imm0)) |
---|
1933 | __(cmpb $tag_list,%imm0_b) |
---|
1934 | __(jne 8f) |
---|
1935 | __(_cdr(%temp0,%arg_x)) |
---|
1936 | __(_cdr(%temp1,%temp1)) |
---|
1937 | __(cmpq %temp1,%arg_x) |
---|
1938 | __(jne 0b) |
---|
1939 | |
---|
1940 | 8: __(movq $XIMPROPERLIST,%arg_y) |
---|
1941 | __(set_nargs(2)) |
---|
1942 | __(push %ra0) |
---|
1943 | __(jmp _SPksignalerr) |
---|
1944 | 9: /* Whew */ |
---|
1945 | |
---|
1946 | /* Next, determine the length of arg_y. We */ |
---|
1947 | /* know that it's a proper list. */ |
---|
1948 | __(movq $-fixnumone,%imm0) |
---|
1949 | __(movq %arg_y,%arg_x) |
---|
1950 | 1: __(compare_reg_to_nil(%arg_x)) |
---|
1951 | __(_cdr(%arg_x,%arg_x)) |
---|
1952 | __(leaq fixnumone(%imm0),%imm0) |
---|
1953 | __(jne 1b) |
---|
1954 | |
---|
1955 | /* imm0 is now (boxed) triplet count. */ |
---|
1956 | /* Determine word count, add 1 (to align), and make room. */ |
---|
1957 | /* if count is 0, make an empty tsp frame and exit */ |
---|
1958 | __(testq %imm0,%imm0) |
---|
1959 | __(jne 2f) |
---|
1960 | __(TSP_Alloc_Fixed(2*node_size,%imm0)) |
---|
1961 | __(ret) |
---|
1962 | 2: __(movq %imm0,%imm1) |
---|
1963 | __(add %imm1,%imm1) |
---|
1964 | __(add %imm0,%imm1) |
---|
1965 | __(dnode_align(%imm1,tsp_frame.fixed_overhead+node_size,%imm1)) |
---|
1966 | __(TSP_Alloc_Var(%imm1,%temp0)) |
---|
1967 | __(movq %imm0,(%temp0)) |
---|
1968 | __(movq rcontext(tcr.db_link),%temp1) |
---|
1969 | 3: __(movl $unbound_marker,%temp0_l) |
---|
1970 | __(compare_reg_to_nil(%arg_z)) |
---|
1971 | __(cmovneq cons.car(%arg_z),%temp0) |
---|
1972 | __(cmovneq cons.cdr(%arg_z),%arg_z) |
---|
1973 | __(_car(%arg_y,%arg_x)) |
---|
1974 | __(_cdr(%arg_y,%arg_y)) |
---|
1975 | __(movq symbol.binding_index(%arg_x),%arg_x) |
---|
1976 | __(cmp rcontext(tcr.tlb_limit),%arg_x) |
---|
1977 | __(jb,pt 4f) |
---|
1978 | __(push %arg_x) |
---|
1979 | __(tlb_too_small()) |
---|
1980 | 4: __(movq rcontext(tcr.tlb_pointer),%imm0) |
---|
1981 | __(subq $binding.size,%imm1) |
---|
1982 | __(compare_reg_to_nil(%arg_y)) |
---|
1983 | __(movq %arg_x,binding.sym(%imm1)) |
---|
1984 | __(push (%imm0,%arg_x)) |
---|
1985 | __(pop binding.val(%imm1)) |
---|
1986 | __(movq %temp0,(%imm0,%arg_x)) |
---|
1987 | __(movq %temp1,binding.link(%imm1)) |
---|
1988 | __(movq %imm1,%temp1) |
---|
1989 | __(jne 3b) |
---|
1990 | __(movq %temp1,rcontext(tcr.db_link)) |
---|
1991 | __(ret) |
---|
1992 | _endsubp(progvsave) |
---|
1993 | |
---|
1994 | /* Allocate node objects on the temp stack, immediate objects on the foreign */ |
---|
1995 | /* stack. (The caller has to know which stack to discard a frame from.) */ |
---|
1996 | /* %arg_y = boxed element-count, %arg_z = boxed subtype */ |
---|
1997 | |
---|
1998 | _spentry(stack_misc_alloc) |
---|
1999 | __(movq $~(((1<<56)-1)<<fixnumshift),%temp0) |
---|
2000 | __(testq %temp0,%arg_y) |
---|
2001 | __(jne local_label(stack_misc_alloc_not_u56)) |
---|
2002 | __(unbox_fixnum(%arg_z,%imm0)) |
---|
2003 | __(movq %arg_y,%temp0) |
---|
2004 | __(shl $num_subtag_bits-fixnumshift,%temp0) |
---|
2005 | __(orq %temp0,%imm0) /* %imm0 now = header */ |
---|
2006 | __(movb $fulltagmask,%imm1_b) |
---|
2007 | __(andb %imm0_b,%imm1_b) |
---|
2008 | __(cmpb $fulltag_nodeheader_0,%imm1_b) |
---|
2009 | __(je local_label(stack_misc_alloc_node)) |
---|
2010 | __(cmpb $fulltag_nodeheader_1,%imm1_b) |
---|
2011 | __(je local_label(stack_misc_alloc_node)) |
---|
2012 | __(cmpb $ivector_class_64_bit,%imm1_b) |
---|
2013 | __(jz local_label(stack_misc_alloc_64)) |
---|
2014 | __(cmpb $ivector_class_32_bit,%imm1_b) |
---|
2015 | __(jz local_label(stack_misc_alloc_32)) |
---|
2016 | __(unbox_fixnum(%arg_y,%imm1)) |
---|
2017 | /* ivector_class_other_bit: 16, 8, or 1 ... */ |
---|
2018 | __(cmpb $subtag_bit_vector,%imm0_b) |
---|
2019 | __(jne local_label(stack_misc_alloc_8)) |
---|
2020 | __(addq $7,%imm1) |
---|
2021 | __(shrq $3,%imm1) |
---|
2022 | __(jmp local_label(stack_misc_alloc_alloc_ivector)) |
---|
2023 | local_label(stack_misc_alloc_8): |
---|
2024 | __(cmpb $subtag_simple_base_string,%imm0_b) |
---|
2025 | __(jb local_label(stack_misc_alloc_16)) |
---|
2026 | __(unbox_fixnum(%arg_y,%imm1)) |
---|
2027 | __(jmp local_label(stack_misc_alloc_alloc_ivector)) |
---|
2028 | local_label(stack_misc_alloc_16): |
---|
2029 | __(unbox_fixnum(%arg_y,%imm1)) |
---|
2030 | __(shlq %imm1) |
---|
2031 | __(jmp local_label(stack_misc_alloc_alloc_ivector)) |
---|
2032 | local_label(stack_misc_alloc_32): |
---|
2033 | /* 32-bit ivector */ |
---|
2034 | __(unbox_fixnum(%arg_y,%imm1)) |
---|
2035 | __(shlq $2,%imm1) |
---|
2036 | __(jmp local_label(stack_misc_alloc_alloc_ivector)) |
---|
2037 | local_label(stack_misc_alloc_64): |
---|
2038 | /* 64-bit ivector */ |
---|
2039 | __(movq %arg_y,%imm1) |
---|
2040 | local_label(stack_misc_alloc_alloc_ivector): |
---|
2041 | __(dnode_align(%imm1,tsp_frame.fixed_overhead+node_size,%imm1)) |
---|
2042 | __(cmpq $tstack_alloc_limit,%imm1) |
---|
2043 | __(ja local_label(stack_misc_alloc_heap_alloc_ivector)) |
---|
2044 | __(movq rcontext(tcr.foreign_sp),%stack_temp) |
---|
2045 | __(movd %stack_temp,%temp1) |
---|
2046 | __(subq %imm1,rcontext(tcr.foreign_sp)) |
---|
2047 | __(movq rcontext(tcr.foreign_sp),%temp0) |
---|
2048 | 0: __(movapd %fpzero,-dnode_size(%temp1)) |
---|
2049 | __(subq $dnode_size,%temp1) |
---|
2050 | __(cmpq %temp1,%temp0) |
---|
2051 | __(jnz 0b) |
---|
2052 | __(movq %stack_temp,(%temp0)) |
---|
2053 | __(movq %rbp,csp_frame.save_rbp(%temp0)) |
---|
2054 | __(movq %imm0,csp_frame.fixed_overhead(%temp0)) |
---|
2055 | __(leaq csp_frame.fixed_overhead+fulltag_misc(%temp0),%arg_z) |
---|
2056 | __(ret) |
---|
2057 | local_label(stack_misc_alloc_heap_alloc_ivector): |
---|
2058 | __(movq rcontext(tcr.foreign_sp),%imm1) |
---|
2059 | __(subq $dnode_size,rcontext(tcr.foreign_sp)) |
---|
2060 | __(movq rcontext(tcr.foreign_sp),%imm0) |
---|
2061 | __(movq %imm1,(%imm0)) |
---|
2062 | __(jmp _SPmisc_alloc) |
---|
2063 | local_label(stack_misc_alloc_node): |
---|
2064 | __(movq %arg_y,%imm1) |
---|
2065 | __(dnode_align(%imm1,tsp_frame.fixed_overhead+node_size,%imm1)) |
---|
2066 | __(cmpq $tstack_alloc_limit,%imm1) |
---|
2067 | __(ja local_label(stack_misc_alloc_heap_alloc_gvector)) |
---|
2068 | __(TSP_Alloc_Var(%imm1,%temp0)) |
---|
2069 | __(movq %imm0,(%temp0)) |
---|
2070 | __(leaq fulltag_misc(%temp0),%arg_z) |
---|
2071 | __(ret) |
---|
2072 | local_label(stack_misc_alloc_heap_alloc_gvector): |
---|
2073 | __(TSP_Alloc_Fixed(0,%imm0)) |
---|
2074 | __(jmp _SPmisc_alloc) |
---|
2075 | |
---|
2076 | local_label(stack_misc_alloc_not_u56): |
---|
2077 | __(uuo_error_reg_not_type(Rarg_y,error_object_not_unsigned_byte_56)) |
---|
2078 | _endsubp(stack_misc_alloc) |
---|
2079 | |
---|
2080 | /* subtype (boxed, of course) is pushed, followed by nargs bytes worth of */ |
---|
2081 | /* initial-contents. Note that this can be used to cons any type of initialized */ |
---|
2082 | /* node-header'ed misc object (symbols, closures, ...) as well as vector-like */ |
---|
2083 | /* objects. */ |
---|
2084 | _spentry(gvector) |
---|
2085 | __(subl $node_size,%nargs) |
---|
2086 | __(movq (%rsp,%nargs_q),%imm0) /* boxed subtype */ |
---|
2087 | __(sarq $fixnumshift,%imm0) |
---|
2088 | __(movq %nargs_q,%imm1) |
---|
2089 | __(shlq $num_subtag_bits-word_shift,%imm1) |
---|
2090 | __(orq %imm1,%imm0) |
---|
2091 | __(dnode_align(%nargs_q,node_size,%imm1)) |
---|
2092 | __(Misc_Alloc(%arg_z)) |
---|
2093 | __(movq %nargs_q,%imm1) |
---|
2094 | __(jmp 2f) |
---|
2095 | 1: __(movq %temp0,misc_data_offset(%arg_z,%imm1)) |
---|
2096 | 2: __(subq $node_size,%imm1) |
---|
2097 | __(pop %temp0) /* Note the intentional fencepost: */ |
---|
2098 | /* discard the subtype as well. */ |
---|
2099 | __(jge 1b) |
---|
2100 | __(jmp *%ra0) |
---|
2101 | _endsubp(gvector) |
---|
2102 | |
---|
2103 | _spentry(mvpass) |
---|
2104 | __(int $3) |
---|
2105 | _endsubp(mvpass) |
---|
2106 | |
---|
2107 | |
---|
2108 | |
---|
2109 | _spentry(nthvalue) |
---|
2110 | __(int $3) |
---|
2111 | _endsubp(nthvalue) |
---|
2112 | |
---|
2113 | _spentry(values) |
---|
2114 | __(movq (%temp0),%ra0) |
---|
2115 | __(ref_global(ret1val_addr,%imm1)) |
---|
2116 | __(cmpq %imm1,%ra0) |
---|
2117 | __(movl $nil_value,%arg_z_l) |
---|
2118 | __(je 0f) |
---|
2119 | __(testl %nargs,%nargs) |
---|
2120 | __(cmovneq -node_size(%rsp,%nargs_q),%arg_z) |
---|
2121 | __(movq %temp0,%rsp) |
---|
2122 | __(ret) |
---|
2123 | 0: __(movq 8(%temp0),%ra0) |
---|
2124 | __(addq $2*node_size,%temp0) |
---|
2125 | __(lea (%rsp,%nargs_q),%imm0) |
---|
2126 | __(jmp 2f) |
---|
2127 | 1: __(subq $node_size,%imm0) |
---|
2128 | __(movq (%imm0),%temp1) |
---|
2129 | __(subq $node_size,%temp0) |
---|
2130 | __(movq %temp1,(%temp0)) |
---|
2131 | 2: __(cmpq %imm0,%rsp) |
---|
2132 | __(jne 1b) |
---|
2133 | __(movq %temp0,%rsp) |
---|
2134 | __(jmp *%ra0) |
---|
2135 | _endsubp(values) |
---|
2136 | |
---|
2137 | _spentry(default_optional_args) |
---|
2138 | __(int $3) |
---|
2139 | _endsubp(default_optional_args) |
---|
2140 | |
---|
2141 | _spentry(opt_supplied_p) |
---|
2142 | __(int $3) |
---|
2143 | _endsubp(opt_supplied_p) |
---|
2144 | |
---|
2145 | _spentry(lexpr_entry) |
---|
2146 | __(int $3) |
---|
2147 | _endsubp(lexpr_entry) |
---|
2148 | |
---|
2149 | _spentry(heap_rest_arg) |
---|
2150 | __(push_argregs()) |
---|
2151 | __(movq %next_method_context,%arg_y) |
---|
2152 | __(movl %nargs,%imm1_l) |
---|
2153 | __(testl %imm1_l,%imm1_l) |
---|
2154 | __(movl $nil_value,%arg_z_l) |
---|
2155 | __(jmp 2f) |
---|
2156 | .p2align 4 |
---|
2157 | 1: __(pop %temp1) |
---|
2158 | __(Cons(%temp1,%arg_z,%arg_z)) |
---|
2159 | __(subl $node_size,%imm1_l) |
---|
2160 | 2: __(jg 1b) |
---|
2161 | __(push %arg_z) |
---|
2162 | __(movq %arg_y,%next_method_context) |
---|
2163 | __(jmp *%ra0) |
---|
2164 | _endsubp(heap_rest_arg) |
---|
2165 | |
---|
2166 | /* %imm0 contains the number of fixed args ; make an &rest arg out of the others */ |
---|
2167 | _spentry(req_heap_rest_arg) |
---|
2168 | __(push_argregs()) |
---|
2169 | __(movq %next_method_context,%arg_y) |
---|
2170 | __(movl %nargs,%imm1_l) |
---|
2171 | __(subl %imm0_l,%imm1_l) |
---|
2172 | __(movl $nil_value,%arg_z_l) |
---|
2173 | __(jmp 2f) |
---|
2174 | .p2align 4 |
---|
2175 | 1: __(pop %temp1) |
---|
2176 | __(Cons(%temp1,%arg_z,%arg_z)) |
---|
2177 | __(subl $node_size,%imm1_l) |
---|
2178 | 2: __(jg 1b) |
---|
2179 | __(push %arg_z) |
---|
2180 | __(movq %arg_y,%next_method_context) |
---|
2181 | __(jmp *%ra0) |
---|
2182 | _endsubp(req_heap_rest_arg) |
---|
2183 | |
---|
2184 | /* %imm0 bytes of stuff has already been pushed */ |
---|
2185 | /* make an &rest arg out of any others */ |
---|
2186 | _spentry(heap_cons_rest_arg) |
---|
2187 | __(movl %nargs,%imm1_l) |
---|
2188 | __(subl %imm0_l,%imm1_l) |
---|
2189 | __(movq %next_method_context,%arg_y) |
---|
2190 | __(movl $nil_value,%arg_z_l) |
---|
2191 | __(jmp 2f) |
---|
2192 | .p2align 4 |
---|
2193 | 1: __(pop %temp1) |
---|
2194 | __(Cons(%temp1,%arg_z,%arg_z)) |
---|
2195 | __(subl $node_size,%imm1_l) |
---|
2196 | 2: __(jg 1b) |
---|
2197 | __(push %arg_z) |
---|
2198 | __(movq %arg_y,%next_method_context) |
---|
2199 | __(jmp *%ra0) |
---|
2200 | _endsubp(heap_cons_rest_arg) |
---|
2201 | |
---|
2202 | _spentry(simple_keywords) |
---|
2203 | __(xorl %imm0_l,%imm0_l) |
---|
2204 | __(push_argregs()) |
---|
2205 | __(jmp _SPkeyword_bind) |
---|
2206 | _endsubp(simple_keywords) |
---|
2207 | |
---|
2208 | _spentry(keyword_args) |
---|
2209 | __(push_argregs()) |
---|
2210 | __(jmp _SPkeyword_bind) |
---|
2211 | _endsubp(keyword_args) |
---|
2212 | |
---|
2213 | /* There are %nargs words of arguments on the stack; %imm0 contains the number */ |
---|
2214 | /* of non-keyword args pushed. It's possible that we never actually got */ |
---|
2215 | /* any keyword args, which would make things much simpler. */ |
---|
2216 | |
---|
2217 | /* On entry, temp1 contains a fixnum with bits indicating whether */ |
---|
2218 | /* &allow-other-keys and/or &rest was present in the lambda list. */ |
---|
2219 | /* Once we get here, we can use the arg registers. */ |
---|
2220 | |
---|
2221 | define([keyword_flags_aok_bit],[fixnumshift]) |
---|
2222 | define([keyword_flags_unknown_keys_bit],[fixnumshift+1]) |
---|
2223 | define([keyword_flags_rest_bit],[fixnumshift+2]) |
---|
2224 | define([keyword_flags_seen_aok_bit],[fixnumshift+3]) |
---|
2225 | |
---|
2226 | _spentry(keyword_bind) |
---|
2227 | __(movl %nargs,%imm1_l) |
---|
2228 | __(subq %imm0,%imm1) |
---|
2229 | __(jbe local_label(no_keyword_values)) |
---|
2230 | __(btq $word_shift,%imm1) |
---|
2231 | __(jnc local_label(even)) |
---|
2232 | __(movl $nil_value,%arg_z_l) |
---|
2233 | __(movq %imm1,%nargs_q) |
---|
2234 | __(testl %nargs,%nargs) |
---|
2235 | __(jmp 1f) |
---|
2236 | 0: __(pop %arg_y) |
---|
2237 | __(Cons(%arg_y,%arg_z,%arg_z)) |
---|
2238 | __(subl $node_size,%nargs) |
---|
2239 | 1: __(jnz 0b) |
---|
2240 | __(movl $XBADKEYS,%arg_y_l) |
---|
2241 | __(set_nargs(2)) |
---|
2242 | __(jmp _SPksignalerr) |
---|
2243 | /* Now that we're sure that we have an even number of keywords and values */ |
---|
2244 | /* (in %imm1), copy all pairs to the temp stack */ |
---|
2245 | local_label(even): |
---|
2246 | /* Get the keyword vector into arg_x, and its length into arg_y. */ |
---|
2247 | __(movl function_data_offset(%fn),%imm0_l) |
---|
2248 | __(movq function_data_offset(%fn,%imm0,node_size),%arg_x) |
---|
2249 | __(vector_length(%arg_x,%arg_y)) |
---|
2250 | __(testq %arg_y,%arg_y) |
---|
2251 | __(jne 1f) |
---|
2252 | __(btq $keyword_flags_aok_bit,%temp1) |
---|
2253 | __(jnc 1f) |
---|
2254 | |
---|
2255 | __(btq $keyword_flags_rest_bit,%temp1) |
---|
2256 | __(jc 0f) |
---|
2257 | __(addq %imm1,%rsp) |
---|
2258 | 0: |
---|
2259 | __(jmp *%ra0) |
---|
2260 | 1: |
---|
2261 | __(lea tsp_frame.fixed_overhead(%imm1),%arg_z) |
---|
2262 | __(TSP_Alloc_Var(%arg_z,%imm0)) |
---|
2263 | 2: __(subq $node_size,%arg_z) |
---|
2264 | __(pop (%arg_z)) |
---|
2265 | __(cmpq %arg_z,%imm0) |
---|
2266 | __(jne 2b) |
---|
2267 | /* Push arg_y pairs of NILs. */ |
---|
2268 | __(movq %arg_y,%imm0) |
---|
2269 | __(jmp 4f) |
---|
2270 | 3: __(push $nil_value) |
---|
2271 | __(push $nil_value) |
---|
2272 | 4: __(subq $fixnumone,%arg_y) |
---|
2273 | __(jge 3b) |
---|
2274 | /* Push the %saveN registers, so that we can use them in this loop */ |
---|
2275 | /* Also, borrow %arg_y for a bit */ |
---|
2276 | __(push %arg_y) |
---|
2277 | __(push %save2) |
---|
2278 | __(push %save1) |
---|
2279 | __(push %save0) |
---|
2280 | __(leaq 4*node_size(%rsp,%imm0,2),%save0) |
---|
2281 | /* %save0 points to the 0th value/supplied-p pair */ |
---|
2282 | __(leaq (%arg_z,%imm1),%save1) |
---|
2283 | /* %save1 is the end of the provided keyword/value pairs (the old %tsp). */ |
---|
2284 | __(movq %imm0,%save2) |
---|
2285 | /* %save2 is the length of the keyword vector */ |
---|
2286 | 5: __(movq (%arg_z),%arg_y) /* %arg_y is current keyword */ |
---|
2287 | __(xorl %imm0_l,%imm0_l) |
---|
2288 | __(cmpq $nrs.kallowotherkeys,%arg_y) |
---|
2289 | __(jne local_label(next_keyvect_entry)) |
---|
2290 | __(btsq $keyword_flags_seen_aok_bit,%temp1) |
---|
2291 | __(jc local_label(next_keyvect_entry)) |
---|
2292 | __(cmpb $fulltag_nil,node_size(%arg_z)) |
---|
2293 | __(je local_label(next_keyvect_entry)) |
---|
2294 | __(btsq $keyword_flags_aok_bit,%temp1) |
---|
2295 | __(jmp local_label(next_keyvect_entry)) |
---|
2296 | 6: __(cmpq misc_data_offset(%arg_x,%imm0),%arg_y) |
---|
2297 | __(jne 7f) |
---|
2298 | /* Got a match; have we already seen this keyword ? */ |
---|
2299 | __(negq %imm0) |
---|
2300 | __(cmpb $fulltag_nil,-node_size*2(%save0,%imm0,2)) |
---|
2301 | __(jne 9f) /* already seen keyword, ignore this value */ |
---|
2302 | __(movq node_size(%arg_z),%arg_y) |
---|
2303 | __(movq %arg_y,-node_size(%save0,%imm0,2)) |
---|
2304 | __(movl $t_value,-node_size*2(%save0,%imm0,2)) |
---|
2305 | __(jmp 9f) |
---|
2306 | 7: __(addq $node_size,%imm0) |
---|
2307 | local_label(next_keyvect_entry): |
---|
2308 | __(cmpq %imm0,%save2) |
---|
2309 | __(jne 6b) |
---|
2310 | /* Didn't match anything in the keyword vector. Is the keyword */ |
---|
2311 | /* :allow-other-keys ? */ |
---|
2312 | __(cmpq $nrs.kallowotherkeys,%arg_y) |
---|
2313 | __(je 9f) /* :allow-other-keys is never "unknown" */ |
---|
2314 | 8: __(btsq $keyword_flags_unknown_keys_bit,%temp1) |
---|
2315 | 9: __(addq $dnode_size,%arg_z) |
---|
2316 | __(cmpq %arg_z,%save1) |
---|
2317 | __(jne 5b) |
---|
2318 | __(pop %save0) |
---|
2319 | __(pop %save1) |
---|
2320 | __(pop %save2) |
---|
2321 | __(pop %arg_y) |
---|
2322 | /* If the function takes an &rest arg, or if we got an unrecognized */ |
---|
2323 | /* keyword and don't allow that, copy the incoming keyword/value */ |
---|
2324 | /* pairs from the temp stack back to the value stack */ |
---|
2325 | __(btq $keyword_flags_rest_bit,%temp1) |
---|
2326 | __(jc 1f) |
---|
2327 | __(btq $keyword_flags_unknown_keys_bit,%temp1) |
---|
2328 | __(jnc 0f) |
---|
2329 | __(btq $keyword_flags_aok_bit,%temp1) |
---|
2330 | __(jnc 1f) |
---|
2331 | /* pop the temp frame */ |
---|
2332 | 0: __(discard_temp_frame(%imm1)) |
---|
2333 | __(jmp *%ra0) |
---|
2334 | /* Copy the keyword/value pairs from the tsp back to sp, either because */ |
---|
2335 | /* the function takes an &rest arg or because we need to signal an */ |
---|
2336 | /* "unknown keywords" error */ |
---|
2337 | 1: __(movq rcontext(tcr.save_tsp),%arg_z) |
---|
2338 | __(mov (%arg_z),%arg_y) |
---|
2339 | __(jmp 3f) |
---|
2340 | 2: __(push (%arg_z)) |
---|
2341 | __(push node_size(%arg_z)) |
---|
2342 | 3: __(addq $dnode_size,%arg_z) |
---|
2343 | __(cmpq %arg_z,%arg_y) |
---|
2344 | __(jne 2b) |
---|
2345 | __(discard_temp_frame(%imm0)) |
---|
2346 | __(btq $keyword_flags_unknown_keys_bit,%temp1) |
---|
2347 | __(jnc,pt 9f) |
---|
2348 | __(btq $keyword_flags_aok_bit,%temp1) |
---|
2349 | __(jc,pt 9f) |
---|
2350 | /* Signal an "unknown keywords" error */ |
---|
2351 | __(movq %imm1,%nargs_q) |
---|
2352 | __(testl %nargs,%nargs) |
---|
2353 | __(movl $nil_value,%arg_z_l) |
---|
2354 | __(jmp 5f) |
---|
2355 | 4: __(pop %arg_y) |
---|
2356 | __(Cons(%arg_y,%arg_z,%arg_z)) |
---|
2357 | __(subl $node_size,%nargs) |
---|
2358 | 5: __(jnz 4b) |
---|
2359 | __(movl $XBADKEYS,%arg_y_l) |
---|
2360 | __(set_nargs(2)) |
---|
2361 | __(push %ra0) |
---|
2362 | __(jmp _SPksignalerr) |
---|
2363 | 9: __(jmp *%ra0) |
---|
2364 | |
---|
2365 | /* No keyword values were provided. Access the keyword vector (which is the 0th */ |
---|
2366 | /* constant in %fn), determine its length N, and push N pairs of NILs. */ |
---|
2367 | /* N could be 0 ... */ |
---|
2368 | |
---|
2369 | local_label(no_keyword_values): |
---|
2370 | __(movl function_data_offset(%fn),%imm0_l) |
---|
2371 | __(movq function_data_offset(%fn,%imm0,node_size),%arg_x) |
---|
2372 | __(movl $nil_value,%arg_z_l) |
---|
2373 | __(vector_length(%arg_x,%arg_y)) |
---|
2374 | __(jmp 1f) |
---|
2375 | 0: __(push %arg_z) |
---|
2376 | __(push %arg_z) |
---|
2377 | 1: __(subq $fixnumone,%arg_y) |
---|
2378 | __(jge 0b) |
---|
2379 | __(jmp *%ra0) |
---|
2380 | _endsubp(keyword_bind) |
---|
2381 | |
---|
2382 | |
---|
2383 | |
---|
2384 | _spentry(ksignalerr) |
---|
2385 | __(movq $nrs.errdisp,%fname) |
---|
2386 | __(jump_fname) |
---|
2387 | _endsubp(ksignalerr) |
---|
2388 | |
---|
2389 | _spentry(stack_rest_arg) |
---|
2390 | __(xorl %imm0_l,%imm0_l) |
---|
2391 | __(push_argregs()) |
---|
2392 | __(jmp _SPstack_cons_rest_arg) |
---|
2393 | _endsubp(stack_rest_arg) |
---|
2394 | |
---|
2395 | _spentry(req_stack_rest_arg) |
---|
2396 | __(push_argregs()) |
---|
2397 | __(jmp _SPstack_cons_rest_arg) |
---|
2398 | _endsubp(req_stack_rest_arg) |
---|
2399 | |
---|
2400 | _spentry(stack_cons_rest_arg) |
---|
2401 | __(movl %nargs,%imm1_l) |
---|
2402 | __(subl %imm0_l,%imm1_l) |
---|
2403 | __(movl $nil_value,%arg_z_l) |
---|
2404 | __(je 2f) /* empty list ; make an empty TSP frame */ |
---|
2405 | __(addq %imm1,%imm1) |
---|
2406 | __(cmpq $(tstack_alloc_limit-dnode_size),%imm1) |
---|
2407 | __(ja 3f) /* make empty frame, then heap-cons */ |
---|
2408 | __(dnode_align(%imm1,tsp_frame.fixed_overhead,%imm0)) |
---|
2409 | __(TSP_Alloc_Var(%imm0,%temp1)) |
---|
2410 | __(addq $fulltag_cons,%temp1) |
---|
2411 | 1: __(pop %arg_x) |
---|
2412 | __(_rplacd(%temp1,%arg_z)) |
---|
2413 | __(_rplaca(%temp1,%arg_x)) |
---|
2414 | __(movq %temp1,%arg_z) |
---|
2415 | __(addq $cons.size,%temp1) |
---|
2416 | __(subq $dnode_size,%imm1) |
---|
2417 | __(jne 1b) |
---|
2418 | __(push %arg_z) |
---|
2419 | __(jmp *%ra0) |
---|
2420 | |
---|
2421 | /* Length 0, make empty frame */ |
---|
2422 | |
---|
2423 | 2: |
---|
2424 | __(TSP_Alloc_Fixed(0,%temp1)) |
---|
2425 | __(push %arg_z) |
---|
2426 | __(jmp *%ra0) |
---|
2427 | |
---|
2428 | /* Too big to stack-cons, but make an empty frame before heap-consing */ |
---|
2429 | |
---|
2430 | 3: |
---|
2431 | __(TSP_Alloc_Fixed(0,%temp1)) |
---|
2432 | __(jmp _SPheap_cons_rest_arg) |
---|
2433 | _endsubp(stack_cons_rest_arg) |
---|
2434 | |
---|
2435 | |
---|
2436 | |
---|
2437 | _spentry(getxlong) |
---|
2438 | _endsubp(getxlong) |
---|
2439 | |
---|
2440 | /* Have to be a little careful here: the caller may or may not have pushed */ |
---|
2441 | /* an empty frame, and we may or may not have needed one. We can't easily */ |
---|
2442 | /* tell whether or not a frame will be needed (if the caller didn't reserve */ |
---|
2443 | /* a frame, whether or not we need one depends on the length of the list */ |
---|
2444 | /* in arg_z. So, if the caller didn't push a frame, we do so ; once everything's */ |
---|
2445 | /* been spread, we discard the reserved frame (regardless of who pushed it) */ |
---|
2446 | /* if all args fit in registers. */ |
---|
2447 | _spentry(spreadargz) |
---|
2448 | __(testl %nargs,%nargs) |
---|
2449 | __(jne 0f) |
---|
2450 | __(push $reserved_frame_marker) |
---|
2451 | __(push $reserved_frame_marker) |
---|
2452 | 0: __(movq %arg_z,%arg_y) /* save in case of error */ |
---|
2453 | __(xorl %imm0_l,%imm0_l) |
---|
2454 | __(compare_reg_to_nil(%arg_z)) |
---|
2455 | __(je 2f) |
---|
2456 | 1: __(extract_fulltag(%arg_z,%imm1)) |
---|
2457 | __(cmpb $fulltag_cons,%imm1_b) |
---|
2458 | __(jne 9f) |
---|
2459 | __(addw $node_size,%imm0_w) |
---|
2460 | __(_car(%arg_z,%arg_x)) |
---|
2461 | __(_cdr(%arg_z,%arg_z)) |
---|
2462 | __(js 8f) |
---|
2463 | __(compare_reg_to_nil(%arg_z)) |
---|
2464 | __(push %arg_x) |
---|
2465 | __(jne 1b) |
---|
2466 | 2: __(addw %imm0_w,%nargs_w) |
---|
2467 | __(jne 4f) |
---|
2468 | 3: __(addq $2*node_size,%rsp) |
---|
2469 | __(jmp *%ra0) |
---|
2470 | 4: __(cmpl $1*node_size,%nargs) |
---|
2471 | __(pop %arg_z) |
---|
2472 | __(je 3b) |
---|
2473 | __(cmpl $2*node_size,%nargs) |
---|
2474 | __(pop %arg_y) |
---|
2475 | __(je 3b) |
---|
2476 | __(cmpl $3*node_size,%nargs) |
---|
2477 | __(pop %arg_x) |
---|
2478 | __(je 3b) |
---|
2479 | __(jmp *%ra0) |
---|
2480 | /* Discard everything that's been pushed already, complain */ |
---|
2481 | |
---|
2482 | 8: __(lea (%rsp,%imm0),%rsp) |
---|
2483 | __(movq %arg_y,%arg_z) /* recover original */ |
---|
2484 | __(movq $XTMINPS,%arg_y) |
---|
2485 | __(set_nargs(2)) |
---|
2486 | __(push %ra0) |
---|
2487 | __(jmp _SPksignalerr) |
---|
2488 | /* Discard everything that's been pushed already, complain */ |
---|
2489 | 9: __(lea (%rsp,%imm0),%rsp) |
---|
2490 | __(movq %arg_y,%arg_z) /* recover original */ |
---|
2491 | __(movq $XNOSPREAD,%arg_y) |
---|
2492 | __(set_nargs(2)) |
---|
2493 | __(push %ra0) |
---|
2494 | __(jmp _SPksignalerr) |
---|
2495 | _endsubp(spreadargz) |
---|
2496 | |
---|
2497 | /* Caller built it's own frame when it was entered. If all outgoing args */ |
---|
2498 | /* are in registers, we can discard that frame; otherwise, we copy outgoing */ |
---|
2499 | /* relative to it and restore %rbp/%ra0 */ |
---|
2500 | _spentry(tfuncallgen) |
---|
2501 | __(cmpl $nargregs*node_size,%nargs) |
---|
2502 | __(jbe 9f) |
---|
2503 | __(lea -nargregs*node_size(%rsp,%nargs_q),%imm0) |
---|
2504 | __(xorl %imm1_l,%imm1_l) |
---|
2505 | /* We can use %ra0 as a temporary here, since the real return address */ |
---|
2506 | /* is on the stack */ |
---|
2507 | 0: __(movq -node_size(%imm0),%ra0) |
---|
2508 | __(movq %ra0,-node_size(%rbp,%imm1)) |
---|
2509 | __(subq $node_size,%imm0) |
---|
2510 | __(subq $node_size,%imm1) |
---|
2511 | __(cmpq %imm0,%rsp) |
---|
2512 | __(jne 0b) |
---|
2513 | __(lea (%rbp,%imm1),%rsp) |
---|
2514 | __(movq 8(%rbp),%ra0) |
---|
2515 | __(movq (%rbp),%rbp) |
---|
2516 | __(pushq %ra0) |
---|
2517 | __(do_funcall()) |
---|
2518 | /* All args in regs; exactly the same as the tfuncallvsp case */ |
---|
2519 | 9: |
---|
2520 | __(leave) |
---|
2521 | __(do_funcall()) |
---|
2522 | _endsubp(tfuncallgen) |
---|
2523 | |
---|
2524 | /* Some args were pushed; move them down in the frame */ |
---|
2525 | _spentry(tfuncallslide) |
---|
2526 | __(lea -nargregs*node_size(%rsp,%nargs_q),%imm0) |
---|
2527 | __(xorl %imm1_l,%imm1_l) |
---|
2528 | /* We can use %ra0 as a temporary here, since the real return address */ |
---|
2529 | /* is on the stack */ |
---|
2530 | 0: __(movq -node_size(%imm0),%ra0) |
---|
2531 | __(movq %ra0,-node_size(%rbp,%imm1)) |
---|
2532 | __(subq $node_size,%imm0) |
---|
2533 | __(subq $node_size,%imm1) |
---|
2534 | __(cmpq %imm0,%rsp) |
---|
2535 | __(jne 0b) |
---|
2536 | __(lea (%rbp,%imm1),%rsp) |
---|
2537 | __(movq 8(%rbp),%ra0) |
---|
2538 | __(movq (%rbp),%rbp) |
---|
2539 | __(push %ra0) |
---|
2540 | __(do_funcall()) |
---|
2541 | _endsubp(tfuncallslide) |
---|
2542 | |
---|
2543 | /* No args were pushed; recover saved context & do funcall */ |
---|
2544 | _spentry(tfuncallvsp) |
---|
2545 | __(leave) |
---|
2546 | __(do_funcall()) |
---|
2547 | _endsubp(tfuncallvsp) |
---|
2548 | |
---|
2549 | _spentry(tcallsymgen) |
---|
2550 | __(cmpl $nargregs*node_size,%nargs) |
---|
2551 | __(jbe 9f) |
---|
2552 | __(lea -nargregs*node_size(%rsp,%nargs_q),%imm0) |
---|
2553 | __(xorl %imm1_l,%imm1_l) |
---|
2554 | /* We can use %ra0 as a temporary here, since the real return address */ |
---|
2555 | /* is on the stack */ |
---|
2556 | 0: __(movq -node_size(%imm0),%ra0) |
---|
2557 | __(movq %ra0,-node_size(%rbp,%imm1)) |
---|
2558 | __(subq $node_size,%imm0) |
---|
2559 | __(subq $node_size,%imm1) |
---|
2560 | __(cmpq %imm0,%rsp) |
---|
2561 | __(jne 0b) |
---|
2562 | __(lea (%rbp,%imm1),%rsp) |
---|
2563 | __(movq 8(%rbp),%ra0) |
---|
2564 | __(movq (%rbp),%rbp) |
---|
2565 | __(pushq %ra0) |
---|
2566 | __(jump_fname()) |
---|
2567 | /* All args in regs; exactly the same as the tcallsymvsp case */ |
---|
2568 | 9: |
---|
2569 | __(leave) |
---|
2570 | __(jump_fname()) |
---|
2571 | _endsubp(tcallsymgen) |
---|
2572 | |
---|
2573 | _spentry(tcallsymslide) |
---|
2574 | __(lea -nargregs*node_size(%rsp,%nargs_q),%imm0) |
---|
2575 | __(xorl %imm1_l,%imm1_l) |
---|
2576 | /* We can use %ra0 as a temporary here, since the real return address */ |
---|
2577 | /* is on the stack */ |
---|
2578 | 0: __(movq -node_size(%imm0),%ra0) |
---|
2579 | __(movq %ra0,-node_size(%rbp,%imm1)) |
---|
2580 | __(subq $node_size,%imm0) |
---|
2581 | __(subq $node_size,%imm1) |
---|
2582 | __(cmpq %imm0,%rsp) |
---|
2583 | __(jne 0b) |
---|
2584 | __(lea (%rbp,%imm1),%rsp) |
---|
2585 | __(movq 8(%rbp),%ra0) |
---|
2586 | __(movq 0(%rbp),%rbp) |
---|
2587 | __(pushq %ra0) |
---|
2588 | __(jump_fname()) |
---|
2589 | _endsubp(tcallsymslide) |
---|
2590 | |
---|
2591 | _spentry(tcallsymvsp) |
---|
2592 | __(leave) |
---|
2593 | __(jump_fname()) |
---|
2594 | _endsubp(tcallsymvsp) |
---|
2595 | |
---|
2596 | _spentry(tcallnfngen) |
---|
2597 | __(cmpl $nargregs*node_size,%nargs) |
---|
2598 | __(jbe 9f) |
---|
2599 | __(lea -nargregs*node_size(%rsp,%nargs_q),%imm0) |
---|
2600 | __(xorl %imm1_l,%imm1_l) |
---|
2601 | /* We can use %ra0 as a temporary here, since the real return address */ |
---|
2602 | /* is on the stack */ |
---|
2603 | 0: __(movq -node_size(%imm0),%ra0) |
---|
2604 | __(movq %ra0,-node_size(%rbp,%imm1)) |
---|
2605 | __(subq $node_size,%imm0) |
---|
2606 | __(subq $node_size,%imm1) |
---|
2607 | __(cmpq %imm0,%rsp) |
---|
2608 | __(jne 0b) |
---|
2609 | __(movq %temp0,%fn) |
---|
2610 | __(lea (%rbp,%imm1),%rsp) |
---|
2611 | __(movq lisp_frame.savera0(%rbp),%ra0) |
---|
2612 | __(movq lisp_frame.backlink(%rbp),%rbp) |
---|
2613 | __(pushq %ra0) |
---|
2614 | __(jmp *%fn) |
---|
2615 | /* All args in regs; exactly the same as the tcallnfnvsp case */ |
---|
2616 | 9: |
---|
2617 | __(movq %temp0,%fn) |
---|
2618 | __(leave) |
---|
2619 | __(jmp *%fn) |
---|
2620 | _endsubp(tcallnfngen) |
---|
2621 | |
---|
2622 | _spentry(tcallnfnslide) |
---|
2623 | __(lea -nargregs*node_size(%rsp,%nargs_q),%imm0) |
---|
2624 | __(xorl %imm1_l,%imm1_l) |
---|
2625 | /* We can use %ra0 as a temporary here, since the real return address */ |
---|
2626 | /* is on the stack */ |
---|
2627 | 0: __(movq -node_size(%imm0),%ra0) |
---|
2628 | __(movq %ra0,-node_size(%rbp,%imm1)) |
---|
2629 | __(subq $node_size,%imm0) |
---|
2630 | __(subq $node_size,%imm1) |
---|
2631 | __(cmpq %imm0,%rsp) |
---|
2632 | __(jne 0b) |
---|
2633 | __(movq %temp0,%fn) |
---|
2634 | __(lea (%rbp,%imm1),%rsp) |
---|
2635 | __(movq lisp_frame.savera0(%rbp),%ra0) |
---|
2636 | __(movq lisp_frame.backlink(%rbp),%rbp) |
---|
2637 | __(pushq %ra0) |
---|
2638 | __(jmp *%fn) |
---|
2639 | _endsubp(tcallnfnslide) |
---|
2640 | |
---|
2641 | _spentry(tcallnfnvsp) |
---|
2642 | __(movq %temp0,%fn) |
---|
2643 | __(leave) |
---|
2644 | __(jmp *%fn) |
---|
2645 | _endsubp(tcallnfnvsp) |
---|
2646 | |
---|
2647 | |
---|
2648 | /* Make a "raw" area on the foreign stack, stack-cons a macptr to point to it, */ |
---|
2649 | /* and return the macptr. Size (in bytes, boxed) is in arg_z on entry; macptr */ |
---|
2650 | /* in arg_z on exit. */ |
---|
2651 | _spentry(makestackblock) |
---|
2652 | __(unbox_fixnum(%arg_z,%imm0)) |
---|
2653 | __(dnode_align(%imm0,tsp_frame.fixed_overhead+macptr.size,%imm0)) |
---|
2654 | __(cmpq $tstack_alloc_limit,%imm0) |
---|
2655 | __(jae 1f) |
---|
2656 | __(movq rcontext(tcr.foreign_sp),%imm1) |
---|
2657 | __(subq %imm0,rcontext(tcr.foreign_sp)) |
---|
2658 | __(movq rcontext(tcr.foreign_sp),%arg_z) |
---|
2659 | __(movq %imm1,(%arg_z)) |
---|
2660 | __(movq %rbp,csp_frame.save_rbp(%arg_z)) |
---|
2661 | __(lea macptr.size+tsp_frame.fixed_overhead(%arg_z),%imm0) |
---|
2662 | __(movq $macptr_header,tsp_frame.fixed_overhead(%arg_z)) |
---|
2663 | __(addq $fulltag_misc+tsp_frame.fixed_overhead,%arg_z) |
---|
2664 | __(movq %imm0,macptr.address(%arg_z)) |
---|
2665 | __(movsd %fpzero,macptr.domain(%arg_z)) |
---|
2666 | __(movsd %fpzero,macptr.type(%arg_z)) |
---|
2667 | __(ret) |
---|
2668 | 1: __(movq rcontext(tcr.foreign_sp),%imm1) |
---|
2669 | __(subq $dnode_size,rcontext(tcr.foreign_sp)) |
---|
2670 | __(movq rcontext(tcr.foreign_sp),%imm0) |
---|
2671 | __(movq %imm1,(%imm0)) |
---|
2672 | __(movq %rbp,csp_frame.save_rbp(%imm0)) |
---|
2673 | __(set_nargs(1)) |
---|
2674 | __(movq $nrs.new_gcable_ptr,%fname) |
---|
2675 | __(jump_fname()) |
---|
2676 | _endsubp(makestackblock) |
---|
2677 | |
---|
2678 | _spentry(makestackblock0) |
---|
2679 | __(unbox_fixnum(%arg_z,%imm0)) |
---|
2680 | __(dnode_align(%imm0,tsp_frame.fixed_overhead+macptr.size,%imm0)) |
---|
2681 | __(cmpq $tstack_alloc_limit,%imm0) |
---|
2682 | __(jae 9f) |
---|
2683 | __(movq rcontext(tcr.foreign_sp),%imm1) |
---|
2684 | __(subq %imm0,rcontext(tcr.foreign_sp)) |
---|
2685 | __(movq rcontext(tcr.foreign_sp),%arg_z) |
---|
2686 | __(movq %imm1,(%arg_z)) |
---|
2687 | __(movq %rbp,csp_frame.save_rbp(%arg_z)) |
---|
2688 | __(lea macptr.size+tsp_frame.fixed_overhead(%arg_z),%imm0) |
---|
2689 | __(movq $macptr_header,tsp_frame.fixed_overhead(%arg_z)) |
---|
2690 | __(addq $fulltag_misc+tsp_frame.fixed_overhead,%arg_z) |
---|
2691 | __(movq %imm0,macptr.address(%arg_z)) |
---|
2692 | __(movsd %fpzero,macptr.domain(%arg_z)) |
---|
2693 | __(movsd %fpzero,macptr.type(%arg_z)) |
---|
2694 | __(jmp 2f) |
---|
2695 | 1: __(movapd %fpzero,(%imm0)) |
---|
2696 | __(addq $dnode_size,%imm0) |
---|
2697 | 2: __(cmpq %imm0,%imm1) |
---|
2698 | __(jne 1b) |
---|
2699 | __(repret) |
---|
2700 | 9: __(movq rcontext(tcr.foreign_sp),%imm1) |
---|
2701 | __(subq $dnode_size,rcontext(tcr.foreign_sp)) |
---|
2702 | __(movq rcontext(tcr.foreign_sp),%imm0) |
---|
2703 | __(movq %imm1,(%imm0)) |
---|
2704 | __(movq %rbp,csp_frame.save_rbp(%imm0)) |
---|
2705 | __(set_nargs(1)) |
---|
2706 | __(movq $nrs.new_gcable_ptr,%fname) |
---|
2707 | __(jump_fname()) |
---|
2708 | _endsubp(makestackblock0) |
---|
2709 | |
---|
2710 | _spentry(makestacklist) |
---|
2711 | __(movq $((1<<63)|fixnummask),%imm0) |
---|
2712 | __(testq %imm0,%arg_y) |
---|
2713 | __(jne 9f) |
---|
2714 | __(movq %arg_y,%imm0) |
---|
2715 | __(addq %imm0,%imm0) |
---|
2716 | __(rcmpq(%imm0,$tstack_alloc_limit)) |
---|
2717 | __(movl $nil_value,%temp1_l) |
---|
2718 | __(jae 2f) |
---|
2719 | __(addq $tsp_frame.fixed_overhead,%imm0) |
---|
2720 | __(TSP_Alloc_Var(%imm0,%temp0)) |
---|
2721 | __(addq $fulltag_cons,%temp0) |
---|
2722 | __(jmp 1f) |
---|
2723 | 0: __(_rplaca(%temp0,%arg_z)) |
---|
2724 | __(_rplacd(%temp0,%temp1)) |
---|
2725 | __(movq %temp0,%temp1) |
---|
2726 | __(addq $cons.size,%temp0) |
---|
2727 | 1: __(subq $fixnumone,%arg_y) |
---|
2728 | __(jge 0b) |
---|
2729 | __(movq %temp1,%arg_z) |
---|
2730 | __(ret) |
---|
2731 | 2: __(TSP_Alloc_Fixed(0,%imm0)) |
---|
2732 | __(jmp 4f) |
---|
2733 | 3: __(Cons(%arg_z,%temp1,%temp1)) |
---|
2734 | 4: __(subq $fixnumone,%arg_y) |
---|
2735 | __(jge 3b) |
---|
2736 | __(movq %temp1,%arg_z) |
---|
2737 | __(ret) |
---|
2738 | 9: __(uuo_error_reg_not_type(Rarg_y,error_object_not_unsigned_byte)) |
---|
2739 | _endsubp(makestacklist) |
---|
2740 | |
---|
2741 | /* subtype (boxed) vpushed before initial values. (Had better be a */ |
---|
2742 | /* node header subtag.) Nargs set to count of things vpushed. */ |
---|
2743 | _spentry(stkgvector) |
---|
2744 | __(lea -fixnum_one(%nargs_q),%imm0) |
---|
2745 | __(lea (%rsp,%imm0),%arg_x) |
---|
2746 | __(movq %imm0,%arg_y) |
---|
2747 | __(shlq $num_subtag_bits-fixnumshift,%imm0) |
---|
2748 | __(movq (%arg_x), %imm1) |
---|
2749 | __(shrq $fixnumshift,%imm1) |
---|
2750 | __(orq %imm1,%imm0) /* imm0 = header, %arg_y = unaligned size */ |
---|
2751 | __(dnode_align(%arg_y,(tsp_frame.fixed_overhead+node_size),%imm1)) |
---|
2752 | __(TSP_Alloc_Var(%imm1,%arg_z)) |
---|
2753 | __(movq %imm0,(%arg_z)) |
---|
2754 | __(addq $fulltag_misc,%arg_z) |
---|
2755 | __(lea -node_size(%nargs_q),%imm0) |
---|
2756 | __(jmp 2f) |
---|
2757 | 1: __(pop misc_data_offset(%arg_z,%imm0)) |
---|
2758 | 2: __(subq $node_size,%imm0) |
---|
2759 | __(jge 1b) |
---|
2760 | __(addq $node_size,%rsp) |
---|
2761 | __(jmp *%ra0) |
---|
2762 | _endsubp(stkgvector) |
---|
2763 | |
---|
2764 | _spentry(misc_alloc) |
---|
2765 | __(movq $~(((1<<56)-1)<<fixnumshift),%imm0) |
---|
2766 | __(testq %imm0,%arg_y) |
---|
2767 | __(jne local_label(misc_alloc_not_u56)) |
---|
2768 | __(unbox_fixnum(%arg_z,%imm0)) |
---|
2769 | __(movq %arg_y,%temp0) |
---|
2770 | __(shl $num_subtag_bits-fixnumshift,%temp0) |
---|
2771 | __(orq %temp0,%imm0) /* %imm0 now = header */ |
---|
2772 | __(movb $fulltagmask,%imm1_b) |
---|
2773 | __(andb %imm0_b,%imm1_b) |
---|
2774 | __(cmpb $fulltag_nodeheader_0,%imm1_b) |
---|
2775 | __(je local_label(misc_alloc_64)) |
---|
2776 | __(cmpb $fulltag_nodeheader_1,%imm1_b) |
---|
2777 | __(je local_label(misc_alloc_64)) |
---|
2778 | __(cmpb $ivector_class_64_bit,%imm1_b) |
---|
2779 | __(jz local_label(misc_alloc_64)) |
---|
2780 | __(cmpb $ivector_class_32_bit,%imm1_b) |
---|
2781 | __(jz local_label(misc_alloc_32)) |
---|
2782 | __(unbox_fixnum(%arg_y,%imm1)) |
---|
2783 | /* ivector_class_other_bit: 16, 8, or 1 ... */ |
---|
2784 | __(cmpb $subtag_bit_vector,%imm0_b) |
---|
2785 | __(jne local_label(misc_alloc_8)) |
---|
2786 | __(addq $7,%imm1) |
---|
2787 | __(shrq $3,%imm1) |
---|
2788 | __(jmp local_label(misc_alloc_alloc_vector)) |
---|
2789 | local_label(misc_alloc_8): |
---|
2790 | __(cmpb $subtag_simple_base_string,%imm0_b) |
---|
2791 | __(jae local_label(misc_alloc_alloc_vector)) |
---|
2792 | local_label(misc_alloc_16): |
---|
2793 | __(shlq %imm1) |
---|
2794 | __(jmp local_label(misc_alloc_alloc_vector)) |
---|
2795 | local_label(misc_alloc_32): |
---|
2796 | /* 32-bit ivector */ |
---|
2797 | __(unbox_fixnum(%arg_y,%imm1)) |
---|
2798 | __(shlq $2,%imm1) |
---|
2799 | __(jmp local_label(misc_alloc_alloc_vector)) |
---|
2800 | local_label(misc_alloc_64): |
---|
2801 | /* 64-bit ivector or gvector */ |
---|
2802 | __(movq %arg_y,%imm1) |
---|
2803 | local_label(misc_alloc_alloc_vector): |
---|
2804 | __(dnode_align(%imm1,node_size,%imm1)) |
---|
2805 | __(Misc_Alloc(%arg_z)) |
---|
2806 | __(ret) |
---|
2807 | local_label(misc_alloc_not_u56): |
---|
2808 | __(uuo_error_reg_not_type(Rarg_y,error_object_not_unsigned_byte_56)) |
---|
2809 | _endsubp(misc_alloc) |
---|
2810 | |
---|
2811 | |
---|
2812 | _startfn(C(destbind1)) |
---|
2813 | /* Save entry %rsp in case of error */ |
---|
2814 | __(movd %rsp,%mm0) |
---|
2815 | /* Extract required arg count. */ |
---|
2816 | __(movzbl %nargs_b,%imm0_l) |
---|
2817 | __(testl %imm0_l,%imm0_l) |
---|
2818 | __(je local_label(opt)) /* skip if no required args */ |
---|
2819 | local_label(req_loop): |
---|
2820 | __(compare_reg_to_nil(%arg_reg)) |
---|
2821 | __(je local_label(toofew)) |
---|
2822 | __(extract_lisptag(%arg_reg,%imm1)) |
---|
2823 | __(cmpb $tag_list,%imm1_b) |
---|
2824 | __(jne local_label(badlist)) |
---|
2825 | __(subb $1,%imm0_b) |
---|
2826 | __(pushq cons.car(%arg_reg)) |
---|
2827 | __(_cdr(%arg_reg,%arg_reg)) |
---|
2828 | __(jne local_label(req_loop)) |
---|
2829 | local_label(opt): |
---|
2830 | __(movw %nargs_w,%imm0_w) |
---|
2831 | __(shrw $8,%imm0_w) |
---|
2832 | __(je local_label(rest_keys)) |
---|
2833 | __(btl $initopt_bit,%nargs) |
---|
2834 | __(jc local_label(opt_supp)) |
---|
2835 | /* 'simple' &optionals: no supplied-p, default to nil. */ |
---|
2836 | local_label(simple_opt_loop): |
---|
2837 | __(compare_reg_to_nil(%arg_reg)) |
---|
2838 | __(je local_label(default_simple_opt)) |
---|
2839 | __(extract_lisptag(%arg_reg,%imm1)) |
---|
2840 | __(cmpb $tag_list,%imm1_b) |
---|
2841 | __(jne local_label(badlist)) |
---|
2842 | __(subb $1,%imm0_b) |
---|
2843 | __(pushq cons.car(%arg_reg)) |
---|
2844 | __(_cdr(%arg_reg,%arg_reg)) |
---|
2845 | __(jne local_label(simple_opt_loop)) |
---|
2846 | __(jmp local_label(rest_keys)) |
---|
2847 | local_label(default_simple_opt): |
---|
2848 | __(subb $1,%imm0_b) |
---|
2849 | __(pushq $nil_value) |
---|
2850 | __(jne local_label(default_simple_opt)) |
---|
2851 | __(jmp local_label(rest_keys)) |
---|
2852 | local_label(opt_supp): |
---|
2853 | __(extract_lisptag(%arg_reg,%imm1)) |
---|
2854 | __(compare_reg_to_nil(%arg_z)) |
---|
2855 | __(je local_label(default_hard_opt)) |
---|
2856 | __(cmpb $tag_list,%imm1_b) |
---|
2857 | __(jne local_label(badlist)) |
---|
2858 | __(subb $1,%imm0_b) |
---|
2859 | __(pushq cons.car(%arg_reg)) |
---|
2860 | __(_cdr(%arg_reg,%arg_reg)) |
---|
2861 | __(push $t_value) |
---|
2862 | __(jne local_label(opt_supp)) |
---|
2863 | __(jmp local_label(rest_keys)) |
---|
2864 | local_label(default_hard_opt): |
---|
2865 | __(subb $1,%imm0_b) |
---|
2866 | __(push $nil_value) |
---|
2867 | __(push $nil_value) |
---|
2868 | __(jne local_label(default_hard_opt)) |
---|
2869 | local_label(rest_keys): |
---|
2870 | __(btl $restp_bit,%nargs) |
---|
2871 | __(jc local_label(have_rest)) |
---|
2872 | __(btl $keyp_bit,%nargs) |
---|
2873 | __(jc local_label(have_keys)) |
---|
2874 | __(compare_reg_to_nil(%arg_reg)) |
---|
2875 | __(jne local_label(toomany)) |
---|
2876 | __(jmp *%ra0) |
---|
2877 | local_label(have_rest): |
---|
2878 | __(pushq %arg_reg) |
---|
2879 | __(btl $keyp_bit,%nargs) |
---|
2880 | __(jc local_label(have_keys)) |
---|
2881 | __(jmp *%ra0) |
---|
2882 | /* Ensure that arg_reg contains a proper,even-length list. */ |
---|
2883 | /* Insist that its length is <= 512 (as a cheap circularity check.) */ |
---|
2884 | local_label(have_keys): |
---|
2885 | __(movw $256,%imm0_w) |
---|
2886 | __(movq %arg_reg,%arg_y) |
---|
2887 | local_label(count_keys_loop): |
---|
2888 | __(compare_reg_to_nil(%arg_y)) |
---|
2889 | __(je local_label(counted_keys)) |
---|
2890 | __(subw $1,%imm0_w) |
---|
2891 | __(jl local_label(toomany)) |
---|
2892 | __(extract_lisptag(%arg_y,%imm1)) |
---|
2893 | __(cmpb $tag_list,%imm1_b) |
---|
2894 | __(jne local_label(badlist)) |
---|
2895 | __(_cdr(%arg_y,%arg_y)) |
---|
2896 | __(extract_fulltag(%arg_y,%imm1)) |
---|
2897 | __(cmpb $fulltag_cons,%imm1_b) |
---|
2898 | __(jne local_label(badlist)) |
---|
2899 | __(_cdr(%arg_y,%arg_y)) |
---|
2900 | __(jmp local_label(count_keys_loop)) |
---|
2901 | local_label(counted_keys): |
---|
2902 | /* We've got a proper, even-length list of key/value pairs in */ |
---|
2903 | /* arg_reg. For each keyword var in the lambda-list, push a pair */ |
---|
2904 | /* of NILs on the vstack. */ |
---|
2905 | |
---|
2906 | __(movl %nargs,%imm1_l) |
---|
2907 | __(shrl $16,%imm1_l) |
---|
2908 | __(movzbl %imm1_b,%imm0_l) |
---|
2909 | __(movq %rsp,%arg_y) |
---|
2910 | __(jmp local_label(push_pair_test)) |
---|
2911 | local_label(push_pair_loop): |
---|
2912 | __(push $nil_value) |
---|
2913 | __(push $nil_value) |
---|
2914 | local_label(push_pair_test): |
---|
2915 | __(subb $1,%imm1_b) |
---|
2916 | __(jge local_label(push_pair_loop)) |
---|
2917 | /* Push the %saveN registers, so that we can use them in this loop */ |
---|
2918 | /* Also, borrow %arg_z */ |
---|
2919 | __(push %save0) |
---|
2920 | __(push %save1) |
---|
2921 | __(push %save2) |
---|
2922 | __(push %arg_z) |
---|
2923 | /* save0 points to the 0th value/supplied-p pair */ |
---|
2924 | __(movq %arg_y,%save0) |
---|
2925 | /* save1 is the length of the keyword vector */ |
---|
2926 | __(vector_length(%arg_x,%save1)) |
---|
2927 | /* save2 is the current keyword */ |
---|
2928 | /* arg_z is the value of the current keyword */ |
---|
2929 | __(xorl %imm0_l,%imm0_l) /* count unknown keywords seen */ |
---|
2930 | local_label(match_keys_loop): |
---|
2931 | __(compare_reg_to_nil(%arg_reg)) |
---|
2932 | __(je local_label(matched_keys)) |
---|
2933 | __(_car(%arg_reg,%save2)) |
---|
2934 | __(_cdr(%arg_reg,%arg_reg)) |
---|
2935 | __(_car(%arg_reg,%arg_z)) |
---|
2936 | __(_cdr(%arg_reg,%arg_reg)) |
---|
2937 | __(xorl %arg_y_l,%arg_y_l) |
---|
2938 | __(jmp local_label(match_test)) |
---|
2939 | local_label(match_loop): |
---|
2940 | __(cmpq misc_data_offset(%arg_x,%arg_y),%save2) |
---|
2941 | __(je local_label(matched)) |
---|
2942 | __(addq $node_size,%arg_y) |
---|
2943 | local_label(match_test): |
---|
2944 | __(cmpq %arg_y,%save1) |
---|
2945 | __(jne local_label(match_loop)) |
---|
2946 | /* No match. Note unknown keyword, check for :allow-other-keys */ |
---|
2947 | __(addl $1,%imm0_l) |
---|
2948 | __(cmpq $nrs.kallowotherkeys,%save2) |
---|
2949 | __(jne local_label(match_keys_loop)) |
---|
2950 | __(subl $1,%imm0_l) |
---|
2951 | __(btsl $seen_aok_bit,%nargs) |
---|
2952 | __(jc local_label(match_keys_loop)) |
---|
2953 | /* First time we've seen :allow-other-keys. Maybe set aok_bit. */ |
---|
2954 | __(compare_reg_to_nil(%arg_z)) |
---|
2955 | __(je local_label(match_keys_loop)) |
---|
2956 | __(btsl $aok_bit,%nargs) |
---|
2957 | __(jmp local_label(match_keys_loop)) |
---|
2958 | /* Got a match. Worry about :allow-other-keys here, too. */ |
---|
2959 | local_label(matched): |
---|
2960 | __(negq %arg_y) |
---|
2961 | __(cmpb $fulltag_nil,-node_size*2(%save0,%arg_y,2)) |
---|
2962 | __(jne local_label(match_keys_loop)) |
---|
2963 | __(movq %arg_z,-node_size(%save0,%arg_y,2)) |
---|
2964 | __(movl $t_value,-node_size*2(%save0,%arg_y,2)) |
---|
2965 | __(cmpq $nrs.kallowotherkeys,%save2) |
---|
2966 | __(jne local_label(match_keys_loop)) |
---|
2967 | __(btsl $seen_aok_bit,%nargs) |
---|
2968 | __(jnc local_label(match_keys_loop)) |
---|
2969 | __(compare_reg_to_nil(%arg_z)) |
---|
2970 | __(je local_label(match_keys_loop)) |
---|
2971 | __(btsl $aok_bit,%nargs) |
---|
2972 | __(jmp local_label(match_keys_loop)) |
---|
2973 | local_label(matched_keys): |
---|
2974 | __(pop %arg_z) |
---|
2975 | __(pop %save2) |
---|
2976 | __(pop %save1) |
---|
2977 | __(pop %save0) |
---|
2978 | __(testl %imm0_l,%imm0_l) |
---|
2979 | __(je local_label(keys_ok)) |
---|
2980 | __(btl $aok_bit,%nargs) |
---|
2981 | __(jnc local_label(badkeys)) |
---|
2982 | local_label(keys_ok): |
---|
2983 | __(jmp *%ra0) |
---|
2984 | /* Some unrecognized keywords. Complain generically about */ |
---|
2985 | /* invalid keywords. */ |
---|
2986 | local_label(badkeys): |
---|
2987 | __(movq $XBADKEYS,%arg_y) |
---|
2988 | __(jmp local_label(destructure_error)) |
---|
2989 | local_label(toomany): |
---|
2990 | __(movq $XCALLTOOMANY,%arg_y) |
---|
2991 | __(jmp local_label(destructure_error)) |
---|
2992 | local_label(toofew): |
---|
2993 | __(movq $XCALLTOOFEW,%arg_y) |
---|
2994 | __(jmp local_label(destructure_error)) |
---|
2995 | local_label(badlist): |
---|
2996 | __(movq $XCALLNOMATCH,%arg_y) |
---|
2997 | /* jmp local_label(destructure_error) */ |
---|
2998 | local_label(destructure_error): |
---|
2999 | __(movd %mm0,%rsp) /* undo everything done to the stack */ |
---|
3000 | __(movq %whole_reg,%arg_z) |
---|
3001 | __(set_nargs(2)) |
---|
3002 | __(push %ra0) |
---|
3003 | __(jmp _SPksignalerr) |
---|
3004 | _endfn(C(destbind1)) |
---|
3005 | |
---|
3006 | _spentry(macro_bind) |
---|
3007 | __(movq %arg_reg,%whole_reg) |
---|
3008 | __(extract_lisptag(%arg_reg,%imm0)) |
---|
3009 | __(cmpb $tag_list,%imm0_b) |
---|
3010 | __(jne 1f) |
---|
3011 | __(_cdr(%arg_reg,%arg_reg)) |
---|
3012 | __(jmp C(destbind1)) |
---|
3013 | 1: __(movq $XCALLNOMATCH,%arg_y) |
---|
3014 | __(movq %whole_reg,%arg_z) |
---|
3015 | __(set_nargs(2)) |
---|
3016 | __(push %ra0) |
---|
3017 | __(jmp _SPksignalerr) |
---|
3018 | _endsubp(macro_bind) |
---|
3019 | |
---|
3020 | _spentry(destructuring_bind) |
---|
3021 | __(movq %arg_reg,%whole_reg) |
---|
3022 | __(jmp C(destbind1)) |
---|
3023 | _endsubp(destructuring_bind) |
---|
3024 | |
---|
3025 | _spentry(destructuring_bind_inner) |
---|
3026 | __(movq %arg_z,%whole_reg) |
---|
3027 | __(jmp C(destbind1)) |
---|
3028 | _endsubp(destructuring_bind_inner) |
---|
3029 | |
---|
3030 | |
---|
3031 | |
---|
3032 | |
---|
3033 | _spentry(vpopargregs) |
---|
3034 | _endsubp(vpopargregs) |
---|
3035 | |
---|
3036 | /* If arg_z is an integer, return in imm0 something whose sign */ |
---|
3037 | /* is the same as arg_z's. If not an integer, error. */ |
---|
3038 | _spentry(integer_sign) |
---|
3039 | __(testb $tagmask,%arg_z_b) |
---|
3040 | __(movq %arg_z,%imm0) |
---|
3041 | __(je 8f) |
---|
3042 | __(extract_typecode(%arg_z,%imm0)) |
---|
3043 | __(cmpb $subtag_bignum,%imm0_b) |
---|
3044 | __(jne 9f) |
---|
3045 | __(getvheader(%arg_z,%imm0)) |
---|
3046 | __(shr $num_subtag_bits,%imm0) |
---|
3047 | __(movslq misc_data_offset-4(%arg_z,%imm0,4),%imm0) |
---|
3048 | 8: __(repret) |
---|
3049 | 9: __(uuo_error_reg_not_type(Rarg_z,error_object_not_integer)) |
---|
3050 | _endsubp(integer_sign) |
---|
3051 | |
---|
3052 | /* "slide" nargs worth of values up the stack. IMM0 contains */ |
---|
3053 | /* the difference between the current RSP and the target. */ |
---|
3054 | _spentry(mvslide) |
---|
3055 | __(movl %nargs,%imm1_l) |
---|
3056 | __(lea (%rsp,%nargs_q),%temp0) |
---|
3057 | __(testq %imm1,%imm1) |
---|
3058 | __(lea (%temp0,%imm0),%imm0) |
---|
3059 | __(je 2f) |
---|
3060 | 1: |
---|
3061 | __(subq $node_size,%temp0) |
---|
3062 | __(movq (%temp0),%temp1) |
---|
3063 | __(subq $node_size,%imm0) |
---|
3064 | __(movq %temp1,(%imm0)) |
---|
3065 | __(subq $node_size,%imm1) |
---|
3066 | __(jne 1b) |
---|
3067 | 2: __(movq %imm0,%rsp) |
---|
3068 | __(jmp *%ra0) |
---|
3069 | _endsubp(mvslide) |
---|
3070 | |
---|
3071 | _spentry(save_values) |
---|
3072 | __(movq rcontext(tcr.save_tsp),%imm1) |
---|
3073 | /* common exit: nargs = values in this set, imm1 = ptr to tsp before call to save_values */ |
---|
3074 | local_label(save_values_to_tsp): |
---|
3075 | __(movq rcontext(tcr.save_tsp),%arg_x) |
---|
3076 | __(dnode_align(%nargs_q,tsp_frame.fixed_overhead+(2*node_size),%imm0)) /* count, link */ |
---|
3077 | __(TSP_Alloc_Var(%imm0,%arg_z)) |
---|
3078 | __(movq rcontext(tcr.save_tsp),%imm0) |
---|
3079 | __(movq %imm1,(%imm0)) |
---|
3080 | __(movq %nargs_q,(%arg_z)) |
---|
3081 | __(movq %arg_x,node_size(%arg_z)) |
---|
3082 | __(leaq 2*node_size(%arg_z,%nargs_q),%arg_y) |
---|
3083 | __(leaq (%rsp,%nargs_q),%imm0) |
---|
3084 | __(cmpq %imm0,%rsp) |
---|
3085 | __(jmp 2f) |
---|
3086 | 1: __(subq $node_size,%imm0) |
---|
3087 | __(movq (%imm0),%arg_z) |
---|
3088 | __(subq $node_size,%arg_y) |
---|
3089 | __(cmpq %imm0,%rsp) |
---|
3090 | __(movq %arg_z,(%arg_y)) |
---|
3091 | 2: __(jne 1b) |
---|
3092 | __(add %nargs_q,%rsp) |
---|
3093 | __(jmp *%ra0) |
---|
3094 | _endsubp(save_values) |
---|
3095 | |
---|
3096 | /* Add the multiple values that are on top of the vstack to the set */ |
---|
3097 | /* saved in the top tsp frame, popping them off of the vstack in the */ |
---|
3098 | /* process. It is an error (a bad one) if the TSP contains something */ |
---|
3099 | /* other than a previously saved set of multiple-values. */ |
---|
3100 | /* Since adding to the TSP may cause a new TSP segment to be allocated, */ |
---|
3101 | /* each add_values call adds another linked element to the list of */ |
---|
3102 | /* values. This makes recover_values harder. */ |
---|
3103 | _spentry(add_values) |
---|
3104 | __(testl %nargs,%nargs) |
---|
3105 | __(movq rcontext(tcr.save_tsp),%imm1) |
---|
3106 | __(movq (%imm1),%imm1) |
---|
3107 | __(jne local_label(save_values_to_tsp)) |
---|
3108 | __(jmp *%ra0) |
---|
3109 | _endsubp(add_values) |
---|
3110 | |
---|
3111 | /* push the values in the value set atop the sp, incrementing nargs. */ |
---|
3112 | /* Discard the tsp frame; leave values atop the sp. */ |
---|
3113 | |
---|
3114 | _spentry(recover_values) |
---|
3115 | /* First, walk the segments reversing the pointer to previous */ |
---|
3116 | /* segment pointers Can tell the end because that previous */ |
---|
3117 | /* segment pointer is the prev tsp pointer */ |
---|
3118 | __(movq rcontext(tcr.save_tsp),%temp1) |
---|
3119 | __(movq %temp1,%arg_x) /* current segment */ |
---|
3120 | __(movq %temp1,%arg_y) /* last segment */ |
---|
3121 | __(movq tsp_frame.backlink(%temp1),%arg_z) /* previous tsp */ |
---|
3122 | local_label(walkloop): |
---|
3123 | __(movq tsp_frame.fixed_overhead+node_size(%arg_x),%temp0) |
---|
3124 | __(cmpq %temp0,%arg_z) /* last segment ? */ |
---|
3125 | __(movq %arg_y,tsp_frame.fixed_overhead+node_size(%arg_x)) |
---|
3126 | __(movq %arg_x,%arg_y) /* last segment <- current segment */ |
---|
3127 | __(movq %temp0,%arg_x) /* current segment <- next segment */ |
---|
3128 | __(jne local_label(walkloop)) |
---|
3129 | |
---|
3130 | /* the final segment pointer is now in %arg_y */ |
---|
3131 | /* walk backwards, pushing values on the stack and incrementing %nargs */ |
---|
3132 | local_label(pushloop): |
---|
3133 | __(movq tsp_frame.data_offset(%arg_y),%imm0) /* nargs in segment */ |
---|
3134 | __(testq %imm0,%imm0) |
---|
3135 | __(leaq tsp_frame.data_offset+(2*node_size)(%arg_y,%imm0),%temp0) |
---|
3136 | __(leaq (%nargs_q,%imm0),%nargs_q) |
---|
3137 | __(jmp 2f) |
---|
3138 | 1: __(pushq -node_size(%temp0)) |
---|
3139 | __(subq $node_size,%temp0) |
---|
3140 | __(subq $fixnum_one,%imm0) |
---|
3141 | 2: __(jne 1b) |
---|
3142 | __(cmpq %arg_y,%temp1) |
---|
3143 | __(movq tsp_frame.data_offset+node_size(%arg_y),%arg_y) |
---|
3144 | __(jne local_label(pushloop)) |
---|
3145 | __(movq (%temp1),%temp1) |
---|
3146 | __(movq %temp1,rcontext(tcr.save_tsp)) |
---|
3147 | __(movq %temp1,rcontext(tcr.next_tsp)) |
---|
3148 | __(jmp *%ra0) |
---|
3149 | _endsubp(recover_values) |
---|
3150 | |
---|
3151 | /* Exactly like recover_values, but it's necessary to reserve an outgoing */ |
---|
3152 | /* frame if any values (which will be used as outgoing arguments) will */ |
---|
3153 | /* wind up on the stack. We can assume that %nargs contains 0 (and */ |
---|
3154 | /* that no other arguments have been pushed) on entry. */ |
---|
3155 | |
---|
3156 | _spentry(recover_values_for_mvcall) |
---|
3157 | /* First, walk the segments reversing the pointer to previous */ |
---|
3158 | /* segment pointers Can tell the end because that previous */ |
---|
3159 | /* segment pointer is the prev tsp pointer */ |
---|
3160 | __(xorl %nargs,%nargs) |
---|
3161 | __(movq rcontext(tcr.save_tsp),%temp1) |
---|
3162 | __(movq %temp1,%arg_x) /* current segment */ |
---|
3163 | __(movq %temp1,%arg_y) /* last segment */ |
---|
3164 | __(movq tsp_frame.backlink(%temp1),%arg_z) /* previous tsp */ |
---|
3165 | local_label(walkloop_mvcall): |
---|
3166 | __(movq tsp_frame.fixed_overhead+node_size(%arg_x),%temp0) |
---|
3167 | __(addq tsp_frame.data_offset(%arg_x),%nargs_q) |
---|
3168 | __(cmpq %temp0,%arg_z) /* last segment ? */ |
---|
3169 | __(movq %arg_y,tsp_frame.fixed_overhead+node_size(%arg_x)) |
---|
3170 | __(movq %arg_x,%arg_y) /* last segment <- current segment */ |
---|
3171 | __(movq %temp0,%arg_x) /* current segment <- next segment */ |
---|
3172 | __(jne local_label(walkloop_mvcall)) |
---|
3173 | |
---|
3174 | __(cmpl $nargregs*node_size,%nargs) |
---|
3175 | __(jbe local_label(pushloop_mvcall)) |
---|
3176 | __(push $reserved_frame_marker) |
---|
3177 | __(push $reserved_frame_marker) |
---|
3178 | |
---|
3179 | /* the final segment pointer is now in %arg_y */ |
---|
3180 | /* walk backwards, pushing values on the stack and incrementing %nargs */ |
---|
3181 | local_label(pushloop_mvcall): |
---|
3182 | __(movq tsp_frame.data_offset(%arg_y),%imm0) /* nargs in segment */ |
---|
3183 | __(testq %imm0,%imm0) |
---|
3184 | __(leaq tsp_frame.data_offset+(2*node_size)(%arg_y,%imm0),%temp0) |
---|
3185 | __(jmp 2f) |
---|
3186 | 1: __(pushq -node_size(%temp0)) |
---|
3187 | __(subq $node_size,%temp0) |
---|
3188 | __(subq $fixnum_one,%imm0) |
---|
3189 | 2: __(jne 1b) |
---|
3190 | __(cmpq %arg_y,%temp1) |
---|
3191 | __(movq tsp_frame.data_offset+node_size(%arg_y),%arg_y) |
---|
3192 | __(jne local_label(pushloop_mvcall)) |
---|
3193 | __(movq (%temp1),%temp1) |
---|
3194 | __(movq %temp1,rcontext(tcr.save_tsp)) |
---|
3195 | __(movq %temp1,rcontext(tcr.next_tsp)) |
---|
3196 | __(jmp *%ra0) |
---|
3197 | _endsubp(recover_values_for_mvcall) |
---|
3198 | |
---|
3199 | _spentry(reset) |
---|
3200 | __(int $3) |
---|
3201 | _endsubp(reset) |
---|
3202 | |
---|
3203 | |
---|
3204 | |
---|
3205 | _spentry(misc_alloc_init) |
---|
3206 | __(push %rbp) |
---|
3207 | __(movq %rsp,%rbp) |
---|
3208 | __(push %arg_z) |
---|
3209 | __(movq %arg_y,%arg_z) |
---|
3210 | __(movq %arg_x,%arg_y) |
---|
3211 | __(lea local_label(misc_alloc_init_back)(%rip),%ra0) |
---|
3212 | __(push %ra0) |
---|
3213 | __(jmp _SPmisc_alloc) |
---|
3214 | __(tra(local_label(misc_alloc_init_back))) |
---|
3215 | __(pop %arg_y) |
---|
3216 | __(leave) |
---|
3217 | __(movq $nrs.init_misc,%fname) |
---|
3218 | __(set_nargs(2)) |
---|
3219 | __(jump_fname()) |
---|
3220 | _endsubp(misc_alloc_init) |
---|
3221 | |
---|
3222 | _spentry(stack_misc_alloc_init) |
---|
3223 | __(push %rbp) |
---|
3224 | __(movq %rsp,%rbp) |
---|
3225 | __(push %arg_z) |
---|
3226 | __(movq %arg_y,%arg_z) |
---|
3227 | __(movq %arg_x,%arg_y) |
---|
3228 | __(lea local_label(stack_misc_alloc_init_back)(%rip),%ra0) |
---|
3229 | __(push %ra0) |
---|
3230 | __(jmp _SPstack_misc_alloc) |
---|
3231 | __(tra(local_label(stack_misc_alloc_init_back))) |
---|
3232 | __(pop %arg_y) |
---|
3233 | __(leave) |
---|
3234 | __(movq $nrs.init_misc,%fname) |
---|
3235 | __(set_nargs(2)) |
---|
3236 | __(jump_fname()) |
---|
3237 | _endsubp(stack_misc_alloc_init) |
---|
3238 | |
---|
3239 | |
---|
3240 | |
---|
3241 | .globl C(popj) |
---|
3242 | _spentry(popj) |
---|
3243 | C(popj): |
---|
3244 | __(leave) |
---|
3245 | __(ret) |
---|
3246 | _endsubp(popj) |
---|
3247 | |
---|
3248 | |
---|
3249 | |
---|
3250 | _spentry(getu64) |
---|
3251 | __(movq $~(target_most_positive_fixnum << fixnumshift),%imm0) |
---|
3252 | __(testq %arg_z,%imm0) |
---|
3253 | __(movq %arg_z,%imm0) |
---|
3254 | __(jne 1f) |
---|
3255 | __(sarq $fixnumshift,%imm0) |
---|
3256 | __(ret) |
---|
3257 | 1: __(andb $tagmask,%imm0_b) |
---|
3258 | __(cmpb $tag_misc,%imm0_b) |
---|
3259 | __(jne 9f) |
---|
3260 | __(movb misc_subtag_offset(%arg_z),%imm0_b) |
---|
3261 | __(cmpb $subtag_bignum,%imm0_b) |
---|
3262 | __(jne 9f) |
---|
3263 | __(movq misc_header_offset(%arg_z),%imm0) |
---|
3264 | __(cmpq $three_digit_bignum_header,%imm0) |
---|
3265 | __(je 3f) |
---|
3266 | __(cmpq $two_digit_bignum_header,%imm0) |
---|
3267 | __(jne 9f) |
---|
3268 | __(movq misc_data_offset(%arg_z),%imm0) |
---|
3269 | __(testq %imm0,%imm0) |
---|
3270 | __(js 9f) |
---|
3271 | __(repret) |
---|
3272 | 3: __(movq misc_data_offset(%arg_z),%imm0) |
---|
3273 | __(cmpl $0,misc_data_offset+8(%arg_z)) |
---|
3274 | __(jne 9f) |
---|
3275 | __(repret) |
---|
3276 | 9: __(uuo_error_reg_not_type(Rarg_z,error_object_not_u64)) |
---|
3277 | _endsubp(getu64) |
---|
3278 | |
---|
3279 | _spentry(gets64) |
---|
3280 | __(movq %arg_z,%imm0) |
---|
3281 | __(sarq $fixnumshift,%imm0) |
---|
3282 | __(testb $fixnummask,%arg_z_b) |
---|
3283 | __(je 8f) |
---|
3284 | 1: __(movb %arg_z_b,%imm0_b) |
---|
3285 | __(andb $tagmask,%imm0_b) |
---|
3286 | __(cmpb $tag_misc,%imm0_b) |
---|
3287 | __(jne 9f) |
---|
3288 | __(movb misc_subtag_offset(%arg_z),%imm0_b) |
---|
3289 | __(cmpb $subtag_bignum,%imm0_b) |
---|
3290 | __(jne 9f) |
---|
3291 | __(movq misc_header_offset(%arg_z),%imm0) |
---|
3292 | __(cmpq $two_digit_bignum_header,%imm0) |
---|
3293 | __(movq misc_data_offset(%arg_z),%imm0) |
---|
3294 | __(jne 9f) |
---|
3295 | 8: __(repret) |
---|
3296 | 9: __(uuo_error_reg_not_type(Rarg_z,error_object_not_u64)) |
---|
3297 | _endsubp(gets64) |
---|
3298 | |
---|
3299 | _spentry(makeu64) |
---|
3300 | __(movq %imm0,%imm1) |
---|
3301 | __(shlq $fixnumshift+1,%imm1) |
---|
3302 | __(movq %imm1,%arg_z) /* Tagged as a fixnum, 2x */ |
---|
3303 | __(shrq $fixnumshift+1,%imm1) |
---|
3304 | __(shrq %arg_z) |
---|
3305 | __(cmpq %imm0,%imm1) |
---|
3306 | __(je 9f) |
---|
3307 | __(testq %imm0,%imm0) |
---|
3308 | __(movd %imm0,%mm0) |
---|
3309 | __(js 3f) |
---|
3310 | /* Make a 2-digit bignum. */ |
---|
3311 | __(movl $two_digit_bignum_header,%imm0_l) |
---|
3312 | __(movl $aligned_bignum_size(2),%imm1_l) |
---|
3313 | __(Misc_Alloc(%arg_z)) |
---|
3314 | __(movq %mm0,misc_data_offset(%arg_z)) |
---|
3315 | __(ret) |
---|
3316 | 3: __(movl $three_digit_bignum_header,%imm0_l) |
---|
3317 | __(movl $aligned_bignum_size(3),%imm1_l) |
---|
3318 | __(Misc_Alloc(%arg_z)) |
---|
3319 | __(movq %mm0,misc_data_offset(%arg_z)) |
---|
3320 | 9: __(repret) |
---|
3321 | _endsubp(makeu64) |
---|
3322 | |
---|
3323 | /* on entry: arg_z = symbol. On exit, arg_z = value (possibly */ |
---|
3324 | /* unbound_marker), arg_y = symbol */ |
---|
3325 | _spentry(specref) |
---|
3326 | __(movq symbol.binding_index(%arg_z),%imm0) |
---|
3327 | __(cmp rcontext(tcr.tlb_limit),%imm0) |
---|
3328 | __(movq rcontext(tcr.tlb_pointer),%imm1) |
---|
3329 | __(movq %arg_z,%arg_y) |
---|
3330 | __(jae 7f) |
---|
3331 | __(movq (%imm1,%imm0),%arg_z) |
---|
3332 | __(cmpb $no_thread_local_binding_marker,%arg_z_b) |
---|
3333 | __(jne 8f) |
---|
3334 | 7: __(movq symbol.vcell(%arg_y),%arg_z) |
---|
3335 | 8: __(repret) |
---|
3336 | _endsubp(specref) |
---|
3337 | |
---|
3338 | /* arg_y = special symbol, arg_z = new value. */ |
---|
3339 | _spentry(specset) |
---|
3340 | __(movq symbol.binding_index(%arg_y),%imm0) |
---|
3341 | __(cmp rcontext(tcr.tlb_limit),%imm0) |
---|
3342 | __(movq rcontext(tcr.tlb_pointer),%imm1) |
---|
3343 | __(jae 1f) |
---|
3344 | __(movq (%imm1,%imm0),%arg_x) |
---|
3345 | __(cmpb $no_thread_local_binding_marker,%arg_x_b) |
---|
3346 | __(je 1f) |
---|
3347 | __(movq %arg_z,(%imm1,%imm0)) |
---|
3348 | __(ret) |
---|
3349 | 1: __(lea fulltag_misc-fulltag_symbol(%arg_y),%arg_x) |
---|
3350 | __(movq $1<<fixnumshift,%arg_y) |
---|
3351 | __(jmp _SPgvset) |
---|
3352 | _endsubp(specset) |
---|
3353 | |
---|
3354 | _spentry(specrefcheck) |
---|
3355 | __(movq symbol.binding_index(%arg_z),%imm0) |
---|
3356 | __(cmp rcontext(tcr.tlb_limit),%imm0) |
---|
3357 | __(movq rcontext(tcr.tlb_pointer),%imm1) |
---|
3358 | __(movq %arg_z,%arg_y) |
---|
3359 | __(jae 7f) |
---|
3360 | __(movq (%imm1,%imm0),%arg_z) |
---|
3361 | __(cmpb $no_thread_local_binding_marker,%arg_z_b) |
---|
3362 | __(cmoveq symbol.vcell(%arg_y),%arg_z) |
---|
3363 | __(cmpb $unbound_marker,%arg_z_b) |
---|
3364 | __(je 9f) |
---|
3365 | 8: __(repret) |
---|
3366 | 7: __(cmpb $unbound_marker,symbol.vcell(%arg_y)) |
---|
3367 | __(movq symbol.vcell(%arg_y),%arg_z) |
---|
3368 | __(je 9f) |
---|
3369 | __(repret) |
---|
3370 | 9: __(uuo_error_reg_unbound(Rarg_y)) |
---|
3371 | _endsubp(specrefcheck) |
---|
3372 | |
---|
3373 | _spentry(restoreintlevel) |
---|
3374 | _endsubp(restoreintlevel) |
---|
3375 | |
---|
3376 | _spentry(makes32) |
---|
3377 | __(int $3) |
---|
3378 | _endsubp(makes32) |
---|
3379 | |
---|
3380 | _spentry(makeu32) |
---|
3381 | __(int $3) |
---|
3382 | _endsubp(makeu32) |
---|
3383 | |
---|
3384 | _spentry(gets32) |
---|
3385 | __(int $3) |
---|
3386 | _endsubp(gets32) |
---|
3387 | |
---|
3388 | _spentry(getu32) |
---|
3389 | __(int $3) |
---|
3390 | _endsubp(getu32) |
---|
3391 | |
---|
3392 | |
---|
3393 | _spentry(mvpasssym) |
---|
3394 | _endsubp(mvpasssym) |
---|
3395 | |
---|
3396 | |
---|
3397 | _spentry(unbind) |
---|
3398 | __(movq rcontext(tcr.db_link),%imm1) |
---|
3399 | __(movq rcontext(tcr.tlb_pointer),%arg_x) |
---|
3400 | __(movq binding.sym(%imm1),%temp1) |
---|
3401 | __(movq binding.val(%imm1),%arg_y) |
---|
3402 | __(movq binding.link(%imm1),%imm1) |
---|
3403 | __(movq %arg_y,(%arg_x,%temp1)) |
---|
3404 | __(movq %imm1,rcontext(tcr.db_link)) |
---|
3405 | __(ret) |
---|
3406 | _endsubp(unbind) |
---|
3407 | |
---|
3408 | _spentry(unbind_n) |
---|
3409 | __(movq rcontext(tcr.db_link),%imm1) |
---|
3410 | __(movq rcontext(tcr.tlb_pointer),%arg_x) |
---|
3411 | 1: |
---|
3412 | __(movq binding.sym(%imm1),%temp1) |
---|
3413 | __(movq binding.val(%imm1),%arg_y) |
---|
3414 | __(movq binding.link(%imm1),%imm1) |
---|
3415 | __(movq %arg_y,(%arg_x,%temp1)) |
---|
3416 | __(subq $1,%imm0) |
---|
3417 | __(jne 1b) |
---|
3418 | __(movq %imm1,rcontext(tcr.db_link)) |
---|
3419 | __(ret) |
---|
3420 | _endsubp(unbind_n) |
---|
3421 | |
---|
3422 | _spentry(unbind_to) |
---|
3423 | __(movq rcontext(tcr.db_link),%imm1) |
---|
3424 | __(movq rcontext(tcr.tlb_pointer),%arg_x) |
---|
3425 | 1: |
---|
3426 | __(movq binding.sym(%imm1),%temp1) |
---|
3427 | __(movq binding.val(%imm1),%arg_y) |
---|
3428 | __(movq binding.link(%imm1),%imm1) |
---|
3429 | __(movq %arg_y,(%arg_x,%temp1)) |
---|
3430 | __(cmpq %imm1,%imm0) |
---|
3431 | __(jne 1b) |
---|
3432 | __(movq %imm1,rcontext(tcr.db_link)) |
---|
3433 | __(ret) |
---|
3434 | _endsubp(unbind_to) |
---|
3435 | |
---|
3436 | |
---|
3437 | /* Bind CCL::*INTERRUPT-LEVEL* to 0. If its value had been negative, check */ |
---|
3438 | /* for pending interrupts after doing so. */ |
---|
3439 | |
---|
3440 | _spentry(bind_interrupt_level_0) |
---|
3441 | __(movq rcontext(tcr.tlb_pointer),%temp1) |
---|
3442 | __(cmpq $0,INTERRUPT_LEVEL_BINDING_INDEX(%temp1)) |
---|
3443 | __(push INTERRUPT_LEVEL_BINDING_INDEX(%temp1)) |
---|
3444 | __(push $INTERRUPT_LEVEL_BINDING_INDEX) |
---|
3445 | __(push rcontext(tcr.db_link)) |
---|
3446 | __(movq %rsp,rcontext(tcr.db_link)) |
---|
3447 | __(movq $0,INTERRUPT_LEVEL_BINDING_INDEX(%temp1)) |
---|
3448 | __(js,pn 1f) |
---|
3449 | 0: __(jmp *%ra0) |
---|
3450 | /* Interrupt level was negative; interrupt may be pending */ |
---|
3451 | 1: __(check_pending_enabled_interrupt(2f)) |
---|
3452 | 2: __(jmp *%ra0) |
---|
3453 | _endsubp(bind_interrupt_level_0) |
---|
3454 | |
---|
3455 | |
---|
3456 | /* Bind CCL::*INTERRUPT-LEVEL* to the fixnum -1. (This has the effect */ |
---|
3457 | /* of disabling interrupts.) */ |
---|
3458 | |
---|
3459 | _spentry(bind_interrupt_level_m1) |
---|
3460 | __(movq rcontext(tcr.tlb_pointer),%temp1) |
---|
3461 | __(push INTERRUPT_LEVEL_BINDING_INDEX(%temp1)) |
---|
3462 | __(push $INTERRUPT_LEVEL_BINDING_INDEX) |
---|
3463 | __(push rcontext(tcr.db_link)) |
---|
3464 | __(movq %rsp,rcontext(tcr.db_link)) |
---|
3465 | __(movq $-1<<fixnumshift,INTERRUPT_LEVEL_BINDING_INDEX(%temp1)) |
---|
3466 | __(jmp *%ra0) |
---|
3467 | _endsubp(bind_interrupt_level_m1) |
---|
3468 | |
---|
3469 | /* Bind CCL::*INTERRUPT-LEVEL* to the value in arg_z. If that value's 0, */ |
---|
3470 | /* do what _SPbind_interrupt_level_0 does */ |
---|
3471 | _spentry(bind_interrupt_level) |
---|
3472 | __(testq %arg_z,%arg_z) |
---|
3473 | __(movq rcontext(tcr.tlb_pointer),%temp1) |
---|
3474 | __(jz _SPbind_interrupt_level_0) |
---|
3475 | __(push INTERRUPT_LEVEL_BINDING_INDEX(%temp1)) |
---|
3476 | __(push $INTERRUPT_LEVEL_BINDING_INDEX) |
---|
3477 | __(push rcontext(tcr.db_link)) |
---|
3478 | __(movq %rsp,rcontext(tcr.db_link)) |
---|
3479 | __(movq %arg_z,INTERRUPT_LEVEL_BINDING_INDEX(%temp1)) |
---|
3480 | __(jmp *%ra0) |
---|
3481 | _endsubp(bind_interrupt_level) |
---|
3482 | |
---|
3483 | /* Unbind CCL::*INTERRUPT-LEVEL*. If the value changes from negative to */ |
---|
3484 | /* non-negative, check for pending interrupts. */ |
---|
3485 | |
---|
3486 | _spentry(unbind_interrupt_level) |
---|
3487 | __(btq $TCR_FLAG_BIT_PENDING_SUSPEND,rcontext(tcr.flags)) |
---|
3488 | __(movq rcontext(tcr.db_link),%imm1) |
---|
3489 | __(movq rcontext(tcr.tlb_pointer),%arg_x) |
---|
3490 | __(movq INTERRUPT_LEVEL_BINDING_INDEX(%arg_x),%imm0) |
---|
3491 | __(jc 5f) |
---|
3492 | 0: __(testq %imm0,%imm0) |
---|
3493 | __(movq binding.val(%imm1),%temp0) |
---|
3494 | __(movq binding.link(%imm1),%imm1) |
---|
3495 | __(movq %temp0,INTERRUPT_LEVEL_BINDING_INDEX(%arg_x)) |
---|
3496 | __(movq %imm1,rcontext(tcr.db_link)) |
---|
3497 | __(js,pn 3f) |
---|
3498 | 2: __(repret) |
---|
3499 | 3: __(testq %temp0,%temp0) |
---|
3500 | __(js 2b) |
---|
3501 | __(check_pending_enabled_interrupt(4f)) |
---|
3502 | 4: __(repret) |
---|
3503 | 5: /* Missed a suspend request; force suspend now if we're restoring |
---|
3504 | interrupt level to -1 or greater */ |
---|
3505 | __(cmpq $-2<<fixnumshift,%imm0) |
---|
3506 | __(jne 0b) |
---|
3507 | __(movq binding.val(%imm1),%temp0) |
---|
3508 | __(cmpq %imm0,%temp0) |
---|
3509 | __(je 0b) |
---|
3510 | __(movq $-1<<fixnumshift,INTERRUPT_LEVEL_BINDING_INDEX(%arg_x)) |
---|
3511 | __(suspend_now()) |
---|
3512 | __(jmp 0b) |
---|
3513 | _endsubp(unbind_interrupt_level) |
---|
3514 | |
---|
3515 | |
---|
3516 | _spentry(progvrestore) |
---|
3517 | __(movq rcontext(tcr.save_tsp),%imm0) |
---|
3518 | __(movq tsp_frame.backlink(%imm0),%imm0) /* ignore .SPnthrowXXX values frame */ |
---|
3519 | __(movq tsp_frame.data_offset(%imm0),%imm0) |
---|
3520 | __(shrq $fixnumshift,%imm0) |
---|
3521 | __(jne _SPunbind_n) |
---|
3522 | __(repret) |
---|
3523 | _endsubp(progvrestore) |
---|
3524 | |
---|
3525 | |
---|
3526 | /* %arg_z <- %arg_y + %arg_z. Do the fixnum case - including overflow - */ |
---|
3527 | /* inline. Call out otherwise. */ |
---|
3528 | _spentry(builtin_plus) |
---|
3529 | __(movb %arg_z_b,%imm0_b) |
---|
3530 | __(orb %arg_y_b,%imm0_b) |
---|
3531 | __(testb $fixnummask,%imm0_b) |
---|
3532 | __(jne 1f) |
---|
3533 | __(addq %arg_y,%arg_z) |
---|
3534 | __(jo,pn C(fix_one_bit_overflow)) |
---|
3535 | __(repret) |
---|
3536 | 1: __(jump_builtin(_builtin_plus,2)) |
---|
3537 | _endsubp(builtin_plus) |
---|
3538 | |
---|
3539 | |
---|
3540 | /* %arg_z <- %arg_z - %arg_y. Do the fixnum case - including overflow - */ |
---|
3541 | /* inline. Call out otherwise. */ |
---|
3542 | _spentry(builtin_minus) |
---|
3543 | __(movb %arg_z_b,%imm0_b) |
---|
3544 | __(orb %arg_y_b,%imm0_b) |
---|
3545 | __(testb $fixnummask,%imm0_b) |
---|
3546 | __(jne 1f) |
---|
3547 | __(xchgq %arg_y,%arg_z) |
---|
3548 | __(subq %arg_y,%arg_z) |
---|
3549 | __(jo,pn C(fix_one_bit_overflow)) |
---|
3550 | __(repret) |
---|
3551 | 1: __(jump_builtin(_builtin_minus,2)) |
---|
3552 | _endsubp(builtin_minus) |
---|
3553 | |
---|
3554 | /* %arg_z <- %arg_z * %arg_y. Do the fixnum case - including overflow - */ |
---|
3555 | /* inline. Call out otherwise. */ |
---|
3556 | _spentry(builtin_times) |
---|
3557 | __(movb %arg_z_b,%imm0_b) |
---|
3558 | __(orb %arg_y_b,%imm0_b) |
---|
3559 | __(testb $fixnummask,%imm0_b) |
---|
3560 | __(jne 2f) |
---|
3561 | __(unbox_fixnum(%arg_z,%imm0)) |
---|
3562 | /* 128-bit fixnum result in %imm1:%imm0. Overflow set if %imm1 */ |
---|
3563 | /* is significant */ |
---|
3564 | __(imul %arg_y) |
---|
3565 | __(jo 1f) |
---|
3566 | __(mov %imm0,%arg_z) |
---|
3567 | __(ret) |
---|
3568 | 1: __(unbox_fixnum(%arg_z,%imm0)) |
---|
3569 | __(unbox_fixnum(%arg_y,%imm1)) |
---|
3570 | __(imul %imm1) |
---|
3571 | __(jmp C(makes128)) |
---|
3572 | 2: __(jump_builtin(_builtin_times,2)) |
---|
3573 | _endsubp(builtin_times) |
---|
3574 | |
---|
3575 | _spentry(builtin_div) |
---|
3576 | __(jump_builtin(_builtin_div,2)) |
---|
3577 | |
---|
3578 | /* %arg_z <- (= %arg_y %arg_z). */ |
---|
3579 | _spentry(builtin_eq) |
---|
3580 | __(movb %arg_z_b,%imm0_b) |
---|
3581 | __(orb %arg_y_b,%imm0_b) |
---|
3582 | __(testb $fixnummask,%imm0_b) |
---|
3583 | __(jne 1f) |
---|
3584 | __(rcmpq(%arg_z,%arg_y)) |
---|
3585 | __(condition_to_boolean(e,%imm0,%arg_z)) |
---|
3586 | __(ret) |
---|
3587 | 1: __(jump_builtin(_builtin_eq,2)) |
---|
3588 | _endsubp(builtin_eq) |
---|
3589 | |
---|
3590 | /* %arg_z <- (/= %arg_y %arg_z). */ |
---|
3591 | _spentry(builtin_ne) |
---|
3592 | __(movb %arg_z_b,%imm0_b) |
---|
3593 | __(orb %arg_y_b,%imm0_b) |
---|
3594 | __(testb $fixnummask,%imm0_b) |
---|
3595 | __(jne 1f) |
---|
3596 | __(rcmpq(%arg_z,%arg_y)) |
---|
3597 | __(condition_to_boolean(ne,%imm0,%arg_z)) |
---|
3598 | __(ret) |
---|
3599 | 1: __(jump_builtin(_builtin_ne,2)) |
---|
3600 | _endsubp(builtin_ne) |
---|
3601 | |
---|
3602 | /* %arg_z <- (> %arg_y %arg_z). */ |
---|
3603 | _spentry(builtin_gt) |
---|
3604 | __(movb %arg_z_b,%imm0_b) |
---|
3605 | __(orb %arg_y_b,%imm0_b) |
---|
3606 | __(testb $fixnummask,%imm0_b) |
---|
3607 | __(jne 1f) |
---|
3608 | __(rcmpq(%arg_y,%arg_z)) |
---|
3609 | __(condition_to_boolean(g,%imm0,%arg_z)) |
---|
3610 | __(ret) |
---|
3611 | 1: __(jump_builtin(_builtin_gt,2)) |
---|
3612 | _endsubp(builtin_gt) |
---|
3613 | |
---|
3614 | /* %arg_z <- (>= %arg_y %arg_z). */ |
---|
3615 | _spentry(builtin_ge) |
---|
3616 | __(movb %arg_z_b,%imm0_b) |
---|
3617 | __(orb %arg_y_b,%imm0_b) |
---|
3618 | __(testb $fixnummask,%imm0_b) |
---|
3619 | __(jne 1f) |
---|
3620 | __(rcmpq(%arg_y,%arg_z)) |
---|
3621 | __(condition_to_boolean(ge,%imm0,%arg_z)) |
---|
3622 | __(ret) |
---|
3623 | 1: __(jump_builtin(_builtin_ge,2)) |
---|
3624 | _endsubp(builtin_ge) |
---|
3625 | |
---|
3626 | /* %arg_z <- (< %arg_y %arg_z). */ |
---|
3627 | _spentry(builtin_lt) |
---|
3628 | __(movb %arg_z_b,%imm0_b) |
---|
3629 | __(orb %arg_y_b,%imm0_b) |
---|
3630 | __(testb $fixnummask,%imm0_b) |
---|
3631 | __(jne 1f) |
---|
3632 | __(rcmpq(%arg_y,%arg_z)) |
---|
3633 | __(condition_to_boolean(l,%imm0,%arg_z)) |
---|
3634 | __(ret) |
---|
3635 | 1: __(jump_builtin(_builtin_lt,2)) |
---|
3636 | _endsubp(builtin_lt) |
---|
3637 | |
---|
3638 | /* %arg_z <- (<= %arg_y %arg_z). */ |
---|
3639 | _spentry(builtin_le) |
---|
3640 | __(movb %arg_z_b,%imm0_b) |
---|
3641 | __(orb %arg_y_b,%imm0_b) |
---|
3642 | __(testb $fixnummask,%imm0_b) |
---|
3643 | __(jne 1f) |
---|
3644 | __(rcmpq(%arg_y,%arg_z)) |
---|
3645 | __(condition_to_boolean(le,%imm0,%arg_z)) |
---|
3646 | __(ret) |
---|
3647 | 1: __(jump_builtin(_builtin_le,2)) |
---|
3648 | _endsubp(builtin_le) |
---|
3649 | |
---|
3650 | _spentry(builtin_eql) |
---|
3651 | __(cmpq %arg_y,%arg_z) |
---|
3652 | __(je 1f) |
---|
3653 | /* Not EQ. Could only possibly be EQL if both are tag-misc */ |
---|
3654 | /* and both have the same subtag */ |
---|
3655 | __(extract_lisptag(%arg_y,%imm0)) |
---|
3656 | __(extract_lisptag(%arg_z,%imm1)) |
---|
3657 | __(cmpb $tag_misc,%imm0_b) |
---|
3658 | __(jne 2f) |
---|
3659 | __(cmpb %imm0_b,%imm1_b) |
---|
3660 | __(jne 2f) |
---|
3661 | __(extract_subtag(%arg_y,%imm0_b)) |
---|
3662 | __(extract_subtag(%arg_z,%imm1_b)) |
---|
3663 | __(cmpb %imm0_b,%imm1_b) |
---|
3664 | __(jne 2f) |
---|
3665 | __(jump_builtin(_builtin_eql,2)) |
---|
3666 | 1: __(movl $t_value,%arg_z_l) |
---|
3667 | __(ret) |
---|
3668 | 2: __(movl $nil_value,%arg_z_l) |
---|
3669 | __(ret) |
---|
3670 | _endsubp(builtin_eql) |
---|
3671 | |
---|
3672 | _spentry(builtin_length) |
---|
3673 | __(extract_lisptag(%arg_z,%imm0)) |
---|
3674 | __(cmpb $tag_list,%imm0_b) |
---|
3675 | __(jz 2f) |
---|
3676 | __(cmpb $tag_misc,%imm0_b) |
---|
3677 | __(jnz 8f) |
---|
3678 | __(extract_subtag(%arg_z,%imm0_b)) |
---|
3679 | __(rcmpb(%imm0_b,$min_vector_subtag)) |
---|
3680 | __(jb 8f) |
---|
3681 | __(je 1f) |
---|
3682 | /* (simple-array * (*)) */ |
---|
3683 | __(movq %arg_z,%arg_y) |
---|
3684 | __(vector_length(%arg_y,%arg_z)) |
---|
3685 | __(ret) |
---|
3686 | 1: /* vector header */ |
---|
3687 | __(movq vectorH.logsize(%arg_z),%arg_z) |
---|
3688 | __(ret) |
---|
3689 | 2: /* list. Maybe null, maybe dotted or circular. */ |
---|
3690 | __(movq $-fixnumone,%imm2) |
---|
3691 | __(movq %arg_z,%temp0) /* fast pointer */ |
---|
3692 | __(movq %arg_z,%temp1) /* slow pointer */ |
---|
3693 | 3: __(extract_lisptag(%temp0,%imm0)) |
---|
3694 | __(compare_reg_to_nil(%temp0)) |
---|
3695 | __(leaq fixnumone(%imm2),%imm2) |
---|
3696 | __(je 9f) |
---|
3697 | __(cmpb $tag_list,%imm0_b) |
---|
3698 | __(jne 8f) |
---|
3699 | __(extract_lisptag(%temp1,%imm1)) |
---|
3700 | __(testb $fixnumone,%imm2_b) |
---|
3701 | __(_cdr(%temp0,%temp0)) |
---|
3702 | __(je 3b) |
---|
3703 | __(cmpb $tag_list,%imm1_b) |
---|
3704 | __(jne 8f) |
---|
3705 | __(_cdr(%temp1,%temp1)) |
---|
3706 | __(cmpq %temp0,%temp1) |
---|
3707 | __(jne 3b) |
---|
3708 | 8: |
---|
3709 | __(jump_builtin(_builtin_length,1)) |
---|
3710 | 9: |
---|
3711 | __(movq %imm2,%arg_z) |
---|
3712 | __(ret) |
---|
3713 | _endsubp(builtin_length) |
---|
3714 | |
---|
3715 | |
---|
3716 | _spentry(builtin_seqtype) |
---|
3717 | __(extract_lisptag(%arg_z,%imm0)) |
---|
3718 | __(cmpb $tag_list,%imm0_b) |
---|
3719 | __(jz 1f) |
---|
3720 | __(cmpb $tag_misc,%imm0_b) |
---|
3721 | __(jne 2f) |
---|
3722 | __(movb misc_subtag_offset(%arg_z),%imm0_b) |
---|
3723 | __(rcmpb(%imm0_b,$min_vector_subtag)) |
---|
3724 | __(jb 2f) |
---|
3725 | __(movl $nil_value,%arg_z_l) |
---|
3726 | __(ret) |
---|
3727 | 1: __(movl $t_value,%arg_z_l) |
---|
3728 | __(ret) |
---|
3729 | 2: |
---|
3730 | __(jump_builtin(_builtin_seqtype,1)) |
---|
3731 | _endsubp(builtin_seqtype) |
---|
3732 | |
---|
3733 | _spentry(builtin_assq) |
---|
3734 | __(cmpb $fulltag_nil,%arg_z_b) |
---|
3735 | __(jz 5f) |
---|
3736 | 1: __(movb $tagmask,%imm0_b) |
---|
3737 | __(andb %arg_z_b,%imm0_b) |
---|
3738 | __(cmpb $tag_list,%imm0_b) |
---|
3739 | __(jnz 2f) |
---|
3740 | __(_car(%arg_z,%arg_x)) |
---|
3741 | __(_cdr(%arg_z,%arg_z)) |
---|
3742 | __(cmpb $fulltag_nil,%arg_x_b) |
---|
3743 | __(jz 4f) |
---|
3744 | __(movb $tagmask,%imm0_b) |
---|
3745 | __(andb %arg_x_b,%imm0_b) |
---|
3746 | __(cmpb $tag_list,%imm0_b) |
---|
3747 | __(jnz 3f) |
---|
3748 | __(_car(%arg_x,%temp0)) |
---|
3749 | __(cmpq %temp0,%arg_y) |
---|
3750 | __(jnz 4f) |
---|
3751 | __(movq %arg_x,%arg_z) |
---|
3752 | __(ret) |
---|
3753 | 4: __(cmpb $fulltag_nil,%arg_z_b) |
---|
3754 | 5: __(jnz 1b) |
---|
3755 | __(repret) |
---|
3756 | 2: __(uuo_error_reg_not_list(Rarg_z)) |
---|
3757 | 3: __(uuo_error_reg_not_list(Rarg_x)) |
---|
3758 | _endsubp(builtin_assq) |
---|
3759 | |
---|
3760 | _spentry(builtin_memq) |
---|
3761 | __(cmpb $fulltag_nil,%arg_z_b) |
---|
3762 | __(jmp 3f) |
---|
3763 | 1: __(movb $tagmask,%imm0_b) |
---|
3764 | __(andb %arg_z_b,%imm0_b) |
---|
3765 | __(cmpb $tag_list,%imm0_b) |
---|
3766 | __(jnz 2f) |
---|
3767 | __(_car(%arg_z,%arg_x)) |
---|
3768 | __(_cdr(%arg_z,%temp0)) |
---|
3769 | __(cmpq %arg_x,%arg_y) |
---|
3770 | __(jz 4f) |
---|
3771 | __(cmpb $fulltag_nil,%temp0_b) |
---|
3772 | __(movq %temp0,%arg_z) |
---|
3773 | 3: __(jnz 1b) |
---|
3774 | 4: __(repret) |
---|
3775 | 2: __(uuo_error_reg_not_list(Rarg_z)) |
---|
3776 | _endsubp(builtin_memq) |
---|
3777 | |
---|
3778 | __ifdef([X8664]) |
---|
3779 | logbitp_max_bit = 61 |
---|
3780 | __else |
---|
3781 | logbitp_max_bit = 30 |
---|
3782 | __endif |
---|
3783 | |
---|
3784 | _spentry(builtin_logbitp) |
---|
3785 | __(movb %arg_z_b,%imm0_b) |
---|
3786 | __(orb %arg_y_b,%imm0_b) |
---|
3787 | __(testb $fixnummask,%imm0_b) |
---|
3788 | __(jnz 1f) |
---|
3789 | __(unbox_fixnum(%arg_y,%imm0)) |
---|
3790 | __(movl $logbitp_max_bit-1+fixnumshift,%imm1_l) |
---|
3791 | __(js 1f) /* bit number negative */ |
---|
3792 | __(addb $fixnumshift,%imm0_b) |
---|
3793 | __(cmpq $logbitp_max_bit<<fixnumshift,%arg_y) |
---|
3794 | __(cmovael %imm1_l,%imm0_l) |
---|
3795 | __(bt %imm0,%arg_z) |
---|
3796 | __(condition_to_boolean(b,%imm0,%arg_z)) |
---|
3797 | __(ret) |
---|
3798 | 1: __(jump_builtin(_builtin_logbitp,2)) |
---|
3799 | _endsubp(builtin_logbitp) |
---|
3800 | |
---|
3801 | _spentry(builtin_logior) |
---|
3802 | __(movb %arg_y_b,%imm0_b) |
---|
3803 | __(orb %arg_z_b,%imm0_b) |
---|
3804 | __(testb $fixnummask,%imm0_b) |
---|
3805 | __(jne 1f) |
---|
3806 | __(orq %arg_y,%arg_z) |
---|
3807 | __(ret) |
---|
3808 | 1: |
---|
3809 | __(jump_builtin(_builtin_logior,2)) |
---|
3810 | |
---|
3811 | _endsubp(builtin_logior) |
---|
3812 | |
---|
3813 | _spentry(builtin_logand) |
---|
3814 | __(movb %arg_y_b,%imm0_b) |
---|
3815 | __(orb %arg_z_b,%imm0_b) |
---|
3816 | __(testb $fixnummask,%imm0_b) |
---|
3817 | __(jne 1f) |
---|
3818 | __(andq %arg_y,%arg_z) |
---|
3819 | __(ret) |
---|
3820 | 1: |
---|
3821 | __(jump_builtin(_builtin_logand,2)) |
---|
3822 | _endsubp(builtin_logand) |
---|
3823 | |
---|
3824 | _spentry(builtin_negate) |
---|
3825 | __(testb $fixnummask,%arg_z_b) |
---|
3826 | __(jne 1f) |
---|
3827 | __(negq %arg_z) |
---|
3828 | __(jo,pn C(fix_one_bit_overflow)) |
---|
3829 | __(repret) |
---|
3830 | 1: |
---|
3831 | __(jump_builtin(_builtin_negate,1)) |
---|
3832 | _endsubp(builtin_negate) |
---|
3833 | |
---|
3834 | _spentry(builtin_logxor) |
---|
3835 | __(movb %arg_y_b,%imm0_b) |
---|
3836 | __(orb %arg_z_b,%imm0_b) |
---|
3837 | __(testb $fixnummask,%imm0_b) |
---|
3838 | __(jne 1f) |
---|
3839 | __(xorq %arg_y,%arg_z) |
---|
3840 | __(ret) |
---|
3841 | 1: |
---|
3842 | __(jump_builtin(_builtin_logxor,2)) |
---|
3843 | _endsubp(builtin_logxor) |
---|
3844 | |
---|
3845 | |
---|
3846 | _spentry(builtin_aset1) |
---|
3847 | __(extract_typecode(%arg_x,%imm0)) |
---|
3848 | __(box_fixnum(%imm0,%temp0)) |
---|
3849 | __(cmpb $min_vector_subtag,%imm0_b) |
---|
3850 | __(ja _SPsubtag_misc_set) |
---|
3851 | __(jump_builtin(_builtin_aset1,3)) |
---|
3852 | _endsubp(builtin_aset1) |
---|
3853 | |
---|
3854 | |
---|
3855 | _spentry(builtin_ash) |
---|
3856 | __(movb %arg_y_b,%imm0_b) |
---|
3857 | __(orb %arg_z_b,%imm0_b) |
---|
3858 | __(testb $fixnummask,%imm0_b) |
---|
3859 | __(jne 9f) |
---|
3860 | __(unbox_fixnum(%arg_y,%imm1)) |
---|
3861 | __(unbox_fixnum(%arg_z,%imm0)) |
---|
3862 | /* Z flag set if zero ASH shift count */ |
---|
3863 | __(jnz 1f) |
---|
3864 | __(movq %arg_y,%arg_z) /* shift by 0 */ |
---|
3865 | __(ret) |
---|
3866 | 1: __(jns 3f) |
---|
3867 | __(rcmpq(%imm0,$-63)) |
---|
3868 | __(jg 2f) |
---|
3869 | __(sar $63,%imm1) |
---|
3870 | __(box_fixnum(%imm1,%arg_z)) |
---|
3871 | __(ret) |
---|
3872 | 2: /* Right-shift by small fixnum */ |
---|
3873 | __(negb %imm0_b) |
---|
3874 | __(movzbl %imm0_b,%ecx) |
---|
3875 | __(sar %cl,%imm1) |
---|
3876 | __(box_fixnum(%imm1,%arg_z)) |
---|
3877 | __(ret) |
---|
3878 | 3: /* Left shift by fixnum. We cant shift by more than 63 bits, though */ |
---|
3879 | /* shifting by 64 is actually easy. */ |
---|
3880 | __(rcmpq(%imm0,$64)) |
---|
3881 | __(jg 9f) |
---|
3882 | __(jne 4f) |
---|
3883 | /* left-shift by 64-bits exactly */ |
---|
3884 | __(xorl %imm0_l,%imm0_l) |
---|
3885 | __(jmp C(makes128)) |
---|
3886 | 4: /* left-shift by 1..63 bits. Safe to move shift count to %rcx/%cl */ |
---|
3887 | __(movzbl %imm0_b,%ecx) /* zero-extending mov */ |
---|
3888 | __(movq %imm1,%imm0) |
---|
3889 | __(sarq $63,%imm1) |
---|
3890 | __(js 5f) |
---|
3891 | __(shld %cl,%imm0,%imm1) |
---|
3892 | __(shl %cl,%imm0) |
---|
3893 | __(jmp C(makes128)) |
---|
3894 | 5: __(shld %cl,%imm0,%imm1) |
---|
3895 | __(shl %cl,%imm0) |
---|
3896 | __(jmp C(makes128)) |
---|
3897 | 9: |
---|
3898 | __(jump_builtin(_builtin_ash,2)) |
---|
3899 | _endsubp(builtin_ash) |
---|
3900 | |
---|
3901 | _spentry(builtin_aref1) |
---|
3902 | __(extract_typecode(%arg_y,%imm0)) |
---|
3903 | __(cmpb $min_vector_subtag,%imm0_b) |
---|
3904 | __(box_fixnum_no_flags(%imm0,%arg_x)) |
---|
3905 | __(ja _SPsubtag_misc_ref) |
---|
3906 | __(jump_builtin(_builtin_aref1,2)) |
---|
3907 | _endsubp(builtin_aref1) |
---|
3908 | |
---|
3909 | /* Arg_z is either a MACPTR containing the function address or a boxed fixnum. */ |
---|
3910 | /* %imm0.b (aka %al) contains the number (0-7) of args passed in FP regs. */ |
---|
3911 | /* On entry, the foreign stack contains a frame containing at least 8 words: */ |
---|
3912 | |
---|
3913 | /* * -> aligned on 16-byte boundary */ |
---|
3914 | /* *backlink <- foreign %rsp */ |
---|
3915 | /* unused */ |
---|
3916 | /* scalar arg 0 passed in %rdi */ |
---|
3917 | /* scalar arg 1 passed in %rsi */ |
---|
3918 | /* scalar arg 2 passed in %rdx */ |
---|
3919 | /* scalar arg 3 passed in %rcx */ |
---|
3920 | /* scalar arg 4 passed in %r8 */ |
---|
3921 | /* scalar arg 5 passed in %r9 */ |
---|
3922 | /* *address of first memory arg */ |
---|
3923 | /* ... */ |
---|
3924 | /* possible scratch space */ |
---|
3925 | /* *previous %rsp value */ |
---|
3926 | |
---|
3927 | /* Any floating-point args will have been loaded into %xmm0-%xmm7 by the caller. */ |
---|
3928 | /* When this returns, the foreign %rsp will contain its previous value, and */ |
---|
3929 | /* the function result will be in %rax (and possibly %rdx) or %xmm0 (+ %xmm1). */ |
---|
3930 | |
---|
3931 | _spentry(ffcall) |
---|
3932 | LocalLabelPrefix[]ffcall: |
---|
3933 | /* Unbox %arg_z. It's either a fixnum or macptr (or bignum) ; |
---|
3934 | if not a fixnum, get the first word */ |
---|
3935 | __(unbox_fixnum(%arg_z,%imm1)) |
---|
3936 | __(testb $fixnummask,%arg_z_b) |
---|
3937 | __(je 0f) |
---|
3938 | __(movq macptr.address(%arg_z),%imm1) |
---|
3939 | 0: |
---|
3940 | /* Save lisp registers */ |
---|
3941 | __(push %rbp) |
---|
3942 | __(movq %rsp,%rbp) |
---|
3943 | __(push %temp0) |
---|
3944 | __(push %temp1) |
---|
3945 | __(push %temp2) |
---|
3946 | __(push %arg_x) |
---|
3947 | __(push %arg_y) |
---|
3948 | __(push %arg_z) |
---|
3949 | __(push %fn) |
---|
3950 | __(push %save0) |
---|
3951 | __(push %save1) |
---|
3952 | __(push %save2) |
---|
3953 | __ifndef([WINDOWS]) |
---|
3954 | __(push %save3) /* 11 registers pushed after %rbp */ |
---|
3955 | __endif |
---|
3956 | __(movq %rsp,rcontext(tcr.save_vsp)) |
---|
3957 | __(movq %rbp,rcontext(tcr.save_rbp)) |
---|
3958 | __(movq $TCR_STATE_FOREIGN,rcontext(tcr.valence)) |
---|
3959 | __(movq rcontext(tcr.foreign_sp),%rsp) |
---|
3960 | __(stmxcsr rcontext(tcr.lisp_mxcsr)) |
---|
3961 | __(emms) |
---|
3962 | __(ldmxcsr rcontext(tcr.foreign_mxcsr)) |
---|
3963 | __(movq (%rsp),%rbp) |
---|
3964 | __ifdef([DARWIN_GS_HACK]) |
---|
3965 | /* At this point, %imm1=%rdx is live (contains |
---|
3966 | the entrypoint) and %imm0.b=%al contains |
---|
3967 | info about xmm register arguments; the lisp registers are |
---|
3968 | all saved, and the foreign arguments are |
---|
3969 | on the foreign stack (about to be popped |
---|
3970 | off). Save the linear TCR address in %save0/%r15 |
---|
3971 | so that we can restore it later, and preserve |
---|
3972 | the entrypoint somewhere where C won't bash it. |
---|
3973 | Note that dereferencing the entrypoint from |
---|
3974 | foreign code has never been safe (unless it's |
---|
3975 | a fixnum */ |
---|
3976 | __(save_tcr_linear(%save0)) |
---|
3977 | __(movq %imm1,%save1) |
---|
3978 | __(movq %imm0,%save2) |
---|
3979 | __(set_foreign_gs_base()) |
---|
3980 | __(movq %save1,%imm1) |
---|
3981 | __(movq %save2,%imm0) |
---|
3982 | __endif |
---|
3983 | __ifdef([WINDOWS]) |
---|
3984 | /* Preserve TCR pointer */ |
---|
3985 | __(movq %rcontext_reg, %save0) |
---|
3986 | __endif |
---|
3987 | LocalLabelPrefix[]ffcall_setup: |
---|
3988 | __(addq $2*node_size,%rsp) |
---|
3989 | __(movq %imm1,%r11) |
---|
3990 | __(pop %carg0) |
---|
3991 | __(pop %carg1) |
---|
3992 | __(pop %carg2) |
---|
3993 | __(pop %carg3) |
---|
3994 | __ifdef([WINDOWS]) |
---|
3995 | __(sub $20, %rsp) /* Make room for arg register spill */ |
---|
3996 | __else |
---|
3997 | __(pop %carg4) |
---|
3998 | __(pop %carg5) |
---|
3999 | __endif |
---|
4000 | LocalLabelPrefix[]ffcall_setup_end: |
---|
4001 | LocalLabelPrefix[]ffcall_call: |
---|
4002 | __(call *%r11) |
---|
4003 | LocalLabelPrefix[]ffcall_call_end: |
---|
4004 | __(movq %rbp,%rsp) |
---|
4005 | __ifdef([DARWIN_GS_HACK]) |
---|
4006 | /* %rax/%rdx contains the return value (maybe), %save0 still |
---|
4007 | contains the linear tcr address. Preserve %rax/%rdx here. */ |
---|
4008 | __(movq %rax,%save1) |
---|
4009 | __(movq %rdx,%save2) |
---|
4010 | __(set_gs_base(%save0)) |
---|
4011 | __(movq %save1,%rax) |
---|
4012 | __(movq %save2,%rdx) |
---|
4013 | __endif |
---|
4014 | __ifdef([WINDOWS]) |
---|
4015 | __(movq %save0, %rcontext_reg) |
---|
4016 | __endif |
---|
4017 | __(movq %rsp,rcontext(tcr.foreign_sp)) |
---|
4018 | __ifndef([WINDOWS]) |
---|
4019 | __(clr %save3) |
---|
4020 | __endif |
---|
4021 | __(clr %save2) |
---|
4022 | __(clr %save1) |
---|
4023 | __(clr %save0) |
---|
4024 | __(clr %arg_z) |
---|
4025 | __(clr %arg_y) |
---|
4026 | __(clr %arg_x) |
---|
4027 | __(clr %temp2) |
---|
4028 | __(clr %temp1) |
---|
4029 | __(clr %temp0) |
---|
4030 | __(clr %fn) |
---|
4031 | __(pxor %fpzero,%fpzero) |
---|
4032 | __(cmpb $0,C(bogus_fp_exceptions)(%rip)) |
---|
4033 | __(je 0f) |
---|
4034 | __(movl %arg_x_l,rcontext(tcr.ffi_exception)) |
---|
4035 | __(jmp 1f) |
---|
4036 | 0: __(stmxcsr rcontext(tcr.ffi_exception)) |
---|
4037 | 1: __(movq rcontext(tcr.save_vsp),%rsp) |
---|
4038 | __(movq rcontext(tcr.save_rbp),%rbp) |
---|
4039 | __(movq $TCR_STATE_LISP,rcontext(tcr.valence)) |
---|
4040 | __ifndef([WINDOWS]) |
---|
4041 | __(pop %save3) |
---|
4042 | __endif |
---|
4043 | __(pop %save2) |
---|
4044 | __(pop %save1) |
---|
4045 | __(pop %save0) |
---|
4046 | __(pop %fn) |
---|
4047 | __(pop %arg_z) |
---|
4048 | __(pop %arg_y) |
---|
4049 | __(pop %arg_x) |
---|
4050 | __(pop %temp2) |
---|
4051 | __(pop %temp1) |
---|
4052 | __(ldmxcsr rcontext(tcr.lisp_mxcsr)) |
---|
4053 | __(check_pending_interrupt(%temp0)) |
---|
4054 | __(pop %temp0) |
---|
4055 | __(leave) |
---|
4056 | __ifdef([DARWIN]) |
---|
4057 | __(btrq $TCR_FLAG_BIT_FOREIGN_EXCEPTION,rcontext(tcr.flags)) |
---|
4058 | __(jc,pn 0f) |
---|
4059 | __endif |
---|
4060 | __(ret) |
---|
4061 | __ifdef([DARWIN]) |
---|
4062 | 0: |
---|
4063 | /* Unboxed foreign exception (likely an NSException) in %imm0. */ |
---|
4064 | /* Box it, then signal a lisp error. */ |
---|
4065 | __(movq %imm0,%imm2) |
---|
4066 | __(movq $macptr_header,%rax) |
---|
4067 | __(Misc_Alloc_Fixed(%arg_z,macptr.size)) |
---|
4068 | __(movq %imm2,macptr.address(%arg_z)) |
---|
4069 | __(movq $XFOREIGNEXCEPTION,%arg_y) |
---|
4070 | __(set_nargs(2)) |
---|
4071 | __(jmp _SPksignalerr) |
---|
4072 | __endif |
---|
4073 | __ifdef([DARWIN]) |
---|
4074 | /* Handle exceptions, for ObjC 2.0 */ |
---|
4075 | LocalLabelPrefix[]ffcallLandingPad: |
---|
4076 | __(movq %rax,%save1) |
---|
4077 | __(cmpq $1,%rdx) |
---|
4078 | __(je 1f) |
---|
4079 | __(movq %rax,%rdi) |
---|
4080 | LocalLabelPrefix[]ffcallUnwindResume: |
---|
4081 | __(call *lisp_global(unwind_resume)) |
---|
4082 | LocalLabelPrefix[]ffcallUnwindResume_end: |
---|
4083 | 1: __(movq %save1,%rdi) |
---|
4084 | LocalLabelPrefix[]ffcallBeginCatch: |
---|
4085 | __(call *lisp_global(objc2_begin_catch)) |
---|
4086 | LocalLabelPrefix[]ffcallBeginCatch_end: |
---|
4087 | __(movq (%rax),%save1) /* indirection is necessary because we don't provide type info in lsda */ |
---|
4088 | LocalLabelPrefix[]ffcallEndCatch: |
---|
4089 | __(call *lisp_global(objc2_end_catch)) |
---|
4090 | LocalLabelPrefix[]ffcallEndCatch_end: |
---|
4091 | __(ref_global(get_tcr,%rax)) |
---|
4092 | __(movq $1,%rdi) |
---|
4093 | __(call *%rax) |
---|
4094 | __(btsq $TCR_FLAG_BIT_FOREIGN_EXCEPTION,tcr.flags(%rax)) |
---|
4095 | __(movq %save1,%rax) |
---|
4096 | __(jmp LocalLabelPrefix[]ffcall_call_end) |
---|
4097 | LocalLabelPrefix[]ffcall_end: |
---|
4098 | __endif |
---|
4099 | _endsubp(ffcall) |
---|
4100 | |
---|
4101 | __ifdef([DARWIN]) |
---|
4102 | .section __DATA,__gcc_except_tab |
---|
4103 | GCC_except_table0: |
---|
4104 | .align 3 |
---|
4105 | LLSDA1: |
---|
4106 | .byte 0xff /* @LPStart format (omit) */ |
---|
4107 | .byte 0x0 /* @TType format (absolute) */ |
---|
4108 | .byte 0x4d /* uleb128 0x4d; @TType base offset */ |
---|
4109 | .byte 0x3 /* call-site format (udata4) */ |
---|
4110 | .byte 0x41 /* uleb128 0x41; Call-site table length */ |
---|
4111 | |
---|
4112 | .long Lffcall_setup-Lffcall /* region 0 start */ |
---|
4113 | .long Lffcall_setup_end-Lffcall_setup /* length */ |
---|
4114 | .long 0x0 /* landing pad */ |
---|
4115 | .byte 0x0 /* uleb128 0x0; action */ |
---|
4116 | |
---|
4117 | .long Lffcall_call-Lffcall /* region 1 start */ |
---|
4118 | .long Lffcall_call_end-Lffcall_call /* length */ |
---|
4119 | .long LffcallLandingPad-Lffcall /* landing pad */ |
---|
4120 | .byte 0x1 /* uleb128 0x1; action */ |
---|
4121 | |
---|
4122 | .long LffcallUnwindResume-Lffcall /* region 2 start */ |
---|
4123 | .long LffcallUnwindResume_end-LffcallUnwindResume /* length */ |
---|
4124 | .long 0x0 /* landing pad */ |
---|
4125 | .byte 0x0 /* uleb128 0x0; action */ |
---|
4126 | |
---|
4127 | .long LffcallBeginCatch-Lffcall /* region 3 start */ |
---|
4128 | .long LffcallBeginCatch_end-LffcallBeginCatch /* length */ |
---|
4129 | .long 0 /* landing pad */ |
---|
4130 | .byte 0x0 /* uleb128 0x0; action */ |
---|
4131 | |
---|
4132 | .long LffcallEndCatch-Lffcall |
---|
4133 | .long LffcallEndCatch_end-LffcallEndCatch /* length */ |
---|
4134 | .long 0x0 /* landing pad */ |
---|
4135 | .byte 0x0 /* uleb128 0x0; action */ |
---|
4136 | .byte 0x1 /* Action record table */ |
---|
4137 | .byte 0x0 |
---|
4138 | .align 3 |
---|
4139 | .quad 0 /* _OBJC_EHTYPE_$_NSException */ |
---|
4140 | .text |
---|
4141 | __endif |
---|
4142 | |
---|
4143 | _spentry(ffcall_return_registers) |
---|
4144 | LocalLabelPrefix[]ffcall_return_registers: |
---|
4145 | /* Unbox %arg_z. It's either a fixnum or macptr (or bignum) ; |
---|
4146 | if not a fixnum, get the first word */ |
---|
4147 | __(unbox_fixnum(%arg_z,%imm1)) |
---|
4148 | __(testb $fixnummask,%arg_z_b) |
---|
4149 | __(je 0f) |
---|
4150 | __(movq macptr.address(%arg_z),%imm1) |
---|
4151 | 0: |
---|
4152 | /* Save lisp registers */ |
---|
4153 | __(push %rbp) |
---|
4154 | __(movq %rsp,%rbp) |
---|
4155 | __(push %temp0) |
---|
4156 | __(push %temp1) |
---|
4157 | __(push %temp2) |
---|
4158 | __(push %arg_x) |
---|
4159 | __(push %arg_y) |
---|
4160 | __(push %arg_z) |
---|
4161 | __(push %save0) |
---|
4162 | __(push %save1) |
---|
4163 | __(push %save2) |
---|
4164 | __ifndef([WINDOWS]) |
---|
4165 | __(push %save3) |
---|
4166 | __endif |
---|
4167 | __(movq macptr.address(%arg_y),%rbx) /* %rbx non-volatile */ |
---|
4168 | __(push %fn) |
---|
4169 | __(movq %rsp,rcontext(tcr.save_vsp)) |
---|
4170 | __(movq %rbp,rcontext(tcr.save_rbp)) |
---|
4171 | __(movq $TCR_STATE_FOREIGN,rcontext(tcr.valence)) |
---|
4172 | __(movq rcontext(tcr.foreign_sp),%rsp) |
---|
4173 | __(stmxcsr rcontext(tcr.lisp_mxcsr)) |
---|
4174 | __(emms) |
---|
4175 | __(ldmxcsr rcontext(tcr.foreign_mxcsr)) |
---|
4176 | __(movq (%rsp),%rbp) |
---|
4177 | __ifdef([DARWIN_GS_HACK]) |
---|
4178 | /* At this point, %imm1=%rdx is live (contains |
---|
4179 | the entrypoint) and %imm0.b=%al contains |
---|
4180 | xmm argument info; the lisp registers are |
---|
4181 | all saved, and the foreign arguments are |
---|
4182 | on the foreign stack (about to be popped |
---|
4183 | off). Save the linear TCR address in %save0/%r15 |
---|
4184 | so that we can restore it later, and preserve |
---|
4185 | the entrypoint somewhere where C won't bash it. |
---|
4186 | Note that dereferencing the entrypoint from |
---|
4187 | foreign code has never been safe (unless it's |
---|
4188 | a fixnum */ |
---|
4189 | __(save_tcr_linear(%save0)) |
---|
4190 | __(movq %imm0,%save1) |
---|
4191 | __(movq %imm1,%save2) |
---|
4192 | __(set_foreign_gs_base()) |
---|
4193 | __(movq %save1,%imm0) |
---|
4194 | __(movq %save2,%imm1) |
---|
4195 | __endif |
---|
4196 | __ifdef([WINDOWS]) |
---|
4197 | /* Preserve TCR pointer */ |
---|
4198 | __(movq %rcontext_reg, %save0) |
---|
4199 | __endif |
---|
4200 | __(movq %imm1,%r11) |
---|
4201 | LocalLabelPrefix[]ffcall_return_registers_setup: |
---|
4202 | __(addq $2*node_size,%rsp) |
---|
4203 | __(pop %carg0) |
---|
4204 | __(pop %carg1) |
---|
4205 | __(pop %carg2) |
---|
4206 | __(pop %carg3) |
---|
4207 | __ifdef([WINDOWS]) |
---|
4208 | __(sub $20, %rsp) /* Make room for arg register spill */ |
---|
4209 | __else |
---|
4210 | __(pop %carg4) |
---|
4211 | __(pop %carg5) |
---|
4212 | __endif |
---|
4213 | LocalLabelPrefix[]ffcall_return_registers_setup_end: |
---|
4214 | LocalLabelPrefix[]ffcall_return_registers_call: |
---|
4215 | __(call *%r11) |
---|
4216 | LocalLabelPrefix[]ffcall_return_registers_call_end: |
---|
4217 | __(movq %rax,(%rbx)) |
---|
4218 | __(movq %rdx,8(%rbx)) |
---|
4219 | __(movsd %xmm0,16(%rbx)) |
---|
4220 | __(movsd %xmm1,24(%rbx)) |
---|
4221 | __(movq %rbp,%rsp) |
---|
4222 | __ifdef([DARWIN_GS_HACK]) |
---|
4223 | /* %rax/%rdx contains the return value (maybe), %save0 still |
---|
4224 | contains the linear tcr address. Preserve %rax/%rdx here. */ |
---|
4225 | __(set_gs_base(%save0)) |
---|
4226 | __(movq (%save2),%rax) |
---|
4227 | __(movq 8(%save2),%rdx) |
---|
4228 | __(movsd 16(%save2),%xmm0) |
---|
4229 | __(movsd 24(%save2),%xmm1) |
---|
4230 | __endif |
---|
4231 | __ifdef([WINDOWS]) |
---|
4232 | __(movq %save0, %rcontext_reg) |
---|
4233 | __endif |
---|
4234 | __(movq %rsp,rcontext(tcr.foreign_sp)) |
---|
4235 | __ifndef([WINDOWS]) |
---|
4236 | __(clr %save3) |
---|
4237 | __endif |
---|
4238 | __(clr %save2) |
---|
4239 | __(clr %save1) |
---|
4240 | __(clr %save0) |
---|
4241 | __(clr %arg_z) |
---|
4242 | __(clr %arg_y) |
---|
4243 | __(clr %arg_x) |
---|
4244 | __(clr %temp2) |
---|
4245 | __(clr %temp1) |
---|
4246 | __(clr %temp0) |
---|
4247 | __(clr %fn) |
---|
4248 | __(pxor %fpzero,%fpzero) |
---|
4249 | __(cmpb $0,C(bogus_fp_exceptions)(%rip)) |
---|
4250 | __(je 0f) |
---|
4251 | __(movl %arg_x_l,rcontext(tcr.ffi_exception)) |
---|
4252 | __(jmp 1f) |
---|
4253 | 0: __(stmxcsr rcontext(tcr.ffi_exception)) |
---|
4254 | 1: __(movq rcontext(tcr.save_vsp),%rsp) |
---|
4255 | __(movq rcontext(tcr.save_rbp),%rbp) |
---|
4256 | __(movq $TCR_STATE_LISP,rcontext(tcr.valence)) |
---|
4257 | __(pop %fn) |
---|
4258 | __ifndef([WINDOWS]) |
---|
4259 | __(pop %save3) |
---|
4260 | __endif |
---|
4261 | __(pop %save2) |
---|
4262 | __(pop %save1) |
---|
4263 | __(pop %save0) |
---|
4264 | __(pop %arg_z) |
---|
4265 | __(pop %arg_y) |
---|
4266 | __(pop %arg_x) |
---|
4267 | __(pop %temp2) |
---|
4268 | __(pop %temp1) |
---|
4269 | __(ldmxcsr rcontext(tcr.lisp_mxcsr)) |
---|
4270 | __(check_pending_interrupt(%temp0)) |
---|
4271 | __(pop %temp0) |
---|
4272 | __(leave) |
---|
4273 | __ifdef([DARWIN]) |
---|
4274 | __(btrq $TCR_FLAG_BIT_FOREIGN_EXCEPTION,rcontext(tcr.flags)) |
---|
4275 | __(jc,pn 0f) |
---|
4276 | __endif |
---|
4277 | __(ret) |
---|
4278 | __ifdef([DARWIN]) |
---|
4279 | 0: |
---|
4280 | /* Unboxed foreign exception (likely an NSException) in %imm0. */ |
---|
4281 | /* Box it, then signal a lisp error. */ |
---|
4282 | __(movq %imm0,%imm2) |
---|
4283 | __(movq $macptr_header,%rax) |
---|
4284 | __(Misc_Alloc_Fixed(%arg_z,macptr.size)) |
---|
4285 | __(movq %imm2,macptr.address(%arg_z)) |
---|
4286 | __(movq $XFOREIGNEXCEPTION,%arg_y) |
---|
4287 | __(set_nargs(2)) |
---|
4288 | __(jmp _SPksignalerr) |
---|
4289 | __endif |
---|
4290 | __ifdef([DARWIN]) |
---|
4291 | /* Handle exceptions, for ObjC 2.0 */ |
---|
4292 | LocalLabelPrefix[]ffcall_return_registersLandingPad: |
---|
4293 | __(movq %rax,%save1) |
---|
4294 | __(cmpq $1,%rdx) |
---|
4295 | __(je 1f) |
---|
4296 | __(movq %rax,%rdi) |
---|
4297 | LocalLabelPrefix[]ffcall_return_registersUnwindResume: |
---|
4298 | __(call *lisp_global(unwind_resume)) |
---|
4299 | LocalLabelPrefix[]ffcall_return_registersUnwindResume_end: |
---|
4300 | 1: __(movq %save1,%rdi) |
---|
4301 | LocalLabelPrefix[]ffcall_return_registersBeginCatch: |
---|
4302 | __(call *lisp_global(objc2_begin_catch)) |
---|
4303 | LocalLabelPrefix[]ffcall_return_registersBeginCatch_end: |
---|
4304 | __(movq (%rax),%save1) /* indirection is necessary because we don't provide type info in lsda */ |
---|
4305 | LocalLabelPrefix[]ffcall_return_registersEndCatch: |
---|
4306 | __(call *lisp_global(objc2_end_catch)) |
---|
4307 | LocalLabelPrefix[]ffcall_return_registersEndCatch_end: |
---|
4308 | __(ref_global(get_tcr,%rax)) |
---|
4309 | __(movq $1,%rdi) |
---|
4310 | __(call *%rax) |
---|
4311 | __(btsq $TCR_FLAG_BIT_FOREIGN_EXCEPTION,tcr.flags(%rax)) |
---|
4312 | __(movq %save1,%rax) |
---|
4313 | __(jmp LocalLabelPrefix[]ffcall_return_registers_call_end) |
---|
4314 | LocalLabelPrefix[]ffcall_return_registers_end: |
---|
4315 | __endif |
---|
4316 | _endsubp(ffcall_returning_registers) |
---|
4317 | |
---|
4318 | __ifdef([DARWIN]) |
---|
4319 | .section __DATA,__gcc_except_tab |
---|
4320 | GCC_except_table1: |
---|
4321 | .align 3 |
---|
4322 | LLSDA2: |
---|
4323 | .byte 0xff /* @LPStart format (omit) */ |
---|
4324 | .byte 0x0 /* @TType format (absolute) */ |
---|
4325 | .byte 0x4d /* uleb128 0x4d; @TType base offset */ |
---|
4326 | .byte 0x3 /* call-site format (udata4) */ |
---|
4327 | .byte 0x41 /* uleb128 0x41; Call-site table length */ |
---|
4328 | |
---|
4329 | .long Lffcall_return_registers_setup-Lffcall_return_registers /* region 0 start */ |
---|
4330 | .long Lffcall_return_registers_setup_end-Lffcall_return_registers_setup /* length */ |
---|
4331 | .long 0x0 /* landing pad */ |
---|
4332 | .byte 0x0 /* uleb128 0x0; action */ |
---|
4333 | |
---|
4334 | .long Lffcall_return_registers_call-Lffcall_return_registers /* region 1 start */ |
---|
4335 | .long Lffcall_return_registers_call_end-Lffcall_return_registers_call /* length */ |
---|
4336 | .long Lffcall_return_registersLandingPad-Lffcall_return_registers /* landing pad */ |
---|
4337 | .byte 0x1 /* uleb128 0x1; action */ |
---|
4338 | |
---|
4339 | .long Lffcall_return_registersUnwindResume-Lffcall_return_registers /* region 2 start */ |
---|
4340 | .long Lffcall_return_registersUnwindResume_end-Lffcall_return_registersUnwindResume /* length */ |
---|
4341 | .long 0x0 /* landing pad */ |
---|
4342 | .byte 0x0 /* uleb128 0x0; action */ |
---|
4343 | |
---|
4344 | .long Lffcall_return_registersBeginCatch-Lffcall_return_registers /* region 3 start */ |
---|
4345 | .long Lffcall_return_registersBeginCatch_end-Lffcall_return_registersBeginCatch /* length */ |
---|
4346 | .long 0 /* landing pad */ |
---|
4347 | .byte 0x0 /* uleb128 0x0; action */ |
---|
4348 | |
---|
4349 | .long Lffcall_return_registersEndCatch-Lffcall_return_registers |
---|
4350 | .long Lffcall_return_registersEndCatch_end-Lffcall_return_registersEndCatch /* length */ |
---|
4351 | .long 0x0 /* landing pad */ |
---|
4352 | .byte 0x0 /* uleb128 0x0; action */ |
---|
4353 | .byte 0x1 /* Action record table */ |
---|
4354 | .byte 0x0 |
---|
4355 | .align 3 |
---|
4356 | .quad 0 /* _OBJC_EHTYPE_$_NSException */ |
---|
4357 | .text |
---|
4358 | __endif |
---|
4359 | |
---|
4360 | _spentry(syscall) |
---|
4361 | /* Save lisp registers */ |
---|
4362 | __(push %rbp) |
---|
4363 | __(movq %rsp,%rbp) |
---|
4364 | __(push %temp0) |
---|
4365 | __(push %temp1) |
---|
4366 | __(push %temp2) |
---|
4367 | __(push %arg_x) |
---|
4368 | __(push %arg_y) |
---|
4369 | __(push %arg_z) |
---|
4370 | __(push %save0) |
---|
4371 | __(push %save1) |
---|
4372 | __(push %save2) |
---|
4373 | __(push %save3) |
---|
4374 | __(push %fn) |
---|
4375 | __(movq %rsp,rcontext(tcr.save_vsp)) |
---|
4376 | __(movq %rbp,rcontext(tcr.save_rbp)) |
---|
4377 | __(movq $TCR_STATE_FOREIGN,rcontext(tcr.valence)) |
---|
4378 | __(movq rcontext(tcr.foreign_sp),%rsp) |
---|
4379 | __(emms) |
---|
4380 | __(movq (%rsp),%rbp) |
---|
4381 | __(addq $2*node_size,%rsp) |
---|
4382 | __(unbox_fixnum(%arg_z,%rax)) |
---|
4383 | __(pop %rdi) |
---|
4384 | __(pop %rsi) |
---|
4385 | __(pop %rdx) |
---|
4386 | __(pop %r10) /* syscalls take 4th param in %r10, not %rcx */ |
---|
4387 | __(pop %r8) |
---|
4388 | __(pop %r9) |
---|
4389 | __(syscall) |
---|
4390 | __ifdef([SYSCALL_SETS_CARRY_ON_ERROR]) |
---|
4391 | __(jnc 0f) |
---|
4392 | __(negq %rax) |
---|
4393 | 0: |
---|
4394 | __endif |
---|
4395 | __(movq %rbp,%rsp) |
---|
4396 | __(movq %rsp,rcontext(tcr.foreign_sp)) |
---|
4397 | __(clr %save3) |
---|
4398 | __(clr %save2) |
---|
4399 | __(clr %save1) |
---|
4400 | __(clr %save0) |
---|
4401 | __(clr %arg_z) |
---|
4402 | __(clr %arg_y) |
---|
4403 | __(clr %arg_x) |
---|
4404 | __(clr %temp2) |
---|
4405 | __(clr %temp1) |
---|
4406 | __(clr %temp0) |
---|
4407 | __(clr %fn) |
---|
4408 | __(pxor %fpzero,%fpzero) |
---|
4409 | __(movq rcontext(tcr.save_vsp),%rsp) |
---|
4410 | __(movq rcontext(tcr.save_rbp),%rbp) |
---|
4411 | __(movq $TCR_STATE_LISP,rcontext(tcr.valence)) |
---|
4412 | __(pop %fn) |
---|
4413 | __(pop %save3) |
---|
4414 | __(pop %save2) |
---|
4415 | __(pop %save1) |
---|
4416 | __(pop %save0) |
---|
4417 | __(pop %arg_z) |
---|
4418 | __(pop %arg_y) |
---|
4419 | __(pop %arg_x) |
---|
4420 | __(pop %temp2) |
---|
4421 | __(pop %temp1) |
---|
4422 | __(check_pending_interrupt(%temp0)) |
---|
4423 | __(pop %temp0) |
---|
4424 | __(leave) |
---|
4425 | __(ret) |
---|
4426 | _endsubp(syscall) |
---|
4427 | |
---|
4428 | /* We need to reserve a frame here if (a) nothing else was already pushed and (b) */ |
---|
4429 | /* we push something (e.g., more than 3 args in the lexpr) */ |
---|
4430 | _spentry(spread_lexprz) |
---|
4431 | new_local_labels() |
---|
4432 | __(movq (%arg_z),%imm0) |
---|
4433 | __(testl %nargs,%nargs) /* anything pushed by caller ? */ |
---|
4434 | __(leaq node_size(%arg_z,%imm0),%imm1) |
---|
4435 | __(jne 0f) /* yes, caller has already created frame. */ |
---|
4436 | __(cmpw $(nargregs*node_size),%imm0_w) /* will we push anything ? */ |
---|
4437 | __(jbe 0f) |
---|
4438 | __(push $reserved_frame_marker) |
---|
4439 | __(push $reserved_frame_marker) |
---|
4440 | 0: __(addw %imm0_w,%nargs_w) |
---|
4441 | __(cmpw $(nargregs*node_size),%imm0_w) |
---|
4442 | __(jae 9f) |
---|
4443 | __(cmpw $(2*node_size),%imm0_w) |
---|
4444 | __(je 2f) |
---|
4445 | __(testw %imm0_w,%imm0_w) |
---|
4446 | __(jne 1f) |
---|
4447 | /* lexpr count was 0; vpop the args that */ |
---|
4448 | /* were pushed by the caller */ |
---|
4449 | __(testl %nargs,%nargs) |
---|
4450 | __(je local_label(all_args_popped)) |
---|
4451 | __(pop %arg_z) |
---|
4452 | local_label(maybe_pop_yx): |
---|
4453 | __(cmpl $(1*node_size),%nargs) |
---|
4454 | __(je local_label(all_args_popped)) |
---|
4455 | __(pop %arg_y) |
---|
4456 | __(cmpl $(2*node_size),%nargs) |
---|
4457 | __(je local_label(all_args_popped)) |
---|
4458 | local_label(pop_arg_x): |
---|
4459 | __(pop %arg_x) |
---|
4460 | local_label(all_args_popped): |
---|
4461 | /* If all args fit in registers but some were pushed */ |
---|
4462 | /* by the caller, discard the reserved frame that the caller */ |
---|
4463 | /* pushed. */ |
---|
4464 | __(cmpw %imm0_w,%nargs_w) |
---|
4465 | __(je local_label(go)) |
---|
4466 | __(cmpl $(nargregs*node_size),%nargs) |
---|
4467 | __(ja local_label(go)) |
---|
4468 | __(addq $(2*node_size),%rsp) |
---|
4469 | local_label(go): |
---|
4470 | __(jmp *%ra0) |
---|
4471 | /* vpush args from the lexpr until we have only */ |
---|
4472 | /* three left, then assign them to arg_x, arg_y, */ |
---|
4473 | /* and arg_z. */ |
---|
4474 | 8: __(cmpw $(4*node_size),%imm0_w) |
---|
4475 | __(lea -1*node_size(%imm0),%imm0) |
---|
4476 | __(push -node_size(%imm1)) |
---|
4477 | __(lea -1*node_size(%imm1),%imm1) |
---|
4478 | 9: __(jne 8b) |
---|
4479 | __(movq -node_size*1(%imm1),%arg_x) |
---|
4480 | __(movq -node_size*2(%imm1),%arg_y) |
---|
4481 | __(movq -node_size*3(%imm1),%arg_z) |
---|
4482 | __(jmp *%ra0) |
---|
4483 | |
---|
4484 | /* lexpr count is two: set arg_y, arg_z from the */ |
---|
4485 | /* lexpr, maybe vpop arg_x */ |
---|
4486 | 2: __(cmpl $(2*node_size),%nargs) |
---|
4487 | __(movq -node_size*1(%imm1),%arg_y) |
---|
4488 | __(movq -node_size*2(%imm1),%arg_z) |
---|
4489 | __(jne local_label(pop_arg_x)) |
---|
4490 | __(jmp *%ra0) |
---|
4491 | /* lexpr count is one: set arg_z from the lexpr, */ |
---|
4492 | /* maybe vpop arg_y, arg_x */ |
---|
4493 | 1: __(movq -node_size*1(%imm1),%arg_z) |
---|
4494 | __(jmp local_label(maybe_pop_yx)) |
---|
4495 | _endsubp(spread_lexprz) |
---|
4496 | |
---|
4497 | |
---|
4498 | |
---|
4499 | |
---|
4500 | /* Callback index in %r11 */ |
---|
4501 | _spentry(callback) |
---|
4502 | __(push %rbp) |
---|
4503 | __(movq %rsp,%rbp) |
---|
4504 | /* C scalar args */ |
---|
4505 | __(push %rdi) /* -8(%rbp) */ |
---|
4506 | __(push %rsi) |
---|
4507 | __(push %rdx) |
---|
4508 | __(push %rcx) |
---|
4509 | __(push %r8) |
---|
4510 | __(push %r9) |
---|
4511 | /* FP arg regs */ |
---|
4512 | __(subq $8*8,%rsp) |
---|
4513 | __(movq %xmm0,7*8(%rsp)) /* -56(%rbp) */ |
---|
4514 | __(movq %xmm1,6*8(%rsp)) |
---|
4515 | __(movq %xmm2,5*8(%rsp)) |
---|
4516 | __(movq %xmm3,4*8(%rsp)) |
---|
4517 | __(movq %xmm4,3*8(%rsp)) |
---|
4518 | __(movq %xmm5,2*8(%rsp)) |
---|
4519 | __(movq %xmm6,1*8(%rsp)) |
---|
4520 | __(movq %xmm7,0*8(%rsp)) |
---|
4521 | /* C NVRs */ |
---|
4522 | __(push %r12) |
---|
4523 | __(push %r13) |
---|
4524 | __(push %r14) |
---|
4525 | __(push %r15) |
---|
4526 | __(push %rbx) |
---|
4527 | __(push %rbp) |
---|
4528 | __ifdef([HAVE_TLS]) |
---|
4529 | /* TCR initialized for lisp ? */ |
---|
4530 | __ifndef([WINDOWS]) /* FIXME */ |
---|
4531 | __(movq %fs:current_tcr@TPOFF+tcr.linear,%rax) |
---|
4532 | __endif |
---|
4533 | __(testq %rax,%rax) |
---|
4534 | __(jne 1f) |
---|
4535 | __endif |
---|
4536 | __(movq %r11,%r12) |
---|
4537 | __(ref_global(get_tcr,%rax)) |
---|
4538 | __(movq $1,%rdi) |
---|
4539 | __(call *%rax) |
---|
4540 | __ifdef([DARWIN_GS_HACK]) |
---|
4541 | /* linear TCR address in now in %rax; callback index was |
---|
4542 | saved in %r12 a moment ago. */ |
---|
4543 | __(set_gs_base(%rax)) |
---|
4544 | __endif |
---|
4545 | __(movq %r12,%r11) |
---|
4546 | 1: /* Align foreign stack for lisp */ |
---|
4547 | __(pushq rcontext(tcr.save_rbp)) /* mark cstack frame's "owner" */ |
---|
4548 | __(pushq rcontext(tcr.foreign_sp)) |
---|
4549 | /* init lisp registers */ |
---|
4550 | __(movq %r11,%rax) |
---|
4551 | __(movq %rsp,rcontext(tcr.foreign_sp)) |
---|
4552 | __(clr %save3) |
---|
4553 | __(clr %save2) |
---|
4554 | __(clr %save1) |
---|
4555 | __(clr %save0) |
---|
4556 | __(clr %arg_z) |
---|
4557 | __(clr %arg_y) |
---|
4558 | __(clr %arg_x) |
---|
4559 | __(clr %temp2) |
---|
4560 | __(clr %temp1) |
---|
4561 | __(clr %temp0) |
---|
4562 | __(clr %fn) |
---|
4563 | __(pxor %fpzero,%fpzero) |
---|
4564 | __(movq rcontext(tcr.save_vsp),%rsp) |
---|
4565 | __(box_fixnum(%rax,%arg_y)) |
---|
4566 | __(movq %rbp,%arg_z) |
---|
4567 | __(movq rcontext(tcr.save_rbp),%rbp) |
---|
4568 | __(movq $TCR_STATE_LISP,rcontext(tcr.valence)) |
---|
4569 | __(movq (%rsp),%save3) |
---|
4570 | __(movq 8(%rsp),%save2) |
---|
4571 | __(movq 16(%rsp),%save1) |
---|
4572 | __(movq 24(%rsp),%save0) |
---|
4573 | __(stmxcsr rcontext(tcr.foreign_mxcsr)) |
---|
4574 | __(andb $~mxcsr_all_exceptions,rcontext(tcr.foreign_mxcsr)) |
---|
4575 | __(ldmxcsr rcontext(tcr.lisp_mxcsr)) |
---|
4576 | __(movq $nrs.callbacks,%fname) |
---|
4577 | __(lea local_label(back_from_callback)(%rip),%ra0) |
---|
4578 | __(set_nargs(2)) |
---|
4579 | __(push %ra0) |
---|
4580 | __(jump_fname()) |
---|
4581 | __(tra(local_label(back_from_callback))) |
---|
4582 | __(movq %rsp,rcontext(tcr.save_vsp)) |
---|
4583 | __(movq %rbp,rcontext(tcr.save_rbp)) |
---|
4584 | __(movq rcontext(tcr.foreign_sp),%rsp) |
---|
4585 | __(stmxcsr rcontext(tcr.lisp_mxcsr)) |
---|
4586 | __(movq $TCR_STATE_FOREIGN,rcontext(tcr.valence)) |
---|
4587 | __(emms) |
---|
4588 | __(pop rcontext(tcr.foreign_sp)) |
---|
4589 | __(addq $node_size,%rsp) |
---|
4590 | __(ldmxcsr rcontext(tcr.foreign_mxcsr)) |
---|
4591 | __ifdef([DARWIN_GS_HACK]) |
---|
4592 | /* Lucky us; nothing is live here */ |
---|
4593 | __(set_foreign_gs_base()) |
---|
4594 | __endif |
---|
4595 | __(pop %rbp) |
---|
4596 | __(pop %rbx) |
---|
4597 | __(pop %r15) |
---|
4598 | __(pop %r14) |
---|
4599 | __(pop %r13) |
---|
4600 | __(pop %r12) |
---|
4601 | __(movq -8(%rbp),%rax) |
---|
4602 | __(movq -16(%rbp),%rdx) |
---|
4603 | __(movq -24(%rbp),%xmm0) |
---|
4604 | __(movq -32(%rbp),%xmm1) |
---|
4605 | __(leave) |
---|
4606 | __(ret) |
---|
4607 | _endsubp(callback) |
---|
4608 | |
---|
4609 | /* arg_x = array, arg_y = i, arg_z = j. Typecheck everything. |
---|
4610 | We don't know whether the array is alleged to be simple or |
---|
4611 | not, and don't know anythng about the element type. */ |
---|
4612 | |
---|
4613 | _spentry(aref2) |
---|
4614 | __(testb $fixnummask,%arg_y_b) |
---|
4615 | __(jne 0f) |
---|
4616 | |
---|
4617 | __(testb $fixnummask,%arg_z_b) |
---|
4618 | __(jne 1f) |
---|
4619 | __(extract_typecode(%arg_x,%imm0)) |
---|
4620 | __(cmpb $subtag_arrayH,%imm0_b) |
---|
4621 | __(jne 2f) |
---|
4622 | __(cmpq $2<<fixnumshift,arrayH.rank(%arg_x)) |
---|
4623 | __(jne 2f) |
---|
4624 | __(cmpq arrayH.dim0(%arg_x),%arg_y) |
---|
4625 | __(jae 3f) |
---|
4626 | __(movq arrayH.dim0+node_size(%arg_x),%imm0) |
---|
4627 | __(cmpq %imm0,%arg_z) |
---|
4628 | __(jae 4f) |
---|
4629 | __(unbox_fixnum(%imm0,%imm0)) |
---|
4630 | __(mulq %arg_y) /* imm0 <- imm0 * arg_y */ |
---|
4631 | __(addq %imm0,%arg_z) |
---|
4632 | __(movq %arg_x,%arg_y) |
---|
4633 | 6: __(addq arrayH.displacement(%arg_y),%arg_z) |
---|
4634 | __(movq arrayH.data_vector(%arg_y),%arg_y) |
---|
4635 | __(extract_subtag(%arg_y,%imm1_b)) |
---|
4636 | __(cmpb $subtag_vectorH,%imm1_b) |
---|
4637 | __(ja C(misc_ref_common)) |
---|
4638 | __(jmp 6b) |
---|
4639 | 0: __(uuo_error_reg_not_fixnum(Rarg_y)) |
---|
4640 | 1: __(uuo_error_reg_not_fixnum(Rarg_z)) |
---|
4641 | 2: __(uuo_error_reg_not_type(Rarg_x,error_object_not_array_2d)) |
---|
4642 | 3: __(uuo_error_array_bounds(Rarg_y,Rarg_x)) |
---|
4643 | 4: __(uuo_error_array_bounds(Rarg_z,Rarg_x)) |
---|
4644 | |
---|
4645 | _endsubp(aref2) |
---|
4646 | |
---|
4647 | /* %temp0 = array, %arg_x = i,%arg_y = j, %arg_z = k */ |
---|
4648 | _spentry(aref3) |
---|
4649 | __(testb $fixnummask,%arg_x_b) |
---|
4650 | __(jne 0f) |
---|
4651 | __(testb $fixnummask,%arg_y_b) |
---|
4652 | __(jne 1f) |
---|
4653 | __(testb $fixnummask,%arg_z_b) |
---|
4654 | __(jne 2f) |
---|
4655 | __(extract_typecode(%temp0,%imm0)) |
---|
4656 | __(cmpb $subtag_arrayH,%imm0_b) |
---|
4657 | __(jne 3f) |
---|
4658 | __(cmpq $3<<fixnumshift,arrayH.rank(%temp0)) |
---|
4659 | __(jne 3f) |
---|
4660 | __(cmpq arrayH.dim0(%temp0),%arg_x) |
---|
4661 | __(jae 5f) |
---|
4662 | __(movq arrayH.dim0+node_size(%temp0),%imm0) |
---|
4663 | __(cmpq %imm0,%arg_y) |
---|
4664 | __(jae 6f) |
---|
4665 | __(unbox_fixnum(%imm0,%imm0)) |
---|
4666 | __(movq arrayH.dim0+(node_size*2)(%temp0),%imm1) |
---|
4667 | __(cmpq %imm1,%arg_z) |
---|
4668 | __(jae 7f) |
---|
4669 | __(unbox_fixnum(%imm1,%imm1)) |
---|
4670 | __(imulq %imm1,%arg_y) |
---|
4671 | __(mulq %imm1) |
---|
4672 | __(imulq %imm0,%arg_x) |
---|
4673 | __(addq %arg_x,%arg_z) |
---|
4674 | __(addq %arg_y,%arg_z) |
---|
4675 | __(movq %temp0,%arg_y) |
---|
4676 | 8: __(addq arrayH.displacement(%arg_y),%arg_z) |
---|
4677 | __(movq arrayH.data_vector(%arg_y),%arg_y) |
---|
4678 | __(extract_subtag(%arg_y,%imm1_b)) |
---|
4679 | __(cmpb $subtag_vectorH,%imm1_b) |
---|
4680 | __(ja C(misc_ref_common)) |
---|
4681 | __(jmp 8b) |
---|
4682 | 0: __(uuo_error_reg_not_fixnum(Rarg_x)) |
---|
4683 | 1: __(uuo_error_reg_not_fixnum(Rarg_y)) |
---|
4684 | 2: __(uuo_error_reg_not_fixnum(Rarg_z)) |
---|
4685 | 3: __(uuo_error_reg_not_type(Rtemp0,error_object_not_array_3d)) |
---|
4686 | 5: __(uuo_error_array_bounds(Rarg_x,Rtemp0)) |
---|
4687 | 6: __(uuo_error_array_bounds(Rarg_y,Rtemp0)) |
---|
4688 | 7: __(uuo_error_array_bounds(Rarg_z,Rtemp0)) |
---|
4689 | |
---|
4690 | _endsubp(aref3) |
---|
4691 | |
---|
4692 | /* As with aref2, but temp0 = array, arg_x = i, arg_y = j, arg_z = new_value */ |
---|
4693 | _spentry(aset2) |
---|
4694 | __(testb $fixnummask,%arg_x_b) |
---|
4695 | __(jne 0f) |
---|
4696 | __(testb $fixnummask,%arg_y_b) |
---|
4697 | __(jne 1f) |
---|
4698 | __(extract_typecode(%temp0,%imm0)) |
---|
4699 | __(cmpb $subtag_arrayH,%imm0_b) |
---|
4700 | __(jne 2f) |
---|
4701 | __(cmpq $2<<fixnumshift,arrayH.rank(%temp0)) |
---|
4702 | __(jne 2f) |
---|
4703 | __(cmpq arrayH.dim0(%temp0),%arg_x) |
---|
4704 | __(jae 4f) |
---|
4705 | __(movq arrayH.dim0+node_size(%temp0),%imm0) |
---|
4706 | __(cmpq %imm0,%arg_y) |
---|
4707 | __(jae 5f) |
---|
4708 | __(unbox_fixnum(%imm0,%imm0)) |
---|
4709 | __(mulq %arg_x) /* imm0 <- imm0 * arg_x */ |
---|
4710 | __(addq %imm0,%arg_y) |
---|
4711 | __(movq %temp0,%arg_x) |
---|
4712 | 6: __(addq arrayH.displacement(%arg_x),%arg_y) |
---|
4713 | __(movq arrayH.data_vector(%arg_x),%arg_x) |
---|
4714 | __(extract_subtag(%arg_x,%imm1_b)) |
---|
4715 | __(cmpb $subtag_vectorH,%imm1_b) |
---|
4716 | __(ja C(misc_set_common)) |
---|
4717 | __(jmp 6b) |
---|
4718 | 0: __(uuo_error_reg_not_fixnum(Rarg_x)) |
---|
4719 | 1: __(uuo_error_reg_not_fixnum(Rarg_y)) |
---|
4720 | 2: __(uuo_error_reg_not_type(Rtemp0,error_object_not_array_2d)) |
---|
4721 | 4: __(uuo_error_array_bounds(Rarg_x,Rtemp0)) |
---|
4722 | 5: __(uuo_error_array_bounds(Rarg_y,Rtemp0)) |
---|
4723 | _endsubp(aset2) |
---|
4724 | |
---|
4725 | /* %temp1 = array, %temp0 = i, %arg_x = j, %arg_y = k, %arg_y = newval. */ |
---|
4726 | |
---|
4727 | _spentry(aset3) |
---|
4728 | __(testb $fixnummask,%temp0_b) |
---|
4729 | __(jne 0f) |
---|
4730 | __(testb $fixnummask,%arg_x_b) |
---|
4731 | __(jne 1f) |
---|
4732 | __(testb $fixnummask,%arg_y_b) |
---|
4733 | __(jne 2f) |
---|
4734 | __(extract_typecode(%temp1,%imm0)) |
---|
4735 | __(cmpb $subtag_arrayH,%imm0_b) |
---|
4736 | __(jne 3f) |
---|
4737 | __(cmpq $3<<fixnumshift,arrayH.rank(%temp1)) |
---|
4738 | __(jne 3f) |
---|
4739 | __(cmpq arrayH.dim0(%temp1),%temp0) |
---|
4740 | __(jae 5f) |
---|
4741 | __(movq arrayH.dim0+node_size(%temp1),%imm0) |
---|
4742 | __(cmpq %imm0,%arg_x) |
---|
4743 | __(jae 6f) |
---|
4744 | __(unbox_fixnum(%imm0,%imm0)) |
---|
4745 | __(movq arrayH.dim0+(node_size*2)(%temp1),%imm1) |
---|
4746 | __(cmpq %imm1,%arg_y) |
---|
4747 | __(jae 7f) |
---|
4748 | __(unbox_fixnum(%imm1,%imm1)) |
---|
4749 | __(imulq %imm1,%arg_x) |
---|
4750 | __(mulq %imm1) |
---|
4751 | __(imulq %imm0,%temp0) |
---|
4752 | __(addq %temp0,%arg_y) |
---|
4753 | __(addq %arg_x,%arg_y) |
---|
4754 | __(movq %temp1,%arg_x) |
---|
4755 | 8: __(addq arrayH.displacement(%arg_x),%arg_y) |
---|
4756 | __(movq arrayH.data_vector(%arg_x),%arg_x) |
---|
4757 | __(extract_subtag(%arg_x,%imm1_b)) |
---|
4758 | __(cmpb $subtag_vectorH,%imm1_b) |
---|
4759 | __(ja C(misc_set_common)) |
---|
4760 | __(jmp 8b) |
---|
4761 | |
---|
4762 | 0: __(uuo_error_reg_not_fixnum(Rtemp0)) |
---|
4763 | 1: __(uuo_error_reg_not_fixnum(Rarg_x)) |
---|
4764 | 2: __(uuo_error_reg_not_fixnum(Rarg_y)) |
---|
4765 | 3: __(uuo_error_reg_not_type(Rtemp1,error_object_not_array_3d)) |
---|
4766 | 5: __(uuo_error_array_bounds(Rtemp0,Rtemp1)) |
---|
4767 | 6: __(uuo_error_array_bounds(Rarg_x,Rtemp1)) |
---|
4768 | 6: __(uuo_error_array_bounds(Rarg_x,Rtemp1)) |
---|
4769 | 7: __(uuo_error_array_bounds(Rarg_y,Rtemp1)) |
---|
4770 | |
---|
4771 | _endsubp(aset3) |
---|
4772 | |
---|
4773 | |
---|
4774 | |
---|
4775 | |
---|
4776 | /* Prepend all but the first five (4 words of code, inner fn) and last */ |
---|
4777 | /* (lfbits) elements of %fn to the "arglist". */ |
---|
4778 | |
---|
4779 | _spentry(call_closure) |
---|
4780 | new_local_labels() |
---|
4781 | __(subq $fulltag_function-fulltag_misc,%fn) |
---|
4782 | __(vector_length(%fn,%imm0)) |
---|
4783 | |
---|
4784 | __(subq $6<<fixnumshift,%imm0) /* imm0 = inherited arg count */ |
---|
4785 | __(lea (%nargs_q,%imm0),%imm1) |
---|
4786 | __(cmpl $nargregs<<fixnumshift,%imm1_l) |
---|
4787 | __(jna,pt local_label(regs_only)) |
---|
4788 | __(pop %ra0) |
---|
4789 | __(cmpl $nargregs<<fixnumshift,%nargs) |
---|
4790 | __(jna,pt local_label(no_insert)) |
---|
4791 | |
---|
4792 | /* Some arguments have already been pushed. Push imm0's worth */ |
---|
4793 | /* of NILs, copy those arguments that have already been vpushed from */ |
---|
4794 | /* the old TOS to the new, then insert all of the inerited args */ |
---|
4795 | /* and go to the function. */ |
---|
4796 | |
---|
4797 | __(movq %imm0,%imm1) |
---|
4798 | local_label(push_nil_loop): |
---|
4799 | __(push $nil_value) |
---|
4800 | __(sub $fixnumone,%imm1) |
---|
4801 | __(jne local_label(push_nil_loop)) |
---|
4802 | |
---|
4803 | /* Need to use arg regs as temporaries here. */ |
---|
4804 | __(movq %rsp,%temp1) |
---|
4805 | __(push %arg_z) |
---|
4806 | __(push %arg_y) |
---|
4807 | __(push %arg_x) |
---|
4808 | __(lea 3*node_size(%rsp,%imm0),%arg_x) |
---|
4809 | __(lea -nargregs<<fixnumshift(%nargs_q),%arg_y) |
---|
4810 | local_label(copy_already_loop): |
---|
4811 | __(movq (%arg_x),%arg_z) |
---|
4812 | __(addq $fixnumone,%arg_x) |
---|
4813 | __(movq %arg_z,(%temp1)) |
---|
4814 | __(addq $fixnumone,%temp1) |
---|
4815 | __(subq $fixnumone,%arg_y) |
---|
4816 | __(jne local_label(copy_already_loop)) |
---|
4817 | |
---|
4818 | __(movl $5<<fixnumshift,%imm1_l) /* skip code, new fn */ |
---|
4819 | local_label(insert_loop): |
---|
4820 | __(movq misc_data_offset(%fn,%imm1),%arg_z) |
---|
4821 | __(addq $node_size,%imm1) |
---|
4822 | __(addl $fixnum_one,%nargs) |
---|
4823 | __(subq $node_size,%arg_x) |
---|
4824 | __(movq %arg_z,(%arg_x)) |
---|
4825 | __(subq $fixnum_one,%imm0) |
---|
4826 | __(jne local_label(insert_loop)) |
---|
4827 | |
---|
4828 | /* Recover the argument registers, pushed earlier */ |
---|
4829 | __(pop %arg_x) |
---|
4830 | __(pop %arg_y) |
---|
4831 | __(pop %arg_z) |
---|
4832 | __(jmp local_label(go)) |
---|
4833 | |
---|
4834 | /* Here if nothing was pushed by the caller. If we're */ |
---|
4835 | /* going to push anything, we have to reserve a stack */ |
---|
4836 | /* frame first. (We'll need to push something if the */ |
---|
4837 | /* sum of %nargs and %imm0 is greater than nargregs) */ |
---|
4838 | |
---|
4839 | local_label(no_insert): |
---|
4840 | __(lea (%nargs_q,%imm0),%imm1) |
---|
4841 | __(cmpq $nargregs<<fixnumshift,%imm1) |
---|
4842 | __(jna local_label(no_insert_no_frame)) |
---|
4843 | /* Reserve space for a stack frame */ |
---|
4844 | __(push $reserved_frame_marker) |
---|
4845 | __(push $reserved_frame_marker) |
---|
4846 | local_label(no_insert_no_frame): |
---|
4847 | /* nargregs or fewer args were already vpushed. */ |
---|
4848 | /* if exactly nargregs, vpush remaining inherited vars. */ |
---|
4849 | __(cmpl $nargregs<<fixnumshift,%nargs) |
---|
4850 | __(movl $5<<fixnumshift,%imm1_l) /* skip code, new fn */ |
---|
4851 | __(leaq 5<<fixnumshift(%imm0),%temp1) |
---|
4852 | __(jnz local_label(set_regs)) |
---|
4853 | local_label(vpush_remaining): |
---|
4854 | __(push misc_data_offset(%fn,%imm1)) |
---|
4855 | __(addq $node_size,%imm1) |
---|
4856 | __(addl $fixnumone,%nargs) |
---|
4857 | __(subq $node_size,%imm0) |
---|
4858 | __(jnz local_label(vpush_remaining)) |
---|
4859 | __(jmp local_label(go)) |
---|
4860 | local_label(set_regs): |
---|
4861 | /* if nargs was > 1 (and we know that it was < 3), it must have */ |
---|
4862 | /* been 2. Set arg_x, then vpush the remaining args. */ |
---|
4863 | __(cmpl $fixnumone,%nargs) |
---|
4864 | __(jle local_label(set_y_z)) |
---|
4865 | local_label(set_arg_x): |
---|
4866 | __(subq $node_size,%temp1) |
---|
4867 | __(movq misc_data_offset(%fn,%temp1),%arg_x) |
---|
4868 | __(addl $fixnumone,%nargs) |
---|
4869 | __(subq $fixnumone,%imm0) |
---|
4870 | __(jne local_label(vpush_remaining)) |
---|
4871 | __(jmp local_label(go)) |
---|
4872 | /* Maybe set arg_y or arg_z, preceding args */ |
---|
4873 | local_label(set_y_z): |
---|
4874 | __(jne local_label(set_arg_z)) |
---|
4875 | /* Set arg_y, maybe arg_x, preceding args */ |
---|
4876 | local_label(set_arg_y): |
---|
4877 | __(subq $node_size,%temp1) |
---|
4878 | __(movq misc_data_offset(%fn,%temp1),%arg_y) |
---|
4879 | __(addl $fixnumone,%nargs) |
---|
4880 | __(subq $fixnum_one,%imm0) |
---|
4881 | __(jnz local_label(set_arg_x)) |
---|
4882 | __(jmp local_label(go)) |
---|
4883 | local_label(set_arg_z): |
---|
4884 | __(subq $node_size,%temp1) |
---|
4885 | __(movq misc_data_offset(%fn,%temp1),%arg_z) |
---|
4886 | __(addl $fixnumone,%nargs) |
---|
4887 | __(subq $fixnum_one,%imm0) |
---|
4888 | __(jne local_label(set_arg_y)) |
---|
4889 | local_label(go): |
---|
4890 | __(movq misc_data_offset+(4*node_size)(%fn),%fn) |
---|
4891 | __(push %ra0) |
---|
4892 | __(jmp *%fn) |
---|
4893 | local_label(regs_only): |
---|
4894 | __(leaq 5<<fixnumshift(%imm0),%temp1) |
---|
4895 | __(testl %nargs,%nargs) |
---|
4896 | __(jne local_label(some_args)) |
---|
4897 | __(cmpw $node_size,%imm0) |
---|
4898 | __(movq misc_data_offset-node_size(%fn,%temp1),%arg_z) |
---|
4899 | __(je local_label(rgo)) |
---|
4900 | __(cmpw $2*node_size,%imm0) |
---|
4901 | __(movq misc_data_offset-(node_size*2)(%fn,%temp1),%arg_y) |
---|
4902 | __(je local_label(rgo)) |
---|
4903 | __(movq misc_data_offset-(node_size*3)(%fn,%temp1),%arg_x) |
---|
4904 | local_label(rgo): |
---|
4905 | __(addw %imm0_w,%nargs_w) |
---|
4906 | __(jmp *misc_data_offset+(4*node_size)(%fn)) |
---|
4907 | local_label(some_args): |
---|
4908 | __(cmpl $2*node_size,%nargs) |
---|
4909 | __(jz local_label(rtwo)) |
---|
4910 | /* One arg was passed, could be one or two inherited args */ |
---|
4911 | __(cmpw $node_size,%imm0) |
---|
4912 | __(movq misc_data_offset-node_size(%fn,%temp1),%arg_y) |
---|
4913 | __(je local_label(rgo)) |
---|
4914 | __(movq misc_data_offset-(node_size*2)(%fn,%temp1),%arg_x) |
---|
4915 | __(jmp local_label(rgo)) |
---|
4916 | local_label(rtwo): |
---|
4917 | __(movq misc_data_offset-node_size(%fn,%temp1),%arg_x) |
---|
4918 | __(jmp local_label(rgo)) |
---|
4919 | _endsubp(call_closure) |
---|
4920 | |
---|
4921 | |
---|
4922 | _spentry(poweropen_callbackX) |
---|
4923 | _endsubp(poweropen_callbackX) |
---|
4924 | |
---|
4925 | |
---|
4926 | _spentry(poweropen_ffcallX) |
---|
4927 | _endsubp(poweropen_ffcallX) |
---|
4928 | |
---|
4929 | _spentry(poweropen_syscall) |
---|
4930 | _endsubp(poweropen_syscall) |
---|
4931 | |
---|
4932 | _spentry(eabi_ff_call) |
---|
4933 | _endsubp(eabi_ff_call) |
---|
4934 | |
---|
4935 | _spentry(eabi_callback) |
---|
4936 | _endsubp(eabi_callback) |
---|
4937 | |
---|
4938 | |
---|
4939 | /* Unused, and often not used on PPC either */ |
---|
4940 | _spentry(callbuiltin) |
---|
4941 | __(int $3) |
---|
4942 | _endsubp(callbuiltin) |
---|
4943 | |
---|
4944 | _spentry(callbuiltin0) |
---|
4945 | __(int $3) |
---|
4946 | _endsubp(callbuiltin0) |
---|
4947 | |
---|
4948 | _spentry(callbuiltin1) |
---|
4949 | __(int $3) |
---|
4950 | _endsubp(callbuiltin1) |
---|
4951 | |
---|
4952 | _spentry(callbuiltin2) |
---|
4953 | __(int $3) |
---|
4954 | _endsubp(callbuiltin2) |
---|
4955 | |
---|
4956 | _spentry(callbuiltin3) |
---|
4957 | __(int $3) |
---|
4958 | _endsubp(callbuiltin3) |
---|
4959 | |
---|
4960 | _spentry(restorefullcontext) |
---|
4961 | __(int $3) |
---|
4962 | _endsubp(restorefullcontext) |
---|
4963 | |
---|
4964 | _spentry(savecontextvsp) |
---|
4965 | __(int $3) |
---|
4966 | _endsubp(savecontextvsp) |
---|
4967 | |
---|
4968 | _spentry(savecontext0) |
---|
4969 | __(int $3) |
---|
4970 | _endsubp(savecontext0) |
---|
4971 | |
---|
4972 | _spentry(restorecontext) |
---|
4973 | __(int $3) |
---|
4974 | _endsubp(restorecontext) |
---|
4975 | |
---|
4976 | _spentry(stkconsyz) |
---|
4977 | __(int $3) |
---|
4978 | _endsubp(stkconsyz) |
---|
4979 | |
---|
4980 | _spentry(stkvcell0) |
---|
4981 | __(int $3) |
---|
4982 | _endsubp(stkvcell0) |
---|
4983 | |
---|
4984 | _spentry(stkvcellvsp) |
---|
4985 | __(int $3) |
---|
4986 | _endsubp(stkvcellvsp) |
---|
4987 | |
---|
4988 | _spentry(breakpoint) |
---|
4989 | __(int $3) |
---|
4990 | _endsubp(breakpoint) |
---|
4991 | |
---|
4992 | |
---|
4993 | |
---|
4994 | |
---|
4995 | _spentry(unused_5) |
---|
4996 | __(int $3) |
---|
4997 | _endsubp(unused_5) |
---|
4998 | |
---|
4999 | _spentry(unused_6) |
---|
5000 | __(int $3) |
---|
5001 | _endsubp(unused_6) |
---|
5002 | |
---|
5003 | __ifdef([DARWIN]) |
---|
5004 | .if 1 |
---|
5005 | .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support |
---|
5006 | EH_frame1: |
---|
5007 | .set L$set$12,LECIE1-LSCIE1 |
---|
5008 | .long L$set$12 /* Length of Common Information Entry */ |
---|
5009 | LSCIE1: |
---|
5010 | .long 0x0 /* CIE Identifier Tag */ |
---|
5011 | .byte 0x1 /* CIE Version */ |
---|
5012 | .ascii "zPLR\0" /* CIE Augmentation */ |
---|
5013 | .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ |
---|
5014 | .byte 0x78 /* sleb128 -8; CIE Data Alignment Factor */ |
---|
5015 | .byte 0x10 /* CIE RA Column */ |
---|
5016 | .byte 0xb /* uleb128 0xb; Augmentation size */ |
---|
5017 | .byte 0x8c /* Personality (indirect sdata8) */ |
---|
5018 | .quad lisp_global(objc_2_personality) |
---|
5019 | .byte 0x10 /* LSDA Encoding (pcrel) */ |
---|
5020 | .byte 0x10 /* FDE Encoding (pcrel) */ |
---|
5021 | .byte 0xc /* DW_CFA_def_cfa */ |
---|
5022 | .byte 0x7 /* uleb128 0x7 */ |
---|
5023 | .byte 0x8 /* uleb128 0x8 */ |
---|
5024 | .byte 0x90 /* DW_CFA_offset, column 0x10 */ |
---|
5025 | .byte 0x1 /* uleb128 0x1 */ |
---|
5026 | .align 3 |
---|
5027 | LECIE1: |
---|
5028 | .globl _SPffcall.eh |
---|
5029 | _SPffcall.eh: |
---|
5030 | .long LEFDEffcall-LSFDEffcall |
---|
5031 | LSFDEffcall: |
---|
5032 | .long LSFDEffcall-EH_frame1 /* FDE CIE offset */ |
---|
5033 | .quad Lffcall-. /* FDE Initial Location */ |
---|
5034 | .quad Lffcall_end-Lffcall /* FDE address range */ |
---|
5035 | .byte 8 /* uleb128 0x8; Augmentation size */ |
---|
5036 | .quad LLSDA1-. /* Language Specific Data Area */ |
---|
5037 | .byte 0x4 /* DW_CFA_advance_loc4 */ |
---|
5038 | .long Lffcall_setup-Lffcall |
---|
5039 | .byte 0xe /* DW_CFA_def_cfa_offset */ |
---|
5040 | .byte 0x10 /* uleb128 0x10 */ |
---|
5041 | .byte 0x86 /* DW_CFA_offset, column 0x6 */ |
---|
5042 | .byte 0x2 /* uleb128 0x2 */ |
---|
5043 | .byte 0x4 /* DW_CFA_advance_loc4 */ |
---|
5044 | .long Lffcall_setup_end-Lffcall_setup |
---|
5045 | .byte 0xd /* DW_CFA_def_cfa_register */ |
---|
5046 | .byte 0x6 /* uleb128 0x6 */ |
---|
5047 | .byte 0x4 /* DW_CFA_advance_loc4 */ |
---|
5048 | .long Lffcall_call_end-Lffcall_call |
---|
5049 | .byte 0x83 /* DW_CFA_offset, column 0x3 */ |
---|
5050 | .byte 0x3 /* uleb128 0x3 */ |
---|
5051 | .align 3 |
---|
5052 | LEFDEffcall: |
---|
5053 | .globl _SPffcall_return_registers.eh |
---|
5054 | _SPffcall_return_registers.eh: |
---|
5055 | .long LEFDEffcall_return_registers-LSFDEffcall_return_registers |
---|
5056 | LSFDEffcall_return_registers: |
---|
5057 | .long LSFDEffcall_return_registers-EH_frame1 /* FDE CIE offset */ |
---|
5058 | .quad Lffcall_return_registers-. /* FDE Initial Location */ |
---|
5059 | .quad Lffcall_return_registers_end-Lffcall_return_registers /* FDE address range */ |
---|
5060 | .byte 8 /* uleb128 0x8; Augmentation size */ |
---|
5061 | .quad LLSDA2-. /* Language Specific Data Area */ |
---|
5062 | .byte 0x4 /* DW_CFA_advance_loc4 */ |
---|
5063 | .long Lffcall_return_registers_setup-Lffcall_return_registers |
---|
5064 | .byte 0xe /* DW_CFA_def_cfa_offset */ |
---|
5065 | .byte 0x10 /* uleb128 0x10 */ |
---|
5066 | .byte 0x86 /* DW_CFA_offset, column 0x6 */ |
---|
5067 | .byte 0x2 /* uleb128 0x2 */ |
---|
5068 | .byte 0x4 /* DW_CFA_advance_loc4 */ |
---|
5069 | .long Lffcall_return_registers_setup_end-Lffcall_return_registers_setup |
---|
5070 | .byte 0xd /* DW_CFA_def_cfa_register */ |
---|
5071 | .byte 0x6 /* uleb128 0x6 */ |
---|
5072 | .byte 0x4 /* DW_CFA_advance_loc4 */ |
---|
5073 | .long Lffcall_return_registers_call_end-Lffcall_return_registers_call |
---|
5074 | .byte 0x83 /* DW_CFA_offset, column 0x3 */ |
---|
5075 | .byte 0x3 /* uleb128 0x3 */ |
---|
5076 | .align 3 |
---|
5077 | LEFDEffcall_return_registers: |
---|
5078 | .text |
---|
5079 | .endif |
---|
5080 | __endif |
---|
5081 | |
---|
5082 | |
---|