fpu: Return struct from float16_unpack_canonical
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Richard Henderson committed
Apr 25, 2026 at 18:57 UTC
b5ac7f68274704331c57d4b85ee8c842f2046264
1 file changed
+32
-62
fpu/softfloat.c
+32
-62
@@ -1482,10 +1482,9 @@ static FloatParts64 float16a_unpack_canonical(float16 f, float_status *s,
1482
return p;
1483
}
1484
1485
-static void float16_unpack_canonical(FloatParts64 *p, float16 f,
1486
- float_status *s)
1485
+static FloatParts64 float16_unpack_canonical(float16 f, float_status *s)
1486
{
1488
- *p = float16a_unpack_canonical(f, s, &float16_params);
1487
+ return float16a_unpack_canonical(f, s, &float16_params);
1488
}
1489
1490
static void bfloat16_unpack_canonical(FloatParts64 *p, bfloat16 f,
@@ -1718,11 +1717,9 @@ static floatx80 floatx80_round_pack_canonical(FloatParts128 *p,
1717
static float16 QEMU_FLATTEN
1718
float16_addsub(float16 a, float16 b, float_status *status, bool subtract)
1719
{
1721
- FloatParts64 pa, pb, *pr;
1722
-
1723
- float16_unpack_canonical(&pa, a, status);
1724
- float16_unpack_canonical(&pb, b, status);
1725
- pr = parts64_addsub(&pa, &pb, status, subtract);
1720
+ FloatParts64 pa = float16_unpack_canonical(a, status);
1721
+ FloatParts64 pb = float16_unpack_canonical(b, status);
1722
+ FloatParts64 *pr = parts64_addsub(&pa, &pb, status, subtract);
1723
1724
return float16_round_pack_canonical(pr, status);
1725
}
@@ -1952,11 +1949,9 @@ floatx80 floatx80_sub(floatx80 a, floatx80 b, float_status *status)
1949
1950
float16 QEMU_FLATTEN float16_mul(float16 a, float16 b, float_status *status)
1951
{
1955
- FloatParts64 pa, pb, *pr;
1956
-
1957
- float16_unpack_canonical(&pa, a, status);
1958
- float16_unpack_canonical(&pb, b, status);
1959
- pr = parts64_mul(&pa, &pb, status);
1952
+ FloatParts64 pa = float16_unpack_canonical(a, status);
1953
+ FloatParts64 pb = float16_unpack_canonical(b, status);
1954
+ FloatParts64 *pr = parts64_mul(&pa, &pb, status);
1955
1956
return float16_round_pack_canonical(pr, status);
1957
}
@@ -2066,12 +2061,11 @@ float16 QEMU_FLATTEN
2061
float16_muladd_scalbn(float16 a, float16 b, float16 c,
2062
int scale, int flags, float_status *status)
2063
{
2069
- FloatParts64 pa, pb, pc, *pr;
2070
-
2071
- float16_unpack_canonical(&pa, a, status);
2072
- float16_unpack_canonical(&pb, b, status);
2073
- float16_unpack_canonical(&pc, c, status);
2074
- pr = parts64_muladd_scalbn(&pa, &pb, &pc, scale, flags, status);
2064
+ FloatParts64 pa = float16_unpack_canonical(a, status);
2065
+ FloatParts64 pb = float16_unpack_canonical(b, status);
2066
+ FloatParts64 pc = float16_unpack_canonical(c, status);
2067
+ FloatParts64 *pr =
2068
+ parts64_muladd_scalbn(&pa, &pb, &pc, scale, flags, status);
2069
2070
/* Round before applying negate result. */
2071
parts64_uncanon(pr, status, &float16_params, false);
@@ -2326,11 +2320,9 @@ float128 QEMU_FLATTEN float128_muladd(float128 a, float128 b, float128 c,
2320
2321
float16 float16_div(float16 a, float16 b, float_status *status)
2322
{
2329
- FloatParts64 pa, pb, *pr;
2330
-
2331
- float16_unpack_canonical(&pa, a, status);
2332
- float16_unpack_canonical(&pb, b, status);
2333
- pr = parts64_div(&pa, &pb, status);
2323
+ FloatParts64 pa = float16_unpack_canonical(a, status);
2324
+ FloatParts64 pb = float16_unpack_canonical(b, status);
2325
+ FloatParts64 *pr = parts64_div(&pa, &pb, status);
2326
2327
return float16_round_pack_canonical(pr, status);
2328
}
@@ -2969,9 +2961,8 @@ floatx80 float128_to_floatx80(float128 a, float_status *s)
2961
2962
float16 float16_round_to_int(float16 a, float_status *s)
2963
{
2972
- FloatParts64 p;
2964
+ FloatParts64 p = float16_unpack_canonical(a, s);
2965
2974
- float16_unpack_canonical(&p, a, s);
2966
parts64_round_to_int(&p, s->float_rounding_mode, 0, s, &float16_params);
2967
return float16_round_pack_canonical(&p, s);
2968
}
@@ -3032,36 +3023,28 @@ floatx80 floatx80_round_to_int(floatx80 a, float_status *status)
3023
int8_t float16_to_int8_scalbn(float16 a, FloatRoundMode rmode, int scale,
3024
float_status *s)
3025
{
3035
- FloatParts64 p;
3036
-
3037
- float16_unpack_canonical(&p, a, s);
3026
+ FloatParts64 p = float16_unpack_canonical(a, s);
3027
return parts64_float_to_sint(&p, rmode, scale, INT8_MIN, INT8_MAX, s);
3028
}
3029
3030
int16_t float16_to_int16_scalbn(float16 a, FloatRoundMode rmode, int scale,
3031
float_status *s)
3032
{
3044
- FloatParts64 p;
3045
-
3046
- float16_unpack_canonical(&p, a, s);
3033
+ FloatParts64 p = float16_unpack_canonical(a, s);
3034
return parts64_float_to_sint(&p, rmode, scale, INT16_MIN, INT16_MAX, s);
3035
}
3036
3037
int32_t float16_to_int32_scalbn(float16 a, FloatRoundMode rmode, int scale,
3038
float_status *s)
3039
{
3053
- FloatParts64 p;
3054
-
3055
- float16_unpack_canonical(&p, a, s);
3040
+ FloatParts64 p = float16_unpack_canonical(a, s);
3041
return parts64_float_to_sint(&p, rmode, scale, INT32_MIN, INT32_MAX, s);
3042
}
3043
3044
int64_t float16_to_int64_scalbn(float16 a, FloatRoundMode rmode, int scale,
3045
float_status *s)
3046
{
3062
- FloatParts64 p;
3063
-
3064
- float16_unpack_canonical(&p, a, s);
3047
+ FloatParts64 p = float16_unpack_canonical(a, s);
3048
return parts64_float_to_sint(&p, rmode, scale, INT64_MIN, INT64_MAX, s);
3049
}
3050
@@ -3530,36 +3513,28 @@ int64_t float64_to_int64_modulo(float64 a, FloatRoundMode rmode,
3513
uint8_t float16_to_uint8_scalbn(float16 a, FloatRoundMode rmode, int scale,
3514
float_status *s)
3515
{
3533
- FloatParts64 p;
3534
-
3535
- float16_unpack_canonical(&p, a, s);
3516
+ FloatParts64 p = float16_unpack_canonical(a, s);
3517
return parts64_float_to_uint(&p, rmode, scale, UINT8_MAX, s);
3518
}
3519
3520
uint16_t float16_to_uint16_scalbn(float16 a, FloatRoundMode rmode, int scale,
3521
float_status *s)
3522
{
3542
- FloatParts64 p;
3543
-
3544
- float16_unpack_canonical(&p, a, s);
3523
+ FloatParts64 p = float16_unpack_canonical(a, s);
3524
return parts64_float_to_uint(&p, rmode, scale, UINT16_MAX, s);
3525
}
3526
3527
uint32_t float16_to_uint32_scalbn(float16 a, FloatRoundMode rmode, int scale,
3528
float_status *s)
3529
{
3551
- FloatParts64 p;
3552
-
3553
- float16_unpack_canonical(&p, a, s);
3530
+ FloatParts64 p = float16_unpack_canonical(a, s);
3531
return parts64_float_to_uint(&p, rmode, scale, UINT32_MAX, s);
3532
}
3533
3534
uint64_t float16_to_uint64_scalbn(float16 a, FloatRoundMode rmode, int scale,
3535
float_status *s)
3536
{
3560
- FloatParts64 p;
3561
-
3562
- float16_unpack_canonical(&p, a, s);
3537
+ FloatParts64 p = float16_unpack_canonical(a, s);
3538
return parts64_float_to_uint(&p, rmode, scale, UINT64_MAX, s);
3539
}
3540
@@ -4316,11 +4291,9 @@ float128 uint128_to_float128(Int128 a, float_status *status)
4291
4292
static float16 float16_minmax(float16 a, float16 b, float_status *s, int flags)
4293
{
4319
- FloatParts64 pa, pb, *pr;
4320
-
4321
- float16_unpack_canonical(&pa, a, s);
4322
- float16_unpack_canonical(&pb, b, s);
4323
- pr = parts64_minmax(&pa, &pb, s, flags);
4294
+ FloatParts64 pa = float16_unpack_canonical(a, s);
4295
+ FloatParts64 pb = float16_unpack_canonical(b, s);
4296
+ FloatParts64 *pr = parts64_minmax(&pa, &pb, s, flags);
4297
4298
return float16_round_pack_canonical(pr, s);
4299
}
@@ -4401,10 +4374,9 @@ MINMAX_2(float128)
4374
static FloatRelation QEMU_FLATTEN
4375
float16_do_compare(float16 a, float16 b, float_status *s, bool is_quiet)
4376
{
4404
- FloatParts64 pa, pb;
4377
+ FloatParts64 pa = float16_unpack_canonical(a, s);
4378
+ FloatParts64 pb = float16_unpack_canonical(b, s);
4379
4406
- float16_unpack_canonical(&pa, a, s);
4407
- float16_unpack_canonical(&pb, b, s);
4380
return parts64_compare(&pa, &pb, s, is_quiet);
4381
}
4382
@@ -4594,9 +4566,8 @@ FloatRelation floatx80_compare_quiet(floatx80 a, floatx80 b, float_status *s)
4566
4567
float16 float16_scalbn(float16 a, int n, float_status *status)
4568
{
4597
- FloatParts64 p;
4569
+ FloatParts64 p = float16_unpack_canonical(a, status);
4570
4599
- float16_unpack_canonical(&p, a, status);
4571
parts64_scalbn(&p, n, status);
4572
return float16_round_pack_canonical(&p, status);
4573
}
@@ -4654,9 +4625,8 @@ floatx80 floatx80_scalbn(floatx80 a, int n, float_status *status)
4625
4626
float16 QEMU_FLATTEN float16_sqrt(float16 a, float_status *status)
4627
{
4657
- FloatParts64 p;
4628
+ FloatParts64 p = float16_unpack_canonical(a, status);
4629
4659
- float16_unpack_canonical(&p, a, status);
4630
parts64_sqrt(&p, status, &float16_params);
4631
return float16_round_pack_canonical(&p, status);
4632
}