softfloat: Add scaling float-to-int routines
Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20180814002653.12828-3-richard.henderson@linaro.org Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
2abdfe2440
commit
2f6c74be59
391
fpu/softfloat.c
391
fpu/softfloat.c
@ -1293,19 +1293,23 @@ float32 float64_to_float32(float64 a, float_status *s)
|
|||||||
* Arithmetic.
|
* Arithmetic.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static FloatParts round_to_int(FloatParts a, int rounding_mode, float_status *s)
|
static FloatParts round_to_int(FloatParts a, int rmode,
|
||||||
|
int scale, float_status *s)
|
||||||
{
|
{
|
||||||
if (is_nan(a.cls)) {
|
|
||||||
return return_nan(a, s);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (a.cls) {
|
switch (a.cls) {
|
||||||
|
case float_class_qnan:
|
||||||
|
case float_class_snan:
|
||||||
|
return return_nan(a, s);
|
||||||
|
|
||||||
case float_class_zero:
|
case float_class_zero:
|
||||||
case float_class_inf:
|
case float_class_inf:
|
||||||
case float_class_qnan:
|
|
||||||
/* already "integral" */
|
/* already "integral" */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case float_class_normal:
|
case float_class_normal:
|
||||||
|
scale = MIN(MAX(scale, -0x10000), 0x10000);
|
||||||
|
a.exp += scale;
|
||||||
|
|
||||||
if (a.exp >= DECOMPOSED_BINARY_POINT) {
|
if (a.exp >= DECOMPOSED_BINARY_POINT) {
|
||||||
/* already integral */
|
/* already integral */
|
||||||
break;
|
break;
|
||||||
@ -1314,7 +1318,7 @@ static FloatParts round_to_int(FloatParts a, int rounding_mode, float_status *s)
|
|||||||
bool one;
|
bool one;
|
||||||
/* all fractional */
|
/* all fractional */
|
||||||
s->float_exception_flags |= float_flag_inexact;
|
s->float_exception_flags |= float_flag_inexact;
|
||||||
switch (rounding_mode) {
|
switch (rmode) {
|
||||||
case float_round_nearest_even:
|
case float_round_nearest_even:
|
||||||
one = a.exp == -1 && a.frac > DECOMPOSED_IMPLICIT_BIT;
|
one = a.exp == -1 && a.frac > DECOMPOSED_IMPLICIT_BIT;
|
||||||
break;
|
break;
|
||||||
@ -1347,7 +1351,7 @@ static FloatParts round_to_int(FloatParts a, int rounding_mode, float_status *s)
|
|||||||
uint64_t rnd_mask = rnd_even_mask >> 1;
|
uint64_t rnd_mask = rnd_even_mask >> 1;
|
||||||
uint64_t inc;
|
uint64_t inc;
|
||||||
|
|
||||||
switch (rounding_mode) {
|
switch (rmode) {
|
||||||
case float_round_nearest_even:
|
case float_round_nearest_even:
|
||||||
inc = ((a.frac & rnd_even_mask) != frac_lsbm1 ? frac_lsbm1 : 0);
|
inc = ((a.frac & rnd_even_mask) != frac_lsbm1 ? frac_lsbm1 : 0);
|
||||||
break;
|
break;
|
||||||
@ -1387,28 +1391,28 @@ static FloatParts round_to_int(FloatParts a, int rounding_mode, float_status *s)
|
|||||||
float16 float16_round_to_int(float16 a, float_status *s)
|
float16 float16_round_to_int(float16 a, float_status *s)
|
||||||
{
|
{
|
||||||
FloatParts pa = float16_unpack_canonical(a, s);
|
FloatParts pa = float16_unpack_canonical(a, s);
|
||||||
FloatParts pr = round_to_int(pa, s->float_rounding_mode, s);
|
FloatParts pr = round_to_int(pa, s->float_rounding_mode, 0, s);
|
||||||
return float16_round_pack_canonical(pr, s);
|
return float16_round_pack_canonical(pr, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
float32 float32_round_to_int(float32 a, float_status *s)
|
float32 float32_round_to_int(float32 a, float_status *s)
|
||||||
{
|
{
|
||||||
FloatParts pa = float32_unpack_canonical(a, s);
|
FloatParts pa = float32_unpack_canonical(a, s);
|
||||||
FloatParts pr = round_to_int(pa, s->float_rounding_mode, s);
|
FloatParts pr = round_to_int(pa, s->float_rounding_mode, 0, s);
|
||||||
return float32_round_pack_canonical(pr, s);
|
return float32_round_pack_canonical(pr, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
float64 float64_round_to_int(float64 a, float_status *s)
|
float64 float64_round_to_int(float64 a, float_status *s)
|
||||||
{
|
{
|
||||||
FloatParts pa = float64_unpack_canonical(a, s);
|
FloatParts pa = float64_unpack_canonical(a, s);
|
||||||
FloatParts pr = round_to_int(pa, s->float_rounding_mode, s);
|
FloatParts pr = round_to_int(pa, s->float_rounding_mode, 0, s);
|
||||||
return float64_round_pack_canonical(pr, s);
|
return float64_round_pack_canonical(pr, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
float64 float64_trunc_to_int(float64 a, float_status *s)
|
float64 float64_trunc_to_int(float64 a, float_status *s)
|
||||||
{
|
{
|
||||||
FloatParts pa = float64_unpack_canonical(a, s);
|
FloatParts pa = float64_unpack_canonical(a, s);
|
||||||
FloatParts pr = round_to_int(pa, float_round_to_zero, s);
|
FloatParts pr = round_to_int(pa, float_round_to_zero, 0, s);
|
||||||
return float64_round_pack_canonical(pr, s);
|
return float64_round_pack_canonical(pr, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1423,13 +1427,13 @@ float64 float64_trunc_to_int(float64 a, float_status *s)
|
|||||||
* is returned.
|
* is returned.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int64_t round_to_int_and_pack(FloatParts in, int rmode,
|
static int64_t round_to_int_and_pack(FloatParts in, int rmode, int scale,
|
||||||
int64_t min, int64_t max,
|
int64_t min, int64_t max,
|
||||||
float_status *s)
|
float_status *s)
|
||||||
{
|
{
|
||||||
uint64_t r;
|
uint64_t r;
|
||||||
int orig_flags = get_float_exception_flags(s);
|
int orig_flags = get_float_exception_flags(s);
|
||||||
FloatParts p = round_to_int(in, rmode, s);
|
FloatParts p = round_to_int(in, rmode, scale, s);
|
||||||
|
|
||||||
switch (p.cls) {
|
switch (p.cls) {
|
||||||
case float_class_snan:
|
case float_class_snan:
|
||||||
@ -1469,38 +1473,158 @@ static int64_t round_to_int_and_pack(FloatParts in, int rmode,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define FLOAT_TO_INT(fsz, isz) \
|
int16_t float16_to_int16_scalbn(float16 a, int rmode, int scale,
|
||||||
int ## isz ## _t float ## fsz ## _to_int ## isz(float ## fsz a, \
|
float_status *s)
|
||||||
float_status *s) \
|
{
|
||||||
{ \
|
return round_to_int_and_pack(float16_unpack_canonical(a, s),
|
||||||
FloatParts p = float ## fsz ## _unpack_canonical(a, s); \
|
rmode, scale, INT16_MIN, INT16_MAX, s);
|
||||||
return round_to_int_and_pack(p, s->float_rounding_mode, \
|
|
||||||
INT ## isz ## _MIN, INT ## isz ## _MAX,\
|
|
||||||
s); \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
int ## isz ## _t float ## fsz ## _to_int ## isz ## _round_to_zero \
|
|
||||||
(float ## fsz a, float_status *s) \
|
|
||||||
{ \
|
|
||||||
FloatParts p = float ## fsz ## _unpack_canonical(a, s); \
|
|
||||||
return round_to_int_and_pack(p, float_round_to_zero, \
|
|
||||||
INT ## isz ## _MIN, INT ## isz ## _MAX,\
|
|
||||||
s); \
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FLOAT_TO_INT(16, 16)
|
int32_t float16_to_int32_scalbn(float16 a, int rmode, int scale,
|
||||||
FLOAT_TO_INT(16, 32)
|
float_status *s)
|
||||||
FLOAT_TO_INT(16, 64)
|
{
|
||||||
|
return round_to_int_and_pack(float16_unpack_canonical(a, s),
|
||||||
|
rmode, scale, INT32_MIN, INT32_MAX, s);
|
||||||
|
}
|
||||||
|
|
||||||
FLOAT_TO_INT(32, 16)
|
int64_t float16_to_int64_scalbn(float16 a, int rmode, int scale,
|
||||||
FLOAT_TO_INT(32, 32)
|
float_status *s)
|
||||||
FLOAT_TO_INT(32, 64)
|
{
|
||||||
|
return round_to_int_and_pack(float16_unpack_canonical(a, s),
|
||||||
|
rmode, scale, INT64_MIN, INT64_MAX, s);
|
||||||
|
}
|
||||||
|
|
||||||
FLOAT_TO_INT(64, 16)
|
int16_t float32_to_int16_scalbn(float32 a, int rmode, int scale,
|
||||||
FLOAT_TO_INT(64, 32)
|
float_status *s)
|
||||||
FLOAT_TO_INT(64, 64)
|
{
|
||||||
|
return round_to_int_and_pack(float32_unpack_canonical(a, s),
|
||||||
|
rmode, scale, INT16_MIN, INT16_MAX, s);
|
||||||
|
}
|
||||||
|
|
||||||
#undef FLOAT_TO_INT
|
int32_t float32_to_int32_scalbn(float32 a, int rmode, int scale,
|
||||||
|
float_status *s)
|
||||||
|
{
|
||||||
|
return round_to_int_and_pack(float32_unpack_canonical(a, s),
|
||||||
|
rmode, scale, INT32_MIN, INT32_MAX, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t float32_to_int64_scalbn(float32 a, int rmode, int scale,
|
||||||
|
float_status *s)
|
||||||
|
{
|
||||||
|
return round_to_int_and_pack(float32_unpack_canonical(a, s),
|
||||||
|
rmode, scale, INT64_MIN, INT64_MAX, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t float64_to_int16_scalbn(float64 a, int rmode, int scale,
|
||||||
|
float_status *s)
|
||||||
|
{
|
||||||
|
return round_to_int_and_pack(float64_unpack_canonical(a, s),
|
||||||
|
rmode, scale, INT16_MIN, INT16_MAX, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t float64_to_int32_scalbn(float64 a, int rmode, int scale,
|
||||||
|
float_status *s)
|
||||||
|
{
|
||||||
|
return round_to_int_and_pack(float64_unpack_canonical(a, s),
|
||||||
|
rmode, scale, INT32_MIN, INT32_MAX, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t float64_to_int64_scalbn(float64 a, int rmode, int scale,
|
||||||
|
float_status *s)
|
||||||
|
{
|
||||||
|
return round_to_int_and_pack(float64_unpack_canonical(a, s),
|
||||||
|
rmode, scale, INT64_MIN, INT64_MAX, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t float16_to_int16(float16 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float16_to_int16_scalbn(a, s->float_rounding_mode, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t float16_to_int32(float16 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float16_to_int32_scalbn(a, s->float_rounding_mode, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t float16_to_int64(float16 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float16_to_int64_scalbn(a, s->float_rounding_mode, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t float32_to_int16(float32 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float32_to_int16_scalbn(a, s->float_rounding_mode, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t float32_to_int32(float32 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float32_to_int32_scalbn(a, s->float_rounding_mode, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t float32_to_int64(float32 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float32_to_int64_scalbn(a, s->float_rounding_mode, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t float64_to_int16(float64 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float64_to_int16_scalbn(a, s->float_rounding_mode, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t float64_to_int32(float64 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float64_to_int32_scalbn(a, s->float_rounding_mode, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t float64_to_int64(float64 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float64_to_int64_scalbn(a, s->float_rounding_mode, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t float16_to_int16_round_to_zero(float16 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float16_to_int16_scalbn(a, float_round_to_zero, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t float16_to_int32_round_to_zero(float16 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float16_to_int32_scalbn(a, float_round_to_zero, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t float16_to_int64_round_to_zero(float16 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float16_to_int64_scalbn(a, float_round_to_zero, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t float32_to_int16_round_to_zero(float32 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float32_to_int16_scalbn(a, float_round_to_zero, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t float32_to_int32_round_to_zero(float32 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float32_to_int32_scalbn(a, float_round_to_zero, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t float32_to_int64_round_to_zero(float32 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float32_to_int64_scalbn(a, float_round_to_zero, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t float64_to_int16_round_to_zero(float64 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float64_to_int16_scalbn(a, float_round_to_zero, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t float64_to_int32_round_to_zero(float64 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float64_to_int32_scalbn(a, float_round_to_zero, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t float64_to_int64_round_to_zero(float64 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float64_to_int64_scalbn(a, float_round_to_zero, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Returns the result of converting the floating-point value `a' to
|
* Returns the result of converting the floating-point value `a' to
|
||||||
@ -1515,11 +1639,12 @@ FLOAT_TO_INT(64, 64)
|
|||||||
* flag.
|
* flag.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static uint64_t round_to_uint_and_pack(FloatParts in, int rmode, uint64_t max,
|
static uint64_t round_to_uint_and_pack(FloatParts in, int rmode, int scale,
|
||||||
float_status *s)
|
uint64_t max, float_status *s)
|
||||||
{
|
{
|
||||||
int orig_flags = get_float_exception_flags(s);
|
int orig_flags = get_float_exception_flags(s);
|
||||||
FloatParts p = round_to_int(in, rmode, s);
|
FloatParts p = round_to_int(in, rmode, scale, s);
|
||||||
|
uint64_t r;
|
||||||
|
|
||||||
switch (p.cls) {
|
switch (p.cls) {
|
||||||
case float_class_snan:
|
case float_class_snan:
|
||||||
@ -1532,8 +1657,6 @@ static uint64_t round_to_uint_and_pack(FloatParts in, int rmode, uint64_t max,
|
|||||||
case float_class_zero:
|
case float_class_zero:
|
||||||
return 0;
|
return 0;
|
||||||
case float_class_normal:
|
case float_class_normal:
|
||||||
{
|
|
||||||
uint64_t r;
|
|
||||||
if (p.sign) {
|
if (p.sign) {
|
||||||
s->float_exception_flags = orig_flags | float_flag_invalid;
|
s->float_exception_flags = orig_flags | float_flag_invalid;
|
||||||
return 0;
|
return 0;
|
||||||
@ -1555,45 +1678,165 @@ static uint64_t round_to_uint_and_pack(FloatParts in, int rmode, uint64_t max,
|
|||||||
if (r > max) {
|
if (r > max) {
|
||||||
s->float_exception_flags = orig_flags | float_flag_invalid;
|
s->float_exception_flags = orig_flags | float_flag_invalid;
|
||||||
return max;
|
return max;
|
||||||
} else {
|
}
|
||||||
return r;
|
return r;
|
||||||
}
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
g_assert_not_reached();
|
g_assert_not_reached();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define FLOAT_TO_UINT(fsz, isz) \
|
uint16_t float16_to_uint16_scalbn(float16 a, int rmode, int scale,
|
||||||
uint ## isz ## _t float ## fsz ## _to_uint ## isz(float ## fsz a, \
|
float_status *s)
|
||||||
float_status *s) \
|
{
|
||||||
{ \
|
return round_to_uint_and_pack(float16_unpack_canonical(a, s),
|
||||||
FloatParts p = float ## fsz ## _unpack_canonical(a, s); \
|
rmode, scale, UINT16_MAX, s);
|
||||||
return round_to_uint_and_pack(p, s->float_rounding_mode, \
|
|
||||||
UINT ## isz ## _MAX, s); \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
uint ## isz ## _t float ## fsz ## _to_uint ## isz ## _round_to_zero \
|
|
||||||
(float ## fsz a, float_status *s) \
|
|
||||||
{ \
|
|
||||||
FloatParts p = float ## fsz ## _unpack_canonical(a, s); \
|
|
||||||
return round_to_uint_and_pack(p, float_round_to_zero, \
|
|
||||||
UINT ## isz ## _MAX, s); \
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FLOAT_TO_UINT(16, 16)
|
uint32_t float16_to_uint32_scalbn(float16 a, int rmode, int scale,
|
||||||
FLOAT_TO_UINT(16, 32)
|
float_status *s)
|
||||||
FLOAT_TO_UINT(16, 64)
|
{
|
||||||
|
return round_to_uint_and_pack(float16_unpack_canonical(a, s),
|
||||||
|
rmode, scale, UINT32_MAX, s);
|
||||||
|
}
|
||||||
|
|
||||||
FLOAT_TO_UINT(32, 16)
|
uint64_t float16_to_uint64_scalbn(float16 a, int rmode, int scale,
|
||||||
FLOAT_TO_UINT(32, 32)
|
float_status *s)
|
||||||
FLOAT_TO_UINT(32, 64)
|
{
|
||||||
|
return round_to_uint_and_pack(float16_unpack_canonical(a, s),
|
||||||
|
rmode, scale, UINT64_MAX, s);
|
||||||
|
}
|
||||||
|
|
||||||
FLOAT_TO_UINT(64, 16)
|
uint16_t float32_to_uint16_scalbn(float32 a, int rmode, int scale,
|
||||||
FLOAT_TO_UINT(64, 32)
|
float_status *s)
|
||||||
FLOAT_TO_UINT(64, 64)
|
{
|
||||||
|
return round_to_uint_and_pack(float32_unpack_canonical(a, s),
|
||||||
|
rmode, scale, UINT16_MAX, s);
|
||||||
|
}
|
||||||
|
|
||||||
#undef FLOAT_TO_UINT
|
uint32_t float32_to_uint32_scalbn(float32 a, int rmode, int scale,
|
||||||
|
float_status *s)
|
||||||
|
{
|
||||||
|
return round_to_uint_and_pack(float32_unpack_canonical(a, s),
|
||||||
|
rmode, scale, UINT32_MAX, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t float32_to_uint64_scalbn(float32 a, int rmode, int scale,
|
||||||
|
float_status *s)
|
||||||
|
{
|
||||||
|
return round_to_uint_and_pack(float32_unpack_canonical(a, s),
|
||||||
|
rmode, scale, UINT64_MAX, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t float64_to_uint16_scalbn(float64 a, int rmode, int scale,
|
||||||
|
float_status *s)
|
||||||
|
{
|
||||||
|
return round_to_uint_and_pack(float64_unpack_canonical(a, s),
|
||||||
|
rmode, scale, UINT16_MAX, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t float64_to_uint32_scalbn(float64 a, int rmode, int scale,
|
||||||
|
float_status *s)
|
||||||
|
{
|
||||||
|
return round_to_uint_and_pack(float64_unpack_canonical(a, s),
|
||||||
|
rmode, scale, UINT32_MAX, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t float64_to_uint64_scalbn(float64 a, int rmode, int scale,
|
||||||
|
float_status *s)
|
||||||
|
{
|
||||||
|
return round_to_uint_and_pack(float64_unpack_canonical(a, s),
|
||||||
|
rmode, scale, UINT64_MAX, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t float16_to_uint16(float16 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float16_to_uint16_scalbn(a, s->float_rounding_mode, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t float16_to_uint32(float16 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float16_to_uint32_scalbn(a, s->float_rounding_mode, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t float16_to_uint64(float16 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float16_to_uint64_scalbn(a, s->float_rounding_mode, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t float32_to_uint16(float32 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float32_to_uint16_scalbn(a, s->float_rounding_mode, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t float32_to_uint32(float32 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float32_to_uint32_scalbn(a, s->float_rounding_mode, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t float32_to_uint64(float32 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float32_to_uint64_scalbn(a, s->float_rounding_mode, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t float64_to_uint16(float64 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float64_to_uint16_scalbn(a, s->float_rounding_mode, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t float64_to_uint32(float64 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float64_to_uint32_scalbn(a, s->float_rounding_mode, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t float64_to_uint64(float64 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float64_to_uint64_scalbn(a, s->float_rounding_mode, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t float16_to_uint16_round_to_zero(float16 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float16_to_uint16_scalbn(a, float_round_to_zero, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t float16_to_uint32_round_to_zero(float16 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float16_to_uint32_scalbn(a, float_round_to_zero, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t float16_to_uint64_round_to_zero(float16 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float16_to_uint64_scalbn(a, float_round_to_zero, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t float32_to_uint16_round_to_zero(float32 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float32_to_uint16_scalbn(a, float_round_to_zero, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t float32_to_uint32_round_to_zero(float32 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float32_to_uint32_scalbn(a, float_round_to_zero, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t float32_to_uint64_round_to_zero(float32 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float32_to_uint64_scalbn(a, float_round_to_zero, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t float64_to_uint16_round_to_zero(float64 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float64_to_uint16_scalbn(a, float_round_to_zero, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t float64_to_uint32_round_to_zero(float64 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float64_to_uint32_scalbn(a, float_round_to_zero, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t float64_to_uint64_round_to_zero(float64 a, float_status *s)
|
||||||
|
{
|
||||||
|
return float64_to_uint64_scalbn(a, float_round_to_zero, 0, s);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Integer to float conversions
|
* Integer to float conversions
|
||||||
|
@ -243,21 +243,34 @@ float128 uint64_to_float128(uint64_t, float_status *status);
|
|||||||
/*----------------------------------------------------------------------------
|
/*----------------------------------------------------------------------------
|
||||||
| Software half-precision conversion routines.
|
| Software half-precision conversion routines.
|
||||||
*----------------------------------------------------------------------------*/
|
*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
float16 float32_to_float16(float32, bool ieee, float_status *status);
|
float16 float32_to_float16(float32, bool ieee, float_status *status);
|
||||||
float32 float16_to_float32(float16, bool ieee, float_status *status);
|
float32 float16_to_float32(float16, bool ieee, float_status *status);
|
||||||
float16 float64_to_float16(float64 a, bool ieee, float_status *status);
|
float16 float64_to_float16(float64 a, bool ieee, float_status *status);
|
||||||
float64 float16_to_float64(float16 a, bool ieee, float_status *status);
|
float64 float16_to_float64(float16 a, bool ieee, float_status *status);
|
||||||
|
|
||||||
|
int16_t float16_to_int16_scalbn(float16, int, int, float_status *status);
|
||||||
|
int32_t float16_to_int32_scalbn(float16, int, int, float_status *status);
|
||||||
|
int64_t float16_to_int64_scalbn(float16, int, int, float_status *status);
|
||||||
|
|
||||||
int16_t float16_to_int16(float16, float_status *status);
|
int16_t float16_to_int16(float16, float_status *status);
|
||||||
uint16_t float16_to_uint16(float16 a, float_status *status);
|
|
||||||
int16_t float16_to_int16_round_to_zero(float16, float_status *status);
|
|
||||||
uint16_t float16_to_uint16_round_to_zero(float16 a, float_status *status);
|
|
||||||
int32_t float16_to_int32(float16, float_status *status);
|
int32_t float16_to_int32(float16, float_status *status);
|
||||||
uint32_t float16_to_uint32(float16 a, float_status *status);
|
|
||||||
int32_t float16_to_int32_round_to_zero(float16, float_status *status);
|
|
||||||
uint32_t float16_to_uint32_round_to_zero(float16 a, float_status *status);
|
|
||||||
int64_t float16_to_int64(float16, float_status *status);
|
int64_t float16_to_int64(float16, float_status *status);
|
||||||
uint64_t float16_to_uint64(float16 a, float_status *status);
|
|
||||||
|
int16_t float16_to_int16_round_to_zero(float16, float_status *status);
|
||||||
|
int32_t float16_to_int32_round_to_zero(float16, float_status *status);
|
||||||
int64_t float16_to_int64_round_to_zero(float16, float_status *status);
|
int64_t float16_to_int64_round_to_zero(float16, float_status *status);
|
||||||
|
|
||||||
|
uint16_t float16_to_uint16_scalbn(float16 a, int, int, float_status *status);
|
||||||
|
uint32_t float16_to_uint32_scalbn(float16 a, int, int, float_status *status);
|
||||||
|
uint64_t float16_to_uint64_scalbn(float16 a, int, int, float_status *status);
|
||||||
|
|
||||||
|
uint16_t float16_to_uint16(float16 a, float_status *status);
|
||||||
|
uint32_t float16_to_uint32(float16 a, float_status *status);
|
||||||
|
uint64_t float16_to_uint64(float16 a, float_status *status);
|
||||||
|
|
||||||
|
uint16_t float16_to_uint16_round_to_zero(float16 a, float_status *status);
|
||||||
|
uint32_t float16_to_uint32_round_to_zero(float16 a, float_status *status);
|
||||||
uint64_t float16_to_uint64_round_to_zero(float16 a, float_status *status);
|
uint64_t float16_to_uint64_round_to_zero(float16 a, float_status *status);
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------
|
/*----------------------------------------------------------------------------
|
||||||
@ -347,18 +360,31 @@ float16 float16_default_nan(float_status *status);
|
|||||||
/*----------------------------------------------------------------------------
|
/*----------------------------------------------------------------------------
|
||||||
| Software IEC/IEEE single-precision conversion routines.
|
| Software IEC/IEEE single-precision conversion routines.
|
||||||
*----------------------------------------------------------------------------*/
|
*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
int16_t float32_to_int16_scalbn(float32, int, int, float_status *status);
|
||||||
|
int32_t float32_to_int32_scalbn(float32, int, int, float_status *status);
|
||||||
|
int64_t float32_to_int64_scalbn(float32, int, int, float_status *status);
|
||||||
|
|
||||||
int16_t float32_to_int16(float32, float_status *status);
|
int16_t float32_to_int16(float32, float_status *status);
|
||||||
uint16_t float32_to_uint16(float32, float_status *status);
|
|
||||||
int16_t float32_to_int16_round_to_zero(float32, float_status *status);
|
|
||||||
uint16_t float32_to_uint16_round_to_zero(float32, float_status *status);
|
|
||||||
int32_t float32_to_int32(float32, float_status *status);
|
int32_t float32_to_int32(float32, float_status *status);
|
||||||
int32_t float32_to_int32_round_to_zero(float32, float_status *status);
|
|
||||||
uint32_t float32_to_uint32(float32, float_status *status);
|
|
||||||
uint32_t float32_to_uint32_round_to_zero(float32, float_status *status);
|
|
||||||
int64_t float32_to_int64(float32, float_status *status);
|
int64_t float32_to_int64(float32, float_status *status);
|
||||||
uint64_t float32_to_uint64(float32, float_status *status);
|
|
||||||
uint64_t float32_to_uint64_round_to_zero(float32, float_status *status);
|
int16_t float32_to_int16_round_to_zero(float32, float_status *status);
|
||||||
|
int32_t float32_to_int32_round_to_zero(float32, float_status *status);
|
||||||
int64_t float32_to_int64_round_to_zero(float32, float_status *status);
|
int64_t float32_to_int64_round_to_zero(float32, float_status *status);
|
||||||
|
|
||||||
|
uint16_t float32_to_uint16_scalbn(float32, int, int, float_status *status);
|
||||||
|
uint32_t float32_to_uint32_scalbn(float32, int, int, float_status *status);
|
||||||
|
uint64_t float32_to_uint64_scalbn(float32, int, int, float_status *status);
|
||||||
|
|
||||||
|
uint16_t float32_to_uint16(float32, float_status *status);
|
||||||
|
uint32_t float32_to_uint32(float32, float_status *status);
|
||||||
|
uint64_t float32_to_uint64(float32, float_status *status);
|
||||||
|
|
||||||
|
uint16_t float32_to_uint16_round_to_zero(float32, float_status *status);
|
||||||
|
uint32_t float32_to_uint32_round_to_zero(float32, float_status *status);
|
||||||
|
uint64_t float32_to_uint64_round_to_zero(float32, float_status *status);
|
||||||
|
|
||||||
float64 float32_to_float64(float32, float_status *status);
|
float64 float32_to_float64(float32, float_status *status);
|
||||||
floatx80 float32_to_floatx80(float32, float_status *status);
|
floatx80 float32_to_floatx80(float32, float_status *status);
|
||||||
float128 float32_to_float128(float32, float_status *status);
|
float128 float32_to_float128(float32, float_status *status);
|
||||||
@ -476,18 +502,31 @@ float32 float32_default_nan(float_status *status);
|
|||||||
/*----------------------------------------------------------------------------
|
/*----------------------------------------------------------------------------
|
||||||
| Software IEC/IEEE double-precision conversion routines.
|
| Software IEC/IEEE double-precision conversion routines.
|
||||||
*----------------------------------------------------------------------------*/
|
*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
int16_t float64_to_int16_scalbn(float64, int, int, float_status *status);
|
||||||
|
int32_t float64_to_int32_scalbn(float64, int, int, float_status *status);
|
||||||
|
int64_t float64_to_int64_scalbn(float64, int, int, float_status *status);
|
||||||
|
|
||||||
int16_t float64_to_int16(float64, float_status *status);
|
int16_t float64_to_int16(float64, float_status *status);
|
||||||
uint16_t float64_to_uint16(float64, float_status *status);
|
|
||||||
int16_t float64_to_int16_round_to_zero(float64, float_status *status);
|
|
||||||
uint16_t float64_to_uint16_round_to_zero(float64, float_status *status);
|
|
||||||
int32_t float64_to_int32(float64, float_status *status);
|
int32_t float64_to_int32(float64, float_status *status);
|
||||||
int32_t float64_to_int32_round_to_zero(float64, float_status *status);
|
|
||||||
uint32_t float64_to_uint32(float64, float_status *status);
|
|
||||||
uint32_t float64_to_uint32_round_to_zero(float64, float_status *status);
|
|
||||||
int64_t float64_to_int64(float64, float_status *status);
|
int64_t float64_to_int64(float64, float_status *status);
|
||||||
|
|
||||||
|
int16_t float64_to_int16_round_to_zero(float64, float_status *status);
|
||||||
|
int32_t float64_to_int32_round_to_zero(float64, float_status *status);
|
||||||
int64_t float64_to_int64_round_to_zero(float64, float_status *status);
|
int64_t float64_to_int64_round_to_zero(float64, float_status *status);
|
||||||
uint64_t float64_to_uint64(float64 a, float_status *status);
|
|
||||||
uint64_t float64_to_uint64_round_to_zero(float64 a, float_status *status);
|
uint16_t float64_to_uint16_scalbn(float64, int, int, float_status *status);
|
||||||
|
uint32_t float64_to_uint32_scalbn(float64, int, int, float_status *status);
|
||||||
|
uint64_t float64_to_uint64_scalbn(float64, int, int, float_status *status);
|
||||||
|
|
||||||
|
uint16_t float64_to_uint16(float64, float_status *status);
|
||||||
|
uint32_t float64_to_uint32(float64, float_status *status);
|
||||||
|
uint64_t float64_to_uint64(float64, float_status *status);
|
||||||
|
|
||||||
|
uint16_t float64_to_uint16_round_to_zero(float64, float_status *status);
|
||||||
|
uint32_t float64_to_uint32_round_to_zero(float64, float_status *status);
|
||||||
|
uint64_t float64_to_uint64_round_to_zero(float64, float_status *status);
|
||||||
|
|
||||||
float32 float64_to_float32(float64, float_status *status);
|
float32 float64_to_float32(float64, float_status *status);
|
||||||
floatx80 float64_to_floatx80(float64, float_status *status);
|
floatx80 float64_to_floatx80(float64, float_status *status);
|
||||||
float128 float64_to_float128(float64, float_status *status);
|
float128 float64_to_float128(float64, float_status *status);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user