source: branches/working-0711/ccl/lisp-kernel/x86-spentry64.s @ 7960

Last change on this file since 7960 was 7960, checked in by gb, 12 years ago

Try to avoid branching around UUOs, since some implemenations don't
do a very good job of predicting forward branches to be taken.

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