@samitouri / QOSamiQemu / commits / 6dd088168b

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 }