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

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

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

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 16.2 KB
Line 
1/*   Copyright (C) 2003-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
17define(`rcontext',`r2')
18       
19nbits_in_word = 64
20nbits_in_byte = 8
21ntagbits = 4
22nlisptagbits = 3
23nfixnumtagbits = 3
24nlowtagbits = 2       
25num_subtag_bits = 8
26fixnumshift = 3
27fixnum_shift = 3
28fulltagmask = 15
29tagmask = 7
30fixnummask = 7
31ncharcodebits = 8
32charcode_shift = 8
33word_shift = 3
34node_size = 8
35dnode_size = 16
36dnode_align_bits = 4
37dnode_shift = dnode_align_bits       
38bitmap_shift = 6
39       
40fixnumone = (1<<fixnumshift)
41fixnum_one = fixnumone
42fixnum1 = fixnumone
43
44
45lowtagmask = ((1<<nlowtagbits)-1)
46lowtag_mask = lowtagmask
47
48lowtag_primary = 0
49lowtag_imm = 1
50lowtag_immheader = 2
51lowtag_nodeheader = 3
52
53tag_fixnum = 0
54
55fulltag_even_fixnum = 0
56fulltag_imm_0 = 1
57fulltag_immheader_0 = 2
58fulltag_nodeheader_0 = 3
59fulltag_cons = 4
60fulltag_imm_1 = 5
61fulltag_immheader_1 = 6
62fulltag_nodeheader_1 = 7
63fulltag_odd_fixnum = 8
64fulltag_imm_2 = 9
65fulltag_immheader_2 = 10
66fulltag_nodeheader_2 = 11
67fulltag_misc = 12
68fulltag_imm_3 = 13
69fulltag_immheader_3 = 14
70fulltag_nodeheader_3 = 15
71
72define(`define_subtag',`
73subtag_$1 = ($2 | ($3 << ntagbits))
74')
75                       
76cl_array_subtag_mask = 0x80
77define(`define_cl_array_subtag',`
78define_subtag($1,(cl_array_subtag_mask|$2),$3)
79')
80
81define_cl_array_subtag(arrayH,fulltag_nodeheader_1,0)
82define_cl_array_subtag(vectorH,fulltag_nodeheader_2,0)
83define_cl_array_subtag(simple_vector,fulltag_nodeheader_3,0)
84min_vector_subtag = subtag_vectorH
85min_array_subtag = subtag_arrayH
86       
87       
88ivector_class_64_bit = fulltag_immheader_3
89ivector_class_32_bit = fulltag_immheader_2
90ivector_class_other_bit = fulltag_immheader_1
91ivector_class_8_bit = fulltag_immheader_0
92
93define_cl_array_subtag(s64_vector,ivector_class_64_bit,1)
94define_cl_array_subtag(u64_vector,ivector_class_64_bit,2)
95define_cl_array_subtag(fixnum_vector,ivector_class_64_bit,3)       
96define_cl_array_subtag(double_float_vector,ivector_class_64_bit,4)
97define_cl_array_subtag(s32_vector,ivector_class_32_bit,1)
98define_cl_array_subtag(u32_vector,ivector_class_32_bit,2)
99define_cl_array_subtag(single_float_vector,ivector_class_32_bit,3)
100define_cl_array_subtag(simple_base_string,ivector_class_32_bit,5)
101define_cl_array_subtag(s16_vector,ivector_class_other_bit,1)
102define_cl_array_subtag(u16_vector,ivector_class_other_bit,2)
103define_cl_array_subtag(bit_vector,ivector_class_other_bit,7)
104define_cl_array_subtag(s8_vector,ivector_class_8_bit,1)
105define_cl_array_subtag(u8_vector,ivector_class_8_bit,2)
106/* There's some room for expansion in non-array ivector space. */
107define_subtag(macptr,ivector_class_64_bit,1)
108define_subtag(dead_macptr,ivector_class_64_bit,2)
109define_subtag(code_vector,ivector_class_32_bit,0)
110define_subtag(xcode_vector,ivector_class_32_bit,1)
111define_subtag(bignum,ivector_class_32_bit,2)
112define_subtag(double_float,ivector_class_32_bit,3)
113
114
115
116       
117/* Size doesn't matter for non-CL-array gvectors; I can't think of a good */
118/* reason to classify them in any particular way.  Let's put funcallable */
119/* things in the first slice by themselves, though it's not clear that */
120/* that helps FUNCALL much. */
121       
122gvector_funcallable = fulltag_nodeheader_0
123       
124define_subtag(function,gvector_funcallable,0)
125define_subtag(symbol,gvector_funcallable,1)
126define_subtag(catch_frame,fulltag_nodeheader_1,0)
127define_subtag(basic_stream,fulltag_nodeheader_1,1)
128define_subtag(lock,fulltag_nodeheader_1,2)
129define_subtag(hash_vector,fulltag_nodeheader_1,3)
130define_subtag(pool,fulltag_nodeheader_1,4)
131define_subtag(weak,fulltag_nodeheader_1,5)
132define_subtag(package,fulltag_nodeheader_1,6)
133       
134define_subtag(slot_vector,fulltag_nodeheader_2,0)
135define_subtag(instance,fulltag_nodeheader_2,1)
136define_subtag(struct,fulltag_nodeheader_2,2)
137define_subtag(istruct,fulltag_nodeheader_2,3)
138define_subtag(value_cell,fulltag_nodeheader_2,4)
139define_subtag(xfunction,fulltag_nodeheader_2,5)
140       
141define_subtag(ratio,fulltag_nodeheader_3,0)
142define_subtag(complex,fulltag_nodeheader_3,1)
143                       
144t_value = (0x3000+fulltag_misc) 
145misc_bias = fulltag_misc
146cons_bias = fulltag_cons
147define(`t_offset',-symbol.size)
148       
149misc_header_offset = -fulltag_misc
150misc_data_offset = misc_header_offset+node_size /* first word of data */
151misc_subtag_offset = misc_data_offset-1       /* low byte of header */
152misc_dfloat_offset = misc_data_offset           /* double-floats are doubleword-aligned */
153
154define_subtag(single_float,fulltag_imm_0,0)
155
156define_subtag(go_tag,fulltag_imm_1,0)
157define_subtag(block_tag,fulltag_imm_1,1)
158
159define_subtag(character,fulltag_imm_1,0)
160                       
161define_subtag(unbound,fulltag_imm_3,0)
162unbound_marker = subtag_unbound
163undefined = unbound_marker
164define_subtag(slot_unbound,fulltag_imm_3,1)
165slot_unbound_marker = subtag_slot_unbound
166define_subtag(illegal,fulltag_imm_3,2)
167illegal_marker = subtag_illegal
168define_subtag(no_thread_local_binding,fulltag_imm_3,3)
169no_thread_local_binding_marker = subtag_no_thread_local_binding       
170
171       
172max_64_bit_constant_index = ((0x7fff + misc_dfloat_offset)>>3)
173max_32_bit_constant_index = ((0x7fff + misc_data_offset)>>2)
174max_16_bit_constant_index = ((0x7fff + misc_data_offset)>>1)
175max_8_bit_constant_index = (0x7fff + misc_data_offset)
176max_1_bit_constant_index = ((0x7fff + misc_data_offset)<<5)
177
178
179       
180/* The objects themselves look something like this: */
181       
182/* Order of CAR and CDR doesn't seem to matter much - there aren't */
183/* too many tricks to be played with predecrement/preincrement addressing. */
184/* Keep them in the confusing MCL 3.0 order, to avoid confusion. */
185        _struct(cons,-cons_bias)
186         _node(cdr)
187         _node(car)
188        _ends
189       
190        _structf(ratio)
191         _node(numer)
192         _node(denom)
193        _endstructf
194       
195        _structf(double_float)
196         _word(value)
197         _word(val_low)
198        _endstructf
199       
200        _structf(macptr)
201         _node(address)
202         _node(domain)
203         _node(type)
204        _endstructf
205       
206/* Functions are of (conceptually) unlimited size. */
207        _struct(_function,-misc_bias)
208         _node(header)
209         _node(codevector)
210        _ends
211
212        _struct(tsp_frame,0)
213         _node(backlink)
214         _node(type)
215         _struct_label(fixed_overhead)
216         _struct_label(data_offset)
217        _ends
218
219
220
221        _structf(symbol)
222         _node(pname)
223         _node(vcell)
224         _node(fcell)
225         _node(package_predicate)
226         _node(flags)
227         _node(plist)
228         _node(binding_index)
229        _endstructf
230
231        _structf(catch_frame)
232         _node(catch_tag)       /* #<unbound> -> unwind-protect, else catch */
233         _node(link)            /* backpointer to previous catch frame */
234         _node(mvflag)          /* 0 if single-valued catch, fixnum 1 otherwise */
235         _node(csp)             /* pointer to lisp_frame on csp */
236         _node(db_link)         /* head of special-binding chain */
237         _field(regs,8*node_size)       /* save7-save0 */
238         _node(xframe)          /* exception frame chain */
239         _node(tsp_segment)     /* maybe someday; padding for now */
240        _endstructf
241
242
243        _structf(vectorH)
244         _node(logsize)
245         _node(physsize)
246         _node(data_vector)
247         _node(displacement)
248         _node(flags)
249        _endstructf     
250       
251        _structf(arrayH)
252         _node(rank)
253         _node(physsize)
254         _node(data_vector)
255         _node(displacement)
256         _node(flags)
257         _struct_label(dim0)
258        _endstructf
259       
260        _struct(c_frame,0)      /* PowerOpen ABI C stack frame */
261         _node(backlink)
262         _node(crsave)
263         _node(savelr)
264         _field(unused, 16)
265         _node(savetoc)
266         _struct_label(params)
267         _node(param0)
268         _node(param1)
269         _node(param2)
270         _node(param3)
271         _node(param4)
272         _node(param5)
273         _node(param6)
274         _node(param7)
275         _struct_label(minsiz)
276        _ends
277
278
279        _struct(eabi_c_frame,0)
280         _word(backlink)
281         _word(savelr)
282         _word(param0)
283         _word(param1)
284         _word(param2)
285         _word(param3)
286         _word(param4)
287         _word(param5)
288         _word(param6)
289         _word(param7)
290         _struct_label(minsiz)
291        _ends
292
293        /* For entry to variable-argument-list functions */
294        /* (e.g., via callback) */
295        _struct(varargs_eabi_c_frame,0)
296         _word(backlink)
297         _word(savelr)
298         _struct_label(va_list)
299         _word(flags)           /* gpr count byte, fpr count byte, padding */
300         _word(overflow_arg_area)
301         _word(reg_save_area)
302         _field(padding,4)
303         _struct_label(regsave)
304         _field(gp_save,8*4)
305         _field(fp_save,8*8)
306         _word(old_backlink)
307         _word(old_savelr)
308         _struct_label(incoming_stack_args)
309        _ends
310               
311        _struct(lisp_frame,0)
312         _node(backlink)
313         _node(savefn) 
314         _node(savelr) 
315         _node(savevsp)
316        _ends
317
318        _struct(vector,-fulltag_misc)
319         _node(header)
320         _struct_label(data)
321        _ends
322
323        _struct(binding,0)
324         _node(link)
325         _node(sym)
326         _node(val)
327        _ends
328
329
330/* Nilreg-relative globals.  Talking the assembler into doing something reasonable here */
331/* is surprisingly hard. */
332
333symbol_extra = symbol.size-fulltag_misc
334
335       
336        _struct(nrs,(0x3000+(LOWMEM_BIAS)))
337         _struct_pad(fulltag_misc)
338         _struct_label(tsym)
339         _struct_pad(symbol_extra)      /* t */
340
341         _struct_pad(fulltag_misc)
342         _struct_label(nil)
343         _struct_pad(symbol_extra)      /* nil */
344
345         _struct_pad(fulltag_misc)
346         _struct_label(errdisp)
347         _struct_pad(symbol_extra)      /* %err-disp */
348
349         _struct_pad(fulltag_misc)
350         _struct_label(cmain)
351         _struct_pad(symbol_extra)      /* cmain */
352
353         _struct_pad(fulltag_misc)
354         _struct_label(eval)
355         _struct_pad(symbol_extra)      /* eval */
356 
357         _struct_pad(fulltag_misc)
358         _struct_label(appevalfn)
359         _struct_pad(symbol_extra)      /* apply-evaluated-function */
360
361         _struct_pad(fulltag_misc)
362         _struct_label(error)
363         _struct_pad(symbol_extra)      /* error */
364
365         _struct_pad(fulltag_misc)
366         _struct_label(defun)
367         _struct_pad(symbol_extra)      /* %defun */
368
369         _struct_pad(fulltag_misc)
370         _struct_label(defvar)
371         _struct_pad(symbol_extra)      /* %defvar */
372
373         _struct_pad(fulltag_misc)
374         _struct_label(defconstant)
375         _struct_pad(symbol_extra)      /* %defconstant */
376
377         _struct_pad(fulltag_misc)
378         _struct_label(macrosym)
379         _struct_pad(symbol_extra)      /* %macro */
380
381         _struct_pad(fulltag_misc)
382         _struct_label(kernelrestart)
383         _struct_pad(symbol_extra)      /* %kernel-restart */
384
385         _struct_pad(fulltag_misc)
386         _struct_label(package)
387         _struct_pad(symbol_extra)      /* *package* */
388
389         _struct_pad(fulltag_misc)
390         _struct_label(total_bytes_freed)               /* *total-bytes-freed* */
391         _struct_pad(symbol_extra)
392
393         _struct_pad(fulltag_misc)
394         _struct_label(kallowotherkeys)
395         _struct_pad(symbol_extra)      /* allow-other-keys */
396
397         _struct_pad(fulltag_misc)
398         _struct_label(toplcatch)
399         _struct_pad(symbol_extra)      /* %toplevel-catch% */
400
401         _struct_pad(fulltag_misc)
402         _struct_label(toplfunc)
403         _struct_pad(symbol_extra)      /* %toplevel-function% */
404
405         _struct_pad(fulltag_misc)
406         _struct_label(callbacks)
407         _struct_pad(symbol_extra)      /* %pascal-functions% */
408
409         _struct_pad(fulltag_misc)
410         _struct_label(heap_init_function)
411         _struct_pad(symbol_extra)      /* *heap-init-function* */
412
413         _struct_pad(fulltag_misc)
414         _struct_label(total_gc_microseconds)           /* *total-gc-microseconds* */
415         _struct_pad(symbol_extra)
416
417         _struct_pad(fulltag_misc)
418         _struct_label(builtin_functions)               /* %builtin-functions% */
419         _struct_pad(symbol_extra)               
420
421         _struct_pad(fulltag_misc)
422         _struct_label(udf)
423         _struct_pad(symbol_extra)      /* %unbound-function% */
424
425         _struct_pad(fulltag_misc)
426         _struct_label(init_misc)
427         _struct_pad(symbol_extra)      /* %init-misc */
428
429         _struct_pad(fulltag_misc)
430         _struct_label(macro_code)
431         _struct_pad(symbol_extra)      /* %macro-code% */
432
433         _struct_pad(fulltag_misc)
434         _struct_label(closure_code)
435         _struct_pad(symbol_extra)      /* %closure-code% */
436
437         _struct_pad(fulltag_misc)
438         _struct_label(new_gcable_ptr) /* %new-gcable-ptr */
439         _struct_pad(symbol_extra)
440       
441         _struct_pad(fulltag_misc)
442         _struct_label(gc_event_status_bits)
443         _struct_pad(symbol_extra)      /* *gc-event-status-bits* */
444
445         _struct_pad(fulltag_misc)
446         _struct_label(post_gc_hook)
447         _struct_pad(symbol_extra)      /* *post-gc-hook* */
448
449         _struct_pad(fulltag_misc)
450         _struct_label(handlers)
451         _struct_pad(symbol_extra)      /* %handlers% */
452
453
454         _struct_pad(fulltag_misc)
455         _struct_label(all_packages)
456         _struct_pad(symbol_extra)      /* %all-packages% */
457
458         _struct_pad(fulltag_misc)
459         _struct_label(keyword_package)
460         _struct_pad(symbol_extra)      /* *keyword-package* */
461
462         _struct_pad(fulltag_misc)
463         _struct_label(os_init_function)
464         _struct_pad(symbol_extra)      /* %os-init-function% */
465
466         _struct_pad(fulltag_misc)
467         _struct_label(foreign_thread_control)
468         _struct_pad(symbol_extra)      /* %foreign-thread-control */
469
470        _ends
471
472define(`def_header',`
473$1 = ($2<<num_subtag_bits)|$3')
474
475        def_header(double_float_header,2,subtag_double_float)
476        def_header(two_digit_bignum_header,2,subtag_bignum)
477        def_header(three_digit_bignum_header,3,subtag_bignum)
478        def_header(four_digit_bignum_header,4,subtag_bignum)
479        def_header(five_digit_bignum_header,5,subtag_bignum)       
480        def_header(symbol_header,symbol.element_count,subtag_symbol)
481        def_header(value_cell_header,1,subtag_value_cell        )
482        def_header(macptr_header,macptr.element_count,subtag_macptr)
483        def_header(vectorH_header,vectorH.element_count,subtag_vectorH)
484
485        include(errors.s)
486
487/* Symbol bits that we care about */
488sym_vbit_bound = (0+fixnum_shift)
489sym_vbit_bound_mask = (1<<sym_vbit_bound)
490sym_vbit_const = (1+fixnum_shift)
491sym_vbit_const_mask = (1<<sym_vbit_const)
492
493        _struct(area,0)
494         _node(pred)
495         _node(succ)
496         _node(low)
497         _node(high)
498         _node(active)
499         _node(softlimit)
500         _node(hardlimit)
501         _node(code)
502         _node(markbits)
503         _node(ndwords)
504         _node(older)
505         _node(younger)
506         _node(h)
507         _node(sofprot)
508         _node(hardprot)
509         _node(owner)
510         _node(refbits)
511         _node(nextref)
512        _ends
513
514
515/* This is only referenced by c->lisp code that needs to save/restore C NVRs in a TSP frame. */
516        _struct(c_reg_save,0)
517         _node(tsp_link)        /* backpointer */
518         _node(tsp_mark)        /* frame type */
519         _node(save_fpscr)      /* for Cs FPSCR */
520         _field(save_gprs,19*node_size) /* r13-r31 */
521         _dword(save_fp_zero)   /* for fp_zero */
522         _dword(save_fps32conv)
523         _field(save_fprs,13*8)
524        _ends
525
526
527TCR_BIAS = 0
528       
529/*  Thread context record. */
530
531        _struct(tcr,-TCR_BIAS)
532         _node(prev)            /* in doubly-linked list */
533         _node(next)            /* in doubly-linked list */
534         _node(single_float_convert) /* xxxf0 */
535         _word(lisp_fpscr)      /* lisp thread's fpscr (in low word) */
536         _word(lisp_fpscr_low)
537         _node(db_link)         /* special binding chain head */
538         _node(catch_top)       /* top catch frame */
539         _node(save_vsp)        /* VSP when in foreign code */
540         _node(save_tsp)        /* TSP when in foreign code */
541         _node(cs_area)         /* cstack area pointer */
542         _node(vs_area)         /* vstack area pointer */
543         _node(ts_area)         /* tstack area pointer */
544         _node(cs_limit)        /* cstack overflow limit */
545         _word(bytes_consed_high)
546         _word(bytes_consed_low)
547         _node(log2_allocation_quantum)
548         _node(interrupt_pending)
549         _node(xframe)          /* per-thread exception frame list */
550         _node(errno_loc)       /* per-thread  errno location */
551         _node(ffi_exception)   /* fpscr exception bits from ff-call */
552         _node(osid)            /* OS thread id */
553         _node(valence)         /* odd when in foreign code */
554         _node(foreign_exception_status)
555         _node(native_thread_info)
556         _node(native_thread_id)
557         _node(last_allocptr)
558         _node(save_allocptr)
559         _node(save_allocbase)
560         _node(reset_completion)
561         _node(activate)
562         _node(suspend_count)
563         _node(suspend_context)
564         _node(pending_exception_context)
565         _node(suspend)         /* semaphore for suspension notify */
566         _node(resume)          /* sempahore for resumption notify */
567         _word(flags_pad)
568         _word(flags)     
569         _node(gc_context)
570         _node(termination_semaphore)
571         _node(unwinding)
572         _node(tlb_limit)
573         _node(tlb_pointer)     /* Consider using tcr+N as tlb_pointer */
574         _node(shutdown_count)
575         _node(safe_ref_address)
576        _ends
577
578TCR_FLAG_BIT_FOREIGN = fixnum_shift
579TCR_FLAG_BIT_AWAITING_PRESET = (fixnum_shift+1)
580TCR_FLAG_BIT_ALT_SUSPEND = (fixnumshift+2)
581TCR_FLAG_BIT_PROPAGATE_EXCEPTION = (fixnumshift+3)
582TCR_FLAG_BIT_SUSPEND_ACK_PENDING = (fixnumshift+4)
583TCR_FLAG_BIT_PENDING_EXCEPTION = (fixnumshift+5)
584TCR_FLAG_BIT_FOREIGN_EXCEPTION = (fixnumshift+6)
585TCR_FLAG_BIT_PENDING_SUSPEND = (fixnumshift+7)       
586
587
588nil_value = (0x3000+symbol.size+fulltag_misc+(LOWMEM_BIAS))
589               
590define(`RESERVATION_DISCHARGE',(0x2008+(LOWMEM_BIAS)))
591
592lisp_globals_limit = (0x3000+(LOWMEM_BIAS))
593       
594INTERRUPT_LEVEL_BINDING_INDEX = fixnumone
595       
596               
Note: See TracBrowser for help on using the repository browser.