source: branches/libc-0.6/src/emx/include/386/npx.h

Last change on this file was 2013, checked in by bird, 20 years ago

o The smallcnv stuff is gone, waste of space since we're not really into

static linking. Should've done this when switching to gdtoa.

o Ported the msun and some other math bits from current FreeBSD libc.

This mostly replaces the EMX math, except for some double long variants
and some EMX specific ones. This is a risky change, but it's needed
if we're gonna catch up on the C99 bits and make libstdc++ happy.
There are some new headers, complex.h and fenv.h being the importan ones.
float.h have gotten some updates while math.h is totally replaced.
More than 100 standard functions were added!
NOTE: msun is using MATH_ERREXCEPT (math_errhandling) and not

MATH_ERRNO for error reporting.

I really hope this is not gonna uncover more OS/2 387 mess.

  • Property cvs2svn:cvs-rev set to 1.1
  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 5.4 KB
Line 
1/*-
2 * Copyright (c) 1990 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * William Jolitz.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgement:
18 * This product includes software developed by the University of
19 * California, Berkeley and its contributors.
20 * 4. Neither the name of the University nor the names of its contributors
21 * may be used to endorse or promote products derived from this software
22 * without specific prior written permission.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
35 *
36 * from: @(#)npx.h 5.3 (Berkeley) 1/18/91
37 * $FreeBSD: src/sys/i386/include/npx.h,v 1.26 2002/09/23 05:55:10 peter Exp $
38 */
39
40/*
41 * 287/387 NPX Coprocessor Data Structures and Constants
42 * W. Jolitz 1/90
43 */
44
45/** @file
46 * FreeBSD 5.1
47 */
48
49#ifndef _MACHINE_NPX_H_
50#define _MACHINE_NPX_H_
51
52/* Environment information of floating point unit */
53struct env87 {
54 long en_cw; /* control word (16bits) */
55 long en_sw; /* status word (16bits) */
56 long en_tw; /* tag word (16bits) */
57 long en_fip; /* floating point instruction pointer */
58 u_short en_fcs; /* floating code segment selector */
59 u_short en_opcode; /* opcode last executed (11 bits ) */
60 long en_foo; /* floating operand offset */
61 long en_fos; /* floating operand segment selector */
62};
63
64/* Contents of each floating point accumulator */
65struct fpacc87 {
66#ifdef dontdef /* too unportable */
67 u_long fp_mantlo; /* mantissa low (31:0) */
68 u_long fp_manthi; /* mantissa high (63:32) */
69 int fp_exp:15; /* exponent */
70 int fp_sgn:1; /* mantissa sign */
71#else
72 u_char fp_bytes[10];
73#endif
74};
75
76/* Floating point context */
77struct save87 {
78 struct env87 sv_env; /* floating point control/status */
79 struct fpacc87 sv_ac[8]; /* accumulator contents, 0-7 */
80 u_char sv_pad0[4]; /* padding for (now unused) saved status word */
81 /*
82 * Bogus padding for emulators. Emulators should use their own
83 * struct and arrange to store into this struct (ending here)
84 * before it is inspected for ptracing or for core dumps. Some
85 * emulators overwrite the whole struct. We have no good way of
86 * knowing how much padding to leave. Leave just enough for the
87 * GPL emulator's i387_union (176 bytes total).
88 */
89 u_char sv_pad[64]; /* padding; used by emulators */
90};
91
92struct envxmm {
93 u_int16_t en_cw; /* control word (16bits) */
94 u_int16_t en_sw; /* status word (16bits) */
95 u_int16_t en_tw; /* tag word (16bits) */
96 u_int16_t en_opcode; /* opcode last executed (11 bits ) */
97 u_int32_t en_fip; /* floating point instruction pointer */
98 u_int16_t en_fcs; /* floating code segment selector */
99 u_int16_t en_pad0; /* padding */
100 u_int32_t en_foo; /* floating operand offset */
101 u_int16_t en_fos; /* floating operand segment selector */
102 u_int16_t en_pad1; /* padding */
103 u_int32_t en_mxcsr; /* SSE sontorol/status register */
104 u_int32_t en_pad2; /* padding */
105};
106
107/* Contents of each SSE extended accumulator */
108struct xmmacc {
109 u_char xmm_bytes[16];
110};
111
112struct savexmm {
113 struct envxmm sv_env;
114 struct {
115 struct fpacc87 fp_acc;
116 u_char fp_pad[6]; /* padding */
117 } sv_fp[8];
118 struct xmmacc sv_xmm[8];
119 u_char sv_pad[224];
120} __aligned(16);
121
122union savefpu {
123 struct save87 sv_87;
124 struct savexmm sv_xmm;
125};
126
127/*
128 * The hardware default control word for i387's and later coprocessors is
129 * 0x37F, giving:
130 *
131 * round to nearest
132 * 64-bit precision
133 * all exceptions masked.
134 *
135 * We modify the affine mode bit and precision bits in this to give:
136 *
137 * affine mode for 287's (if they work at all) (1 in bitfield 1<<12)
138 * 53-bit precision (2 in bitfield 3<<8)
139 *
140 * 64-bit precision often gives bad results with high level languages
141 * because it makes the results of calculations depend on whether
142 * intermediate values are stored in memory or in FPU registers.
143 */
144#define __INITIAL_NPXCW__ 0x127F
145
146#ifdef _KERNEL
147int npxdna(void);
148void npxdrop(void);
149void npxexit(struct thread *td);
150int npxformat(void);
151int npxgetregs(struct thread *td, union savefpu *addr);
152void npxinit(u_short control);
153void npxsave(union savefpu *addr);
154void npxsetregs(struct thread *td, union savefpu *addr);
155int npxtrap(void);
156#endif
157
158#endif /* !_MACHINE_NPX_H_ */
Note: See TracBrowser for help on using the repository browser.