@samitouri / QOSamiQemu / commits / b4bd7b495f

fpu: Return struct from bfloat16_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:09 UTC b4bd7b495f3f925a2b7598fd1819349b30775dac
1 file changed +37 -71
fpu/softfloat.c
+37 -71
@@ -1482,11 +1482,11 @@ static FloatParts64 float16_unpack_canonical(float16 f, float_status *s)
1482 return float16a_unpack_canonical(f, s, &float16_params);
1483 }
1484
1485 -static void bfloat16_unpack_canonical(FloatParts64 *p, bfloat16 f,
1486 - float_status *s)
1485 +static FloatParts64 bfloat16_unpack_canonical(bfloat16 f, float_status *s)
1486 {
1488 - *p = unpack_raw64(&bfloat16_params, f);
1489 - parts64_canonicalize(p, s, &bfloat16_params);
1487 + FloatParts64 p = unpack_raw64(&bfloat16_params, f);
1488 + parts64_canonicalize(&p, s, &bfloat16_params);
1489 + return p;
1490 }
1491
1492 static float8_e4m3 float8_e4m3_round_pack_canonical(FloatParts64 *p,
@@ -1873,11 +1873,9 @@ float64 float64r32_sub(float64 a, float64 b, float_status *status)
1873 static bfloat16 QEMU_FLATTEN
1874 bfloat16_addsub(bfloat16 a, bfloat16 b, float_status *status, bool subtract)
1875 {
1876 - FloatParts64 pa, pb, *pr;
1877 -
1878 - bfloat16_unpack_canonical(&pa, a, status);
1879 - bfloat16_unpack_canonical(&pb, b, status);
1880 - pr = parts64_addsub(&pa, &pb, status, subtract);
1876 + FloatParts64 pa = bfloat16_unpack_canonical(a, status);
1877 + FloatParts64 pb = bfloat16_unpack_canonical(b, status);
1878 + FloatParts64 *pr = parts64_addsub(&pa, &pb, status, subtract);
1879
1880 return bfloat16_round_pack_canonical(pr, status);
1881 }
@@ -2013,11 +2011,9 @@ float64 float64r32_mul(float64 a, float64 b, float_status *status)
2011 bfloat16 QEMU_FLATTEN
2012 bfloat16_mul(bfloat16 a, bfloat16 b, float_status *status)
2013 {
2016 - FloatParts64 pa, pb, *pr;
2017 -
2018 - bfloat16_unpack_canonical(&pa, a, status);
2019 - bfloat16_unpack_canonical(&pb, b, status);
2020 - pr = parts64_mul(&pa, &pb, status);
2014 + FloatParts64 pa = bfloat16_unpack_canonical(a, status);
2015 + FloatParts64 pb = bfloat16_unpack_canonical(b, status);
2016 + FloatParts64 *pr = parts64_mul(&pa, &pb, status);
2017
2018 return bfloat16_round_pack_canonical(pr, status);
2019 }
@@ -2276,12 +2272,10 @@ float64 float64r32_muladd(float64 a, float64 b, float64 c,
2272 bfloat16 QEMU_FLATTEN bfloat16_muladd(bfloat16 a, bfloat16 b, bfloat16 c,
2273 int flags, float_status *status)
2274 {
2279 - FloatParts64 pa, pb, pc, *pr;
2280 -
2281 - bfloat16_unpack_canonical(&pa, a, status);
2282 - bfloat16_unpack_canonical(&pb, b, status);
2283 - bfloat16_unpack_canonical(&pc, c, status);
2284 - pr = parts64_muladd_scalbn(&pa, &pb, &pc, 0, flags, status);
2275 + FloatParts64 pa = bfloat16_unpack_canonical(a, status);
2276 + FloatParts64 pb = bfloat16_unpack_canonical(b, status);
2277 + FloatParts64 pc = bfloat16_unpack_canonical(c, status);
2278 + FloatParts64 *pr = parts64_muladd_scalbn(&pa, &pb, &pc, 0, flags, status);
2279
2280 /* Round before applying negate result. */
2281 parts64_uncanon(pr, status, &bfloat16_params, false);
@@ -2418,11 +2412,9 @@ float64 float64r32_div(float64 a, float64 b, float_status *status)
2412 bfloat16 QEMU_FLATTEN
2413 bfloat16_div(bfloat16 a, bfloat16 b, float_status *status)
2414 {
2421 - FloatParts64 pa, pb, *pr;
2422 -
2423 - bfloat16_unpack_canonical(&pa, a, status);
2424 - bfloat16_unpack_canonical(&pb, b, status);
2425 - pr = parts64_div(&pa, &pb, status);
2415 + FloatParts64 pa = bfloat16_unpack_canonical(a, status);
2416 + FloatParts64 pb = bfloat16_unpack_canonical(b, status);
2417 + FloatParts64 *pr = parts64_div(&pa, &pb, status);
2418
2419 return bfloat16_round_pack_canonical(pr, status);
2420 }
@@ -2791,36 +2783,32 @@ float32 float64_to_float32(float64 a, float_status *s)
2783
2784 float8_e4m3 bfloat16_to_float8_e4m3(bfloat16 a, bool saturate, float_status *s)
2785 {
2794 - FloatParts64 p;
2786 + FloatParts64 p = bfloat16_unpack_canonical(a, s);
2787
2796 - bfloat16_unpack_canonical(&p, a, s);
2788 parts64_float_to_float(&p, s);
2789 return float8_e4m3_round_pack_canonical(&p, s, saturate);
2790 }
2791
2792 float8_e5m2 bfloat16_to_float8_e5m2(bfloat16 a, bool saturate, float_status *s)
2793 {
2803 - FloatParts64 p;
2794 + FloatParts64 p = bfloat16_unpack_canonical(a, s);
2795
2805 - bfloat16_unpack_canonical(&p, a, s);
2796 parts_float_to_e5m2(&p, s, saturate);
2797 return float8_e5m2_round_pack_canonical(&p, s, saturate);
2798 }
2799
2800 float32 bfloat16_to_float32(bfloat16 a, float_status *s)
2801 {
2812 - FloatParts64 p;
2802 + FloatParts64 p = bfloat16_unpack_canonical(a, s);
2803
2814 - bfloat16_unpack_canonical(&p, a, s);
2804 parts64_float_to_float(&p, s);
2805 return float32_round_pack_canonical(&p, s);
2806 }
2807
2808 float64 bfloat16_to_float64(bfloat16 a, float_status *s)
2809 {
2821 - FloatParts64 p;
2810 + FloatParts64 p = bfloat16_unpack_canonical(a, s);
2811
2823 - bfloat16_unpack_canonical(&p, a, s);
2812 parts64_float_to_float(&p, s);
2813 return float64_round_pack_canonical(&p, s);
2814 }
@@ -2982,9 +2970,8 @@ float64 float64_round_to_int(float64 a, float_status *s)
2970
2971 bfloat16 bfloat16_round_to_int(bfloat16 a, float_status *s)
2972 {
2985 - FloatParts64 p;
2973 + FloatParts64 p = bfloat16_unpack_canonical(a, s);
2974
2987 - bfloat16_unpack_canonical(&p, a, s);
2975 parts64_round_to_int(&p, s->float_rounding_mode, 0, s, &bfloat16_params);
2976 return bfloat16_round_pack_canonical(&p, s);
2977 }
@@ -3100,36 +3087,28 @@ int64_t float64_to_int64_scalbn(float64 a, FloatRoundMode rmode, int scale,
3087 int8_t bfloat16_to_int8_scalbn(bfloat16 a, FloatRoundMode rmode, int scale,
3088 float_status *s)
3089 {
3103 - FloatParts64 p;
3104 -
3105 - bfloat16_unpack_canonical(&p, a, s);
3090 + FloatParts64 p = bfloat16_unpack_canonical(a, s);
3091 return parts64_float_to_sint(&p, rmode, scale, INT8_MIN, INT8_MAX, s);
3092 }
3093
3094 int16_t bfloat16_to_int16_scalbn(bfloat16 a, FloatRoundMode rmode, int scale,
3095 float_status *s)
3096 {
3112 - FloatParts64 p;
3113 -
3114 - bfloat16_unpack_canonical(&p, a, s);
3097 + FloatParts64 p = bfloat16_unpack_canonical(a, s);
3098 return parts64_float_to_sint(&p, rmode, scale, INT16_MIN, INT16_MAX, s);
3099 }
3100
3101 int32_t bfloat16_to_int32_scalbn(bfloat16 a, FloatRoundMode rmode, int scale,
3102 float_status *s)
3103 {
3121 - FloatParts64 p;
3122 -
3123 - bfloat16_unpack_canonical(&p, a, s);
3104 + FloatParts64 p = bfloat16_unpack_canonical(a, s);
3105 return parts64_float_to_sint(&p, rmode, scale, INT32_MIN, INT32_MAX, s);
3106 }
3107
3108 int64_t bfloat16_to_int64_scalbn(bfloat16 a, FloatRoundMode rmode, int scale,
3109 float_status *s)
3110 {
3130 - FloatParts64 p;
3131 -
3132 - bfloat16_unpack_canonical(&p, a, s);
3111 + FloatParts64 p = bfloat16_unpack_canonical(a, s);
3112 return parts64_float_to_sint(&p, rmode, scale, INT64_MIN, INT64_MAX, s);
3113 }
3114
@@ -3590,36 +3569,28 @@ uint64_t float64_to_uint64_scalbn(float64 a, FloatRoundMode rmode, int scale,
3569 uint8_t bfloat16_to_uint8_scalbn(bfloat16 a, FloatRoundMode rmode,
3570 int scale, float_status *s)
3571 {
3593 - FloatParts64 p;
3594 -
3595 - bfloat16_unpack_canonical(&p, a, s);
3572 + FloatParts64 p = bfloat16_unpack_canonical(a, s);
3573 return parts64_float_to_uint(&p, rmode, scale, UINT8_MAX, s);
3574 }
3575
3576 uint16_t bfloat16_to_uint16_scalbn(bfloat16 a, FloatRoundMode rmode,
3577 int scale, float_status *s)
3578 {
3602 - FloatParts64 p;
3603 -
3604 - bfloat16_unpack_canonical(&p, a, s);
3579 + FloatParts64 p = bfloat16_unpack_canonical(a, s);
3580 return parts64_float_to_uint(&p, rmode, scale, UINT16_MAX, s);
3581 }
3582
3583 uint32_t bfloat16_to_uint32_scalbn(bfloat16 a, FloatRoundMode rmode,
3584 int scale, float_status *s)
3585 {
3611 - FloatParts64 p;
3612 -
3613 - bfloat16_unpack_canonical(&p, a, s);
3586 + FloatParts64 p = bfloat16_unpack_canonical(a, s);
3587 return parts64_float_to_uint(&p, rmode, scale, UINT32_MAX, s);
3588 }
3589
3590 uint64_t bfloat16_to_uint64_scalbn(bfloat16 a, FloatRoundMode rmode,
3591 int scale, float_status *s)
3592 {
3620 - FloatParts64 p;
3621 -
3622 - bfloat16_unpack_canonical(&p, a, s);
3593 + FloatParts64 p = bfloat16_unpack_canonical(a, s);
3594 return parts64_float_to_uint(&p, rmode, scale, UINT64_MAX, s);
3595 }
3596
@@ -4296,11 +4267,9 @@ static float16 float16_minmax(float16 a, float16 b, float_status *s, int flags)
4267 static bfloat16 bfloat16_minmax(bfloat16 a, bfloat16 b,
4268 float_status *s, int flags)
4269 {
4299 - FloatParts64 pa, pb, *pr;
4300 -
4301 - bfloat16_unpack_canonical(&pa, a, s);
4302 - bfloat16_unpack_canonical(&pb, b, s);
4303 - pr = parts64_minmax(&pa, &pb, s, flags);
4270 + FloatParts64 pa = bfloat16_unpack_canonical(a, s);
4271 + FloatParts64 pb = bfloat16_unpack_canonical(b, s);
4272 + FloatParts64 *pr = parts64_minmax(&pa, &pb, s, flags);
4273
4274 return bfloat16_round_pack_canonical(pr, s);
4275 }
@@ -4496,10 +4465,9 @@ FloatRelation float64_compare_quiet(float64 a, float64 b, float_status *s)
4465 static FloatRelation QEMU_FLATTEN
4466 bfloat16_do_compare(bfloat16 a, bfloat16 b, float_status *s, bool is_quiet)
4467 {
4499 - FloatParts64 pa, pb;
4468 + FloatParts64 pa = bfloat16_unpack_canonical(a, s);
4469 + FloatParts64 pb = bfloat16_unpack_canonical(b, s);
4470
4501 - bfloat16_unpack_canonical(&pa, a, s);
4502 - bfloat16_unpack_canonical(&pb, b, s);
4471 return parts64_compare(&pa, &pb, s, is_quiet);
4472 }
4473
@@ -4587,9 +4555,8 @@ float64 float64_scalbn(float64 a, int n, float_status *status)
4555
4556 bfloat16 bfloat16_scalbn(bfloat16 a, int n, float_status *status)
4557 {
4590 - FloatParts64 p;
4558 + FloatParts64 p = bfloat16_unpack_canonical(a, status);
4559
4592 - bfloat16_unpack_canonical(&p, a, status);
4560 parts64_scalbn(&p, n, status);
4561 return bfloat16_round_pack_canonical(&p, status);
4562 }
@@ -4711,9 +4678,8 @@ float64 float64r32_sqrt(float64 a, float_status *status)
4678
4679 bfloat16 QEMU_FLATTEN bfloat16_sqrt(bfloat16 a, float_status *status)
4680 {
4714 - FloatParts64 p;
4681 + FloatParts64 p = bfloat16_unpack_canonical(a, status);
4682
4716 - bfloat16_unpack_canonical(&p, a, status);
4683 parts64_sqrt(&p, status, &bfloat16_params);
4684 return bfloat16_round_pack_canonical(&p, status);
4685 }