duckstation

duckstation, but archived from the revision just before upstream changed it to a proprietary software project, this version is the libre one
git clone https://git.neptards.moe/u3shit/duckstation.git
Log | Files | Refs | README | LICENSE

SharedData.h (33404B)


      1 /***************************************************************************************************
      2 
      3   Zyan Disassembler Library (Zydis)
      4 
      5   Original Author : Florian Bernd
      6 
      7  * Permission is hereby granted, free of charge, to any person obtaining a copy
      8  * of this software and associated documentation files (the "Software"), to deal
      9  * in the Software without restriction, including without limitation the rights
     10  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     11  * copies of the Software, and to permit persons to whom the Software is
     12  * furnished to do so, subject to the following conditions:
     13  *
     14  * The above copyright notice and this permission notice shall be included in all
     15  * copies or substantial portions of the Software.
     16  *
     17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     20  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     22  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     23  * SOFTWARE.
     24 
     25 ***************************************************************************************************/
     26 
     27 #ifndef ZYDIS_INTERNAL_SHAREDDATA_H
     28 #define ZYDIS_INTERNAL_SHAREDDATA_H
     29 
     30 #include <Zycore/Defines.h>
     31 #include <Zydis/Mnemonic.h>
     32 #include <Zydis/Register.h>
     33 #include <Zydis/SharedTypes.h>
     34 #include <Zydis/DecoderTypes.h>
     35 
     36 #ifdef __cplusplus
     37 extern "C" {
     38 #endif
     39 
     40 /* ============================================================================================== */
     41 /* Enums and types                                                                                */
     42 /* ============================================================================================== */
     43 
     44 // MSVC does not like types other than (un-)signed int for bit-fields
     45 #ifdef ZYAN_MSVC
     46 #   pragma warning(push)
     47 #   pragma warning(disable:4214)
     48 #endif
     49 
     50 #pragma pack(push, 1)
     51 
     52 /* ---------------------------------------------------------------------------------------------- */
     53 /* Operand definition                                                                             */
     54 /* ---------------------------------------------------------------------------------------------- */
     55 
     56 /**
     57  * Defines the `ZydisSemanticOperandType` enum.
     58  */
     59 typedef enum ZydisSemanticOperandType_
     60 {
     61     ZYDIS_SEMANTIC_OPTYPE_UNUSED,
     62     ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG,
     63     ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM,
     64     ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_IMM1,
     65     ZYDIS_SEMANTIC_OPTYPE_GPR8,
     66     ZYDIS_SEMANTIC_OPTYPE_GPR16,
     67     ZYDIS_SEMANTIC_OPTYPE_GPR32,
     68     ZYDIS_SEMANTIC_OPTYPE_GPR64,
     69     ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64,
     70     ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64,
     71     ZYDIS_SEMANTIC_OPTYPE_GPR16_32_32,
     72     ZYDIS_SEMANTIC_OPTYPE_GPR_ASZ,
     73     ZYDIS_SEMANTIC_OPTYPE_FPR,
     74     ZYDIS_SEMANTIC_OPTYPE_MMX,
     75     ZYDIS_SEMANTIC_OPTYPE_XMM,
     76     ZYDIS_SEMANTIC_OPTYPE_YMM,
     77     ZYDIS_SEMANTIC_OPTYPE_ZMM,
     78     ZYDIS_SEMANTIC_OPTYPE_TMM,
     79     ZYDIS_SEMANTIC_OPTYPE_BND,
     80     ZYDIS_SEMANTIC_OPTYPE_SREG,
     81     ZYDIS_SEMANTIC_OPTYPE_CR,
     82     ZYDIS_SEMANTIC_OPTYPE_DR,
     83     ZYDIS_SEMANTIC_OPTYPE_MASK,
     84     ZYDIS_SEMANTIC_OPTYPE_MEM,
     85     ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX,
     86     ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY,
     87     ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ,
     88     ZYDIS_SEMANTIC_OPTYPE_IMM,
     89     ZYDIS_SEMANTIC_OPTYPE_REL,
     90     ZYDIS_SEMANTIC_OPTYPE_PTR,
     91     ZYDIS_SEMANTIC_OPTYPE_AGEN,
     92     ZYDIS_SEMANTIC_OPTYPE_MOFFS,
     93     ZYDIS_SEMANTIC_OPTYPE_MIB,
     94 
     95     /**
     96      * Maximum value of this enum.
     97      */
     98     ZYDIS_SEMANTIC_OPTYPE_MAX_VALUE = ZYDIS_SEMANTIC_OPTYPE_MIB,
     99     /**
    100      * The minimum number of bits required to represent all values of this enum.
    101      */
    102     ZYDIS_SEMANTIC_OPTYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_SEMANTIC_OPTYPE_MAX_VALUE)
    103 } ZydisSemanticOperandType;
    104 
    105 /* ---------------------------------------------------------------------------------------------- */
    106 
    107 /**
    108  * Defines the `ZydisInternalElementType` enum.
    109  */
    110 typedef enum ZydisInternalElementType_
    111 {
    112     ZYDIS_IELEMENT_TYPE_INVALID,
    113     ZYDIS_IELEMENT_TYPE_VARIABLE,
    114     ZYDIS_IELEMENT_TYPE_STRUCT,
    115     ZYDIS_IELEMENT_TYPE_INT,
    116     ZYDIS_IELEMENT_TYPE_UINT,
    117     ZYDIS_IELEMENT_TYPE_INT1,
    118     ZYDIS_IELEMENT_TYPE_INT8,
    119     ZYDIS_IELEMENT_TYPE_INT16,
    120     ZYDIS_IELEMENT_TYPE_INT32,
    121     ZYDIS_IELEMENT_TYPE_INT64,
    122     ZYDIS_IELEMENT_TYPE_UINT8,
    123     ZYDIS_IELEMENT_TYPE_UINT16,
    124     ZYDIS_IELEMENT_TYPE_UINT32,
    125     ZYDIS_IELEMENT_TYPE_UINT64,
    126     ZYDIS_IELEMENT_TYPE_UINT128,
    127     ZYDIS_IELEMENT_TYPE_UINT256,
    128     ZYDIS_IELEMENT_TYPE_FLOAT16,
    129     ZYDIS_IELEMENT_TYPE_FLOAT16X2,
    130     ZYDIS_IELEMENT_TYPE_FLOAT32,
    131     ZYDIS_IELEMENT_TYPE_FLOAT64,
    132     ZYDIS_IELEMENT_TYPE_FLOAT80,
    133     ZYDIS_IELEMENT_TYPE_BCD80,
    134     ZYDIS_IELEMENT_TYPE_CC3,
    135     ZYDIS_IELEMENT_TYPE_CC5,
    136 
    137     /**
    138      * Maximum value of this enum.
    139      */
    140     ZYDIS_IELEMENT_TYPE_MAX_VALUE = ZYDIS_IELEMENT_TYPE_CC5,
    141     /**
    142      * The minimum number of bits required to represent all values of this enum.
    143      */
    144     ZYDIS_IELEMENT_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IELEMENT_TYPE_MAX_VALUE)
    145 } ZydisInternalElementType;
    146 
    147 /* ---------------------------------------------------------------------------------------------- */
    148 
    149 /**
    150  * Defines the `ZydisImplicitRegisterType` enum.
    151  */
    152 typedef enum ZydisImplicitRegisterType_
    153 {
    154     // TODO: Rename OSZ|ASZ|SSZ_
    155     ZYDIS_IMPLREG_TYPE_STATIC,
    156     ZYDIS_IMPLREG_TYPE_GPR_OSZ,
    157     ZYDIS_IMPLREG_TYPE_GPR_ASZ,
    158     ZYDIS_IMPLREG_TYPE_IP_ASZ,
    159     ZYDIS_IMPLREG_TYPE_IP_SSZ,
    160     ZYDIS_IMPLREG_TYPE_GPR_SSZ,
    161     ZYDIS_IMPLREG_TYPE_FLAGS_SSZ,
    162 
    163     /**
    164      * Maximum value of this enum.
    165      */
    166     ZYDIS_IMPLREG_TYPE_MAX_VALUE = ZYDIS_IMPLREG_TYPE_FLAGS_SSZ,
    167     /**
    168      * The minimum number of bits required to represent all values of this enum.
    169      */
    170     ZYDIS_IMPLREG_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IMPLREG_TYPE_MAX_VALUE)
    171 } ZydisImplicitRegisterType;
    172 
    173 /* ---------------------------------------------------------------------------------------------- */
    174 
    175 /**
    176  * Defines the `ZydisImplicitMemBase` enum.
    177  */
    178 typedef enum ZydisImplicitMemBase_
    179 {
    180     // TODO: Rename OSZ|ASZ|SSZ_
    181     ZYDIS_IMPLMEM_BASE_AGPR_REG,
    182     ZYDIS_IMPLMEM_BASE_AGPR_RM,
    183     ZYDIS_IMPLMEM_BASE_AAX,
    184     ZYDIS_IMPLMEM_BASE_ADX,
    185     ZYDIS_IMPLMEM_BASE_ABX,
    186     ZYDIS_IMPLMEM_BASE_ASI,
    187     ZYDIS_IMPLMEM_BASE_ADI,
    188     ZYDIS_IMPLMEM_BASE_SSP,
    189     ZYDIS_IMPLMEM_BASE_SBP,
    190 
    191     /**
    192      * Maximum value of this enum.
    193      */
    194     ZYDIS_IMPLMEM_BASE_MAX_VALUE = ZYDIS_IMPLMEM_BASE_SBP,
    195     /**
    196      * The minimum number of bits required to represent all values of this enum.
    197      */
    198     ZYDIS_IMPLMEM_BASE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IMPLMEM_BASE_MAX_VALUE)
    199 } ZydisImplicitMemBase;
    200 
    201 /* ---------------------------------------------------------------------------------------------- */
    202 
    203 // MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct
    204 // enum types
    205 ZYAN_STATIC_ASSERT(ZYDIS_SEMANTIC_OPTYPE_REQUIRED_BITS     <=  8);
    206 ZYAN_STATIC_ASSERT(ZYDIS_OPERAND_VISIBILITY_REQUIRED_BITS  <=  8);
    207 ZYAN_STATIC_ASSERT(ZYDIS_OPERAND_ACTION_REQUIRED_BITS      <=  8);
    208 ZYAN_STATIC_ASSERT(ZYDIS_IELEMENT_TYPE_REQUIRED_BITS       <=  8);
    209 ZYAN_STATIC_ASSERT(ZYDIS_OPERAND_ENCODING_REQUIRED_BITS    <=  8);
    210 ZYAN_STATIC_ASSERT(ZYDIS_IMPLREG_TYPE_REQUIRED_BITS        <=  8);
    211 ZYAN_STATIC_ASSERT(ZYDIS_REGISTER_REQUIRED_BITS            <= 16);
    212 ZYAN_STATIC_ASSERT(ZYDIS_IMPLMEM_BASE_REQUIRED_BITS        <=  8);
    213 
    214 /**
    215  * Defines the `ZydisOperandDefinition` struct.
    216  */
    217 typedef struct ZydisOperandDefinition_
    218 {
    219     ZyanU8 type                            ZYAN_BITFIELD(ZYDIS_SEMANTIC_OPTYPE_REQUIRED_BITS);
    220     ZyanU8 visibility                      ZYAN_BITFIELD(ZYDIS_OPERAND_VISIBILITY_REQUIRED_BITS);
    221     ZyanU8 actions                         ZYAN_BITFIELD(ZYDIS_OPERAND_ACTION_REQUIRED_BITS);
    222     ZyanU16 size[3];
    223     ZyanU8 element_type                    ZYAN_BITFIELD(ZYDIS_IELEMENT_TYPE_REQUIRED_BITS);
    224     union
    225     {
    226         ZyanU8 encoding                    ZYAN_BITFIELD(ZYDIS_OPERAND_ENCODING_REQUIRED_BITS);
    227         struct
    228         {
    229             ZyanU8 type                    ZYAN_BITFIELD(ZYDIS_IMPLREG_TYPE_REQUIRED_BITS);
    230             union
    231             {
    232                 ZyanU16 reg                ZYAN_BITFIELD(ZYDIS_REGISTER_REQUIRED_BITS);
    233                 ZyanU8 id                  ZYAN_BITFIELD(6);
    234             } reg;
    235         } reg;
    236         struct
    237         {
    238             ZyanU8 seg                     ZYAN_BITFIELD(3);
    239             ZyanU8 base                    ZYAN_BITFIELD(ZYDIS_IMPLMEM_BASE_REQUIRED_BITS);
    240         } mem;
    241     } op;
    242     ZyanBool is_multisource4               ZYAN_BITFIELD(1);
    243     ZyanBool ignore_seg_override           ZYAN_BITFIELD(1);
    244 } ZydisOperandDefinition;
    245 
    246 /* ---------------------------------------------------------------------------------------------- */
    247 /* Instruction definition                                                                         */
    248 /* ---------------------------------------------------------------------------------------------- */
    249 
    250 /**
    251  * Defines the `ZydisReadWriteAction` enum.
    252  */
    253 typedef enum ZydisReadWriteAction_
    254 {
    255     ZYDIS_RW_ACTION_NONE,
    256     ZYDIS_RW_ACTION_READ,
    257     ZYDIS_RW_ACTION_WRITE,
    258     ZYDIS_RW_ACTION_READWRITE,
    259 
    260     /**
    261      * Maximum value of this enum.
    262      */
    263     ZYDIS_RW_ACTION_MAX_VALUE = ZYDIS_RW_ACTION_READWRITE,
    264     /**
    265      * The minimum number of bits required to represent all values of this enum.
    266      */
    267     ZYDIS_RW_ACTION_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_RW_ACTION_MAX_VALUE)
    268 } ZydisReadWriteAction;
    269 
    270 /* ---------------------------------------------------------------------------------------------- */
    271 
    272 /**
    273  * Defines the `ZydisInternalVectorLength` enum.
    274  */
    275 typedef enum ZydisInternalVectorLength_
    276 {
    277     ZYDIS_IVECTOR_LENGTH_DEFAULT,
    278     ZYDIS_IVECTOR_LENGTH_FIXED_128,
    279     ZYDIS_IVECTOR_LENGTH_FIXED_256,
    280     ZYDIS_IVECTOR_LENGTH_FIXED_512,
    281 
    282     /**
    283      * Maximum value of this enum.
    284      */
    285     ZYDIS_IVECTOR_LENGTH_MAX_VALUE = ZYDIS_IVECTOR_LENGTH_FIXED_512,
    286     /**
    287      * The minimum number of bits required to represent all values of this enum.
    288      */
    289     ZYDIS_IVECTOR_LENGTH_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IVECTOR_LENGTH_MAX_VALUE)
    290 } ZydisInternalVectorLength;
    291 
    292 /* ---------------------------------------------------------------------------------------------- */
    293 
    294 /**
    295  * Defines the `ZydisInternalElementSize` enum.
    296  */
    297 typedef enum ZydisInternalElementSize_
    298 {
    299     ZYDIS_IELEMENT_SIZE_INVALID,
    300     ZYDIS_IELEMENT_SIZE_8,
    301     ZYDIS_IELEMENT_SIZE_16,
    302     ZYDIS_IELEMENT_SIZE_32,
    303     ZYDIS_IELEMENT_SIZE_64,
    304     ZYDIS_IELEMENT_SIZE_128,
    305 
    306     /**
    307      * Maximum value of this enum.
    308      */
    309     ZYDIS_IELEMENT_SIZE_MAX_VALUE = ZYDIS_IELEMENT_SIZE_128,
    310     /**
    311      * The minimum number of bits required to represent all values of this enum.
    312      */
    313     ZYDIS_IELEMENT_SIZE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IELEMENT_SIZE_MAX_VALUE)
    314 } ZydisInternalElementSize;
    315 
    316 /* ---------------------------------------------------------------------------------------------- */
    317 
    318 /**
    319  * Defines the `ZydisEVEXFunctionality` enum.
    320  */
    321 typedef enum ZydisEVEXFunctionality_
    322 {
    323     ZYDIS_EVEX_FUNC_INVALID,
    324     /**
    325      * `EVEX.b` enables broadcast functionality.
    326      */
    327     ZYDIS_EVEX_FUNC_BC,
    328     /**
    329      * `EVEX.b` enables embedded-rounding functionality.
    330      */
    331     ZYDIS_EVEX_FUNC_RC,
    332     /**
    333      * `EVEX.b` enables sae functionality.
    334      */
    335     ZYDIS_EVEX_FUNC_SAE,
    336 
    337     /**
    338      * Maximum value of this enum.
    339      */
    340     ZYDIS_EVEX_FUNC_MAX_VALUE = ZYDIS_EVEX_FUNC_SAE,
    341     /**
    342      * The minimum number of bits required to represent all values of this enum.
    343      */
    344     ZYDIS_EVEX_FUNC_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_EVEX_FUNC_MAX_VALUE)
    345 } ZydisEVEXFunctionality;
    346 
    347 /* ---------------------------------------------------------------------------------------------- */
    348 
    349 /**
    350  * Defines the `ZydisEVEXTupleType` enum.
    351  */
    352 typedef enum ZydisEVEXTupleType_
    353 {
    354     ZYDIS_TUPLETYPE_INVALID,
    355     /**
    356      * Full Vector
    357      */
    358     ZYDIS_TUPLETYPE_FV,
    359     /**
    360      * Half Vector
    361      */
    362     ZYDIS_TUPLETYPE_HV,
    363     /**
    364      * Full Vector Mem
    365      */
    366     ZYDIS_TUPLETYPE_FVM,
    367     /**
    368      * Tuple1 Scalar
    369      */
    370     ZYDIS_TUPLETYPE_T1S,
    371     /**
    372      * Tuple1 Fixed
    373      */
    374     ZYDIS_TUPLETYPE_T1F,
    375     /**
    376      * Tuple1 4x32
    377      */
    378     ZYDIS_TUPLETYPE_T1_4X,
    379     /**
    380      * Gather / Scatter
    381      */
    382     ZYDIS_TUPLETYPE_GSCAT,
    383     /**
    384      * Tuple2
    385      */
    386     ZYDIS_TUPLETYPE_T2,
    387     /**
    388      * Tuple4
    389      */
    390     ZYDIS_TUPLETYPE_T4,
    391     /**
    392      * Tuple8
    393      */
    394     ZYDIS_TUPLETYPE_T8,
    395     /**
    396      * Half Mem
    397      */
    398     ZYDIS_TUPLETYPE_HVM,
    399     /**
    400      * QuarterMem
    401      */
    402     ZYDIS_TUPLETYPE_QVM,
    403     /**
    404      * OctMem
    405      */
    406     ZYDIS_TUPLETYPE_OVM,
    407     /**
    408      * Mem128
    409      */
    410     ZYDIS_TUPLETYPE_M128,
    411     /**
    412      * MOVDDUP
    413      */
    414     ZYDIS_TUPLETYPE_DUP,
    415     /**
    416      * Quarter of the vector-length.
    417      */
    418     ZYDIS_TUPLETYPE_QUARTER,
    419 
    420     /**
    421      * Maximum value of this enum.
    422      */
    423     ZYDIS_TUPLETYPE_MAX_VALUE = ZYDIS_TUPLETYPE_QUARTER,
    424     /**
    425      * The minimum number of bits required to represent all values of this enum.
    426      */
    427     ZYDIS_TUPLETYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_TUPLETYPE_MAX_VALUE)
    428 } ZydisEVEXTupleType;
    429 
    430 /* ---------------------------------------------------------------------------------------------- */
    431 
    432 /**
    433  * Defines the `ZydisMVEXFunctionality` enum.
    434  */
    435 typedef enum ZydisMVEXFunctionality_
    436 {
    437     /**
    438      * The `MVEX.SSS` value is ignored.
    439      */
    440     ZYDIS_MVEX_FUNC_IGNORED,
    441     /**
    442      * `MVEX.SSS` must be `000b`.
    443      */
    444     ZYDIS_MVEX_FUNC_INVALID,
    445     /**
    446      * `MVEX.SSS` controls embedded-rounding functionality.
    447      */
    448     ZYDIS_MVEX_FUNC_RC,
    449     /**
    450      * `MVEX.SSS` controls sae functionality.
    451      */
    452     ZYDIS_MVEX_FUNC_SAE,
    453     /**
    454      * No special operation (32bit float elements).
    455      */
    456     ZYDIS_MVEX_FUNC_F_32,
    457     /**
    458      * No special operation (32bit uint elements).
    459      */
    460     ZYDIS_MVEX_FUNC_I_32,
    461     /**
    462      * No special operation (64bit float elements).
    463      */
    464     ZYDIS_MVEX_FUNC_F_64,
    465     /**
    466      * No special operation (64bit uint elements).
    467      */
    468     ZYDIS_MVEX_FUNC_I_64,
    469     /**
    470      * Sf32(reg) or Si32(reg).
    471      */
    472     ZYDIS_MVEX_FUNC_SWIZZLE_32,
    473     /**
    474      * Sf64(reg) or Si64(reg).
    475      */
    476     ZYDIS_MVEX_FUNC_SWIZZLE_64,
    477     /**
    478      * Sf32(mem).
    479      */
    480     ZYDIS_MVEX_FUNC_SF_32,
    481     /**
    482      * Sf32(mem) broadcast only.
    483      */
    484     ZYDIS_MVEX_FUNC_SF_32_BCST,
    485     /**
    486      * Sf32(mem) broadcast 4to16 only.
    487      */
    488     ZYDIS_MVEX_FUNC_SF_32_BCST_4TO16,
    489     /**
    490      * Sf64(mem).
    491      */
    492     ZYDIS_MVEX_FUNC_SF_64,
    493     /**
    494      * Si32(mem).
    495      */
    496     ZYDIS_MVEX_FUNC_SI_32,
    497     /**
    498      * Si32(mem) broadcast only.
    499      */
    500     ZYDIS_MVEX_FUNC_SI_32_BCST,
    501     /**
    502      * Si32(mem) broadcast 4to16 only.
    503      */
    504     ZYDIS_MVEX_FUNC_SI_32_BCST_4TO16,
    505     /**
    506      * Si64(mem).
    507      */
    508     ZYDIS_MVEX_FUNC_SI_64,
    509     /**
    510      * Uf32.
    511      */
    512     ZYDIS_MVEX_FUNC_UF_32,
    513     /**
    514      * Uf64.
    515      */
    516     ZYDIS_MVEX_FUNC_UF_64,
    517     /**
    518      * Ui32.
    519      */
    520     ZYDIS_MVEX_FUNC_UI_32,
    521     /**
    522      * Ui64.
    523      */
    524     ZYDIS_MVEX_FUNC_UI_64,
    525     /**
    526      * Df32.
    527      */
    528     ZYDIS_MVEX_FUNC_DF_32,
    529     /**
    530      * Df64.
    531      */
    532     ZYDIS_MVEX_FUNC_DF_64,
    533     /**
    534      * Di32.
    535      */
    536     ZYDIS_MVEX_FUNC_DI_32,
    537     /**
    538      * Di64.
    539      */
    540     ZYDIS_MVEX_FUNC_DI_64,
    541 
    542     /**
    543      * Maximum value of this enum.
    544      */
    545     ZYDIS_MVEX_FUNC_MAX_VALUE = ZYDIS_MVEX_FUNC_DI_64,
    546     /**
    547      * The minimum number of bits required to represent all values of this enum.
    548      */
    549     ZYDIS_MVEX_FUNC_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MVEX_FUNC_MAX_VALUE)
    550 } ZydisMVEXFunctionality;
    551 
    552 /* ---------------------------------------------------------------------------------------------- */
    553 
    554 /**
    555  * Defines the `ZydisVEXStaticBroadcast` enum.
    556  */
    557 typedef enum ZydisVEXStaticBroadcast
    558 {
    559     ZYDIS_VEX_STATIC_BROADCAST_NONE,
    560     ZYDIS_VEX_STATIC_BROADCAST_1_TO_2,
    561     ZYDIS_VEX_STATIC_BROADCAST_1_TO_4,
    562     ZYDIS_VEX_STATIC_BROADCAST_1_TO_8,
    563     ZYDIS_VEX_STATIC_BROADCAST_1_TO_16,
    564     ZYDIS_VEX_STATIC_BROADCAST_1_TO_32,
    565     ZYDIS_VEX_STATIC_BROADCAST_2_TO_4,
    566 
    567     /**
    568      * Maximum value of this enum.
    569      */
    570     ZYDIS_VEX_STATIC_BROADCAST_MAX_VALUE = ZYDIS_VEX_STATIC_BROADCAST_2_TO_4,
    571     /**
    572      * The minimum number of bits required to represent all values of this enum.
    573      */
    574     ZYDIS_VEX_STATIC_BROADCAST_REQUIRED_BITS =
    575         ZYAN_BITS_TO_REPRESENT(ZYDIS_VEX_STATIC_BROADCAST_MAX_VALUE)
    576 } ZydisVEXStaticBroadcast;
    577 
    578 /* ---------------------------------------------------------------------------------------------- */
    579 
    580 /**
    581  * Defines the `ZydisEVEXStaticBroadcast` enum.
    582  */
    583 typedef enum ZydisEVEXStaticBroadcast_
    584 {
    585     ZYDIS_EVEX_STATIC_BROADCAST_NONE,
    586     ZYDIS_EVEX_STATIC_BROADCAST_1_TO_2,
    587     ZYDIS_EVEX_STATIC_BROADCAST_1_TO_4,
    588     ZYDIS_EVEX_STATIC_BROADCAST_1_TO_8,
    589     ZYDIS_EVEX_STATIC_BROADCAST_1_TO_16,
    590     ZYDIS_EVEX_STATIC_BROADCAST_1_TO_32,
    591     ZYDIS_EVEX_STATIC_BROADCAST_1_TO_64,
    592     ZYDIS_EVEX_STATIC_BROADCAST_2_TO_4,
    593     ZYDIS_EVEX_STATIC_BROADCAST_2_TO_8,
    594     ZYDIS_EVEX_STATIC_BROADCAST_2_TO_16,
    595     ZYDIS_EVEX_STATIC_BROADCAST_4_TO_8,
    596     ZYDIS_EVEX_STATIC_BROADCAST_4_TO_16,
    597     ZYDIS_EVEX_STATIC_BROADCAST_8_TO_16,
    598 
    599     /**
    600      * Maximum value of this enum.
    601      */
    602     ZYDIS_EVEX_STATIC_BROADCAST_MAX_VALUE = ZYDIS_EVEX_STATIC_BROADCAST_8_TO_16,
    603     /**
    604      * The minimum number of bits required to represent all values of this enum.
    605      */
    606     ZYDIS_EVEX_STATIC_BROADCAST_REQUIRED_BITS =
    607         ZYAN_BITS_TO_REPRESENT(ZYDIS_EVEX_STATIC_BROADCAST_MAX_VALUE)
    608 } ZydisEVEXStaticBroadcast;
    609 
    610 /* ---------------------------------------------------------------------------------------------- */
    611 
    612 /**
    613  * Defines the `ZydisMVEXStaticBroadcast` enum.
    614  */
    615 typedef enum ZydisMVEXStaticBroadcast_
    616 {
    617     ZYDIS_MVEX_STATIC_BROADCAST_NONE,
    618     ZYDIS_MVEX_STATIC_BROADCAST_1_TO_8,
    619     ZYDIS_MVEX_STATIC_BROADCAST_1_TO_16,
    620     ZYDIS_MVEX_STATIC_BROADCAST_4_TO_8,
    621     ZYDIS_MVEX_STATIC_BROADCAST_4_TO_16,
    622 
    623     /**
    624      * Maximum value of this enum.
    625      */
    626     ZYDIS_MVEX_STATIC_BROADCAST_MAX_VALUE = ZYDIS_MVEX_STATIC_BROADCAST_4_TO_16,
    627     /**
    628      * The minimum number of bits required to represent all values of this enum.
    629      */
    630     ZYDIS_MVEX_STATIC_BROADCAST_REQUIRED_BITS =
    631         ZYAN_BITS_TO_REPRESENT(ZYDIS_MVEX_STATIC_BROADCAST_MAX_VALUE)
    632 } ZydisMVEXStaticBroadcast;
    633 
    634 /* ---------------------------------------------------------------------------------------------- */
    635 
    636 /**
    637  * Defines the `ZydisMaskPolicy` enum.
    638  */
    639 typedef enum ZydisMaskPolicy_
    640 {
    641     ZYDIS_MASK_POLICY_INVALID,
    642     /**
    643      * The instruction accepts mask-registers other than the default-mask (K0), but
    644      *          does not require them.
    645      */
    646     ZYDIS_MASK_POLICY_ALLOWED,
    647     /**
    648      * The instruction requires a mask-register other than the default-mask (K0).
    649      */
    650     ZYDIS_MASK_POLICY_REQUIRED,
    651     /**
    652      * The instruction does not allow a mask-register other than the default-mask (K0).
    653      */
    654     ZYDIS_MASK_POLICY_FORBIDDEN,
    655 
    656     /**
    657      * Maximum value of this enum.
    658      */
    659     ZYDIS_MASK_POLICY_MAX_VALUE = ZYDIS_MASK_POLICY_FORBIDDEN,
    660     /**
    661      * The minimum number of bits required to represent all values of this enum.
    662      */
    663     ZYDIS_MASK_POLICY_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MASK_POLICY_MAX_VALUE)
    664 } ZydisMaskPolicy;
    665 
    666 /* ---------------------------------------------------------------------------------------------- */
    667 
    668 /**
    669  * Defines the `ZydisMaskOverride` enum.
    670  */
    671 typedef enum ZydisMaskOverride_
    672 {
    673     ZYDIS_MASK_OVERRIDE_DEFAULT,
    674     ZYDIS_MASK_OVERRIDE_ZEROING,
    675     ZYDIS_MASK_OVERRIDE_CONTROL,
    676 
    677     /**
    678      * Maximum value of this enum.
    679      */
    680     ZYDIS_MASK_OVERRIDE_MAX_VALUE = ZYDIS_MASK_OVERRIDE_CONTROL,
    681     /**
    682      * The minimum number of bits required to represent all values of this enum.
    683      */
    684     ZYDIS_MASK_OVERRIDE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MASK_OVERRIDE_MAX_VALUE)
    685 } ZydisMaskOverride;
    686 
    687 /* ---------------------------------------------------------------------------------------------- */
    688 
    689 #define ZYDIS_OPDEF_REQUIRED_BITS \
    690     ZYAN_MAX(ZYDIS_REGKIND_REQUIRED_BITS, ZYDIS_MEMOP_TYPE_REQUIRED_BITS + 1) + 1
    691 
    692 #define ZYDIS_OPDEF_GET_REG(operand_definition) \
    693     ((operand_definition) & ((1 << ZYDIS_REGKIND_REQUIRED_BITS   ) - 1))
    694 
    695 #define ZYDIS_OPDEF_GET_MEM(operand_definition) \
    696     ((operand_definition) & ((1 << ZYDIS_MEMOP_TYPE_REQUIRED_BITS) - 1))
    697 
    698 #define ZYDIS_OPDEF_GET_REG_HIGH_BIT(operand_definition) \
    699     (((operand_definition) >> ZYDIS_REGKIND_REQUIRED_BITS   ) & 0x01)
    700 
    701 #define ZYDIS_OPDEF_GET_MEM_HIGH_BIT(operand_definition) \
    702     (((operand_definition) >> ZYDIS_MEMOP_TYPE_REQUIRED_BITS) & 0x01)
    703 
    704 // MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct
    705 // enum types
    706 ZYAN_STATIC_ASSERT(ZYDIS_MNEMONIC_REQUIRED_BITS        <= 16);
    707 ZYAN_STATIC_ASSERT(ZYDIS_CATEGORY_REQUIRED_BITS        <=  8);
    708 ZYAN_STATIC_ASSERT(ZYDIS_ISA_SET_REQUIRED_BITS         <=  8);
    709 ZYAN_STATIC_ASSERT(ZYDIS_ISA_EXT_REQUIRED_BITS         <=  8);
    710 ZYAN_STATIC_ASSERT(ZYDIS_BRANCH_TYPE_REQUIRED_BITS     <=  8);
    711 ZYAN_STATIC_ASSERT(ZYDIS_EXCEPTION_CLASS_REQUIRED_BITS <=  8);
    712 ZYAN_STATIC_ASSERT(ZYDIS_OPDEF_REQUIRED_BITS           <=  8);
    713 ZYAN_STATIC_ASSERT(ZYDIS_RW_ACTION_REQUIRED_BITS       <=  8);
    714 
    715 #ifndef ZYDIS_MINIMAL_MODE
    716 #   define ZYDIS_INSTRUCTION_DEFINITION_BASE \
    717         ZyanU16 mnemonic                       ZYAN_BITFIELD(ZYDIS_MNEMONIC_REQUIRED_BITS); \
    718         ZyanU8 operand_count                   ZYAN_BITFIELD( 4); \
    719         ZyanU8 operand_count_visible           ZYAN_BITFIELD( 3); \
    720         ZyanU16 operand_reference              ZYAN_BITFIELD(15); \
    721         ZyanU8 operand_size_map                ZYAN_BITFIELD( 3); \
    722         ZyanU8 address_size_map                ZYAN_BITFIELD( 2); \
    723         ZyanU8 flags_reference                 ZYAN_BITFIELD( 7); \
    724         ZyanBool requires_protected_mode       ZYAN_BITFIELD( 1); \
    725         ZyanBool no_compat_mode                ZYAN_BITFIELD( 1); \
    726         ZyanU8 category                        ZYAN_BITFIELD(ZYDIS_CATEGORY_REQUIRED_BITS); \
    727         ZyanU8 isa_set                         ZYAN_BITFIELD(ZYDIS_ISA_SET_REQUIRED_BITS); \
    728         ZyanU8 isa_ext                         ZYAN_BITFIELD(ZYDIS_ISA_EXT_REQUIRED_BITS); \
    729         ZyanU8 branch_type                     ZYAN_BITFIELD(ZYDIS_BRANCH_TYPE_REQUIRED_BITS); \
    730         ZyanU8 exception_class                 ZYAN_BITFIELD(ZYDIS_EXCEPTION_CLASS_REQUIRED_BITS); \
    731         ZyanU8 op_reg                          ZYAN_BITFIELD(ZYDIS_OPDEF_REQUIRED_BITS); \
    732         ZyanU8 op_rm                           ZYAN_BITFIELD(ZYDIS_OPDEF_REQUIRED_BITS); \
    733         ZyanU8 cpu_state                       ZYAN_BITFIELD(ZYDIS_RW_ACTION_REQUIRED_BITS); \
    734         ZyanU8 fpu_state                       ZYAN_BITFIELD(ZYDIS_RW_ACTION_REQUIRED_BITS); \
    735         ZyanU8 xmm_state                       ZYAN_BITFIELD(ZYDIS_RW_ACTION_REQUIRED_BITS); \
    736         ZyanBool accepts_segment               ZYAN_BITFIELD( 1)
    737 #else
    738 #   define ZYDIS_INSTRUCTION_DEFINITION_BASE \
    739         ZyanU16 mnemonic                       ZYAN_BITFIELD(ZYDIS_MNEMONIC_REQUIRED_BITS); \
    740         ZyanU8 operand_size_map                ZYAN_BITFIELD( 3); \
    741         ZyanU8 address_size_map                ZYAN_BITFIELD( 2); \
    742         ZyanBool requires_protected_mode       ZYAN_BITFIELD( 1); \
    743         ZyanBool no_compat_mode                ZYAN_BITFIELD( 1); \
    744         ZyanU8 op_reg                          ZYAN_BITFIELD(ZYDIS_OPDEF_REQUIRED_BITS); \
    745         ZyanU8 op_rm                           ZYAN_BITFIELD(ZYDIS_OPDEF_REQUIRED_BITS)
    746 #endif
    747 
    748 #define ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR \
    749     ZYDIS_INSTRUCTION_DEFINITION_BASE; \
    750     ZyanU8 op_ndsndd                       ZYAN_BITFIELD(ZYDIS_OPDEF_REQUIRED_BITS)
    751 
    752 #define ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR_INTEL \
    753     ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR; \
    754     ZyanBool is_gather                     ZYAN_BITFIELD( 1); \
    755     ZyanBool no_source_dest_match          ZYAN_BITFIELD( 1); \
    756     ZyanBool no_source_source_match        ZYAN_BITFIELD( 1)        // TODO: Could be moved to VEX
    757 
    758 /**
    759  * Defines the `ZydisInstructionDefinition` struct.
    760  */
    761 typedef struct ZydisInstructionDefinition_
    762 {
    763     ZYDIS_INSTRUCTION_DEFINITION_BASE;
    764 } ZydisInstructionDefinition;
    765 
    766 /**
    767  * Defines the `ZydisInstructionDefinitionLEGACY` struct.
    768  */
    769 typedef struct ZydisInstructionDefinitionLEGACY_
    770 {
    771     ZYDIS_INSTRUCTION_DEFINITION_BASE;
    772 #ifndef ZYDIS_MINIMAL_MODE
    773     ZyanBool is_privileged                 ZYAN_BITFIELD( 1);
    774 #endif
    775     ZyanBool accepts_LOCK                  ZYAN_BITFIELD( 1);
    776 #ifndef ZYDIS_MINIMAL_MODE
    777     ZyanBool accepts_REP                   ZYAN_BITFIELD( 1);
    778     ZyanBool accepts_REPEREPZ              ZYAN_BITFIELD( 1);
    779     ZyanBool accepts_REPNEREPNZ            ZYAN_BITFIELD( 1);
    780     ZyanBool accepts_BOUND                 ZYAN_BITFIELD( 1);
    781     ZyanBool accepts_XACQUIRE              ZYAN_BITFIELD( 1);
    782     ZyanBool accepts_XRELEASE              ZYAN_BITFIELD( 1);
    783     ZyanBool accepts_NOTRACK               ZYAN_BITFIELD( 1);
    784     ZyanBool accepts_hle_without_lock      ZYAN_BITFIELD( 1);
    785     ZyanBool accepts_branch_hints          ZYAN_BITFIELD( 1);
    786 #endif
    787 } ZydisInstructionDefinitionLEGACY;
    788 
    789 /**
    790  * Defines the `ZydisInstructionDefinition3DNOW` struct.
    791  */
    792 typedef struct ZydisInstructionDefinition3DNOW_
    793 {
    794     ZYDIS_INSTRUCTION_DEFINITION_BASE;
    795 } ZydisInstructionDefinition3DNOW;
    796 
    797 /**
    798  * Defines the `ZydisInstructionDefinitionXOP` struct.
    799  */
    800 typedef struct ZydisInstructionDefinitionXOP_
    801 {
    802     ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR;
    803 } ZydisInstructionDefinitionXOP;
    804 
    805 // MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct
    806 // enum types
    807 ZYAN_STATIC_ASSERT(ZYDIS_VEX_STATIC_BROADCAST_REQUIRED_BITS  <=  8);
    808 
    809 /**
    810  * Defines the `ZydisInstructionDefinitionVEX` struct.
    811  */
    812 typedef struct ZydisInstructionDefinitionVEX_
    813 {
    814     ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR_INTEL;
    815 #ifndef ZYDIS_MINIMAL_MODE
    816     ZyanU8 broadcast                       ZYAN_BITFIELD(ZYDIS_VEX_STATIC_BROADCAST_REQUIRED_BITS);
    817 #endif
    818 } ZydisInstructionDefinitionVEX;
    819 
    820 #ifndef ZYDIS_DISABLE_AVX512
    821 
    822 // MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct
    823 // enum types
    824 ZYAN_STATIC_ASSERT(ZYDIS_IVECTOR_LENGTH_REQUIRED_BITS        <=  8);
    825 ZYAN_STATIC_ASSERT(ZYDIS_TUPLETYPE_REQUIRED_BITS             <=  8);
    826 ZYAN_STATIC_ASSERT(ZYDIS_IELEMENT_SIZE_REQUIRED_BITS         <=  8);
    827 ZYAN_STATIC_ASSERT(ZYDIS_EVEX_FUNC_REQUIRED_BITS             <=  8);
    828 ZYAN_STATIC_ASSERT(ZYDIS_MASK_POLICY_REQUIRED_BITS           <=  8);
    829 ZYAN_STATIC_ASSERT(ZYDIS_MASK_OVERRIDE_REQUIRED_BITS         <=  8);
    830 ZYAN_STATIC_ASSERT(ZYDIS_EVEX_STATIC_BROADCAST_REQUIRED_BITS <=  8);
    831 
    832 /**
    833  * Defines the `ZydisInstructionDefinitionEVEX` struct.
    834  */
    835 typedef struct ZydisInstructionDefinitionEVEX_
    836 {
    837     ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR_INTEL;
    838 #ifndef ZYDIS_MINIMAL_MODE
    839     ZyanU8 vector_length                   ZYAN_BITFIELD(ZYDIS_IVECTOR_LENGTH_REQUIRED_BITS);
    840     ZyanU8 tuple_type                      ZYAN_BITFIELD(ZYDIS_TUPLETYPE_REQUIRED_BITS);
    841     ZyanU8 element_size                    ZYAN_BITFIELD(ZYDIS_IELEMENT_SIZE_REQUIRED_BITS);
    842     ZyanU8 functionality                   ZYAN_BITFIELD(ZYDIS_EVEX_FUNC_REQUIRED_BITS);
    843 #endif
    844     ZyanU8 mask_policy                     ZYAN_BITFIELD(ZYDIS_MASK_POLICY_REQUIRED_BITS);
    845     ZyanBool accepts_zero_mask             ZYAN_BITFIELD( 1);
    846 #ifndef ZYDIS_MINIMAL_MODE
    847     ZyanU8 mask_override                   ZYAN_BITFIELD(ZYDIS_MASK_OVERRIDE_REQUIRED_BITS);
    848     ZyanU8 broadcast                       ZYAN_BITFIELD(ZYDIS_EVEX_STATIC_BROADCAST_REQUIRED_BITS);
    849 #endif
    850 } ZydisInstructionDefinitionEVEX;
    851 #endif
    852 
    853 #ifndef ZYDIS_DISABLE_KNC
    854 
    855 // MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct
    856 // enum types
    857 ZYAN_STATIC_ASSERT(ZYDIS_MVEX_FUNC_REQUIRED_BITS             <=  8);
    858 ZYAN_STATIC_ASSERT(ZYDIS_MASK_POLICY_REQUIRED_BITS           <=  8);
    859 ZYAN_STATIC_ASSERT(ZYDIS_MVEX_STATIC_BROADCAST_REQUIRED_BITS <=  8);
    860 
    861 /**
    862  * Defines the `ZydisInstructionDefinitionMVEX` struct.
    863  */
    864 typedef struct ZydisInstructionDefinitionMVEX_
    865 {
    866     ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR_INTEL;
    867     ZyanU8 functionality                   ZYAN_BITFIELD(ZYDIS_MVEX_FUNC_REQUIRED_BITS);
    868     ZyanU8 mask_policy                     ZYAN_BITFIELD(ZYDIS_MASK_POLICY_REQUIRED_BITS);
    869 #ifndef ZYDIS_MINIMAL_MODE
    870     ZyanBool has_element_granularity       ZYAN_BITFIELD( 1);
    871     ZyanU8 broadcast                       ZYAN_BITFIELD(ZYDIS_MVEX_STATIC_BROADCAST_REQUIRED_BITS);
    872 #endif
    873 } ZydisInstructionDefinitionMVEX;
    874 #endif
    875 
    876 /* ---------------------------------------------------------------------------------------------- */
    877 
    878 #pragma pack(pop)
    879 
    880 #ifdef ZYAN_MSVC
    881 #   pragma warning(pop)
    882 #endif
    883 
    884 /* ---------------------------------------------------------------------------------------------- */
    885 /* Accessed CPU/FPU flags                                                                         */
    886 /* ---------------------------------------------------------------------------------------------- */
    887 
    888 /*
    889  * Contains information about the CPU/FPU flags accessed by an instruction.
    890  *
    891  * We don't want this struct to be packed! A pointer to the individual members will be used by the
    892  * `ZydisDecodedInstruction` struct.
    893  */
    894 typedef struct ZydisDefinitionAccessedFlags_
    895 {
    896     ZydisAccessedFlags cpu_flags;
    897     ZydisAccessedFlags fpu_flags;
    898 } ZydisDefinitionAccessedFlags;
    899 
    900 /* ---------------------------------------------------------------------------------------------- */
    901 
    902 /* ============================================================================================== */
    903 /* Functions                                                                                      */
    904 /* ============================================================================================== */
    905 
    906 /* ---------------------------------------------------------------------------------------------- */
    907 /* Instruction definition                                                                         */
    908 /* ---------------------------------------------------------------------------------------------- */
    909 
    910 /**
    911  * Returns the instruction-definition with the given `encoding` and `id`.
    912  *
    913  * @param   encoding    The instruction-encoding.
    914  * @param   id          The definition-id.
    915  * @param   definition  A pointer to the variable that receives a pointer to the instruction-
    916  *                      definition.
    917  */
    918 ZYDIS_NO_EXPORT void ZydisGetInstructionDefinition(ZydisInstructionEncoding encoding,
    919     ZyanU16 id, const ZydisInstructionDefinition** definition);
    920 
    921 /* ---------------------------------------------------------------------------------------------- */
    922 /* Operand definition                                                                             */
    923 /* ---------------------------------------------------------------------------------------------- */
    924 
    925 #ifndef ZYDIS_MINIMAL_MODE
    926 /**
    927  * Returns the the operand-definitions for the given instruction-`definition`.
    928  *
    929  * @param   definition  A pointer to the instruction-definition.
    930  *
    931  * @return  A pointer to the first operand definition of the instruction, or `ZYAN_NULL`.
    932  */
    933 ZYDIS_NO_EXPORT const ZydisOperandDefinition* ZydisGetOperandDefinitions(
    934     const ZydisInstructionDefinition* definition);
    935 #endif
    936 
    937 /* ---------------------------------------------------------------------------------------------- */
    938 /* Element info                                                                                   */
    939 /* ---------------------------------------------------------------------------------------------- */
    940 
    941 #ifndef ZYDIS_MINIMAL_MODE
    942 /**
    943  * Returns the actual type and size of an internal element-type.
    944  *
    945  * @param   element The internal element type.
    946  * @param   type    The actual element type.
    947  * @param   size    The element size.
    948  */
    949 ZYDIS_NO_EXPORT void ZydisGetElementInfo(ZydisInternalElementType element, ZydisElementType* type,
    950     ZydisElementSize* size);
    951 #endif
    952 
    953 /* ---------------------------------------------------------------------------------------------- */
    954 /* Accessed CPU flags                                                                             */
    955 /* ---------------------------------------------------------------------------------------------- */
    956 
    957 #ifndef ZYDIS_MINIMAL_MODE
    958 /**
    959  * Returns the the operand-definitions for the given instruction-`definition`.
    960  *
    961  * @param   definition  A pointer to the instruction-definition.
    962  * @param   flags       A pointer to the variable that receives the `ZydisDefinitionAccessedFlags`
    963  *                      struct.
    964  *
    965  * @return  `ZYAN_TRUE`, if the instruction accesses any flags, or `ZYAN_FALSE`, if not.
    966  */
    967 ZYDIS_NO_EXPORT ZyanBool ZydisGetAccessedFlags(const ZydisInstructionDefinition* definition,
    968     const ZydisDefinitionAccessedFlags** flags);
    969 #endif
    970 
    971 /* ---------------------------------------------------------------------------------------------- */
    972 
    973 /* ============================================================================================== */
    974 
    975 #ifdef __cplusplus
    976 }
    977 #endif
    978 
    979 #endif /* ZYDIS_INTERNAL_SHAREDDATA_H */