598 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
eb2d6a7349 fpu: Use get_float_default_nan_pattern in partsN_default_nan
Move get_float_default_nan_pattern to softfloat-specialize.c.inc,
since 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
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
6ce98c8199 fpu: Use of {get,set}_floatx80_rounding_precision 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
acb6d59857 fpu: Introduce FloatSNaNRule
Merge snan_bit_is_one and no_signaling_nans into one control.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Tested-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
773911cd0e fpu: Introduce frac_msb_is_snan
Unify handling of the two snan parameters, letting the
caller simply extract the msb.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Tested-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
f0eb9fe01b target/s390x: Move float{32,64}_s390_divide_to_integer
Now that we've exposed enough infrastructure, this can be
implemented in the backend that needs it.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Ilya Leoshkevich <iii@linux.ibm.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-21 19:18:56 -07:00
Richard Henderson
fc68abb2a3 fpu: Use parts64_round_to_int in parts_s390_divide_to_integer
We will not expose parts_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
a93d477899 fpu: Drop QEMU_FLATTEN from muladd routines
The float16, bfloat16 and float128 paths are not so
important that they require forced optimization.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2026-05-09 10:50:01 -05: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
3d952d7cb5 fpu: Introduce parts64_round_to_fmt
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
558c92ed74 fpu: Sink exp_bias adjustment in float64r32_pack_raw
Share the float32->float64 bias adjustment from both
the normal and denormal paths.

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
5511af9044 fpu: Export unpack_canonical and round_pack_canonical routines
Export the unpacking and repacking into the various formats.

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
47f8b74ab1 fpu: Export FloatFmt structures
Export most of the FloatFmt structures.
Skip float16_params_ahp and the floatx80 precisions.

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
7a8bb2218a fpu: Split FloatParts{64,128} to softfloat-parts.h
Begin exposing the intermediate representation of softfloat.
Start with just the representation structures.

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
744d9e9c19 fpu: Mark pack_raw64 QEMU_ALWAYS_INLINE
This is almost always used with a constant FloatFmt,
so inlining pulls the constants into the shifts.

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
1d8c1b44d6 fpu: Mark unpack_raw64 QEMU_ALWAYS_INLINE
This is almost always used with a constant FloatFmt,
so inlining pulls the constants into the shifts.

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