8000 Added flexfloat_set_bits() function and fix for flexfloat_get_bits() · srcarroll/flexfloat@28be2d4 · GitHub
[go: up one dir, main page]

Skip to content

Commit 28be2d4

Browse files
committed
Added flexfloat_set_bits() function and fix for flexfloat_get_bits()
1 parent 2ef8758 commit 28be2d4

File tree

2 files changed

+36
-25
lines changed

2 files changed

+36
-25
lines changed

include/flexfloat.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ void flexfloat_sanitize(flexfloat_t *a);
166166
// Bit-level access
167167

168168
uint_t flexfloat_pack_bits(flexfloat_desc_t desc, uint_t bits);
169+
void flexfloat_set_bits(flexfloat_t *a, uint_t bits);
169170
uint_t flexfloat_get_bits(flexfloat_t *a);
170171

171172

src/flexfloat.c

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -83,13 +83,23 @@ uint_t flexfloat_pack_bits(flexfloat_desc_t desc, uint_t bits)
8383
int_fast16_t exp = (bits >> desc.frac_bits) & ((0x1<<desc.exp_bits) - 1);
8484
uint_t frac = bits & ((0x1<<desc.frac_bits) - 1);
8585

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);
8795
}
8896

8997
uint_t flexfloat_get_bits(flexfloat_t *a)
9098
{
99+
int_fast16_t exp = flexfloat_exp(a);
100+
if(exp == INF_EXP) exp = flexfloat_inf_exp(a->desc);
91101
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)
93103
+ flexfloat_frac(a);
94104
}
95105

@@ -192,34 +202,34 @@ void flexfloat_sanitize(flexfloat_t *a)
192202

193203
#ifdef FLEXFLOAT_ROUNDING
194204
// 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))
200206
{
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");
216226

217-
// Recompute exponent value after rounding
218-
exp = flexfloat_exp(a);
227+
// Recompute exponent value after rounding
228+
exp = flexfloat_exp(a);
229+
}
219230
#endif
220231

221232
// Mantissa
222-
exit_rounding:
223233
frac = flexfloat_frac(a);
224234

225235
if(EXPONENT(CAST_TO_INT(a->value)) == 0) // Denorm backend format

0 commit comments

Comments
 (0)
0