i386: added TZCNT instruction handling by having it fall back to use BSF, as it would on a CPU that doesn't support TZCNT.

This commit is contained in:
mahlemiut 2013-11-22 01:35:49 +00:00
parent 91b8d7f8b0
commit 8b0403a06d
2 changed files with 15 additions and 0 deletions

View File

@ -525,6 +525,7 @@ static const X86_OPCODE x86_opcode_table[] =
{ 0x7E, OP_3BYTEF3|OP_SSE, SSEOP(movq_r128_r128m64), SSEOP(movq_r128_r128m64), },
{ 0x7F, OP_3BYTEF3|OP_SSE, SSEOP(movdqu_rm128_r128), SSEOP(movdqu_rm128_r128), },
{ 0xB8, OP_3BYTEF3|OP_PENTIUM, PENTIUMOP(popcnt_r16_rm16), PENTIUMOP(popcnt_r32_rm32), },
{ 0xBC, OP_3BYTEF3|OP_PENTIUM, PENTIUMOP(tzcnt_r16_rm16), PENTIUMOP(tzcnt_r32_rm32), },
{ 0xC2, OP_3BYTEF3|OP_SSE, SSEOP(cmpss_r128_r128m32_i8), SSEOP(cmpss_r128_r128m32_i8),},
{ 0xD6, OP_3BYTEF3|OP_SSE, SSEOP(movq2dq_r128_r64), SSEOP(movq2dq_r128_r64), },
{ 0xE6, OP_3BYTEF3|OP_SSE, SSEOP(cvtdq2pd_r128_r128m64), SSEOP(cvtdq2pd_r128_r128m64)}

View File

@ -1159,6 +1159,20 @@ static void PENTIUMOP(popcnt_r32_rm32)(i386_state *cpustate) // Opcode f3 0f
CYCLES(cpustate,1); // TODO: correct cycle count
}
static void PENTIUMOP(tzcnt_r16_rm16)(i386_state *cpustate)
{
// for CPUs that don't support TZCNT, fall back to BSF
i386_bsf_r16_rm16(cpustate);
// TODO: actually implement TZCNT
}
static void PENTIUMOP(tzcnt_r32_rm32)(i386_state *cpustate)
{
// for CPUs that don't support TZCNT, fall back to BSF
i386_bsf_r32_rm32(cpustate);
// TODO: actually implement TZCNT
}
INLINE INT8 SaturatedSignedWordToSignedByte(INT16 word)
{
if (word > 127)