From d96c2186641845e93ef45130e2ccf74fe9f30aa4 Mon Sep 17 00:00:00 2001 From: Joseph Myers <joseph@codesourcery.com> Date: Mon, 15 Jun 2020 13:03:14 -0400 Subject: [PATCH] target/i386: fix fscale handling of signaling NaN The implementation of the fscale instruction returns a NaN exponent unchanged. Fix it to return a quiet NaN when the provided exponent is a signaling NaN. Backports commit 0d48b436327955c69e2eb53f88aba9aa1e0dbaa0 from qemu --- qemu/target/i386/fpu_helper.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/qemu/target/i386/fpu_helper.c b/qemu/target/i386/fpu_helper.c index da730b1c..d38e3479 100644 --- a/qemu/target/i386/fpu_helper.c +++ b/qemu/target/i386/fpu_helper.c @@ -936,6 +936,10 @@ void helper_fscale(CPUX86State *env) { if (floatx80_is_any_nan(ST1)) { ST0 = ST1; + if (floatx80_is_signaling_nan(ST0, &env->fp_status)) { + float_raise(float_flag_invalid, &env->fp_status); + ST0 = floatx80_silence_nan(ST0, &env->fp_status); + } } else { int n = floatx80_to_int32_round_to_zero(ST1, &env->fp_status); ST0 = floatx80_scalbn(ST0, n, &env->fp_status);