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

Last change on this file since 14261 was 13952, checked in by rme, 9 years ago

New scheme for dealing with floating point exceptions on x86-64 systems.

Currently, we mask floating point execptions around all foreign function
calls. While this may not be a huge component of FF call overhead, it
makes sense to avoid doing this for what is presumably an exceptional
case.

We now leave floating point exceptions enabled, but the exception
handler in the lisp kernel is prepared to deal with them: it saves
lisp's MXCSR, masks all floating point exceptions, and resumes
execution (after setting a flag in the TCR to note what it has done).
At the end of .SPffcall, we check this flag. If it is set, we
save the fp exception status, and restore lisp's original MXCSR.

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