mirror of
				https://github.com/RetroDECK/Duckstation.git
				synced 2025-04-10 19:15:14 +00:00 
			
		
		
		
	
		
			
	
	
		
			980 lines
		
	
	
		
			33 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			980 lines
		
	
	
		
			33 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /***************************************************************************************************
 | ||
|  | 
 | ||
|  |   Zyan Disassembler Library (Zydis) | ||
|  | 
 | ||
|  |   Original Author : Florian Bernd | ||
|  | 
 | ||
|  |  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||
|  |  * of this software and associated documentation files (the "Software"), to deal | ||
|  |  * in the Software without restriction, including without limitation the rights | ||
|  |  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
|  |  * copies of the Software, and to permit persons to whom the Software is | ||
|  |  * furnished to do so, subject to the following conditions: | ||
|  |  * | ||
|  |  * The above copyright notice and this permission notice shall be included in all | ||
|  |  * copies or substantial portions of the Software. | ||
|  |  * | ||
|  |  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
|  |  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
|  |  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
|  |  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
|  |  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
|  |  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
|  |  * SOFTWARE. | ||
|  | 
 | ||
|  | ***************************************************************************************************/ | ||
|  | 
 | ||
|  | #ifndef ZYDIS_INTERNAL_SHAREDDATA_H
 | ||
|  | #define ZYDIS_INTERNAL_SHAREDDATA_H
 | ||
|  | 
 | ||
|  | #include <Zycore/Defines.h>
 | ||
|  | #include <Zydis/Mnemonic.h>
 | ||
|  | #include <Zydis/Register.h>
 | ||
|  | #include <Zydis/SharedTypes.h>
 | ||
|  | #include <Zydis/DecoderTypes.h>
 | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | extern "C" { | ||
|  | #endif
 | ||
|  | 
 | ||
|  | /* ============================================================================================== */ | ||
|  | /* Enums and types                                                                                */ | ||
|  | /* ============================================================================================== */ | ||
|  | 
 | ||
|  | // MSVC does not like types other than (un-)signed int for bit-fields
 | ||
|  | #ifdef ZYAN_MSVC
 | ||
|  | #   pragma warning(push)
 | ||
|  | #   pragma warning(disable:4214)
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #pragma pack(push, 1)
 | ||
|  | 
 | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | /* Operand definition                                                                             */ | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Defines the `ZydisSemanticOperandType` enum. | ||
|  |  */ | ||
|  | typedef enum ZydisSemanticOperandType_ | ||
|  | { | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_UNUSED, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_IMM1, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_GPR8, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_GPR16, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_GPR32, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_GPR64, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_GPR16_32_32, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_GPR_ASZ, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_FPR, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_MMX, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_XMM, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_YMM, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_ZMM, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_TMM, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_BND, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_SREG, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_CR, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_DR, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_MASK, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_MEM, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_IMM, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_REL, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_PTR, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_AGEN, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_MOFFS, | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_MIB, | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * Maximum value of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_MAX_VALUE = ZYDIS_SEMANTIC_OPTYPE_MIB, | ||
|  |     /**
 | ||
|  |      * The minimum number of bits required to represent all values of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_SEMANTIC_OPTYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_SEMANTIC_OPTYPE_MAX_VALUE) | ||
|  | } ZydisSemanticOperandType; | ||
|  | 
 | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Defines the `ZydisInternalElementType` enum. | ||
|  |  */ | ||
|  | typedef enum ZydisInternalElementType_ | ||
|  | { | ||
|  |     ZYDIS_IELEMENT_TYPE_INVALID, | ||
|  |     ZYDIS_IELEMENT_TYPE_VARIABLE, | ||
|  |     ZYDIS_IELEMENT_TYPE_STRUCT, | ||
|  |     ZYDIS_IELEMENT_TYPE_INT, | ||
|  |     ZYDIS_IELEMENT_TYPE_UINT, | ||
|  |     ZYDIS_IELEMENT_TYPE_INT1, | ||
|  |     ZYDIS_IELEMENT_TYPE_INT8, | ||
|  |     ZYDIS_IELEMENT_TYPE_INT16, | ||
|  |     ZYDIS_IELEMENT_TYPE_INT32, | ||
|  |     ZYDIS_IELEMENT_TYPE_INT64, | ||
|  |     ZYDIS_IELEMENT_TYPE_UINT8, | ||
|  |     ZYDIS_IELEMENT_TYPE_UINT16, | ||
|  |     ZYDIS_IELEMENT_TYPE_UINT32, | ||
|  |     ZYDIS_IELEMENT_TYPE_UINT64, | ||
|  |     ZYDIS_IELEMENT_TYPE_UINT128, | ||
|  |     ZYDIS_IELEMENT_TYPE_UINT256, | ||
|  |     ZYDIS_IELEMENT_TYPE_FLOAT16, | ||
|  |     ZYDIS_IELEMENT_TYPE_FLOAT16X2, | ||
|  |     ZYDIS_IELEMENT_TYPE_FLOAT32, | ||
|  |     ZYDIS_IELEMENT_TYPE_FLOAT64, | ||
|  |     ZYDIS_IELEMENT_TYPE_FLOAT80, | ||
|  |     ZYDIS_IELEMENT_TYPE_BCD80, | ||
|  |     ZYDIS_IELEMENT_TYPE_CC3, | ||
|  |     ZYDIS_IELEMENT_TYPE_CC5, | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * Maximum value of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_IELEMENT_TYPE_MAX_VALUE = ZYDIS_IELEMENT_TYPE_CC5, | ||
|  |     /**
 | ||
|  |      * The minimum number of bits required to represent all values of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_IELEMENT_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IELEMENT_TYPE_MAX_VALUE) | ||
|  | } ZydisInternalElementType; | ||
|  | 
 | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Defines the `ZydisImplicitRegisterType` enum. | ||
|  |  */ | ||
|  | typedef enum ZydisImplicitRegisterType_ | ||
|  | { | ||
|  |     // TODO: Rename OSZ|ASZ|SSZ_
 | ||
|  |     ZYDIS_IMPLREG_TYPE_STATIC, | ||
|  |     ZYDIS_IMPLREG_TYPE_GPR_OSZ, | ||
|  |     ZYDIS_IMPLREG_TYPE_GPR_ASZ, | ||
|  |     ZYDIS_IMPLREG_TYPE_IP_ASZ, | ||
|  |     ZYDIS_IMPLREG_TYPE_IP_SSZ, | ||
|  |     ZYDIS_IMPLREG_TYPE_GPR_SSZ, | ||
|  |     ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * Maximum value of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_IMPLREG_TYPE_MAX_VALUE = ZYDIS_IMPLREG_TYPE_FLAGS_SSZ, | ||
|  |     /**
 | ||
|  |      * The minimum number of bits required to represent all values of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_IMPLREG_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IMPLREG_TYPE_MAX_VALUE) | ||
|  | } ZydisImplicitRegisterType; | ||
|  | 
 | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Defines the `ZydisImplicitMemBase` enum. | ||
|  |  */ | ||
|  | typedef enum ZydisImplicitMemBase_ | ||
|  | { | ||
|  |     // TODO: Rename OSZ|ASZ|SSZ_
 | ||
|  |     ZYDIS_IMPLMEM_BASE_AGPR_REG, | ||
|  |     ZYDIS_IMPLMEM_BASE_AGPR_RM, | ||
|  |     ZYDIS_IMPLMEM_BASE_AAX, | ||
|  |     ZYDIS_IMPLMEM_BASE_ADX, | ||
|  |     ZYDIS_IMPLMEM_BASE_ABX, | ||
|  |     ZYDIS_IMPLMEM_BASE_ASI, | ||
|  |     ZYDIS_IMPLMEM_BASE_ADI, | ||
|  |     ZYDIS_IMPLMEM_BASE_SSP, | ||
|  |     ZYDIS_IMPLMEM_BASE_SBP, | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * Maximum value of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_IMPLMEM_BASE_MAX_VALUE = ZYDIS_IMPLMEM_BASE_SBP, | ||
|  |     /**
 | ||
|  |      * The minimum number of bits required to represent all values of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_IMPLMEM_BASE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IMPLMEM_BASE_MAX_VALUE) | ||
|  | } ZydisImplicitMemBase; | ||
|  | 
 | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | 
 | ||
|  | // MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct
 | ||
|  | // enum types
 | ||
|  | ZYAN_STATIC_ASSERT(ZYDIS_SEMANTIC_OPTYPE_REQUIRED_BITS     <=  8); | ||
|  | ZYAN_STATIC_ASSERT(ZYDIS_OPERAND_VISIBILITY_REQUIRED_BITS  <=  8); | ||
|  | ZYAN_STATIC_ASSERT(ZYDIS_OPERAND_ACTION_REQUIRED_BITS      <=  8); | ||
|  | ZYAN_STATIC_ASSERT(ZYDIS_IELEMENT_TYPE_REQUIRED_BITS       <=  8); | ||
|  | ZYAN_STATIC_ASSERT(ZYDIS_OPERAND_ENCODING_REQUIRED_BITS    <=  8); | ||
|  | ZYAN_STATIC_ASSERT(ZYDIS_IMPLREG_TYPE_REQUIRED_BITS        <=  8); | ||
|  | ZYAN_STATIC_ASSERT(ZYDIS_REGISTER_REQUIRED_BITS            <= 16); | ||
|  | ZYAN_STATIC_ASSERT(ZYDIS_IMPLMEM_BASE_REQUIRED_BITS        <=  8); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Defines the `ZydisOperandDefinition` struct. | ||
|  |  */ | ||
|  | typedef struct ZydisOperandDefinition_ | ||
|  | { | ||
|  |     ZyanU8 type                            ZYAN_BITFIELD(ZYDIS_SEMANTIC_OPTYPE_REQUIRED_BITS); | ||
|  |     ZyanU8 visibility                      ZYAN_BITFIELD(ZYDIS_OPERAND_VISIBILITY_REQUIRED_BITS); | ||
|  |     ZyanU8 actions                         ZYAN_BITFIELD(ZYDIS_OPERAND_ACTION_REQUIRED_BITS); | ||
|  |     ZyanU16 size[3]; | ||
|  |     ZyanU8 element_type                    ZYAN_BITFIELD(ZYDIS_IELEMENT_TYPE_REQUIRED_BITS); | ||
|  |     union | ||
|  |     { | ||
|  |         ZyanU8 encoding                    ZYAN_BITFIELD(ZYDIS_OPERAND_ENCODING_REQUIRED_BITS); | ||
|  |         struct | ||
|  |         { | ||
|  |             ZyanU8 type                    ZYAN_BITFIELD(ZYDIS_IMPLREG_TYPE_REQUIRED_BITS); | ||
|  |             union | ||
|  |             { | ||
|  |                 ZyanU16 reg                ZYAN_BITFIELD(ZYDIS_REGISTER_REQUIRED_BITS); | ||
|  |                 ZyanU8 id                  ZYAN_BITFIELD(6); | ||
|  |             } reg; | ||
|  |         } reg; | ||
|  |         struct | ||
|  |         { | ||
|  |             ZyanU8 seg                     ZYAN_BITFIELD(3); | ||
|  |             ZyanU8 base                    ZYAN_BITFIELD(ZYDIS_IMPLMEM_BASE_REQUIRED_BITS); | ||
|  |         } mem; | ||
|  |     } op; | ||
|  |     ZyanBool is_multisource4               ZYAN_BITFIELD(1); | ||
|  |     ZyanBool ignore_seg_override           ZYAN_BITFIELD(1); | ||
|  | } ZydisOperandDefinition; | ||
|  | 
 | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | /* Instruction definition                                                                         */ | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Defines the `ZydisReadWriteAction` enum. | ||
|  |  */ | ||
|  | typedef enum ZydisReadWriteAction_ | ||
|  | { | ||
|  |     ZYDIS_RW_ACTION_NONE, | ||
|  |     ZYDIS_RW_ACTION_READ, | ||
|  |     ZYDIS_RW_ACTION_WRITE, | ||
|  |     ZYDIS_RW_ACTION_READWRITE, | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * Maximum value of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_RW_ACTION_MAX_VALUE = ZYDIS_RW_ACTION_READWRITE, | ||
|  |     /**
 | ||
|  |      * The minimum number of bits required to represent all values of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_RW_ACTION_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_RW_ACTION_MAX_VALUE) | ||
|  | } ZydisReadWriteAction; | ||
|  | 
 | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Defines the `ZydisInternalVectorLength` enum. | ||
|  |  */ | ||
|  | typedef enum ZydisInternalVectorLength_ | ||
|  | { | ||
|  |     ZYDIS_IVECTOR_LENGTH_DEFAULT, | ||
|  |     ZYDIS_IVECTOR_LENGTH_FIXED_128, | ||
|  |     ZYDIS_IVECTOR_LENGTH_FIXED_256, | ||
|  |     ZYDIS_IVECTOR_LENGTH_FIXED_512, | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * Maximum value of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_IVECTOR_LENGTH_MAX_VALUE = ZYDIS_IVECTOR_LENGTH_FIXED_512, | ||
|  |     /**
 | ||
|  |      * The minimum number of bits required to represent all values of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_IVECTOR_LENGTH_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IVECTOR_LENGTH_MAX_VALUE) | ||
|  | } ZydisInternalVectorLength; | ||
|  | 
 | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Defines the `ZydisInternalElementSize` enum. | ||
|  |  */ | ||
|  | typedef enum ZydisInternalElementSize_ | ||
|  | { | ||
|  |     ZYDIS_IELEMENT_SIZE_INVALID, | ||
|  |     ZYDIS_IELEMENT_SIZE_8, | ||
|  |     ZYDIS_IELEMENT_SIZE_16, | ||
|  |     ZYDIS_IELEMENT_SIZE_32, | ||
|  |     ZYDIS_IELEMENT_SIZE_64, | ||
|  |     ZYDIS_IELEMENT_SIZE_128, | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * Maximum value of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_IELEMENT_SIZE_MAX_VALUE = ZYDIS_IELEMENT_SIZE_128, | ||
|  |     /**
 | ||
|  |      * The minimum number of bits required to represent all values of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_IELEMENT_SIZE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IELEMENT_SIZE_MAX_VALUE) | ||
|  | } ZydisInternalElementSize; | ||
|  | 
 | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Defines the `ZydisEVEXFunctionality` enum. | ||
|  |  */ | ||
|  | typedef enum ZydisEVEXFunctionality_ | ||
|  | { | ||
|  |     ZYDIS_EVEX_FUNC_INVALID, | ||
|  |     /**
 | ||
|  |      * `EVEX.b` enables broadcast functionality. | ||
|  |      */ | ||
|  |     ZYDIS_EVEX_FUNC_BC, | ||
|  |     /**
 | ||
|  |      * `EVEX.b` enables embedded-rounding functionality. | ||
|  |      */ | ||
|  |     ZYDIS_EVEX_FUNC_RC, | ||
|  |     /**
 | ||
|  |      * `EVEX.b` enables sae functionality. | ||
|  |      */ | ||
|  |     ZYDIS_EVEX_FUNC_SAE, | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * Maximum value of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_EVEX_FUNC_MAX_VALUE = ZYDIS_EVEX_FUNC_SAE, | ||
|  |     /**
 | ||
|  |      * The minimum number of bits required to represent all values of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_EVEX_FUNC_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_EVEX_FUNC_MAX_VALUE) | ||
|  | } ZydisEVEXFunctionality; | ||
|  | 
 | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Defines the `ZydisEVEXTupleType` enum. | ||
|  |  */ | ||
|  | typedef enum ZydisEVEXTupleType_ | ||
|  | { | ||
|  |     ZYDIS_TUPLETYPE_INVALID, | ||
|  |     /**
 | ||
|  |      * Full Vector | ||
|  |      */ | ||
|  |     ZYDIS_TUPLETYPE_FV, | ||
|  |     /**
 | ||
|  |      * Half Vector | ||
|  |      */ | ||
|  |     ZYDIS_TUPLETYPE_HV, | ||
|  |     /**
 | ||
|  |      * Full Vector Mem | ||
|  |      */ | ||
|  |     ZYDIS_TUPLETYPE_FVM, | ||
|  |     /**
 | ||
|  |      * Tuple1 Scalar | ||
|  |      */ | ||
|  |     ZYDIS_TUPLETYPE_T1S, | ||
|  |     /**
 | ||
|  |      * Tuple1 Fixed | ||
|  |      */ | ||
|  |     ZYDIS_TUPLETYPE_T1F, | ||
|  |     /**
 | ||
|  |      * Tuple1 4x32 | ||
|  |      */ | ||
|  |     ZYDIS_TUPLETYPE_T1_4X, | ||
|  |     /**
 | ||
|  |      * Gather / Scatter | ||
|  |      */ | ||
|  |     ZYDIS_TUPLETYPE_GSCAT, | ||
|  |     /**
 | ||
|  |      * Tuple2 | ||
|  |      */ | ||
|  |     ZYDIS_TUPLETYPE_T2, | ||
|  |     /**
 | ||
|  |      * Tuple4 | ||
|  |      */ | ||
|  |     ZYDIS_TUPLETYPE_T4, | ||
|  |     /**
 | ||
|  |      * Tuple8 | ||
|  |      */ | ||
|  |     ZYDIS_TUPLETYPE_T8, | ||
|  |     /**
 | ||
|  |      * Half Mem | ||
|  |      */ | ||
|  |     ZYDIS_TUPLETYPE_HVM, | ||
|  |     /**
 | ||
|  |      * QuarterMem | ||
|  |      */ | ||
|  |     ZYDIS_TUPLETYPE_QVM, | ||
|  |     /**
 | ||
|  |      * OctMem | ||
|  |      */ | ||
|  |     ZYDIS_TUPLETYPE_OVM, | ||
|  |     /**
 | ||
|  |      * Mem128 | ||
|  |      */ | ||
|  |     ZYDIS_TUPLETYPE_M128, | ||
|  |     /**
 | ||
|  |      * MOVDDUP | ||
|  |      */ | ||
|  |     ZYDIS_TUPLETYPE_DUP, | ||
|  |     /**
 | ||
|  |      * Quarter of the vector-length. | ||
|  |      */ | ||
|  |     ZYDIS_TUPLETYPE_QUARTER, | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * Maximum value of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_TUPLETYPE_MAX_VALUE = ZYDIS_TUPLETYPE_QUARTER, | ||
|  |     /**
 | ||
|  |      * The minimum number of bits required to represent all values of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_TUPLETYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_TUPLETYPE_MAX_VALUE) | ||
|  | } ZydisEVEXTupleType; | ||
|  | 
 | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Defines the `ZydisMVEXFunctionality` enum. | ||
|  |  */ | ||
|  | typedef enum ZydisMVEXFunctionality_ | ||
|  | { | ||
|  |     /**
 | ||
|  |      * The `MVEX.SSS` value is ignored. | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_FUNC_IGNORED, | ||
|  |     /**
 | ||
|  |      * `MVEX.SSS` must be `000b`. | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_FUNC_INVALID, | ||
|  |     /**
 | ||
|  |      * `MVEX.SSS` controls embedded-rounding functionality. | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_FUNC_RC, | ||
|  |     /**
 | ||
|  |      * `MVEX.SSS` controls sae functionality. | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_FUNC_SAE, | ||
|  |     /**
 | ||
|  |      * No special operation (32bit float elements). | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_FUNC_F_32, | ||
|  |     /**
 | ||
|  |      * No special operation (32bit uint elements). | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_FUNC_I_32, | ||
|  |     /**
 | ||
|  |      * No special operation (64bit float elements). | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_FUNC_F_64, | ||
|  |     /**
 | ||
|  |      * No special operation (64bit uint elements). | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_FUNC_I_64, | ||
|  |     /**
 | ||
|  |      * Sf32(reg) or Si32(reg). | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_FUNC_SWIZZLE_32, | ||
|  |     /**
 | ||
|  |      * Sf64(reg) or Si64(reg). | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_FUNC_SWIZZLE_64, | ||
|  |     /**
 | ||
|  |      * Sf32(mem). | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_FUNC_SF_32, | ||
|  |     /**
 | ||
|  |      * Sf32(mem) broadcast only. | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_FUNC_SF_32_BCST, | ||
|  |     /**
 | ||
|  |      * Sf32(mem) broadcast 4to16 only. | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_FUNC_SF_32_BCST_4TO16, | ||
|  |     /**
 | ||
|  |      * Sf64(mem). | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_FUNC_SF_64, | ||
|  |     /**
 | ||
|  |      * Si32(mem). | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_FUNC_SI_32, | ||
|  |     /**
 | ||
|  |      * Si32(mem) broadcast only. | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_FUNC_SI_32_BCST, | ||
|  |     /**
 | ||
|  |      * Si32(mem) broadcast 4to16 only. | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_FUNC_SI_32_BCST_4TO16, | ||
|  |     /**
 | ||
|  |      * Si64(mem). | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_FUNC_SI_64, | ||
|  |     /**
 | ||
|  |      * Uf32. | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_FUNC_UF_32, | ||
|  |     /**
 | ||
|  |      * Uf64. | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_FUNC_UF_64, | ||
|  |     /**
 | ||
|  |      * Ui32. | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_FUNC_UI_32, | ||
|  |     /**
 | ||
|  |      * Ui64. | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_FUNC_UI_64, | ||
|  |     /**
 | ||
|  |      * Df32. | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_FUNC_DF_32, | ||
|  |     /**
 | ||
|  |      * Df64. | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_FUNC_DF_64, | ||
|  |     /**
 | ||
|  |      * Di32. | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_FUNC_DI_32, | ||
|  |     /**
 | ||
|  |      * Di64. | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_FUNC_DI_64, | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * Maximum value of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_FUNC_MAX_VALUE = ZYDIS_MVEX_FUNC_DI_64, | ||
|  |     /**
 | ||
|  |      * The minimum number of bits required to represent all values of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_FUNC_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MVEX_FUNC_MAX_VALUE) | ||
|  | } ZydisMVEXFunctionality; | ||
|  | 
 | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Defines the `ZydisVEXStaticBroadcast` enum. | ||
|  |  */ | ||
|  | typedef enum ZydisVEXStaticBroadcast | ||
|  | { | ||
|  |     ZYDIS_VEX_STATIC_BROADCAST_NONE, | ||
|  |     ZYDIS_VEX_STATIC_BROADCAST_1_TO_2, | ||
|  |     ZYDIS_VEX_STATIC_BROADCAST_1_TO_4, | ||
|  |     ZYDIS_VEX_STATIC_BROADCAST_1_TO_8, | ||
|  |     ZYDIS_VEX_STATIC_BROADCAST_1_TO_16, | ||
|  |     ZYDIS_VEX_STATIC_BROADCAST_1_TO_32, | ||
|  |     ZYDIS_VEX_STATIC_BROADCAST_2_TO_4, | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * Maximum value of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_VEX_STATIC_BROADCAST_MAX_VALUE = ZYDIS_VEX_STATIC_BROADCAST_2_TO_4, | ||
|  |     /**
 | ||
|  |      * The minimum number of bits required to represent all values of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_VEX_STATIC_BROADCAST_REQUIRED_BITS = | ||
|  |         ZYAN_BITS_TO_REPRESENT(ZYDIS_VEX_STATIC_BROADCAST_MAX_VALUE) | ||
|  | } ZydisVEXStaticBroadcast; | ||
|  | 
 | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Defines the `ZydisEVEXStaticBroadcast` enum. | ||
|  |  */ | ||
|  | typedef enum ZydisEVEXStaticBroadcast_ | ||
|  | { | ||
|  |     ZYDIS_EVEX_STATIC_BROADCAST_NONE, | ||
|  |     ZYDIS_EVEX_STATIC_BROADCAST_1_TO_2, | ||
|  |     ZYDIS_EVEX_STATIC_BROADCAST_1_TO_4, | ||
|  |     ZYDIS_EVEX_STATIC_BROADCAST_1_TO_8, | ||
|  |     ZYDIS_EVEX_STATIC_BROADCAST_1_TO_16, | ||
|  |     ZYDIS_EVEX_STATIC_BROADCAST_1_TO_32, | ||
|  |     ZYDIS_EVEX_STATIC_BROADCAST_1_TO_64, | ||
|  |     ZYDIS_EVEX_STATIC_BROADCAST_2_TO_4, | ||
|  |     ZYDIS_EVEX_STATIC_BROADCAST_2_TO_8, | ||
|  |     ZYDIS_EVEX_STATIC_BROADCAST_2_TO_16, | ||
|  |     ZYDIS_EVEX_STATIC_BROADCAST_4_TO_8, | ||
|  |     ZYDIS_EVEX_STATIC_BROADCAST_4_TO_16, | ||
|  |     ZYDIS_EVEX_STATIC_BROADCAST_8_TO_16, | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * Maximum value of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_EVEX_STATIC_BROADCAST_MAX_VALUE = ZYDIS_EVEX_STATIC_BROADCAST_8_TO_16, | ||
|  |     /**
 | ||
|  |      * The minimum number of bits required to represent all values of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_EVEX_STATIC_BROADCAST_REQUIRED_BITS = | ||
|  |         ZYAN_BITS_TO_REPRESENT(ZYDIS_EVEX_STATIC_BROADCAST_MAX_VALUE) | ||
|  | } ZydisEVEXStaticBroadcast; | ||
|  | 
 | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Defines the `ZydisMVEXStaticBroadcast` enum. | ||
|  |  */ | ||
|  | typedef enum ZydisMVEXStaticBroadcast_ | ||
|  | { | ||
|  |     ZYDIS_MVEX_STATIC_BROADCAST_NONE, | ||
|  |     ZYDIS_MVEX_STATIC_BROADCAST_1_TO_8, | ||
|  |     ZYDIS_MVEX_STATIC_BROADCAST_1_TO_16, | ||
|  |     ZYDIS_MVEX_STATIC_BROADCAST_4_TO_8, | ||
|  |     ZYDIS_MVEX_STATIC_BROADCAST_4_TO_16, | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * Maximum value of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_STATIC_BROADCAST_MAX_VALUE = ZYDIS_MVEX_STATIC_BROADCAST_4_TO_16, | ||
|  |     /**
 | ||
|  |      * The minimum number of bits required to represent all values of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_MVEX_STATIC_BROADCAST_REQUIRED_BITS = | ||
|  |         ZYAN_BITS_TO_REPRESENT(ZYDIS_MVEX_STATIC_BROADCAST_MAX_VALUE) | ||
|  | } ZydisMVEXStaticBroadcast; | ||
|  | 
 | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Defines the `ZydisMaskPolicy` enum. | ||
|  |  */ | ||
|  | typedef enum ZydisMaskPolicy_ | ||
|  | { | ||
|  |     ZYDIS_MASK_POLICY_INVALID, | ||
|  |     /**
 | ||
|  |      * The instruction accepts mask-registers other than the default-mask (K0), but | ||
|  |      *          does not require them. | ||
|  |      */ | ||
|  |     ZYDIS_MASK_POLICY_ALLOWED, | ||
|  |     /**
 | ||
|  |      * The instruction requires a mask-register other than the default-mask (K0). | ||
|  |      */ | ||
|  |     ZYDIS_MASK_POLICY_REQUIRED, | ||
|  |     /**
 | ||
|  |      * The instruction does not allow a mask-register other than the default-mask (K0). | ||
|  |      */ | ||
|  |     ZYDIS_MASK_POLICY_FORBIDDEN, | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * Maximum value of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_MASK_POLICY_MAX_VALUE = ZYDIS_MASK_POLICY_FORBIDDEN, | ||
|  |     /**
 | ||
|  |      * The minimum number of bits required to represent all values of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_MASK_POLICY_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MASK_POLICY_MAX_VALUE) | ||
|  | } ZydisMaskPolicy; | ||
|  | 
 | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Defines the `ZydisMaskOverride` enum. | ||
|  |  */ | ||
|  | typedef enum ZydisMaskOverride_ | ||
|  | { | ||
|  |     ZYDIS_MASK_OVERRIDE_DEFAULT, | ||
|  |     ZYDIS_MASK_OVERRIDE_ZEROING, | ||
|  |     ZYDIS_MASK_OVERRIDE_CONTROL, | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * Maximum value of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_MASK_OVERRIDE_MAX_VALUE = ZYDIS_MASK_OVERRIDE_CONTROL, | ||
|  |     /**
 | ||
|  |      * The minimum number of bits required to represent all values of this enum. | ||
|  |      */ | ||
|  |     ZYDIS_MASK_OVERRIDE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MASK_OVERRIDE_MAX_VALUE) | ||
|  | } ZydisMaskOverride; | ||
|  | 
 | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | 
 | ||
|  | #define ZYDIS_OPDEF_REQUIRED_BITS \
 | ||
|  |     ZYAN_MAX(ZYDIS_REGKIND_REQUIRED_BITS, ZYDIS_MEMOP_TYPE_REQUIRED_BITS + 1) + 1 | ||
|  | 
 | ||
|  | #define ZYDIS_OPDEF_GET_REG(operand_definition) \
 | ||
|  |     ((operand_definition) & ((1 << ZYDIS_REGKIND_REQUIRED_BITS   ) - 1)) | ||
|  | 
 | ||
|  | #define ZYDIS_OPDEF_GET_MEM(operand_definition) \
 | ||
|  |     ((operand_definition) & ((1 << ZYDIS_MEMOP_TYPE_REQUIRED_BITS) - 1)) | ||
|  | 
 | ||
|  | #define ZYDIS_OPDEF_GET_REG_HIGH_BIT(operand_definition) \
 | ||
|  |     (((operand_definition) >> ZYDIS_REGKIND_REQUIRED_BITS   ) & 0x01) | ||
|  | 
 | ||
|  | #define ZYDIS_OPDEF_GET_MEM_HIGH_BIT(operand_definition) \
 | ||
|  |     (((operand_definition) >> ZYDIS_MEMOP_TYPE_REQUIRED_BITS) & 0x01) | ||
|  | 
 | ||
|  | // MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct
 | ||
|  | // enum types
 | ||
|  | ZYAN_STATIC_ASSERT(ZYDIS_MNEMONIC_REQUIRED_BITS        <= 16); | ||
|  | ZYAN_STATIC_ASSERT(ZYDIS_CATEGORY_REQUIRED_BITS        <=  8); | ||
|  | ZYAN_STATIC_ASSERT(ZYDIS_ISA_SET_REQUIRED_BITS         <=  8); | ||
|  | ZYAN_STATIC_ASSERT(ZYDIS_ISA_EXT_REQUIRED_BITS         <=  8); | ||
|  | ZYAN_STATIC_ASSERT(ZYDIS_BRANCH_TYPE_REQUIRED_BITS     <=  8); | ||
|  | ZYAN_STATIC_ASSERT(ZYDIS_EXCEPTION_CLASS_REQUIRED_BITS <=  8); | ||
|  | ZYAN_STATIC_ASSERT(ZYDIS_OPDEF_REQUIRED_BITS           <=  8); | ||
|  | ZYAN_STATIC_ASSERT(ZYDIS_RW_ACTION_REQUIRED_BITS       <=  8); | ||
|  | 
 | ||
|  | #ifndef ZYDIS_MINIMAL_MODE
 | ||
|  | #   define ZYDIS_INSTRUCTION_DEFINITION_BASE \
 | ||
|  |         ZyanU16 mnemonic                       ZYAN_BITFIELD(ZYDIS_MNEMONIC_REQUIRED_BITS); \ | ||
|  |         ZyanU8 operand_count                   ZYAN_BITFIELD( 4); \ | ||
|  |         ZyanU8 operand_count_visible           ZYAN_BITFIELD( 3); \ | ||
|  |         ZyanU16 operand_reference              ZYAN_BITFIELD(15); \ | ||
|  |         ZyanU8 operand_size_map                ZYAN_BITFIELD( 3); \ | ||
|  |         ZyanU8 address_size_map                ZYAN_BITFIELD( 2); \ | ||
|  |         ZyanU8 flags_reference                 ZYAN_BITFIELD( 7); \ | ||
|  |         ZyanBool requires_protected_mode       ZYAN_BITFIELD( 1); \ | ||
|  |         ZyanBool no_compat_mode                ZYAN_BITFIELD( 1); \ | ||
|  |         ZyanU8 category                        ZYAN_BITFIELD(ZYDIS_CATEGORY_REQUIRED_BITS); \ | ||
|  |         ZyanU8 isa_set                         ZYAN_BITFIELD(ZYDIS_ISA_SET_REQUIRED_BITS); \ | ||
|  |         ZyanU8 isa_ext                         ZYAN_BITFIELD(ZYDIS_ISA_EXT_REQUIRED_BITS); \ | ||
|  |         ZyanU8 branch_type                     ZYAN_BITFIELD(ZYDIS_BRANCH_TYPE_REQUIRED_BITS); \ | ||
|  |         ZyanU8 exception_class                 ZYAN_BITFIELD(ZYDIS_EXCEPTION_CLASS_REQUIRED_BITS); \ | ||
|  |         ZyanU8 op_reg                          ZYAN_BITFIELD(ZYDIS_OPDEF_REQUIRED_BITS); \ | ||
|  |         ZyanU8 op_rm                           ZYAN_BITFIELD(ZYDIS_OPDEF_REQUIRED_BITS); \ | ||
|  |         ZyanU8 cpu_state                       ZYAN_BITFIELD(ZYDIS_RW_ACTION_REQUIRED_BITS); \ | ||
|  |         ZyanU8 fpu_state                       ZYAN_BITFIELD(ZYDIS_RW_ACTION_REQUIRED_BITS); \ | ||
|  |         ZyanU8 xmm_state                       ZYAN_BITFIELD(ZYDIS_RW_ACTION_REQUIRED_BITS); \ | ||
|  |         ZyanBool accepts_segment               ZYAN_BITFIELD( 1) | ||
|  | #else
 | ||
|  | #   define ZYDIS_INSTRUCTION_DEFINITION_BASE \
 | ||
|  |         ZyanU16 mnemonic                       ZYAN_BITFIELD(ZYDIS_MNEMONIC_REQUIRED_BITS); \ | ||
|  |         ZyanU8 operand_size_map                ZYAN_BITFIELD( 3); \ | ||
|  |         ZyanU8 address_size_map                ZYAN_BITFIELD( 2); \ | ||
|  |         ZyanBool requires_protected_mode       ZYAN_BITFIELD( 1); \ | ||
|  |         ZyanBool no_compat_mode                ZYAN_BITFIELD( 1); \ | ||
|  |         ZyanU8 op_reg                          ZYAN_BITFIELD(ZYDIS_OPDEF_REQUIRED_BITS); \ | ||
|  |         ZyanU8 op_rm                           ZYAN_BITFIELD(ZYDIS_OPDEF_REQUIRED_BITS) | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #define ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR \
 | ||
|  |     ZYDIS_INSTRUCTION_DEFINITION_BASE; \ | ||
|  |     ZyanU8 op_ndsndd                       ZYAN_BITFIELD(ZYDIS_OPDEF_REQUIRED_BITS) | ||
|  | 
 | ||
|  | #define ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR_INTEL \
 | ||
|  |     ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR; \ | ||
|  |     ZyanBool is_gather                     ZYAN_BITFIELD( 1); \ | ||
|  |     ZyanBool no_source_dest_match          ZYAN_BITFIELD( 1); \ | ||
|  |     ZyanBool no_source_source_match        ZYAN_BITFIELD( 1)        // TODO: Could be moved to VEX
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Defines the `ZydisInstructionDefinition` struct. | ||
|  |  */ | ||
|  | typedef struct ZydisInstructionDefinition_ | ||
|  | { | ||
|  |     ZYDIS_INSTRUCTION_DEFINITION_BASE; | ||
|  | } ZydisInstructionDefinition; | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Defines the `ZydisInstructionDefinitionLEGACY` struct. | ||
|  |  */ | ||
|  | typedef struct ZydisInstructionDefinitionLEGACY_ | ||
|  | { | ||
|  |     ZYDIS_INSTRUCTION_DEFINITION_BASE; | ||
|  | #ifndef ZYDIS_MINIMAL_MODE
 | ||
|  |     ZyanBool is_privileged                 ZYAN_BITFIELD( 1); | ||
|  | #endif
 | ||
|  |     ZyanBool accepts_LOCK                  ZYAN_BITFIELD( 1); | ||
|  | #ifndef ZYDIS_MINIMAL_MODE
 | ||
|  |     ZyanBool accepts_REP                   ZYAN_BITFIELD( 1); | ||
|  |     ZyanBool accepts_REPEREPZ              ZYAN_BITFIELD( 1); | ||
|  |     ZyanBool accepts_REPNEREPNZ            ZYAN_BITFIELD( 1); | ||
|  |     ZyanBool accepts_BOUND                 ZYAN_BITFIELD( 1); | ||
|  |     ZyanBool accepts_XACQUIRE              ZYAN_BITFIELD( 1); | ||
|  |     ZyanBool accepts_XRELEASE              ZYAN_BITFIELD( 1); | ||
|  |     ZyanBool accepts_NOTRACK               ZYAN_BITFIELD( 1); | ||
|  |     ZyanBool accepts_hle_without_lock      ZYAN_BITFIELD( 1); | ||
|  |     ZyanBool accepts_branch_hints          ZYAN_BITFIELD( 1); | ||
|  | #endif
 | ||
|  | } ZydisInstructionDefinitionLEGACY; | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Defines the `ZydisInstructionDefinition3DNOW` struct. | ||
|  |  */ | ||
|  | typedef struct ZydisInstructionDefinition3DNOW_ | ||
|  | { | ||
|  |     ZYDIS_INSTRUCTION_DEFINITION_BASE; | ||
|  | } ZydisInstructionDefinition3DNOW; | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Defines the `ZydisInstructionDefinitionXOP` struct. | ||
|  |  */ | ||
|  | typedef struct ZydisInstructionDefinitionXOP_ | ||
|  | { | ||
|  |     ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR; | ||
|  | } ZydisInstructionDefinitionXOP; | ||
|  | 
 | ||
|  | // MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct
 | ||
|  | // enum types
 | ||
|  | ZYAN_STATIC_ASSERT(ZYDIS_VEX_STATIC_BROADCAST_REQUIRED_BITS  <=  8); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Defines the `ZydisInstructionDefinitionVEX` struct. | ||
|  |  */ | ||
|  | typedef struct ZydisInstructionDefinitionVEX_ | ||
|  | { | ||
|  |     ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR_INTEL; | ||
|  | #ifndef ZYDIS_MINIMAL_MODE
 | ||
|  |     ZyanU8 broadcast                       ZYAN_BITFIELD(ZYDIS_VEX_STATIC_BROADCAST_REQUIRED_BITS); | ||
|  | #endif
 | ||
|  | } ZydisInstructionDefinitionVEX; | ||
|  | 
 | ||
|  | #ifndef ZYDIS_DISABLE_AVX512
 | ||
|  | 
 | ||
|  | // MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct
 | ||
|  | // enum types
 | ||
|  | ZYAN_STATIC_ASSERT(ZYDIS_IVECTOR_LENGTH_REQUIRED_BITS        <=  8); | ||
|  | ZYAN_STATIC_ASSERT(ZYDIS_TUPLETYPE_REQUIRED_BITS             <=  8); | ||
|  | ZYAN_STATIC_ASSERT(ZYDIS_IELEMENT_SIZE_REQUIRED_BITS         <=  8); | ||
|  | ZYAN_STATIC_ASSERT(ZYDIS_EVEX_FUNC_REQUIRED_BITS             <=  8); | ||
|  | ZYAN_STATIC_ASSERT(ZYDIS_MASK_POLICY_REQUIRED_BITS           <=  8); | ||
|  | ZYAN_STATIC_ASSERT(ZYDIS_MASK_OVERRIDE_REQUIRED_BITS         <=  8); | ||
|  | ZYAN_STATIC_ASSERT(ZYDIS_EVEX_STATIC_BROADCAST_REQUIRED_BITS <=  8); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Defines the `ZydisInstructionDefinitionEVEX` struct. | ||
|  |  */ | ||
|  | typedef struct ZydisInstructionDefinitionEVEX_ | ||
|  | { | ||
|  |     ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR_INTEL; | ||
|  | #ifndef ZYDIS_MINIMAL_MODE
 | ||
|  |     ZyanU8 vector_length                   ZYAN_BITFIELD(ZYDIS_IVECTOR_LENGTH_REQUIRED_BITS); | ||
|  |     ZyanU8 tuple_type                      ZYAN_BITFIELD(ZYDIS_TUPLETYPE_REQUIRED_BITS); | ||
|  |     ZyanU8 element_size                    ZYAN_BITFIELD(ZYDIS_IELEMENT_SIZE_REQUIRED_BITS); | ||
|  |     ZyanU8 functionality                   ZYAN_BITFIELD(ZYDIS_EVEX_FUNC_REQUIRED_BITS); | ||
|  | #endif
 | ||
|  |     ZyanU8 mask_policy                     ZYAN_BITFIELD(ZYDIS_MASK_POLICY_REQUIRED_BITS); | ||
|  |     ZyanBool accepts_zero_mask             ZYAN_BITFIELD( 1); | ||
|  | #ifndef ZYDIS_MINIMAL_MODE
 | ||
|  |     ZyanU8 mask_override                   ZYAN_BITFIELD(ZYDIS_MASK_OVERRIDE_REQUIRED_BITS); | ||
|  |     ZyanU8 broadcast                       ZYAN_BITFIELD(ZYDIS_EVEX_STATIC_BROADCAST_REQUIRED_BITS); | ||
|  | #endif
 | ||
|  | } ZydisInstructionDefinitionEVEX; | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #ifndef ZYDIS_DISABLE_KNC
 | ||
|  | 
 | ||
|  | // MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct
 | ||
|  | // enum types
 | ||
|  | ZYAN_STATIC_ASSERT(ZYDIS_MVEX_FUNC_REQUIRED_BITS             <=  8); | ||
|  | ZYAN_STATIC_ASSERT(ZYDIS_MASK_POLICY_REQUIRED_BITS           <=  8); | ||
|  | ZYAN_STATIC_ASSERT(ZYDIS_MVEX_STATIC_BROADCAST_REQUIRED_BITS <=  8); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Defines the `ZydisInstructionDefinitionMVEX` struct. | ||
|  |  */ | ||
|  | typedef struct ZydisInstructionDefinitionMVEX_ | ||
|  | { | ||
|  |     ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR_INTEL; | ||
|  |     ZyanU8 functionality                   ZYAN_BITFIELD(ZYDIS_MVEX_FUNC_REQUIRED_BITS); | ||
|  |     ZyanU8 mask_policy                     ZYAN_BITFIELD(ZYDIS_MASK_POLICY_REQUIRED_BITS); | ||
|  | #ifndef ZYDIS_MINIMAL_MODE
 | ||
|  |     ZyanBool has_element_granularity       ZYAN_BITFIELD( 1); | ||
|  |     ZyanU8 broadcast                       ZYAN_BITFIELD(ZYDIS_MVEX_STATIC_BROADCAST_REQUIRED_BITS); | ||
|  | #endif
 | ||
|  | } ZydisInstructionDefinitionMVEX; | ||
|  | #endif
 | ||
|  | 
 | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | 
 | ||
|  | #pragma pack(pop)
 | ||
|  | 
 | ||
|  | #ifdef ZYAN_MSVC
 | ||
|  | #   pragma warning(pop)
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | /* Accessed CPU/FPU flags                                                                         */ | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * Contains information about the CPU/FPU flags accessed by an instruction. | ||
|  |  * | ||
|  |  * We don't want this struct to be packed! A pointer to the individual members will be used by the | ||
|  |  * `ZydisDecodedInstruction` struct. | ||
|  |  */ | ||
|  | typedef struct ZydisDefinitionAccessedFlags_ | ||
|  | { | ||
|  |     ZydisAccessedFlags cpu_flags; | ||
|  |     ZydisAccessedFlags fpu_flags; | ||
|  | } ZydisDefinitionAccessedFlags; | ||
|  | 
 | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | 
 | ||
|  | /* ============================================================================================== */ | ||
|  | /* Functions                                                                                      */ | ||
|  | /* ============================================================================================== */ | ||
|  | 
 | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | /* Instruction definition                                                                         */ | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Returns the instruction-definition with the given `encoding` and `id`. | ||
|  |  * | ||
|  |  * @param   encoding    The instruction-encoding. | ||
|  |  * @param   id          The definition-id. | ||
|  |  * @param   definition  A pointer to the variable that receives a pointer to the instruction- | ||
|  |  *                      definition. | ||
|  |  */ | ||
|  | ZYDIS_NO_EXPORT void ZydisGetInstructionDefinition(ZydisInstructionEncoding encoding, | ||
|  |     ZyanU16 id, const ZydisInstructionDefinition** definition); | ||
|  | 
 | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | /* Operand definition                                                                             */ | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | 
 | ||
|  | #ifndef ZYDIS_MINIMAL_MODE
 | ||
|  | /**
 | ||
|  |  * Returns the the operand-definitions for the given instruction-`definition`. | ||
|  |  * | ||
|  |  * @param   definition  A pointer to the instruction-definition. | ||
|  |  * | ||
|  |  * @return  A pointer to the first operand definition of the instruction, or `ZYAN_NULL`. | ||
|  |  */ | ||
|  | ZYDIS_NO_EXPORT const ZydisOperandDefinition* ZydisGetOperandDefinitions( | ||
|  |     const ZydisInstructionDefinition* definition); | ||
|  | #endif
 | ||
|  | 
 | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | /* Element info                                                                                   */ | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | 
 | ||
|  | #ifndef ZYDIS_MINIMAL_MODE
 | ||
|  | /**
 | ||
|  |  * Returns the actual type and size of an internal element-type. | ||
|  |  * | ||
|  |  * @param   element The internal element type. | ||
|  |  * @param   type    The actual element type. | ||
|  |  * @param   size    The element size. | ||
|  |  */ | ||
|  | ZYDIS_NO_EXPORT void ZydisGetElementInfo(ZydisInternalElementType element, ZydisElementType* type, | ||
|  |     ZydisElementSize* size); | ||
|  | #endif
 | ||
|  | 
 | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | /* Accessed CPU flags                                                                             */ | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | 
 | ||
|  | #ifndef ZYDIS_MINIMAL_MODE
 | ||
|  | /**
 | ||
|  |  * Returns the the operand-definitions for the given instruction-`definition`. | ||
|  |  * | ||
|  |  * @param   definition  A pointer to the instruction-definition. | ||
|  |  * @param   flags       A pointer to the variable that receives the `ZydisDefinitionAccessedFlags` | ||
|  |  *                      struct. | ||
|  |  * | ||
|  |  * @return  `ZYAN_TRUE`, if the instruction accesses any flags, or `ZYAN_FALSE`, if not. | ||
|  |  */ | ||
|  | ZYDIS_NO_EXPORT ZyanBool ZydisGetAccessedFlags(const ZydisInstructionDefinition* definition, | ||
|  |     const ZydisDefinitionAccessedFlags** flags); | ||
|  | #endif
 | ||
|  | 
 | ||
|  | /* ---------------------------------------------------------------------------------------------- */ | ||
|  | 
 | ||
|  | /* ============================================================================================== */ | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | } | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #endif /* ZYDIS_INTERNAL_SHAREDDATA_H */
 |