diff options
author | Aurelien Jarno <aurelien@aurel32.net> | 2013-03-26 19:56:02 +0100 |
---|---|---|
committer | Aurelien Jarno <aurelien@aurel32.net> | 2013-04-01 18:49:17 +0200 |
commit | c334a3880c02d1d8299ed54057e3fffd99ad2048 (patch) | |
tree | b9f1a8f43c6ad9317f66767d087c6710aec9dd7b /target-i386/ops_sse.h | |
parent | 83f7dc28ca7cb422f88caf3923bf078abb4e4dea (diff) | |
download | hqemu-c334a3880c02d1d8299ed54057e3fffd99ad2048.zip hqemu-c334a3880c02d1d8299ed54057e3fffd99ad2048.tar.gz |
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/ops_sse.h')
-rw-r--r-- | target-i386/ops_sse.h | 32 |
1 files changed, 2 insertions, 30 deletions
diff --git a/target-i386/ops_sse.h b/target-i386/ops_sse.h index a0bac07..a11dba1 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)); } |