This source file includes following definitions.
- extractFloat32Sign
- float32_eq_nocheck
- float32_lt_nocheck
- extractFloat64Sign
- float64_eq_nocheck
- float64_lt_nocheck
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 #ifndef __SOFTFLOAT_H__
33 #define __SOFTFLOAT_H__
34
35
36
37
38
39
40
41
42
43
44 #ifdef CONFIG_FPE_NWFPE_XP
45 #define FLOATX80
46 #endif
47
48
49
50
51
52
53 typedef u32 float32;
54 typedef u64 float64;
55 typedef struct {
56 #ifdef __ARMEB__
57 u16 __padding;
58 u16 high;
59 #else
60 u16 high;
61 u16 __padding;
62 #endif
63 u64 low;
64 } __attribute__ ((packed,aligned(4))) floatx80;
65
66
67
68
69
70
71 extern signed char float_detect_tininess;
72 enum {
73 float_tininess_after_rounding = 0,
74 float_tininess_before_rounding = 1
75 };
76
77
78
79
80
81
82
83 enum {
84 float_round_nearest_even = 0,
85 float_round_to_zero = 1,
86 float_round_down = 2,
87 float_round_up = 3
88 };
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106 enum {
107 float_flag_invalid = 1,
108 float_flag_divbyzero = 2,
109 float_flag_overflow = 4,
110 float_flag_underflow = 8,
111 float_flag_inexact = 16
112 };
113
114
115
116
117
118
119
120 void float_raise( signed char );
121
122
123
124
125
126
127 float32 int32_to_float32( struct roundingData *, signed int );
128 float64 int32_to_float64( signed int );
129 #ifdef FLOATX80
130 floatx80 int32_to_floatx80( signed int );
131 #endif
132
133
134
135
136
137
138 signed int float32_to_int32( struct roundingData *, float32 );
139 signed int float32_to_int32_round_to_zero( float32 );
140 float64 float32_to_float64( float32 );
141 #ifdef FLOATX80
142 floatx80 float32_to_floatx80( float32 );
143 #endif
144
145
146
147
148
149
150 float32 float32_round_to_int( struct roundingData*, float32 );
151 float32 float32_add( struct roundingData *, float32, float32 );
152 float32 float32_sub( struct roundingData *, float32, float32 );
153 float32 float32_mul( struct roundingData *, float32, float32 );
154 float32 float32_div( struct roundingData *, float32, float32 );
155 float32 float32_rem( struct roundingData *, float32, float32 );
156 float32 float32_sqrt( struct roundingData*, float32 );
157 char float32_eq( float32, float32 );
158 char float32_le( float32, float32 );
159 char float32_lt( float32, float32 );
160 char float32_eq_signaling( float32, float32 );
161 char float32_le_quiet( float32, float32 );
162 char float32_lt_quiet( float32, float32 );
163 char float32_is_signaling_nan( float32 );
164
165
166
167
168
169
170 signed int float64_to_int32( struct roundingData *, float64 );
171 signed int float64_to_int32_round_to_zero( float64 );
172 float32 float64_to_float32( struct roundingData *, float64 );
173 #ifdef FLOATX80
174 floatx80 float64_to_floatx80( float64 );
175 #endif
176
177
178
179
180
181
182 float64 float64_round_to_int( struct roundingData *, float64 );
183 float64 float64_add( struct roundingData *, float64, float64 );
184 float64 float64_sub( struct roundingData *, float64, float64 );
185 float64 float64_mul( struct roundingData *, float64, float64 );
186 float64 float64_div( struct roundingData *, float64, float64 );
187 float64 float64_rem( struct roundingData *, float64, float64 );
188 float64 float64_sqrt( struct roundingData *, float64 );
189 char float64_eq( float64, float64 );
190 char float64_le( float64, float64 );
191 char float64_lt( float64, float64 );
192 char float64_eq_signaling( float64, float64 );
193 char float64_le_quiet( float64, float64 );
194 char float64_lt_quiet( float64, float64 );
195 char float64_is_signaling_nan( float64 );
196
197 #ifdef FLOATX80
198
199
200
201
202
203
204 signed int floatx80_to_int32( struct roundingData *, floatx80 );
205 signed int floatx80_to_int32_round_to_zero( floatx80 );
206 float32 floatx80_to_float32( struct roundingData *, floatx80 );
207 float64 floatx80_to_float64( struct roundingData *, floatx80 );
208
209
210
211
212
213
214 floatx80 floatx80_round_to_int( struct roundingData *, floatx80 );
215 floatx80 floatx80_add( struct roundingData *, floatx80, floatx80 );
216 floatx80 floatx80_sub( struct roundingData *, floatx80, floatx80 );
217 floatx80 floatx80_mul( struct roundingData *, floatx80, floatx80 );
218 floatx80 floatx80_div( struct roundingData *, floatx80, floatx80 );
219 floatx80 floatx80_rem( struct roundingData *, floatx80, floatx80 );
220 floatx80 floatx80_sqrt( struct roundingData *, floatx80 );
221 char floatx80_eq( floatx80, floatx80 );
222 char floatx80_le( floatx80, floatx80 );
223 char floatx80_lt( floatx80, floatx80 );
224 char floatx80_eq_signaling( floatx80, floatx80 );
225 char floatx80_le_quiet( floatx80, floatx80 );
226 char floatx80_lt_quiet( floatx80, floatx80 );
227 char floatx80_is_signaling_nan( floatx80 );
228
229 extern flag floatx80_is_nan(floatx80);
230
231 #endif
232
233 static inline flag extractFloat32Sign(float32 a)
234 {
235 return a >> 31;
236 }
237
238 static inline flag float32_eq_nocheck(float32 a, float32 b)
239 {
240 return (a == b) || ((bits32) ((a | b) << 1) == 0);
241 }
242
243 static inline flag float32_lt_nocheck(float32 a, float32 b)
244 {
245 flag aSign, bSign;
246
247 aSign = extractFloat32Sign(a);
248 bSign = extractFloat32Sign(b);
249 if (aSign != bSign)
250 return aSign && ((bits32) ((a | b) << 1) != 0);
251 return (a != b) && (aSign ^ (a < b));
252 }
253
254 static inline flag extractFloat64Sign(float64 a)
255 {
256 return a >> 63;
257 }
258
259 static inline flag float64_eq_nocheck(float64 a, float64 b)
260 {
261 return (a == b) || ((bits64) ((a | b) << 1) == 0);
262 }
263
264 static inline flag float64_lt_nocheck(float64 a, float64 b)
265 {
266 flag aSign, bSign;
267
268 aSign = extractFloat64Sign(a);
269 bSign = extractFloat64Sign(b);
270 if (aSign != bSign)
271 return aSign && ((bits64) ((a | b) << 1) != 0);
272 return (a != b) && (aSign ^ (a < b));
273 }
274
275 extern flag float32_is_nan( float32 a );
276 extern flag float64_is_nan( float64 a );
277
278 extern int32 float64_to_uint32( struct roundingData *roundData, float64 a );
279 extern int32 float64_to_uint32_round_to_zero( float64 a );
280
281 #endif