@samitouri / QOSamiQemu / commits / 5f36d09bf6

fpu: Return struct from parts{64,128}_scalbn

At the same time, export. Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

Richard Henderson committed Apr 28, 2026 at 17:03 UTC 5f36d09bf66c634fe18f63debe68b781cf77e9e8
3 files changed +20 -15
fpu/softfloat-parts.c.inc
+8 -6
@@ -1633,22 +1633,24 @@ FloatRelation partsN(compare)(const FloatPartsN *a, const FloatPartsN *b,
1633 /*
1634 * Multiply A by 2 raised to the power N.
1635 */
1636 -static void partsN(scalbn)(FloatPartsN *a, int n, float_status *s)
1636 +FloatPartsN partsN(scalbn)(const FloatPartsN *a, int n, float_status *s)
1637 {
1638 switch (a->cls) {
1639 case float_class_snan:
1640 case float_class_qnan:
1641 - *a = partsN(return_nan)(a, s);
1642 - break;
1641 + return partsN(return_nan)(a, s);
1642 case float_class_zero:
1643 case float_class_inf:
1645 - break;
1644 + return *a;
1645 case float_class_denormal:
1646 float_raise(float_flag_input_denormal_used, s);
1647 /* fall through */
1648 case float_class_normal:
1650 - a->exp += MIN(MAX(n, -0x10000), 0x10000);
1651 - break;
1649 + {
1650 + FloatPartsN r = *a;
1651 + r.exp += MIN(MAX(n, -0x10000), 0x10000);
1652 + return r;
1653 + }
1654 default:
1655 g_assert_not_reached();
1656 }
fpu/softfloat.c
+9 -9
@@ -1910,7 +1910,7 @@ float16 float16_muladd_scalbn(float16 a, float16 b, float16 c,
1910
1911 /* Before rounding, scale. */
1912 if (scale) {
1913 - parts64_scalbn(pr, scale, status);
1913 + *pr = parts64_scalbn(pr, scale, status);
1914 }
1915 parts64_uncanon(pr, status, &float16_params, false);
1916 /* After rounding, apply negate result, especially for -0.0. */
@@ -1937,7 +1937,7 @@ float32_muladd_scalbn(float32 a, float32 b, float32 c,
1937
1938 /* Before rounding, scale. */
1939 if (scale) {
1940 - parts64_scalbn(pr, scale, status);
1940 + *pr = parts64_scalbn(pr, scale, status);
1941 }
1942 parts64_uncanon(pr, status, &float32_params, false);
1943 /* After rounding, apply negate result, especially for -0.0. */
@@ -1958,7 +1958,7 @@ float64_muladd_scalbn(float64 a, float64 b, float64 c,
1958
1959 /* Before rounding, scale. */
1960 if (scale) {
1961 - parts64_scalbn(pr, scale, status);
1961 + *pr = parts64_scalbn(pr, scale, status);
1962 }
1963 parts64_uncanon(pr, status, &float64_params, false);
1964 /* After rounding, apply negate result, especially for -0.0. */
@@ -4312,7 +4312,7 @@ float16 float16_scalbn(float16 a, int n, float_status *status)
4312 {
4313 FloatParts64 p = float16_unpack_canonical(a, status);
4314
4315 - parts64_scalbn(&p, n, status);
4315 + p = parts64_scalbn(&p, n, status);
4316 return float16_round_pack_canonical(&p, status);
4317 }
4318
@@ -4320,7 +4320,7 @@ float32 float32_scalbn(float32 a, int n, float_status *status)
4320 {
4321 FloatParts64 p = float32_unpack_canonical(a, status);
4322
4323 - parts64_scalbn(&p, n, status);
4323 + p = parts64_scalbn(&p, n, status);
4324 return float32_round_pack_canonical(&p, status);
4325 }
4326
@@ -4328,7 +4328,7 @@ float64 float64_scalbn(float64 a, int n, float_status *status)
4328 {
4329 FloatParts64 p = float64_unpack_canonical(a, status);
4330
4331 - parts64_scalbn(&p, n, status);
4331 + p = parts64_scalbn(&p, n, status);
4332 return float64_round_pack_canonical(&p, status);
4333 }
4334
@@ -4336,7 +4336,7 @@ bfloat16 bfloat16_scalbn(bfloat16 a, int n, float_status *status)
4336 {
4337 FloatParts64 p = bfloat16_unpack_canonical(a, status);
4338
4339 - parts64_scalbn(&p, n, status);
4339 + p = parts64_scalbn(&p, n, status);
4340 return bfloat16_round_pack_canonical(&p, status);
4341 }
4342
@@ -4344,7 +4344,7 @@ float128 float128_scalbn(float128 a, int n, float_status *status)
4344 {
4345 FloatParts128 p = float128_unpack_canonical(a, status);
4346
4347 - parts128_scalbn(&p, n, status);
4347 + p = parts128_scalbn(&p, n, status);
4348 return float128_round_pack_canonical(&p, status);
4349 }
4350
@@ -4355,7 +4355,7 @@ floatx80 floatx80_scalbn(floatx80 a, int n, float_status *status)
4355 if (!floatx80_unpack_canonical(&p, a, status)) {
4356 return floatx80_default_nan(status);
4357 }
4358 - parts128_scalbn(&p, n, status);
4358 + p = parts128_scalbn(&p, n, status);
4359 return floatx80_round_pack_canonical(&p, status);
4360 }
4361
include/fpu/softfloat-parts.h
+3
@@ -214,4 +214,7 @@ FloatParts128 parts128_round_to_int(const FloatParts128 *a,
214 FloatParts64 parts64_round_to_fmt(const FloatParts64 *p, float_status *s,
215 const FloatFmt *fmt);
216
217 +FloatParts64 parts64_scalbn(const FloatParts64 *a, int n, float_status *s);
218 +FloatParts128 parts128_scalbn(const FloatParts128 *a, int n, float_status *s);
219 +
220 #endif