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);