qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/4] target/i386: Emulate ftz and denormal flag bits correctly
@ 2025-02-13 14:26 Peter Maydell
  2025-02-13 14:26 ` [PATCH 1/4] target/i386: Detect flush-to-zero after rounding Peter Maydell
                   ` (4 more replies)
  0 siblings, 5 replies; 14+ messages in thread
From: Peter Maydell @ 2025-02-13 14:26 UTC (permalink / raw)
  To: qemu-devel; +Cc: Richard Henderson, Paolo Bonzini, Zhao Liu, Eduardo Habkost

This is a set of four patches to target/i386 which use the core
fpu functionality we just landed for Arm FEAT_AFP to correct
the emulation of some corner cases of x86 floating point:
 * when we are flushing denormal outputs to zero, this should
   be done after rounding, not before
 * the MXCSR.DE and FPUS.DE bits indicate when a denormal input
   was not flushed and was used in an fp operation; we previously
   weren't implementing these semantics

All four patches have been reviewed by RTH. Testing is a bit
light (make check-tcg and make check-functional), because AFAIK
there is no freely available comprehensive FP testsuite for x86,
and risu doesn't support x86 currently so I can't do the same kind
of random-instruction-testing I could for Arm.

thanks
-- PMM

Peter Maydell (4):
  target/i386: Detect flush-to-zero after rounding
  target/i386: Use correct type for get_float_exception_flags() values
  target/i386: Wire up MXCSR.DE and FPUS.DE correctly
  tests/tcg/x86_64/fma: add test for exact-denormal output

 target/i386/ops_sse.h        |  16 +++---
 target/i386/tcg/fpu_helper.c | 101 +++++++++++++++++------------------
 tests/tcg/x86_64/fma.c       |  17 ++++--
 3 files changed, 68 insertions(+), 66 deletions(-)

-- 
2.43.0



^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH 1/4] target/i386: Detect flush-to-zero after rounding
  2025-02-13 14:26 [PATCH 0/4] target/i386: Emulate ftz and denormal flag bits correctly Peter Maydell
@ 2025-02-13 14:26 ` Peter Maydell
  2025-05-07 13:10   ` Zhao Liu
  2025-02-13 14:26 ` [PATCH 2/4] target/i386: Use correct type for get_float_exception_flags() values Peter Maydell
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 14+ messages in thread
From: Peter Maydell @ 2025-02-13 14:26 UTC (permalink / raw)
  To: qemu-devel; +Cc: Richard Henderson, Paolo Bonzini, Zhao Liu, Eduardo Habkost

The Intel SDM section 10.2.3.3 on the MXCSR.FTZ bit says that we
flush outputs to zero when we detect underflow, which is after
rounding.  Set the detect_ftz flag accordingly.

This allows us to enable the test in fma.c which checks this
behaviour.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
 target/i386/tcg/fpu_helper.c | 8 ++++----
 tests/tcg/x86_64/fma.c       | 5 -----
 2 files changed, 4 insertions(+), 9 deletions(-)

diff --git a/target/i386/tcg/fpu_helper.c b/target/i386/tcg/fpu_helper.c
index f112c6c6737..87fbc149d84 100644
--- a/target/i386/tcg/fpu_helper.c
+++ b/target/i386/tcg/fpu_helper.c
@@ -189,13 +189,13 @@ void cpu_init_fp_statuses(CPUX86State *env)
     set_float_default_nan_pattern(0b11000000, &env->mmx_status);
     set_float_default_nan_pattern(0b11000000, &env->sse_status);
     /*
-     * TODO: x86 does flush-to-zero detection after rounding (the SDM
+     * x86 does flush-to-zero detection after rounding (the SDM
      * section 10.2.3.3 on the FTZ bit of MXCSR says that we flush
      * when we detect underflow, which x86 does after rounding).
      */
-    set_float_ftz_detection(float_ftz_before_rounding, &env->fp_status);
-    set_float_ftz_detection(float_ftz_before_rounding, &env->mmx_status);
-    set_float_ftz_detection(float_ftz_before_rounding, &env->sse_status);
+    set_float_ftz_detection(float_ftz_after_rounding, &env->fp_status);
+    set_float_ftz_detection(float_ftz_after_rounding, &env->mmx_status);
+    set_float_ftz_detection(float_ftz_after_rounding, &env->sse_status);
 }
 
 static inline uint8_t save_exception_flags(CPUX86State *env)
diff --git a/tests/tcg/x86_64/fma.c b/tests/tcg/x86_64/fma.c
index 09c622ebc00..46f863005ed 100644
--- a/tests/tcg/x86_64/fma.c
+++ b/tests/tcg/x86_64/fma.c
@@ -79,14 +79,9 @@ static testdata tests[] = {
     /*
      * Flushing of denormal outputs to zero should also happen after
      * rounding, so setting FTZ should not affect the result or the flags.
-     * QEMU currently does not emulate this correctly because we do the
-     * flush-to-zero check before rounding, so we incorrectly produce a
-     * zero result and set Underflow as well as Precision.
      */
-#ifdef ENABLE_FAILING_TESTS
     { 0x3fdfffffffffffff, 0x001fffffffffffff, 0x801fffffffffffff, true,
       0x8010000000000000, 0x20 }, /* Enabling FTZ shouldn't change flags */
-#endif
 };
 
 int main(void)
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 2/4] target/i386: Use correct type for get_float_exception_flags() values
  2025-02-13 14:26 [PATCH 0/4] target/i386: Emulate ftz and denormal flag bits correctly Peter Maydell
  2025-02-13 14:26 ` [PATCH 1/4] target/i386: Detect flush-to-zero after rounding Peter Maydell
@ 2025-02-13 14:26 ` Peter Maydell
  2025-02-13 15:18   ` Philippe Mathieu-Daudé
  2025-05-07 13:12   ` Zhao Liu
  2025-02-13 14:26 ` [PATCH 3/4] target/i386: Wire up MXCSR.DE and FPUS.DE correctly Peter Maydell
                   ` (2 subsequent siblings)
  4 siblings, 2 replies; 14+ messages in thread
From: Peter Maydell @ 2025-02-13 14:26 UTC (permalink / raw)
  To: qemu-devel; +Cc: Richard Henderson, Paolo Bonzini, Zhao Liu, Eduardo Habkost

The softfloat get_float_exception_flags() function returns 'int', but
in various places in target/i386 we incorrectly store the returned
value into a uint8_t.  This currently has no ill effects because i386
doesn't care about any of the float_flag enum values above 0x40.
However, we want to start using float_flag_input_denormal_used, which
is 0x4000.

Switch to using 'int' so that we can handle all the possible valid
float_flag_* values. This includes changing the return type of
save_exception_flags() and the argument to merge_exception_flags().

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
 target/i386/ops_sse.h        | 16 +++----
 target/i386/tcg/fpu_helper.c | 82 ++++++++++++++++++------------------
 2 files changed, 49 insertions(+), 49 deletions(-)

diff --git a/target/i386/ops_sse.h b/target/i386/ops_sse.h
index f0aa1894aa2..a2e4d480399 100644
--- a/target/i386/ops_sse.h
+++ b/target/i386/ops_sse.h
@@ -842,7 +842,7 @@ int64_t helper_cvttsd2sq(CPUX86State *env, ZMMReg *s)
 
 void glue(helper_rsqrtps, SUFFIX)(CPUX86State *env, ZMMReg *d, ZMMReg *s)
 {
-    uint8_t old_flags = get_float_exception_flags(&env->sse_status);
+    int old_flags = get_float_exception_flags(&env->sse_status);
     int i;
     for (i = 0; i < 2 << SHIFT; i++) {
         d->ZMM_S(i) = float32_div(float32_one,
@@ -855,7 +855,7 @@ void glue(helper_rsqrtps, SUFFIX)(CPUX86State *env, ZMMReg *d, ZMMReg *s)
 #if SHIFT == 1
 void helper_rsqrtss(CPUX86State *env, ZMMReg *d, ZMMReg *v, ZMMReg *s)
 {
-    uint8_t old_flags = get_float_exception_flags(&env->sse_status);
+    int old_flags = get_float_exception_flags(&env->sse_status);
     int i;
     d->ZMM_S(0) = float32_div(float32_one,
                               float32_sqrt(s->ZMM_S(0), &env->sse_status),
@@ -869,7 +869,7 @@ void helper_rsqrtss(CPUX86State *env, ZMMReg *d, ZMMReg *v, ZMMReg *s)
 
 void glue(helper_rcpps, SUFFIX)(CPUX86State *env, ZMMReg *d, ZMMReg *s)
 {
-    uint8_t old_flags = get_float_exception_flags(&env->sse_status);
+    int old_flags = get_float_exception_flags(&env->sse_status);
     int i;
     for (i = 0; i < 2 << SHIFT; i++) {
         d->ZMM_S(i) = float32_div(float32_one, s->ZMM_S(i), &env->sse_status);
@@ -880,7 +880,7 @@ void glue(helper_rcpps, SUFFIX)(CPUX86State *env, ZMMReg *d, ZMMReg *s)
 #if SHIFT == 1
 void helper_rcpss(CPUX86State *env, ZMMReg *d, ZMMReg *v, ZMMReg *s)
 {
-    uint8_t old_flags = get_float_exception_flags(&env->sse_status);
+    int old_flags = get_float_exception_flags(&env->sse_status);
     int i;
     d->ZMM_S(0) = float32_div(float32_one, s->ZMM_S(0), &env->sse_status);
     for (i = 1; i < 2 << SHIFT; i++) {
@@ -1714,7 +1714,7 @@ void glue(helper_phminposuw, SUFFIX)(CPUX86State *env, Reg *d, Reg *s)
 void glue(helper_roundps, SUFFIX)(CPUX86State *env, Reg *d, Reg *s,
                                   uint32_t mode)
 {
-    uint8_t old_flags = get_float_exception_flags(&env->sse_status);
+    int old_flags = get_float_exception_flags(&env->sse_status);
     signed char prev_rounding_mode;
     int i;
 
@@ -1738,7 +1738,7 @@ void glue(helper_roundps, SUFFIX)(CPUX86State *env, Reg *d, Reg *s,
 void glue(helper_roundpd, SUFFIX)(CPUX86State *env, Reg *d, Reg *s,
                                   uint32_t mode)
 {
-    uint8_t old_flags = get_float_exception_flags(&env->sse_status);
+    int old_flags = get_float_exception_flags(&env->sse_status);
     signed char prev_rounding_mode;
     int i;
 
@@ -1763,7 +1763,7 @@ void glue(helper_roundpd, SUFFIX)(CPUX86State *env, Reg *d, Reg *s,
 void glue(helper_roundss, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *s,
                                   uint32_t mode)
 {
-    uint8_t old_flags = get_float_exception_flags(&env->sse_status);
+    int old_flags = get_float_exception_flags(&env->sse_status);
     signed char prev_rounding_mode;
     int i;
 
@@ -1788,7 +1788,7 @@ void glue(helper_roundss, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *s,
 void glue(helper_roundsd, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *s,
                                   uint32_t mode)
 {
-    uint8_t old_flags = get_float_exception_flags(&env->sse_status);
+    int old_flags = get_float_exception_flags(&env->sse_status);
     signed char prev_rounding_mode;
     int i;
 
diff --git a/target/i386/tcg/fpu_helper.c b/target/i386/tcg/fpu_helper.c
index 87fbc149d84..cd965a1f582 100644
--- a/target/i386/tcg/fpu_helper.c
+++ b/target/i386/tcg/fpu_helper.c
@@ -198,16 +198,16 @@ void cpu_init_fp_statuses(CPUX86State *env)
     set_float_ftz_detection(float_ftz_after_rounding, &env->sse_status);
 }
 
-static inline uint8_t save_exception_flags(CPUX86State *env)
+static inline int save_exception_flags(CPUX86State *env)
 {
-    uint8_t old_flags = get_float_exception_flags(&env->fp_status);
+    int old_flags = get_float_exception_flags(&env->fp_status);
     set_float_exception_flags(0, &env->fp_status);
     return old_flags;
 }
 
-static void merge_exception_flags(CPUX86State *env, uint8_t old_flags)
+static void merge_exception_flags(CPUX86State *env, int old_flags)
 {
-    uint8_t new_flags = get_float_exception_flags(&env->fp_status);
+    int new_flags = get_float_exception_flags(&env->fp_status);
     float_raise(old_flags, &env->fp_status);
     fpu_set_exception(env,
                       ((new_flags & float_flag_invalid ? FPUS_IE : 0) |
@@ -220,7 +220,7 @@ static void merge_exception_flags(CPUX86State *env, uint8_t old_flags)
 
 static inline floatx80 helper_fdiv(CPUX86State *env, floatx80 a, floatx80 b)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     floatx80 ret = floatx80_div(a, b, &env->fp_status);
     merge_exception_flags(env, old_flags);
     return ret;
@@ -240,7 +240,7 @@ static void fpu_raise_exception(CPUX86State *env, uintptr_t retaddr)
 
 void helper_flds_FT0(CPUX86State *env, uint32_t val)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     union {
         float32 f;
         uint32_t i;
@@ -253,7 +253,7 @@ void helper_flds_FT0(CPUX86State *env, uint32_t val)
 
 void helper_fldl_FT0(CPUX86State *env, uint64_t val)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     union {
         float64 f;
         uint64_t i;
@@ -271,7 +271,7 @@ void helper_fildl_FT0(CPUX86State *env, int32_t val)
 
 void helper_flds_ST0(CPUX86State *env, uint32_t val)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     int new_fpstt;
     union {
         float32 f;
@@ -288,7 +288,7 @@ void helper_flds_ST0(CPUX86State *env, uint32_t val)
 
 void helper_fldl_ST0(CPUX86State *env, uint64_t val)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     int new_fpstt;
     union {
         float64 f;
@@ -338,7 +338,7 @@ void helper_fildll_ST0(CPUX86State *env, int64_t val)
 
 uint32_t helper_fsts_ST0(CPUX86State *env)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     union {
         float32 f;
         uint32_t i;
@@ -351,7 +351,7 @@ uint32_t helper_fsts_ST0(CPUX86State *env)
 
 uint64_t helper_fstl_ST0(CPUX86State *env)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     union {
         float64 f;
         uint64_t i;
@@ -364,7 +364,7 @@ uint64_t helper_fstl_ST0(CPUX86State *env)
 
 int32_t helper_fist_ST0(CPUX86State *env)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     int32_t val;
 
     val = floatx80_to_int32(ST0, &env->fp_status);
@@ -378,7 +378,7 @@ int32_t helper_fist_ST0(CPUX86State *env)
 
 int32_t helper_fistl_ST0(CPUX86State *env)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     int32_t val;
 
     val = floatx80_to_int32(ST0, &env->fp_status);
@@ -391,7 +391,7 @@ int32_t helper_fistl_ST0(CPUX86State *env)
 
 int64_t helper_fistll_ST0(CPUX86State *env)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     int64_t val;
 
     val = floatx80_to_int64(ST0, &env->fp_status);
@@ -404,7 +404,7 @@ int64_t helper_fistll_ST0(CPUX86State *env)
 
 int32_t helper_fistt_ST0(CPUX86State *env)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     int32_t val;
 
     val = floatx80_to_int32_round_to_zero(ST0, &env->fp_status);
@@ -418,7 +418,7 @@ int32_t helper_fistt_ST0(CPUX86State *env)
 
 int32_t helper_fisttl_ST0(CPUX86State *env)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     int32_t val;
 
     val = floatx80_to_int32_round_to_zero(ST0, &env->fp_status);
@@ -431,7 +431,7 @@ int32_t helper_fisttl_ST0(CPUX86State *env)
 
 int64_t helper_fisttll_ST0(CPUX86State *env)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     int64_t val;
 
     val = floatx80_to_int64_round_to_zero(ST0, &env->fp_status);
@@ -527,7 +527,7 @@ static const int fcom_ccval[4] = {0x0100, 0x4000, 0x0000, 0x4500};
 
 void helper_fcom_ST0_FT0(CPUX86State *env)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     FloatRelation ret;
 
     ret = floatx80_compare(ST0, FT0, &env->fp_status);
@@ -537,7 +537,7 @@ void helper_fcom_ST0_FT0(CPUX86State *env)
 
 void helper_fucom_ST0_FT0(CPUX86State *env)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     FloatRelation ret;
 
     ret = floatx80_compare_quiet(ST0, FT0, &env->fp_status);
@@ -549,7 +549,7 @@ static const int fcomi_ccval[4] = {CC_C, CC_Z, 0, CC_Z | CC_P | CC_C};
 
 void helper_fcomi_ST0_FT0(CPUX86State *env)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     int eflags;
     FloatRelation ret;
 
@@ -562,7 +562,7 @@ void helper_fcomi_ST0_FT0(CPUX86State *env)
 
 void helper_fucomi_ST0_FT0(CPUX86State *env)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     int eflags;
     FloatRelation ret;
 
@@ -575,28 +575,28 @@ void helper_fucomi_ST0_FT0(CPUX86State *env)
 
 void helper_fadd_ST0_FT0(CPUX86State *env)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     ST0 = floatx80_add(ST0, FT0, &env->fp_status);
     merge_exception_flags(env, old_flags);
 }
 
 void helper_fmul_ST0_FT0(CPUX86State *env)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     ST0 = floatx80_mul(ST0, FT0, &env->fp_status);
     merge_exception_flags(env, old_flags);
 }
 
 void helper_fsub_ST0_FT0(CPUX86State *env)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     ST0 = floatx80_sub(ST0, FT0, &env->fp_status);
     merge_exception_flags(env, old_flags);
 }
 
 void helper_fsubr_ST0_FT0(CPUX86State *env)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     ST0 = floatx80_sub(FT0, ST0, &env->fp_status);
     merge_exception_flags(env, old_flags);
 }
@@ -615,28 +615,28 @@ void helper_fdivr_ST0_FT0(CPUX86State *env)
 
 void helper_fadd_STN_ST0(CPUX86State *env, int st_index)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     ST(st_index) = floatx80_add(ST(st_index), ST0, &env->fp_status);
     merge_exception_flags(env, old_flags);
 }
 
 void helper_fmul_STN_ST0(CPUX86State *env, int st_index)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     ST(st_index) = floatx80_mul(ST(st_index), ST0, &env->fp_status);
     merge_exception_flags(env, old_flags);
 }
 
 void helper_fsub_STN_ST0(CPUX86State *env, int st_index)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     ST(st_index) = floatx80_sub(ST(st_index), ST0, &env->fp_status);
     merge_exception_flags(env, old_flags);
 }
 
 void helper_fsubr_STN_ST0(CPUX86State *env, int st_index)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     ST(st_index) = floatx80_sub(ST0, ST(st_index), &env->fp_status);
     merge_exception_flags(env, old_flags);
 }
@@ -861,7 +861,7 @@ void helper_fbld_ST0(CPUX86State *env, target_ulong ptr)
 
 void helper_fbst_ST0(CPUX86State *env, target_ulong ptr)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     int v;
     target_ulong mem_ref, mem_end;
     int64_t val;
@@ -1136,7 +1136,7 @@ static const struct f2xm1_data f2xm1_table[65] = {
 
 void helper_f2xm1(CPUX86State *env)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     uint64_t sig = extractFloatx80Frac(ST0);
     int32_t exp = extractFloatx80Exp(ST0);
     bool sign = extractFloatx80Sign(ST0);
@@ -1369,7 +1369,7 @@ static const struct fpatan_data fpatan_table[9] = {
 
 void helper_fpatan(CPUX86State *env)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     uint64_t arg0_sig = extractFloatx80Frac(ST0);
     int32_t arg0_exp = extractFloatx80Exp(ST0);
     bool arg0_sign = extractFloatx80Sign(ST0);
@@ -1806,7 +1806,7 @@ void helper_fpatan(CPUX86State *env)
 
 void helper_fxtract(CPUX86State *env)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     CPU_LDoubleU temp;
 
     temp.d = ST0;
@@ -1855,7 +1855,7 @@ void helper_fxtract(CPUX86State *env)
 
 static void helper_fprem_common(CPUX86State *env, bool mod)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     uint64_t quotient;
     CPU_LDoubleU temp0, temp1;
     int exp0, exp1, expdiff;
@@ -2050,7 +2050,7 @@ static void helper_fyl2x_common(CPUX86State *env, floatx80 arg, int32_t *exp,
 
 void helper_fyl2xp1(CPUX86State *env)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     uint64_t arg0_sig = extractFloatx80Frac(ST0);
     int32_t arg0_exp = extractFloatx80Exp(ST0);
     bool arg0_sign = extractFloatx80Sign(ST0);
@@ -2148,7 +2148,7 @@ void helper_fyl2xp1(CPUX86State *env)
 
 void helper_fyl2x(CPUX86State *env)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     uint64_t arg0_sig = extractFloatx80Frac(ST0);
     int32_t arg0_exp = extractFloatx80Exp(ST0);
     bool arg0_sign = extractFloatx80Sign(ST0);
@@ -2295,7 +2295,7 @@ void helper_fyl2x(CPUX86State *env)
 
 void helper_fsqrt(CPUX86State *env)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     if (floatx80_is_neg(ST0)) {
         env->fpus &= ~0x4700;  /* (C3,C2,C1,C0) <-- 0000 */
         env->fpus |= 0x400;
@@ -2321,14 +2321,14 @@ void helper_fsincos(CPUX86State *env)
 
 void helper_frndint(CPUX86State *env)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     ST0 = floatx80_round_to_int(ST0, &env->fp_status);
     merge_exception_flags(env, old_flags);
 }
 
 void helper_fscale(CPUX86State *env)
 {
-    uint8_t old_flags = save_exception_flags(env);
+    int old_flags = save_exception_flags(env);
     if (floatx80_invalid_encoding(ST1) || floatx80_invalid_encoding(ST0)) {
         float_raise(float_flag_invalid, &env->fp_status);
         ST0 = floatx80_default_nan(&env->fp_status);
@@ -2366,7 +2366,7 @@ void helper_fscale(CPUX86State *env)
     } else {
         int n;
         FloatX80RoundPrec save = env->fp_status.floatx80_rounding_precision;
-        uint8_t save_flags = get_float_exception_flags(&env->fp_status);
+        int save_flags = get_float_exception_flags(&env->fp_status);
         set_float_exception_flags(0, &env->fp_status);
         n = floatx80_to_int32_round_to_zero(ST1, &env->fp_status);
         set_float_exception_flags(save_flags, &env->fp_status);
@@ -3266,7 +3266,7 @@ void update_mxcsr_status(CPUX86State *env)
 
 void update_mxcsr_from_sse_status(CPUX86State *env)
 {
-    uint8_t flags = get_float_exception_flags(&env->sse_status);
+    int flags = get_float_exception_flags(&env->sse_status);
     /*
      * The MXCSR denormal flag has opposite semantics to
      * float_flag_input_denormal_flushed (the softfloat code sets that flag
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 3/4] target/i386: Wire up MXCSR.DE and FPUS.DE correctly
  2025-02-13 14:26 [PATCH 0/4] target/i386: Emulate ftz and denormal flag bits correctly Peter Maydell
  2025-02-13 14:26 ` [PATCH 1/4] target/i386: Detect flush-to-zero after rounding Peter Maydell
  2025-02-13 14:26 ` [PATCH 2/4] target/i386: Use correct type for get_float_exception_flags() values Peter Maydell
@ 2025-02-13 14:26 ` Peter Maydell
  2025-05-08  3:48   ` Zhao Liu
  2025-02-13 14:26 ` [PATCH 4/4] tests/tcg/x86_64/fma: add test for exact-denormal output Peter Maydell
  2025-02-24 14:47 ` [PATCH 0/4] target/i386: Emulate ftz and denormal flag bits correctly Peter Maydell
  4 siblings, 1 reply; 14+ messages in thread
From: Peter Maydell @ 2025-02-13 14:26 UTC (permalink / raw)
  To: qemu-devel; +Cc: Richard Henderson, Paolo Bonzini, Zhao Liu, Eduardo Habkost

The x86 DE bit in the FPU and MXCSR status is supposed to be set
when an input denormal is consumed. We didn't previously report
this from softfloat, so the x86 code either simply didn't set
the DE bit or else incorrectly wired it up to denormal_flushed,
depending on which register you looked at.

Now we have input_denormal_used we can wire up these DE bits
with the semantics they are supposed to have.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
 target/i386/tcg/fpu_helper.c | 11 +++--------
 1 file changed, 3 insertions(+), 8 deletions(-)

diff --git a/target/i386/tcg/fpu_helper.c b/target/i386/tcg/fpu_helper.c
index cd965a1f582..66febbacee1 100644
--- a/target/i386/tcg/fpu_helper.c
+++ b/target/i386/tcg/fpu_helper.c
@@ -215,7 +215,7 @@ static void merge_exception_flags(CPUX86State *env, int old_flags)
                        (new_flags & float_flag_overflow ? FPUS_OE : 0) |
                        (new_flags & float_flag_underflow ? FPUS_UE : 0) |
                        (new_flags & float_flag_inexact ? FPUS_PE : 0) |
-                       (new_flags & float_flag_input_denormal_flushed ? FPUS_DE : 0)));
+                       (new_flags & float_flag_input_denormal_used ? FPUS_DE : 0)));
 }
 
 static inline floatx80 helper_fdiv(CPUX86State *env, floatx80 a, floatx80 b)
@@ -3251,6 +3251,7 @@ void update_mxcsr_status(CPUX86State *env)
 
     /* Set exception flags.  */
     set_float_exception_flags((mxcsr & FPUS_IE ? float_flag_invalid : 0) |
+                              (mxcsr & FPUS_DE ? float_flag_input_denormal_used : 0) |
                               (mxcsr & FPUS_ZE ? float_flag_divbyzero : 0) |
                               (mxcsr & FPUS_OE ? float_flag_overflow : 0) |
                               (mxcsr & FPUS_UE ? float_flag_underflow : 0) |
@@ -3267,14 +3268,8 @@ void update_mxcsr_status(CPUX86State *env)
 void update_mxcsr_from_sse_status(CPUX86State *env)
 {
     int flags = get_float_exception_flags(&env->sse_status);
-    /*
-     * The MXCSR denormal flag has opposite semantics to
-     * float_flag_input_denormal_flushed (the softfloat code sets that flag
-     * only when flushing input denormals to zero, but SSE sets it
-     * only when not flushing them to zero), so is not converted
-     * here.
-     */
     env->mxcsr |= ((flags & float_flag_invalid ? FPUS_IE : 0) |
+                   (flags & float_flag_input_denormal_used ? FPUS_DE : 0) |
                    (flags & float_flag_divbyzero ? FPUS_ZE : 0) |
                    (flags & float_flag_overflow ? FPUS_OE : 0) |
                    (flags & float_flag_underflow ? FPUS_UE : 0) |
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 4/4] tests/tcg/x86_64/fma: add test for exact-denormal output
  2025-02-13 14:26 [PATCH 0/4] target/i386: Emulate ftz and denormal flag bits correctly Peter Maydell
                   ` (2 preceding siblings ...)
  2025-02-13 14:26 ` [PATCH 3/4] target/i386: Wire up MXCSR.DE and FPUS.DE correctly Peter Maydell
@ 2025-02-13 14:26 ` Peter Maydell
  2025-05-08  3:48   ` Zhao Liu
  2025-02-24 14:47 ` [PATCH 0/4] target/i386: Emulate ftz and denormal flag bits correctly Peter Maydell
  4 siblings, 1 reply; 14+ messages in thread
From: Peter Maydell @ 2025-02-13 14:26 UTC (permalink / raw)
  To: qemu-devel; +Cc: Richard Henderson, Paolo Bonzini, Zhao Liu, Eduardo Habkost

Add some fma test cases that check for correct handling of FTZ and
for the flag that indicates that the input denormal was consumed.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
 tests/tcg/x86_64/fma.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/tests/tcg/x86_64/fma.c b/tests/tcg/x86_64/fma.c
index 46f863005ed..34219614c0a 100644
--- a/tests/tcg/x86_64/fma.c
+++ b/tests/tcg/x86_64/fma.c
@@ -82,6 +82,18 @@ static testdata tests[] = {
      */
     { 0x3fdfffffffffffff, 0x001fffffffffffff, 0x801fffffffffffff, true,
       0x8010000000000000, 0x20 }, /* Enabling FTZ shouldn't change flags */
+    /*
+     * normal * 0 + a denormal. With FTZ disabled this gives an exact
+     * result (equal to the input denormal) that has consumed the denormal.
+     */
+    { 0x3cc8000000000000, 0x0000000000000000, 0x8008000000000000, false,
+      0x8008000000000000, 0x2 }, /* Denormal */
+    /*
+     * With FTZ enabled, this consumes the denormal, returns zero (because
+     * flushed) and indicates also Underflow and Precision.
+     */
+    { 0x3cc8000000000000, 0x0000000000000000, 0x8008000000000000, true,
+      0x8000000000000000, 0x32 }, /* Precision, Underflow, Denormal */
 };
 
 int main(void)
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/4] target/i386: Use correct type for get_float_exception_flags() values
  2025-02-13 14:26 ` [PATCH 2/4] target/i386: Use correct type for get_float_exception_flags() values Peter Maydell
@ 2025-02-13 15:18   ` Philippe Mathieu-Daudé
  2025-05-07 13:12   ` Zhao Liu
  1 sibling, 0 replies; 14+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-02-13 15:18 UTC (permalink / raw)
  To: Peter Maydell, qemu-devel
  Cc: Richard Henderson, Paolo Bonzini, Zhao Liu, Eduardo Habkost

On 13/2/25 15:26, Peter Maydell wrote:
> The softfloat get_float_exception_flags() function returns 'int', but
> in various places in target/i386 we incorrectly store the returned
> value into a uint8_t.  This currently has no ill effects because i386
> doesn't care about any of the float_flag enum values above 0x40.
> However, we want to start using float_flag_input_denormal_used, which
> is 0x4000.
> 
> Switch to using 'int' so that we can handle all the possible valid
> float_flag_* values. This includes changing the return type of
> save_exception_flags() and the argument to merge_exception_flags().
> 
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>   target/i386/ops_sse.h        | 16 +++----
>   target/i386/tcg/fpu_helper.c | 82 ++++++++++++++++++------------------
>   2 files changed, 49 insertions(+), 49 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 0/4] target/i386: Emulate ftz and denormal flag bits correctly
  2025-02-13 14:26 [PATCH 0/4] target/i386: Emulate ftz and denormal flag bits correctly Peter Maydell
                   ` (3 preceding siblings ...)
  2025-02-13 14:26 ` [PATCH 4/4] tests/tcg/x86_64/fma: add test for exact-denormal output Peter Maydell
@ 2025-02-24 14:47 ` Peter Maydell
  2025-03-07 10:38   ` Peter Maydell
  4 siblings, 1 reply; 14+ messages in thread
From: Peter Maydell @ 2025-02-24 14:47 UTC (permalink / raw)
  To: qemu-devel; +Cc: Richard Henderson, Paolo Bonzini, Zhao Liu, Eduardo Habkost

Ping? Would an i386 maintainer like to pick these up?

thanks
-- PMM

On Thu, 13 Feb 2025 at 14:26, Peter Maydell <peter.maydell@linaro.org> wrote:
>
> This is a set of four patches to target/i386 which use the core
> fpu functionality we just landed for Arm FEAT_AFP to correct
> the emulation of some corner cases of x86 floating point:
>  * when we are flushing denormal outputs to zero, this should
>    be done after rounding, not before
>  * the MXCSR.DE and FPUS.DE bits indicate when a denormal input
>    was not flushed and was used in an fp operation; we previously
>    weren't implementing these semantics
>
> All four patches have been reviewed by RTH. Testing is a bit
> light (make check-tcg and make check-functional), because AFAIK
> there is no freely available comprehensive FP testsuite for x86,
> and risu doesn't support x86 currently so I can't do the same kind
> of random-instruction-testing I could for Arm.
>
> thanks
> -- PMM
>
> Peter Maydell (4):
>   target/i386: Detect flush-to-zero after rounding
>   target/i386: Use correct type for get_float_exception_flags() values
>   target/i386: Wire up MXCSR.DE and FPUS.DE correctly
>   tests/tcg/x86_64/fma: add test for exact-denormal output
>
>  target/i386/ops_sse.h        |  16 +++---
>  target/i386/tcg/fpu_helper.c | 101 +++++++++++++++++------------------
>  tests/tcg/x86_64/fma.c       |  17 ++++--
>  3 files changed, 68 insertions(+), 66 deletions(-)
>
> --
> 2.43.0


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 0/4] target/i386: Emulate ftz and denormal flag bits correctly
  2025-02-24 14:47 ` [PATCH 0/4] target/i386: Emulate ftz and denormal flag bits correctly Peter Maydell
@ 2025-03-07 10:38   ` Peter Maydell
  2025-03-12 13:22     ` Peter Maydell
  0 siblings, 1 reply; 14+ messages in thread
From: Peter Maydell @ 2025-03-07 10:38 UTC (permalink / raw)
  To: qemu-devel; +Cc: Richard Henderson, Paolo Bonzini, Zhao Liu, Eduardo Habkost

Ping^2 for pickup of reviewed patches.

thanks
-- PMM

On Mon, 24 Feb 2025 at 14:47, Peter Maydell <peter.maydell@linaro.org> wrote:
>
> Ping? Would an i386 maintainer like to pick these up?
>
> thanks
> -- PMM
>
> On Thu, 13 Feb 2025 at 14:26, Peter Maydell <peter.maydell@linaro.org> wrote:
> >
> > This is a set of four patches to target/i386 which use the core
> > fpu functionality we just landed for Arm FEAT_AFP to correct
> > the emulation of some corner cases of x86 floating point:
> >  * when we are flushing denormal outputs to zero, this should
> >    be done after rounding, not before
> >  * the MXCSR.DE and FPUS.DE bits indicate when a denormal input
> >    was not flushed and was used in an fp operation; we previously
> >    weren't implementing these semantics
> >
> > All four patches have been reviewed by RTH. Testing is a bit
> > light (make check-tcg and make check-functional), because AFAIK
> > there is no freely available comprehensive FP testsuite for x86,
> > and risu doesn't support x86 currently so I can't do the same kind
> > of random-instruction-testing I could for Arm.
> >
> > thanks
> > -- PMM
> >
> > Peter Maydell (4):
> >   target/i386: Detect flush-to-zero after rounding
> >   target/i386: Use correct type for get_float_exception_flags() values
> >   target/i386: Wire up MXCSR.DE and FPUS.DE correctly
> >   tests/tcg/x86_64/fma: add test for exact-denormal output
> >
> >  target/i386/ops_sse.h        |  16 +++---
> >  target/i386/tcg/fpu_helper.c | 101 +++++++++++++++++------------------
> >  tests/tcg/x86_64/fma.c       |  17 ++++--
> >  3 files changed, 68 insertions(+), 66 deletions(-)
> >
> > --
> > 2.43.0


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 0/4] target/i386: Emulate ftz and denormal flag bits correctly
  2025-03-07 10:38   ` Peter Maydell
@ 2025-03-12 13:22     ` Peter Maydell
  2025-04-29 12:30       ` Peter Maydell
  0 siblings, 1 reply; 14+ messages in thread
From: Peter Maydell @ 2025-03-12 13:22 UTC (permalink / raw)
  To: qemu-devel; +Cc: Richard Henderson, Paolo Bonzini, Zhao Liu, Eduardo Habkost

Ping^3 ? Anybody home?

thanks
-- PMM

On Fri, 7 Mar 2025 at 10:38, Peter Maydell <peter.maydell@linaro.org> wrote:
>
> Ping^2 for pickup of reviewed patches.
>
> thanks
> -- PMM
>
> On Mon, 24 Feb 2025 at 14:47, Peter Maydell <peter.maydell@linaro.org> wrote:
> >
> > Ping? Would an i386 maintainer like to pick these up?
> >
> > thanks
> > -- PMM
> >
> > On Thu, 13 Feb 2025 at 14:26, Peter Maydell <peter.maydell@linaro.org> wrote:
> > >
> > > This is a set of four patches to target/i386 which use the core
> > > fpu functionality we just landed for Arm FEAT_AFP to correct
> > > the emulation of some corner cases of x86 floating point:
> > >  * when we are flushing denormal outputs to zero, this should
> > >    be done after rounding, not before
> > >  * the MXCSR.DE and FPUS.DE bits indicate when a denormal input
> > >    was not flushed and was used in an fp operation; we previously
> > >    weren't implementing these semantics
> > >
> > > All four patches have been reviewed by RTH. Testing is a bit
> > > light (make check-tcg and make check-functional), because AFAIK
> > > there is no freely available comprehensive FP testsuite for x86,
> > > and risu doesn't support x86 currently so I can't do the same kind
> > > of random-instruction-testing I could for Arm.
> > >
> > > thanks
> > > -- PMM
> > >
> > > Peter Maydell (4):
> > >   target/i386: Detect flush-to-zero after rounding
> > >   target/i386: Use correct type for get_float_exception_flags() values
> > >   target/i386: Wire up MXCSR.DE and FPUS.DE correctly
> > >   tests/tcg/x86_64/fma: add test for exact-denormal output
> > >
> > >  target/i386/ops_sse.h        |  16 +++---
> > >  target/i386/tcg/fpu_helper.c | 101 +++++++++++++++++------------------
> > >  tests/tcg/x86_64/fma.c       |  17 ++++--
> > >  3 files changed, 68 insertions(+), 66 deletions(-)
> > >
> > > --
> > > 2.43.0


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 0/4] target/i386: Emulate ftz and denormal flag bits correctly
  2025-03-12 13:22     ` Peter Maydell
@ 2025-04-29 12:30       ` Peter Maydell
  0 siblings, 0 replies; 14+ messages in thread
From: Peter Maydell @ 2025-04-29 12:30 UTC (permalink / raw)
  To: qemu-devel; +Cc: Richard Henderson, Paolo Bonzini, Zhao Liu, Eduardo Habkost

Ping^4, now that 10.0 is out; these are all reviewed patches.

Patchew link:
https://patchew.org/QEMU/20250213142613.151308-1-peter.maydell@linaro.org/


thanks
-- PMM

On Wed, 12 Mar 2025 at 13:22, Peter Maydell <peter.maydell@linaro.org> wrote:
>
> Ping^3 ? Anybody home?
>
> thanks
> -- PMM
>
> On Fri, 7 Mar 2025 at 10:38, Peter Maydell <peter.maydell@linaro.org> wrote:
> >
> > Ping^2 for pickup of reviewed patches.
> >
> > thanks
> > -- PMM
> >
> > On Mon, 24 Feb 2025 at 14:47, Peter Maydell <peter.maydell@linaro.org> wrote:
> > >
> > > Ping? Would an i386 maintainer like to pick these up?
> > >
> > > thanks
> > > -- PMM
> > >
> > > On Thu, 13 Feb 2025 at 14:26, Peter Maydell <peter.maydell@linaro.org> wrote:
> > > >
> > > > This is a set of four patches to target/i386 which use the core
> > > > fpu functionality we just landed for Arm FEAT_AFP to correct
> > > > the emulation of some corner cases of x86 floating point:
> > > >  * when we are flushing denormal outputs to zero, this should
> > > >    be done after rounding, not before
> > > >  * the MXCSR.DE and FPUS.DE bits indicate when a denormal input
> > > >    was not flushed and was used in an fp operation; we previously
> > > >    weren't implementing these semantics
> > > >
> > > > All four patches have been reviewed by RTH. Testing is a bit
> > > > light (make check-tcg and make check-functional), because AFAIK
> > > > there is no freely available comprehensive FP testsuite for x86,
> > > > and risu doesn't support x86 currently so I can't do the same kind
> > > > of random-instruction-testing I could for Arm.
> > > >
> > > > thanks
> > > > -- PMM
> > > >
> > > > Peter Maydell (4):
> > > >   target/i386: Detect flush-to-zero after rounding
> > > >   target/i386: Use correct type for get_float_exception_flags() values
> > > >   target/i386: Wire up MXCSR.DE and FPUS.DE correctly
> > > >   tests/tcg/x86_64/fma: add test for exact-denormal output
> > > >
> > > >  target/i386/ops_sse.h        |  16 +++---
> > > >  target/i386/tcg/fpu_helper.c | 101 +++++++++++++++++------------------
> > > >  tests/tcg/x86_64/fma.c       |  17 ++++--
> > > >  3 files changed, 68 insertions(+), 66 deletions(-)
> > > >
> > > > --
> > > > 2.43.0


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 1/4] target/i386: Detect flush-to-zero after rounding
  2025-02-13 14:26 ` [PATCH 1/4] target/i386: Detect flush-to-zero after rounding Peter Maydell
@ 2025-05-07 13:10   ` Zhao Liu
  0 siblings, 0 replies; 14+ messages in thread
From: Zhao Liu @ 2025-05-07 13:10 UTC (permalink / raw)
  To: Peter Maydell
  Cc: qemu-devel, Richard Henderson, Paolo Bonzini, Eduardo Habkost

On Thu, Feb 13, 2025 at 02:26:10PM +0000, Peter Maydell wrote:
> Date: Thu, 13 Feb 2025 14:26:10 +0000
> From: Peter Maydell <peter.maydell@linaro.org>
> Subject: [PATCH 1/4] target/i386: Detect flush-to-zero after rounding
> X-Mailer: git-send-email 2.43.0
> 
> The Intel SDM section 10.2.3.3 on the MXCSR.FTZ bit says that we
> flush outputs to zero when we detect underflow, which is after
> rounding.  Set the detect_ftz flag accordingly.
> 
> This allows us to enable the test in fma.c which checks this
> behaviour.
> 
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  target/i386/tcg/fpu_helper.c | 8 ++++----
>  tests/tcg/x86_64/fma.c       | 5 -----
>  2 files changed, 4 insertions(+), 9 deletions(-)

Reviewed-by: Zhao Liu <zhao1.liu@intel.com>



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/4] target/i386: Use correct type for get_float_exception_flags() values
  2025-02-13 14:26 ` [PATCH 2/4] target/i386: Use correct type for get_float_exception_flags() values Peter Maydell
  2025-02-13 15:18   ` Philippe Mathieu-Daudé
@ 2025-05-07 13:12   ` Zhao Liu
  1 sibling, 0 replies; 14+ messages in thread
From: Zhao Liu @ 2025-05-07 13:12 UTC (permalink / raw)
  To: Peter Maydell
  Cc: qemu-devel, Richard Henderson, Paolo Bonzini, Eduardo Habkost

On Thu, Feb 13, 2025 at 02:26:11PM +0000, Peter Maydell wrote:
> Date: Thu, 13 Feb 2025 14:26:11 +0000
> From: Peter Maydell <peter.maydell@linaro.org>
> Subject: [PATCH 2/4] target/i386: Use correct type for
>  get_float_exception_flags() values
> X-Mailer: git-send-email 2.43.0
> 
> The softfloat get_float_exception_flags() function returns 'int', but
> in various places in target/i386 we incorrectly store the returned
> value into a uint8_t.  This currently has no ill effects because i386
> doesn't care about any of the float_flag enum values above 0x40.
> However, we want to start using float_flag_input_denormal_used, which
> is 0x4000.
> 
> Switch to using 'int' so that we can handle all the possible valid
> float_flag_* values. This includes changing the return type of
> save_exception_flags() and the argument to merge_exception_flags().
> 
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  target/i386/ops_sse.h        | 16 +++----
>  target/i386/tcg/fpu_helper.c | 82 ++++++++++++++++++------------------
>  2 files changed, 49 insertions(+), 49 deletions(-)

Reviewed-by: Zhao Liu <zhao1.liu@intel.com>



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 3/4] target/i386: Wire up MXCSR.DE and FPUS.DE correctly
  2025-02-13 14:26 ` [PATCH 3/4] target/i386: Wire up MXCSR.DE and FPUS.DE correctly Peter Maydell
@ 2025-05-08  3:48   ` Zhao Liu
  0 siblings, 0 replies; 14+ messages in thread
From: Zhao Liu @ 2025-05-08  3:48 UTC (permalink / raw)
  To: Peter Maydell
  Cc: qemu-devel, Richard Henderson, Paolo Bonzini, Eduardo Habkost

On Thu, Feb 13, 2025 at 02:26:12PM +0000, Peter Maydell wrote:
> Date: Thu, 13 Feb 2025 14:26:12 +0000
> From: Peter Maydell <peter.maydell@linaro.org>
> Subject: [PATCH 3/4] target/i386: Wire up MXCSR.DE and FPUS.DE correctly
> X-Mailer: git-send-email 2.43.0
> 
> The x86 DE bit in the FPU and MXCSR status is supposed to be set
> when an input denormal is consumed. We didn't previously report
> this from softfloat, so the x86 code either simply didn't set
> the DE bit or else incorrectly wired it up to denormal_flushed,
> depending on which register you looked at.
> 
> Now we have input_denormal_used we can wire up these DE bits
> with the semantics they are supposed to have.
> 
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  target/i386/tcg/fpu_helper.c | 11 +++--------
>  1 file changed, 3 insertions(+), 8 deletions(-)

Reviewed-by: Zhao Liu <zhao1.liu@intel.com>



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 4/4] tests/tcg/x86_64/fma: add test for exact-denormal output
  2025-02-13 14:26 ` [PATCH 4/4] tests/tcg/x86_64/fma: add test for exact-denormal output Peter Maydell
@ 2025-05-08  3:48   ` Zhao Liu
  0 siblings, 0 replies; 14+ messages in thread
From: Zhao Liu @ 2025-05-08  3:48 UTC (permalink / raw)
  To: Peter Maydell
  Cc: qemu-devel, Richard Henderson, Paolo Bonzini, Eduardo Habkost

On Thu, Feb 13, 2025 at 02:26:13PM +0000, Peter Maydell wrote:
> Date: Thu, 13 Feb 2025 14:26:13 +0000
> From: Peter Maydell <peter.maydell@linaro.org>
> Subject: [PATCH 4/4] tests/tcg/x86_64/fma: add test for exact-denormal
>  output
> X-Mailer: git-send-email 2.43.0
> 
> Add some fma test cases that check for correct handling of FTZ and
> for the flag that indicates that the input denormal was consumed.
> 
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  tests/tcg/x86_64/fma.c | 12 ++++++++++++
>  1 file changed, 12 insertions(+)

Reviewed-by: Zhao Liu <zhao1.liu@intel.com>



^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2025-05-08  3:28 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-13 14:26 [PATCH 0/4] target/i386: Emulate ftz and denormal flag bits correctly Peter Maydell
2025-02-13 14:26 ` [PATCH 1/4] target/i386: Detect flush-to-zero after rounding Peter Maydell
2025-05-07 13:10   ` Zhao Liu
2025-02-13 14:26 ` [PATCH 2/4] target/i386: Use correct type for get_float_exception_flags() values Peter Maydell
2025-02-13 15:18   ` Philippe Mathieu-Daudé
2025-05-07 13:12   ` Zhao Liu
2025-02-13 14:26 ` [PATCH 3/4] target/i386: Wire up MXCSR.DE and FPUS.DE correctly Peter Maydell
2025-05-08  3:48   ` Zhao Liu
2025-02-13 14:26 ` [PATCH 4/4] tests/tcg/x86_64/fma: add test for exact-denormal output Peter Maydell
2025-05-08  3:48   ` Zhao Liu
2025-02-24 14:47 ` [PATCH 0/4] target/i386: Emulate ftz and denormal flag bits correctly Peter Maydell
2025-03-07 10:38   ` Peter Maydell
2025-03-12 13:22     ` Peter Maydell
2025-04-29 12:30       ` Peter Maydell

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).