From: Richard Henderson <rth@twiddle.net>
To: qemu-devel@nongnu.org
Cc: kbastian@mail.uni-paderborn.de,
Torbjorn Granlund <torbjorng@google.com>,
Paolo Bonzini <pbonzini@redhat.com>,
peter.maydell@linaro.org
Subject: [Qemu-devel] [PULL 10/10] target-s390x: fix and optimize slb* and slbg* computation of carry/borrow flag
Date: Tue, 3 Feb 2015 12:43:01 -0800 [thread overview]
Message-ID: <1422996181-22383-11-git-send-email-rth@twiddle.net> (raw)
In-Reply-To: <1422996181-22383-1-git-send-email-rth@twiddle.net>
From: Torbjorn Granlund <torbjorng@google.com>
This patch fixes the bug with borrow_in being set incorrectly, but it
also simplifies the logic to be much more plain, improving speed. It
fixes both the 32-bit SLB* and 64-bit SLBG*.
The SLBG* change has been well-tested. I haven't tested the SLB* change
explicitly, but the code was copy-pasted from the tested code.
The error of these functions' current implementations would not likely
be triggered by compiler-generated code, since the only error was in the
state of the carry/borrow flag. Compilers rarely generate an
instruction sequence such as carry-set -> carry-set-and-use ->
carry-use.
(With Paolo's fix and mine, there are still a couple of failures from
GMP's testsuite, but they are almost surely due to incorrect code
generation from gcc 4.9. But since this gcc is running under qemu, it
might be qemu bugs. I intend to investigate this.)
Signed-off-by: Torbjorn Granlund <torbjorng@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
target-s390x/cc_helper.c | 18 ++++--------------
1 file changed, 4 insertions(+), 14 deletions(-)
diff --git a/target-s390x/cc_helper.c b/target-s390x/cc_helper.c
index 373eb17..00bc883 100644
--- a/target-s390x/cc_helper.c
+++ b/target-s390x/cc_helper.c
@@ -179,16 +179,11 @@ static uint32_t cc_calc_subu_64(uint64_t a1, uint64_t a2, uint64_t ar)
static uint32_t cc_calc_subb_64(uint64_t a1, uint64_t a2, uint64_t ar)
{
- /* We had borrow-in if normal subtraction isn't equal. */
- int borrow_in = ar - (a1 - a2);
int borrow_out;
- /* If a2 was ULONG_MAX, and borrow_in, then a2 is logically 65 bits,
- and we must have had borrow out. */
- if (borrow_in && a2 == (uint64_t)-1) {
- borrow_out = 1;
+ if (ar != a1 - a2) { /* difference means borrow-in */
+ borrow_out = (a2 >= a1);
} else {
- a2 += borrow_in;
borrow_out = (a2 > a1);
}
@@ -285,16 +280,11 @@ static uint32_t cc_calc_subu_32(uint32_t a1, uint32_t a2, uint32_t ar)
static uint32_t cc_calc_subb_32(uint32_t a1, uint32_t a2, uint32_t ar)
{
- /* We had borrow-in if normal subtraction isn't equal. */
- int borrow_in = ar - (a1 - a2);
int borrow_out;
- /* If a2 was UINT_MAX, and borrow_in, then a2 is logically 65 bits,
- and we must have had borrow out. */
- if (borrow_in && a2 == (uint32_t)-1) {
- borrow_out = 1;
+ if (ar != a1 - a2) { /* difference means borrow-in */
+ borrow_out = (a2 >= a1);
} else {
- a2 += borrow_in;
borrow_out = (a2 > a1);
}
--
2.1.0
next prev parent reply other threads:[~2015-02-03 20:43 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-03 20:42 [Qemu-devel] [PULL 00/10] s390x translator bug fixes Richard Henderson
2015-02-03 20:42 ` [Qemu-devel] [PULL 01/10] target-s390: Implement SAM specification exception Richard Henderson
2015-02-03 20:42 ` [Qemu-devel] [PULL 02/10] target-s390: Implement EPSW Richard Henderson
2015-02-03 20:42 ` [Qemu-devel] [PULL 03/10] target-s390: Fix STIDP Richard Henderson
2015-02-03 20:42 ` [Qemu-devel] [PULL 04/10] target-s390: Fix STURA Richard Henderson
2015-02-03 20:42 ` [Qemu-devel] [PULL 05/10] target-s390: Implement LURA, LURAG, STURG Richard Henderson
2015-02-03 20:42 ` [Qemu-devel] [PULL 06/10] target-s390: Implement ECAG Richard Henderson
2015-02-03 20:42 ` [Qemu-devel] [PULL 07/10] target-s390x: Mark check_privileged() as !CONFIG_USER_ONLY Richard Henderson
2015-02-03 20:42 ` [Qemu-devel] [PULL 08/10] disas/s390.c: Remove unused variables Richard Henderson
2015-02-03 20:43 ` [Qemu-devel] [PULL 09/10] target-s390x: support OC and NC in the EX instruction Richard Henderson
2015-02-03 20:43 ` Richard Henderson [this message]
2015-02-03 22:33 ` [Qemu-devel] [PULL 00/10] s390x translator bug fixes Peter Maydell
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=1422996181-22383-11-git-send-email-rth@twiddle.net \
--to=rth@twiddle.net \
--cc=kbastian@mail.uni-paderborn.de \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=torbjorng@google.com \
/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 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).