From 93e3c0ae69ae73d7f04ac378c5df6e98c7faa6dd Mon Sep 17 00:00:00 2001 From: Aurelien Jarno Date: Tue, 26 Mar 2013 19:56:01 +0100 Subject: target-i386: SSE4.2: fix pcmpXstri instructions ffs1 returns the first bit set to one starting counting from the most significant bit. pcmpXstri returns the most significant bit set to one, starting counting from the least significant bit. Reviewed-by: Richard Henderson Signed-off-by: Aurelien Jarno --- target-i386/ops_sse.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/target-i386/ops_sse.h b/target-i386/ops_sse.h index 0136df9345..0667c879ca 100644 --- a/target-i386/ops_sse.h +++ b/target-i386/ops_sse.h @@ -2099,7 +2099,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 : ffs1)(res) - 1; + env->regs[R_ECX] = (ctrl & (1 << 6)) ? rffs1(res) - 1 : 32 - ffs1(res); } else { env->regs[R_ECX] = 16 >> (ctrl & (1 << 0)); } @@ -2137,7 +2137,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 : ffs1)(res) - 1; + env->regs[R_ECX] = (ctrl & (1 << 6)) ? rffs1(res) - 1 : 32 - ffs1(res); } else { env->regs[R_ECX] = 16 >> (ctrl & (1 << 0)); } -- cgit v1.2.3