annotate libgcc/soft-fp/single.h @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* Software floating-point emulation.
kono
parents:
diff changeset
2 Definitions for IEEE Single Precision.
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
3 Copyright (C) 1997-2019 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
4 This file is part of the GNU C Library.
kono
parents:
diff changeset
5 Contributed by Richard Henderson (rth@cygnus.com),
kono
parents:
diff changeset
6 Jakub Jelinek (jj@ultra.linux.cz),
kono
parents:
diff changeset
7 David S. Miller (davem@redhat.com) and
kono
parents:
diff changeset
8 Peter Maydell (pmaydell@chiark.greenend.org.uk).
kono
parents:
diff changeset
9
kono
parents:
diff changeset
10 The GNU C Library is free software; you can redistribute it and/or
kono
parents:
diff changeset
11 modify it under the terms of the GNU Lesser General Public
kono
parents:
diff changeset
12 License as published by the Free Software Foundation; either
kono
parents:
diff changeset
13 version 2.1 of the License, or (at your option) any later version.
kono
parents:
diff changeset
14
kono
parents:
diff changeset
15 In addition to the permissions in the GNU Lesser General Public
kono
parents:
diff changeset
16 License, the Free Software Foundation gives you unlimited
kono
parents:
diff changeset
17 permission to link the compiled version of this file into
kono
parents:
diff changeset
18 combinations with other programs, and to distribute those
kono
parents:
diff changeset
19 combinations without any restriction coming from the use of this
kono
parents:
diff changeset
20 file. (The Lesser General Public License restrictions do apply in
kono
parents:
diff changeset
21 other respects; for example, they cover modification of the file,
kono
parents:
diff changeset
22 and distribution when not linked into a combine executable.)
kono
parents:
diff changeset
23
kono
parents:
diff changeset
24 The GNU C Library is distributed in the hope that it will be useful,
kono
parents:
diff changeset
25 but WITHOUT ANY WARRANTY; without even the implied warranty of
kono
parents:
diff changeset
26 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
kono
parents:
diff changeset
27 Lesser General Public License for more details.
kono
parents:
diff changeset
28
kono
parents:
diff changeset
29 You should have received a copy of the GNU Lesser General Public
kono
parents:
diff changeset
30 License along with the GNU C Library; if not, see
kono
parents:
diff changeset
31 <http://www.gnu.org/licenses/>. */
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 #ifndef SOFT_FP_SINGLE_H
kono
parents:
diff changeset
34 #define SOFT_FP_SINGLE_H 1
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 #if _FP_W_TYPE_SIZE < 32
kono
parents:
diff changeset
37 # error "Here's a nickel kid. Go buy yourself a real computer."
kono
parents:
diff changeset
38 #endif
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 #define _FP_FRACTBITS_S _FP_W_TYPE_SIZE
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 #if _FP_W_TYPE_SIZE < 64
kono
parents:
diff changeset
43 # define _FP_FRACTBITS_DW_S (2 * _FP_W_TYPE_SIZE)
kono
parents:
diff changeset
44 #else
kono
parents:
diff changeset
45 # define _FP_FRACTBITS_DW_S _FP_W_TYPE_SIZE
kono
parents:
diff changeset
46 #endif
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 #define _FP_FRACBITS_S 24
kono
parents:
diff changeset
49 #define _FP_FRACXBITS_S (_FP_FRACTBITS_S - _FP_FRACBITS_S)
kono
parents:
diff changeset
50 #define _FP_WFRACBITS_S (_FP_WORKBITS + _FP_FRACBITS_S)
kono
parents:
diff changeset
51 #define _FP_WFRACXBITS_S (_FP_FRACTBITS_S - _FP_WFRACBITS_S)
kono
parents:
diff changeset
52 #define _FP_EXPBITS_S 8
kono
parents:
diff changeset
53 #define _FP_EXPBIAS_S 127
kono
parents:
diff changeset
54 #define _FP_EXPMAX_S 255
kono
parents:
diff changeset
55 #define _FP_QNANBIT_S ((_FP_W_TYPE) 1 << (_FP_FRACBITS_S-2))
kono
parents:
diff changeset
56 #define _FP_QNANBIT_SH_S ((_FP_W_TYPE) 1 << (_FP_FRACBITS_S-2+_FP_WORKBITS))
kono
parents:
diff changeset
57 #define _FP_IMPLBIT_S ((_FP_W_TYPE) 1 << (_FP_FRACBITS_S-1))
kono
parents:
diff changeset
58 #define _FP_IMPLBIT_SH_S ((_FP_W_TYPE) 1 << (_FP_FRACBITS_S-1+_FP_WORKBITS))
kono
parents:
diff changeset
59 #define _FP_OVERFLOW_S ((_FP_W_TYPE) 1 << (_FP_WFRACBITS_S))
kono
parents:
diff changeset
60
kono
parents:
diff changeset
61 #define _FP_WFRACBITS_DW_S (2 * _FP_WFRACBITS_S)
kono
parents:
diff changeset
62 #define _FP_WFRACXBITS_DW_S (_FP_FRACTBITS_DW_S - _FP_WFRACBITS_DW_S)
kono
parents:
diff changeset
63 #define _FP_HIGHBIT_DW_S \
kono
parents:
diff changeset
64 ((_FP_W_TYPE) 1 << (_FP_WFRACBITS_DW_S - 1) % _FP_W_TYPE_SIZE)
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66 /* The implementation of _FP_MUL_MEAT_S and _FP_DIV_MEAT_S should be
kono
parents:
diff changeset
67 chosen by the target machine. */
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 typedef float SFtype __attribute__ ((mode (SF)));
kono
parents:
diff changeset
70
kono
parents:
diff changeset
71 union _FP_UNION_S
kono
parents:
diff changeset
72 {
kono
parents:
diff changeset
73 SFtype flt;
kono
parents:
diff changeset
74 struct _FP_STRUCT_LAYOUT
kono
parents:
diff changeset
75 {
kono
parents:
diff changeset
76 #if __BYTE_ORDER == __BIG_ENDIAN
kono
parents:
diff changeset
77 unsigned sign : 1;
kono
parents:
diff changeset
78 unsigned exp : _FP_EXPBITS_S;
kono
parents:
diff changeset
79 unsigned frac : _FP_FRACBITS_S - (_FP_IMPLBIT_S != 0);
kono
parents:
diff changeset
80 #else
kono
parents:
diff changeset
81 unsigned frac : _FP_FRACBITS_S - (_FP_IMPLBIT_S != 0);
kono
parents:
diff changeset
82 unsigned exp : _FP_EXPBITS_S;
kono
parents:
diff changeset
83 unsigned sign : 1;
kono
parents:
diff changeset
84 #endif
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
85 } bits;
111
kono
parents:
diff changeset
86 };
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 #define FP_DECL_S(X) _FP_DECL (1, X)
kono
parents:
diff changeset
89 #define FP_UNPACK_RAW_S(X, val) _FP_UNPACK_RAW_1 (S, X, (val))
kono
parents:
diff changeset
90 #define FP_UNPACK_RAW_SP(X, val) _FP_UNPACK_RAW_1_P (S, X, (val))
kono
parents:
diff changeset
91 #define FP_PACK_RAW_S(val, X) _FP_PACK_RAW_1 (S, (val), X)
kono
parents:
diff changeset
92 #define FP_PACK_RAW_SP(val, X) \
kono
parents:
diff changeset
93 do \
kono
parents:
diff changeset
94 { \
kono
parents:
diff changeset
95 if (!FP_INHIBIT_RESULTS) \
kono
parents:
diff changeset
96 _FP_PACK_RAW_1_P (S, (val), X); \
kono
parents:
diff changeset
97 } \
kono
parents:
diff changeset
98 while (0)
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 #define FP_UNPACK_S(X, val) \
kono
parents:
diff changeset
101 do \
kono
parents:
diff changeset
102 { \
kono
parents:
diff changeset
103 _FP_UNPACK_RAW_1 (S, X, (val)); \
kono
parents:
diff changeset
104 _FP_UNPACK_CANONICAL (S, 1, X); \
kono
parents:
diff changeset
105 } \
kono
parents:
diff changeset
106 while (0)
kono
parents:
diff changeset
107
kono
parents:
diff changeset
108 #define FP_UNPACK_SP(X, val) \
kono
parents:
diff changeset
109 do \
kono
parents:
diff changeset
110 { \
kono
parents:
diff changeset
111 _FP_UNPACK_RAW_1_P (S, X, (val)); \
kono
parents:
diff changeset
112 _FP_UNPACK_CANONICAL (S, 1, X); \
kono
parents:
diff changeset
113 } \
kono
parents:
diff changeset
114 while (0)
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 #define FP_UNPACK_SEMIRAW_S(X, val) \
kono
parents:
diff changeset
117 do \
kono
parents:
diff changeset
118 { \
kono
parents:
diff changeset
119 _FP_UNPACK_RAW_1 (S, X, (val)); \
kono
parents:
diff changeset
120 _FP_UNPACK_SEMIRAW (S, 1, X); \
kono
parents:
diff changeset
121 } \
kono
parents:
diff changeset
122 while (0)
kono
parents:
diff changeset
123
kono
parents:
diff changeset
124 #define FP_UNPACK_SEMIRAW_SP(X, val) \
kono
parents:
diff changeset
125 do \
kono
parents:
diff changeset
126 { \
kono
parents:
diff changeset
127 _FP_UNPACK_RAW_1_P (S, X, (val)); \
kono
parents:
diff changeset
128 _FP_UNPACK_SEMIRAW (S, 1, X); \
kono
parents:
diff changeset
129 } \
kono
parents:
diff changeset
130 while (0)
kono
parents:
diff changeset
131
kono
parents:
diff changeset
132 #define FP_PACK_S(val, X) \
kono
parents:
diff changeset
133 do \
kono
parents:
diff changeset
134 { \
kono
parents:
diff changeset
135 _FP_PACK_CANONICAL (S, 1, X); \
kono
parents:
diff changeset
136 _FP_PACK_RAW_1 (S, (val), X); \
kono
parents:
diff changeset
137 } \
kono
parents:
diff changeset
138 while (0)
kono
parents:
diff changeset
139
kono
parents:
diff changeset
140 #define FP_PACK_SP(val, X) \
kono
parents:
diff changeset
141 do \
kono
parents:
diff changeset
142 { \
kono
parents:
diff changeset
143 _FP_PACK_CANONICAL (S, 1, X); \
kono
parents:
diff changeset
144 if (!FP_INHIBIT_RESULTS) \
kono
parents:
diff changeset
145 _FP_PACK_RAW_1_P (S, (val), X); \
kono
parents:
diff changeset
146 } \
kono
parents:
diff changeset
147 while (0)
kono
parents:
diff changeset
148
kono
parents:
diff changeset
149 #define FP_PACK_SEMIRAW_S(val, X) \
kono
parents:
diff changeset
150 do \
kono
parents:
diff changeset
151 { \
kono
parents:
diff changeset
152 _FP_PACK_SEMIRAW (S, 1, X); \
kono
parents:
diff changeset
153 _FP_PACK_RAW_1 (S, (val), X); \
kono
parents:
diff changeset
154 } \
kono
parents:
diff changeset
155 while (0)
kono
parents:
diff changeset
156
kono
parents:
diff changeset
157 #define FP_PACK_SEMIRAW_SP(val, X) \
kono
parents:
diff changeset
158 do \
kono
parents:
diff changeset
159 { \
kono
parents:
diff changeset
160 _FP_PACK_SEMIRAW (S, 1, X); \
kono
parents:
diff changeset
161 if (!FP_INHIBIT_RESULTS) \
kono
parents:
diff changeset
162 _FP_PACK_RAW_1_P (S, (val), X); \
kono
parents:
diff changeset
163 } \
kono
parents:
diff changeset
164 while (0)
kono
parents:
diff changeset
165
kono
parents:
diff changeset
166 #define FP_ISSIGNAN_S(X) _FP_ISSIGNAN (S, 1, X)
kono
parents:
diff changeset
167 #define FP_NEG_S(R, X) _FP_NEG (S, 1, R, X)
kono
parents:
diff changeset
168 #define FP_ADD_S(R, X, Y) _FP_ADD (S, 1, R, X, Y)
kono
parents:
diff changeset
169 #define FP_SUB_S(R, X, Y) _FP_SUB (S, 1, R, X, Y)
kono
parents:
diff changeset
170 #define FP_MUL_S(R, X, Y) _FP_MUL (S, 1, R, X, Y)
kono
parents:
diff changeset
171 #define FP_DIV_S(R, X, Y) _FP_DIV (S, 1, R, X, Y)
kono
parents:
diff changeset
172 #define FP_SQRT_S(R, X) _FP_SQRT (S, 1, R, X)
kono
parents:
diff changeset
173 #define _FP_SQRT_MEAT_S(R, S, T, X, Q) _FP_SQRT_MEAT_1 (R, S, T, X, (Q))
kono
parents:
diff changeset
174
kono
parents:
diff changeset
175 #if _FP_W_TYPE_SIZE < 64
kono
parents:
diff changeset
176 # define FP_FMA_S(R, X, Y, Z) _FP_FMA (S, 1, 2, R, X, Y, Z)
kono
parents:
diff changeset
177 #else
kono
parents:
diff changeset
178 # define FP_FMA_S(R, X, Y, Z) _FP_FMA (S, 1, 1, R, X, Y, Z)
kono
parents:
diff changeset
179 #endif
kono
parents:
diff changeset
180
kono
parents:
diff changeset
181 #define FP_CMP_S(r, X, Y, un, ex) _FP_CMP (S, 1, (r), X, Y, (un), (ex))
kono
parents:
diff changeset
182 #define FP_CMP_EQ_S(r, X, Y, ex) _FP_CMP_EQ (S, 1, (r), X, Y, (ex))
kono
parents:
diff changeset
183 #define FP_CMP_UNORD_S(r, X, Y, ex) _FP_CMP_UNORD (S, 1, (r), X, Y, (ex))
kono
parents:
diff changeset
184
kono
parents:
diff changeset
185 #define FP_TO_INT_S(r, X, rsz, rsg) _FP_TO_INT (S, 1, (r), X, (rsz), (rsg))
kono
parents:
diff changeset
186 #define FP_TO_INT_ROUND_S(r, X, rsz, rsg) \
kono
parents:
diff changeset
187 _FP_TO_INT_ROUND (S, 1, (r), X, (rsz), (rsg))
kono
parents:
diff changeset
188 #define FP_FROM_INT_S(X, r, rs, rt) _FP_FROM_INT (S, 1, X, (r), (rs), rt)
kono
parents:
diff changeset
189
kono
parents:
diff changeset
190 #define _FP_FRAC_HIGH_S(X) _FP_FRAC_HIGH_1 (X)
kono
parents:
diff changeset
191 #define _FP_FRAC_HIGH_RAW_S(X) _FP_FRAC_HIGH_1 (X)
kono
parents:
diff changeset
192
kono
parents:
diff changeset
193 #if _FP_W_TYPE_SIZE < 64
kono
parents:
diff changeset
194 # define _FP_FRAC_HIGH_DW_S(X) _FP_FRAC_HIGH_2 (X)
kono
parents:
diff changeset
195 #else
kono
parents:
diff changeset
196 # define _FP_FRAC_HIGH_DW_S(X) _FP_FRAC_HIGH_1 (X)
kono
parents:
diff changeset
197 #endif
kono
parents:
diff changeset
198
kono
parents:
diff changeset
199 #endif /* !SOFT_FP_SINGLE_H */