source: branches/working-0711/ccl/lisp-kernel/x86-constants64.s @ 13409

Last change on this file since 13409 was 13409, checked in by rme, 11 years ago

Increase CALL-ARGUMENTS-LIMIT on non ppc ports. (r13406 from trunk)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 26.6 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(allmeteredfuns)
797         _struct_pad(symbol_extra)      /* *all-metered-functions*    */
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(finalization_alist)
850         _struct_pad(symbol_extra)      /* %finalization-alist%    */
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       
1028TCR_FLAG_BIT_FOREIGN = fixnum_shift
1029TCR_FLAG_BIT_AWAITING_PRESET = (fixnum_shift+1) 
1030TCR_FLAG_BIT_ALT_SUSPEND = (fixnumshift+2)
1031TCR_FLAG_BIT_PROPAGATE_EXCEPTION = (fixnumshift+3)
1032TCR_FLAG_BIT_SUSPEND_ACK_PENDING = (fixnumshift+4)
1033TCR_FLAG_BIT_PENDING_EXCEPTION = (fixnumshift+5)
1034TCR_FLAG_BIT_FOREIGN_EXCEPTION = (fixnumshift+6)
1035TCR_FLAG_BIT_PENDING_SUSPEND = (fixnumshift+7)       
1036       
1037target_most_positive_fixnum = 1152921504606846975
1038target_most_negative_fixnum = -1152921504606846976
1039call_arguments_limit = 0x10000
1040
1041lisp_globals_limit = 0x13000
1042
1043INTERRUPT_LEVEL_BINDING_INDEX = fixnumone
1044
1045c_stack_16_byte_aligned = 1
Note: See TracBrowser for help on using the repository browser.