1/*
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23/*
24 * Copyright (c) 1992 NeXT Computer, Inc.
25 *
26 * Intel386 Family:	Floating Point unit.
27 *
28 * HISTORY
29 *
30 * 5 October 1992 David E. Bohman at NeXT
31 *	Added names to previously unamed fields in the mantissa.
32 *
33 * 5 April 1992 David E. Bohman at NeXT
34 *	Created.
35 */
36
37/*
38 * Data register.
39 */
40
41typedef struct fp_data_reg {
42    unsigned short		mant;
43    unsigned short		mant1	:16,
44				mant2	:16,
45				mant3	:16;
46    unsigned short		exp	:15,
47			    	sign	:1;
48} fp_data_reg_t;
49
50/*
51 * Data register stack.
52 */
53
54typedef struct fp_stack {
55    fp_data_reg_t		ST[8];
56} fp_stack_t;
57
58/*
59 * Register stack tag word.
60 */
61
62typedef struct fp_tag {
63    unsigned short		tag0	:2,
64    				tag1	:2,
65				tag2	:2,
66				tag3	:2,
67    				tag4	:2,
68				tag5	:2,
69				tag6	:2,
70				tag7	:2;
71#define FP_TAG_VALID		0
72#define FP_TAG_ZERO		1
73#define FP_TAG_SPEC		2
74#define FP_TAG_EMPTY		3
75} fp_tag_t;
76
77/*
78 * Status word.
79 */
80
81typedef struct fp_status {
82    unsigned short		invalid	:1,
83    				denorm	:1,
84				zdiv	:1,
85				ovrfl	:1,
86				undfl	:1,
87				precis	:1,
88				stkflt	:1,
89				errsumm	:1,
90				c0	:1,
91				c1	:1,
92				c2	:1,
93				tos	:3,
94				c3	:1,
95				busy	:1;
96} fp_status_t;
97
98/*
99 * Control word.
100 */
101
102typedef struct fp_control {
103    unsigned short		invalid	:1,
104    				denorm	:1,
105				zdiv	:1,
106				ovrfl	:1,
107				undfl	:1,
108				precis	:1,
109					:2,
110				pc	:2,
111#define FP_PREC_24B		0
112#define	FP_PREC_53B		2
113#define FP_PREC_64B		3
114				rc	:2,
115#define FP_RND_NEAR		0
116#define FP_RND_DOWN		1
117#define FP_RND_UP		2
118#define FP_CHOP			3
119				/*inf*/	:1,
120					:3;
121} fp_control_t;
122
123#import <architecture/i386/sel.h>
124
125/*
126 * Floating point 'environment'
127 * used by FSTENV/FLDENV instructions.
128 */
129
130typedef struct fp_env {
131    fp_control_t		control;
132    unsigned short			:16;
133    fp_status_t			status;
134    unsigned short			:16;
135    fp_tag_t			tag;
136    unsigned short			:16;
137    unsigned int		ip;
138    sel_t			cs;
139    unsigned short		opcode;
140    unsigned int		dp;
141    sel_t			ds;
142    unsigned short			:16;
143} fp_env_t;
144
145/*
146 * Floating point state
147 * used by FSAVE/FRSTOR instructions.
148 */
149
150typedef struct fp_state {
151    fp_env_t			environ;
152    fp_stack_t			stack;
153} fp_state_t;
154