source: trunk/source/lisp-kernel/x86-constants64.s @ 15196

Last change on this file since 15196 was 15196, checked in by gb, 8 years ago

Rename a couple of (unused) nil-relative-symbols. No bootstrapping issues
(yet, modulo any typos), but there may be when we start to use them.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 26.2 KB
Line 
1/*   Copyright (C) 2005-2009 Clozure Associates  */
2/*   This file is part of Clozure CL.    */
3
4/*   Clozure CL is licensed under the terms of the Lisp Lesser GNU Public  */
5/*   License , known as the LLGPL and distributed with Clozure CL as the  */
6/*   file "LICENSE".  The LLGPL consists of a preamble and the LGPL,  */
7/*   which is distributed with Clozure CL as the file "LGPL".  Where these  */
8/*   conflict, the preamble takes precedence.    */
9 
10/*   Clozure CL 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/* Register usage.  This is certainly a little short of  */
17/* immediate registers; we can maybe use the low bits  */
18/* of mmx or xmm registers to hold immediate values and  */
19/* do some unboxed arithmetic.   */
20
21
22/*
23
24        Register usage in C calling conventions differ between
25        Darwin/Linux/FreeBSD (which use the AMD-defined ABI) and
26        Windows64 (which uses something else).  The good news is that
27        Win64 did away with the cdecl/stdcall/fastcall madness, there
28        is only one ABI left.  Here's a rundown.
29
30        AMD64^Wx86-64 ABI:
31         * Integer and pointer function arguments passed (from left to
32        right) in RDI, RSI, RDX, RCX, R8 and R9
33         * FP arguments are passed in XMM0..XMM7
34         * rest is passed on stack
35         * return value in RAX
36         * Callee must preserve RBP, RBX, R12..R15, MXCSR control bits
37         * On function entry, x87 mode and DF clear is assumed
38         * `RSP'..`RSP-128' must not be touched by signal handlers
39
40        Win64 ABI:
41         * Integer and pointers passed in RCX, RDX, R8, R9
42         * FP passed in XMM0..XMM3
43         * rest is passed on stack
44         * Return value in RAX or XMM0
45         * Caller (!) responsible for creating and cleaning stack space for
46        spilling integer registers
47         * Callee must preserve RBP, RBX, RSI, RDI, R12..R15, XMM6..XMM15
48
49        Both want their stack pointers to be 16 byte aligned on call,
50        equivalent to 8 byte offset after call due to pushed return address.
51       
52        http://msdn2.microsoft.com/en-us/library/zthk2dkh(VS.80).aspx
53        http://www.tortall.net/projects/yasm/manual/html/objfmt-win64-exception.html
54        http://www.x86-64.org/documentation/abi.pdf
55
56
57        Lisp register usage:
58
59        Clozure CL renames the physical registers, giving them names
60        based on their usage. An overview:
61
62        imm0..imm2
63        temp0..temp2
64        save0..save3
65        arg_x, arg_y, arg_z
66        fn
67
68        On top of that, further mappings are defined:
69
70        fname, next_method_context:     temp0
71        nargs:                          imm2
72        ra0:                            temp2
73        xfn:                            temp1
74        allocptr:                       temp0
75        stack_temp:                     mm7     
76       
77        x86-64 ABI mapping:
78       
79        imm0..imm2:             RAX, RDX, RCX
80        temp0..temp2:           RBX, R9, R10
81        save0..save3:           R15, R14, R12, R11
82        arg_x, arg_y, arg_z:    R8, RDI, RSI
83        fn:                     R13
84        rcontext_reg:           GS
85
86        Win64 specifics:
87        rcontext_reg:           R11
88       
89*/
90       
91
92/* Redefining these standard register names - with the same _l, _w, _b suffixes  */
93/*  used in lispy symbolic names - allows us to play Stupid M4 Tricks in macros  */
94                       
95define(`rax_l',`eax')
96define(`rax_w',`ax')
97define(`rax_b',`al')
98define(`rbx_l',`ebx')
99define(`rbx_w',`bx')
100define(`rbx_b',`bl')
101define(`rcx_l',`ecx')
102define(`rcx_w',`cx')
103define(`rdx_l',`edx')
104define(`rdx_w',`dx')                                   
105define(`rdx_b',`dl')                                                   
106define(`rsi_l',`esi')
107define(`rsi_w',`si')                           
108define(`rsi_b',`sil')
109define(`rdi_l',`edo')
110define(`rdi_w',`di')                           
111define(`rdi_b',`dil')
112define(`r8_l',`r8d')
113define(`r8_w',`r8w')                                   
114define(`r8_b',`r8b')                                                   
115define(`r9_l',`r9d')
116define(`r9_w',`r9w')                                   
117define(`r9_b',`r9b')                                                   
118define(`r10_l',`r10d')
119define(`r10_w',`r10w')                                 
120define(`r10_b',`r10b')                                                 
121define(`r10_l',`r11d')
122define(`r11_w',`r11w')                                 
123define(`r11_b',`r11b')                                                 
124define(`r12_l',`r12d')
125define(`r12_w',`r12w')                                 
126define(`r12_b',`r12b')                                                 
127define(`r13_l',`r13d')
128define(`r13_w',`r13w')                                 
129define(`r13_b',`r13b')                                                 
130define(`r14_l',`r14d')
131define(`r14_w',`r14w')                                 
132define(`r14_b',`r14b')                                                 
133define(`r15_l',`r15d')
134define(`r15_w',`r15w')                                 
135define(`r15_b',`r15b')                                                 
136
137/* Registers when using Lisp calling conventions */
138       
139define(`imm0',`rax')
140        define(`imm0_l',`eax')
141        define(`imm0_w',`ax')
142        define(`imm0_b',`al')
143        define(`Rimm0',`0')
144       
145define(`temp0',`rbx')
146        define(`temp0_l',`ebx')
147        define(`temp0_w',`bx')
148        define(`temp0_b',`bl')
149        define(`Rtemp0',`3')
150
151define(`imm2',`rcx')
152        define(`imm2_l',`ecx')
153        define(`imm2_w',`cx')
154        define(`imm2_b',`cl')
155        define(`Rimm2',`1')
156       
157define(`imm1',`rdx')
158        define(`imm1_l',`edx')
159        define(`imm1_w',`dx')
160        define(`imm1_b',`dl')
161        define(`Rimm1',`2')
162       
163define(`arg_z',`rsi')
164        define(`arg_z_l',`esi')
165        define(`arg_z_w',`si')
166        define(`arg_z_b',`sil')
167        define(`Rarg_z',`6')
168
169define(`arg_y',`rdi')
170        define(`arg_y_l',`edi')
171        define(`arg_y_w',`di')
172        define(`arg_y_b',`dil')
173        define(`Rarg_y',`7')
174
175define(`arg_x',`r8')
176        define(`arg_x_l',`r8d')
177        define(`arg_x_w',`r8w')
178        define(`arg_x_b',`r8b')
179        define(`Rarg_x',`8')
180
181define(`temp1',`r9')
182        define(`temp1_l',`r9d')
183        define(`temp1_w',`r9w')
184        define(`temp1_b',`r9b')
185        define(`Rtemp1',`9')
186
187define(`temp2',`r10')
188        define(`temp2_l',`r10d')
189        define(`temp2_w',`r10w')
190        define(`temp2_x_b',`r10b')
191        define(`Rtemp2',`10')
192       
193define(`save3',`r11')           
194        define(`save3_l',`r11d')
195        define(`save3_w',`r11w')
196        define(`save3_b',`r11b')
197        define(`Rsave3',`11')
198       
199define(`save2',`r12')
200        define(`save2_l',`r12d')
201        define(`save2_w',`r12w')
202        define(`save2_b',`r12b')
203        define(`Rsave2',`12')
204       
205define(`fn',`r13')              /* some addressing restrictions   */
206        define(`fn_l',`r13d')
207        define(`fn_w',`r13w')
208        define(`fn_b',`r13b')
209        define(`Rfn',`13')
210       
211define(`save1',`r14')
212        define(`save1_l',`r14d')
213        define(`save1_w',`r14w')
214        define(`save1_b',`r14b')
215        define(`Rsave1',`14')
216               
217define(`save0',`r15')
218        define(`save0_l',`r15d')
219        define(`save0_w',`r15w')
220        define(`save0_b',`r15b')
221        define(`Rsave0',`15')   
222
223
224ifdef(`TCR_IN_GPR',`
225/* We keep the TCR pointer in r11 */
226        define(`rcontext_reg', r11)
227        define(`rcontext',`$1(%rcontext_reg)')
228',`
229/* The TCR can be accessed relative to %gs   */
230        define(`rcontext_reg',`gs')
231        define(`rcontext',`%rcontext_reg:$1')
232')
233define(`fname',`temp0')
234define(`next_method_context',`temp0')
235define(`nargs_b',`imm2_b')     
236define(`nargs_w',`imm2_w')
237define(`nargs_q',`imm2')
238define(`nargs',`imm2_l')
239define(`ra0',`temp2')       
240                                               
241define(`xfn',`temp1')
242
243define(`allocptr',`temp0')             
244define(`stack_temp',`mm7')
245
246               
247define(`fp0',`xmm0')           
248define(`fp1',`xmm1')           
249define(`fp2',`xmm2')           
250define(`fp3',`xmm3')           
251define(`fp4',`xmm4')           
252define(`fp5',`xmm5')           
253define(`fp6',`xmm6')           
254define(`fp7',`xmm7')           
255define(`fp8',`xmm8')           
256define(`fp9',`xmm9')           
257define(`fp10',`xmm10')         
258define(`fp11',`xmm11')         
259define(`fp12',`xmm12')         
260define(`fp13',`xmm13')         
261define(`fp14',`xmm14')         
262define(`fp15',`xmm15')         
263define(`fpzero',`fp15')
264
265/* Registers when running with native C calling conventions */
266
267define(`cret',`rax')
268        define(`cret_l',`eax')
269        define(`cret_w',`ax')
270        define(`cret_b',`al')
271        define(`Rcret',`0')
272       
273define(`ctemp0',`r10')
274        define(`ctemp0_l',`r10d')
275        define(`ctemp0_w',`r10w')
276        define(`ctemp0_b',`r10b')
277        define(`Rctemp0',`10')
278       
279define(`ctemp1',`r11')         
280        define(`ctemp1_l',`r11d')
281        define(`ctemp1_w',`r11w')
282        define(`ctemp1_b',`r11b')
283        define(`Rctemp1',`11')
284       
285define(`csave0',`rbx')
286        define(`csave0_l',`ebx')
287        define(`csave0_w',`bx')
288        define(`csave0_b',`bl')
289        define(`Rcsave0',`3')
290
291define(`csave1',`r12')
292        define(`csave1_l',`r12d')
293        define(`csave1_w',`r12w')
294        define(`csave1_b',`r12b')
295        define(`Rcsave1',`12')
296       
297define(`csave2',`r13')
298        define(`csave2_l',`r13d')
299        define(`csave2_w',`r13w')
300        define(`csave2_b',`r13b')
301        define(`Rcsave2',`13')
302       
303define(`csave3',`r14')
304        define(`csave3_l',`r14d')
305        define(`csave3_w',`r14w')
306        define(`csave3_b',`r14b')
307        define(`Rcsave3',`14')
308               
309define(`csave4',`r15')
310        define(`csave4_l',`r15d')
311        define(`csave4_w',`r15w')
312        define(`csave4_b',`r15b')
313        define(`Rcsave4',`15') 
314
315ifdef(`WINDOWS',`
316
317define(`carg0',`rcx')
318        define(`carg0_l',`ecx')
319        define(`carg0_w',`cx')
320        define(`carg0_b',`cl')
321        define(`Rcarg0',`1')
322       
323define(`carg1',`rdx')
324        define(`carg1_l',`edx')
325        define(`carg1_w',`dx')
326        define(`carg1_b',`dl')
327        define(`Rcarg1',`2')
328       
329define(`carg2',`r8')
330        define(`carg2_l',`r8d')
331        define(`carg2_w',`r8w')
332        define(`carg2_b',`r8b')
333        define(`Rcarg2',`8')
334
335define(`carg3',`r9')
336        define(`carg3_l',`r9d')
337        define(`carg3_w',`r9w')
338        define(`carg3_b',`r9b')
339        define(`Rcarg3',`9')
340
341define(`csave5',`rsi')
342        define(`csave5_l',`esi')
343        define(`csave5_w',`si')
344        define(`csave5_b',`sil')
345        define(`csave5_z',`6')
346
347define(`csave6',`rdi')
348        define(`csave6_l',`edi')
349        define(`csave6_w',`di')
350        define(`csave6_b',`dil')
351        define(`Rcsave6',`7')
352
353',`
354       
355define(`carg0',`rdi')
356        define(`carg0_l',`edi')
357        define(`carg0_w',`di')
358        define(`carg0_b',`dil')
359        define(`Rcarg0',`7')
360
361define(`carg1',`rsi')
362        define(`carg1_l',`esi')
363        define(`carg1_w',`si')
364        define(`carg1_b',`sil')
365        define(`carg1_z',`6')
366
367define(`carg2',`rdx')
368        define(`carg2_l',`edx')
369        define(`carg2_w',`dx')
370        define(`carg2_b',`dl')
371        define(`Rcarg2',`2')
372       
373define(`carg3',`rcx')
374        define(`carg3_l',`ecx')
375        define(`carg3_w',`cx')
376        define(`carg3_b',`cl')
377        define(`Rcarg3',`1')
378       
379define(`carg4',`r8')
380        define(`carg4_l',`r8d')
381        define(`carg4_w',`r8w')
382        define(`carg4_b',`r8b')
383        define(`Rcarg4',`8')
384
385define(`carg5',`r9')
386        define(`carg5_l',`r9d')
387        define(`carg5_w',`r9w')
388        define(`carg5_b',`r9b')
389        define(`Rcarg5',`9')   
390')
391       
392nbits_in_word = 64
393nbits_in_byte = 8
394ntagbits = 4
395nlisptagbits = 3
396nfixnumtagbits = 3
397nlowtagbits = 2       
398num_subtag_bits = 8
399subtag_shift = num_subtag_bits 
400fixnumshift = 3
401fixnum_shift = 3
402fulltagmask = 15
403tagmask = 7
404fixnummask = 7
405ncharcodebits = 8
406charcode_shift = 8
407word_shift = 3
408node_size = 8
409dnode_size = 16
410dnode_align_bits = 4
411dnode_shift = dnode_align_bits       
412bitmap_shift = 6
413       
414fixnumone = (1<<fixnumshift)
415fixnum_one = fixnumone
416fixnum1 = fixnumone
417
418nargregs = 3
419nsaveregs = 4   
420               
421
422tag_fixnum = 0
423tag_imm_0 = 1           /* subtag_single_float ONLY   */
424tag_imm_1 = 2           /* subtag_character, internal markers   */
425tag_list = 3            /* fulltag_cons or NIL   */
426tag_tra = 4             /* tagged return_address   */
427tag_misc = 5            /* random uvector   */
428tag_symbol = 6          /* non-null symbol   */
429tag_function = 7        /* function entry point   */
430
431tag_single_float = tag_imm_0
432               
433fulltag_even_fixnum = 0
434fulltag_imm_0 = 1               /* subtag_single_float (ONLY)   */
435fulltag_imm_1 = 2               /* subtag_character (mostly)   */
436fulltag_cons = 3
437fulltag_tra_0 = 4               /* tagged return address   */
438fulltag_nodeheader_0 = 5
439fulltag_nodeheader_1 = 6
440fulltag_immheader_0 = 7
441fulltag_odd_fixnum = 8
442fulltag_immheader_1 = 9
443fulltag_immheader_2 = 10
444fulltag_nil = 11
445fulltag_tra_1 = 12
446fulltag_misc = 13
447fulltag_symbol = 14
448fulltag_function = 15
449
450define(`define_subtag',`
451subtag_$1 = ($2 | ($3 << ntagbits))
452')
453       
454
455define_subtag(arrayH,fulltag_nodeheader_0,10)
456define_subtag(vectorH,fulltag_nodeheader_1,10)
457define_subtag(simple_vector,fulltag_nodeheader_1,11)
458min_vector_subtag = subtag_vectorH
459min_array_subtag = subtag_arrayH
460       
461       
462ivector_class_64_bit = fulltag_immheader_2
463ivector_class_32_bit = fulltag_immheader_1
464ivector_class_other_bit = fulltag_immheader_0
465
466define_subtag(fixnum_vector,ivector_class_64_bit,12)
467define_subtag(s64_vector,ivector_class_64_bit,13)
468define_subtag(u64_vector,ivector_class_64_bit,14)
469define_subtag(double_float_vector,ivector_class_64_bit,15)
470
471define_subtag(simple_base_string,ivector_class_32_bit,12)
472define_subtag(s32_vector,ivector_class_32_bit,13)
473define_subtag(u32_vector,ivector_class_32_bit,14)
474define_subtag(single_float_vector,ivector_class_32_bit,15)
475       
476define_subtag(s16_vector,ivector_class_other_bit,10)
477define_subtag(u16_vector,ivector_class_other_bit,11)
478define_subtag(s8_vector,ivector_class_other_bit,13)
479define_subtag(u8_vector,ivector_class_other_bit,14)
480define_subtag(bit_vector,ivector_class_other_bit,15)
481
482
483/* There's some room for expansion in non-array ivector space.   */
484define_subtag(macptr,ivector_class_64_bit,1)
485define_subtag(dead_macptr,ivector_class_64_bit,2)
486define_subtag(bignum,ivector_class_32_bit,1)
487define_subtag(double_float,ivector_class_32_bit,2)
488define_subtag(xcode_vector,ivector_class_32_bit,3)
489
490       
491/* Note the difference between (e.g) fulltag_function - which  */
492/* defines what the low 4 bytes of a function pointer look like -  */
493/* and subtag_function - which describes what the subtag byte  */
494/* in a function header looks like.  (Likewise for fulltag_symbol  */
495/* and subtag_symbol)  */
496               
497
498define_subtag(symbol,fulltag_nodeheader_0,1)
499define_subtag(catch_frame,fulltag_nodeheader_0,2)
500define_subtag(hash_vector,fulltag_nodeheader_0,3)
501define_subtag(pool,fulltag_nodeheader_0,4)
502define_subtag(weak,fulltag_nodeheader_0,5)
503define_subtag(package,fulltag_nodeheader_0,6)
504define_subtag(slot_vector,fulltag_nodeheader_0,7)
505define_subtag(basic_stream,fulltag_nodeheader_0,8)
506define_subtag(function,fulltag_nodeheader_0,9)
507       
508define_subtag(ratio,fulltag_nodeheader_1,1)
509define_subtag(complex,fulltag_nodeheader_1,2)
510define_subtag(struct,fulltag_nodeheader_1,3)
511define_subtag(istruct,fulltag_nodeheader_1,4)
512define_subtag(value_cell,fulltag_nodeheader_1,5)
513define_subtag(xfunction,fulltag_nodeheader_1,6)
514define_subtag(lock,fulltag_nodeheader_1,7)
515define_subtag(instance,fulltag_nodeheader_1,8)
516       
517                       
518nil_value = (0x13000+fulltag_nil)
519t_value = (0x13020+fulltag_symbol)
520misc_bias = fulltag_misc
521cons_bias = fulltag_cons
522define(`t_offset',(t_value-nil_value))
523       
524misc_header_offset = -fulltag_misc
525misc_data_offset = misc_header_offset+node_size /* first word of data    */
526misc_subtag_offset = misc_header_offset       /* low byte of header   */
527misc_dfloat_offset = misc_data_offset           /* double-floats are doubleword-aligned   */
528function_header_offset = -fulltag_function
529function_data_offset = function_header_offset+node_size
530
531define_subtag(single_float,fulltag_imm_0,0)
532
533
534define_subtag(character,fulltag_imm_1,0)
535                       
536define_subtag(unbound,fulltag_imm_1,1)
537unbound_marker = subtag_unbound
538undefined = unbound_marker
539define_subtag(slot_unbound,fulltag_imm_1,2)
540slot_unbound_marker = subtag_slot_unbound
541define_subtag(illegal,fulltag_imm_1,3)
542illegal_marker = subtag_illegal
543define_subtag(no_thread_local_binding,fulltag_imm_1,4)
544no_thread_local_binding_marker = subtag_no_thread_local_binding
545define_subtag(reserved_frame,fulltag_imm_1,5)
546reserved_frame_marker = subtag_reserved_frame
547define_subtag(function_boundary_marker,fulltag_imm_1,15)                       
548
549       
550
551
552       
553/* The objects themselves look something like this:   */
554       
555/* Order of CAR and CDR doesn't seem to matter much - there aren't   */
556/* too many tricks to be played with predecrement/preincrement addressing.   */
557/* Keep them in the confusing MCL 3.0 order, to avoid confusion.   */
558        _struct(cons,-cons_bias)
559         _node(cdr)
560         _node(car)
561        _ends
562       
563        _structf(ratio)
564         _node(numer)
565         _node(denom)
566        _endstructf
567       
568        _structf(double_float)
569         _word(value)
570         _word(val_low)
571        _endstructf
572       
573        _structf(macptr)
574         _node(address)
575         _node(domain)
576         _node(type)
577        _endstructf
578       
579/* Functions are of (conceptually) unlimited size.  */
580       
581        _struct(_function,-misc_bias)
582         _node(header)
583         _node(codevector)
584        _ends
585
586        _struct(tsp_frame,0)
587         _node(backlink)
588         _node(save_rbp)
589         _struct_label(fixed_overhead)
590         _struct_label(data_offset)
591        _ends
592
593        _struct(csp_frame,0)
594         _node(backlink)
595         _node(save_rbp)
596         _struct_label(fixed_overhead)
597         _struct_label(data_offset)
598        _ends
599       
600
601
602        _structf(symbol,-fulltag_symbol)
603         _node(pname)
604         _node(vcell)
605         _node(fcell)
606         _node(package_predicate)
607         _node(flags)
608         _node(plist)
609         _node(binding_index)
610        _endstructf
611
612        _structf(catch_frame)
613         _node(catch_tag)       /* #<unbound> -> unwind-protect, else catch   */
614         _node(link)            /* backpointer to previous catch frame   */
615         _node(mvflag)          /* 0 if single-valued catch, fixnum 1 otherwise   */
616         _node(rsp)             /* saved lisp sp   */
617         _node(rbp)             /* saved lisp rbp   */
618         _node(foreign_sp)      /* necessary ?    */
619         _node(db_link)         /* head of special-binding chain   */
620         _node(_save3)
621         _node(_save2)
622         _node(_save1)
623         _node(_save0)
624         _node(xframe)          /* exception frame chain   */
625         _node(pc)              /* TRA of catch exit or cleanup form   */
626        _endstructf
627
628
629        _structf(vectorH)
630         _node(logsize)
631         _node(physsize)
632         _node(data_vector)
633         _node(displacement)
634         _node(flags)
635        _endstructf     
636
637        _structf(arrayH)
638         _node(rank)
639         _node(physsize)
640         _node(data_vector)
641         _node(displacement)
642         _node(flags)
643         _struct_label(dim0)       
644        _endstructf     
645               
646       
647        _struct(c_frame,0)      /* PowerOpen ABI C stack frame   */
648         _node(backlink)
649         _node(crsave)
650         _node(savelr)
651         _field(unused, 16)
652         _node(savetoc)
653         _struct_label(params)
654         _node(param0)
655         _node(param1)
656         _node(param2)
657         _node(param3)
658         _node(param4)
659         _node(param5)
660         _node(param6)
661         _node(param7)
662         _struct_label(minsiz)
663        _ends
664
665
666        _struct(eabi_c_frame,0)
667         _word(backlink)
668         _word(savelr)
669         _word(param0)
670         _word(param1)
671         _word(param2)
672         _word(param3)
673         _word(param4)
674         _word(param5)
675         _word(param6)
676         _word(param7)
677         _struct_label(minsiz)
678        _ends
679
680        /* For entry to variable-argument-list functions   */
681        /* (e.g., via callback)   */
682        _struct(varargs_eabi_c_frame,0)
683         _word(backlink)
684         _word(savelr)
685         _struct_label(va_list)
686         _word(flags)           /* gpr count byte, fpr count byte, padding   */
687         _word(overflow_arg_area)
688         _word(reg_save_area)
689         _field(padding,4)
690         _struct_label(regsave)
691         _field(gp_save,8*4)
692         _field(fp_save,8*8)
693         _word(old_backlink)
694         _word(old_savelr)
695         _struct_label(incoming_stack_args)
696        _ends
697               
698        _struct(lisp_frame,0)
699         _node(backlink)
700         _node(savera0)
701        _ends
702
703        _struct(vector,-fulltag_misc)
704         _node(header)
705         _struct_label(data)
706        _ends
707
708        _struct(binding,0)
709         _node(link)
710         _node(sym)
711         _node(val)
712        _ends
713
714
715/* Nilreg-relative globals.  Talking the assembler into doing  */
716/* something reasonable here  */
717/* is surprisingly hard.   */
718
719symbol_extra = symbol.size-fulltag_symbol
720
721       
722        _struct(nrs,0x13020)
723         _struct_pad(fulltag_symbol)
724         _struct_label(tsym)
725         _struct_pad(symbol_extra)      /* t    */
726
727         _struct_pad(fulltag_symbol)
728         _struct_label(nil)
729         _struct_pad(symbol_extra)      /* nil    */
730
731         _struct_pad(fulltag_symbol)
732         _struct_label(errdisp)
733         _struct_pad(symbol_extra)      /* %err-disp    */
734
735         _struct_pad(fulltag_symbol)
736         _struct_label(cmain)
737         _struct_pad(symbol_extra)      /* cmain    */
738
739         _struct_pad(fulltag_symbol)
740         _struct_label(eval)
741         _struct_pad(symbol_extra)      /* eval    */
742 
743         _struct_pad(fulltag_symbol)
744         _struct_label(appevalfn)
745         _struct_pad(symbol_extra)      /* apply-evaluated-function    */
746
747         _struct_pad(fulltag_symbol)
748         _struct_label(error)
749         _struct_pad(symbol_extra)      /* error    */
750
751         _struct_pad(fulltag_symbol)
752         _struct_label(defun)
753         _struct_pad(symbol_extra)      /* %defun    */
754
755         _struct_pad(fulltag_symbol)
756         _struct_label(defvar)
757         _struct_pad(symbol_extra)      /* %defvar    */
758
759         _struct_pad(fulltag_symbol)
760         _struct_label(defconstant)
761         _struct_pad(symbol_extra)      /* %defconstant    */
762
763         _struct_pad(fulltag_symbol)
764         _struct_label(macrosym)
765         _struct_pad(symbol_extra)      /* %macro    */
766
767         _struct_pad(fulltag_symbol)
768         _struct_label(kernelrestart)
769         _struct_pad(symbol_extra)      /* %kernel-restart    */
770
771         _struct_pad(fulltag_symbol)
772         _struct_label(package)
773         _struct_pad(symbol_extra)      /* *package*    */
774
775         _struct_pad(fulltag_symbol)
776         _struct_label(total_bytes_freed)               /* *total-bytes-freed*   */
777         _struct_pad(symbol_extra)
778
779         _struct_pad(fulltag_symbol)
780         _struct_label(kallowotherkeys)
781         _struct_pad(symbol_extra)      /* allow-other-keys    */
782
783         _struct_pad(fulltag_symbol)
784         _struct_label(toplcatch)
785         _struct_pad(symbol_extra)      /* %toplevel-catch%    */
786
787         _struct_pad(fulltag_symbol)
788         _struct_label(toplfunc)
789         _struct_pad(symbol_extra)      /* %toplevel-function%    */
790
791         _struct_pad(fulltag_symbol)
792         _struct_label(callbacks)
793         _struct_pad(symbol_extra)      /* %pascal-functions%    */
794
795         _struct_pad(fulltag_symbol)
796         _struct_label(heap_init_function)
797         _struct_pad(symbol_extra)      /* *heap-init-function*    */
798
799         _struct_pad(fulltag_symbol)
800         _struct_label(total_gc_microseconds)           /* *total-gc-microseconds*   */
801         _struct_pad(symbol_extra)
802
803         _struct_pad(fulltag_symbol)
804         _struct_label(builtin_functions)               /* %builtin-functions%   */
805         _struct_pad(symbol_extra)               
806
807         _struct_pad(fulltag_symbol)
808         _struct_label(udf)
809         _struct_pad(symbol_extra)      /* %unbound-function%    */
810
811         _struct_pad(fulltag_symbol)
812         _struct_label(init_misc)
813         _struct_pad(symbol_extra)      /* %init-misc   */
814
815         _struct_pad(fulltag_symbol)
816         _struct_label(macro_code)
817         _struct_pad(symbol_extra)      /* %macro-code%   */
818
819         _struct_pad(fulltag_symbol)
820         _struct_label(closure_code)
821         _struct_pad(symbol_extra)      /* %closure-code%   */
822
823         _struct_pad(fulltag_symbol)
824         _struct_label(new_gcable_ptr) /* %new-gcable-ptr   */
825         _struct_pad(symbol_extra)
826       
827         _struct_pad(fulltag_symbol)
828         _struct_label(gc_event_status_bits)
829         _struct_pad(symbol_extra)      /* *gc-event-status-bits*    */
830
831         _struct_pad(fulltag_symbol)
832         _struct_label(post_gc_hook)
833         _struct_pad(symbol_extra)      /* *post-gc-hook*    */
834
835         _struct_pad(fulltag_symbol)
836         _struct_label(handlers)
837         _struct_pad(symbol_extra)      /* %handlers%    */
838
839
840         _struct_pad(fulltag_symbol)
841         _struct_label(all_packages)
842         _struct_pad(symbol_extra)      /* %all-packages%    */
843
844         _struct_pad(fulltag_symbol)
845         _struct_label(keyword_package)
846         _struct_pad(symbol_extra)      /* *keyword-package*    */
847
848         _struct_pad(fulltag_symbol)
849         _struct_label(os_init_function)
850         _struct_pad(symbol_extra)      /* %os-init-function%    */
851
852         _struct_pad(fulltag_symbol)
853         _struct_label(foreign_thread_control)
854         _struct_pad(symbol_extra)      /* %foreign-thread-control    */
855
856        _ends
857
858define(`def_header',`
859$1 = ($2<<num_subtag_bits)|$3')
860
861        def_header(double_float_header,2,subtag_double_float)
862        def_header(two_digit_bignum_header,2,subtag_bignum)
863        def_header(three_digit_bignum_header,3,subtag_bignum)
864        def_header(four_digit_bignum_header,4,subtag_bignum)
865        def_header(five_digit_bignum_header,5,subtag_bignum)       
866        def_header(symbol_header,symbol.element_count,subtag_symbol)
867        def_header(value_cell_header,1,subtag_value_cell        )
868        def_header(macptr_header,macptr.element_count,subtag_macptr)
869        def_header(vectorH_header,vectorH.element_count,subtag_vectorH)
870
871        include(errors.s)
872
873/* Symbol bits that we care about  */
874       
875sym_vbit_bound = (0+fixnum_shift)
876sym_vbit_bound_mask = (1<<sym_vbit_bound)
877sym_vbit_const = (1+fixnum_shift)
878sym_vbit_const_mask = (1<<sym_vbit_const)
879
880        _struct(area,0)
881         _node(pred) 
882         _node(succ) 
883         _node(low) 
884         _node(high) 
885         _node(active) 
886         _node(softlimit) 
887         _node(hardlimit) 
888         _node(code) 
889         _node(markbits) 
890         _node(ndwords) 
891         _node(older) 
892         _node(younger) 
893         _node(h) 
894         _node(sofprot) 
895         _node(hardprot) 
896         _node(owner) 
897         _node(refbits) 
898         _node(nextref) 
899        _ends
900
901
902
903TCR_BIAS = 0
904               
905/*  Thread context record.  */
906
907        _struct(tcr,TCR_BIAS)
908         _node(prev)            /* in doubly-linked list   */
909         _node(next)            /* in doubly-linked list   */
910         _node(single_float_convert)
911         _node(linear)          /* our linear (non-segment-based) address.   */
912         _node(save_rbp)        /* lisp RBP when in foreign code    */
913         _word(lisp_mxcsr)
914         _word(foreign_mxcsr)   
915         _node(db_link)         /* special binding chain head   */
916         _node(catch_top)       /* top catch frame   */
917         _node(save_vsp)        /* VSP when in foreign code   */
918         _node(save_tsp)        /* TSP when in foreign code   */
919         _node(foreign_sp)      /* Saved foreign SP when in lisp code   */
920         _node(cs_area)         /* cstack area pointer   */
921         _node(vs_area)         /* vstack area pointer   */
922         _node(ts_area)         /* tstack area pointer   */
923         _node(cs_limit)        /* cstack overflow limit   */
924         _word(bytes_consed_low)
925         _word(bytes_consed_high)
926         _node(log2_allocation_quantum)
927         _node(interrupt_pending)
928         _node(xframe)          /* per-thread exception frame list   */
929         _node(errno_loc)       /* per-thread  errno location   */
930         _node(ffi_exception)   /* mxcsr exception bits from ff-call   */
931         _node(osid)            /* OS thread id   */
932         _node(valence)         /* odd when in foreign code       */
933         _node(foreign_exception_status)
934         _node(native_thread_info)
935         _node(native_thread_id)
936         _node(last_allocptr)
937         _node(save_allocptr)
938         _node(save_allocbase)
939         _node(reset_completion)
940         _node(activate)
941         _node(suspend_count)
942         _node(suspend_context)
943         _node(pending_exception_context)
944         _node(suspend)         /* semaphore for suspension notify   */
945         _node(resume)          /* sempahore for resumption notify   */
946         _node(flags)     
947         _node(gc_context)
948         _node(termination_semaphore)
949         _node(unwinding)
950         _node(tlb_limit)
951         _node(tlb_pointer)     /* Consider using tcr+N as tlb_pointer   */
952         _node(shutdown_count)
953         _node(next_tsp)
954         _node(safe_ref_address)
955         _node(pending_io_info)
956         _node(io_datum)
957        _ends
958
959        _struct(win64_context,0)
960         _field(P1Home, 8)
961         _field(P2Home, 8)
962         _field(P3Home, 8)
963         _field(P4Home, 8)
964         _field(P5Home, 8)
965         _field(P6Home, 8)
966         _field(ContextFlags, 4)
967         _field(MxCsr, 4)
968         _field(SegCs, 2)
969         _field(SegDs, 2)
970         _field(SegEs, 2)
971         _field(SegFs, 2)
972         _field(SegGs, 2)
973         _field(SegSs, 2)
974         _field(EFlags, 4)
975         _field(Dr0, 8)
976         _field(Dr1, 8)
977         _field(Dr2, 8)
978         _field(Dr3, 8)
979         _field(Dr6, 8)
980         _field(Dr7, 8)
981         _field(Rax, 8)
982         _field(Rcx, 8)
983         _field(Rdx, 8)
984         _field(Rbx, 8)
985         _field(Rsp, 8)
986         _field(Rbp, 8)
987         _field(Rsi, 8)
988         _field(Rdi, 8)
989         _field(R8, 8)
990         _field(R9, 8)
991         _field(R10, 8)
992         _field(R11, 8)
993         _field(R12, 8)
994         _field(R13, 8)
995         _field(R14, 8)
996         _field(R15, 8)
997         _field(Rip, 8)
998         _struct_label(fpstate)
999         _field(Header, 32)
1000         _field(Legacy, 128)
1001         _field(Xmm0, 16)
1002         _field(Xmm1, 16)       
1003         _field(Xmm2, 16)       
1004         _field(Xmm3, 16)       
1005         _field(Xmm4, 16)       
1006         _field(Xmm5, 16)       
1007         _field(Xmm6, 16)       
1008         _field(Xmm7, 16)       
1009         _field(Xmm8, 16)       
1010         _field(Xmm9, 16)       
1011         _field(Xmm10, 16)       
1012         _field(Xmm11, 16)       
1013         _field(Xmm12, 16)       
1014         _field(Xmm13, 16)       
1015         _field(Xmm14, 16)       
1016         _field(Xmm15, 16)
1017         _field(__pad, 96)
1018         _field(VectorRegister, 416)
1019         _field(VectorControl, 8)
1020         _field(DebugControl, 8)
1021         _field(LastBranchToRip, 8)
1022         _field(LastBranchFromRip, 8)
1023         _field(LastExceptionToRip, 8)
1024         _field(LastExceptionFromRip, 8)
1025 _ends
1026
1027       
1028target_most_positive_fixnum = 1152921504606846975
1029target_most_negative_fixnum = -1152921504606846976
1030call_arguments_limit = 0x10000
1031
1032lisp_globals_limit = 0x13000
1033
1034INTERRUPT_LEVEL_BINDING_INDEX = fixnumone
1035
1036c_stack_16_byte_aligned = 1
Note: See TracBrowser for help on using the repository browser.