From c334a3880c02d1d8299ed54057e3fffd99ad2048 Mon Sep 17 00:00:00 2001 From: Aurelien Jarno Date: Tue, 26 Mar 2013 19:56:02 +0100 Subject: target-i386: SSE4.2: use clz32/ctz32 instead of reinventing the wheel Reviewed-by: Richard Henderson Signed-off-by: Aurelien Jarno --- target-i386/fpu_helper.c | 1 + target-i386/ops_sse.h | 32 ++------------------------------ 2 files changed, 3 insertions(+), 30 deletions(-) (limited to 'target-i386') diff --git a/target-i386/fpu_helper.c b/target-i386/fpu_helper.c index 44f3d27944..29a8fb68f8 100644 --- a/target-i386/fpu_helper.c +++ b/target-i386/fpu_helper.c @@ -20,6 +20,7 @@ #include #include "cpu.h" #include "helper.h" +#include "qemu/host-utils.h" #if !defined(CONFIG_USER_ONLY) #include "exec/softmmu_exec.h" diff --git a/target-i386/ops_sse.h b/target-i386/ops_sse.h index a0bac07ba3..a11dba1566 100644 --- a/target-i386/ops_sse.h +++ b/target-i386/ops_sse.h @@ -2064,34 +2064,6 @@ static inline unsigned pcmpxstrx(CPUX86State *env, Reg *d, Reg *s, return res; } -static inline int rffs1(unsigned int val) -{ - int ret = 1, hi; - - for (hi = sizeof(val) * 4; hi; hi /= 2) { - if (val >> hi) { - val >>= hi; - ret += hi; - } - } - - return ret; -} - -static inline int ffs1(unsigned int val) -{ - int ret = 1, hi; - - for (hi = sizeof(val) * 4; hi; hi /= 2) { - if (val << hi) { - val <<= hi; - ret += hi; - } - } - - return ret; -} - void glue(helper_pcmpestri, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, uint32_t ctrl) { @@ -2100,7 +2072,7 @@ void glue(helper_pcmpestri, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, pcmp_elen(env, R_EAX, ctrl)); if (res) { - env->regs[R_ECX] = (ctrl & (1 << 6)) ? rffs1(res) - 1 : 32 - ffs1(res); + env->regs[R_ECX] = (ctrl & (1 << 6)) ? 31 - clz32(res) : ctz32(res); } else { env->regs[R_ECX] = 16 >> (ctrl & (1 << 0)); } @@ -2138,7 +2110,7 @@ void glue(helper_pcmpistri, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, pcmp_ilen(d, ctrl)); if (res) { - env->regs[R_ECX] = (ctrl & (1 << 6)) ? rffs1(res) - 1 : 32 - ffs1(res); + env->regs[R_ECX] = (ctrl & (1 << 6)) ? 31 - clz32(res) : ctz32(res); } else { env->regs[R_ECX] = 16 >> (ctrl & (1 << 0)); } -- cgit v1.2.1