include/qemu/int128.h: define struct Int128 according to the host endianness
Suggested-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Matheus Ferst <matheus.ferst@eldorado.org.br> Message-Id: <20210826141446.2488609-2-matheus.ferst@eldorado.org.br> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
dd4e4d1296
commit
181b0c333d
@ -162,24 +162,37 @@ static inline Int128 bswap128(Int128 a)
|
|||||||
|
|
||||||
typedef struct Int128 Int128;
|
typedef struct Int128 Int128;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We guarantee that the in-memory byte representation of an
|
||||||
|
* Int128 is that of a host-endian-order 128-bit integer
|
||||||
|
* (whether using this struct or the __int128_t version of the type).
|
||||||
|
* Some code using this type relies on this (eg when copying it into
|
||||||
|
* guest memory or a gdb protocol buffer, or by using Int128 in
|
||||||
|
* a union with other integer types).
|
||||||
|
*/
|
||||||
struct Int128 {
|
struct Int128 {
|
||||||
|
#ifdef HOST_WORDS_BIGENDIAN
|
||||||
|
int64_t hi;
|
||||||
|
uint64_t lo;
|
||||||
|
#else
|
||||||
uint64_t lo;
|
uint64_t lo;
|
||||||
int64_t hi;
|
int64_t hi;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline Int128 int128_make64(uint64_t a)
|
static inline Int128 int128_make64(uint64_t a)
|
||||||
{
|
{
|
||||||
return (Int128) { a, 0 };
|
return (Int128) { .lo = a, .hi = 0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline Int128 int128_makes64(int64_t a)
|
static inline Int128 int128_makes64(int64_t a)
|
||||||
{
|
{
|
||||||
return (Int128) { a, a >> 63 };
|
return (Int128) { .lo = a, .hi = a >> 63 };
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline Int128 int128_make128(uint64_t lo, uint64_t hi)
|
static inline Int128 int128_make128(uint64_t lo, uint64_t hi)
|
||||||
{
|
{
|
||||||
return (Int128) { lo, hi };
|
return (Int128) { .lo = lo, .hi = hi };
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint64_t int128_get64(Int128 a)
|
static inline uint64_t int128_get64(Int128 a)
|
||||||
@ -210,22 +223,22 @@ static inline Int128 int128_one(void)
|
|||||||
|
|
||||||
static inline Int128 int128_2_64(void)
|
static inline Int128 int128_2_64(void)
|
||||||
{
|
{
|
||||||
return (Int128) { 0, 1 };
|
return int128_make128(0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline Int128 int128_exts64(int64_t a)
|
static inline Int128 int128_exts64(int64_t a)
|
||||||
{
|
{
|
||||||
return (Int128) { .lo = a, .hi = (a < 0) ? -1 : 0 };
|
return int128_make128(a, (a < 0) ? -1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline Int128 int128_and(Int128 a, Int128 b)
|
static inline Int128 int128_and(Int128 a, Int128 b)
|
||||||
{
|
{
|
||||||
return (Int128) { a.lo & b.lo, a.hi & b.hi };
|
return int128_make128(a.lo & b.lo, a.hi & b.hi);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline Int128 int128_or(Int128 a, Int128 b)
|
static inline Int128 int128_or(Int128 a, Int128 b)
|
||||||
{
|
{
|
||||||
return (Int128) { a.lo | b.lo, a.hi | b.hi };
|
return int128_make128(a.lo | b.lo, a.hi | b.hi);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline Int128 int128_rshift(Int128 a, int n)
|
static inline Int128 int128_rshift(Int128 a, int n)
|
||||||
|
Loading…
Reference in New Issue
Block a user