@@ -83,13 +83,23 @@ uint_t flexfloat_pack_bits(flexfloat_desc_t desc, uint_t bits)
83
83
int_fast16_t exp = (bits >> desc .frac_bits ) & ((0x1 <<desc .exp_bits ) - 1 );
84
84
uint_t frac = bits & ((0x1 <<desc .frac_bits ) - 1 );
85
85
86
- return flexfloat_pack (desc , sign , exp , frac );
86
+ if (exp == 0 && frac == 0 )
87
+ return PACK (sign , 0 , 0 );
88
+ else
89
+ return flexfloat_pack (desc , sign , exp , frac );
90
+ }
91
+
92
+ void flexfloat_set_bits (flexfloat_t * a , uint_t bits )
93
+ {
94
+ CAST_TO_INT (a -> value ) = flexfloat_pack_bits (a -> desc , bits );
87
95
}
88
96
89
97
uint_t flexfloat_get_bits (flexfloat_t * a )
90
98
{
99
+ int_fast16_t exp = flexfloat_exp (a );
100
+ if (exp == INF_EXP ) exp = flexfloat_inf_exp (a -> desc );
91
101
return (flexfloat_sign (a ) << (a -> desc .exp_bits + a -> desc .frac_bits ))
92
- + (flexfloat_exp ( a ) << a -> desc .frac_bits )
102
+ + (exp << a -> desc .frac_bits )
93
103
+ flexfloat_frac (a );
94
104
}
95
105
@@ -192,34 +202,34 @@ void flexfloat_sanitize(flexfloat_t *a)
192
202
193
203
#ifdef FLEXFLOAT_ROUNDING
194
204
// In these cases no rounding is needed
195
- if (exp == INF_EXP || a -> desc .frac_bits == NUM_BITS_FRAC )
196
- goto exit_rounding ;
197
- // Rounding mode
198
- int mode = fegetround ();
199
- if (mode == FE_TONEAREST && flexfloat_nearest_rounding (a , exp ))
205
+ if (!(exp == INF_EXP || a -> desc .frac_bits == NUM_BITS_FRAC ))
200
206
{
201
- int_t rounding_value = flexfloat_rounding_value (a , exp , sign );
202
- a -> value += CAST_TO_FP (rounding_value );
203
- }
204
- else if (mode == FE_UPWARD && flexfloat_inf_rounding (a , exp , sign , 1 ))
205
- {
206
- int_t rounding_value = flexfloat_rounding_value (a , exp , sign );
207
- a -> value += CAST_TO_FP (rounding_value );
208
- }
209
- else if (mode == FE_DOWNWARD && flexfloat_inf_rounding (a , exp , sign , 0 ))
210
- {
211
- int_t rounding_value = flexfloat_rounding_value (a , exp , sign );
212
- a -> value += CAST_TO_FP (rounding_value );
213
- }
214
- //a->value = a->value;
215
- __asm__ __volatile__ ("" ::: "memory" );
207
+ // Rounding mode
208
+ int mode = fegetround ();
209
+ if (mode == FE_TONEAREST && flexfloat_nearest_rounding (a , exp ))
210
+ {
211
+ int_t rounding_value = flexfloat_rounding_value (a , exp , sign );
212
+ a -> value += CAST_TO_FP (rounding_value );
213
+ }
214
+ else if (mode == FE_UPWARD && flexfloat_inf_rounding (a , exp , sign , 1 ))
215
+ {
216
+ int_t rounding_value = flexfloat_rounding_value (a , exp , sign );
217
+ a -> value += CAST_TO_FP (rounding_value );
218
+ }
219
+ else if (mode == FE_DOWNWARD && flexfloat_inf_rounding (a , exp , sign , 0 ))
220
+ {
221
+ int_t rounding_value = flexfloat_rounding_value (a , exp , sign );
222
+ a -> value += CAST_TO_FP (rounding_value );
223
+ }
224
+ //a->value = a->value;
225
+ __asm__ __volatile__ ("" ::: "memory" );
216
226
217
- // Recompute exponent value after rounding
218
- exp = flexfloat_exp (a );
227
+ // Recompute exponent value after rounding
228
+ exp = flexfloat_exp (a );
229
+ }
219
230
#endif
220
231
221
232
// Mantissa
222
- exit_rounding :
223
233
frac = flexfloat_frac (a );
224
234
225
235
if (EXPONENT (CAST_TO_INT (a -> value )) == 0 ) // Denorm backend format
0 commit comments