@samitouri / QOSamiQemu / commits / 343b206722

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

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:08 UTC 343b2067222da07a507a7f42a4be216e3f10af8e
2 files changed +15 -14
fpu/softfloat-parts.c.inc
+8 -7
@@ -15,25 +15,26 @@
15 * indicated otherwise.
16 */
17
18 -static void partsN(return_nan)(FloatPartsN *a, float_status *s)
18 +static FloatPartsN partsN(return_nan)(const FloatPartsN *a, float_status *s)
19 {
20 switch (a->cls) {
21 case float_class_snan:
22 float_raise(float_flag_invalid | float_flag_invalid_snan, s);
23 if (s->default_nan_mode) {
24 - *a = partsN(default_nan)(s);
24 + return partsN(default_nan)(s);
25 } else {
26 - *a = partsN(silence_nan)(a, s);
26 + return partsN(silence_nan)(a, s);
27 }
28 break;
29 case float_class_qnan:
30 if (s->default_nan_mode) {
31 - *a = partsN(default_nan)(s);
31 + return partsN(default_nan)(s);
32 }
33 break;
34 default:
35 g_assert_not_reached();
36 }
37 + return *a;
38 }
39
40 static FloatPartsN *partsN(pick_nan)(FloatPartsN *a, FloatPartsN *b,
@@ -941,7 +942,7 @@ static void partsN(sqrt)(FloatPartsN *a, float_status *status,
942 break;
943 case float_class_snan:
944 case float_class_qnan:
944 - partsN(return_nan)(a, status);
945 + *a = partsN(return_nan)(a, status);
946 return;
947 case float_class_zero:
948 return;
@@ -1263,7 +1264,7 @@ static void partsN(round_to_int)(FloatPartsN *a, FloatRoundMode rmode,
1264 switch (a->cls) {
1265 case float_class_qnan:
1266 case float_class_snan:
1266 - partsN(return_nan)(a, s);
1267 + *a = partsN(return_nan)(a, s);
1268 break;
1269 case float_class_zero:
1270 case float_class_inf:
@@ -1656,7 +1657,7 @@ static void partsN(scalbn)(FloatPartsN *a, int n, float_status *s)
1657 switch (a->cls) {
1658 case float_class_snan:
1659 case float_class_qnan:
1659 - partsN(return_nan)(a, s);
1660 + *a = partsN(return_nan)(a, s);
1661 break;
1662 case float_class_zero:
1663 case float_class_inf:
fpu/softfloat.c
+7 -7
@@ -2378,7 +2378,7 @@ static void parts_float_to_e5m2(FloatParts64 *a, float_status *s, bool saturate)
2378 switch (a->cls) {
2379 case float_class_snan:
2380 case float_class_qnan:
2381 - parts64_return_nan(a, s);
2381 + *a = parts64_return_nan(a, s);
2382 break;
2383
2384 case float_class_inf:
@@ -2405,7 +2405,7 @@ static void parts_float_to_e5m2(FloatParts64 *a, float_status *s, bool saturate)
2405 static void parts64_float_to_float(FloatParts64 *a, float_status *s)
2406 {
2407 if (is_nan(a->cls)) {
2408 - parts64_return_nan(a, s);
2408 + *a = parts64_return_nan(a, s);
2409 }
2410 if (a->cls == float_class_denormal) {
2411 float_raise(float_flag_input_denormal_used, s);
@@ -2415,7 +2415,7 @@ static void parts64_float_to_float(FloatParts64 *a, float_status *s)
2415 static void parts128_float_to_float(FloatParts128 *a, float_status *s)
2416 {
2417 if (is_nan(a->cls)) {
2418 - parts128_return_nan(a, s);
2418 + *a = parts128_return_nan(a, s);
2419 }
2420 if (a->cls == float_class_denormal) {
2421 float_raise(float_flag_input_denormal_used, s);
@@ -2441,7 +2441,7 @@ static FloatParts64 parts128_to_parts64(FloatParts128 *b, float_status *s)
2441 case float_class_qnan:
2442 /* Discard the low bits of the NaN. */
2443 r.frac = b->frac_hi;
2444 - parts64_return_nan(&r, s);
2444 + r = parts64_return_nan(&r, s);
2445 break;
2446 default:
2447 break;
@@ -2461,7 +2461,7 @@ static FloatParts128 parts64_to_parts128(FloatParts64 *b, float_status *s)
2461 switch (r.cls) {
2462 case float_class_qnan:
2463 case float_class_snan:
2464 - parts128_return_nan(&r, s);
2464 + r = parts128_return_nan(&r, s);
2465 break;
2466 case float_class_denormal:
2467 float_raise(float_flag_input_denormal_used, s);
@@ -4458,7 +4458,7 @@ static void parts64_log2(FloatParts64 *a, float_status *s, const FloatFmt *fmt)
4458 break;
4459 case float_class_snan:
4460 case float_class_qnan:
4461 - parts64_return_nan(a, s);
4461 + *a = parts64_return_nan(a, s);
4462 return;
4463 case float_class_zero:
4464 float_raise(float_flag_divbyzero, s);
@@ -5067,7 +5067,7 @@ float32 float32_exp2(float32 a, float_status *status)
5067 break;
5068 case float_class_snan:
5069 case float_class_qnan:
5070 - parts64_return_nan(&xp, status);
5070 + xp = parts64_return_nan(&xp, status);
5071 return float32_round_pack_canonical(&xp, status);
5072 case float_class_inf:
5073 return xp.sign ? float32_zero : a;