All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Alex Bennée" <alex.bennee@linaro.org>
To: peter.maydell@linaro.org
Cc: qemu-devel@nongnu.org, "Emilio G. Cota" <cota@braap.org>,
	"Alex Bennée" <alex.bennee@linaro.org>,
	"Aurelien Jarno" <aurelien@aurel32.net>
Subject: [Qemu-devel] [PULL 3/7] softfloat: enforce softfloat if the host's FMA is broken
Date: Thu, 17 Jan 2019 13:26:59 +0000	[thread overview]
Message-ID: <20190117132703.17790-4-alex.bennee@linaro.org> (raw)
In-Reply-To: <20190117132703.17790-1-alex.bennee@linaro.org>

From: "Emilio G. Cota" <cota@braap.org>

The added branch to the FMA ops is marked as unlikely and therefore
its impact on performance (measured with fp-bench) is within noise range
when measured on an Intel(R) Xeon(R) Gold 6142 CPU @ 2.60GHz.

Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
Signed-off-by: Emilio G. Cota <cota@braap.org>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

diff --git a/fpu/softfloat.c b/fpu/softfloat.c
index 59eac97d10..9132d7a0b0 100644
--- a/fpu/softfloat.c
+++ b/fpu/softfloat.c
@@ -1542,6 +1542,8 @@ soft_f64_muladd(float64 a, float64 b, float64 c, int flags,
     return float64_round_pack_canonical(pr, status);
 }
 
+static bool force_soft_fma;
+
 float32 QEMU_FLATTEN
 float32_muladd(float32 xa, float32 xb, float32 xc, int flags, float_status *s)
 {
@@ -1562,6 +1564,11 @@ float32_muladd(float32 xa, float32 xb, float32 xc, int flags, float_status *s)
     if (unlikely(!f32_is_zon3(ua, ub, uc))) {
         goto soft;
     }
+
+    if (unlikely(force_soft_fma)) {
+        goto soft;
+    }
+
     /*
      * When (a || b) == 0, there's no need to check for under/over flow,
      * since we know the addend is (normal || 0) and the product is 0.
@@ -1623,6 +1630,11 @@ float64_muladd(float64 xa, float64 xb, float64 xc, int flags, float_status *s)
     if (unlikely(!f64_is_zon3(ua, ub, uc))) {
         goto soft;
     }
+
+    if (unlikely(force_soft_fma)) {
+        goto soft;
+    }
+
     /*
      * When (a || b) == 0, there's no need to check for under/over flow,
      * since we know the addend is (normal || 0) and the product is 0.
@@ -7974,3 +7986,24 @@ float128 float128_scalbn(float128 a, int n, float_status *status)
                                          , status);
 
 }
+
+static void __attribute__((constructor)) softfloat_init(void)
+{
+    union_float64 ua, ub, uc, ur;
+
+    if (QEMU_NO_HARDFLOAT) {
+        return;
+    }
+    /*
+     * Test that the host's FMA is not obviously broken. For example,
+     * glibc < 2.23 can perform an incorrect FMA on certain hosts; see
+     *   https://sourceware.org/bugzilla/show_bug.cgi?id=13304
+     */
+    ua.s = 0x0020000000000001ULL;
+    ub.s = 0x3ca0000000000000ULL;
+    uc.s = 0x0020000000000000ULL;
+    ur.h = fma(ua.h, ub.h, uc.h);
+    if (ur.s != 0x0020000000000001ULL) {
+        force_soft_fma = true;
+    }
+}
-- 
2.17.1

  parent reply	other threads:[~2019-01-17 13:32 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-01-17 13:26 [Qemu-devel] [PULL 0/7] check-softfloat, fp-bench and clang compile fixes Alex Bennée
2019-01-17 13:26 ` [Qemu-devel] [PULL 1/7] fp-bench: fix update_random_ops Alex Bennée
2019-01-17 13:26 ` [Qemu-devel] [PULL 2/7] fp-bench: remove wrong exponent raise in fill_random Alex Bennée
2019-01-17 13:26 ` Alex Bennée [this message]
2019-01-17 13:27 ` [Qemu-devel] [PULL 4/7] include/fpu/softfloat: Fix compilation with Clang on s390x Alex Bennée
2019-01-17 13:27 ` [Qemu-devel] [PULL 5/7] tests/Makefile: add floating point tests Alex Bennée
2019-01-17 13:27 ` [Qemu-devel] [PULL 6/7] scripts/archive-source: include softfloat tests Alex Bennée
2019-01-17 13:27 ` [Qemu-devel] [PULL 7/7] tests/Makfile: add check-softfloat rule Alex Bennée
2019-01-17 17:37 ` [Qemu-devel] [PULL 0/7] check-softfloat, fp-bench and clang compile fixes Peter Maydell
2019-01-17 18:30   ` Emilio G. Cota
2019-01-17 18:55     ` Peter Maydell
2019-01-17 20:08       ` Emilio G. Cota
2019-01-18 17:41         ` Alex Bennée
2019-01-18 17:42           ` Peter Maydell
2019-01-18 20:19           ` Emilio G. Cota
2019-01-17 20:10       ` Alex Bennée
2019-01-18  9:03         ` Philippe Mathieu-Daudé
2019-01-18 17:00           ` Alex Bennée
2019-01-18 18:16             ` Emilio G. Cota
2019-01-18 18:30               ` Peter Maydell
2019-01-18 19:45                 ` Alex Bennée

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190117132703.17790-4-alex.bennee@linaro.org \
    --to=alex.bennee@linaro.org \
    --cc=aurelien@aurel32.net \
    --cc=cota@braap.org \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.