source: branches/ia32/lisp-kernel/x86-spentry32.s @ 8253

Last change on this file since 8253 was 8253, checked in by rme, 12 years ago

Work in progress.

File size: 43.3 KB
Line 
1        include(lisp.s)
2        _beginfile
3       
4        .align 2
5define([_spentry],[ifdef([__func_name],[_endfn],[])
6        .p2align 3
7        _exportfn(_SP$1)
8])
9
10define([_endsubp],[
11        _endfn(_SP$1)
12])
13
14define([jump_builtin],[
15        ref_nrs_value(builtin_functions,%fname)
16        set_nargs($2)
17        vrefr(%fname,%fname,$1)
18        jump_fname()
19])
20
21_spentry(bad_funcall)   
22        .globl C(bad_funcall)   
23__(tra(C(bad_funcall)))
24        __(uuo_error_not_callable)
25_endsubp(bad_funcall)
26
27/* %arg_z has overflowed by one bit.  Make a bignum with 1 (32-bit) digit. */
28_spentry(fix_overflow)
29C(fix_one_bit_overflow):
30        __(movl $one_digit_bignum_header,%imm0)
31        __(movd %imm0,%mm0)
32        __(Misc_Alloc_Fixed([],aligned_bignum_size(1)))
33        __(unbox_fixnum(%arg_z,%imm0))
34        __(xor $0xc0000000,%imm0)
35        __(mov %temp0,%arg_z)
36        __(movl %imm0,misc_data_offset(%arg_z))
37        __(ret)
38_endsubp(fix_overflow)
39
40_spentry(misc_ref)
41        __(int $3)
42_endsubp(misc_ref)
43
44/* %imm0 = subtag, %arg_y = uvector, %arg_z = index. */
45/* Bounds/type-checking done in caller. */
46_startfn(C(misc_ref_common))
47        __(shll $word_shift,%imm0)
48        __(addl $local_label(misc_ref_jmp),%imm0)
49        __(jmp (%imm0))
50        .p2align 2
51local_label(misc_ref_jmp):
52        /* 00-0f */
53        .long local_label(misc_ref_invalid) /* 00 even_fixnum  */
54        .long local_label(misc_ref_invalid) /* 01 cons  */
55        .long local_label(misc_ref_invalid) /* 02 nodeheader  */
56        .long local_label(misc_ref_invalid) /* 03 imm  */
57        .long local_label(misc_ref_invalid) /* 04 odd_fixnum  */
58        .long local_label(misc_ref_invalid) /* 05 tra  */
59        .long local_label(misc_ref_invalid) /* 06 misc  */
60        .long local_label(misc_ref_u32) /* 07 bignum  */
61        .long local_label(misc_ref_invalid) /* 08 even_fixnum  */
62        .long local_label(misc_ref_invalid) /* 09 cons  */
63        .long local_label(misc_ref_node) /* 0a ratio  */
64        .long local_label(misc_ref_invalid) /* 0b imm  */
65        .long local_label(misc_ref_invalid) /* 0c odd_fixnum  */
66        .long local_label(misc_ref_invalid) /* 0d tra  */
67        .long local_label(misc_ref_invalid) /* 0e misc  */
68        .long local_label(misc_ref_u32) /* 0f single_float  */
69        /* 10-1*/
70        .long local_label(misc_ref_invalid) /* 10 even_fixnum  */
71        .long local_label(misc_ref_invalid) /* 11 cons  */
72        .long local_label(misc_ref_invalid) /* 12 nodeheader  */
73        .long local_label(misc_ref_invalid) /* 13 imm  */
74        .long local_label(misc_ref_invalid) /* 14 odd_fixnum  */
75        .long local_label(misc_ref_invalid) /* 15 tra  */
76        .long local_label(misc_ref_invalid) /* 16 misc  */
77        .long local_label(misc_ref_u32) /* 17 double_float  */
78        .long local_label(misc_ref_invalid) /* 18 even_fixnum  */
79        .long local_label(misc_ref_invalid) /* 19 cons  */
80        .long local_label(misc_ref_node) /* 1a complex  */
81        .long local_label(misc_ref_invalid) /* 1b imm  */
82        .long local_label(misc_ref_invalid) /* 1c odd_fixnum  */
83        .long local_label(misc_ref_invalid) /* 1d tra  */
84        .long local_label(misc_ref_invalid) /* 1e misc  */
85        .long local_label(misc_ref_u32) /* 1f macptr  */
86        /* 20-2*/
87        .long local_label(misc_ref_invalid) /* 20 even_fixnum  */
88        .long local_label(misc_ref_invalid) /* 21 cons  */
89        .long local_label(misc_ref_invalid) /* 22 catch_frame  */
90        .long local_label(misc_ref_invalid) /* 23 imm  */
91        .long local_label(misc_ref_invalid) /* 24 odd_fixnum  */
92        .long local_label(misc_ref_invalid) /* 25 tra  */
93        .long local_label(misc_ref_invalid) /* 26 misc  */
94        .long local_label(misc_ref_u32) /* 27 dead_macptr  */
95        .long local_label(misc_ref_invalid) /* 28 even_fixnum  */
96        .long local_label(misc_ref_invalid) /* 29 cons  */
97        .long local_label(misc_ref_function) /* 2a function  */
98        .long local_label(misc_ref_invalid) /* 2b imm  */
99        .long local_label(misc_ref_invalid) /* 2c odd_fixnum  */
100        .long local_label(misc_ref_invalid) /* 2d tra  */
101        .long local_label(misc_ref_invalid) /* 2e misc  */
102        .long local_label(misc_ref_invalid) /* 2f immheader  */
103        /* 30-3*/
104        .long local_label(misc_ref_invalid) /* 30 even_fixnum  */
105        .long local_label(misc_ref_invalid) /* 31 cons  */
106        .long local_label(misc_ref_invalid) /* 32 nodeheader  */
107        .long local_label(misc_ref_invalid) /* 33 imm  */
108        .long local_label(misc_ref_invalid) /* 34 odd_fixnum  */
109        .long local_label(misc_ref_invalid) /* 35 tra  */
110        .long local_label(misc_ref_invalid) /* 36 misc  */
111        .long local_label(misc_ref_invalid) /* 37 immheader  */
112        .long local_label(misc_ref_invalid) /* 38 even_fixnum  */
113        .long local_label(misc_ref_invalid) /* 39 cons  */
114        .long local_label(misc_ref_node) /* 3a symbol  */
115        .long local_label(misc_ref_invalid) /* 3b imm  */
116        .long local_label(misc_ref_invalid) /* 3c odd_fixnum  */
117        .long local_label(misc_ref_invalid) /* 3d tra  */
118        .long local_label(misc_ref_invalid) /* 3e misc  */
119        .long local_label(misc_ref_u32) /* 3f xcode_vector  */
120        /* 40-4*/
121        .long local_label(misc_ref_invalid) /* 40 even_fixnum  */
122        .long local_label(misc_ref_invalid) /* 41 cons  */
123        .long local_label(misc_ref_node) /* 42 lock  */
124        .long local_label(misc_ref_invalid) /* 43 imm  */
125        .long local_label(misc_ref_invalid) /* 44 odd_fixnum  */
126        .long local_label(misc_ref_invalid) /* 45 tra  */
127        .long local_label(misc_ref_invalid) /* 46 misc  */
128        .long local_label(misc_ref_invalid) /* 47 immheader  */
129        .long local_label(misc_ref_invalid) /* 48 even_fixnum  */
130        .long local_label(misc_ref_invalid) /* 49 cons  */
131        .long local_label(misc_ref_node) /* 4a hash_vector  */
132        .long local_label(misc_ref_invalid) /* 4b imm  */
133        .long local_label(misc_ref_invalid) /* 4c odd_fixnum  */
134        .long local_label(misc_ref_invalid) /* 4d tra  */
135        .long local_label(misc_ref_invalid) /* 4e misc  */
136        .long local_label(misc_ref_invalid) /* 4f immheader  */
137        /* 50-5*/
138        .long local_label(misc_ref_invalid) /* 50 even_fixnum  */
139        .long local_label(misc_ref_invalid) /* 51 cons  */
140        .long local_label(misc_ref_node) /* 52 pool  */
141        .long local_label(misc_ref_invalid) /* 53 imm  */
142        .long local_label(misc_ref_invalid) /* 54 odd_fixnum  */
143        .long local_label(misc_ref_invalid) /* 55 tra  */
144        .long local_label(misc_ref_invalid) /* 56 misc  */
145        .long local_label(misc_ref_invalid) /* 57 immheader  */
146        .long local_label(misc_ref_invalid) /* 58 even_fixnum  */
147        .long local_label(misc_ref_invalid) /* 59 cons  */
148        .long local_label(misc_ref_node) /* 5a weak  */
149        .long local_label(misc_ref_invalid) /* 5b imm  */
150        .long local_label(misc_ref_invalid) /* 5c odd_fixnum  */
151        .long local_label(misc_ref_invalid) /* 5d tra  */
152        .long local_label(misc_ref_invalid) /* 5e misc  */
153        .long local_label(misc_ref_invalid) /* 5f immheader  */
154        /* 60-6*/
155        .long local_label(misc_ref_invalid) /* 60 even_fixnum  */
156        .long local_label(misc_ref_invalid) /* 61 cons  */
157        .long local_label(misc_ref_node) /* 62 package  */
158        .long local_label(misc_ref_invalid) /* 63 imm  */
159        .long local_label(misc_ref_invalid) /* 64 odd_fixnum  */
160        .long local_label(misc_ref_invalid) /* 65 tra  */
161        .long local_label(misc_ref_invalid) /* 66 misc  */
162        .long local_label(misc_ref_invalid) /* 67 immheader  */
163        .long local_label(misc_ref_invalid) /* 68 even_fixnum  */
164        .long local_label(misc_ref_invalid) /* 69 cons  */
165        .long local_label(misc_ref_node) /* 6a slot_vector  */
166        .long local_label(misc_ref_invalid) /* 6b imm  */
167        .long local_label(misc_ref_invalid) /* 6c odd_fixnum  */
168        .long local_label(misc_ref_invalid) /* 6d tra  */
169        .long local_label(misc_ref_invalid) /* 6e misc  */
170        .long local_label(misc_ref_invalid) /* 6f immheader  */
171        /* 70-7*/
172        .long local_label(misc_ref_invalid) /* 70 even_fixnum  */
173        .long local_label(misc_ref_invalid) /* 71 cons  */
174        .long local_label(misc_ref_node) /* 72 instance  */
175        .long local_label(misc_ref_invalid) /* 73 imm  */
176        .long local_label(misc_ref_invalid) /* 74 odd_fixnum  */
177        .long local_label(misc_ref_invalid) /* 75 tra  */
178        .long local_label(misc_ref_invalid) /* 76 misc  */
179        .long local_label(misc_ref_invalid) /* 77 immheader  */
180        .long local_label(misc_ref_invalid) /* 78 even_fixnum  */
181        .long local_label(misc_ref_invalid) /* 79 cons  */
182        .long local_label(misc_ref_node) /* 7a struct  */
183        .long local_label(misc_ref_invalid) /* 7b imm  */
184        .long local_label(misc_ref_invalid) /* 7c odd_fixnum  */
185        .long local_label(misc_ref_invalid) /* 7d tra  */
186        .long local_label(misc_ref_invalid) /* 7e misc  */
187        .long local_label(misc_ref_invalid) /* 7f immheader  */
188        /* 80-8*/
189        .long local_label(misc_ref_invalid) /* 80 even_fixnum  */
190        .long local_label(misc_ref_invalid) /* 81 cons  */
191        .long local_label(misc_ref_node) /* 82 istruct  */
192        .long local_label(misc_ref_invalid) /* 83 imm  */
193        .long local_label(misc_ref_invalid) /* 84 odd_fixnum  */
194        .long local_label(misc_ref_invalid) /* 85 tra  */
195        .long local_label(misc_ref_invalid) /* 86 misc  */
196        .long local_label(misc_ref_invalid) /* 87 immheader  */
197        .long local_label(misc_ref_invalid) /* 88 even_fixnum  */
198        .long local_label(misc_ref_invalid) /* 89 cons  */
199        .long local_label(misc_ref_node) /* 8a value_cell  */
200        .long local_label(misc_ref_invalid) /* 8b imm  */
201        .long local_label(misc_ref_invalid) /* 8c odd_fixnum  */
202        .long local_label(misc_ref_invalid) /* 8d tra  */
203        .long local_label(misc_ref_invalid) /* 8e misc  */
204        .long local_label(misc_ref_invalid) /* 8f immheader  */
205        /* 90-9*/
206        .long local_label(misc_ref_invalid) /* 90 even_fixnum  */
207        .long local_label(misc_ref_invalid) /* 91 cons  */
208        .long local_label(misc_ref_node) /* 92 xfunction  */
209        .long local_label(misc_ref_invalid) /* 93 imm  */
210        .long local_label(misc_ref_invalid) /* 94 odd_fixnum  */
211        .long local_label(misc_ref_invalid) /* 95 tra  */
212        .long local_label(misc_ref_invalid) /* 96 misc  */
213        .long local_label(misc_ref_invalid) /* 97 immheader  */
214        .long local_label(misc_ref_invalid) /* 98 even_fixnum  */
215        .long local_label(misc_ref_invalid) /* 99 cons  */
216        .long local_label(misc_ref_node) /* 9a arrayN  */
217        .long local_label(misc_ref_invalid) /* 9b imm  */
218        .long local_label(misc_ref_invalid) /* 9c odd_fixnum  */
219        .long local_label(misc_ref_invalid) /* 9d tra  */
220        .long local_label(misc_ref_invalid) /* 9e misc  */
221        .long local_label(misc_ref_invalid) /* 9f immheader  */
222        /* a0-af  */
223        .long local_label(misc_ref_invalid) /* a0 even_fixnum  */
224        .long local_label(misc_ref_invalid) /* a1 cons  */
225        .long local_label(misc_ref_node) /* a2 vectorH  */
226        .long local_label(misc_ref_invalid) /* a3 imm  */
227        .long local_label(misc_ref_invalid) /* a4 odd_fixnum  */
228        .long local_label(misc_ref_invalid) /* a5 tra  */
229        .long local_label(misc_ref_invalid) /* a6 misc  */
230        .long local_label(misc_ref_single_float_vector) /* a7 sf_vector  */
231        .long local_label(misc_ref_invalid) /* a8 even_fixnum  */
232        .long local_label(misc_ref_invalid) /* a9 cons  */
233        .long local_label(misc_ref_node) /* aa simple_vector  */
234        .long local_label(misc_ref_invalid) /* ab imm  */
235        .long local_label(misc_ref_invalid) /* ac odd_fixnum  */
236        .long local_label(misc_ref_invalid) /* ad tra  */
237        .long local_label(misc_ref_invalid) /* ae misc  */
238        .long local_label(misc_ref_u32) /* af u32  */
239        /* b0-bf  */
240        .long local_label(misc_ref_invalid) /* b0 even_fixnum  */
241        .long local_label(misc_ref_invalid) /* b1 cons  */
242        .long local_label(misc_ref_invalid) /* b2 nodeheader  */
243        .long local_label(misc_ref_invalid) /* b3 imm  */
244        .long local_label(misc_ref_invalid) /* b4 odd_fixnum  */
245        .long local_label(misc_ref_invalid) /* b5 tra  */
246        .long local_label(misc_ref_invalid) /* b6 misc  */
247        .long local_label(misc_ref_s32) /* b7 s32  */
248        .long local_label(misc_ref_invalid) /* b8 even_fixnum  */
249        .long local_label(misc_ref_invalid) /* b9 cons  */
250        .long local_label(misc_ref_invalid) /* ba nodeheader  */
251        .long local_label(misc_ref_invalid) /* bb imm  */
252        .long local_label(misc_ref_invalid) /* bc odd_fixnum  */
253        .long local_label(misc_ref_invalid) /* bd tra  */
254        .long local_label(misc_ref_invalid) /* be misc  */
255        .long local_label(misc_ref_fixnum_vector) /* bf fixnum_vector  */
256        /* c0-cf  */
257        .long local_label(misc_ref_invalid) /* c0 even_fixnum  */
258        .long local_label(misc_ref_invalid) /* c1 cons  */
259        .long local_label(misc_ref_invalid) /* c2 nodeheader  */
260        .long local_label(misc_ref_invalid) /* c3 imm  */
261        .long local_label(misc_ref_invalid) /* c4 odd_fixnum  */
262        .long local_label(misc_ref_invalid) /* c5 tra  */
263        .long local_label(misc_ref_invalid) /* c6 misc  */
264        .long local_label(misc_ref_string) /* c7 simple_base_string  */
265        .long local_label(misc_ref_invalid) /* c8 even_fixnum  */
266        .long local_label(misc_ref_invalid) /* c9 cons  */
267        .long local_label(misc_ref_invalid) /* ca nodeheader  */
268        .long local_label(misc_ref_invalid) /* cb imm  */
269        .long local_label(misc_ref_invalid) /* cc odd_fixnum  */
270        .long local_label(misc_ref_invalid) /* cd tra  */
271        .long local_label(misc_ref_invalid) /* ce misc  */
272        .long local_label(misc_ref_u8) /* cf u8  */
273        /* d0-df  */
274        .long local_label(misc_ref_invalid) /* d0 even_fixnum  */
275        .long local_label(misc_ref_invalid) /* d1 cons  */
276        .long local_label(misc_ref_invalid) /* d2 nodeheader  */
277        .long local_label(misc_ref_invalid) /* d3 imm  */
278        .long local_label(misc_ref_invalid) /* d4 odd_fixnum  */
279        .long local_label(misc_ref_invalid) /* d5 tra  */
280        .long local_label(misc_ref_invalid) /* d6 misc  */
281        .long local_label(misc_ref_s8)      /* d7 s8  */
282        .long local_label(misc_ref_invalid) /* d8 even_fixnum  */
283        .long local_label(misc_ref_invalid) /* d9 cons  */
284        .long local_label(misc_ref_invalid) /* da nodeheader  */
285        .long local_label(misc_ref_invalid) /* db imm  */
286        .long local_label(misc_ref_invalid) /* dc odd_fixnum  */
287        .long local_label(misc_ref_invalid) /* dd tra  */
288        .long local_label(misc_ref_invalid) /* de misc  */
289        .long local_label(misc_ref_invalid) /* df immheader  */
290        /* e0-ef  */
291        .long local_label(misc_ref_invalid) /* e0 even_fixnum  */
292        .long local_label(misc_ref_invalid) /* e1 cons  */
293        .long local_label(misc_ref_invalid) /* e2 nodeheader  */
294        .long local_label(misc_ref_invalid) /* e3 imm  */
295        .long local_label(misc_ref_invalid) /* e4 odd_fixnum  */
296        .long local_label(misc_ref_invalid) /* e5 tra  */
297        .long local_label(misc_ref_invalid) /* e6 misc  */
298        .long local_label(misc_ref_u16) /* e7 u16  */
299        .long local_label(misc_ref_invalid) /* e8 even_fixnum  */
300        .long local_label(misc_ref_invalid) /* e9 cons  */
301        .long local_label(misc_ref_invalid) /* ea nodeheader  */
302        .long local_label(misc_ref_invalid) /* eb imm  */
303        .long local_label(misc_ref_invalid) /* ec odd_fixnum  */
304        .long local_label(misc_ref_invalid) /* ed tra  */
305        .long local_label(misc_ref_invalid) /* ee misc  */
306        .long local_label(misc_ref_s16) /* ef s16  */
307        /* f0-ff  */
308        .long local_label(misc_ref_invalid) /* f0 even_fixnum  */
309        .long local_label(misc_ref_invalid) /* f1 cons  */
310        .long local_label(misc_ref_invalid) /* f2 nodeheader  */
311        .long local_label(misc_ref_invalid) /* f3 imm  */
312        .long local_label(misc_ref_invalid) /* f4 odd_fixnum  */
313        .long local_label(misc_ref_invalid) /* f5 tra  */
314        .long local_label(misc_ref_invalid) /* f6 misc  */
315        .long local_label(misc_ref_double_float_vector) /* f7 df vector  */
316        .long local_label(misc_ref_invalid) /* f8 even_fixnum  */
317        .long local_label(misc_ref_invalid) /* f9 cons  */
318        .long local_label(misc_ref_invalid) /* fa nodeheader  */
319        .long local_label(misc_ref_invalid) /* fb imm  */
320        .long local_label(misc_ref_invalid) /* fc odd_fixnum  */
321        .long local_label(misc_ref_invalid) /* fd tra  */
322        .long local_label(misc_ref_invalid) /* fe misc  */
323        .long local_label(misc_ref_bit_vector) /* ff bit_vector  */
324
325/* Functions are funny.  The first N words are treated as */
326/* (UNSIGNED-BYTE 32), where N is the low 16 bits of the first word. */
327
328local_label(misc_ref_function):
329        __(movzwl misc_data_offset(%arg_y), %imm0)
330        __(shl $fixnumshift,%imm0)
331        __(rcmpl(%arg_z,%imm0))
332        __(jb local_label(misc_ref_u32))
333local_label(misc_ref_node):
334        __(movl misc_data_offset(%arg_y,%arg_z),%arg_z)
335        __(ret)
336local_label(misc_ref_u32):
337        __(movl misc_data_offset(%arg_y,%arg_z),%imm0)
338        __(jmp _SPmakeu32)
339local_label(misc_ref_s32):
340        __(movl misc_data_offset(%arg_y,%arg_z),%imm0)
341        __(jmp _SPmakes32)
342local_label(misc_ref_single_float_vector):
343        __(movss misc_data_offset(%arg_y,%arg_z),%fp1)
344        __(movl $single_float_header,%imm0)
345        __(movd %imm0,%mm0)
346        __(Misc_Alloc_Fixed(%arg_z,single_float.size))
347        __(movss %fp1,single_float.value(%arg_z))
348        __(ret)
349local_label(misc_ref_double_float_vector):
350        __(movsd misc_dfloat_offset(%arg_y,%arg_z),%fp1)
351        __(movl $double_float_header,%imm0)
352        __(movd %imm0,%mm0)
353        __(Misc_Alloc_Fixed(%arg_z,double_float.size))
354        __(movsd %fp1,double_float.value(%arg_z))
355        __(ret)
356local_label(misc_ref_fixnum_vector):
357        __(movl misc_data_offset(%arg_y,%arg_z),%imm0)
358        __(box_fixnum(%imm0,%arg_z))
359        __(ret)
360local_label(misc_ref_u8):
361        __(movl %arg_z,%imm0)
362        __(shr $2,%imm0)
363        __(movzbl misc_data_offset(%arg_y,%imm0),%imm0)
364        __(box_fixnum(%imm0,%arg_z))
365        __(ret)
366local_label(misc_ref_s8):
367        __(movl %arg_z,%imm0)
368        __(shr $2,%imm0)
369        __(movsbl misc_data_offset(%arg_y,%imm0),%imm0)
370        __(box_fixnum(%imm0,%arg_z))
371        __(ret)
372local_label(misc_ref_string):
373        __(movl %arg_z,%imm0)
374        __(movl misc_data_offset(%arg_y,%imm0),%imm0)
375        __(shll $charcode_shift,%imm0)
376        __(leal subtag_character(%imm0),%arg_z)
377        __(ret)
378local_label(misc_ref_u16):
379        __(movl %arg_z,%imm0)
380        __(shrl $1,%imm0)
381        __(movzwl misc_data_offset(%arg_y,%imm0),%imm0)
382        __(box_fixnum(%imm0,%arg_z))
383        __(ret)
384local_label(misc_ref_s16):
385        __(movl %arg_z,%imm0)
386        __(shrl $1,%imm0)
387        __(movswl misc_data_offset(%arg_y,%imm0),%imm0)
388        __(box_fixnum(%imm0,%arg_z))
389        __(ret)
390local_label(misc_ref_bit_vector):
391        __(unbox_fixnum(%arg_z,%imm0))
392        __(btl %imm0,misc_data_offset(%arg_y))
393        __(setc %imm0_b)
394        __(movzbl %imm0_b,%imm0)
395        __(box_fixnum(%imm0,%arg_z))
396        __(ret)
397local_label(misc_ref_invalid):
398        __(push $XBADVEC)
399        __(set_nargs(3))
400        __(jmp _SPksignalerr)
401_endfn(C(misc_ref_common))
402
403/* Like misc_ref, only the boxed subtag is in temp0. */
404_spentry(subtag_misc_ref)
405        __(mov %arg_y,%imm0)
406        __(and $tagmask,%imm0)
407        __(cmp $tag_misc,%imm0)
408        __(je,pt 0f)
409        __(uuo_error_reg_not_tag(Rarg_y,tag_misc))
4100:      __(testb $fixnummask,%arg_z_b)
411        __(je,pt 1f)
412        __(uuo_error_reg_not_fixnum(Rarg_z))
4131:      __(movl misc_header_offset(%arg_y),%imm0)
414        __(xorb %imm0_b,%imm0_b)
415        __(shrl $num_subtag_bits-fixnumshift,%imm0)
416        __(cmp %imm0,%arg_z)
417        __(jb 2f)
418        __(uuo_error_vector_bounds(Rarg_z,Rarg_y))
4192:      __(unbox_fixnum(%temp0,%imm0))
420        __(jmp C(misc_ref_common))
421_endsubp(subtag_misc_ref)
422
423_spentry(subtag_misc_set)
424        __(int $3)
425_endsubp(subtag_misc_set)
426
427_spentry(misc_set)
428        __(int $3)
429_endsubp(misc_set)
430
431_startfn(C(misc_set_common))
432        __(ret)
433_endfn(C(misc_set_common))
434
435_spentry(Fret1valn)
436        .globl C(ret1valn)
437__(tra(C(ret1valn)))
438        __(mov (%esp),%ra0)
439        __(mov %arg_z,(%esp))
440        __(set_nargs(1))
441        __(jmp *%ra0)
442_endsubp(Fret1valn)
443
444_spentry(nvalret)
445        .globl C(nvalret)                       
446C(nvalret):
447        __(leave)
448        __(ret)
449_endsubp(nvalret)
450
451_spentry(jmpsym)
452        __(jump_fname())
453_endsubp(jmpsym)
454
455_spentry(jmpnfn)
456        __(mov %temp0,%fn)
457        __(jmp *%fn)
458_endsubp(jmpnfn)
459
460_spentry(funcall)
461        __(do_funcall())
462_endsubp(funcall)
463
464/* Make a lisp integer (fixnum or one-digit bignum) from the value in %imm0 */
465_spentry(makes32)
466        __(imull $fixnumone,%imm0,%arg_z)       /* result is fixnum-tagged */
467        __(jno 0f)                              /* but may have overflowed */
468        __(movd %imm0,%mm1)
469        __(movl $one_digit_bignum_header,%imm0)
470        __(movd %imm0,%mm0)
471        __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(1)))
472        __(movd %mm1,misc_data_offset(%arg_z))
4730:      __(repret)
474_endsubp(makes32)
475
476_spentry(makes64)
477        __(int $3)
478_endsubp(makes64)       
479
480/* xxx make lisp integer out of mm0 */
481/* Make a lisp integer (probably a bignum) out of the %edx:%eax pair. */
482/* We assume that the node_regs_mask in the TCR has been set to mark */
483/* %edx an immediate register. */
484_startfn(C(makes64))
485        __(movd %eax,%mm1)
486        __(sarl $31,%eax)
487        __(cmpl %eax,%edx)      /* upper bits just sign extension? */
488        __(movd %mm1,%eax)
489        __(je _SPmakes32)       /* yes, make a 32 bit integer */
490        __(movl $two_digit_bignum_header,%eax)
491        __(movd %eax,%mm0)
492        __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(2)))
493        __(movd %mm1,misc_data_offset(%arg_z))
494        __(movl %edx,misc_data_offset+4(%arg_z))
495        __(ret)
496_endfn
497
498
499_spentry(syscall)
500        /* Save lisp registers */
501        __(push %ebp)
502        __(movl %esp,%ebp)
503        __(push %temp0)
504        __(push %temp1)
505        __(push %arg_y)
506        __(push %arg_z)
507        __(push %fn)
508        __(movl %esp,%rcontext:tcr.save_vsp)
509        __(movl %ebp,%rcontext:tcr.save_ebp)
510        __(movl $TCR_STATE_FOREIGN,%rcontext:tcr.valence)
511        __(movl %rcontext:tcr.foreign_sp,%esp)
512        __(emms)
513        __(movl (%esp),%ebp)
514        __(addl $2*node_size,%esp)
515        __(unbox_fixnum(%arg_z,%eax))
516        /* push syscall args on stack */
517        __(int $0x80)
518        __(movl %ebp,%esp)
519        __(movl %esp,%rcontext:tcr.foreign_sp)
520        __(zero_node_regs)
521        __(pxor %fpzero,%fpzero)
522        __(movl %rcontext:tcr.save_vsp,%esp)
523        __(movl %rcontext:tcr.save_ebp,%ebp)
524        __(movl $TCR_STATE_LISP,%rcontext:tcr.valence)
525        __(pop %fn)
526        __(pop %arg_z)
527        __(pop %arg_y)
528        __(pop %temp1)
529        __(check_pending_interrupt(%temp0))
530        __(push %temp0)
531        __(leave)
532        __(ret)
533_endsubp(syscall)
534
535_spentry(mkcatch1v)
536        __(nMake_Catch(0))
537        __(ret)
538_endsubp(mkcatch1v)
539
540_spentry(mkunwind)
541        __(int $3)
542_endsubp(mkunwind)
543       
544/* this takes a return address in %ra0; it's "new" in that it does the */
545/*   double binding of *interrupt-level* out-of-line */
546_spentry(nmkunwind)
547        __(movl %rcontext:tcr.tlb_pointer,%arg_z)
548        __(movl INTERRUPT_LEVEL_BINDING_INDEX(%arg_z),%arg_y)
549        __(push %arg_y)
550        __(push $INTERRUPT_LEVEL_BINDING_INDEX)
551        __(push %rcontext:tcr.db_link)
552        __(movl %esp,%rcontext:tcr.db_link)
553        __(movl $-1<<fixnumshift,INTERRUPT_LEVEL_BINDING_INDEX(%arg_z))
554        __(movl $undefined,%arg_z)
555        /* %arg_z = tag, %xfn (%temp1) = pc */
556        __(Make_Catch(fixnumone))
557        __(movl %arg_y,%arg_z)
558        __(jmp _SPbind_interrupt_level)
559_endsubp(nmkunwind)
560
561_spentry(mkcatchmv)
562        __(int $3)
563_endsubp(mkcatchmv)
564
565_spentry(throw)
566        __(int $3)
567_endsubp(throw)
568
569/* This takes N multiple values atop the vstack.   */
570_spentry(nthrowvalues)
571        __(int $3)
572_endsubp(nthrowvalues)
573
574/* This is a (slight) optimization.  When running an unwind-protect,  */
575/* save the single value and the throw count in the tstack frame.  */
576/* Note that this takes a single value in arg_z.  */
577       
578_spentry(nthrow1value)
579        __(int $3)
580_endsubp(nthrow1value)
581
582/* This never affects the symbol's vcell   */
583/* Non-null symbol in arg_y, new value in arg_z           */
584       
585_spentry(bind)
586        __(int $3)
587_endsubp(bind)
588
589/* arg_z = symbol: bind it to its current value  */
590       
591_spentry(bind_self)
592        __(int $3)
593_endsubp(bind_self)
594
595_spentry(bind_nil)
596        __(int $3)
597_endsubp(bind_nil)
598
599_spentry(bind_self_boundp_check)
600        __(int $3)
601_endsubp(bind_self_boundp_check)
602
603_spentry(conslist)
604        __(int $3)
605_endsubp(conslist)
606
607/* do list*: last arg in arg_z, all others pushed, nargs set to #args pushed.  */
608/* Cons, one cons cell at at time.  Maybe optimize this later.  */
609       
610_spentry(conslist_star)
611        __(int $3)
612_endsubp(conslist_star)
613
614/* We always have to create a tsp frame (even if nargs is 0), so the compiler   */
615/* doesn't get confused.   */
616_spentry(stkconslist)
617        __(int $3)
618_endsubp(stkconslist)
619
620/* do list*: last arg in arg_z, all others vpushed,   */
621/*      nargs set to #args vpushed.  */
622       
623_spentry(stkconslist_star)
624        __(int $3)
625_endsubp(stkconslist_star)
626
627
628/* Make a stack-consed simple-vector out of the NARGS objects   */
629/*      on top of the vstack; return it in arg_z.  */
630       
631_spentry(mkstackv)
632        __(int $3)
633_endsubp(mkstackv)
634
635        .globl C(egc_write_barrier_start)
636C(egc_write_barrier_start):
637/*  */
638/* The function pc_luser_xp() - which is used to ensure that suspended threads  */
639/* are suspended in a GC-safe way - has to treat these subprims (which implement  */
640/* the EGC write-barrier) specially.  Specifically, a store that might introduce  */
641/* an intergenerational reference (a young pointer stored in an old object) has  */
642/* to "memoize" that reference by setting a bit in the global "refbits" bitmap.  */
643/* This has to happen atomically, and has to happen atomically wrt GC.  */
644
645/* Note that updating a word in a bitmap is itself not atomic, unless we use  */
646/* interlocked loads and stores.  */
647
648/* For RPLACA and RPLACD, things are fairly simple: regardless of where we are  */
649/* in the function, we can do the store (even if it's already been done) and  */
650/* calculate whether or not we need to set the bit out-of-line.  (Actually  */
651/* setting the bit needs to be done atomically, unless we're sure that other  */
652/* threads are suspended.)  */
653/* We can unconditionally set the suspended thread's RIP to the return address.  */
654
655_spentry(rplaca)
656        .globl C(egc_rplaca)
657C(egc_rplaca):
658        __(int $3)
659_endsubp(rplaca)
660
661_spentry(rplacd)
662        .globl C(egc_rplacd)
663C(egc_rplacd):
664        __(int $3)
665_endsubp(rplacd)
666
667/* Storing into a gvector can be handles the same way as storing into a CONS. */
668/* args (src, unscaled-idx, val) in temp0, arg_y, arg_z */
669_spentry(gvset)
670        .globl C(egc_gvset)
671C(egc_gvset):
672        __(movl %arg_z,misc_data_offset(%temp0,%arg_y))
673        __(rcmpl(%arg_z,%temp0))
674        __(ja 1f)
6750:      __(repret)
6761:      __(lea misc_data_offset(%temp0,%arg_y),%imm0)
677        __(subl lisp_global(heap_start),%imm0)
678        __(shrl $dnode_shift,%imm0)
679        __(cmpl lisp_global(oldspace_dnode_count),%imm0)
680        __(jae 0b)
681        __(andl $~(1<<bitmap_shift-1),%temp0)
682        __(shrl $bitmap_shift-fixnumshift,%temp0)
683        __(andl $31,%imm0)
684        __(addl lisp_global(refbits),%temp0)
685        __(xorb $31,%imm0_b)
686        __(lock)
687        __(btsl %imm0,(%temp0))
688        __(ret)
689_endsubp(gvset)
690
691_spentry(set_hash_key)
692        .globl C(egc_set_hash_key)
693C(egc_set_hash_key): 
694        __(int $3)
695_endsubp(set_hash_key)
696
697/* This is a little trickier: if this is interrupted, we need to know  */
698/* whether or not the STORE-CONDITIONAL (cmpxchgq) has won or not.    */
699/* If we're interrupted   before the PC has reached the "success_test" label,   */
700/* repeat (luser the PC back to .SPstore_node_conditional.)  If we're at that  */
701/* label with the Z flag set, we won and (may) need to memoize.  */
702
703_spentry(store_node_conditional)
704        .globl C(egc_store_node_conditional)
705C(egc_store_node_conditional):
706        .globl C(egc_store_node_conditional_success_test)
707C(egc_store_node_conditional_success_test):
708        .globl C(egc_write_barrier_end)
709C(egc_write_barrier_end):
710        __(int $3)
711_endsubp(store_node_conditional)
712
713_spentry(setqsym)
714        __(bt $sym_vbit_const,symbol.flags(%arg_y))
715        __(jae _SPspecset)
716        __(mov %arg_y,%arg_z)
717        __(mov $XCONST,%arg_y)
718        __(set_nargs(2))
719        __(jmp _SPksignalerr)
720_endsubp(setqsym)
721
722_spentry(progvsave)
723        __(int $3)
724_endsubp(progvsave)
725
726/* Allocate node objects on the temp stack, immediate objects on the foreign  */
727/* stack. (The caller has to know which stack to discard a frame from.)  */
728/* %arg_y = boxed element-count, %arg_z = boxed subtype  */
729       
730_spentry(stack_misc_alloc)
731        __(int $3)
732_endsubp(stack_misc_alloc)
733
734/* subtype (boxed, of course) is pushed, followed by nargs bytes worth of   */
735/* initial-contents.  Note that this can be used to cons any type of initialized   */
736/* node-header'ed misc object (symbols, closures, ...) as well as vector-like   */
737/* objects.   */
738_spentry(gvector)
739        __(int $3)
740_endsubp(gvector)
741
742_spentry(mvpass)
743        __(int $3)
744_endsubp(mvpass)
745
746_spentry(nthvalue)
747        __(int $3)
748_endsubp(nthvalue)
749
750_spentry(values)
751        __(int $3)
752_endsubp(values)
753       
754_spentry(default_optional_args)
755        __(int $3)
756_endsubp(default_optional_args)
757
758_spentry(opt_supplied_p)
759        __(int $3)
760_endsubp(opt_supplied_p)
761
762_spentry(lexpr_entry)
763        __(int $3)
764_endsubp(lexpr_entry)
765       
766_spentry(heap_rest_arg)
767        __(int $3)
768_endsubp(heap_rest_arg)
769       
770/* %imm0 contains the number of fixed args ; make an &rest arg out of the others   */
771_spentry(req_heap_rest_arg)
772        __(int $3)
773_endsubp(req_heap_rest_arg)
774
775/* %imm0 bytes of stuff has already been pushed   */
776/* make an &rest arg out of any others   */
777_spentry(heap_cons_rest_arg)
778        __(int $3)
779_endsubp(heap_cons_rest_arg)
780
781_spentry(simple_keywords)
782        __(xor %imm0,%imm0)
783        __(push_argregs())
784        __(jmp _SPkeyword_bind)
785_endsubp(simple_keywords)
786
787_spentry(keyword_args)
788        __(push_argregs())
789        __(jmp _SPkeyword_bind)
790_endsubp(keyword_args)
791       
792/* There are %nargs words of arguments on the stack; %imm0 contains the number  */
793/* of non-keyword args pushed.  It's possible that we never actually got  */
794/* any keyword args, which would make things much simpler.   */
795
796/* On entry, temp1 contains a fixnum with bits indicating whether   */
797/* &allow-other-keys and/or &rest was present in the lambda list.  */
798/* Once we get here, we can use the arg registers.  */
799
800define([keyword_flags_aok_bit],[fixnumshift])
801define([keyword_flags_unknown_keys_bit],[fixnumshift+1])
802define([keyword_flags_rest_bit],[fixnumshift+2])
803define([keyword_flags_seen_aok_bit],[fixnumshift+3])       
804       
805_spentry(keyword_bind)
806        __(int $3)
807_endsubp(keyword_bind)
808
809_spentry(ksignalerr)
810        __(mov $nrs.errdisp,%fname)
811        __(jump_fname) 
812_endsubp(ksignalerr)
813
814_spentry(stack_rest_arg)
815        __(xorl %imm0,%imm0)
816        __(push_argregs())
817        __(jmp _SPstack_cons_rest_arg)
818_endsubp(stack_rest_arg)
819
820_spentry(req_stack_rest_arg)
821        __(push_argregs())
822        __(jmp _SPstack_cons_rest_arg)
823_endsubp(req_stack_rest_arg)
824
825_spentry(stack_cons_rest_arg)
826_endsubp(stack_cons_rest_arg)
827
828_spentry(getxlong)
829        __(int $3)
830_endsubp(getxlong)
831
832/* Have to be a little careful here: the caller may or may not have pushed  */
833/* an empty frame, and we may or may not have needed one.  We can't easily  */
834/* tell whether or not a frame will be needed (if the caller didn't reserve  */
835/* a frame, whether or not we need one depends on the length of the list  */
836/* in arg_z.  So, if the caller didn't push a frame, we do so; once */
837/* everything's been spread, we discard the reserved frame (regardless of
838/* who pushed it) if all args fit in registers.   */
839_spentry(spreadargz)
840        __(int $3)
841_endsubp(spreadargz)
842
843       
844/* Caller built it's own frame when it was entered.  If all outgoing args  */
845/* are in registers, we can discard that frame; otherwise, we copy outgoing  */
846/* relative to it and restore %rbp/%ra0   */
847_spentry(tfuncallgen)
848        __(int $3)
849_endsubp(tfuncallgen)
850
851/* Some args were pushed; move them down in the frame   */
852_spentry(tfuncallslide)
853        __(int $3)
854_endsubp(tfuncallslide)
855
856/* No args were pushed; recover saved context & do funcall        */
857_spentry(tfuncallvsp)
858        __(leave)
859        __(do_funcall())
860_endsubp(tfuncallvsp)
861
862_spentry(tcallsymgen)
863        __(int $3)
864_endsubp(tcallsymgen)
865
866_spentry(tcallsymslide)
867        __(int $3)
868_endsubp(tcallsymslide)
869
870_spentry(tcallsymvsp)
871        __(leave)
872        __(jump_fname())
873_endsubp(tcallsymvsp)
874
875_spentry(tcallnfngen)
876        __(int $3)
877_endsubp(tcallnfngen)
878       
879_spentry(tcallnfnslide)
880        __(int $3)
881_endsubp(tcallnfnslide)
882
883_spentry(tcallnfnvsp)
884        __(mov %temp0,%fn)
885        __(leave)
886        __(jmp *%fn)
887_endsubp(tcallnfnvsp)
888
889_spentry(makestackblock)
890        __(int $3)
891_endsubp(makestackblock)
892       
893_spentry(makestackblock0)
894        __(int $3)
895_endsubp(makestackblock0)
896       
897_spentry(makestacklist)
898        __(int $3)
899_endsubp(makestacklist)
900       
901_spentry(stkgvector)
902        __(int $3)
903_endsubp(stkgvector)
904
905_spentry(misc_alloc)
906        __(int $3)
907_endsubp(misc_alloc)
908
909_startfn(C(destbind1))
910        __(jmp *%ra0)
911_endfn(C(destbind1))   
912
913_spentry(macro_bind)
914        __(int $3)
915_endsubp(macro_bind)
916
917_spentry(destructuring_bind)
918        __(mov %arg_reg,%whole_reg)
919        __(jmp C(destbind1))
920_endsubp(destructuring_bind)
921
922_spentry(destructuring_bind_inner)
923        __(mov %arg_z,%whole_reg)
924        __(jmp C(destbind1))
925_endsubp(destructuring_bind_inner)
926
927_spentry(vpopargregs)
928        __(int $3)
929_endsubp(vpopargregs)
930
931/* If arg_z is an integer, return in imm0 something whose sign  */
932/* is the same as arg_z's.  If not an integer, error.   */
933_spentry(integer_sign)
934        __(mov %arg_z,%imm0)
935        __(testb $tagmask,%arg_z_b)
936        __(je 8f)
937        __(extract_typecode(%arg_z,%imm0))
938        __(cmpb $subtag_bignum,%imm0_b)
939        __(jne 9f)
940        __(getvheader(%arg_z,%imm0))
941        __(shr $num_subtag_bits,%imm0)
942        __(movl misc_data_offset-4(%arg_z,%imm0,4),%imm0)
9438:      __(repret)
9449:      __(uuo_error_reg_not_type(Rarg_z,error_object_not_integer))
945_endsubp(integer_sign)
946
947_spentry(mvslide)
948        __(int $3)
949_endsubp(mvslide)
950
951_spentry(save_values)
952        __(int $3)
953_endsubp(save_values)
954
955_spentry(add_values)
956        __(int $3)
957_endsubp(add_values)
958                                       
959_spentry(recover_values)
960        __(int $3)
961_endsubp(recover_values)
962                                       
963_spentry(recover_values_for_mvcall)
964        __(int $3)
965_endsubp(recover_values_for_mvcall)
966                                       
967_spentry(reset)
968        __(int $3)
969_endsubp(reset)
970
971_spentry(misc_alloc_init)
972        __(int $3)
973_endsubp(misc_alloc_init)
974       
975_spentry(stack_misc_alloc_init)
976        __(int $3)
977_endsubp(stack_misc_alloc_init)
978
979        .globl C(popj)
980_spentry(popj)
981C(popj):
982        __(leave)
983        __(ret)
984_endsubp(popj)
985
986
987_spentry(gets64)
988        __(int $3)
989_endsubp(gets64)
990       
991       
992/* arg_z should be of type (unsigned-byte 64) */
993/* return unboxed value in mm0 */
994_spentry(getu64)
995        __(movl $~(target_most_positive_fixnum << fixnumshift),%imm0)
996        __(testl %arg_z,%imm0)
997        __(movl %arg_z,%imm0)
998        __(jne 1f)
999        __(sarl $fixnumshift,%imm0)
1000        __(movd %imm0,%mm0)
1001        __(ret)
10021:      __(andb $tagmask,%imm0_b)
1003        __(cmpb $tag_misc,%imm0_b)
1004        __(jne 9f)
1005        __(movb misc_subtag_offset(%arg_z),%imm0_b)
1006        __(cmpb $subtag_bignum,%imm0_b)
1007        __(jne 9f)
1008        __(movl misc_header_offset(%arg_z),%imm0)
1009        __(cmpl $three_digit_bignum_header,%imm0)
1010        __(je 3f)
1011        __(cmpl $two_digit_bignum_header,%imm0)
1012        __(jne 9f)
1013        __(movl misc_data_offset(%arg_z),%imm0)
1014        __(testl %imm0,%imm0)
1015        __(js 9f)
1016        __(repret)
10173:      __(movl misc_data_offset(%arg_z),%imm0)
1018        __(cmpl $0,misc_data_offset+8(%arg_z))
1019        __(jne 9f)
1020        __(repret)
10219:      __(uuo_error_reg_not_type(Rarg_z,error_object_not_u64))
1022_endsubp(getu64)
1023
1024_spentry(makeu64)
1025        __(int $3)
1026_endsubp(makeu64)
1027       
1028_spentry(specref)
1029        __(int $3)
1030_endsubp(specref)
1031
1032/* arg_y = special symbol, arg_z = new value. */
1033_spentry(specset)
1034        __(movl symbol.binding_index(%arg_y),%imm0)
1035        __(cmp %rcontext:tcr.tlb_limit,%imm0)
1036        __(movl %rcontext:tcr.tlb_pointer,%temp1)
1037        __(jae 1f)
1038        __(movl (%temp1,%imm0),%temp0)
1039        __(cmpb $no_thread_local_binding_marker,%temp0_b)
1040        __(je 1f)
1041        __(movl %arg_z,(%temp1,%imm0))
1042        __(ret)
10431:      __(movl %arg_y,%temp0)
1044        __(movl $1<<fixnumshift,%arg_y)
1045        __(jmp _SPgvset)
1046_endsubp(specset)
1047       
1048_spentry(specrefcheck)
1049        __(movl %rcontext:tcr.tlb_pointer,%temp1)
1050        __(mov %arg_z,%arg_y)
1051        __(movl symbol.binding_index(%arg_z),%imm0)
1052        __(cmp %rcontext:tcr.tlb_limit,%imm0)
1053        __(jae 7f)
1054        __(movl (%temp1,%imm0),%arg_z)
1055        __(cmpb $no_thread_local_binding_marker,%arg_z_b)
1056        __(jne 8f)
10577:      __(movl symbol.vcell(%arg_y),%arg_z)
10588:      __(cmpb $unbound_marker,%arg_z_b)
1059        __(jne,pt 9f)
1060        __(uuo_error_reg_unbound(Rarg_y))
10619:      __(repret)             
1062_endsubp(specrefcheck)
1063
1064_spentry(restoreintlevel)
1065        __(int $3)
1066_endsubp(restoreintlevel)
1067
1068_spentry(makeu32)
1069        __(int $3)
1070_endsubp(makeu32)
1071
1072_spentry(gets32)
1073        __(int $3)
1074_endsubp(gets32)
1075
1076_spentry(getu32)
1077        __(int $3)
1078_endsubp(getu32)
1079
1080_spentry(mvpasssym)
1081        __(int $3)
1082_endsubp(mvpasssym)
1083
1084_spentry(unbind)
1085        __(int $3)
1086_endsubp(unbind)
1087
1088_spentry(unbind_n)
1089        __(int $3)
1090_endsubp(unbind_n)
1091
1092_spentry(unbind_to)
1093        __(int $3)
1094_endsubp(unbind_to)
1095
1096_spentry(bind_interrupt_level_0)
1097        __(movl %rcontext:tcr.tlb_pointer,%arg_y)
1098        __(cmpl $0,INTERRUPT_LEVEL_BINDING_INDEX(%arg_y))
1099        __(push INTERRUPT_LEVEL_BINDING_INDEX(%arg_y))
1100        __(push $INTERRUPT_LEVEL_BINDING_INDEX)
1101        __(push %rcontext:tcr.db_link)
1102        __(movl %esp,%rcontext:tcr.db_link)
1103        __(movl $0,INTERRUPT_LEVEL_BINDING_INDEX(%arg_y))
1104        __(js,pn 1f)
11050:      __(jmp *%ra0)
1106        /* Interrupt level was negative; interrupt may be pending */
11071:      __(check_pending_enabled_interrupt(2f))
11082:      __(jmp *%ra0)
1109_endsubp(bind_interrupt_level_0)
1110
1111_spentry(bind_interrupt_level_m1)
1112        __(int $3)
1113_endsubp(bind_interrupt_level_m1)
1114
1115/* Bind CCL::*INTERRUPT-LEVEL* to the value in arg_z.  If that value's 0, */
1116/* do what _SPbind_interrupt_level_0 does. */
1117_spentry(bind_interrupt_level)
1118        __(test %arg_z,%arg_z)
1119        __(jz _SPbind_interrupt_level_0)
1120        __(movl %rcontext:tcr.tlb_pointer,%arg_y)
1121        __(push INTERRUPT_LEVEL_BINDING_INDEX(%arg_y))
1122        __(push $INTERRUPT_LEVEL_BINDING_INDEX)
1123        __(push %rcontext:tcr.db_link)
1124        __(movl %esp,%rcontext:tcr.db_link)
1125        __(movl %arg_z,INTERRUPT_LEVEL_BINDING_INDEX(%arg_y))
1126        __(jmp *%ra0)
1127_endsubp(bind_interrupt_level)
1128
1129_spentry(unbind_interrupt_level)
1130        __(int $3)
1131_endsubp(unbind_interrupt_level)
1132
1133_spentry(progvrestore)
1134        __(int $3)
1135_endsubp(progvrestore)
1136
1137/* %arg_z <- %arg_y + %arg_z.  Do the fixnum case - including overflow -  */
1138/* inline.  Call out otherwise.   */
1139_spentry(builtin_plus)
1140        __(movl %arg_y,%imm0)
1141        __(orl %arg_z,%imm0)
1142        __(testb $fixnummask,%imm0_b)
1143        __(jne 1f)
1144        __(addl %arg_y,%arg_z)
1145        __(jo,pn C(fix_one_bit_overflow))
1146        __(repret)
11471:      __(jump_builtin(_builtin_plus,2))
1148_endsubp(builtin_plus)
1149
1150_spentry(builtin_minus)
1151        __(int $3)
1152_endsubp(builtin_minus)
1153
1154_spentry(builtin_times)
1155        __(int $3)
1156_endsubp(builtin_times)
1157
1158_spentry(builtin_div)
1159        __(jump_builtin(_builtin_div,2))
1160
1161/* %arg_z <- (= %arg_y %arg_z).   */
1162_spentry(builtin_eq)
1163        __(movl %arg_y,%imm0)
1164        __(orb %arg_z_b,%imm0_b)
1165        __(testb $fixnummask,%imm0_b)
1166        __(jne 1f)
1167        __(rcmpl(%arg_z,%arg_y))
1168        __(condition_to_boolean(e,%imm0,%arg_z))
1169        __(ret)
11701:      __(jump_builtin(_builtin_eq,2))
1171_endsubp(builtin_eq)
1172       
1173/* %arg_z <- (/= %arg_y %arg_z).          */
1174_spentry(builtin_ne)
1175        __(movl %arg_y,%imm0)
1176        __(orb %arg_z_b,%imm0_b)
1177        __(testb $fixnummask,%imm0_b)
1178        __(jne 1f)
1179        __(rcmpl(%arg_z,%arg_y))
1180        __(condition_to_boolean(ne,%imm0,%arg_z))
1181        __(ret)
11821:      __(jump_builtin(_builtin_ne,2))
1183_endsubp(builtin_ne)
1184       
1185/* %arg_z <- (> %arg_y %arg_z).   */
1186_spentry(builtin_gt)
1187        __(movl %arg_y,%imm0)
1188        __(orb %arg_z_b,%imm0_b)
1189        __(testb $fixnummask,%imm0_b)
1190        __(jne 1f)
1191        __(rcmpl(%arg_y,%arg_z))
1192        __(condition_to_boolean(g,%imm0,%arg_z))
1193        __(ret)
11941:      __(jump_builtin(_builtin_gt,2))
1195_endsubp(builtin_gt)
1196
1197/* %arg_z <- (>= %arg_y %arg_z).          */
1198_spentry(builtin_ge)
1199        __(movl %arg_y,%imm0)
1200        __(orb %arg_z_b,%imm0_b)
1201        __(testb $fixnummask,%imm0_b)
1202        __(jne 1f)
1203        __(rcmpl(%arg_y,%arg_z))
1204        __(condition_to_boolean(ge,%imm0,%arg_z))
1205        __(ret)
12061:      __(jump_builtin(_builtin_ge,2))
1207_endsubp(builtin_ge)
1208       
1209/* %arg_z <- (< %arg_y %arg_z).   */
1210_spentry(builtin_lt)
1211        __(movl %arg_y,%imm0)
1212        __(orb %arg_z_b,%imm0_b)
1213        __(testb $fixnummask,%imm0_b)
1214        __(jne 1f)
1215        __(rcmpl(%arg_y,%arg_z))
1216        __(condition_to_boolean(l,%imm0,%arg_z))
1217        __(ret)
12181:      __(jump_builtin(_builtin_lt,2))
1219_endsubp(builtin_lt)
1220
1221/* %arg_z <- (<= %arg_y %arg_z).   */
1222_spentry(builtin_le)
1223        __(movl %arg_y,%imm0)
1224        __(orb %arg_z_b,%imm0_b)
1225        __(testb $fixnummask,%imm0_b)
1226        __(jne 1f)
1227        __(rcmpl(%arg_y,%arg_z))
1228        __(condition_to_boolean(le,%imm0,%arg_z))
1229        __(ret)
12301:      __(jump_builtin(_builtin_le,2))
1231_endsubp(builtin_le)
1232
1233_spentry(builtin_eql)
1234        __(int $3)
1235_endsubp(builtin_eql)
1236
1237_spentry(builtin_length)
1238        __(extract_fulltag(%arg_z,%imm0))
1239        __(cmpl $tag_list,%imm0)
1240        __(jz 2f)
1241        __(andl $tagmask,%imm0)
1242        __(cmpl $tag_misc,%imm0)
1243        __(jnz 8f)
1244        __(extract_subtag(%arg_z,%imm0_b))
1245        __(rcmpb(%imm0_b,$min_vector_subtag))
1246        __(jb 8f)
1247        __(je 1f)
1248        /* (simple-array * (*)) */
1249        __(movl %arg_z,%arg_y)
1250        __(vector_length(%arg_y,%arg_z))
1251        __(ret)
12521:      /* vector header */
1253        __(movl vectorH.logsize(%arg_z),%arg_z)
1254        __(ret)
12552:      /* list.  Maybe null, maybe dotted or circular. */
1256        __(movl $-fixnumone,%arg_y)
1257        __(movl %arg_z,%temp0)  /* fast pointer */
1258        __(movl %arg_z,%temp1)  /* slow pointer */
12593:      __(movb %temp0_b,%al)
1260        __(andb $fulltagmask,%al)
1261        __(addl $fixnumone,%arg_y)
1262        __(compare_reg_to_nil(%temp0))
1263        __(je 9f)
1264        __(cmpb $fulltag_cons,%al)
1265        __(jne 8f)
1266        __(movb %temp1_b,%ah)
1267        __(andb $fulltagmask,%ah)
1268        __(_cdr(%temp0,%temp0))
1269        __(testl $fixnumone,%arg_y)
1270        __(je 3b)
1271        __(cmpb $fulltag_cons,%ah)
1272        __(jne 8f)
1273        __(_cdr(%temp1,%temp1))
1274        __(cmpl %temp0,%temp1)
1275        __(jne 3b)
12768:
1277        __(jump_builtin(_builtin_length,1))
12789:
1279        __(movl %arg_y,%arg_z)
1280        __(ret)
1281_endsubp(builtin_length)
1282
1283_spentry(builtin_seqtype)
1284        __(int $3)
1285_endsubp(builtin_seqtype)
1286
1287_spentry(builtin_assq)
1288        __(int $3)
1289_endsubp(builtin_assq)
1290
1291_spentry(builtin_memq)
1292        __(int $3)
1293_endsubp(builtin_memq)
1294
1295logbitp_max_bit = 30
1296
1297_spentry(builtin_logbitp)
1298        __(int $3)
1299_endsubp(builtin_logbitp)
1300
1301_spentry(builtin_logior)
1302        __(movl %arg_y,%imm0)
1303        __(orb %arg_z_b,%imm0_b)
1304        __(testb $fixnummask,%imm0_b)
1305        __(jne 1f)
1306        __(orl %arg_y,%arg_z)
1307        __(ret)
13081:     
1309        __(jump_builtin(_builtin_logior,2))
1310_endsubp(builtin_logior)
1311
1312_spentry(builtin_logand)
1313        __(movl %arg_y,%imm0)
1314        __(orb %arg_z_b,%imm0_b)
1315        __(testb $fixnummask,%imm0_b)
1316        __(jne 1f)
1317        __(andl %arg_y,%arg_z)
1318        __(ret)
13191:             
1320        __(jump_builtin(_builtin_logand,2))
1321_endsubp(builtin_logand)
1322
1323_spentry(builtin_negate)
1324        __(testb $fixnummask,%arg_z_b)
1325        __(jne 1f)
1326        __(negl %arg_z)
1327        __(jo,pn C(fix_one_bit_overflow))
1328        __(repret)
13291:             
1330        __(jump_builtin(_builtin_negate,1))     
1331_endsubp(builtin_negate)
1332
1333_spentry(builtin_logxor)
1334        __(movl %arg_y,%imm0)
1335        __(orb %arg_z_b,%imm0_b)
1336        __(testb $fixnummask,%imm0_b)
1337        __(jne 1f)
1338        __(xorl %arg_y,%arg_z)
1339        __(ret)
13401:             
1341        __(jump_builtin(_builtin_logxor,2))
1342_endsubp(builtin_logxor)
1343       
1344_spentry(builtin_aset1)
1345        __(int $3)
1346_endsubp(builtin_aset1)
1347
1348_spentry(builtin_ash)
1349        __(int $3)
1350_endsubp(builtin_ash)
1351
1352_spentry(builtin_aref1)
1353        __(extract_typecode(%arg_y,%imm0))
1354        __(box_fixnum_no_flags(%imm0,%temp0))
1355        __(cmpb $min_vector_subtag,%imm0_b)
1356        __(ja _SPsubtag_misc_ref)
1357        __(jump_builtin(_builtin_aref1,2))
1358_endsubp(builtin_aref1)
1359
1360_spentry(ffcall)
1361        __(int $3)
1362_endsubp(ffcall)
1363       
1364_spentry(ffcall_return_registers)
1365        __(int $3)
1366_endsubp(ffcall_return_registers)
1367
1368_spentry(spread_lexprz)
1369        __(int $3)
1370_endsubp(spread_lexprz)
1371
1372_spentry(callback)
1373        __(int $3)
1374_endsubp(callback)
1375
1376_spentry(aref2)
1377        __(int $3)
1378_endsubp(aref2)
1379
1380_spentry(aref3)
1381        __(int $3)
1382_endsubp(aref3)
1383
1384_spentry(aset2)
1385        __(int $3)
1386_endsubp(aset2)
1387
1388_spentry(aset3)
1389        __(int $3)
1390_endsubp(aset3)
1391
1392_spentry(call_closure)
1393        __(int $3)
1394_endsubp(call_closure)
1395
1396_spentry(poweropen_callbackX)
1397        __(int $3)
1398_endsubp(poweropen_callbackX)
1399       
1400_spentry(poweropen_ffcallX)
1401        __(int $3)
1402_endsubp(poweropen_ffcallX)
1403               
1404_spentry(poweropen_syscall)
1405        __(int $3)
1406_endsubp(poweropen_syscall)
1407
1408_spentry(eabi_ff_call)
1409        __(int $3)
1410_endsubp(eabi_ff_call)
1411
1412_spentry(eabi_callback)
1413        __(int $3)
1414_endsubp(eabi_callback)
1415
1416
1417/* Unused, and often not used on PPC either  */
1418_spentry(callbuiltin)
1419        __(int $3)
1420_endsubp(callbuiltin)
1421
1422_spentry(callbuiltin0)
1423        __(int $3)
1424_endsubp(callbuiltin0)
1425
1426_spentry(callbuiltin1)
1427        __(int $3)
1428_endsubp(callbuiltin1)
1429
1430_spentry(callbuiltin2)
1431        __(int $3)
1432_endsubp(callbuiltin2)
1433
1434_spentry(callbuiltin3)
1435        __(int $3)
1436_endsubp(callbuiltin3)
1437       
1438_spentry(restorefullcontext)
1439        __(int $3)
1440_endsubp(restorefullcontext)
1441
1442_spentry(savecontextvsp)
1443        __(int $3)
1444_endsubp(savecontextvsp)
1445
1446_spentry(savecontext0)
1447        __(int $3)
1448_endsubp(savecontext0)
1449
1450_spentry(restorecontext)
1451        __(int $3)
1452_endsubp(restorecontext)
1453
1454_spentry(stkconsyz)
1455        __(int $3)
1456_endsubp(stkconsyz)
1457
1458_spentry(stkvcell0)
1459        __(int $3)
1460_endsubp(stkvcell0)
1461
1462_spentry(stkvcellvsp)
1463        __(int $3)
1464_endsubp(stkvcellvsp)
1465
1466_spentry(breakpoint)
1467        __(int $3)
1468_endsubp(breakpoint)
1469
1470_spentry(unused_5)
1471        __(int $3)
1472_endsubp(unused_5)
1473
1474_spentry(unused_6)
1475        __(int $3)
1476_endsubp(unused_6)
1477
Note: See TracBrowser for help on using the repository browser.