From fc0d9a82a5fd90f348fac7cb61dc81081d57f03f Mon Sep 17 00:00:00 2001 From: rose <47357290+rose4096@users.noreply.github.com> Date: Fri, 25 Mar 2022 19:42:23 -0400 Subject: [PATCH] Fix clang-cl compile with CONFIG_INT128 in qemu --- qemu/include/qemu/host-utils.h | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/qemu/include/qemu/host-utils.h b/qemu/include/qemu/host-utils.h index 2939025f..0c5b30ff 100644 --- a/qemu/include/qemu/host-utils.h +++ b/qemu/include/qemu/host-utils.h @@ -49,7 +49,29 @@ static inline void muls64(uint64_t *plow, uint64_t *phigh, /* compute with 96 bit intermediate result: (a*b)/c */ static inline uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c) { - return (__int128_t)a * b / c; + #if defined(_MSC_VER) && defined(__clang__) + union { + uint64_t ll; + struct { + #ifdef HOST_WORDS_BIGENDIAN + uint32_t high, low; + #else + uint32_t low, high; + #endif + } l; + } u, res; + uint64_t rl, rh; + + u.ll = a; + rl = (uint64_t)u.l.low * (uint64_t)b; + rh = (uint64_t)u.l.high * (uint64_t)b; + rh += (rl >> 32); + res.l.high = rh / c; + res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c; + return res.ll; + #else + return (__int128_t)a * b / c; + #endif } static inline int divu128(uint64_t *plow, uint64_t *phigh, uint64_t divisor)