source: branches/arm/lisp-kernel/ppc-constants64.h @ 13923

Last change on this file since 13923 was 13717, checked in by gb, 9 years ago

Try to move platform-independent definitions to constants.h, to
lessen redundancy a bit. (Should do this on trunk, too.)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.0 KB
Line 
1/*
2   Copyright (C) 2003-2009, Clozure Associates.
3   Copyright (C) 1994-2001 Digitool, Inc
4   This file is part of Clozure CL. 
5
6   Clozure CL is licensed under the terms of the Lisp Lesser GNU Public
7   License , known as the LLGPL and distributed with Clozure CL as the
8   file "LICENSE".  The LLGPL consists of a preamble and the LGPL,
9   which is distributed with Clozure CL as the file "LGPL".  Where these
10   conflict, the preamble takes precedence. 
11
12   Clozure CL is referenced in the preamble as the "LIBRARY."
13
14   The LLGPL is also available online at
15   http://opensource.franz.com/preamble.html
16*/
17
18
19#include "ppc-constants.h"
20
21#define rcontext 2
22
23#define nbits_in_word 64L
24#define log2_nbits_in_word 6L
25#define nbits_in_byte 8L
26#define ntagbits 4L
27#define nlisptagbits 3L
28#define nfixnumtagbits 2L
29#define num_subtag_bits 8L
30#define fixnumshift 3L
31#define fixnum_shift 3L
32#define fulltagmask 15L
33#define tagmask  7L
34#define fixnummask 3
35#define subtagmask ((1L<<num_subtag_bits)-1L)
36#define ncharcodebits 8L
37#define charcode_shift 8L
38#define node_size 8L
39#define node_shift 3L
40
41#define lowtagmask 3L
42#define lowtag_mask lowtagmask
43
44#define lowtag_primary 0L
45#define lowtag_imm 1L
46#define lowtag_immheader 2L
47#define lowtag_nodeheader 3L
48
49#define tag_fixnum 0L
50
51#define fulltag_even_fixnum 0L
52#define fulltag_imm_0 1L
53#define fulltag_immheader_0 2L
54#define fulltag_nodeheader_0 3L
55#define fulltag_cons 4L
56#define fulltag_imm_1 5L
57#define fulltag_immheader_1 6L
58#define fulltag_nodeheader_1 7L
59#define fulltag_odd_fixnum 8L
60#define fulltag_imm_2 9L
61#define fulltag_immheader_2 10L
62#define fulltag_nodeheader_2 11L
63#define fulltag_misc 12L
64#define fulltag_imm_3 13L
65#define fulltag_immheader_3 14L
66#define fulltag_nodeheader_3 15L
67
68#define SUBTAG(tag,subtag) ((tag) | ((subtag) << ntagbits))
69#define cl_array_subtag_mask 0x80L
70#define CL_ARRAY_SUBTAG(tag,subtag) (cl_array_subtag_mask | (SUBTAG(tag,subtag)))
71
72#define subtag_arrayH CL_ARRAY_SUBTAG(fulltag_nodeheader_1,0L)
73#define subtag_vectorH CL_ARRAY_SUBTAG(fulltag_nodeheader_2,0L)
74#define subtag_simple_vector CL_ARRAY_SUBTAG(fulltag_nodeheader_3,0L)
75#define min_vector_subtag subtag_vectorH       
76
77#define ivector_class_64_bit fulltag_immheader_3
78#define ivector_class_32_bit fulltag_immheader_2
79#define ivector_class_other_bit fulltag_immheader_1
80#define ivector_class_8_bit fulltag_immheader_0
81
82#define subtag_s64_vector CL_ARRAY_SUBTAG(ivector_class_64_bit,1)
83#define subtag_u64_vector CL_ARRAY_SUBTAG(ivector_class_64_bit,2)
84#define subtag_fixnum_vector CL_ARRAY_SUBTAG(ivector_class_64_bit,3)
85#define subtag_double_float_vector CL_ARRAY_SUBTAG(ivector_class_64_bit,4)
86#define subtag_s32_vector CL_ARRAY_SUBTAG(ivector_class_32_bit,1)
87#define subtag_u32_vector CL_ARRAY_SUBTAG(ivector_class_32_bit,2)
88#define subtag_single_float_vector CL_ARRAY_SUBTAG(ivector_class_32_bit,3)
89#define subtag_simple_base_string CL_ARRAY_SUBTAG(ivector_class_32_bit,5)
90#define subtag_s16_vector CL_ARRAY_SUBTAG(ivector_class_other_bit,1)
91#define subtag_u16_vector CL_ARRAY_SUBTAG(ivector_class_other_bit,2)
92#define subtag_bit_vector CL_ARRAY_SUBTAG(ivector_class_other_bit,7)
93#define subtag_s8_vector CL_ARRAY_SUBTAG(ivector_class_8_bit,1)
94#define subtag_u8_vector CL_ARRAY_SUBTAG(ivector_class_8_bit,2)
95
96/* There's some room for expansion in non-array ivector space. */
97#define subtag_macptr SUBTAG(ivector_class_64_bit,1)
98#define subtag_dead_macptr SUBTAG(ivector_class_64_bit,2)
99#define subtag_code_vector SUBTAG(ivector_class_32_bit,0)
100#define subtag_xcode_vector SUBTAG(ivector_class_32_bit,1)
101#define subtag_bignum SUBTAG(ivector_class_32_bit,2)
102#define subtag_double_float SUBTAG(ivector_class_32_bit,3)
103
104
105/*
106 Size doesn't matter for non-CL-array gvectors; I can't think of a good
107 reason to classify them in any particular way.  Let's put funcallable
108 things in the first slice by themselves, though it's not clear that
109 that helps FUNCALL much.
110*/
111#define gvector_funcallable fulltag_nodeheader_0
112       
113#define subtag_function SUBTAG(gvector_funcallable,0)
114#define subtag_symbol SUBTAG(gvector_funcallable,1)
115#define subtag_catch_frame SUBTAG(fulltag_nodeheader_1,0)
116#define subtag_basic_stream SUBTAG(fulltag_nodeheader_1,1)
117#define subtag_lock SUBTAG(fulltag_nodeheader_1,2)
118#define subtag_hash_vector SUBTAG(fulltag_nodeheader_1,3)
119#define subtag_pool SUBTAG(fulltag_nodeheader_1,4)
120#define subtag_weak SUBTAG(fulltag_nodeheader_1,5)
121#define subtag_package SUBTAG(fulltag_nodeheader_1,6)
122
123#define subtag_slot_vector SUBTAG(fulltag_nodeheader_2,0)
124#define subtag_instance SUBTAG(fulltag_nodeheader_2,1)
125#define subtag_struct SUBTAG(fulltag_nodeheader_2,2)
126#define subtag_istruct SUBTAG(fulltag_nodeheader_2,3)
127#define subtag_value_cell SUBTAG(fulltag_nodeheader_2,4)
128#define subtag_xfunction SUBTAG(fulltag_nodeheader_2,5)
129
130#define subtag_ratio SUBTAG(fulltag_nodeheader_3,0)
131#define subtag_complex SUBTAG(fulltag_nodeheader_3,1)
132
133
134
135#define nil_value (0x3000+fulltag_misc+sizeof(struct lispsymbol)+(LOWMEM_BIAS))
136#define t_value (0x3000+fulltag_misc+(LOWMEM_BIAS))     
137#define misc_bias fulltag_misc
138#define cons_bias fulltag_cons
139
140       
141#define misc_header_offset -fulltag_misc
142#define misc_subtag_offset misc_header_offset+7       /* low byte of header */
143#define misc_data_offset misc_header_offset+8           /* first word of data */
144#define misc_dfloat_offset misc_header_offset           /* double-floats are doubleword-aligned */
145
146#define subtag_single_float SUBTAG(fulltag_imm_0,0)
147
148#define subtag_go_tag SUBTAG(fulltag_imm_1,2) /* deprecated */
149#define subtag_block_tag SUBTAG(fulltag_imm_1,3) /* deprecated */
150
151#define subtag_character SUBTAG(fulltag_imm_1,0)
152
153#define subtag_unbound SUBTAG(fulltag_imm_3,0)
154#define unbound_marker subtag_unbound
155#define undefined unbound_marker
156#define unbound unbound_marker
157#define subtag_slot_unbound SUBTAG(fulltag_imm_3,1)
158#define slot_unbound_marker subtag_slot_unbound
159#define slot_unbound slot_unbound_marker
160#define subtag_illegal SUBTAG(fulltag_imm_3,2)
161#define illegal_marker subtag_illegal
162#define subtag_no_thread_local_binding SUBTAG(fulltag_imm_3,3)
163#define no_thread_local_binding_marker subtag_no_thread_local_binding       
164#define subtag_forward_marker SUBTAG(fulltag_imm_3,7)
165       
166#define max_64_bit_constant_index ((0x7fff + misc_dfloat_offset)>>3)
167#define max_32_bit_constant_index ((0x7fff + misc_data_offset)>>2)
168#define max_16_bit_constant_index ((0x7fff + misc_data_offset)>>1)
169#define max_8_bit_constant_index (0x7fff + misc_data_offset)
170#define max_1_bit_constant_index ((0x7fff + misc_data_offset)<<5)
171
172
173/* The objects themselves look something like this: */
174
175typedef struct double_float {
176  LispObj header;
177  LispObj value;
178} double_float;
179
180
181typedef struct macptr {
182  LispObj header;
183  LispObj address;
184  LispObj class;
185  LispObj type;
186} macptr;
187
188typedef struct xmacptr {
189  LispObj header;
190  LispObj address;
191  LispObj class;
192  LispObj type;
193  LispObj flags;
194  LispObj link;
195} xmacptr;
196 
197
198typedef struct eabi_c_frame {
199  struct eabi_c_frame *backlink;
200  unsigned savelr;
201  LispObj params[8];
202} eabi_c_frame;
203
204/* PowerOpen ABI C frame */
205
206typedef struct c_frame {
207  struct c_frame *backlink;
208  natural crsave;
209  natural savelr;
210  natural unused[2];
211  natural savetoc;              /* Used with CFM (and on Linux.) */
212  natural params[8];            /* Space for callee to save r3-r10 */
213} c_frame;
214
215typedef struct lisp_frame {
216  struct lisp_frame *backlink;
217  LispObj savefn;
218  LispObj savelr;
219  LispObj savevsp;
220} lisp_frame;
221
222
223/*
224  The GC also needs to know what a catch_frame looks like.
225*/
226
227typedef struct catch_frame {
228  LispObj header;
229  LispObj catch_tag;
230  LispObj link;
231  LispObj mvflag;
232  LispObj csp;
233  LispObj db_link;
234  LispObj regs[8];
235  LispObj xframe;
236  LispObj tsp_segment;
237} catch_frame;
238
239#define catch_frame_element_count ((sizeof(catch_frame)/sizeof(LispObj))-1)
240#define catch_frame_header make_header(subtag_catch_frame,catch_frame_element_count)
241
242
243/*
244  All exception frames in a thread are linked together
245  */
246typedef struct xframe_list {
247  ExceptionInformation *curr;
248  struct xframe_list *prev;
249} xframe_list;
250
251#define fixnum_bitmask(n)  (1LL<<((n)+fixnumshift))
252
253
254#include "lisp-errors.h"
255
256
257
258#define TCR_BIAS (0x0)
259
260typedef struct tcr {
261  struct tcr* next;
262  struct tcr* prev;
263  struct {
264    float f;
265    u_int32_t tag;
266  } single_float_convert;
267  union {
268    double d;
269    struct {u_int32_t h, l;} words;
270  } lisp_fpscr;                 /* lisp thread's fpscr (in low word) */
271  special_binding* db_link;     /* special binding chain head */
272  LispObj catch_top;            /* top catch frame */
273  LispObj* save_vsp;  /* VSP when in foreign code */
274  LispObj* save_tsp;  /* TSP when in foreign code */
275  struct area* cs_area; /* cstack area pointer */
276  struct area* vs_area; /* vstack area pointer */
277  struct area* ts_area; /* tstack area pointer */
278  LispObj cs_limit;             /* stack overflow limit */
279  natural bytes_allocated;
280  natural log2_allocation_quantum;      /* for per-tread consing */
281  signed_natural interrupt_pending;     /* pending interrupt flag */
282  xframe_list* xframe; /* exception-frame linked list */
283  int* errno_loc;               /* per-thread (?) errno location */
284  LispObj ffi_exception;        /* fpscr bits from ff-call */
285  LispObj osid;                 /* OS thread id */
286  signed_natural valence;                       /* odd when in foreign code */
287  signed_natural foreign_exception_status;      /* non-zero -> call lisp_exit_hook */
288  void* native_thread_info;     /* platform-dependent */
289  void* native_thread_id;       /* mach_thread_t, pid_t, etc. */
290  void* last_allocptr;
291  void* save_allocptr;
292  void* save_allocbase;
293  void* reset_completion;
294  void* activate;
295  signed_natural suspend_count;
296  ExceptionInformation* suspend_context;
297  ExceptionInformation* pending_exception_context;
298  void* suspend;                /* suspension semaphore */
299  void* resume;                 /* resumption semaphore */
300  natural flags;
301  ExceptionInformation* gc_context;
302  void* termination_semaphore;
303  signed_natural unwinding;
304  natural tlb_limit;
305  LispObj* tlb_pointer;
306  natural shutdown_count;
307  void *safe_ref_address;
308} TCR;
309
310#define t_offset -(sizeof(lispsymbol))
311
312/*
313  These were previously global variables.  There are lots of implicit
314  assumptions about the size of a heap segment, so they might as well
315  be constants.
316*/
317
318#define heap_segment_size 0x00020000L
319#define log2_heap_segment_size 17L
320
Note: See TracBrowser for help on using the repository browser.