target-s390x: fix and optimize slb* and slbg* computation of carry/borrow flag
commit9ef1473693a1400a903567489d3122fc9511765d
authorTorbjorn Granlund <torbjorng@google.com>
Thu, 8 Jan 2015 17:01:09 +0000 (8 18:01 +0100)
committerRichard Henderson <rth@twiddle.net>
Tue, 3 Feb 2015 20:27:05 +0000 (3 12:27 -0800)
tree57aa8c3e98c7ad5e93e14d89447c8925561b5bfb
parent8cf02f93dc37bc3de30dfb74eb0e904d1700dbf6
target-s390x: fix and optimize slb* and slbg* computation of carry/borrow flag

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