source: release/1.7/source/lisp-kernel/x86-constants64.s @ 15267

Last change on this file since 15267 was 13952, checked in by rme, 9 years ago

New scheme for dealing with floating point exceptions on x86-64 systems.

Currently, we mask floating point execptions around all foreign function
calls. While this may not be a huge component of FF call overhead, it
makes sense to avoid doing this for what is presumably an exceptional
case.

We now leave floating point exceptions enabled, but the exception
handler in the lisp kernel is prepared to deal with them: it saves
lisp's MXCSR, masks all floating point exceptions, and resumes
execution (after setting a flag in the TCR to note what it has done).
At the end of .SPffcall, we check this flag. If it is set, we
save the fp exception status, and restore lisp's original MXCSR.

  • 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(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       
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.