On 2/25/26 22:08, Max Chou wrote:
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")
Signed-off-by: Max Chou <[email protected]>
---
  fpu/softfloat-parts.c.inc | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc
index a738758aee..3c323c0cec 100644
--- a/fpu/softfloat-parts.c.inc
+++ b/fpu/softfloat-parts.c.inc
@@ -277,7 +277,6 @@ static void partsN(uncanon_e4m3_overflow)(FloatPartsN *p, 
float_status *s,
                                            const FloatFmt *fmt, bool saturate)
  {
      assert(N == 64);
-    float_raise(float_flag_overflow | float_flag_inexact, s);
      if (saturate) {
          p->exp = fmt->exp_max;
          p->frac_hi = E4M3_NORMAL_FRAC_MAX;
@@ -388,6 +387,7 @@ static void partsN(uncanon_normal)(FloatPartsN *p, 
float_status *s,
                  if (exp > exp_max || p->frac_hi > E4M3_NORMAL_FRAC_MAX) {
                      partsN(uncanon_e4m3_overflow)(p, s, fmt, overflow_norm);
                      exp = p->exp;
+                    flags |= (float_flag_overflow | float_flag_inexact);
                  }
                  break;

Reviewed-by: Richard Henderson <[email protected]>

r~

Reply via email to