source: trunk/source/lisp-kernel/arm-constants.s @ 14347

Last change on this file since 14347 was 14119, checked in by gb, 9 years ago

Changes from ARM branch. Need testing ...

File size: 23.1 KB
Line 
1/*   Copyright (C) 2009 Clozure Associates */
2/*   Copyright (C) 1994-2001 Digitool, Inc */
3/*   This file is part of Clozure CL. */
4
5/*   Clozure CL is licensed under the terms of the Lisp Lesser GNU Public */
6/*   License , known as the LLGPL and distributed with Clozure CL as the */
7/*   file "LICENSE".  The LLGPL consists of a preamble and the LGPL, */
8/*   which is distributed with Clozure CL as the file "LGPL".  Where these */
9/*   conflict, the preamble takes precedence. */
10
11/*   Clozure CL is referenced in the preamble as the "LIBRARY." */
12
13/*   The LLGPL is also available online at */
14/*   http://opensource.franz.com/preamble.html */
15
16
17       
18nbits_in_word = 32
19nbits_in_byte = 8
20ntagbits = 3    /* But only 2 are significant to lisp */
21nlisptagbits = 2
22nfixnumtagbits = 2
23num_subtag_bits = 8
24fixnumshift = 2
25fixnum_shift = 2
26fulltagmask = 7
27tagmask = 3
28fixnummask = 3
29subtag_mask = 0xff       
30ncharcodebits = 24              /* arguably, we're only using the low 8 */
31charcode_shift = nbits_in_word-ncharcodebits
32word_shift = 2
33node_size = 4
34dnode_size = 8
35dnode_align_bits = 3
36dnode_shift = dnode_align_bits
37bitmap_shift = 5
38
39
40fixnumone = (1<<fixnumshift)
41fixnum_one = fixnumone
42fixnum1 = fixnumone
43
44/* registers.  These assignments may not be viable. */
45
46define(`imm0',`r0')             /* even, so ldrd/strd can use imm0/imm1 */
47define(`imm1',`r1')
48define(`imm2',`r2')
49/* rcontext = r3 can be used as an imm reg in certain contexts
50   (its value must be easily recovered, but that value never changes
51   during a thread's lifetime.)
52*/       
53define(`rcontext',`r3')         
54define(`arg_z',`r4')
55define(`arg_y',`r5')
56define(`arg_x',`r6')
57define(`temp0',`r7')
58define(`temp1',`r8')
59define(`temp2',`r9')
60define(`vsp',`r10')
61define(`fn',`r11')
62define(`allocptr',`r12')
63define(`sp',`r13')
64define(`lr',`r14')
65define(`pc',`r15')
66
67nargregs = 3
68               
69define(`fname',`temp1')
70define(`nfn',`temp2')
71define(`next_method_context',`temp1')
72define(`nargs',`imm2')
73define(`allocbase',`temp0')     /* while consing */
74
75/* ARM conditions */
76eq = 0
77ne = 1
78cs = 2
79hs = cs       
80cc = 3
81lo = cc       
82mi = 4
83pl = 5
84vs = 6
85vc = 7
86hi = 8
87ls = 9
88ge = 10
89lt = 11
90gt = 12
91le = 13
92al = 14
93
94/* Tags. */
95/* There are two-bit tags and three-bit tags. */
96/* A FULLTAG is the value of the low three bits of a tagged object. */
97/* A TAG is the value of the low two bits of a tagged object. */
98/* A TYPECODE is either a TAG or the value of a "tag-misc" objects header-byte. */
99
100/* There are 4 primary TAG values.  Any object which lisp can "see" can be classified */
101/* by its TAG.  (Some headers have FULLTAGS that are congruent modulo 4 with the */
102/* TAGS of other objects, but lisp can't "see" headers.) */
103
104
105tag_fixnum = 0  /* All fixnums, whether odd or even */
106tag_list = 1    /* Conses and NIL */
107tag_misc = 2    /* Heap-consed objects other than lists: vectors, symbols, functions, floats ... */
108tag_imm = 3     /* Immediate-objects: characters, UNBOUND, other markers. */
109
110
111/*  And there are 8 FULLTAG values.  Note that NIL has its own FULLTAG (congruent mod 4 to tag-list), */
112/*  that FULLTAG-MISC is > 4 (so that code-vector entry-points can be branched to, since the low */
113/*  two bits of the PC are ignored) and that both FULLTAG-MISC and FULLTAG-IMM have header fulltags */
114/*  that share the same TAG. */
115/*  Things that walk memory (and the stack) have to be careful to look at the FULLTAG of each */
116/*  object that they see. */
117
118
119fulltag_even_fixnum = 0 /* I suppose EVENP/ODDP might care; nothing else does. */
120fulltag_nil = 1 /* NIL and nothing but.  (Note that there's still a hidden NILSYM.) */
121fulltag_nodeheader = 2  /* Header of heap_allocated object that contains lisp_object pointers */
122fulltag_imm = 3 /* a "real" immediate object.  Shares TAG with fulltag_immheader. */
123fulltag_odd_fixnum = 4  /* */
124fulltag_cons = 5        /* a real (non_null) cons.  Shares TAG with fulltag_nil. */
125fulltag_misc = 6        /* Pointer "real" tag_misc object.  Shares TAG with fulltag_nodeheader. */
126fulltag_immheader = 7   /* Header of heap-allocated object that contains unboxed data. */
127
128nil_value = (0x04000000+fulltag_nil)
129misc_bias = fulltag_misc
130cons_bias = fulltag_cons   
131       
132unsigned_byte_24_mask = 0xe0000003 /* bits that should be clear in a boxed */
133                                   /* (UNSIGNED-BYTE 24) */
134           
135
136/* Functions are of (conceptually) unlimited size. */
137        _struct(_function,-misc_bias)
138         _node(header)
139         _node(entrypoint)      /* codevector & ~tagmask */
140         _node(codevector)
141        _ends
142
143        _struct(tsp_frame,0)
144         _node(backlink)
145         _node(type)
146         _struct_label(fixed_overhead)
147         _struct_label(data_offset)
148        _ends
149
150/* Order of CAR and CDR doesn't seem to matter much - there aren't */
151/* too many tricks to be played with predecrement/preincrement addressing. */
152/* Keep them in the confusing MCL 3.0 order, to avoid confusion. */
153        _struct(cons,-cons_bias)
154         _node(cdr)
155         _node(car)
156        _ends
157       
158misc_header_offset = -fulltag_misc
159misc_subtag_offset = misc_header_offset         /* low byte of header */
160misc_data_offset = misc_header_offset+4         /* first word of data */
161misc_dfloat_offset = misc_header_offset+8               /* double-floats are doubleword-aligned */
162
163max_64_bit_constant_index = ((0x0fff + misc_dfloat_offset)>>3)
164max_32_bit_constant_index = ((0x0fff + misc_data_offset)>>2)
165max_16_bit_constant_index = ((0x0fff + misc_data_offset)>>1)
166max_8_bit_constant_index = (0x0fff + misc_data_offset)
167max_1_bit_constant_index = ((0x0fff + misc_data_offset)<<5)
168
169/* T is almost adjacent to NIL: since NIL is a misaligned CONS, it spans */
170/* two doublewords.  The arithmetic difference between T and NIL is */
171/* such that the least-significant bit and exactly one other bit is */
172/* set in the result. */
173
174t_offset = ((dnode_size-fulltag_nil)+fulltag_misc)
175t_value = nil_value+t_offset
176
177/* The order in which various header values are defined is significant in several ways: */
178/* 1) Numeric subtags precede non-numeric ones; there are further orderings among numeric subtags. */
179/* 2) All subtags which denote CL arrays are preceded by those that don't, */
180/*    with a further ordering which requires that (< header-arrayH header-vectorH ,@all-other-CL-vector-types) */
181/* 3) The element-size of ivectors is determined by the ordering of ivector subtags. */
182/* 4) All subtags are >= fulltag-immheader . */
183
184define(`define_subtag',`
185subtag_$1 = $2|($3<<ntagbits)')
186       
187define(`define_imm_subtag',`
188        define_subtag($1,fulltag_immheader,$2)')
189
190       
191define(`define_node_subtag',`
192        define_subtag($1,fulltag_nodeheader,$2)')
193
194               
195/*Immediate subtags. */
196        define_subtag(stack_alloc_marker,fulltag_imm,1)
197        define_subtag(lisp_frame_marker,fulltag_imm,2)
198        define_subtag(character,fulltag_imm,9)
199        define_subtag(unbound,fulltag_imm,6)
200        define_subtag(illegal,fulltag_imm,10)
201        define_subtag(go_tag,fulltag_imm,12)
202        define_subtag(block_tag,fulltag_imm,24)
203        define_subtag(vsp_protect,fulltag_imm,7)
204        define_subtag(no_thread_local_binding,fulltag_imm,30)
205unbound_marker = subtag_unbound
206undefined = unbound_marker
207illegal_marker = subtag_illegal
208no_thread_local_binding_marker = subtag_no_thread_local_binding
209lisp_frame_marker = subtag_lisp_frame_marker
210stack_alloc_marker = subtag_stack_alloc_marker       
211       
212
213/*Numeric subtags. */
214
215        define_imm_subtag(bignum,0)
216min_numeric_subtag = subtag_bignum
217
218        define_node_subtag(ratio,1)
219max_rational_subtag = subtag_ratio
220
221        define_imm_subtag(single_float,1)
222        define_imm_subtag(double_float,2)
223min_float_subtag = subtag_single_float
224max_float_subtag = subtag_double_float
225max_real_subtag = subtag_double_float
226
227        define_node_subtag(complex,3)
228max_numeric_subtag = subtag_complex
229
230
231/* CL array types.  There are more immediate types than node types; all CL array subtags must be > than */
232/* all non-CL-array subtags.  So we start by defining the immediate subtags in decreasing order, starting */
233/* with that subtag whose element size isn't an integral number of bits and ending with those whose */
234/* element size - like all non-CL-array fulltag-immheader types - is 32 bits. */
235
236        define_imm_subtag(bit_vector,31)
237        define_imm_subtag(double_float_vector,30)
238        define_imm_subtag(s16_vector,29)
239        define_imm_subtag(u16_vector,28)
240min_16_bit_ivector_subtag = subtag_u16_vector
241max_16_bit_ivector_subtag = subtag_s16_vector
242        define_imm_subtag(s8_vector,26)
243        define_imm_subtag(u8_vector,25)
244min_8_bit_ivector_subtag = subtag_u8_vector
245max_8_bit_ivector_subtag = fulltag_immheader|(27<<ntagbits)
246        define_imm_subtag(simple_base_string,24)
247        define_imm_subtag(fixnum_vector,23)
248        define_imm_subtag(s32_vector,22)
249        define_imm_subtag(u32_vector,21)
250        define_imm_subtag(single_float_vector,20)
251max_32_bit_ivector_subtag = fulltag_immheader|(24<<ntagbits)
252min_cl_ivector_subtag = subtag_single_float_vector
253
254
255        define_node_subtag(vectorH,20)
256        define_node_subtag(arrayH,19)
257        define_node_subtag(simple_vector,21)
258min_vector_subtag = subtag_vectorH
259min_array_subtag = subtag_arrayH
260
261/* So, we get the remaining subtags (n: (n > max-numeric-subtag) & (n < min-array-subtag)) */
262/* for various immediate/node object types. */
263
264        define_imm_subtag(macptr,3)
265min_non_numeric_imm_subtag = subtag_macptr
266
267        define_imm_subtag(dead_macptr,4)
268        define_imm_subtag(code_vector,5)
269        define_imm_subtag(creole,6)
270
271max_non_array_imm_subtag = (18<<ntagbits)|fulltag_immheader
272
273        define_node_subtag(catch_frame,4)
274        define_node_subtag(function,5)
275        define_node_subtag(basic_stream,6)
276        define_node_subtag(symbol,7)
277        define_node_subtag(lock,8)
278        define_node_subtag(hash_vector,9)
279        define_node_subtag(pool,10)
280        define_node_subtag(weak,11)
281        define_node_subtag(package,12)
282        define_node_subtag(slot_vector,13)
283        define_node_subtag(instance,14)
284        define_node_subtag(struct,15)
285        define_node_subtag(istruct,16)
286        define_node_subtag(value_cell,17)
287        define_node_subtag(xfunction,18)
288max_non_array_node_subtag = (18<<ntagbits)|fulltag_immheader
289       
290/* The objects themselves look something like this: */
291        _structf(ratio)
292         _node(numer)
293         _node(denom)
294        _endstructf
295
296        _structf(single_float)
297         _word(value)
298        _endstructf
299
300        _structf(double_float)
301         _word(pad)
302         _dword(value)
303        _endstructf
304
305        _structf(symbol)
306         _node(pname)
307         _node(vcell)
308         _node(fcell)
309         _node(package_predicate)
310         _node(flags)
311         _node(plist)
312         _node(binding_index)
313        _endstructf
314
315        _structf(catch_frame)
316         _node(link)            /* backpointer to previous catch frame */
317         _node(mvflag)          /* 0 if single-valued catch, fixnum 1 otherwise */
318         _node(catch_tag)       /* #<unbound> -> unwind-protect, else catch */
319         _node(db_link)         /* head of special-binding chain */
320         _node(xframe)          /* exception frame chain */
321         _node(last_lisp_frame) /* from TCR */
322         _node(code_vector)     /* of fn in lisp_frame, or 0 */
323        _endstructf
324
325        _structf(macptr)
326         _node(address)
327         _node(domain)
328         _node(type)
329        _endstructf
330
331        _structf(vectorH)
332         _node(logsize)
333         _node(physsize)
334         _node(data_vector)
335         _node(displacement)
336         _node(flags)
337        _endstructf
338
339        _structf(arrayH)
340         _node(rank)
341         _node(physsize)
342         _node(data_vector)
343         _node(displacement)
344         _node(flags)
345         _struct_label(dim0)
346        _endstructf
347       
348       
349               
350        _struct(lisp_frame,0)
351         _node(marker)
352         _node(savevsp) 
353         _node(savefn) 
354         _node(savelr) 
355        _ends
356       
357
358
359        _struct(vector,-fulltag_misc)
360         _node(header)
361         _struct_label(data)
362        _ends
363
364        _struct(binding,0)
365         _node(link)
366         _node(sym)
367         _node(val)
368        _ends
369
370/* Indices in %builtin-functions% */
371_builtin_plus = 0       /* +-2 */
372_builtin_minus = 1      /* --2 */
373_builtin_times = 2      /* *-2 */
374_builtin_div = 3        /* /-2 */
375_builtin_eq = 4         /* =-2 */
376_builtin_ne = 5         /* /-2 */
377_builtin_gt = 6         /* >-2 */
378_builtin_ge = 7         /* >=-2 */
379_builtin_lt = 8         /* <-2 */
380_builtin_le = 9         /* <=-2 */
381_builtin_eql = 10       /* eql */
382_builtin_length = 11    /* length */
383_builtin_seqtype = 12   /* sequence-type */
384_builtin_assq = 13      /* assq */
385_builtin_memq = 14      /* memq */
386_builtin_logbitp = 15   /* logbitp */
387_builtin_logior = 16    /* logior-2 */
388_builtin_logand = 17    /* logand-2 */
389_builtin_ash = 18       /* ash */
390_builtin_negate = 19    /* %negate */
391_builtin_logxor = 20    /* logxor-2 */
392_builtin_aref1 = 21     /* %aref1 */
393_builtin_aset1 = 22     /* %aset1 */
394
395
396symbol_extra = symbol.size-fulltag_misc
397       
398        _struct(nrs,0)
399         _struct_pad(dnode_size-fulltag_nil)
400
401         _struct_pad(fulltag_misc)
402         _struct_label(tsym)
403         _struct_pad(symbol_extra)      /* t */
404
405         _struct_pad(fulltag_misc)
406         _struct_label(nilsym)
407         _struct_pad(symbol_extra)      /* nil */
408
409         _struct_pad(fulltag_misc)
410         _struct_label(errdisp)
411         _struct_pad(symbol_extra)      /* %err-disp */
412
413         _struct_pad(fulltag_misc)
414         _struct_label(cmain)
415         _struct_pad(symbol_extra)      /* cmain */
416
417         _struct_pad(fulltag_misc)
418         _struct_label(eval)
419         _struct_pad(symbol_extra)      /* eval */
420 
421         _struct_pad(fulltag_misc)
422         _struct_label(appevalfn)
423         _struct_pad(symbol_extra)      /* apply-evaluated-function */
424
425         _struct_pad(fulltag_misc)
426         _struct_label(error)
427         _struct_pad(symbol_extra)      /* error */
428
429         _struct_pad(fulltag_misc)
430         _struct_label(defun)
431         _struct_pad(symbol_extra)      /* %defun */
432
433         _struct_pad(fulltag_misc)
434         _struct_label(defvar)
435         _struct_pad(symbol_extra)      /* %defvar */
436
437         _struct_pad(fulltag_misc)
438         _struct_label(defconstant)
439         _struct_pad(symbol_extra)      /* %defconstant */
440
441         _struct_pad(fulltag_misc)
442         _struct_label(macrosym)
443         _struct_pad(symbol_extra)      /* %macro */
444
445         _struct_pad(fulltag_misc)
446         _struct_label(kernelrestart)
447         _struct_pad(symbol_extra)      /* %kernel-restart */
448
449         _struct_pad(fulltag_misc)
450         _struct_label(package)
451         _struct_pad(symbol_extra)      /* *package* */
452
453         _struct_pad(fulltag_misc)
454         _struct_label(total_bytes_freed)               /* *total-bytes-freed* */
455         _struct_pad(symbol_extra)
456
457         _struct_pad(fulltag_misc)
458         _struct_label(kallowotherkeys)
459         _struct_pad(symbol_extra)      /* allow-other-keys */
460
461         _struct_pad(fulltag_misc)
462         _struct_label(toplcatch)
463         _struct_pad(symbol_extra)      /* %toplevel-catch% */
464
465         _struct_pad(fulltag_misc)
466         _struct_label(toplfunc)
467         _struct_pad(symbol_extra)      /* %toplevel-function% */
468
469         _struct_pad(fulltag_misc)
470         _struct_label(callbacks)
471         _struct_pad(symbol_extra)      /* %pascal-functions% */
472
473         _struct_pad(fulltag_misc)
474         _struct_label(allmeteredfuns)
475         _struct_pad(symbol_extra)      /* *all-metered-functions* */
476
477         _struct_pad(fulltag_misc)
478         _struct_label(total_gc_microseconds)           /* *total-gc-microseconds* */
479         _struct_pad(symbol_extra)
480
481         _struct_pad(fulltag_misc)
482         _struct_label(builtin_functions)               /* %builtin-functions% */
483         _struct_pad(symbol_extra)               
484
485         _struct_pad(fulltag_misc)
486         _struct_label(udf)
487         _struct_pad(symbol_extra)      /* %unbound-function% */
488
489         _struct_pad(fulltag_misc)
490         _struct_label(init_misc)
491         _struct_pad(symbol_extra)      /* %init-misc */
492
493         _struct_pad(fulltag_misc)
494         _struct_label(macro_code)
495         _struct_pad(symbol_extra)      /* %macro-code% */
496
497         _struct_pad(fulltag_misc)
498         _struct_label(closure_code)
499         _struct_pad(symbol_extra)      /* %closure-code% */
500
501         _struct_pad(fulltag_misc)
502         _struct_label(new_gcable_ptr) /* %new-gcable-ptr */
503         _struct_pad(symbol_extra)
504       
505         _struct_pad(fulltag_misc)
506         _struct_label(gc_event_status_bits)
507         _struct_pad(symbol_extra)      /* *gc-event-status-bits* */
508
509         _struct_pad(fulltag_misc)
510         _struct_label(post_gc_hook)
511         _struct_pad(symbol_extra)      /* *post-gc-hook* */
512
513         _struct_pad(fulltag_misc)
514         _struct_label(handlers)
515         _struct_pad(symbol_extra)      /* %handlers% */
516
517
518         _struct_pad(fulltag_misc)
519         _struct_label(all_packages)
520         _struct_pad(symbol_extra)      /* %all-packages% */
521
522         _struct_pad(fulltag_misc)
523         _struct_label(keyword_package)
524         _struct_pad(symbol_extra)      /* *keyword-package* */
525
526         _struct_pad(fulltag_misc)
527         _struct_label(finalization_alist)
528         _struct_pad(symbol_extra)      /* %finalization-alist% */
529
530         _struct_pad(fulltag_misc)
531         _struct_label(foreign_thread_control)
532         _struct_pad(symbol_extra)      /* %foreign-thread-control */
533
534        _ends
535
536define(`def_header',`
537$1 = ($2<<num_subtag_bits)|$3')
538
539        def_header(single_float_header,single_float.element_count,subtag_single_float)
540        def_header(double_float_header,double_float.element_count,subtag_double_float)
541        def_header(one_digit_bignum_header,1,subtag_bignum)
542        def_header(two_digit_bignum_header,2,subtag_bignum)
543        def_header(three_digit_bignum_header,3,subtag_bignum)
544        def_header(symbol_header,symbol.element_count,subtag_symbol)
545        def_header(value_cell_header,1,subtag_value_cell        )
546        def_header(macptr_header,macptr.element_count,subtag_macptr)
547        def_header(vectorH_header,vectorH.element_count,subtag_vectorH)
548
549        include(errors.s)
550
551/* Symbol bits that we care about */
552sym_vbit_bound = (0+fixnum_shift)
553sym_vbit_bound_mask = (1<<sym_vbit_bound)
554sym_vbit_const = (1+fixnum_shift)
555sym_vbit_const_mask = (1<<sym_vbit_const)
556
557        _struct(area,0)
558         _node(pred)
559         _node(succ)
560         _node(low)
561         _node(high)
562         _node(active)
563         _node(softlimit)
564         _node(hardlimit)
565         _node(code)
566         _node(markbits)
567         _node(ndwords)
568         _node(older)
569         _node(younger)
570         _node(h)
571         _node(sofprot)
572         _node(hardprot)
573         _node(owner)
574         _node(refbits)
575         _node(nextref)
576        _ends
577
578
579
580
581TCR_BIAS = 0
582/* TCR_BIAS = 0x7000 */
583       
584/*  Thread context record. */
585
586        _struct(tcr,-TCR_BIAS)
587         _node(prev)            /* in doubly-linked list */
588         _node(next)            /* in doubly-linked list */
589         _node(lisp_fpscr)      /* lisp thread's fpscr (in low word) */
590         _node(pad)
591         _node(db_link)         /* special binding chain head */
592         _node(catch_top)       /* top catch frame */
593         _node(save_vsp)        /* VSP when in foreign code */
594         _node(save_tsp)        /* TSP when in foreign code */
595         _node(cs_area)         /* cstack area pointer */
596         _node(vs_area)         /* vstack area pointer */
597         _node(last_lisp_frame) /* when in foreign code */
598         _node(cs_limit)        /* cstack overflow limit */
599         _node(bytes_consed_low)
600         _node(bytes_consed_high)
601         _node(log2_allocation_quantum)
602         _node(interrupt_pending)
603         _node(xframe)          /* per-thread exception frame list */
604         _node(errno_loc)       /* per-thread  errno location */
605         _node(ffi_exception)   /* fpscr exception bits from ff-call */
606         _node(osid)            /* OS thread id */
607         _node(valence)         /* odd when in foreign code */
608         _node(foreign_exception_status)
609         _node(native_thread_info)
610         _node(native_thread_id)
611         _node(last_allocptr)
612         _node(save_allocptr)
613         _node(save_allocbase)
614         _node(reset_completion)
615         _node(activate)
616         _node(suspend_count)
617         _node(suspend_context)
618         _node(pending_exception_context)
619         _node(suspend)         /* semaphore for suspension notify */
620         _node(resume)          /* sempahore for resumption notify */
621         _node(flags)     
622         _node(gc_context)
623         _node(termination_semaphore)
624         _node(unwinding)
625         _node(tlb_limit)
626         _node(tlb_pointer)     /* Consider using tcr+N as tlb_pointer */
627         _node(shutdown_count)
628         _node(safe_ref_address)
629        _ends
630
631TCR_FLAG_BIT_FOREIGN = fixnum_shift       
632TCR_FLAG_BIT_AWAITING_PRESET = (fixnum_shift+1)
633TCR_FLAG_BIT_ALT_SUSPEND = (fixnumshift+2)
634TCR_FLAG_BIT_PROPAGATE_EXCEPTION = (fixnumshift+3)
635TCR_FLAG_BIT_SUSPEND_ACK_PENDING = (fixnumshift+4)
636TCR_FLAG_BIT_PENDING_EXCEPTION = (fixnumshift+5)
637TCR_FLAG_BIT_FOREIGN_EXCEPTION = (fixnumshift+6)
638TCR_FLAG_BIT_PENDING_SUSPEND = (fixnumshift+7) 
639TCR_FLAG_BIT_ALLOCPTR_FOREIGN = (fixnumshift+8)
640       
641r0 = 0
642r1 = 1
643r2 = 2
644r3 = 3
645r4 = 4
646r5 = 5
647r6 = 6
648r7 = 7
649r8 = 8
650r9 = 9
651r10 = 10
652r11 = 11
653r12 = 12
654r13 = 13
655sp = 13       
656r14 = 14
657lr = 14
658r15 = 15
659pc = 15
660       
661       
662/* Lisp code keeps 0.0 in fp_zero */
663define(`fp_zero',`f31')   /* a non-volatile reg as far as FFI is concerned. */
664define(`fp_s32conv',`f30')   /* for s32->fp conversion */
665       
666/* registers, as used in destrucuring-bind/macro-bind */
667
668define(`arg_reg',`arg_z')
669define(`keyvect_reg',`temp2')
670define(`mask_keyp',`(1<<25)') /*  note that keyp can be true even when 0 keys. */
671define(`mask_aok',`(1<<26)')
672define(`mask_restp',`(1<<27)')
673define(`mask_aok_seen',`(1<<30)')
674define(`mask_aok_this',`(1<<31)')       
675define(`mask_unknown_keyword_seen',`(1<<28)')               
676define(`mask_initopt',`(1<<29)')
677
678define(`STACK_ALIGN',8)
679define(`STACK_ALIGN_MASK',7)
680
681
682define(`TCR_STATE_FOREIGN',1)
683define(`TCR_STATE_LISP',0)
684define(`TCR_STATE_EXCEPTION_WAIT',2)
685define(`TCR_STATE_EXCEPTION_RETURN',4)
686
687
688lisp_globals_limit = -fulltag_nil
689
690num_lisp_globals = 49            /* MUST UPDATE THIS !!! */
691       
692        _struct(lisp_globals,-(fulltag_nil+dnode_size+(num_lisp_globals*node_size)))
693         _node(weakvll)                 /* all populations as of last GC */
694         _node(initial_tcr)             /* initial thread tcr */
695         _node(image_name)              /* --image-name argument */
696         _node(BADfpscr_save_high)      /* high word of FP reg used to save FPSCR */
697         _node(unwind_resume)           /* _Unwind_Resume */
698         _node(batch_flag)              /* -b */
699         _node(host_platform)           /* for runtime platform-specific stuff */
700         _node(argv)                    /* address of argv`0' */
701         _node(ref_base)                        /* start of oldest pointer-bearing area */
702         _node(tenured_area)            /* the tenured_area */
703         _node(oldest_ephemeral)        /* dword address of oldest ephemeral object or 0 */
704         _node(lisp_exit_hook)          /* install foreign exception_handling */
705         _node(lisp_return_hook)        /* install lisp exception_handling */
706         _node(double_float_one)        /* high half of 1.0d0 */
707         _node(short_float_zero)        /* low half of 1.0d0 */
708         _node(objc2_end_catch)         /* objc_end_catch() */
709         _node(metering_info)           /* address of lisp_metering global */
710         _node(in_gc)                   /* non-zero when GC active */
711         _node(lexpr_return1v)          /* simpler when &lexpr called for single value. */
712         _node(lexpr_return)            /* magic &lexpr return code. */
713         _node(all_areas)               /* doubly-linked list of all memory areas */
714         _node(kernel_path)             /* real executable name */
715         _node(objc2_begin_catch)       /* objc_begin_catch */
716         _node(stack_size)              /* from command-line */
717         _node(statically_linked)       /* non-zero if -static */
718         _node(heap_end)                /* end of lisp heap */
719         _node(heap_start)              /* start of lisp heap */
720         _node(gcable_pointers)         /* linked-list of weak macptrs. */
721         _node(gc_num)                  /* fixnum: GC call count. */
722         _node(fwdnum)                  /* fixnum: GC "forwarder" call count. */
723         _node(altivec_present)         /* non-zero when AltiVec available */
724         _node(oldspace_dnode_count)    /* dynamic dnodes older than g0 start */
725         _node(refbits)                 /* EGC refbits */
726         _node(gc_inhibit_count)
727         _node(intflag)                 /* sigint pending */
728         _node(BAD_block_tag_counter)   /* counter for (immediate) block tag */
729         _node(deleted_static_pairs)           
730         _node(exception_lock)
731         _node(area_lock)
732         _node(tcr_key)                 /* tsd key for per-thread tcr */
733         _node(ret1val_addr)            /* address of "dynamic" subprims magic values return addr */
734         _node(subprims_base)           /* address of dynamic subprims jump table */
735         _node(saveR13)                 /* probably don't really need this */
736         _node(saveTOC)                 /* where the 68K emulator stores the  emulated regs */
737         _node(objc_2_personality)      /* exception "personality routine" address for ObjC 2.0 */
738         _node(kernel_imports)          /* some things we need imported for us */
739         _node(interrupt_signal)        /* signal used by PROCESS-INTERRUPT */
740         _node(tcr_count)               /* tcr_id for next tcr */
741         _node(get_tcr)                 /* address of get_tcr() */
742        _ends
743
744/* extended type codes, for UUOs.  Shouldn't conflict with defined subtags */
745
746xtype_unsigned_byte_24 = 252
747xtype_array2d = 248
748xtype_array3d = 244
749xtype_integer = 4
750xtype_s64 = 8
751xtype_u64 = 12
752xtype_s32 = 16
753xtype_u32 = 20
754xtype_s16 = 24
755xtype_u16 = 28
756xtype_s8 = 32
757xtype_u8 = 36
758xtype_bit = 40                               
759                                               
760stack_alloc_limit = 0x8000                       
761                       
762INTERRUPT_LEVEL_BINDING_INDEX = fixnumone
763VOID_ALLOCPTR = 0xfffffff8
Note: See TracBrowser for help on using the repository browser.