source: branches/arm64/lisp-kernel/arm64-constants.s @ 15550

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

Move along, nothing to see here. Honest.
Some the files (those that aren't missing ...) are empty; there's very
little in the way of actual ARMv8 code here, and there'll need to be
a lot more before this is even worth talking about.

File size: 13.3 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
16define(`imm0',`x0') 
17define(`imm1',`x1')
18define(`imm2',`x2')
19define(`imm3',`x3')
20define(`imm4',`x4')
21define(`imm5',`x5') define(`nargs',`w5')
22define(`rnil',`x6')
23define(`rt',`x7')
24       
25define(`temp3',`x9')
26define(`temp2',`x10')
27define(`temp1',`x11')
28define(`temp0',`x12')
29define(`arg_x',`x13')               
30define(`arg_y',`x14')               
31define(`arg_z',`x15')               
32define(`save0',`x16')
33define(`save1',`x17')
34define(`save2',`x18')
35define(`save3',`x19')
36define(`save4',`x20')
37define(`save5',`x21')
38define(`save6',`x22')
39define(`save7',`x23')
40       
41define(`loc_pc',`x24')
42define(`vsp',`x25')
43define(`allocptr',`x26')
44define(`allocbase',`x27')               
45define(`rcontext',`x28')
46       
47       
48nbits_in_word = 64
49nbits_in_byte = 8
50ntagbits = 4
51nlisptagbits = 3
52nfixnumtagbits = 3
53nlowtagbits = 2       
54num_subtag_bits = 8
55fixnumshift = 3
56fixnum_shift = 3
57fulltagmask = 15
58tagmask = 7
59fixnummask = 7
60ncharcodebits = 8
61charcode_shift = 8
62word_shift = 3
63node_size = 8
64dnode_size = 16
65dnode_align_bits = 4
66dnode_shift = dnode_align_bits       
67bitmap_shift = 6
68       
69fixnumone = (1<<fixnumshift)
70fixnum_one = fixnumone
71fixnum1 = fixnumone
72
73
74lowtagmask = ((1<<nlowtagbits)-1)
75lowtag_mask = lowtagmask
76
77lowtag_primary = 0
78lowtag_imm = 1
79lowtag_immheader = 2
80lowtag_nodeheader = 3
81
82tag_fixnum = 0
83
84
85fulltag_even_fixnum = 0
86fulltag_immheader_1 = 1
87fulltag_immheader_8 = 2                   
88fulltag_immheader_16 = 3
89fulltag_symbol = 4       
90fulltag_cons = 5
91fulltag_misc = 6
92fulltag_imm = 7               
93fulltag_odd_fixnum = 8
94fulltag_immheader_32 = 9
95fulltag_immheader_64 = 10
96fulltag_nodehader_a = 11
97fulltag_function = 12       
98fulltag_nil = 13
99fulltag_nodeheader_b = 14
100fulltag_nodeheader_c = 15       
101
102/* Per the scheme above, a node is a fixnum iff bit 2 is clear */
103fixnum_clr_bit = 2
104/* And a node is a list iff bit 0 is set */
105list_set_bit = 0                               
106
107define(`define_subtag',`
108subtag_$1 = ($2 | ($3 << ntagbits))
109')
110                       
111cl_array_subtag_mask = 0x80
112define(`define_cl_array_subtag',`
113define_subtag($1,(cl_array_subtag_mask|$2),$3)
114')
115
116define_cl_array_subtag(arrayH,fulltag_nodeheader_a,0)
117define_cl_array_subtag(vectorH,fulltag_nodeheader_b,0)
118define_cl_array_subtag(simple_vector,fulltag_nodeheader_c,0)
119min_vector_subtag = subtag_vectorH
120min_array_subtag = subtag_arrayH
121       
122       
123ivector_class_64_bit = fulltag_immheader_64
124ivector_class_32_bit = fulltag_immheader_32
125ivector_class_16_bit = fulltag_immheader_16
126ivector_class_8_bit = fulltag_immheader_8
127ivector_class_1_bit = fulltag_immheader_1
128
129define_cl_array_subtag(s64_vector,ivector_class_64_bit,1)
130define_cl_array_subtag(u64_vector,ivector_class_64_bit,2)
131define_cl_array_subtag(fixnum_vector,ivector_class_64_bit,3)       
132define_cl_array_subtag(double_float_vector,ivector_class_64_bit,4)
133define_cl_array_subtag(s32_vector,ivector_class_32_bit,1)
134define_cl_array_subtag(u32_vector,ivector_class_32_bit,2)
135define_cl_array_subtag(single_float_vector,ivector_class_32_bit,3)
136define_cl_array_subtag(simple_base_string,ivector_class_32_bit,5)
137define_cl_array_subtag(s16_vector,ivector_class_16_bit,1)
138define_cl_array_subtag(u16_vector,ivector_class_16_bit,2)
139define_cl_array_subtag(bit_vector,ivector_class_1_bit,7)
140define_cl_array_subtag(s8_vector,ivector_class_8_bit,1)
141define_cl_array_subtag(u8_vector,ivector_class_8_bit,2)
142/* There's some room for expansion in non-array ivector space. */
143define_subtag(macptr,ivector_class_64_bit,1)
144define_subtag(dead_macptr,ivector_class_64_bit,2)
145define_subtag(double_float,ivector_class_32_bit,0)
146define_subtag(bignum,ivector_class_32_bit,1)
147define_subtag(xcode_vector,ivector_class_32_bit,2)
148
149
150
151       
152define_subtag(ratio,fulltag_nodeheader_a,0)
153define_subtag(complex,fulltag_nodeheader_a,1)
154define_subtag(function,fulltag_nodeheader_a,2)
155define_subtag(symbol,fulltag_nodeheader_a,3)
156        0
157define_subtag(catch_frame,fulltag_nodeheader_b,0)
158define_subtag(basic_stream,fulltag_nodeheader_b,1)
159define_subtag(lock,fulltag_nodeheader_b,2)
160define_subtag(hash_vector,fulltag_nodeheader_b,3)
161define_subtag(pool,fulltag_nodeheader_b,4)
162define_subtag(weak,fulltag_nodeheader_b,5)
163define_subtag(package,fulltag_nodeheader_b,6)
164       
165define_subtag(slot_vector,fulltag_nodeheader_c,0)
166define_subtag(instance,fulltag_nodeheader_c,1)
167define_subtag(struct,fulltag_nodeheader_c,2)
168define_subtag(istruct,fulltag_nodeheader_c,3)
169define_subtag(value_cell,fulltag_nodeheader_c,4)
170define_subtag(xfunction,fulltag_nodeheader_c,5)
171       
172                       
173t_value = (0x3000+fulltag_misc) 
174misc_bias = fulltag_misc
175cons_bias = fulltag_cons
176define(`t_offset',-symbol.size)
177       
178misc_header_offset = -fulltag_misc
179misc_data_offset = misc_header_offset+node_size /* first word of data */
180misc_subtag_offset = misc_data_offset-7       /* low byte of header */
181misc_dfloat_offset = misc_data_offset           /* double-floats are doubleword-aligned */
182
183define_subtag(single_float,fulltag_imm,0)
184
185
186define_subtag(character,fulltag_imm_1,0)
187                       
188define_subtag(unbound,fulltag_imm_3,0)
189unbound_marker = subtag_unbound
190undefined = unbound_marker
191define_subtag(slot_unbound,fulltag_imm_3,1)
192slot_unbound_marker = subtag_slot_unbound
193define_subtag(illegal,fulltag_imm_3,2)
194illegal_marker = subtag_illegal
195define_subtag(no_thread_local_binding,fulltag_imm_3,3)
196no_thread_local_binding_marker = subtag_no_thread_local_binding       
197
198       
199max_64_bit_constant_index = ((0x7fff + misc_dfloat_offset)>>3)
200max_32_bit_constant_index = ((0x7fff + misc_data_offset)>>2)
201max_16_bit_constant_index = ((0x7fff + misc_data_offset)>>1)
202max_8_bit_constant_index = (0x7fff + misc_data_offset)
203max_1_bit_constant_index = ((0x7fff + misc_data_offset)<<5)
204
205
206       
207/* The objects themselves look something like this: */
208       
209/* Order of CAR and CDR doesn't seem to matter much - there aren't */
210/* too many tricks to be played with predecrement/preincrement addressing. */
211/* Keep them in the confusing MCL 3.0 order, to avoid confusion. */
212        _struct(cons,-cons_bias)
213         _node(cdr)
214         _node(car)
215        _ends
216       
217        _structf(ratio)
218         _node(numer)
219         _node(denom)
220        _endstructf
221       
222        _structf(double_float)
223         _word(val_low)
224         _word(value)
225        _endstructf
226       
227        _structf(macptr)
228         _node(address)
229         _node(domain)
230         _node(type)
231        _endstructf
232       
233/* Functions are of (conceptually) unlimited size. */
234        _struct(_function,-misc_bias)
235         _node(header)
236         _node(codevector)
237        _ends
238
239        _struct(tsp_frame,0)
240         _node(backlink)
241         _node(type)
242         _struct_label(fixed_overhead)
243         _struct_label(data_offset)
244        _ends
245
246
247
248        _structf(symbol)
249         _node(pname)
250         _node(vcell)
251         _node(fcell)
252         _node(package_predicate)
253         _node(flags)
254         _node(plist)
255         _node(binding_index)
256        _endstructf
257
258        _structf(catch_frame)
259         _node(catch_tag)       /* #<unbound> -> unwind-protect, else catch */
260         _node(link)            /* backpointer to previous catch frame */
261         _node(mvflag)          /* 0 if single-valued catch, fixnum 1 otherwise */
262         _node(csp)             /* pointer to lisp_frame on csp */
263         _node(db_link)         /* head of special-binding chain */
264         _field(regs,8*node_size)       /* save7-save0 */
265         _node(xframe)          /* exception frame chain */
266         _node(tsp_segment)     /* maybe someday; padding for now */
267        _endstructf
268
269
270        _structf(vectorH)
271         _node(logsize)
272         _node(physsize)
273         _node(data_vector)
274         _node(displacement)
275         _node(flags)
276        _endstructf     
277       
278        _structf(arrayH)
279         _node(rank)
280         _node(physsize)
281         _node(data_vector)
282         _node(displacement)
283         _node(flags)
284         _struct_label(dim0)
285        _endstructf
286       
287        _struct(c_frame,0)      /* PowerOpen ABI C stack frame */
288         _node(backlink)
289         _node(crsave)
290         _node(savelr)
291         _field(unused, 16)
292         _node(savetoc)
293         _struct_label(params)
294         _node(param0)
295         _node(param1)
296         _node(param2)
297         _node(param3)
298         _node(param4)
299         _node(param5)
300         _node(param6)
301         _node(param7)
302         _struct_label(minsiz)
303        _ends
304
305
306        _struct(eabi_c_frame,0)
307         _word(backlink)
308         _word(savelr)
309         _word(param0)
310         _word(param1)
311         _word(param2)
312         _word(param3)
313         _word(param4)
314         _word(param5)
315         _word(param6)
316         _word(param7)
317         _struct_label(minsiz)
318        _ends
319
320        /* For entry to variable-argument-list functions */
321        /* (e.g., via callback) */
322        _struct(varargs_eabi_c_frame,0)
323         _word(backlink)
324         _word(savelr)
325         _struct_label(va_list)
326         _word(flags)           /* gpr count byte, fpr count byte, padding */
327         _word(overflow_arg_area)
328         _word(reg_save_area)
329         _field(padding,4)
330         _struct_label(regsave)
331         _field(gp_save,8*4)
332         _field(fp_save,8*8)
333         _word(old_backlink)
334         _word(old_savelr)
335         _struct_label(incoming_stack_args)
336        _ends
337               
338        _struct(lisp_frame,0)
339         _node(backlink)
340         _node(savefn) 
341         _node(savelr) 
342         _node(savevsp)
343        _ends
344
345        _struct(vector,-fulltag_misc)
346         _node(header)
347         _struct_label(data)
348        _ends
349
350        _struct(binding,0)
351         _node(link)
352         _node(sym)
353         _node(val)
354        _ends
355
356
357/* Nilreg-relative globals.  Talking the assembler into doing something reasonable here */
358/* is surprisingly hard. */
359
360
361nrs_origin = (0x3000+(LOWMEM_BIAS))
362nrs_symbol_fulltag = fulltag_misc       
363define(`nilsym',`nil')       
364lisp_globals_limit = (0x3000+(LOWMEM_BIAS))
365       
366        include(lisp_globals.s)
367       
368       
369
370define(`def_header',`
371$1 = ($2<<num_subtag_bits)|$3')
372
373        def_header(double_float_header,2,subtag_double_float)
374        def_header(two_digit_bignum_header,2,subtag_bignum)
375        def_header(three_digit_bignum_header,3,subtag_bignum)
376        def_header(four_digit_bignum_header,4,subtag_bignum)
377        def_header(five_digit_bignum_header,5,subtag_bignum)       
378        def_header(symbol_header,symbol.element_count,subtag_symbol)
379        def_header(value_cell_header,1,subtag_value_cell        )
380        def_header(macptr_header,macptr.element_count,subtag_macptr)
381        def_header(vectorH_header,vectorH.element_count,subtag_vectorH)
382
383        include(errors.s)
384
385/* Symbol bits that we care about */
386sym_vbit_bound = (0+fixnum_shift)
387sym_vbit_bound_mask = (1<<sym_vbit_bound)
388sym_vbit_const = (1+fixnum_shift)
389sym_vbit_const_mask = (1<<sym_vbit_const)
390
391        _struct(area,0)
392         _node(pred)
393         _node(succ)
394         _node(low)
395         _node(high)
396         _node(active)
397         _node(softlimit)
398         _node(hardlimit)
399         _node(code)
400         _node(markbits)
401         _node(ndwords)
402         _node(older)
403         _node(younger)
404         _node(h)
405         _node(sofprot)
406         _node(hardprot)
407         _node(owner)
408         _node(refbits)
409         _node(nextref)
410        _ends
411
412
413/* This is only referenced by c->lisp code that needs to save/restore C NVRs in a TSP frame. */
414        _struct(c_reg_save,0)
415         _node(tsp_link)        /* backpointer */
416         _node(tsp_mark)        /* frame type */
417         _node(save_fpscr)      /* for Cs FPSCR */
418         _field(save_gprs,19*node_size) /* r13-r31 */
419         _dword(save_fp_zero)   /* for fp_zero */
420         _dword(save_fps32conv)
421         _field(save_fprs,13*8)
422        _ends
423
424
425TCR_BIAS = 0
426       
427/*  Thread context record. */
428
429        _struct(tcr,-TCR_BIAS)
430         _node(prev)            /* in doubly-linked list */
431         _node(next)            /* in doubly-linked list */
432         _node(single_float_convert) /* xxxf0 */
433         _word(lisp_fpscr)      /* lisp thread's fpscr (in low word) */
434         _word(lisp_fpscr_low)
435         _node(db_link)         /* special binding chain head */
436         _node(catch_top)       /* top catch frame */
437         _node(save_vsp)        /* VSP when in foreign code */
438         _node(save_tsp)        /* TSP when in foreign code */
439         _node(cs_area)         /* cstack area pointer */
440         _node(vs_area)         /* vstack area pointer */
441         _node(ts_area)         /* tstack area pointer */
442         _node(cs_limit)        /* cstack overflow limit */
443         _word(bytes_consed_high)
444         _word(bytes_consed_low)
445         _node(log2_allocation_quantum)
446         _node(interrupt_pending)
447         _node(xframe)          /* per-thread exception frame list */
448         _node(errno_loc)       /* per-thread  errno location */
449         _node(ffi_exception)   /* fpscr exception bits from ff-call */
450         _node(osid)            /* OS thread id */
451         _node(valence)         /* odd when in foreign code */
452         _node(foreign_exception_status)
453         _node(native_thread_info)
454         _node(native_thread_id)
455         _node(last_allocptr)
456         _node(save_allocptr)
457         _node(save_allocbase)
458         _node(reset_completion)
459         _node(activate)
460         _node(suspend_count)
461         _node(suspend_context)
462         _node(pending_exception_context)
463         _node(suspend)         /* semaphore for suspension notify */
464         _node(resume)          /* sempahore for resumption notify */
465         _word(flags_pad)
466         _word(flags)     
467         _node(gc_context)
468         _node(termination_semaphore)
469         _node(unwinding)
470         _node(tlb_limit)
471         _node(tlb_pointer)     /* Consider using tcr+N as tlb_pointer */
472         _node(shutdown_count)
473         _node(safe_ref_address)
474        _ends
475
476TCR_FLAG_BIT_FOREIGN = fixnum_shift
477TCR_FLAG_BIT_AWAITING_PRESET = (fixnum_shift+1)
478TCR_FLAG_BIT_ALT_SUSPEND = (fixnumshift+2)
479TCR_FLAG_BIT_PROPAGATE_EXCEPTION = (fixnumshift+3)
480TCR_FLAG_BIT_SUSPEND_ACK_PENDING = (fixnumshift+4)
481TCR_FLAG_BIT_PENDING_EXCEPTION = (fixnumshift+5)
482TCR_FLAG_BIT_FOREIGN_EXCEPTION = (fixnumshift+6)
483TCR_FLAG_BIT_PENDING_SUSPEND = (fixnumshift+7)       
484
485
486nil_value = (0x3000+symbol.size+fulltag_misc+(LOWMEM_BIAS))
487               
488define(`RESERVATION_DISCHARGE',(0x2008+(LOWMEM_BIAS)))
489
490
491       
492INTERRUPT_LEVEL_BINDING_INDEX = fixnumone
493       
494               
Note: See TracBrowser for help on using the repository browser.