source: trunk/source/lisp-kernel/x86-constants32.s @ 15371

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

Ensure that lisp_globals_limit is defined before lisp_globals.s
is included. (Newer versions of gas can handle forward references
better than older versions do.)

File size: 15.0 KB
Line 
1define(`eax_l',`eax')
2define(`ecx_l',`ecx')
3define(`edx_l',`edx')
4define(`ebx_l',`ebx')
5define(`esi_l',`esi')
6define(`edi_l',`edi')
7
8define(`eax_b',`al')
9define(`ecx_b',`cl')
10define(`edx_b',`dl')
11define(`ebx_b',`bl')
12
13define(`imm0',`eax')
14        define(`imm0_l',`eax')
15        define(`imm0_w',`ax')
16        define(`imm0_b',`al')
17        define(`imm0_bh',`ah')
18        define(`Rimm0',`0')
19
20define(`temp0',`ecx')
21        define(`temp0_l',`ecx')
22        define(`temp0_w',`cx')
23        define(`temp0_b',`cl')
24        define(`temp0_bh',`ch')
25        define(`Rtemp0',`1')
26
27define(`temp1',`edx')
28        define(`temp1_l',`edx')
29        define(`temp1_w',`dx')
30        define(`temp1_b',`dl')
31        define(`temp1_bh',`dh')
32        define(`Rtemp1',`2')
33
34define(`arg_z',`ebx')
35        define(`arg_z_l',`ebx')
36        define(`arg_z_w',`bx')
37        define(`arg_z_b',`bl')
38        define(`arg_z_bh',`bh')
39        define(`Rarg_z',`3')
40
41define(`arg_y',`esi')
42        define(`Rarg_y',`6')
43
44define(`fn',`edi')
45        define(`Rfn',`7')
46
47define(`rcontext_reg',`fs')
48       
49define(`rcontext',`%rcontext_reg:$1')
50
51define(`fname',`temp0')
52define(`allocptr',`temp0')
53
54define(`nargs',`temp1')
55define(`nargs_w',`temp1_w')
56
57define(`ra0',`temp0')
58define(`xfn',`temp1')
59
60define(`allocptr',`temp0')
61define(`stack_temp',`mm7')
62
63define(`fp0',`xmm0')           
64define(`fp1',`xmm1')           
65define(`fp2',`xmm2')           
66define(`fp3',`xmm3')           
67define(`fp4',`xmm4')           
68define(`fp5',`xmm5')           
69define(`fp6',`xmm6')           
70define(`fp7',`xmm7')           
71define(`fpzero',`fp7')
72
73nbits_in_word = 32
74nbits_in_byte = 8
75ntagbits = 3
76nlisptagbits = 2
77nfixnumtagbits = 2
78num_subtag_bits = 8
79subtag_shift = num_subtag_bits
80fixnumshift = 2
81fixnum_shift = 2
82fulltagmask = 7
83tagmask = 3
84fixnummask = 3
85ncharcodebits = 8
86charcode_shift = 8
87word_shift = 2
88node_size = 4
89dnode_size = 8
90dnode_align_bits = 3
91dnode_shift = dnode_align_bits       
92bitmap_shift = 5
93
94fixnumone = (1<<fixnumshift)
95fixnum_one = fixnumone
96fixnum1 = fixnumone
97
98nargregs = 2
99
100tag_fixnum = 0
101tag_list = 1
102tag_misc = 2
103tag_imm = 3
104
105fulltag_even_fixnum = 0
106fulltag_cons = 1
107fulltag_nodeheader = 2
108fulltag_imm = 3
109fulltag_odd_fixnum = 4
110fulltag_tra = 5
111fulltag_misc = 6
112fulltag_immheader = 7
113
114define(`define_subtag',`subtag_$1 = ($2 | ($3 << ntagbits))')
115define(`define_imm_subtag',`define_subtag($1,fulltag_immheader,$2)')
116define(`define_node_subtag',`define_subtag($1,fulltag_nodeheader,$2)')
117
118define_imm_subtag(bignum,0)
119min_numeric_subtag = subtag_bignum
120define_node_subtag(ratio,1)
121max_rational_subtag = subtag_ratio
122define_imm_subtag(single_float,1)
123define_imm_subtag(double_float,2)
124min_float_subtag = subtag_single_float
125max_float_subtag = subtag_double_float
126max_real_subtag = subtag_double_float
127define_node_subtag(complex,3)
128max_numeric_subtag = subtag_complex
129
130define_imm_subtag(bit_vector,31)
131define_imm_subtag(double_float_vector,30)
132define_imm_subtag(s16_vector,29)
133define_imm_subtag(u16_vector,28)
134min_16_bit_ivector_subtag = subtag_u16_vector
135max_16_bit_ivector_subtag = subtag_s16_vector
136define_imm_subtag(s8_vector,26)
137define_imm_subtag(u8_vector,25)
138min_8_bit_ivector_subtag = subtag_u8_vector
139max_8_bit_ivector_subtag = fulltag_immheader|(27<<ntagbits)
140define_imm_subtag(simple_base_string,24)
141define_imm_subtag(fixnum_vector,23)
142define_imm_subtag(s32_vector,22)
143define_imm_subtag(u32_vector,21)
144define_imm_subtag(single_float_vector,20)
145max_32_bit_ivector_subtag = fulltag_immheader|(24<<ntagbits)
146min_cl_ivector_subtag = subtag_single_float_vector
147
148define_node_subtag(arrayH,19)
149define_node_subtag(vectorH,20)
150define_node_subtag(simple_vector,21)
151min_vector_subtag = subtag_vectorH
152min_array_subtag = subtag_arrayH
153
154define_imm_subtag(macptr,3)
155min_non_numeric_imm_subtag = subtag_macptr
156define_imm_subtag(dead_macptr,4)
157define_imm_subtag(xcode_vector,7)
158
159define_subtag(unbound,fulltag_imm,6)
160unbound_marker = subtag_unbound
161undefined = unbound_marker
162define_subtag(character,fulltag_imm,9)
163define_subtag(slot_unbound,fulltag_imm,10)
164slot_unbound_marker = subtag_slot_unbound
165define_subtag(illegal,fulltag_imm,11)
166illegal = subtag_illegal
167define_subtag(reserved_frame,fulltag_imm,29)
168reserved_frame_marker = subtag_reserved_frame
169define_subtag(no_thread_local_binding,fulltag_imm,30)
170no_thread_local_binding_marker = subtag_no_thread_local_binding
171define_subtag(function_boundary_marker,fulltag_imm,31)
172function_boundary_marker = subtag_function_boundary_marker
173
174max_non_array_imm_subtag = (18<<ntagbits)|fulltag_immheader
175
176define_node_subtag(catch_frame,4)
177define_node_subtag(function,5)
178define_node_subtag(basic_stream,6)
179define_node_subtag(symbol,7)
180define_node_subtag(lock,8)
181define_node_subtag(hash_vector,9)
182define_node_subtag(pool,10)
183define_node_subtag(weak,11)
184define_node_subtag(package,12)
185define_node_subtag(slot_vector,13)
186define_node_subtag(instance,14)
187define_node_subtag(struct,15)
188define_node_subtag(istruct,16)
189define_node_subtag(value_cell,17)
190define_node_subtag(xfunction,18)
191
192max_non_array_node_subtag = (18<<ntagbits)|fulltag_immheader
193
194misc_header_offset = -fulltag_misc
195misc_subtag_offset = misc_header_offset
196misc_data_offset = misc_header_offset+node_size
197misc_dfloat_offset = misc_header_offset+8
198
199nil_value = ((0x13000 + fulltag_cons)+(LOWMEM_BIAS))
200t_value = ((0x13008 + fulltag_misc)+(LOWMEM_BIAS))
201t_offset = (t_value-nil_value)
202misc_bias = fulltag_misc
203cons_bias = fulltag_cons
204
205        _struct(cons,-cons_bias)
206         _node(cdr)
207         _node(car)
208        _ends
209
210        _structf(ratio)
211         _node(numer)
212         _node(denom)
213        _endstructf
214
215        _structf(single_float)
216         _word(value)
217        _endstructf
218
219        _structf(double_float)
220         _word(pad)
221         _dword(value)
222        _endstructf
223
224        _structf(macptr)
225         _node(address)
226         _node(domain)
227         _node(type)
228        _endstructf
229
230        _structf(catch_frame)
231         _node(catch_tag)  /* #<unbound> -> unwind-protect, else catch */
232         _node(link)       /* backpointer to previous catch frame */
233         _node(mvflag)     /* 0 if single-valued catch, fixnum 1 otherwise */
234         _node(esp)        /* saved lisp esp */
235         _node(ebp)        /* saved lisp ebp */
236         _node(foreign_sp) /* necessary? */
237         _node(db_link)    /* head of special-binding chain */
238         _node(xframe)     /* exception frame chain */
239         _node(pc)         /* TRA of catch exit or cleanup form */
240        _endstructf
241
242        _struct(_function,-misc_bias)
243         _node(header)
244         _node(codevector)
245        _ends
246
247        _struct(tsp_frame,0)
248         _node(backlink)
249         _node(save_ebp)
250         _struct_label(fixed_overhead)
251         _struct_label(data_offset)
252        _ends
253
254        _struct(csp_frame,0)
255         _node(backlink)
256         _node(save_ebp)
257         _struct_label(fixed_overhead)
258         _struct_label(data_offset)
259        _ends
260
261        _structf(symbol)
262         _node(pname)
263         _node(vcell)
264         _node(fcell)
265         _node(package_predicate)
266         _node(flags)
267         _node(plist)
268         _node(binding_index)
269        _endstructf
270
271        _structf(vectorH)
272         _node(logsize)
273         _node(physsize)
274         _node(data_vector)
275         _node(displacement)
276         _node(flags)
277        _endstructf     
278
279        _structf(arrayH)
280         _node(rank)
281         _node(physsize)
282         _node(data_vector)
283         _node(displacement)
284         _node(flags)
285         _struct_label(dim0)       
286        _endstructf     
287
288        _struct(lisp_frame,0)
289         _node(backlink)
290         _node(savera0)
291        _ends
292
293        _struct(vector,-fulltag_misc)
294         _node(header)
295         _struct_label(data)
296        _ends
297
298        _struct(binding,0)
299         _node(link)
300         _node(sym)
301         _node(val)
302        _ends
303
304nrs_origin = 0x13008+(LOWMEM_BIAS)
305nrs_symbol_fulltag = fulltag_misc       
306lisp_globals_limit = (0x13000+LOWMEM_BIAS)
307       
308        include(lisp_globals.s)
309
310
311define(`def_header',`$1 = ($2<<num_subtag_bits)|$3')
312
313def_header(single_float_header,single_float.element_count,subtag_single_float)
314def_header(double_float_header,double_float.element_count,subtag_double_float)
315def_header(one_digit_bignum_header,1,subtag_bignum)
316def_header(two_digit_bignum_header,2,subtag_bignum)
317def_header(three_digit_bignum_header,3,subtag_bignum)
318def_header(symbol_header,symbol.element_count,subtag_symbol)
319def_header(value_cell_header,1,subtag_value_cell)
320def_header(macptr_header,macptr.element_count,subtag_macptr)
321def_header(vectorH_header,vectorH.element_count,subtag_vectorH)
322
323        include(errors.s)
324
325/* Symbol bits that we care about */
326sym_vbit_bound = (0+fixnum_shift)
327sym_vbit_bound_mask = (1<<sym_vbit_bound)
328sym_vbit_const = (1+fixnum_shift)
329sym_vbit_const_mask = (1<<sym_vbit_const)
330
331        _struct(area,0)
332         _node(pred)
333         _node(succ)
334         _node(low)
335         _node(high)
336         _node(active)
337         _node(softlimit)
338         _node(hardlimit)
339         _node(code)
340         _node(markbits)
341         _node(ndwords)
342         _node(older)
343         _node(younger)
344         _node(h)
345         _node(sofprot)
346         _node(hardprot)
347         _node(owner)
348         _node(refbits)
349         _node(nextref)
350        _ends
351
352ifdef(`WIN_32',`
353TCR_BIAS = 0xe10 + (4 * 30)     /* last 34 words of TlsSlots */
354',`
355TCR_BIAS = 0
356')
357
358ifdef(`WIN_32',`
359        _struct(tcr,TCR_BIAS)
360         _node(linear)          /* our linear (non-segment-based) address. */
361         _word(aux)             /* pointer to tcr_aux struct, see below */
362         _node(valence)         /* odd when in foreign code */
363         _word(node_regs_mask)
364         _node(save_allocbase)
365         _node(save_allocptr)
366         _node(last_allocptr)
367         _node(catch_top)       /* top catch frame */
368         _node(db_link)         /* special binding chain head */
369         _node(tlb_limit)
370         _node(tlb_pointer)     /* Consider using tcr+N as tlb_pointer */
371         _node(ffi_exception)   /* mxcsr exception bits from ff-call */
372         _node(foreign_sp)      /* Saved foreign SP when in lisp code */
373         _node(interrupt_pending)
374         _node(next_method_context)
375         _node(next_tsp)
376         _node(safe_ref_address)
377         _node(save_tsp)        /* TSP when in foreign code */
378         _node(save_vsp)        /* VSP when in foreign code */
379         _node(save_ebp)        /* lisp EBP when in foreign code */
380         _node(ts_area)         /* tstack area pointer */
381         _node(vs_area)         /* vstack area pointer */
382         _node(xframe)          /* per-thread exception frame list */
383         _node(unwinding)
384         _node(flags)     
385         _node(foreign_mxcsr)
386         _word(lisp_mxcsr)
387         _word(pending_exception_context)
388         _word(unboxed0)
389         _word(unboxed1)
390         _node(save0)           /* spill area for node registers... */
391         _node(save1)           /* ...must be 16-byte aligned */
392         _node(save2)
393         _node(save3)
394        _ends
395
396        _struct(tcr_aux,0)
397         _word(bytes_allocated)
398         _word(bytes_allocated_high)
399         _node(cs_area)         /* cstack area pointer */
400         _node(cs_limit)        /* cstack overflow limit */
401         _node(log2_allocation_quantum)
402         _node(errno_loc)       /* per-thread  errno location */
403         _node(osid)            /* OS thread id */
404         _node(foreign_exception_status)
405         _node(native_thread_info)
406         _node(native_thread_id)
407         _node(reset_completion)
408         _node(activate)
409         _node(gc_context)
410         _node(termination_semaphore)
411         _node(shutdown_count)
412         _node(suspend_count)
413         _node(suspend_context)
414         _node(suspend)         /* semaphore for suspension notify */
415         _node(resume)          /* sempahore for resumption notify */
416         _word(allocated)
417         _word(pending_io_info)
418         _word(io_datum)
419         _node(next)            /* in doubly-linked list */
420         _node(prev)            /* in doubly-linked list */
421        _ends
422',`
423/*  Thread context record.  */
424
425        _struct(tcr,TCR_BIAS)
426         _node(next)            /* in doubly-linked list */
427         _node(prev)            /* in doubly-linked list */
428         _word(node_regs_mask)
429         _node(linear)          /* our linear (non-segment-based) address. */
430         _node(save0)           /* spill area for node registers (16-byte aligned ) */
431         _node(save1)
432         _node(save2)
433         _node(save3)
434         _node(save_ebp)        /* lisp EBP when in foreign code */
435         _word(lisp_mxcsr)
436         _word(foreign_mxcsr)   
437         _node(db_link)         /* special binding chain head */
438         _node(catch_top)       /* top catch frame */
439         _node(save_vsp)        /* VSP when in foreign code */
440         _node(save_tsp)        /* TSP when in foreign code */
441         _node(foreign_sp)      /* Saved foreign SP when in lisp code */
442         _node(cs_area)         /* cstack area pointer */
443         _node(vs_area)         /* vstack area pointer */
444         _node(ts_area)         /* tstack area pointer */
445         _node(cs_limit)        /* cstack overflow limit */
446         _word(bytes_allocated)
447         _word(bytes_consed_high)
448         _node(log2_allocation_quantum)
449         _node(interrupt_pending)
450         _node(xframe)          /* per-thread exception frame list */
451         _node(errno_loc)       /* per-thread  errno location */
452         _node(ffi_exception)   /* mxcsr exception bits from ff-call */
453         _node(osid)            /* OS thread id */
454         _node(valence)         /* odd when in foreign code */
455         _node(foreign_exception_status)
456         _node(native_thread_info)
457         _node(native_thread_id)
458         _node(last_allocptr)
459         _node(save_allocptr)
460         _node(save_allocbase)
461         _node(reset_completion)
462         _node(activate)
463         _node(suspend_count)
464         _node(suspend_context)
465         _node(pending_exception_context)
466         _node(suspend)         /* semaphore for suspension notify */
467         _node(resume)          /* sempahore for resumption notify */
468         _node(flags)     
469         _node(gc_context)
470         _node(termination_semaphore)
471         _node(unwinding)
472         _node(tlb_limit)
473         _node(tlb_pointer)     /* Consider using tcr+N as tlb_pointer */
474         _node(shutdown_count)
475         _node(next_tsp)
476         _node(safe_ref_address)
477         _word(ldt_selector)
478         _word(scratch_mxcsr)
479         _word(unboxed0)
480         _word(unboxed1)
481         _node(next_method_context)
482         _word(save_eflags)
483         _word(allocated)
484         _word(pending_io_info)
485         _word(io_datum)
486        _ends
487')
488
489        _struct(win32_context,0)
490         _field(ContextFlags, 4)
491         _field(Dr0, 4)
492         _field(Dr1, 4)
493         _field(Dr2, 4)
494         _field(Dr3, 4)
495         _field(Dr6, 4)
496         _field(Dr7, 4)
497         _struct_label(FloatSave)
498         _field(ControlWord, 4);
499         _field(StatusWord, 4)
500         _field(TagWord, 4)
501         _field(ErrorOffset, 4)
502         _field(ErrorSelector, 4)
503         _field(DataOffset, 4)
504         _field(DataSelector, 4)
505         _field(RegisterArea, 80)
506         _field(Cr0NpxState, 4)
507       
508         _field(SegGs, 4)
509         _field(SegFs, 4)
510         _field(SegEs, 4)
511         _field(SegDs, 4)
512         _field(Edi, 4)
513         _field(Esi, 4)
514         _field(Ebx, 4)
515         _field(Edx, 4)
516         _field(Ecx, 4)
517         _field(Eax, 4)
518         _field(Ebp, 4)
519         _field(Eip, 4)
520         _field(SegCs, 4)
521         _field(EFlags, 4)
522         _field(Esp, 4)
523         _field(SegSs, 4)
524         _struct_label(ExtendedRegisters)
525         _struct_pad(24)
526         _field(MXCSR,4)
527         _struct_pad(132) /* (- 160 28) */
528         _field(Xmm0,16)
529         _field(Xmm1,16)
530         _field(Xmm2,16)
531         _field(Xmm3,16)
532         _field(Xmm4,16)
533         _field(Xmm5,16)
534         _field(Xmm6,16)
535         _field(Xmm7,16)
536         _struct_pad(224)
537         _ends
538       
539target_most_positive_fixnum = 536870911
540target_most_negative_fixnum = -536870912
541call_arguments_limit = 0x10000
542
543       
544INTERRUPT_LEVEL_BINDING_INDEX = fixnumone
545
546
547ifdef(`DARWIN',`
548c_stack_16_byte_aligned = 1
549',`
550c_stack_16_byte_aligned = 0
551')               
Note: See TracBrowser for help on using the repository browser.