From d5510a546f52ccb5752b92d534589fd178793b09 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Tue, 27 Feb 2018 11:06:30 -0500 Subject: [PATCH] int128: Add int128_make128 Allows Int128 to be used more generally, rather than having to begin with 64-bit inputs and accumulate. Backports commit 1edaeee0955fba7d834b7c8f4e372e7eae030745 from qemu --- qemu/include/qemu/int128.h | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/qemu/include/qemu/int128.h b/qemu/include/qemu/int128.h index d3907b5b..70ffa9b2 100644 --- a/qemu/include/qemu/int128.h +++ b/qemu/include/qemu/int128.h @@ -12,6 +12,11 @@ static inline Int128 int128_make64(uint64_t a) return a; } +static inline Int128 int128_make128(uint64_t lo, uint64_t hi) +{ + return (__uint128_t)hi << 64 | lo; +} + static inline uint64_t int128_get64(Int128 a) { uint64_t r = a; @@ -149,6 +154,14 @@ static inline Int128 int128_make64(uint64_t a) return i128; } +static inline Int128 int128_make128(uint64_t lo, uint64_t hi) +{ + Int128 res; + res.lo = lo; + res.hi = hi; + return res; +} + static inline uint64_t int128_get64(Int128 a) { //assert(!a.hi); @@ -201,11 +214,9 @@ static inline Int128 int128_rshift(Int128 a, int n) } h = a.hi >> (n & 63); if (n >= 64) { - Int128 i128 = { h, h >> 63 }; - return i128; + return int128_make128(h, h >> 63); } else { - Int128 i128 = { (a.lo >> n) | ((uint64_t)a.hi << (64 - n)), h }; - return i128; + return int128_make128((a.lo >> n) | ((uint64_t)a.hi << (64 - n)), h); } } @@ -219,21 +230,18 @@ static inline Int128 int128_add(Int128 a, Int128 b) * * So the carry is lo < a.lo. */ - Int128 i128 = { lo, (uint64_t)a.hi + b.hi + (lo < a.lo) }; - return i128; + return int128_make128(lo, (uint64_t)a.hi + b.hi + (lo < a.lo)); } static inline Int128 int128_neg(Int128 a) { uint64_t lo = 0-a.lo; - Int128 i128 = { lo, ~(uint64_t)a.hi + !lo }; - return i128; + return int128_make128(lo, ~(uint64_t)a.hi + !lo); } static inline Int128 int128_sub(Int128 a, Int128 b) { - Int128 i128 = { a.lo - b.lo, (uint64_t)a.hi - b.hi - (a.lo < b.lo) }; - return i128; + return int128_make128(a.lo - b.lo, (uint64_t)a.hi - b.hi - (a.lo < b.lo)); } static inline bool int128_nonneg(Int128 a)