diff options
| author | Aurelien Jarno <aurelien@aurel32.net> | 2013-03-26 19:56:01 +0100 |
|---|---|---|
| committer | Aurelien Jarno <aurelien@aurel32.net> | 2013-04-01 18:49:15 +0200 |
| commit | 93e3c0ae69ae73d7f04ac378c5df6e98c7faa6dd (patch) | |
| tree | a51eef1ebbe5fc729bdade7c8c06d4f2fcda322f | |
| parent | da5156cd9a62274839d6fa685cc52614886cc722 (diff) | |
| download | focaccia-qemu-93e3c0ae69ae73d7f04ac378c5df6e98c7faa6dd.tar.gz focaccia-qemu-93e3c0ae69ae73d7f04ac378c5df6e98c7faa6dd.zip | |
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 <rth@twiddle.net> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
| -rw-r--r-- | target-i386/ops_sse.h | 4 |
1 files 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)); } |