diff options
author | Aurelien Jarno | 2013-03-26 19:56:02 +0100 |
---|---|---|
committer | Aurelien Jarno | 2013-04-01 18:49:17 +0200 |
commit | c334a3880c02d1d8299ed54057e3fffd99ad2048 (patch) | |
tree | b9f1a8f43c6ad9317f66767d087c6710aec9dd7b /target-i386 | |
parent | target-i386: enable SSE4.1 and SSE4.2 in TCG mode (diff) | |
download | qemu-c334a3880c02d1d8299ed54057e3fffd99ad2048.tar.gz qemu-c334a3880c02d1d8299ed54057e3fffd99ad2048.tar.xz qemu-c334a3880c02d1d8299ed54057e3fffd99ad2048.zip |
target-i386: SSE4.2: use clz32/ctz32 instead of reinventing the wheel
Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
Diffstat (limited to 'target-i386')
-rw-r--r-- | target-i386/fpu_helper.c | 1 | ||||
-rw-r--r-- | target-i386/ops_sse.h | 32 |
2 files changed, 3 insertions, 30 deletions
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 <math.h> #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)); } |