/***************************************************************************************************12Zyan Disassembler Library (Zydis)34Original Author : Florian Bernd56* Permission is hereby granted, free of charge, to any person obtaining a copy7* of this software and associated documentation files (the "Software"), to deal8* in the Software without restriction, including without limitation the rights9* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell10* copies of the Software, and to permit persons to whom the Software is11* furnished to do so, subject to the following conditions:12*13* The above copyright notice and this permission notice shall be included in all14* copies or substantial portions of the Software.15*16* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR17* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,18* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE19* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER20* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,21* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE22* SOFTWARE.2324***************************************************************************************************/2526#include <Zydis/Internal/SharedData.h>2728/* ============================================================================================== */29/* Data tables */30/* ============================================================================================== */3132/* ---------------------------------------------------------------------------------------------- */33/* Instruction definitions */34/* ---------------------------------------------------------------------------------------------- */3536#ifdef ZYDIS_MINIMAL_MODE37# define ZYDIS_NOTMIN(x)38#else39# define ZYDIS_NOTMIN(x) , x40#endif4142#include <Generated/InstructionDefinitions.inc>4344#undef ZYDIS_NOTMIN4546/* ---------------------------------------------------------------------------------------------- */47/* Operand definitions */48/* ---------------------------------------------------------------------------------------------- */4950#define ZYDIS_OPERAND_DEFINITION(type, encoding, access) \51{ type, encoding, access }5253#include <Generated/OperandDefinitions.inc>5455#undef ZYDIS_OPERAND_DEFINITION5657/* ---------------------------------------------------------------------------------------------- */58/* Accessed CPU flags */59/* ---------------------------------------------------------------------------------------------- */6061#include <Generated/AccessedFlags.inc>6263/* ---------------------------------------------------------------------------------------------- */6465/* ============================================================================================== */66/* Functions */67/* ============================================================================================== */6869/* ---------------------------------------------------------------------------------------------- */70/* Instruction definition */71/* ---------------------------------------------------------------------------------------------- */7273void ZydisGetInstructionDefinition(ZydisInstructionEncoding encoding, ZyanU16 id,74const ZydisInstructionDefinition** definition)75{76switch (encoding)77{78case ZYDIS_INSTRUCTION_ENCODING_LEGACY:79*definition = (ZydisInstructionDefinition*)&ISTR_DEFINITIONS_LEGACY[id];80break;81case ZYDIS_INSTRUCTION_ENCODING_3DNOW:82*definition = (ZydisInstructionDefinition*)&ISTR_DEFINITIONS_3DNOW[id];83break;84case ZYDIS_INSTRUCTION_ENCODING_XOP:85*definition = (ZydisInstructionDefinition*)&ISTR_DEFINITIONS_XOP[id];86break;87case ZYDIS_INSTRUCTION_ENCODING_VEX:88*definition = (ZydisInstructionDefinition*)&ISTR_DEFINITIONS_VEX[id];89break;90#ifndef ZYDIS_DISABLE_AVX51291case ZYDIS_INSTRUCTION_ENCODING_EVEX:92*definition = (ZydisInstructionDefinition*)&ISTR_DEFINITIONS_EVEX[id];93break;94#endif95#ifndef ZYDIS_DISABLE_KNC96case ZYDIS_INSTRUCTION_ENCODING_MVEX:97*definition = (ZydisInstructionDefinition*)&ISTR_DEFINITIONS_MVEX[id];98break;99#endif100default:101ZYAN_UNREACHABLE;102}103}104105/* ---------------------------------------------------------------------------------------------- */106/* Operand definition */107/* ---------------------------------------------------------------------------------------------- */108109#ifndef ZYDIS_MINIMAL_MODE110const ZydisOperandDefinition* ZydisGetOperandDefinitions(111const ZydisInstructionDefinition* definition)112{113if (definition->operand_count == 0)114{115return ZYAN_NULL;116}117ZYAN_ASSERT(definition->operand_reference != 0xFFFF);118return &OPERAND_DEFINITIONS[definition->operand_reference];119}120#endif121122/* ---------------------------------------------------------------------------------------------- */123/* Element info */124/* ---------------------------------------------------------------------------------------------- */125126#ifndef ZYDIS_MINIMAL_MODE127void ZydisGetElementInfo(ZydisInternalElementType element, ZydisElementType* type,128ZydisElementSize* size)129{130static const struct131{132ZydisElementType type;133ZydisElementSize size;134} lookup[ZYDIS_IELEMENT_TYPE_MAX_VALUE + 1] =135{136{ ZYDIS_ELEMENT_TYPE_INVALID , 0 },137{ ZYDIS_ELEMENT_TYPE_INVALID , 0 },138{ ZYDIS_ELEMENT_TYPE_STRUCT , 0 },139{ ZYDIS_ELEMENT_TYPE_INT , 0 },140{ ZYDIS_ELEMENT_TYPE_UINT , 0 },141{ ZYDIS_ELEMENT_TYPE_INT , 1 },142{ ZYDIS_ELEMENT_TYPE_INT , 8 },143{ ZYDIS_ELEMENT_TYPE_INT , 16 },144{ ZYDIS_ELEMENT_TYPE_INT , 32 },145{ ZYDIS_ELEMENT_TYPE_INT , 64 },146{ ZYDIS_ELEMENT_TYPE_UINT , 8 },147{ ZYDIS_ELEMENT_TYPE_UINT , 16 },148{ ZYDIS_ELEMENT_TYPE_UINT , 32 },149{ ZYDIS_ELEMENT_TYPE_UINT , 64 },150{ ZYDIS_ELEMENT_TYPE_UINT , 128 },151{ ZYDIS_ELEMENT_TYPE_UINT , 256 },152{ ZYDIS_ELEMENT_TYPE_FLOAT16 , 16 },153{ ZYDIS_ELEMENT_TYPE_FLOAT16 , 32 }, // TODO: Should indicate 2 float16 elements154{ ZYDIS_ELEMENT_TYPE_FLOAT32 , 32 },155{ ZYDIS_ELEMENT_TYPE_FLOAT64 , 64 },156{ ZYDIS_ELEMENT_TYPE_FLOAT80 , 80 },157{ ZYDIS_ELEMENT_TYPE_LONGBCD , 80 },158{ ZYDIS_ELEMENT_TYPE_CC , 3 },159{ ZYDIS_ELEMENT_TYPE_CC , 5 }160};161162ZYAN_ASSERT((ZyanUSize)element < ZYAN_ARRAY_LENGTH(lookup));163164*type = lookup[element].type;165*size = lookup[element].size;166}167#endif168169/* ---------------------------------------------------------------------------------------------- */170/* Accessed CPU flags */171/* ---------------------------------------------------------------------------------------------- */172173#ifndef ZYDIS_MINIMAL_MODE174ZyanBool ZydisGetAccessedFlags(const ZydisInstructionDefinition* definition,175const ZydisDefinitionAccessedFlags** flags)176{177ZYAN_ASSERT(definition->flags_reference < ZYAN_ARRAY_LENGTH(ACCESSED_FLAGS));178*flags = &ACCESSED_FLAGS[definition->flags_reference];179return (definition->flags_reference != 0);180}181#endif182183/* ---------------------------------------------------------------------------------------------- */184185/* ============================================================================================== */186187188