* [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
* 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
* [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
* 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 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
* [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
* 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
* [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 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
* 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
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).