|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24:
25: #ident "@(#)kern-fp:e80387.h 1.1"
26:
27: #define LOCORE
28: #ifdef NEXT
29: #include "assym.h"
30: #else /* NEXT */
31: #include "assym.s"
32: #endif /* NEXT */
33:
34: /* the following were aids in RISCizing the emulator */
35: #define FAST_MOVSL \
36: push %eax ;\
37: 1: ;\
38: movl 0(%esi),%eax ;\
39: movl %eax,0(%edi) ;\
40: addl $4,%esi ;\
41: addl $4,%edi ;\
42: decl %ecx ;\
43: testl %ecx,%ecx ;\
44: jg 1b ;\
45: pop %eax
46:
47: #define FAST_MOVSL_ES \
48: 1: ;\
49: movl 0(%esi),%eax ;\
50: movl %eax,%es:0(%edi) ;\
51: addl $4,%esi ;\
52: addl $4,%edi ;\
53: decl %ecx ;\
54: testl %ecx,%ecx ;\
55: jg 1b
56:
57: #define FAST_MOVSW \
58: push %eax ;\
59: 1: ;\
60: movw 0(%esi),%ax ;\
61: movw %ax,%es:0(%edi) ;\
62: addl $2,%esi ;\
63: addl $2,%edi ;\
64: decl %ecx ;\
65: testl %ecx,%ecx ;\
66: jg 1b ;\
67: pop %eax
68:
69: #define FAST_STOSL \
70: 1: ;\
71: movl %eax,0(%edi) ;\
72: addl $4,%edi ;\
73: decl %ecx ;\
74: testl %ecx,%ecx ;\
75: jg 1b
76:
77: #define LOOP(arg) \
78: decl %ecx ;\
79: testl %ecx,%ecx ;\
80: jg arg
81:
82: /* redefine movw to movl and keep the ability to switch back */
83: #define MOVL movw
84: #define XORL xorl
85: #define ALIGN .align 4
86: #define FALLSTHRU \
87: jmp 1f ;\
88: .align 4 ;\
89: 1:
90:
91: /* convenience definitions */
92: /* new ones -387 */
93:
94: #define word_frac1 (dword_frac1+2)(%ebp)
95: #define word_frac2 (dword_frac2+2)(%ebp)
96: #define result_word_frac (result_dword_frac+2)(%ebp)
97: #define result2_word_frac (result2_dword_frac+2)(%ebp)
98:
99: #define dword_expon1 (expon1)(%ebp)
100: #define dword_expon2 (expon2)(%ebp)
101: #define dword_result_expon (result_expon)(%ebp)
102: #define dword_result2_expon (result2_expon)(%ebp)
103:
104: #define dop (dword_dop+2)(%ebp)
105: #define cop (dword_cop+2)(%ebp)
106: #define extra_word_reg (extra_dword_reg+2)(%ebp)
107: #define signal_i_error_ (before_error_signals)(%ebp)
108: #define signal_z_error_ (before_error_signals+1)(%ebp)
109: #define signal_d_error_ (before_error_signals+2)(%ebp)
110:
111: #define offset_op1_rec $op1_format
112: #define offset_op2_rec $op2_format
113: #define offset_result_rec $result_format
114: #define offset_result2_rec $result2_format
115: #define offset_operand1 dword_frac1
116: #define lsb_frac1 word_frac1
117: #define msb_frac1 9+word_frac1
118: #define offset_operand2 dword_frac2
119: #define lsb_frac2 word_frac2
120: #define msb_frac2 9+word_frac2
121: #define offset_result result_dword_frac
122: #define lsb_result result_word_frac
123: #define msb_result 9+result_word_frac
124: #define offset_result2 result2_dword_frac
125: #define lsb_result2 result2_word_frac
126: #define msb_result2 9+result2_word_frac
127: #define offset_cop dword_cop
128: #define lsb_cop cop
129: #define msb_cop 9+lsb_cop
130: #define offset_dop dword_dop
131: #define lsb_dop dop
132: #define msb_dop 9+lsb_dop
133: #define q (mem_operand_pointer)(%ebp)
134: #define exp_tmp (mem_operand_pointer)(%ebp)
135: #define siso (mem_operand_pointer+4)(%ebp)
136: #define log_loop_ct (mem_operand_pointer)(%ebp)
137: #define bit_ct (instruction_pointer)(%ebp)
138: #define added_one (instruction_pointer+1)(%ebp)
139: #define rnd_history (instruction_pointer+2)(%ebp)
140: #define rnd1_inexact (instruction_pointer+2)(%ebp)
141: #define rnd2_inexact (instruction_pointer+3)(%ebp)
142:
143: #define dword_exp_tmp (before_error_signals)(%ebp)
144: #define trans_info (extra_dword_reg)(%ebp)
145: #define op_type (extra_dword_reg)(%ebp)
146: #define sin_sign (extra_dword_reg+1)(%ebp)
147: #define cos_sign (extra_dword_reg+2)(%ebp)
148: #define cofunc_flag (extra_dword_reg+3)(%ebp)
149: #define res_signs (extra_dword_reg+1)(%ebp)
150: /* ...define structure of operand info and result info structures... */
151:
152: #define format 0
153: #define location 1
154: #define use_up 2
155:
156: /* ...define format codes... */
157:
158: #define single_real 0
159: #define double_real 1
160: #define int16 2
161: #define int32 3
162: #define int64 4
163: #define extended_fp 5
164: #define null 7
165: #define bcd 8
166: #define op_no_result 9
167: #define no_op_result 10
168: #define op2_pop 11
169: #define op2_no_pop 12
170: #define result2 13
171: #define op1_top_op2 14
172:
173: /* ...define operation type codes... */
174:
175: #define save_ptrs 0x80
176: #define load_op 0
177: #define store_op 1
178: #define chsign_op 2
179: #define compar_op 3
180: #define error_op 4+save_ptrs
181: #define add_op 5
182: #define sub_op 6
183: #define mul_op 7
184: #define div_op 8
185: #define ldcw_op 9+save_ptrs
186: #define save_op 10+save_ptrs
187: #define restore_op 11+save_ptrs
188: #define null_op 12+save_ptrs
189: #define abs_op 13
190: #define init_op 14+save_ptrs
191: #define fxtrac_op 15
192: #define log_op 16
193: #define splog_op 17
194: #define exp_op 18
195: #define tan_op 19
196: #define arctan_op 20
197: #define sqrt_op 21
198: #define remr_op 22
199: #define intpt_op 23
200: #define scale_op 24
201: #define exchange_op 25
202: #define free_op 26
203: #define ldenv_op 27+save_ptrs
204: #define stenv_op 28+save_ptrs
205: #define stcw_op 29+save_ptrs
206: #define stsw_op 30+save_ptrs
207: #define load_1_op 31
208: #define load_l2t_op 32
209: #define load_l2e_op 33
210: #define load_pi_op 34
211: #define load_lg2_op 35
212: #define load_ln2_op 36
213: #define load_0_op 37
214: #define decstp_op 38
215: #define incstp_op 39
216: #define cler_op 40+save_ptrs
217: #define test_op 41
218: #define exam_op 42
219: #define sin_op 43
220: #define cos_op 44
221: #define sincos_op 45
222: #define rem1_op 46
223: #define ucom_op 47
224: #define compar_pop 48
225: #define subr_op 49
226: #define divr_op 50
227: #define store_pop 51
228: #define ucom_pop 52
229:
230: /* ...definition of register tag codes... */
231:
232: #define valid $0
233: #define VALID 0
234: #define special $1
235: #define SPECIAL 1
236: #define inv $2
237: #define empty 3
238: #define denormd $6
239: #define infinty $0x0a
240: #define INFINITY 0x0a
241: #define unsupp $0x12
242:
243: /* ...infinity_control settings... */
244:
245: #define projective $0
246: #define affine $1
247:
248: /* ...define location codes... */
249:
250: #define memory_opnd 0
251: #define stack_top 1
252: #define stack_top_minus_1 2
253: #define stack_top_plus_1 3
254: #define reg 4
255:
256: /* ...define use_up codes... */
257:
258: #define free $0
259: #define pop_stack $1
260: #define do_nothing 2
261:
262: /* ...definition of operand and result records in global reent seg... */
263:
264: #define frac80 2
265: #define frac64 4
266: #define frac32 8
267: #define msb 11
268: #define sign 12
269: #define tag 14
270: #define expon 16
271:
272: /* ...definition of precision codes... */
273:
274: #define prec24 $0
275: #define prec32 $1
276: #define prec53 $2
277: #define prec64 $3
278: #define prec16 $4
279:
280: /* ...define round control codes... */
281:
282: #define rnd_to_even $0x0000
283: #define rnd_down $0x0004
284: #define rnd_up $0x0008
285: #define rnd_to_zero $0x000c
286:
287: /* ...define positive and negative... */
288:
289: #define positive $0x0000
290: #define POSITIVE 0x0000
291: #define negative $0x00ff
292: #define NEGATIVE 0x00ff
293:
294: /* ...definition of true and false... */
295:
296: #define true $0x00ff
297: #define false $0x0000
298:
299: #define wrap_around_constant $0x6000
300: #define no_change $0x00f0
301: #define exponent_bias 0x3fff
302:
303: #define single_exp_offset $0x3f80
304: #define double_exp_offset $0x3c00
305:
306: #define zero_mask 0x40
307: #define sign_mask 0x01
308: #define a_mask 0x02
309: #define c_mask 0x04
310: #define inexact_mask 0x20
311: #define underflow_mask $0x10
312: #define overflow_mask $0x08
313: #define zero_divide_mask $0x04
314: #define invalid_mask $0x01
315: #define denorm_mask $0x02
316: #define top_mask 0x38
317: #define precision_mask 0x03
318: #define rnd_control_mask 0x0c
319: #define infinity_control_mask $0x10
320: #define high_extended_expon_for_single $0x407e
321: #define low_extended_expon_for_single $0x3f81
322: #define high_extended_expon_for_double $0x43fe
323: #define low_extended_expon_for_double $0x3c01
324: #define high_int16_exponent $0x400e
325: #define max_int16_shift $17
326: #define high_int32_exponent $0x401e
327: #define max_int32_shift $33
328: #define high_int64_exponent $0x403e
329: #define max_int64_shift $65
330: /* the least scale term for which extreme overflow is certain */
331: #define least_sf_xtrm_ovfl $0x0000e03d
332: /* the greatest scale term for which extreme underflow is certain */
333: #define grtst_sf_xtrm_unfl $0xffff2002
334:
335: /* These values set up for referencing the status registers in u_block */
336:
337: // The following structure depicts the Status Register structure
338: // for the 80387 emulator.
339: //
340: // +-----------------------------------------------+
341: // 0 | sr_masks | sr_controls |
342: // +-----------------------------------------------+
343: // 2 | sr_reserved1 |
344: // +-----------------------------------------------+
345: // 4 | sr_errors | sr_flags |
346: // +-----------------------------------------------+
347: // 6 | sr_reserved2 |
348: // +-----------------------------------------------+
349: // 8 | sr_tags |
350: // +-----------------------------------------------+
351: // 10 | sr_reserved3 |
352: // +-----------------------------------------------+
353: // 12 | sr_instr_offset |
354: // + +
355: // 14 | |
356: // +-----------------------------------------------+
357: // 16 | sr_instr_base |
358: // +-----------------------------------------------+
359: // 18 | sr_reserved4 |
360: // +-----------------------------------------------+
361: // 20 | sr_mem_offset |
362: // + +
363: // 22 | |
364: // +-----------------------------------------------+
365: // 24 | sr_mem_base |
366: // +-----------------------------------------------+
367: // 26 | sr_reserved5 |
368: // +-----------------------------------------------+
369: // 28 | sr_regstack |
370: // +-----------------------------------------------+
371: // 30 | |
372: // +-----------------------------------------------+
373: // .
374: //
375: // .
376: //
377: // .
378: // +-----------------------------------------------+
379: // 106 | |
380: // +-----------------------------------------------+
381: //
382: //
383: //
384: //
385: // The status register memory allocation for the emulator is found at
386: // offset u_fpstate into the users u block structure.
387: //
388: //
389: //...define the 80387 status register...
390: //
391: #if 0
392: /* These are now generated automatically - Bob Davies */
393: #define sr_masks 0
394: #define sr_controls 1
395: #define sr_reserved1 2
396: #define sr_errors 4
397: #define sr_flags 5
398: #define sr_reserved2 6
399: #define sr_tags 8
400: #define sr_reserved3 10
401: #define sr_instr_offset 12
402: #define sr_instr_base 16
403: #define sr_reserved4 18
404: #define sr_mem_offset 20
405: #define sr_mem_base 24
406: #define sr_reserved5 26
407: #define sr_regstack 28
408: //
409:
410: #define EIP_offset 14*4 + 220 /* EIP that will be loaded on iret */
411:
412: #endif /* 0 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.