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

Reply via email to