Fixed decoding of MASK register (again)

This commit is contained in:
flobernd 2017-06-29 21:12:22 +02:00
parent c2a531902c
commit 392c36c85f
1 changed files with 8 additions and 6 deletions

View File

@ -906,6 +906,10 @@ static uint8_t ZydisCalcRegisterId(ZydisDecoderContext* context, ZydisInstructio
{ {
ZYDIS_ASSERT(info->details.modrm.isDecoded); ZYDIS_ASSERT(info->details.modrm.isDecoded);
uint8_t value = info->details.modrm.reg; uint8_t value = info->details.modrm.reg;
if (registerClass != ZYDIS_REGCLASS_MASK)
{
value |= (context->cache.R << 3);
}
// R' only exists for EVEX and MVEX. No encoding check needed // R' only exists for EVEX and MVEX. No encoding check needed
switch (registerClass) switch (registerClass)
{ {
@ -914,10 +918,7 @@ static uint8_t ZydisCalcRegisterId(ZydisDecoderContext* context, ZydisInstructio
case ZYDIS_REGCLASS_ZMM: case ZYDIS_REGCLASS_ZMM:
value |= (context->cache.R2 << 4); value |= (context->cache.R2 << 4);
break; break;
case ZYDIS_REGCLASS_MASK:
break;
default: default:
value |= (context->cache.R << 3);
break; break;
} }
return value; return value;
@ -939,6 +940,10 @@ static uint8_t ZydisCalcRegisterId(ZydisDecoderContext* context, ZydisInstructio
{ {
ZYDIS_ASSERT(info->details.modrm.isDecoded); ZYDIS_ASSERT(info->details.modrm.isDecoded);
uint8_t value = info->details.modrm.rm; uint8_t value = info->details.modrm.rm;
if (registerClass != ZYDIS_REGCLASS_MASK)
{
value |= (context->cache.B << 3);
}
// We have to check the instruction-encoding, because the extension by X is only valid // We have to check the instruction-encoding, because the extension by X is only valid
// for EVEX and MVEX instructions // for EVEX and MVEX instructions
if ((info->encoding == ZYDIS_INSTRUCTION_ENCODING_EVEX) || if ((info->encoding == ZYDIS_INSTRUCTION_ENCODING_EVEX) ||
@ -951,10 +956,7 @@ static uint8_t ZydisCalcRegisterId(ZydisDecoderContext* context, ZydisInstructio
case ZYDIS_REGCLASS_ZMM: case ZYDIS_REGCLASS_ZMM:
value |= (context->cache.X << 4); value |= (context->cache.X << 4);
break; break;
case ZYDIS_REGCLASS_MASK:
break;
default: default:
value |= (context->cache.B << 3);
break; break;
} }
} }