mirror of https://github.com/x64dbg/zydis
Minor optimizations and bugfixes
- Fixed `XCHG R8, RAX` falsely beeing decoded as `NOP` - Fixed `EVEX/MVEX.R'` not beeing ignored in 16- and 32-bit mode - Removed some unnecessary conditions from operand-action related code
This commit is contained in:
parent
7074e363f0
commit
61f607e1df
|
@ -1994,7 +1994,7 @@ FinalizeOperand:
|
||||||
|
|
||||||
#if !defined(ZYDIS_DISABLE_EVEX) || !defined(ZYDIS_DISABLE_MVEX)
|
#if !defined(ZYDIS_DISABLE_EVEX) || !defined(ZYDIS_DISABLE_MVEX)
|
||||||
// Fix operand-action for EVEX instructions with merge-mask
|
// Fix operand-action for EVEX instructions with merge-mask
|
||||||
if (((instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_EVEX) ||
|
/*if (((instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_EVEX) ||
|
||||||
(instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX)) &&
|
(instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX)) &&
|
||||||
(instruction->avx.mask.mode == ZYDIS_MASK_MODE_MERGE) &&
|
(instruction->avx.mask.mode == ZYDIS_MASK_MODE_MERGE) &&
|
||||||
(instruction->operandCount >= 3) &&
|
(instruction->operandCount >= 3) &&
|
||||||
|
@ -2027,6 +2027,28 @@ FinalizeOperand:
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}*/
|
||||||
|
if (instruction->avx.mask.reg && (instruction->avx.mask.mode == ZYDIS_MASK_MODE_MERGE) &&
|
||||||
|
!instruction->avx.mask.isControlMask)
|
||||||
|
{
|
||||||
|
ZYDIS_ASSERT(instruction->operandCount >= 2);
|
||||||
|
switch (instruction->operands[0].action)
|
||||||
|
{
|
||||||
|
case ZYDIS_OPERAND_ACTION_WRITE:
|
||||||
|
if (instruction->operands[0].type == ZYDIS_OPERAND_TYPE_MEMORY)
|
||||||
|
{
|
||||||
|
instruction->operands[0].action = ZYDIS_OPERAND_ACTION_CONDWRITE;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
instruction->operands[0].action = ZYDIS_OPERAND_ACTION_READ_CONDWRITE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ZYDIS_OPERAND_ACTION_READWRITE:
|
||||||
|
instruction->operands[0].action = ZYDIS_OPERAND_ACTION_READ_CONDWRITE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -4152,7 +4174,7 @@ static ZydisStatus ZydisCheckErrorConditions(ZydisDecoderContext* context,
|
||||||
case ZYDIS_REG_CONSTRAINTS_NONE:
|
case ZYDIS_REG_CONSTRAINTS_NONE:
|
||||||
break;
|
break;
|
||||||
case ZYDIS_REG_CONSTRAINTS_GPR:
|
case ZYDIS_REG_CONSTRAINTS_GPR:
|
||||||
if (context->cache.R2)
|
if ((context->decoder->machineMode == ZYDIS_MACHINE_MODE_LONG_64) && context->cache.R2)
|
||||||
{
|
{
|
||||||
return ZYDIS_STATUS_BAD_REGISTER;
|
return ZYDIS_STATUS_BAD_REGISTER;
|
||||||
}
|
}
|
||||||
|
@ -4198,8 +4220,8 @@ static ZydisStatus ZydisCheckErrorConditions(ZydisDecoderContext* context,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ZYDIS_REG_CONSTRAINTS_MASK:
|
case ZYDIS_REG_CONSTRAINTS_MASK:
|
||||||
// TODO: ZYDIS_ASSERT(!context->cache.R2) ?
|
if ((context->decoder->machineMode == ZYDIS_MACHINE_MODE_LONG_64) &&
|
||||||
if (context->cache.R || context->cache.R2)
|
(context->cache.R || context->cache.R2))
|
||||||
{
|
{
|
||||||
return ZYDIS_STATUS_BAD_REGISTER;
|
return ZYDIS_STATUS_BAD_REGISTER;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2620,7 +2620,7 @@ const ZydisDecoderTreeNode filtersMandatoryPrefix[][5] =
|
||||||
{ ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x5), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x7) },
|
{ ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x5), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x6), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x7) },
|
||||||
{ ZYDIS_DEFINITION(0x0, 0x3E4), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x3E5), ZYDIS_DEFINITION(0x0, 0x3E6) },
|
{ ZYDIS_DEFINITION(0x0, 0x3E4), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x3E5), ZYDIS_DEFINITION(0x0, 0x3E6) },
|
||||||
{ ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x8), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0xA) },
|
{ ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x8), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x9), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0xA) },
|
||||||
{ ZYDIS_DEFINITION(0x0, 0x390), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_B, 0x0), ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x436), ZYDIS_INVALID },
|
{ ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_REX_B, 0x0), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x436), ZYDIS_INVALID },
|
||||||
{ ZYDIS_DEFINITION(0x0, 0x353), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x354), ZYDIS_DEFINITION(0x0, 0x355) },
|
{ ZYDIS_DEFINITION(0x0, 0x353), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0x354), ZYDIS_DEFINITION(0x0, 0x355) },
|
||||||
{ ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x11), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x12), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x13) },
|
{ ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x11), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x12), ZYDIS_FILTER(ZYDIS_NODETYPE_FILTER_OPERAND_SIZE, 0x13) },
|
||||||
{ ZYDIS_DEFINITION(0x0, 0xEB), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0xEC), ZYDIS_DEFINITION(0x0, 0xED) },
|
{ ZYDIS_DEFINITION(0x0, 0xEB), ZYDIS_INVALID, ZYDIS_INVALID, ZYDIS_DEFINITION(0x0, 0xEC), ZYDIS_DEFINITION(0x0, 0xED) },
|
||||||
|
|
Loading…
Reference in New Issue