fpu: Return struct from float128_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 19:52 UTC
6dd088168beda7e41e9bca57e0705f2991dac4f9
1 file changed
+37
-68
fpu/softfloat.c
+37
-68
@@ -1583,11 +1583,11 @@ static float64 float64r32_round_pack_canonical(FloatParts64 *p,
1583
return float64r32_pack_raw(p);
1584
}
1585
1586
-static void float128_unpack_canonical(FloatParts128 *p, float128 f,
1587
- float_status *s)
1586
+static FloatParts128 float128_unpack_canonical(float128 f, float_status *s)
1587
{
1589
- *p = float128_unpack_raw(f);
1590
- parts128_canonicalize(p, s, &float128_params);
1588
+ FloatParts128 p = float128_unpack_raw(f);
1589
+ parts128_canonicalize(&p, s, &float128_params);
1590
+ return p;
1591
}
1592
1593
static float128 float128_round_pack_canonical(FloatParts128 *p,
@@ -1872,11 +1872,9 @@ bfloat16 bfloat16_sub(bfloat16 a, bfloat16 b, float_status *status)
1872
static float128 QEMU_FLATTEN
1873
float128_addsub(float128 a, float128 b, float_status *status, bool subtract)
1874
{
1875
- FloatParts128 pa, pb, *pr;
1876
-
1877
- float128_unpack_canonical(&pa, a, status);
1878
- float128_unpack_canonical(&pb, b, status);
1879
- pr = parts128_addsub(&pa, &pb, status, subtract);
1875
+ FloatParts128 pa = float128_unpack_canonical(a, status);
1876
+ FloatParts128 pb = float128_unpack_canonical(b, status);
1877
+ FloatParts128 *pr = parts128_addsub(&pa, &pb, status, subtract);
1878
1879
return float128_round_pack_canonical(pr, status);
1880
}
@@ -1994,11 +1992,9 @@ bfloat16_mul(bfloat16 a, bfloat16 b, float_status *status)
1992
float128 QEMU_FLATTEN
1993
float128_mul(float128 a, float128 b, float_status *status)
1994
{
1997
- FloatParts128 pa, pb, *pr;
1998
-
1999
- float128_unpack_canonical(&pa, a, status);
2000
- float128_unpack_canonical(&pb, b, status);
2001
- pr = parts128_mul(&pa, &pb, status);
1995
+ FloatParts128 pa = float128_unpack_canonical(a, status);
1996
+ FloatParts128 pb = float128_unpack_canonical(b, status);
1997
+ FloatParts128 *pr = parts128_mul(&pa, &pb, status);
1998
1999
return float128_round_pack_canonical(pr, status);
2000
}
@@ -2255,12 +2251,10 @@ bfloat16 QEMU_FLATTEN bfloat16_muladd(bfloat16 a, bfloat16 b, bfloat16 c,
2251
float128 QEMU_FLATTEN float128_muladd(float128 a, float128 b, float128 c,
2252
int flags, float_status *status)
2253
{
2258
- FloatParts128 pa, pb, pc, *pr;
2259
-
2260
- float128_unpack_canonical(&pa, a, status);
2261
- float128_unpack_canonical(&pb, b, status);
2262
- float128_unpack_canonical(&pc, c, status);
2263
- pr = parts128_muladd_scalbn(&pa, &pb, &pc, 0, flags, status);
2254
+ FloatParts128 pa = float128_unpack_canonical(a, status);
2255
+ FloatParts128 pb = float128_unpack_canonical(b, status);
2256
+ FloatParts128 pc = float128_unpack_canonical(c, status);
2257
+ FloatParts128 *pr = parts128_muladd_scalbn(&pa, &pb, &pc, 0, flags, status);
2258
2259
/* Round before applying negate result. */
2260
parts128_uncanon(pr, status, &float128_params, false);
@@ -2383,11 +2377,9 @@ bfloat16_div(bfloat16 a, bfloat16 b, float_status *status)
2377
float128 QEMU_FLATTEN
2378
float128_div(float128 a, float128 b, float_status *status)
2379
{
2386
- FloatParts128 pa, pb, *pr;
2387
-
2388
- float128_unpack_canonical(&pa, a, status);
2389
- float128_unpack_canonical(&pb, b, status);
2390
- pr = parts128_div(&pa, &pb, status);
2380
+ FloatParts128 pa = float128_unpack_canonical(a, status);
2381
+ FloatParts128 pb = float128_unpack_canonical(b, status);
2382
+ FloatParts128 *pr = parts128_div(&pa, &pb, status);
2383
2384
return float128_round_pack_canonical(pr, status);
2385
}
@@ -2429,11 +2421,9 @@ float64 float64_rem(float64 a, float64 b, float_status *status)
2421
2422
float128 float128_rem(float128 a, float128 b, float_status *status)
2423
{
2432
- FloatParts128 pa, pb, *pr;
2433
-
2434
- float128_unpack_canonical(&pa, a, status);
2435
- float128_unpack_canonical(&pb, b, status);
2436
- pr = parts128_modrem(&pa, &pb, NULL, status);
2424
+ FloatParts128 pa = float128_unpack_canonical(a, status);
2425
+ FloatParts128 pb = float128_unpack_canonical(b, status);
2426
+ FloatParts128 *pr = parts128_modrem(&pa, &pb, NULL, status);
2427
2428
return float128_round_pack_canonical(pr, status);
2429
}
@@ -2782,20 +2772,18 @@ bfloat16 float64_to_bfloat16(float64 a, float_status *s)
2772
2773
float32 float128_to_float32(float128 a, float_status *s)
2774
{
2775
+ FloatParts128 p128 = float128_unpack_canonical(a, s);
2776
FloatParts64 p64;
2786
- FloatParts128 p128;
2777
2788
- float128_unpack_canonical(&p128, a, s);
2778
parts_float_to_float_narrow(&p64, &p128, s);
2779
return float32_round_pack_canonical(&p64, s);
2780
}
2781
2782
float64 float128_to_float64(float128 a, float_status *s)
2783
{
2784
+ FloatParts128 p128 = float128_unpack_canonical(a, s);
2785
FloatParts64 p64;
2796
- FloatParts128 p128;
2786
2798
- float128_unpack_canonical(&p128, a, s);
2787
parts_float_to_float_narrow(&p64, &p128, s);
2788
return float64_round_pack_canonical(&p64, s);
2789
}
@@ -2876,9 +2864,8 @@ floatx80 float64_to_floatx80(float64 a, float_status *s)
2864
2865
floatx80 float128_to_floatx80(float128 a, float_status *s)
2866
{
2879
- FloatParts128 p;
2867
+ FloatParts128 p = float128_unpack_canonical(a, s);
2868
2881
- float128_unpack_canonical(&p, a, s);
2869
parts128_float_to_float(&p, s);
2870
return floatx80_round_pack_canonical(&p, s);
2871
}
@@ -2921,9 +2908,8 @@ bfloat16 bfloat16_round_to_int(bfloat16 a, float_status *s)
2908
2909
float128 float128_round_to_int(float128 a, float_status *s)
2910
{
2924
- FloatParts128 p;
2911
+ FloatParts128 p = float128_unpack_canonical(a, s);
2912
2926
- float128_unpack_canonical(&p, a, s);
2913
parts128_round_to_int(&p, s->float_rounding_mode, 0, s, &float128_params);
2914
return float128_round_pack_canonical(&p, s);
2915
}
@@ -3046,18 +3032,14 @@ int64_t bfloat16_to_int64_scalbn(bfloat16 a, FloatRoundMode rmode, int scale,
3032
static int32_t float128_to_int32_scalbn(float128 a, FloatRoundMode rmode,
3033
int scale, float_status *s)
3034
{
3049
- FloatParts128 p;
3050
-
3051
- float128_unpack_canonical(&p, a, s);
3035
+ FloatParts128 p = float128_unpack_canonical(a, s);
3036
return parts128_float_to_sint(&p, rmode, scale, INT32_MIN, INT32_MAX, s);
3037
}
3038
3039
static int64_t float128_to_int64_scalbn(float128 a, FloatRoundMode rmode,
3040
int scale, float_status *s)
3041
{
3058
- FloatParts128 p;
3059
-
3060
- float128_unpack_canonical(&p, a, s);
3042
+ FloatParts128 p = float128_unpack_canonical(a, s);
3043
return parts128_float_to_sint(&p, rmode, scale, INT64_MIN, INT64_MAX, s);
3044
}
3045
@@ -3066,9 +3048,7 @@ static Int128 float128_to_int128_scalbn(float128 a, FloatRoundMode rmode,
3048
{
3049
int flags = 0;
3050
Int128 r;
3069
- FloatParts128 p;
3070
-
3071
- float128_unpack_canonical(&p, a, s);
3051
+ FloatParts128 p = float128_unpack_canonical(a, s);
3052
3053
switch (p.cls) {
3054
case float_class_snan:
@@ -3512,18 +3492,14 @@ uint64_t bfloat16_to_uint64_scalbn(bfloat16 a, FloatRoundMode rmode,
3492
static uint32_t float128_to_uint32_scalbn(float128 a, FloatRoundMode rmode,
3493
int scale, float_status *s)
3494
{
3515
- FloatParts128 p;
3516
-
3517
- float128_unpack_canonical(&p, a, s);
3495
+ FloatParts128 p = float128_unpack_canonical(a, s);
3496
return parts128_float_to_uint(&p, rmode, scale, UINT32_MAX, s);
3497
}
3498
3499
static uint64_t float128_to_uint64_scalbn(float128 a, FloatRoundMode rmode,
3500
int scale, float_status *s)
3501
{
3524
- FloatParts128 p;
3525
-
3526
- float128_unpack_canonical(&p, a, s);
3502
+ FloatParts128 p = float128_unpack_canonical(a, s);
3503
return parts128_float_to_uint(&p, rmode, scale, UINT64_MAX, s);
3504
}
3505
@@ -3532,9 +3508,7 @@ static Int128 float128_to_uint128_scalbn(float128 a, FloatRoundMode rmode,
3508
{
3509
int flags = 0;
3510
Int128 r;
3535
- FloatParts128 p;
3536
-
3537
- float128_unpack_canonical(&p, a, s);
3511
+ FloatParts128 p = float128_unpack_canonical(a, s);
3512
3513
switch (p.cls) {
3514
case float_class_snan:
@@ -4210,11 +4184,9 @@ static float64 float64_minmax(float64 a, float64 b, float_status *s, int flags)
4184
static float128 float128_minmax(float128 a, float128 b,
4185
float_status *s, int flags)
4186
{
4213
- FloatParts128 pa, pb, *pr;
4214
-
4215
- float128_unpack_canonical(&pa, a, s);
4216
- float128_unpack_canonical(&pb, b, s);
4217
- pr = parts128_minmax(&pa, &pb, s, flags);
4187
+ FloatParts128 pa = float128_unpack_canonical(a, s);
4188
+ FloatParts128 pb = float128_unpack_canonical(b, s);
4189
+ FloatParts128 *pr = parts128_minmax(&pa, &pb, s, flags);
4190
4191
return float128_round_pack_canonical(pr, s);
4192
}
@@ -4393,10 +4365,9 @@ FloatRelation bfloat16_compare_quiet(bfloat16 a, bfloat16 b, float_status *s)
4365
static FloatRelation QEMU_FLATTEN
4366
float128_do_compare(float128 a, float128 b, float_status *s, bool is_quiet)
4367
{
4396
- FloatParts128 pa, pb;
4368
+ FloatParts128 pa = float128_unpack_canonical(a, s);
4369
+ FloatParts128 pb = float128_unpack_canonical(b, s);
4370
4398
- float128_unpack_canonical(&pa, a, s);
4399
- float128_unpack_canonical(&pb, b, s);
4371
return parts128_compare(&pa, &pb, s, is_quiet);
4372
}
4373
@@ -4470,9 +4441,8 @@ bfloat16 bfloat16_scalbn(bfloat16 a, int n, float_status *status)
4441
4442
float128 float128_scalbn(float128 a, int n, float_status *status)
4443
{
4473
- FloatParts128 p;
4444
+ FloatParts128 p = float128_unpack_canonical(a, status);
4445
4475
- float128_unpack_canonical(&p, a, status);
4446
parts128_scalbn(&p, n, status);
4447
return float128_round_pack_canonical(&p, status);
4448
}
@@ -4590,9 +4560,8 @@ bfloat16 QEMU_FLATTEN bfloat16_sqrt(bfloat16 a, float_status *status)
4560
4561
float128 QEMU_FLATTEN float128_sqrt(float128 a, float_status *status)
4562
{
4593
- FloatParts128 p;
4563
+ FloatParts128 p = float128_unpack_canonical(a, status);
4564
4595
- float128_unpack_canonical(&p, a, status);
4565
parts128_sqrt(&p, status, &float128_params);
4566
return float128_round_pack_canonical(&p, status);
4567
}