On Mon, Feb 23, 2026 at 07:21:50PM +1100, Richard Henderson wrote: > From: Max Chou <[email protected]> > > 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 <[email protected]> > [rth: Split out of a larger patch] > Signed-off-by: Richard Henderson <[email protected]> > --- > 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 <[email protected]> Thanks, Chao
