Initial revision
[libfirm] / ir / tv / ieee754.h
1 /* IEEE754 fp format.
2    Copyright (C) 1995, 1996 Christian von Roques */
3
4 /* This file was derived from the GNU C Library's ieee754.h which
5    carried the following copyright notice:
6
7 Copyright (C) 1992 Free Software Foundation, Inc.
8
9 The GNU C Library is free software; you can redistribute it and/or
10 modify it under the terms of the GNU Library General Public License as
11 published by the Free Software Foundation; either version 2 of the
12 License, or (at your option) any later version.
13
14 The GNU C Library is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17 Library General Public License for more details.
18
19 You should have received a copy of the GNU Library General Public
20 License along with the GNU C Library; see the file COPYING.LIB.  If
21 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
22 Cambridge, MA 02139, USA.  */
23
24 /* @@@ This is completely non-portable!  ISO/IEC DIS 9899, section
25    3.5.2.1: An implementation may allocate any addressable storage
26    unit large enough to hold a bit-field.  If enough space remains, a
27    bit-field that immediately follows another bit-field in a structure
28    shall be packed into adjacent bits of the same unit.  If
29    insufficient space remains, whether a bit-field that does not fit
30    is put into the next unit or overlaps adjacent units is
31    implementation-defined.  The order of allocation of bit-fields
32    within a unit (high-order to low-order or low-order to high-order)
33    is implementation-defined.  */
34
35 #ifndef _IEEE754_H
36 #define _IEEE754_H
37
38 #ifdef HAVE_CONFIG_H
39 # include <config.h>
40 #endif
41
42
43 union ieee754_double
44   {
45     double d;
46
47     /* This is the IEEE 754 double-precision format.  */
48     struct
49       {
50 #ifdef WORDS_BIGENDIAN
51         unsigned int negative:1;
52         unsigned int exponent:11;
53         unsigned int mantissa0:20;
54         unsigned int mantissa1:32;
55 #else
56         unsigned int mantissa1:32;
57         unsigned int mantissa0:20;
58         unsigned int exponent:11;
59         unsigned int negative:1;
60 #endif
61       } ieee;
62     struct
63       {
64 #ifdef WORDS_BIGENDIAN
65         unsigned int negative:1;
66         unsigned int exponent:11;
67         unsigned int quiet_nan:1;
68         unsigned int mantissa0:19;
69         unsigned int mantissa1:32;
70 #else
71         unsigned int mantissa1:32;
72         unsigned int mantissa0:19;
73         unsigned int quiet_nan:1;
74         unsigned int exponent:11;
75         unsigned int negative:1;
76 #endif
77       } ieee_nan;
78   };
79
80 /* bias added to exponent of ieee754_double */
81 #define _IEEE754_DOUBLE_BIAS 0x3ff
82
83
84 union ieee754_float
85   {
86     float f;
87
88     /* This is the ieee754 single-precision format.  */
89     struct
90       {
91 #ifdef WORDS_BIGENDIAN
92         unsigned int negative:1;
93         unsigned int exponent:8;
94         unsigned int mantissa:23;
95 #else
96         unsigned int mantissa:23;
97         unsigned int exponent:8;
98         unsigned int negative:1;
99 #endif
100       } ieee;
101     /* This is for extracting information about NaNs.  */
102     struct
103       {
104 #ifdef WORDS_BIGENDIAN
105         unsigned int negative:1;
106         unsigned int exponent:8;
107         unsigned int quiet_nan:1;
108         unsigned int mantissa:22;
109 #else
110         unsigned int mantissa:22;
111         unsigned int quiet_nan:1;
112         unsigned int exponent:8;
113         unsigned int negative:1;
114 #endif
115       } ieee_nan;
116   };
117
118 /* bias added to exponent of ieee_float */
119 #define _IEEE754_FLOAT_BIAS 0x7f
120
121 #endif  /* _IEEE754_H */