Cleaned up register-decoding code

This commit is contained in:
flobernd 2017-06-28 19:50:33 +02:00
parent 55400e9206
commit b118637dae
5 changed files with 787 additions and 579 deletions

View File

@ -258,7 +258,7 @@ enum ZydisFormatterHookTypes
ZYDIS_FORMATTER_HOOK_PRINT_SEGMENT, ZYDIS_FORMATTER_HOOK_PRINT_SEGMENT,
/** /**
* @brief This function is called right after formatting an operand to print the optional * @brief This function is called right after formatting an operand to print the optional
* avx-512 operand decorator. * EVEX/MVEX operand-decorator.
*/ */
ZYDIS_FORMATTER_HOOK_PRINT_DECORATOR, ZYDIS_FORMATTER_HOOK_PRINT_DECORATOR,
/** /**

View File

@ -792,23 +792,7 @@ enum ZydisRoundingModes
/** /**
* @brief Round towards zero. * @brief Round towards zero.
*/ */
ZYDIS_ROUNDING_MODE_RZ, ZYDIS_ROUNDING_MODE_RZ
/**
* @brief Round to nearest and suppress all exceptions.
*/
ZYDIS_ROUNDING_MODE_RN_SAE,
/**
* @brief Round down and suppress all exceptions.
*/
ZYDIS_ROUNDING_MODE_RD_SAE,
/**
* @brief Round up and suppress all exceptions.
*/
ZYDIS_ROUNDING_MODE_RU_SAE,
/**
* @brief Round towards zero and suppress all exceptions.
*/
ZYDIS_ROUNDING_MODE_RZ_SAE
}; };
/* ---------------------------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------------------------------- */

View File

@ -646,7 +646,7 @@ enum ZydisMaskPolicies
#define ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR \ #define ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR \
ZYDIS_INSTRUCTION_DEFINITION_BASE; \ ZYDIS_INSTRUCTION_DEFINITION_BASE; \
ZydisBool hasNDSOperand ZYDIS_BITFIELD( 1) ZydisBool hasNDSNDDOperand ZYDIS_BITFIELD( 1)
/** /**
* @brief Defines the @c ZydisInstructionDefinition struct. * @brief Defines the @c ZydisInstructionDefinition struct.

File diff suppressed because it is too large Load Diff

View File

@ -721,49 +721,58 @@ static ZydisStatus ZydisFormatterPrintDecoratorIntel(const ZydisInstructionForma
((operand->id != (info->operandCount - 1)) && ((operand->id != (info->operandCount - 1)) &&
(info->operands[operand->id + 1].type == ZYDIS_OPERAND_TYPE_IMMEDIATE))) (info->operands[operand->id + 1].type == ZYDIS_OPERAND_TYPE_IMMEDIATE)))
{ {
switch (info->avx.roundingMode) if (info->avx.hasSAE)
{ {
case ZYDIS_ROUNDING_MODE_INVALID: switch (info->avx.roundingMode)
if (info->avx.hasSAE)
{ {
case ZYDIS_ROUNDING_MODE_INVALID:
ZYDIS_CHECK(ZydisStringBufferAppend(buffer, bufEnd - *buffer, ZYDIS_CHECK(ZydisStringBufferAppend(buffer, bufEnd - *buffer,
ZYDIS_STRBUF_APPEND_MODE_DEFAULT, " {sae}")); ZYDIS_STRBUF_APPEND_MODE_DEFAULT, " {sae}"));
} break;
break; case ZYDIS_ROUNDING_MODE_RN:
case ZYDIS_ROUNDING_MODE_RN: ZYDIS_CHECK(ZydisStringBufferAppend(buffer, bufEnd - *buffer,
ZYDIS_CHECK(ZydisStringBufferAppend(buffer, bufEnd - *buffer, ZYDIS_STRBUF_APPEND_MODE_DEFAULT, " {rn-sae}"));
ZYDIS_STRBUF_APPEND_MODE_DEFAULT, " {rn}")); break;
break; case ZYDIS_ROUNDING_MODE_RD:
case ZYDIS_ROUNDING_MODE_RD: ZYDIS_CHECK(ZydisStringBufferAppend(buffer, bufEnd - *buffer,
ZYDIS_CHECK(ZydisStringBufferAppend(buffer, bufEnd - *buffer, ZYDIS_STRBUF_APPEND_MODE_DEFAULT, " {rd-sae}"));
ZYDIS_STRBUF_APPEND_MODE_DEFAULT, " {rd}")); break;
break; case ZYDIS_ROUNDING_MODE_RU:
case ZYDIS_ROUNDING_MODE_RU: ZYDIS_CHECK(ZydisStringBufferAppend(buffer, bufEnd - *buffer,
ZYDIS_CHECK(ZydisStringBufferAppend(buffer, bufEnd - *buffer, ZYDIS_STRBUF_APPEND_MODE_DEFAULT, " {ru-sae}"));
ZYDIS_STRBUF_APPEND_MODE_DEFAULT, " {ru}")); break;
break; case ZYDIS_ROUNDING_MODE_RZ:
case ZYDIS_ROUNDING_MODE_RZ: ZYDIS_CHECK(ZydisStringBufferAppend(buffer, bufEnd - *buffer,
ZYDIS_CHECK(ZydisStringBufferAppend(buffer, bufEnd - *buffer, ZYDIS_STRBUF_APPEND_MODE_DEFAULT, " {rz-sae}"));
ZYDIS_STRBUF_APPEND_MODE_DEFAULT, " {rz}")); break;
break; default:
case ZYDIS_ROUNDING_MODE_RN_SAE: return ZYDIS_STATUS_INVALID_PARAMETER;
ZYDIS_CHECK(ZydisStringBufferAppend(buffer, bufEnd - *buffer, }
ZYDIS_STRBUF_APPEND_MODE_DEFAULT, " {rn-sae}")); } else
break; {
case ZYDIS_ROUNDING_MODE_RD_SAE: switch (info->avx.roundingMode)
ZYDIS_CHECK(ZydisStringBufferAppend(buffer, bufEnd - *buffer, {
ZYDIS_STRBUF_APPEND_MODE_DEFAULT, " {rd-sae}")); case ZYDIS_ROUNDING_MODE_INVALID:
break; break;
case ZYDIS_ROUNDING_MODE_RU_SAE: case ZYDIS_ROUNDING_MODE_RN:
ZYDIS_CHECK(ZydisStringBufferAppend(buffer, bufEnd - *buffer, ZYDIS_CHECK(ZydisStringBufferAppend(buffer, bufEnd - *buffer,
ZYDIS_STRBUF_APPEND_MODE_DEFAULT, " {ru-sae}")); ZYDIS_STRBUF_APPEND_MODE_DEFAULT, " {rn}"));
break; break;
case ZYDIS_ROUNDING_MODE_RZ_SAE: case ZYDIS_ROUNDING_MODE_RD:
ZYDIS_CHECK(ZydisStringBufferAppend(buffer, bufEnd - *buffer, ZYDIS_CHECK(ZydisStringBufferAppend(buffer, bufEnd - *buffer,
ZYDIS_STRBUF_APPEND_MODE_DEFAULT, " {rz-sae}")); ZYDIS_STRBUF_APPEND_MODE_DEFAULT, " {rd}"));
break; break;
default: case ZYDIS_ROUNDING_MODE_RU:
return ZYDIS_STATUS_INVALID_PARAMETER; ZYDIS_CHECK(ZydisStringBufferAppend(buffer, bufEnd - *buffer,
ZYDIS_STRBUF_APPEND_MODE_DEFAULT, " {ru}"));
break;
case ZYDIS_ROUNDING_MODE_RZ:
ZYDIS_CHECK(ZydisStringBufferAppend(buffer, bufEnd - *buffer,
ZYDIS_STRBUF_APPEND_MODE_DEFAULT, " {rz}"));
break;
default:
return ZYDIS_STATUS_INVALID_PARAMETER;
}
} }
switch (info->avx.swizzleMode) switch (info->avx.swizzleMode)