source: trunk/source/lisp-kernel/x86-constants.s @ 14347

Last change on this file since 14347 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.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.7 KB
Line 
1/*   Copyright (C) 2005-2009 Clozure Associates  */
2/*   This file is part of Clozure CL.    */
3 
4/*   Clozure CL is licensed under the terms of the Lisp Lesser GNU Public  */
5/*   License , known as the LLGPL and distributed with Clozure CL as the  */
6/*   file "LICENSE".  The LLGPL consists of a preamble and the LGPL,  */
7/*   which is distributed with Clozure CL as the file "LGPL".  Where these  */
8/*   conflict, the preamble takes precedence.    */
9 
10/*   Clozure CL is referenced in the preamble as the "LIBRARY."  */
11 
12/*   The LLGPL is also available online at  */
13/*   http://opensource.franz.com/preamble.html  */
14
15
16
17       
18/* Indices in %builtin-functions%  */
19       
20_builtin_plus = 0       /* +-2   */
21_builtin_minus = 1      /* --2   */
22_builtin_times = 2      /* *-2   */
23_builtin_div = 3        /* /-2   */
24_builtin_eq = 4         /* =-2   */
25_builtin_ne = 5         /* /-2   */
26_builtin_gt = 6         /* >-2   */
27_builtin_ge = 7         /* >=-2   */
28_builtin_lt = 8         /* <-2   */
29_builtin_le = 9         /* <=-2   */
30_builtin_eql = 10       /* eql   */
31_builtin_length = 11    /* length   */
32_builtin_seqtype = 12   /* sequence-type   */
33_builtin_assq = 13      /* assq   */
34_builtin_memq = 14      /* memq   */
35_builtin_logbitp = 15   /* logbitp   */
36_builtin_logior = 16    /* logior-2   */
37_builtin_logand = 17    /* logand-2   */
38_builtin_ash = 18       /* ash   */
39_builtin_negate = 19    /* %negate   */
40_builtin_logxor = 20    /* logxor-2   */
41_builtin_aref1 = 21     /* %aref1   */
42_builtin_aset1 = 22     /* %aset1   */
43       
44
45ifdef(`X8664',`
46        include(x86-constants64.s)
47',`
48        include(x86-constants32.s)
49')                                             
50
51/* registers, as used in destructuring-bind/macro-bind   */
52ifdef(`X8664',`
53define(`whole_reg',`temp1')
54define(`arg_reg',`temp0')
55define(`keyvect_reg',`arg_x')
56',`
57define(`arg_reg',`temp1')
58define(`arg_reg_b',`temp1_b')
59define(`keyvect_reg',`arg_y')
60')
61
62define(`initopt_bit',`24')
63define(`keyp_bit',`25') /*  note that keyp can be true even when 0 keys.   */
64define(`aok_bit',`26')
65define(`restp_bit',`27')
66define(`seen_aok_bit',`28')       
67       
68num_lisp_globals = 49            /* MUST UPDATE THIS !!!   */
69       
70        _struct(lisp_globals,lisp_globals_limit-(num_lisp_globals*node_size))
71         _node(weakvll)                 /* all populations as of last GC */
72         _node(initial_tcr)             /* initial thread tcr */
73         _node(image_name)              /* --image-name argument */
74         _node(BADfpscr_save_high)      /* high word of FP reg used to save FPSCR */
75         _node(unwind_resume)           /* _Unwind_Resume */
76         _node(batch_flag)              /* -b */
77         _node(host_platform)           /* for runtime platform-specific stuff   */
78         _node(argv)                    /* address of argv`0'   */
79         _node(ref_base)                /* start of oldest pointer-bearing area */
80         _node(tenured_area)            /* the tenured_area   */
81         _node(oldest_ephemeral)        /* dword address of oldest ephemeral object or 0   */
82         _node(lisp_exit_hook)          /* install foreign exception_handling   */
83         _node(lisp_return_hook)        /* install lisp exception_handling   */
84         _node(double_float_one)        /* high half of 1.0d0   */
85         _node(short_float_zero)        /* low half of 1.0d0   */
86         _node(objc2_end_catch)         /* objc_end_catch()  */
87         _node(metering_info)           /* address of lisp_metering global   */
88         _node(in_gc)                   /* non-zero when GC active   */
89         _node(lexpr_return1v)          /* simpler when &lexpr called for single value.   */
90         _node(lexpr_return)            /* magic &lexpr return code.   */
91         _node(all_areas)               /* doubly-linked list of all memory areas   */
92         _node(kernel_path)             /* real executable name */
93         _node(objc2_begin_catch)       /* objc_begin_catch   */
94         _node(stack_size)              /* from the command line */
95         _node(statically_linked)       /* non-zero if -static   */
96         _node(heap_end)                /* end of lisp heap   */
97         _node(heap_start)              /* start of lisp heap   */
98         _node(gcable_pointers)         /* linked-list of weak macptrs.   */
99         _node(gc_num)                  /* fixnum: GC call count.   */
100         _node(fwdnum)                  /* fixnum: GC "forwarder" call count.   */
101         _node(altivec_present)         /* non-zero when AltiVec available   */
102         _node(oldspace_dnode_count)    /* dynamic dnodes older than g0 start   */
103         _node(refbits)                 /* EGC refbits   */
104         _node(gc_inhibit_count)
105         _node(intflag)                 /* sigint pending   */
106         _node(default_allocation_quantum)      /* for per-thread allocation   */
107         _node(deleted_static_pairs)           
108         _node(exception_lock)
109         _node(area_lock)
110         _node(tcr_key)                 /* tsd key for per-thread tcr   */
111         _node(ret1val_addr)            /* address of "dynamic" subprims magic values return addr   */
112         _node(subprims_base)           /* address of dynamic subprims jump table   */
113         _node(saveR13)                 /* probably don't really need this   */
114         _node(saveTOC)                 /* where the 68K emulator stores the  emulated regs   */
115         _node(objc_2_personality)              /* exception "personality routine" address for ObjC 2.0 */
116         _node(kernel_imports)          /* some things we need imported for us   */
117         _node(interrupt_signal)        /* signal used by PROCESS-INTERRUPT   */
118         _node(tcr_count)               /* tcr_id for next tcr   */
119         _node(get_tcr)                 /* address of get_tcr()  */
120        _ends
121       
122       
123               
124define(`TCR_STATE_FOREIGN',1)
125define(`TCR_STATE_LISP',0)
126define(`TCR_STATE_EXCEPTION_WAIT',2)
127define(`TCR_STATE_EXCEPTION_RETURN',4)
128
129tstack_alloc_limit = 0xffff
130       
131mxcsr_ie_bit = 0                /* invalid */
132mxcsr_de_bit = 1                /* denorm */       
133mxcsr_ze_bit = 2
134mxcsr_oe_bit = 3
135mxcsr_ue_bit = 4
136mxcsr_pe_bit = 5
137num_mxcsr_exception_bits = 6
138
139mxcsr_all_exceptions = ((1<<num_mxcsr_exception_bits)-1)
140
141TCR_FLAG_BIT_FOREIGN = fixnum_shift
142TCR_FLAG_BIT_AWAITING_PRESET = (fixnum_shift+1) 
143TCR_FLAG_BIT_ALT_SUSPEND = (fixnumshift+2)
144TCR_FLAG_BIT_PROPAGATE_EXCEPTION = (fixnumshift+3)
145TCR_FLAG_BIT_SUSPEND_ACK_PENDING = (fixnumshift+4)
146TCR_FLAG_BIT_PENDING_EXCEPTION = (fixnumshift+5)
147TCR_FLAG_BIT_FOREIGN_EXCEPTION = (fixnumshift+6)
148TCR_FLAG_BIT_PENDING_SUSPEND = (fixnumshift+7)       
149TCR_FLAG_BIT_FOREIGN_FPE = (fixnumshift+8)       
Note: See TracBrowser for help on using the repository browser.