source: release/1.9/source/lisp-kernel/x86-constants32.s @ 16083

Last change on this file since 16083 was 15429, checked in by gb, 7 years ago

Minor tweaks to compile without warnings with some version of Apple's
clang compiler:

gc.h, image.h, lisp.h: prototypes for some functions that haven't had them.
image.c: remove redundant/inconsistent prototypes.
mach-o-image.c: include "image.h" to pick up those prototypes.
pmcl-kernel.c: change a few function declarations to match prototypes.
x86-constants32.s, x86-subprims32.s, x86-spentry32.s: add copyright notice.

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