@samitouri / QOSamiQemu / commits / 2f0d5f872d

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

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 25, 2026 at 23:41 UTC 2f0d5f872d4a4dd93123d5834bd32c3770a22a8b
3 files changed +31 -14
fpu/softfloat-parts.c.inc
+10 -7
@@ -1255,24 +1255,27 @@ static bool partsN(round_to_int_normal)(FloatPartsN *a, FloatRoundMode rmode,
1255 return true;
1256 }
1257
1258 -static void partsN(round_to_int)(FloatPartsN *a, FloatRoundMode rmode,
1258 +FloatPartsN partsN(round_to_int)(const FloatPartsN *a,
1259 + FloatRoundMode rmode,
1260 int scale, float_status *s,
1261 const FloatFmt *fmt)
1262 {
1263 switch (a->cls) {
1264 case float_class_qnan:
1265 case float_class_snan:
1265 - *a = partsN(return_nan)(a, s);
1266 - break;
1266 + return partsN(return_nan)(a, s);
1267 case float_class_zero:
1268 case float_class_inf:
1269 - break;
1269 + return *a;
1270 case float_class_normal:
1271 case float_class_denormal:
1272 - if (partsN(round_to_int_normal)(a, rmode, scale, fmt->frac_size)) {
1273 - float_raise(float_flag_inexact, s);
1272 + {
1273 + FloatPartsN r = *a;
1274 + if (partsN(round_to_int_normal)(&r, rmode, scale, fmt->frac_size)) {
1275 + float_raise(float_flag_inexact, s);
1276 + }
1277 + return r;
1278 }
1275 - break;
1279 default:
1280 g_assert_not_reached();
1281 }
fpu/softfloat.c
+12 -7
@@ -2738,7 +2738,8 @@ float16 float16_round_to_int(float16 a, float_status *s)
2738 {
2739 FloatParts64 p = float16_unpack_canonical(a, s);
2740
2741 - parts64_round_to_int(&p, s->float_rounding_mode, 0, s, &float16_params);
2741 + p = parts64_round_to_int(&p, s->float_rounding_mode, 0, s,
2742 + &float16_params);
2743 return float16_round_pack_canonical(&p, s);
2744 }
2745
@@ -2746,7 +2747,8 @@ float32 float32_round_to_int(float32 a, float_status *s)
2747 {
2748 FloatParts64 p = float32_unpack_canonical(a, s);
2749
2749 - parts64_round_to_int(&p, s->float_rounding_mode, 0, s, &float32_params);
2750 + p = parts64_round_to_int(&p, s->float_rounding_mode, 0, s,
2751 + &float32_params);
2752 return float32_round_pack_canonical(&p, s);
2753 }
2754
@@ -2754,7 +2756,8 @@ float64 float64_round_to_int(float64 a, float_status *s)
2756 {
2757 FloatParts64 p = float64_unpack_canonical(a, s);
2758
2757 - parts64_round_to_int(&p, s->float_rounding_mode, 0, s, &float64_params);
2759 + p = parts64_round_to_int(&p, s->float_rounding_mode, 0, s,
2760 + &float64_params);
2761 return float64_round_pack_canonical(&p, s);
2762 }
2763
@@ -2762,7 +2765,8 @@ bfloat16 bfloat16_round_to_int(bfloat16 a, float_status *s)
2765 {
2766 FloatParts64 p = bfloat16_unpack_canonical(a, s);
2767
2765 - parts64_round_to_int(&p, s->float_rounding_mode, 0, s, &bfloat16_params);
2768 + p = parts64_round_to_int(&p, s->float_rounding_mode, 0, s,
2769 + &bfloat16_params);
2770 return bfloat16_round_pack_canonical(&p, s);
2771 }
2772
@@ -2770,7 +2774,8 @@ float128 float128_round_to_int(float128 a, float_status *s)
2774 {
2775 FloatParts128 p = float128_unpack_canonical(a, s);
2776
2773 - parts128_round_to_int(&p, s->float_rounding_mode, 0, s, &float128_params);
2777 + p = parts128_round_to_int(&p, s->float_rounding_mode, 0, s,
2778 + &float128_params);
2779 return float128_round_pack_canonical(&p, s);
2780 }
2781
@@ -2782,8 +2787,8 @@ floatx80 floatx80_round_to_int(floatx80 a, float_status *status)
2787 return floatx80_default_nan(status);
2788 }
2789
2785 - parts128_round_to_int(&p, status->float_rounding_mode, 0, status,
2786 - &floatx80_params[status->floatx80_rounding_precision]);
2790 + p = parts128_round_to_int(&p, status->float_rounding_mode, 0, status,
2791 + &floatx80_params[status->floatx80_rounding_precision]);
2792 return floatx80_round_pack_canonical(&p, status);
2793 }
2794
include/fpu/softfloat-parts.h
+9
@@ -172,4 +172,13 @@ FloatParts64 parts64_div(const FloatParts64 *a, const FloatParts64 *b,
172 FloatParts128 parts128_div(const FloatParts128 *a, const FloatParts128 *b,
173 float_status *s);
174
175 +FloatParts64 parts64_round_to_int(const FloatParts64 *a,
176 + FloatRoundMode rmode,
177 + int scale, float_status *s,
178 + const FloatFmt *fmt);
179 +FloatParts128 parts128_round_to_int(const FloatParts128 *a,
180 + FloatRoundMode rmode,
181 + int scale, float_status *s,
182 + const FloatFmt *fmt);
183 +
184 #endif