Commit Graph

115 Commits

Author SHA1 Message Date
Richard Henderson
128413ac6d fpu: Handle all rounding modes in partsN_round_to_int_normal
Missed float_round_nearest_even_max and float_round_to_odd_inf
in both switch statements.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
Message-id: 20260608190155.637067-3-richard.henderson@linaro.org
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
2026-06-10 16:54:40 +01:00
Richard Henderson
a6a1f92d5a fpu: Handle all rounding modes in partsN_uncanon_normal
Missed float_round_nearest_even_max when recomputing round.

CC: qemu-stable@nongnu.org
Fixes: 72330260cd ("softfloat: Add float_round_nearest_even_max")
Reported-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
Message-id: 20260608190155.637067-2-richard.henderson@linaro.org
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
2026-06-10 16:54:40 +01:00
Richard Henderson
512f5147c8 fpu: Export floatN_minmax
Allow target access to routines using the minmax flags.
Make the existing min/max wrappers inline.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-22 11:21:37 -07:00
Richard Henderson
ea79f8bac1 fpu: Fix NaN encoding for E4M3 in parts64_uncanon
There is only one NaN fractional encoding for E4M3.  Retain the
incoming sign, but force the outgoing fraction to the unique value.

Reported-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-22 11:21:33 -07:00
Richard Henderson
41044b5475 fpu: Introduce float_status.e4m3_nan_is_snan
Introduce a separate control from float_snan_rule
that applies only to the OCP E4M3 format.

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-21 19:18:56 -07:00
Richard Henderson
bffa0bd6af fpu: Add accessors for rebias_{underflow,overflow}
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-21 19:18:56 -07:00
Richard Henderson
04281c6e7b fpu: Use get_default_nan_mode everywhere
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-21 19:18:56 -07:00
Richard Henderson
6967da87c6 fpu: Use {get,set}_flush_inputs_to_zero everywhere
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-21 19:18:56 -07:00
Richard Henderson
0dea2bdd4b fpu: Use accessors for ftz_before_rounding
Drop FloatFTZDetection and use #defines, like we do for
tininess_before_rounding.  Rename get_float_ftz_detection
to get_ftz_before_rounding and move to softfloat.c, as
there are no external users.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-21 19:18:56 -07:00
Richard Henderson
86686309f1 fpu: Use {get,set}_flush_to_zero everywhere
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-21 19:18:56 -07:00
Richard Henderson
1126ebe189 fpu: Use accessors for tininess_before_rounding
Rename get_float_detect_tininess to get_tininess_before_rounding
and move to softfloat.c, as there are no external users.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-21 19:18:56 -07:00
Richard Henderson
196242a0d9 fpu: Use get_float_infzeronan_rule in partsN_pick_nan_muladd
Deduplicate the uses to a local variable.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-21 19:18:56 -07:00
Richard Henderson
0e8537cac6 fpu: Use get_float_3nan_prop_rule in partsN_pick_nan_muladd
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-21 19:18:56 -07:00
Richard Henderson
cea008a001 fpu: Use get_float_2nan_prop_rule in partsN_pick_nan
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-21 19:18:56 -07:00
Richard Henderson
87ab6f0ae8 fpu: Use get_floatx80_behaviour everywhere
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-21 19:18:56 -07:00
Richard Henderson
c26e4876d1 fpu: Use {get,set}_float_rounding_mode everywhere
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-21 19:18:56 -07:00
Richard Henderson
a9717332d7 fpu: Introduce FloatExceptionFlags
We have, in the past, used any of uint8_t, uint16_t or int
to hold the set of exception flags.  Use a typedef instead.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-21 19:18:56 -07:00
Richard Henderson
3ce572aa8d fpu: Introduce exp_scalbn
Avoid exponent overflow as well as checking that we don't lose information with
opposing scaling.  Use it in partsN(scalbn) and partsN(round_to_int_normal).

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-21 19:18:56 -07:00
Richard Henderson
b98004ed00 fpu: Simplify 0 +/- N case in parts_addsub
Consolidate the tests for zero and anynorm.
Add comments for a few cases.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-21 19:18:56 -07:00
Richard Henderson
af25a775c6 fpu: Hoist nan check in partsN_addsub
The nan test had been down below because it was unlikely.
But if we have to have one anyway because of denormals,
we might as well take care of them right away.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-21 19:18:56 -07:00
Richard Henderson
21da8ac79d fpu: Return struct from parts{64,128}_muladd
At the same time, export.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-21 19:18:56 -07:00
Richard Henderson
8b44b423ff fpu: Reorganize partsN(muladd)
Check the likely case of normal product and normal or
zero addend first; shift NaN and infinity detection down;
end with zero product + addend.

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-21 19:18:45 -07:00
Richard Henderson
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>
2026-05-21 19:18:45 -07:00
Richard Henderson
24b46e7bb7 fpu: Return struct from parts{64,128}_addsub
At the same time, export.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-07 10:16:56 -05:00
Richard Henderson
e007622768 fpu: Return struct from parts{64,128}_mul
At the same time, export.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-07 09:56:45 -05:00
Richard Henderson
b8b683af59 fpu: Export parts{64,128}_compare
At the same time, constify the inputs.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-07 09:51:58 -05:00
Richard Henderson
1f5d3cebf0 fpu: Split scalbn from partsN(muladd_scalbn)
Handle the scaling separately with parts64_scalbn.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-07 09:41:38 -05:00
Richard Henderson
333a9d621f fpu: Introduce record_denormals_used
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-07 09:41:38 -05:00
Richard Henderson
0743fd1a0b fpu: Return struct from parts{64,128}_pick_nan_muladd
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-07 09:41:38 -05:00
Richard Henderson
e63e64b528 fpu: Export default_nan, pick_nan, return_nan routines
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-07 09:41:37 -05:00
Richard Henderson
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>
2026-05-07 09:41:37 -05:00
Richard Henderson
4d91aa8f77 fpu: Return struct from parts{64,128}_div
At the same time, export.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-07 09:41:37 -05:00
Richard Henderson
bf6efdb944 fpu: Return struct from parts{64,128}_pick_nan
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-07 09:41:37 -05:00
Richard Henderson
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>
2026-05-07 09:41:37 -05:00
Richard Henderson
c5c5828f7f fpu: Return struct from parts{64,128}_silence_nan
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-07 09:41:37 -05:00
Richard Henderson
8fb0b7c6e3 fpu: Return struct from parts{64,128}_default_nan
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-07 09:41:37 -05:00
Richard Henderson
76de9bde8c fpu: Drop FRAC_GENERIC_64_128{_256}
This requires more complexity to handle const selectors, and
an indirection macro for each function.  Easier to just use
the preprocessor.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-04-30 08:07:42 +10:00
Richard Henderson
d2a727e347 fpu: Drop parts_log2
Use parts64_log2 at each call site.

That leaves parts128_log2 unused, so move the whole function back
to softfloat.c and specialize for FloatParts64.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-04-30 08:07:30 +10:00
Richard Henderson
782a381555 fpu: Drop parts_sint_to_float
Use parts{64,128}_sint_to_float at each call site.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-04-30 08:07:30 +10:00
Richard Henderson
a5fa1381ad fpu: Drop parts_float_to_sint_modulo
Use parts64_float_to_sint_modulo at each call site.

That leaves parts128_float_to_sint_modulo unused,
so move the whole function back to softfloat.c and
specialize for FloatParts64.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-04-30 08:06:59 +10:00
Richard Henderson
80fda2c761 fpu: Drop parts_round_to_int_normal
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-04-30 08:06:59 +10:00
Richard Henderson
161a5e07dd fpu: Drop parts_{add,sub}_normal
Drop the forward declarations and the _Generic macros.
Add partsW() for use by muladd_scalbn.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-04-30 08:06:46 +10:00
Richard Henderson
ace4410d55 fpu: Drop parts_pick_nan_muladd
Use partsN() at the only call site.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-04-30 08:06:46 +10:00
Richard Henderson
456e18911a fpu: Drop parts_pick_nan
Use parts{64,128}_pick_nan at each call site.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-04-30 08:06:46 +10:00
Richard Henderson
96362bd2d1 fpu: Drop parts_return_nan
Use parts{64,128}_return_nan at each call site.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-04-30 08:06:46 +10:00
Richard Henderson
8c030be798 fpu: Drop parts_silence_nan
Use parts{64,128}_silence_nan at each call site.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-04-30 08:06:46 +10:00
Richard Henderson
3259530107 fpu: Drop parts_default_nan
Use parts{64,128}_default_nan at each call site.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-04-30 08:06:46 +10:00
Richard Henderson
39caf648d9 fpu: Drop parts_uncanon_normal
Use partsN(uncanon_normal) at the single call site.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-04-30 08:06:46 +10:00
Max Chou
9d090fe440 fpu: Fix unexpected exception flags when converting infinity to OCP E4M3
Infinity is a special case distinct from numeric overflow:
- Numeric overflow: finite value exceeds format's max normal
  -> overflow|inexact
- Infinity conversion: input is already infinite
  -> no flags

This commit fixes the unexpect exception flags by relocating the float
exception flag update flow to be outside the uncanon_e4m3_overflow.
And raising the overflow|inexact for numeric overflow in uncanon_normal.

Fixes: 27e989f99c ("fpu: Add conversion routines for OCP FP8 E4M3")
Reviewed-by: Chao Liu <chao.liu.zevorn@gmail.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Max Chou <max.chou@sifive.com>
Message-ID: <20260226071817.1417875-3-max.chou@sifive.com>
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
2026-03-19 14:39:55 +10:00
Max Chou
053e913aad fpu: Fix repacking issues in the uncanonical step for E4M3 overflow
In the uncanonical step, the input FloatParts will be repacked to the
target FloatFmt. This commit fixes following issues after calling
uncanon_e4m3_overflow in the uncanon/uncanon_normal functions.

- Add the local exp update after calling uncanon_e4m3_overflow in the
  parts_uncanon_normal function.
- Add the fraction shift after calling uncanon_e4m3_overflow in the
  parts_uncanon function.

Fixes: 27e989f99c ("fpu: Add conversion routines for OCP FP8 E4M3")
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Chao Liu <chao.liu.zevorn@gmail.com>
Signed-off-by: Max Chou <max.chou@sifive.com>
Message-ID: <20260226071817.1417875-2-max.chou@sifive.com>
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
2026-03-19 14:38:12 +10:00