From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41837) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UpgMD-0003YI-HR for qemu-devel@nongnu.org; Thu, 20 Jun 2013 11:01:08 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UpgMC-0004OH-9c for qemu-devel@nongnu.org; Thu, 20 Jun 2013 11:01:05 -0400 Received: from mail-ee0-x22d.google.com ([2a00:1450:4013:c00::22d]:34701) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UpgMC-0004O7-2n for qemu-devel@nongnu.org; Thu, 20 Jun 2013 11:01:04 -0400 Received: by mail-ee0-f45.google.com with SMTP id c1so4005468eek.4 for ; Thu, 20 Jun 2013 08:01:03 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Thu, 20 Jun 2013 17:00:57 +0200 Message-Id: <1371740457-27445-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH] int128: optimize List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: peter.maydell@linaro.org, rth@twiddle.net For add and sub, carry computation only requires checking one of the arguments (any for add, the LHS for sub because the RHS is negated). For neg, we can similarly optimize computation of the carry. For ge, we can just do lexicographic order. Signed-off-by: Paolo Bonzini --- Will post unit tests soon. include/qemu/int128.h | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/include/qemu/int128.h b/include/qemu/int128.h index bfe7678..d36cc7a 100644 --- a/include/qemu/int128.h +++ b/include/qemu/int128.h @@ -55,21 +55,20 @@ static inline Int128 int128_rshift(Int128 a, int n) static inline Int128 int128_add(Int128 a, Int128 b) { - Int128 r = { a.lo + b.lo, a.hi + b.hi }; - r.hi += (r.lo < a.lo) || (r.lo < b.lo); - return r; + uint64_t lo = a.lo + b.lo; + return (Int128) { lo, (lo < a.lo) + a.hi + b.hi }; } static inline Int128 int128_neg(Int128 a) { - a.lo = ~a.lo; - a.hi = ~a.hi; - return int128_add(a, int128_one()); + uint64_t lo = -a.lo; + return (Int128) { lo, ~a.hi + !lo }; } static inline Int128 int128_sub(Int128 a, Int128 b) { - return int128_add(a, int128_neg(b)); + uint64_t lo = a.lo - b.lo; + return (Int128) { lo, (lo < a.lo) + a.hi - b.hi }; } static inline bool int128_nonneg(Int128 a) @@ -89,7 +88,7 @@ static inline bool int128_ne(Int128 a, Int128 b) static inline bool int128_ge(Int128 a, Int128 b) { - return int128_nonneg(int128_sub(a, b)); + return a.hi > b.hi || (a.hi == b.hi && a.lo >= b.lo); } static inline bool int128_lt(Int128 a, Int128 b) -- 1.8.1.4