Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / sys / ieee754.h @ 13

History | View | Annotate | Download (6.44 KB)

1
/*        $NetBSD: ieee754.h,v 1.15 2014/02/01 16:39:52 matt Exp $        */
2

    
3
/*
4
 * Copyright (c) 1992, 1993
5
 *        The Regents of the University of California.  All rights reserved.
6
 *
7
 * This software was developed by the Computer Systems Engineering group
8
 * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
9
 * contributed to Berkeley.
10
 *
11
 * All advertising materials mentioning features or use of this software
12
 * must display the following acknowledgement:
13
 *        This product includes software developed by the University of
14
 *        California, Lawrence Berkeley Laboratory.
15
 *
16
 * Redistribution and use in source and binary forms, with or without
17
 * modification, are permitted provided that the following conditions
18
 * are met:
19
 * 1. Redistributions of source code must retain the above copyright
20
 *    notice, this list of conditions and the following disclaimer.
21
 * 2. Redistributions in binary form must reproduce the above copyright
22
 *    notice, this list of conditions and the following disclaimer in the
23
 *    documentation and/or other materials provided with the distribution.
24
 * 3. Neither the name of the University nor the names of its contributors
25
 *    may be used to endorse or promote products derived from this software
26
 *    without specific prior written permission.
27
 *
28
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
29
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
30
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
31
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
32
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
34
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
35
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
36
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
37
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
38
 * SUCH DAMAGE.
39
 *
40
 *        @(#)ieee.h        8.1 (Berkeley) 6/11/93
41
 */
42
#ifndef _SYS_IEEE754_H_
43
#define _SYS_IEEE754_H_
44

    
45
/*
46
 * NOTICE: This is not a standalone file.  To use it, #include it in
47
 * your port's ieee.h header.
48
 */
49

    
50
#include <machine/endian.h>
51

    
52
/*
53
 * <sys/ieee754.h> defines the layout of IEEE 754 floating point types.
54
 * Only single-precision and double-precision types are defined here;
55
 * 128-bit long doubles are define here IFF __HAVE_LONG_DOUBLE equals 128.
56
 * Otherwise extended types, if available, are defined in the machine-dependent
57
 * header.
58
 */
59

    
60
/*
61
 * Define the number of bits in each fraction and exponent.
62
 *
63
 *                     k                 k+1
64
 * Note that  1.0 x 2  == 0.1 x 2      and that denorms are represented
65
 *
66
 *                                          (-exp_bias+1)
67
 * as fractions that look like 0.fffff x 2             .  This means that
68
 *
69
 *                         -126
70
 * the number 0.10000 x 2    , for instance, is the same as the normalized
71
 *
72
 *                -127                           -128
73
 * float 1.0 x 2    .  Thus, to represent 2    , we need one leading zero
74
 *
75
 *                                  -129
76
 * in the fraction; to represent 2    , we need two, and so on.  This
77
 *
78
 *                                                     (-exp_bias-fracbits+1)
79
 * implies that the smallest denormalized number is 2
80
 *
81
 * for whichever format we are talking about: for single precision, for
82
 *
83
 *                                                -126                -149
84
 * instance, we get .00000000000000000000001 x 2    , or 1.0 x 2    , and
85
 *
86
 * -149 == -127 - 23 + 1.
87
 */
88
#define        SNG_EXPBITS        8
89
#define        SNG_FRACBITS        23
90

    
91
struct ieee_single {
92
#if _BYTE_ORDER == _BIG_ENDIAN
93
        u_int        sng_sign:1;
94
        u_int        sng_exp:SNG_EXPBITS;
95
        u_int        sng_frac:SNG_FRACBITS;
96
#else
97
        u_int        sng_frac:SNG_FRACBITS;
98
        u_int        sng_exp:SNG_EXPBITS;
99
        u_int        sng_sign:1;
100
#endif
101
};
102

    
103
#define        DBL_EXPBITS        11
104
#define        DBL_FRACHBITS        20
105
#define        DBL_FRACLBITS        32
106
#define        DBL_FRACBITS        (DBL_FRACHBITS + DBL_FRACLBITS)
107

    
108
struct ieee_double {
109
#if _BYTE_ORDER == _BIG_ENDIAN
110
        u_int        dbl_sign:1;
111
        u_int        dbl_exp:DBL_EXPBITS;
112
        u_int        dbl_frach:DBL_FRACHBITS;
113
        u_int        dbl_fracl:DBL_FRACLBITS;
114
#else
115
        u_int        dbl_fracl:DBL_FRACLBITS;
116
        u_int        dbl_frach:DBL_FRACHBITS;
117
        u_int        dbl_exp:DBL_EXPBITS;
118
        u_int        dbl_sign:1;
119
#endif
120
};
121

    
122
#if __HAVE_LONG_DOUBLE + 0 == 128
123

    
124
#define        EXT_EXPBITS        15
125
#define EXT_FRACHBITS        48
126
#define        EXT_FRACLBITS        64
127
#define        EXT_FRACBITS        (EXT_FRACLBITS + EXT_FRACHBITS)
128

    
129
#define        EXT_TO_ARRAY32(u, a) do {                                \
130
        (a)[0] = (uint32_t)((u).extu_ext.ext_fracl >>  0);        \
131
        (a)[1] = (uint32_t)((u).extu_ext.ext_fracl >> 32);        \
132
        (a)[2] = (uint32_t)((u).extu_ext.ext_frach >>  0);        \
133
        (a)[3] = (uint32_t)((u).extu_ext.ext_frach >> 32);        \
134
} while(/*CONSTCOND*/0)
135

    
136
struct ieee_ext {
137
#if _BYTE_ORDER == _BIG_ENDIAN
138
        uint64_t ext_sign:1;
139
        uint64_t ext_exp:EXT_EXPBITS;
140
        uint64_t ext_frach:EXT_FRACHBITS;
141
        uint64_t ext_fracl;
142
#else
143
        uint64_t ext_fracl;
144
        uint64_t ext_frach:EXT_FRACHBITS;
145
        uint64_t ext_exp:EXT_EXPBITS;
146
        uint64_t ext_sign:1;
147
#endif
148
};
149
#endif /* __HAVE_LONG_DOUBLE == 128 */
150

    
151
/*
152
 * Floats whose exponent is in [1..INFNAN) (of whatever type) are
153
 * `normal'.  Floats whose exponent is INFNAN are either Inf or NaN.
154
 * Floats whose exponent is zero are either zero (iff all fraction
155
 * bits are zero) or subnormal values.
156
 *
157
 * At least one `signalling NaN' and one `quiet NaN' value must be
158
 * implemented.  It is left to the architecture to specify how to
159
 * distinguish between these.
160
 */
161
#define        SNG_EXP_INFNAN        255
162
#define        DBL_EXP_INFNAN        2047
163
#if __HAVE_LONG_DOUBLE + 0 == 128
164
#define        EXT_EXP_INFNAN        0x7fff
165
#endif
166

    
167
/*
168
 * Exponent biases.
169
 */
170
#define        SNG_EXP_BIAS        127
171
#define        DBL_EXP_BIAS        1023
172
#if __HAVE_LONG_DOUBLE + 0 == 128
173
#define        EXT_EXP_BIAS        16383
174
#endif
175

    
176
/*
177
 * Convenience data structures.
178
 */
179
union ieee_single_u {
180
        float                        sngu_f;
181
        struct ieee_single        sngu_sng;
182
};
183

    
184
#define        sngu_sign        sngu_sng.sng_sign
185
#define        sngu_exp        sngu_sng.sng_exp
186
#define        sngu_frac        sngu_sng.sng_frac
187
#define        SNGU_ZEROFRAC_P(u)        ((u).sngu_frac != 0)
188

    
189
union ieee_double_u {
190
        double                        dblu_d;
191
        struct ieee_double        dblu_dbl;
192
};
193

    
194
#define        dblu_sign        dblu_dbl.dbl_sign
195
#define        dblu_exp        dblu_dbl.dbl_exp
196
#define        dblu_frach        dblu_dbl.dbl_frach
197
#define        dblu_fracl        dblu_dbl.dbl_fracl
198
#define        DBLU_ZEROFRAC_P(u)        (((u).dblu_frach|(u).dblu_fracl) != 0)
199

    
200
#if __HAVE_LONG_DOUBLE + 0 == 128
201
union ieee_ext_u {
202
        long double                extu_ld;
203
        struct ieee_ext                extu_ext;
204
};
205

    
206
#define extu_exp        extu_ext.ext_exp
207
#define extu_sign        extu_ext.ext_sign
208
#define extu_fracl        extu_ext.ext_fracl
209
#define extu_frach        extu_ext.ext_frach
210
#define        EXTU_ZEROFRAC_P(u)        (((u).extu_frach|(u).extu_fracl) != 0)
211

    
212
#ifndef LDBL_NBIT
213
#define LDBL_IMPLICIT_NBIT        1        /* our NBIT is implicit */
214
#endif
215

    
216
#endif /* __HAVE_LONG_DOUBLE */
217

    
218
#endif /* _SYS_IEEE754_H_ */