On Mon, Feb 23, 2026 at 07:21:50PM +1100, Richard Henderson wrote:
> From: Max Chou <max.chou@sifive.com>
>
> ARM Alt HP raises different exceptions on overflow than is
> standard for IEEE when saturating a value. Add a flag to
> control this effect.
>
> Signed-off-by: Max Chou <max.chou@sifive.com>
> [rth: Split out of a larger patch]
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> fpu/softfloat.c | 6 +++++-
> fpu/softfloat-parts.c.inc | 4 +++-
> 2 files changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/fpu/softfloat.c b/fpu/softfloat.c
> index 8d8e576757..9d06a1bb59 100644
> --- a/fpu/softfloat.c
> +++ b/fpu/softfloat.c
> @@ -542,7 +542,9 @@ typedef enum __attribute__((__packed__)) {
> * The following optional modifiers are available:
> * exp_max_kind: affects how exp == exp_max is interpreted
> * has_explicit_bit: has an explicit integer bit; this affects whether
> - * the float_status floatx80_behaviour handling applies
> + * the float_status floatx80_behaviour handling applies
> + * overflow_raises_invalid: for float_expmax_normal, raise invalid
> + * instead of overflow.
> */
> typedef struct {
> int exp_size;
> @@ -553,6 +555,7 @@ typedef struct {
> int frac_shift;
> FloatFmtExpMaxKind exp_max_kind;
> bool has_explicit_bit;
> + bool overflow_raises_invalid;
> uint64_t round_mask;
> } FloatFmt;
>
> @@ -576,6 +579,7 @@ static const FloatFmt float16_params = {
> static const FloatFmt float16_params_ahp = {
> FLOAT_PARAMS(5, 10),
> .exp_max_kind = float_expmax_normal,
> + .overflow_raises_invalid = true,
> };
>
> static const FloatFmt bfloat16_params = {
> diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc
> index 455bbf281e..4909ff7418 100644
> --- a/fpu/softfloat-parts.c.inc
> +++ b/fpu/softfloat-parts.c.inc
> @@ -348,7 +348,9 @@ static void partsN(uncanon_normal)(FloatPartsN *p, float_status *s,
> case float_expmax_normal:
> if (unlikely(exp > exp_max)) {
> /* Overflow. Return the maximum normal. */
> - flags = float_flag_invalid;
> + flags = (fmt->overflow_raises_invalid
> + ? float_flag_invalid
> + : float_flag_overflow | float_flag_inexact);
> exp = exp_max;
> frac_allones(p);
> p->frac_lo &= ~round_mask;
> --
> 2.43.0
>
Reviewed-by: Chao Liu <chao.liu.zevorn@gmail.com>
Thanks,
Chao