qemu/int128: add int128_urshift
Implement an unsigned right shift for Int128 values and add the same tests cases of int128_rshift in the unit test. Signed-off-by: Matheus Ferst <matheus.ferst@eldorado.org.br> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20220330175932.6995-3-matheus.ferst@eldorado.org.br> [danielhb: fixed long lines in test_urshift()] Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
This commit is contained in:
parent
f290a23868
commit
613cf0fcba
2 changed files with 69 additions and 0 deletions
|
|
@ -83,6 +83,11 @@ static inline Int128 int128_rshift(Int128 a, int n)
|
|||
return a >> n;
|
||||
}
|
||||
|
||||
static inline Int128 int128_urshift(Int128 a, int n)
|
||||
{
|
||||
return (__uint128_t)a >> n;
|
||||
}
|
||||
|
||||
static inline Int128 int128_lshift(Int128 a, int n)
|
||||
{
|
||||
return a << n;
|
||||
|
|
@ -299,6 +304,20 @@ static inline Int128 int128_rshift(Int128 a, int n)
|
|||
}
|
||||
}
|
||||
|
||||
static inline Int128 int128_urshift(Int128 a, int n)
|
||||
{
|
||||
uint64_t h = a.hi;
|
||||
if (!n) {
|
||||
return a;
|
||||
}
|
||||
h = h >> (n & 63);
|
||||
if (n >= 64) {
|
||||
return int128_make64(h);
|
||||
} else {
|
||||
return int128_make128((a.lo >> n) | ((uint64_t)a.hi << (64 - n)), h);
|
||||
}
|
||||
}
|
||||
|
||||
static inline Int128 int128_lshift(Int128 a, int n)
|
||||
{
|
||||
uint64_t l = a.lo << (n & 63);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue