mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 08:43:55 -06:00
host-utils: Use __int128_t for mul[us]64
Replace some x86_64 specific inline assembly with something that all 64-bit hosts ought to optimize well. At worst this becomes a call to the gcc __multi3 routine, which is no worse than our implementation in util/host-utils.c. With gcc 4.7, we get identical code generation for x86_64. We now get native multiplication on ia64 and s390x hosts. With minor improvements to gcc we can get it for ppc64 as well. Signed-off-by: Richard Henderson <rth@twiddle.net> Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
This commit is contained in:
parent
be96bd3fbf
commit
f540166b7d
3 changed files with 30 additions and 11 deletions
|
@ -28,22 +28,21 @@
|
|||
#include "qemu/compiler.h" /* QEMU_GNUC_PREREQ */
|
||||
#include <limits.h>
|
||||
|
||||
#if defined(__x86_64__)
|
||||
#define __HAVE_FAST_MULU64__
|
||||
#ifdef CONFIG_INT128
|
||||
static inline void mulu64(uint64_t *plow, uint64_t *phigh,
|
||||
uint64_t a, uint64_t b)
|
||||
{
|
||||
__asm__ ("mul %0\n\t"
|
||||
: "=d" (*phigh), "=a" (*plow)
|
||||
: "a" (a), "0" (b));
|
||||
__uint128_t r = (__uint128_t)a * b;
|
||||
*plow = r;
|
||||
*phigh = r >> 64;
|
||||
}
|
||||
#define __HAVE_FAST_MULS64__
|
||||
|
||||
static inline void muls64(uint64_t *plow, uint64_t *phigh,
|
||||
int64_t a, int64_t b)
|
||||
{
|
||||
__asm__ ("imul %0\n\t"
|
||||
: "=d" (*phigh), "=a" (*plow)
|
||||
: "a" (a), "0" (b));
|
||||
__int128_t r = (__int128_t)a * b;
|
||||
*plow = r;
|
||||
*phigh = r >> 64;
|
||||
}
|
||||
#else
|
||||
void muls64(uint64_t *phigh, uint64_t *plow, int64_t a, int64_t b);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue