@samitouri / QOSamiQemu / commits / b5ac7f6827

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 }