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