mirror of
https://github.com/qemu/qemu.git
synced 2026-04-05 22:00:58 +00:00
fpu: Fix unexpected exception flags when converting infinity to OCP E4M3
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")
Reviewed-by: Chao Liu <chao.liu.zevorn@gmail.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Max Chou <max.chou@sifive.com>
Message-ID: <20260226071817.1417875-3-max.chou@sifive.com>
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
committed by
Alistair Francis
parent
053e913aad
commit
9d090fe440
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user