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

DecoderTypes.h (38834B)


      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 /**
     28  * @file
     29  * Defines the basic `ZydisDecodedInstruction` and `ZydisDecodedOperand` structs.
     30  */
     31 
     32 #ifndef ZYDIS_INSTRUCTIONINFO_H
     33 #define ZYDIS_INSTRUCTIONINFO_H
     34 
     35 #include <Zycore/Types.h>
     36 #include <Zydis/MetaInfo.h>
     37 #include <Zydis/Mnemonic.h>
     38 #include <Zydis/Register.h>
     39 #include <Zydis/SharedTypes.h>
     40 
     41 #ifdef __cplusplus
     42 extern "C" {
     43 #endif
     44 
     45 /* ============================================================================================== */
     46 /* Decoded operand                                                                                */
     47 /* ============================================================================================== */
     48 
     49 /* ---------------------------------------------------------------------------------------------- */
     50 /* Operand attributes                                                                             */
     51 /* ---------------------------------------------------------------------------------------------- */
     52 
     53 /**
     54  * Defines the `ZydisOperandAttributes` data-type.
     55  */
     56 typedef ZyanU8 ZydisOperandAttributes;
     57 
     58 /**
     59  * The operand is a `MULTISOURCE4` register operand.
     60  *
     61  * This is a special register operand-type used by `4FMAPS` instructions where the given register
     62  * points to the first register of a register range (4 registers in total).
     63  *
     64  * Example: ZMM3 -> [ZMM3..ZMM6]
     65  */
     66 #define ZYDIS_OATTRIB_IS_MULTISOURCE4   0x01 // (1 <<  0)
     67 
     68 /* ---------------------------------------------------------------------------------------------- */
     69 /* Memory type                                                                                    */
     70 /* ---------------------------------------------------------------------------------------------- */
     71 
     72 /**
     73  * Defines the `ZydisMemoryOperandType` enum.
     74  */
     75 typedef enum ZydisMemoryOperandType_
     76 {
     77     ZYDIS_MEMOP_TYPE_INVALID,
     78     /**
     79      * Normal memory operand.
     80      */
     81     ZYDIS_MEMOP_TYPE_MEM,
     82     /**
     83      * The memory operand is only used for address-generation. No real memory-access is
     84      * caused.
     85      */
     86     ZYDIS_MEMOP_TYPE_AGEN,
     87     /**
     88      * A memory operand using `SIB` addressing form, where the index register is not used
     89      * in address calculation and scale is ignored. No real memory-access is caused.
     90      */
     91     ZYDIS_MEMOP_TYPE_MIB,
     92     /**
     93      * A vector `SIB` memory addressing operand (`VSIB`).
     94      */
     95     ZYDIS_MEMOP_TYPE_VSIB,
     96 
     97     /**
     98      * Maximum value of this enum.
     99      */
    100     ZYDIS_MEMOP_TYPE_MAX_VALUE = ZYDIS_MEMOP_TYPE_VSIB,
    101     /**
    102      * The minimum number of bits required to represent all values of this enum.
    103      */
    104     ZYDIS_MEMOP_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MEMOP_TYPE_MAX_VALUE)
    105 } ZydisMemoryOperandType;
    106 
    107 /* ---------------------------------------------------------------------------------------------- */
    108 /* Decoded operand                                                                                */
    109 /* ---------------------------------------------------------------------------------------------- */
    110 
    111 /**
    112  * Extended info for register-operands.
    113  */
    114 typedef struct ZydisDecodedOperandReg_
    115 {
    116     /**
    117      * The register value.
    118      */
    119     ZydisRegister value;
    120 } ZydisDecodedOperandReg;
    121 
    122 /**
    123  * Extended info for memory-operands.
    124  */
    125 typedef struct ZydisDecodedOperandMem_
    126 {
    127     /**
    128      * The type of the memory operand.
    129      */
    130     ZydisMemoryOperandType type;
    131     /**
    132      * The segment register.
    133      */
    134     ZydisRegister segment;
    135     /**
    136      * The base register.
    137      */
    138     ZydisRegister base;
    139     /**
    140      * The index register.
    141      */
    142     ZydisRegister index;
    143     /**
    144      * The scale factor.
    145      */
    146     ZyanU8 scale;
    147     /**
    148      * Extended info for memory-operands with displacement.
    149      */
    150     struct ZydisDecodedOperandMemDisp_
    151     {
    152         /**
    153          * Signals, if the displacement value is used.
    154          */
    155         ZyanBool has_displacement;
    156         /**
    157          * The displacement value
    158          */
    159         ZyanI64 value;
    160     } disp;
    161 } ZydisDecodedOperandMem;
    162 
    163 /**
    164  * Extended info for pointer-operands.
    165  */
    166 typedef struct ZydisDecodedOperandPtr_
    167 {
    168     ZyanU16 segment;
    169     ZyanU32 offset;
    170 } ZydisDecodedOperandPtr;
    171 
    172 /**
    173  * Extended info for immediate-operands.
    174  */
    175 typedef struct ZydisDecodedOperandImm_
    176 {
    177     /**
    178      * Signals, if the immediate value is signed.
    179      */
    180     ZyanBool is_signed;
    181     /**
    182      * Signals, if the immediate value contains a relative offset. You can use
    183      * `ZydisCalcAbsoluteAddress` to determine the absolute address value.
    184      */
    185     ZyanBool is_relative;
    186     /**
    187      * The immediate value.
    188      */
    189     union ZydisDecodedOperandImmValue_
    190     {
    191         ZyanU64 u;
    192         ZyanI64 s;
    193     } value;
    194 } ZydisDecodedOperandImm;
    195 
    196 /**
    197  * Defines the `ZydisDecodedOperand` struct.
    198  */
    199 typedef struct ZydisDecodedOperand_
    200 {
    201     /**
    202      * The operand-id.
    203      */
    204     ZyanU8 id;
    205     /**
    206      * The visibility of the operand.
    207      */
    208     ZydisOperandVisibility visibility;
    209     /**
    210      * The operand-actions.
    211      */
    212     ZydisOperandActions actions;
    213     /**
    214      * The operand-encoding.
    215      */
    216     ZydisOperandEncoding encoding;
    217     /**
    218      * The logical size of the operand (in bits).
    219      */
    220     ZyanU16 size;
    221     /**
    222      * The element-type.
    223      */
    224     ZydisElementType element_type;
    225     /**
    226      * The size of a single element.
    227      */
    228     ZydisElementSize element_size;
    229     /**
    230      * The number of elements.
    231      */
    232     ZyanU16 element_count;
    233     /*
    234      * Additional operand attributes.
    235      */
    236     ZydisOperandAttributes attributes;
    237     /**
    238      * The type of the operand.
    239      */
    240     ZydisOperandType type;
    241     /*
    242      * Operand type specific information.
    243      *
    244      * The enabled union variant is determined by the `type` field.
    245      */
    246     union
    247     {
    248         ZydisDecodedOperandReg reg;
    249         ZydisDecodedOperandMem mem;
    250         ZydisDecodedOperandPtr ptr;
    251         ZydisDecodedOperandImm imm;
    252     };
    253 } ZydisDecodedOperand;
    254 
    255 /* ---------------------------------------------------------------------------------------------- */
    256 
    257 /* ============================================================================================== */
    258 /* Decoded instruction                                                                            */
    259 /* ============================================================================================== */
    260 
    261 /* ---------------------------------------------------------------------------------------------- */
    262 /* CPU/FPU flags                                                                                  */
    263 /* ---------------------------------------------------------------------------------------------- */
    264 
    265 /**
    266  * Defines the `ZydisAccessedFlagsMask` data-type.
    267  */
    268 typedef ZyanU32 ZydisAccessedFlagsMask;
    269 
    270 /**
    271  * @defgroup decoder_cpu_flags CPU flags
    272  * @ingroup decoder
    273  *
    274  * Constants used for testing CPU flags accessed by an instruction.
    275  *
    276  * @{
    277  */
    278 
    279 /**
    280  * Carry flag.
    281  */
    282 #define ZYDIS_CPUFLAG_CF    (1ul <<  0)
    283 /**
    284  * Parity flag.
    285  */
    286 #define ZYDIS_CPUFLAG_PF    (1ul <<  2)
    287 /**
    288  * Adjust flag.
    289  */
    290 #define ZYDIS_CPUFLAG_AF    (1ul <<  4)
    291 /**
    292  * Zero flag.
    293  */
    294 #define ZYDIS_CPUFLAG_ZF    (1ul <<  6)
    295 /**
    296  * Sign flag.
    297  */
    298 #define ZYDIS_CPUFLAG_SF    (1ul <<  7)
    299 /**
    300  * Trap flag.
    301  */
    302 #define ZYDIS_CPUFLAG_TF    (1ul <<  8)
    303 /**
    304  * Interrupt enable flag.
    305  */
    306 #define ZYDIS_CPUFLAG_IF    (1ul <<  9)
    307 /**
    308  * Direction flag.
    309  */
    310 #define ZYDIS_CPUFLAG_DF    (1ul << 10)
    311 /**
    312  * Overflow flag.
    313  */
    314 #define ZYDIS_CPUFLAG_OF    (1ul << 11)
    315 /**
    316  * I/O privilege level flag.
    317  */
    318 #define ZYDIS_CPUFLAG_IOPL  (1ul << 12)
    319 /**
    320  * Nested task flag.
    321  */
    322 #define ZYDIS_CPUFLAG_NT    (1ul << 14)
    323 /**
    324  * Resume flag.
    325  */
    326 #define ZYDIS_CPUFLAG_RF    (1ul << 16)
    327 /**
    328  * Virtual 8086 mode flag.
    329  */
    330 #define ZYDIS_CPUFLAG_VM    (1ul << 17)
    331 /**
    332  * Alignment check.
    333  */
    334 #define ZYDIS_CPUFLAG_AC    (1ul << 18)
    335 /**
    336  * Virtual interrupt flag.
    337  */
    338 #define ZYDIS_CPUFLAG_VIF   (1ul << 19)
    339 /**
    340  * Virtual interrupt pending.
    341  */
    342 #define ZYDIS_CPUFLAG_VIP   (1ul << 20)
    343 /**
    344  * Able to use CPUID instruction.
    345  */
    346 #define ZYDIS_CPUFLAG_ID    (1ul << 21)
    347 
    348 /**
    349  * @}
    350  */
    351 
    352 /**
    353  * @defgroup decoder_fpu_flags FPU flags
    354  * @ingroup decoder
    355  *
    356  * Constants used for testing FPU flags accessed by an instruction.
    357  *
    358  * @{
    359  */
    360 
    361 /**
    362  * FPU condition-code flag 0.
    363  */
    364 #define ZYDIS_FPUFLAG_C0    (1ul <<  0)
    365 /**
    366  * FPU condition-code flag 1.
    367  */
    368 #define ZYDIS_FPUFLAG_C1    (1ul <<  1)
    369  /**
    370   * FPU condition-code flag 2.
    371   */
    372 #define ZYDIS_FPUFLAG_C2    (1ul <<  2)
    373 /**
    374  * FPU condition-code flag 3.
    375  */
    376 #define ZYDIS_FPUFLAG_C3    (1ul <<  3)
    377 
    378 /**
    379  * @}
    380  */
    381 
    382 /*
    383  * Information about CPU/FPU flags accessed by the instruction.
    384  */
    385 typedef struct ZydisAccessedFlags_
    386 {
    387     /*
    388      * As mask containing the flags `TESTED` by the instruction.
    389      */
    390     ZydisAccessedFlagsMask tested;
    391     /*
    392      * As mask containing the flags `MODIFIED` by the instruction.
    393      */
    394     ZydisAccessedFlagsMask modified;
    395     /*
    396      * As mask containing the flags `SET_0` by the instruction.
    397      */
    398     ZydisAccessedFlagsMask set_0;
    399     /*
    400      * As mask containing the flags `SET_1` by the instruction.
    401      */
    402     ZydisAccessedFlagsMask set_1;
    403     /*
    404      * As mask containing the flags `UNDEFINED` by the instruction.
    405      */
    406     ZydisAccessedFlagsMask undefined;
    407 } ZydisAccessedFlags;
    408 
    409 /* ---------------------------------------------------------------------------------------------- */
    410 /* Branch types                                                                                   */
    411 /* ---------------------------------------------------------------------------------------------- */
    412 
    413 /**
    414  * Defines the `ZydisBranchType` enum.
    415  */
    416 typedef enum ZydisBranchType_
    417 {
    418     /**
    419      * The instruction is not a branch instruction.
    420      */
    421     ZYDIS_BRANCH_TYPE_NONE,
    422     /**
    423      * The instruction is a short (8-bit) branch instruction.
    424      */
    425     ZYDIS_BRANCH_TYPE_SHORT,
    426     /**
    427      * The instruction is a near (16-bit or 32-bit) branch instruction.
    428      */
    429     ZYDIS_BRANCH_TYPE_NEAR,
    430     /**
    431      * The instruction is a far (inter-segment) branch instruction.
    432      */
    433     ZYDIS_BRANCH_TYPE_FAR,
    434 
    435     /**
    436      * Maximum value of this enum.
    437      */
    438     ZYDIS_BRANCH_TYPE_MAX_VALUE = ZYDIS_BRANCH_TYPE_FAR,
    439     /**
    440      * The minimum number of bits required to represent all values of this enum.
    441      */
    442     ZYDIS_BRANCH_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_BRANCH_TYPE_MAX_VALUE)
    443 } ZydisBranchType;
    444 
    445 /* ---------------------------------------------------------------------------------------------- */
    446 /* SSE/AVX exception-class                                                                        */
    447 /* ---------------------------------------------------------------------------------------------- */
    448 
    449 /**
    450  * Defines the `ZydisExceptionClass` enum.
    451  */
    452 typedef enum ZydisExceptionClass_
    453 {
    454     ZYDIS_EXCEPTION_CLASS_NONE,
    455     // TODO: FP Exceptions
    456     ZYDIS_EXCEPTION_CLASS_SSE1,
    457     ZYDIS_EXCEPTION_CLASS_SSE2,
    458     ZYDIS_EXCEPTION_CLASS_SSE3,
    459     ZYDIS_EXCEPTION_CLASS_SSE4,
    460     ZYDIS_EXCEPTION_CLASS_SSE5,
    461     ZYDIS_EXCEPTION_CLASS_SSE7,
    462     ZYDIS_EXCEPTION_CLASS_AVX1,
    463     ZYDIS_EXCEPTION_CLASS_AVX2,
    464     ZYDIS_EXCEPTION_CLASS_AVX3,
    465     ZYDIS_EXCEPTION_CLASS_AVX4,
    466     ZYDIS_EXCEPTION_CLASS_AVX5,
    467     ZYDIS_EXCEPTION_CLASS_AVX6,
    468     ZYDIS_EXCEPTION_CLASS_AVX7,
    469     ZYDIS_EXCEPTION_CLASS_AVX8,
    470     ZYDIS_EXCEPTION_CLASS_AVX11,
    471     ZYDIS_EXCEPTION_CLASS_AVX12,
    472     ZYDIS_EXCEPTION_CLASS_E1,
    473     ZYDIS_EXCEPTION_CLASS_E1NF,
    474     ZYDIS_EXCEPTION_CLASS_E2,
    475     ZYDIS_EXCEPTION_CLASS_E2NF,
    476     ZYDIS_EXCEPTION_CLASS_E3,
    477     ZYDIS_EXCEPTION_CLASS_E3NF,
    478     ZYDIS_EXCEPTION_CLASS_E4,
    479     ZYDIS_EXCEPTION_CLASS_E4NF,
    480     ZYDIS_EXCEPTION_CLASS_E5,
    481     ZYDIS_EXCEPTION_CLASS_E5NF,
    482     ZYDIS_EXCEPTION_CLASS_E6,
    483     ZYDIS_EXCEPTION_CLASS_E6NF,
    484     ZYDIS_EXCEPTION_CLASS_E7NM,
    485     ZYDIS_EXCEPTION_CLASS_E7NM128,
    486     ZYDIS_EXCEPTION_CLASS_E9NF,
    487     ZYDIS_EXCEPTION_CLASS_E10,
    488     ZYDIS_EXCEPTION_CLASS_E10NF,
    489     ZYDIS_EXCEPTION_CLASS_E11,
    490     ZYDIS_EXCEPTION_CLASS_E11NF,
    491     ZYDIS_EXCEPTION_CLASS_E12,
    492     ZYDIS_EXCEPTION_CLASS_E12NP,
    493     ZYDIS_EXCEPTION_CLASS_K20,
    494     ZYDIS_EXCEPTION_CLASS_K21,
    495     ZYDIS_EXCEPTION_CLASS_AMXE1,
    496     ZYDIS_EXCEPTION_CLASS_AMXE2,
    497     ZYDIS_EXCEPTION_CLASS_AMXE3,
    498     ZYDIS_EXCEPTION_CLASS_AMXE4,
    499     ZYDIS_EXCEPTION_CLASS_AMXE5,
    500     ZYDIS_EXCEPTION_CLASS_AMXE6,
    501 
    502     /**
    503      * Maximum value of this enum.
    504      */
    505     ZYDIS_EXCEPTION_CLASS_MAX_VALUE = ZYDIS_EXCEPTION_CLASS_AMXE6,
    506     /**
    507      * The minimum number of bits required to represent all values of this enum.
    508      */
    509     ZYDIS_EXCEPTION_CLASS_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_EXCEPTION_CLASS_MAX_VALUE)
    510 } ZydisExceptionClass;
    511 
    512 /* ---------------------------------------------------------------------------------------------- */
    513 /* AVX mask mode                                                                                  */
    514 /* ---------------------------------------------------------------------------------------------- */
    515 
    516 /**
    517  * Defines the `ZydisMaskMode` enum.
    518  */
    519 typedef enum ZydisMaskMode_
    520 {
    521     ZYDIS_MASK_MODE_INVALID,
    522     /**
    523      * Masking is disabled for the current instruction (`K0` register is used).
    524      */
    525     ZYDIS_MASK_MODE_DISABLED,
    526     /**
    527      * The embedded mask register is used as a merge-mask.
    528      */
    529     ZYDIS_MASK_MODE_MERGING,
    530     /**
    531      * The embedded mask register is used as a zero-mask.
    532      */
    533     ZYDIS_MASK_MODE_ZEROING,
    534     /**
    535      * The embedded mask register is used as a control-mask (element selector).
    536      */
    537     ZYDIS_MASK_MODE_CONTROL,
    538     /**
    539      * The embedded mask register is used as a zeroing control-mask (element selector).
    540      */
    541     ZYDIS_MASK_MODE_CONTROL_ZEROING,
    542 
    543     /**
    544      * Maximum value of this enum.
    545      */
    546     ZYDIS_MASK_MODE_MAX_VALUE = ZYDIS_MASK_MODE_CONTROL_ZEROING,
    547     /**
    548      * The minimum number of bits required to represent all values of this enum.
    549      */
    550     ZYDIS_MASK_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MASK_MODE_MAX_VALUE)
    551 } ZydisMaskMode;
    552 
    553 /* ---------------------------------------------------------------------------------------------- */
    554 /* AVX broadcast-mode                                                                             */
    555 /* ---------------------------------------------------------------------------------------------- */
    556 
    557 /**
    558  * Defines the `ZydisBroadcastMode` enum.
    559  */
    560 typedef enum ZydisBroadcastMode_
    561 {
    562     ZYDIS_BROADCAST_MODE_INVALID,
    563     ZYDIS_BROADCAST_MODE_1_TO_2,
    564     ZYDIS_BROADCAST_MODE_1_TO_4,
    565     ZYDIS_BROADCAST_MODE_1_TO_8,
    566     ZYDIS_BROADCAST_MODE_1_TO_16,
    567     ZYDIS_BROADCAST_MODE_1_TO_32,
    568     ZYDIS_BROADCAST_MODE_1_TO_64,
    569     ZYDIS_BROADCAST_MODE_2_TO_4,
    570     ZYDIS_BROADCAST_MODE_2_TO_8,
    571     ZYDIS_BROADCAST_MODE_2_TO_16,
    572     ZYDIS_BROADCAST_MODE_4_TO_8,
    573     ZYDIS_BROADCAST_MODE_4_TO_16,
    574     ZYDIS_BROADCAST_MODE_8_TO_16,
    575 
    576     /**
    577      * Maximum value of this enum.
    578      */
    579     ZYDIS_BROADCAST_MODE_MAX_VALUE = ZYDIS_BROADCAST_MODE_8_TO_16,
    580     /**
    581      * The minimum number of bits required to represent all values of this enum.
    582      */
    583     ZYDIS_BROADCAST_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_BROADCAST_MODE_MAX_VALUE)
    584 } ZydisBroadcastMode;
    585 
    586 /* ---------------------------------------------------------------------------------------------- */
    587 /* AVX rounding-mode                                                                              */
    588 /* ---------------------------------------------------------------------------------------------- */
    589 
    590 /**
    591  * Defines the `ZydisRoundingMode` enum.
    592  */
    593 typedef enum ZydisRoundingMode_
    594 {
    595     ZYDIS_ROUNDING_MODE_INVALID,
    596     /**
    597      * Round to nearest.
    598      */
    599     ZYDIS_ROUNDING_MODE_RN,
    600     /**
    601      * Round down.
    602      */
    603     ZYDIS_ROUNDING_MODE_RD,
    604     /**
    605      * Round up.
    606      */
    607     ZYDIS_ROUNDING_MODE_RU,
    608     /**
    609      * Round towards zero.
    610      */
    611     ZYDIS_ROUNDING_MODE_RZ,
    612 
    613     /**
    614      * Maximum value of this enum.
    615      */
    616     ZYDIS_ROUNDING_MODE_MAX_VALUE = ZYDIS_ROUNDING_MODE_RZ,
    617     /**
    618      * The minimum number of bits required to represent all values of this enum.
    619      */
    620     ZYDIS_ROUNDING_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_ROUNDING_MODE_MAX_VALUE)
    621 } ZydisRoundingMode;
    622 
    623 /* ---------------------------------------------------------------------------------------------- */
    624 /* KNC swizzle-mode                                                                               */
    625 /* ---------------------------------------------------------------------------------------------- */
    626 
    627 /**
    628  * Defines the `ZydisSwizzleMode` enum.
    629  */
    630 typedef enum ZydisSwizzleMode_
    631 {
    632     ZYDIS_SWIZZLE_MODE_INVALID,
    633     ZYDIS_SWIZZLE_MODE_DCBA,
    634     ZYDIS_SWIZZLE_MODE_CDAB,
    635     ZYDIS_SWIZZLE_MODE_BADC,
    636     ZYDIS_SWIZZLE_MODE_DACB,
    637     ZYDIS_SWIZZLE_MODE_AAAA,
    638     ZYDIS_SWIZZLE_MODE_BBBB,
    639     ZYDIS_SWIZZLE_MODE_CCCC,
    640     ZYDIS_SWIZZLE_MODE_DDDD,
    641 
    642     /**
    643      * Maximum value of this enum.
    644      */
    645     ZYDIS_SWIZZLE_MODE_MAX_VALUE = ZYDIS_SWIZZLE_MODE_DDDD,
    646     /**
    647      * The minimum number of bits required to represent all values of this enum.
    648      */
    649     ZYDIS_SWIZZLE_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_SWIZZLE_MODE_MAX_VALUE)
    650 } ZydisSwizzleMode;
    651 
    652 /* ---------------------------------------------------------------------------------------------- */
    653 /* KNC conversion-mode                                                                            */
    654 /* ---------------------------------------------------------------------------------------------- */
    655 
    656 /**
    657  * Defines the `ZydisConversionMode` enum.
    658  */
    659 typedef enum ZydisConversionMode_
    660 {
    661     ZYDIS_CONVERSION_MODE_INVALID,
    662     ZYDIS_CONVERSION_MODE_FLOAT16,
    663     ZYDIS_CONVERSION_MODE_SINT8,
    664     ZYDIS_CONVERSION_MODE_UINT8,
    665     ZYDIS_CONVERSION_MODE_SINT16,
    666     ZYDIS_CONVERSION_MODE_UINT16,
    667 
    668     /**
    669      * Maximum value of this enum.
    670      */
    671     ZYDIS_CONVERSION_MODE_MAX_VALUE = ZYDIS_CONVERSION_MODE_UINT16,
    672     /**
    673      * The minimum number of bits required to represent all values of this enum.
    674      */
    675     ZYDIS_CONVERSION_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_CONVERSION_MODE_MAX_VALUE)
    676 } ZydisConversionMode;
    677 
    678 /* ---------------------------------------------------------------------------------------------- */
    679 /* Legacy prefix type                                                                             */
    680 /* ---------------------------------------------------------------------------------------------- */
    681 
    682 /**
    683  * Defines the `ZydisPrefixType` enum.
    684  */
    685 typedef enum ZydisPrefixType_
    686 {
    687     /**
    688      * The prefix is ignored by the instruction.
    689      *
    690      * This applies to all prefixes that are not accepted by the instruction in general or the
    691      * ones that are overwritten by a prefix of the same group closer to the instruction opcode.
    692      */
    693     ZYDIS_PREFIX_TYPE_IGNORED,
    694     /**
    695      * The prefix is effectively used by the instruction.
    696      */
    697     ZYDIS_PREFIX_TYPE_EFFECTIVE,
    698     /**
    699      * The prefix is used as a mandatory prefix.
    700      *
    701      * A mandatory prefix is interpreted as an opcode extension and has no further effect on the
    702      * instruction.
    703      */
    704     ZYDIS_PREFIX_TYPE_MANDATORY,
    705 
    706     /**
    707      * Maximum value of this enum.
    708      */
    709     ZYDIS_PREFIX_TYPE_MAX_VALUE = ZYDIS_PREFIX_TYPE_MANDATORY,
    710     /**
    711      * The minimum number of bits required to represent all values of this enum.
    712      */
    713     ZYDIS_PREFIX_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_PREFIX_TYPE_MAX_VALUE)
    714 } ZydisPrefixType;
    715 
    716 // TODO: Check effective for 66/67 prefixes (currently defaults to EFFECTIVE)
    717 
    718 /* ---------------------------------------------------------------------------------------------- */
    719 /* Decoded instruction                                                                            */
    720 /* ---------------------------------------------------------------------------------------------- */
    721 
    722 /**
    723  * Detailed info about the `REX` prefix.
    724  */
    725 typedef struct ZydisDecodedInstructionRawRex_
    726 {
    727     /**
    728      * 64-bit operand-size promotion.
    729      */
    730     ZyanU8 W;
    731     /**
    732      * Extension of the `ModRM.reg` field.
    733      */
    734     ZyanU8 R;
    735     /**
    736      * Extension of the `SIB.index` field.
    737      */
    738     ZyanU8 X;
    739     /**
    740      * Extension of the `ModRM.rm`, `SIB.base`, or `opcode.reg` field.
    741      */
    742     ZyanU8 B;
    743     /**
    744      * The offset of the effective `REX` byte, relative to the beginning of the
    745      * instruction, in bytes.
    746      *
    747      * This offset always points to the "effective" `REX` prefix (the one closest to the
    748      * instruction opcode), if multiple `REX` prefixes are present.
    749      *
    750      * Note that the `REX` byte can be the first byte of the instruction, which would lead
    751      * to an offset of `0`. Please refer to the instruction attributes to check for the
    752      * presence of the `REX` prefix.
    753      */
    754     ZyanU8 offset;
    755 } ZydisDecodedInstructionRawRex;
    756 
    757 /**
    758  * Detailed info about the `XOP` prefix.
    759  */
    760 typedef struct ZydisDecodedInstructionRawXop_
    761 {
    762     /**
    763      * Extension of the `ModRM.reg` field (inverted).
    764      */
    765     ZyanU8 R;
    766     /**
    767      * Extension of the `SIB.index` field (inverted).
    768      */
    769     ZyanU8 X;
    770     /**
    771      * Extension of the `ModRM.rm`, `SIB.base`, or `opcode.reg` field (inverted).
    772      */
    773     ZyanU8 B;
    774     /**
    775      * Opcode-map specifier.
    776      */
    777     ZyanU8 m_mmmm;
    778     /**
    779      * 64-bit operand-size promotion or opcode-extension.
    780      */
    781     ZyanU8 W;
    782     /**
    783      * `NDS`/`NDD` (non-destructive-source/destination) register
    784      * specifier (inverted).
    785      */
    786     ZyanU8 vvvv;
    787     /**
    788      * Vector-length specifier.
    789      */
    790     ZyanU8 L;
    791     /**
    792      * Compressed legacy prefix.
    793      */
    794     ZyanU8 pp;
    795     /**
    796      * The offset of the first xop byte, relative to the beginning of
    797      * the instruction, in bytes.
    798      */
    799     ZyanU8 offset;
    800 } ZydisDecodedInstructionRawXop;
    801 
    802 /**
    803  * Detailed info about the `VEX` prefix.
    804  */
    805 typedef struct ZydisDecodedInstructionRawVex_
    806 {
    807     /**
    808      * Extension of the `ModRM.reg` field (inverted).
    809      */
    810     ZyanU8 R;
    811     /**
    812      * Extension of the `SIB.index` field (inverted).
    813      */
    814     ZyanU8 X;
    815     /**
    816      * Extension of the `ModRM.rm`, `SIB.base`, or `opcode.reg` field (inverted).
    817      */
    818     ZyanU8 B;
    819     /**
    820      * Opcode-map specifier.
    821      */
    822     ZyanU8 m_mmmm;
    823     /**
    824      * 64-bit operand-size promotion or opcode-extension.
    825      */
    826     ZyanU8 W;
    827     /**
    828      * `NDS`/`NDD` (non-destructive-source/destination) register specifier
    829      *  (inverted).
    830      */
    831     ZyanU8 vvvv;
    832     /**
    833      * Vector-length specifier.
    834      */
    835     ZyanU8 L;
    836     /**
    837      * Compressed legacy prefix.
    838      */
    839     ZyanU8 pp;
    840     /**
    841      * The offset of the first `VEX` byte, relative to the beginning of the instruction, in
    842      * bytes.
    843      */
    844     ZyanU8 offset;
    845     /**
    846      * The size of the `VEX` prefix, in bytes.
    847      */
    848     ZyanU8 size;
    849 } ZydisDecodedInstructionRawVex;
    850 
    851 /**
    852  * Detailed info about the `EVEX` prefix.
    853  */
    854 typedef struct ZydisDecodedInstructionRawEvex
    855 {
    856     /**
    857      * Extension of the `ModRM.reg` field (inverted).
    858      */
    859     ZyanU8 R;
    860     /**
    861      * Extension of the `SIB.index/vidx` field (inverted).
    862      */
    863     ZyanU8 X;
    864     /**
    865      * Extension of the `ModRM.rm` or `SIB.base` field (inverted).
    866      */
    867     ZyanU8 B;
    868     /**
    869      * High-16 register specifier modifier (inverted).
    870      */
    871     ZyanU8 R2;
    872     /**
    873      * Opcode-map specifier.
    874      */
    875     ZyanU8 mmm;
    876     /**
    877      * 64-bit operand-size promotion or opcode-extension.
    878      */
    879     ZyanU8 W;
    880     /**
    881      * `NDS`/`NDD` (non-destructive-source/destination) register specifier
    882      * (inverted).
    883      */
    884     ZyanU8 vvvv;
    885     /**
    886      * Compressed legacy prefix.
    887      */
    888     ZyanU8 pp;
    889     /**
    890      * Zeroing/Merging.
    891      */
    892     ZyanU8 z;
    893     /**
    894      * Vector-length specifier or rounding-control (most significant bit).
    895      */
    896     ZyanU8 L2;
    897     /**
    898      * Vector-length specifier or rounding-control (least significant bit).
    899      */
    900     ZyanU8 L;
    901     /**
    902      * Broadcast/RC/SAE context.
    903      */
    904     ZyanU8 b;
    905     /**
    906      * High-16 `NDS`/`VIDX` register specifier.
    907      */
    908     ZyanU8 V2;
    909     /**
    910      * Embedded opmask register specifier.
    911      */
    912     ZyanU8 aaa;
    913     /**
    914      * The offset of the first evex byte, relative to the beginning of the
    915      * instruction, in bytes.
    916      */
    917     ZyanU8 offset;
    918 } ZydisDecodedInstructionRawEvex;
    919 
    920 /**
    921  * Detailed info about the `MVEX` prefix.
    922  */
    923 typedef struct ZydisDecodedInstructionRawMvex_
    924 {
    925     /**
    926      * Extension of the `ModRM.reg` field (inverted).
    927      */
    928     ZyanU8 R;
    929     /**
    930      * Extension of the `SIB.index/vidx` field (inverted).
    931      */
    932     ZyanU8 X;
    933     /**
    934      * Extension of the `ModRM.rm` or `SIB.base` field (inverted).
    935      */
    936     ZyanU8 B;
    937     /**
    938      * High-16 register specifier modifier (inverted).
    939      */
    940     ZyanU8 R2;
    941     /**
    942      * Opcode-map specifier.
    943      */
    944     ZyanU8 mmmm;
    945     /**
    946      * 64-bit operand-size promotion or opcode-extension.
    947      */
    948     ZyanU8 W;
    949     /**
    950      * `NDS`/`NDD` (non-destructive-source/destination) register specifier
    951      *  (inverted).
    952      */
    953     ZyanU8 vvvv;
    954     /**
    955      * Compressed legacy prefix.
    956      */
    957     ZyanU8 pp;
    958     /**
    959      * Non-temporal/eviction hint.
    960      */
    961     ZyanU8 E;
    962     /**
    963      * Swizzle/broadcast/up-convert/down-convert/static-rounding controls.
    964      */
    965     ZyanU8 SSS;
    966     /**
    967      * High-16 `NDS`/`VIDX` register specifier.
    968      */
    969     ZyanU8 V2;
    970     /**
    971      * Embedded opmask register specifier.
    972      */
    973     ZyanU8 kkk;
    974     /**
    975      * The offset of the first mvex byte, relative to the beginning of the
    976      * instruction, in bytes.
    977      */
    978     ZyanU8 offset;
    979 } ZydisDecodedInstructionRawMvex;
    980 
    981 /**
    982  * Extended info for `AVX` instructions.
    983  */
    984 typedef struct ZydisDecodedInstructionAvx_
    985 {
    986     /**
    987      * The `AVX` vector-length.
    988      */
    989     ZyanU16 vector_length;
    990     /**
    991      * Info about the embedded writemask-register (`AVX-512` and `KNC` only).
    992      */
    993     struct ZydisDecodedInstructionAvxMask_
    994     {
    995         /**
    996          * The masking mode.
    997          */
    998         ZydisMaskMode mode;
    999         /**
   1000          * The mask register.
   1001          */
   1002         ZydisRegister reg;
   1003     } mask;
   1004     /**
   1005      * Contains info about the `AVX` broadcast.
   1006      */
   1007     struct ZydisDecodedInstructionAvxBroadcast_
   1008     {
   1009         /**
   1010          * Signals, if the broadcast is a static broadcast.
   1011          *
   1012          * This is the case for instructions with inbuilt broadcast functionality, which is
   1013          * always active and not controlled by the `EVEX/MVEX.RC` bits.
   1014          */
   1015         ZyanBool is_static;
   1016         /**
   1017          * The `AVX` broadcast-mode.
   1018          */
   1019         ZydisBroadcastMode mode;
   1020     } broadcast;
   1021     /**
   1022      * Contains info about the `AVX` rounding.
   1023      */
   1024     struct ZydisDecodedInstructionAvxRounding_
   1025     {
   1026         /**
   1027          * The `AVX` rounding-mode.
   1028          */
   1029         ZydisRoundingMode mode;
   1030     } rounding;
   1031     /**
   1032      * Contains info about the `AVX` register-swizzle (`KNC` only).
   1033      */
   1034     struct ZydisDecodedInstructionAvxSwizzle_
   1035     {
   1036         /**
   1037          * The `AVX` register-swizzle mode.
   1038          */
   1039         ZydisSwizzleMode mode;
   1040     } swizzle;
   1041     /**
   1042      * Contains info about the `AVX` data-conversion (`KNC` only).
   1043      */
   1044     struct ZydisDecodedInstructionAvxConversion_
   1045     {
   1046         /**
   1047          * The `AVX` data-conversion mode.
   1048          */
   1049         ZydisConversionMode mode;
   1050     } conversion;
   1051     /**
   1052      * Signals, if the `SAE` (suppress-all-exceptions) functionality is
   1053      * enabled for the instruction.
   1054      */
   1055     ZyanBool has_sae;
   1056     /**
   1057      * Signals, if the instruction has a memory-eviction-hint (`KNC` only).
   1058      */
   1059     ZyanBool has_eviction_hint;
   1060     // TODO: publish EVEX tuple-type and MVEX functionality
   1061 } ZydisDecodedInstructionAvx;
   1062 
   1063 /**
   1064  * Instruction meta info.
   1065  */
   1066 typedef struct ZydisDecodedInstructionMeta_
   1067 {
   1068     /**
   1069      * The instruction category.
   1070      */
   1071     ZydisInstructionCategory category;
   1072     /**
   1073      * The ISA-set.
   1074      */
   1075     ZydisISASet isa_set;
   1076     /**
   1077      * The ISA-set extension.
   1078      */
   1079     ZydisISAExt isa_ext;
   1080     /**
   1081      * The branch type.
   1082      */
   1083     ZydisBranchType branch_type;
   1084     /**
   1085      * The exception class.
   1086      */
   1087     ZydisExceptionClass exception_class;
   1088 } ZydisDecodedInstructionMeta;
   1089 
   1090 /**
   1091  * Detailed info about different instruction-parts like `ModRM`, `SIB` or
   1092  * encoding-prefixes.
   1093  */
   1094 typedef struct ZydisDecodedInstructionRaw_
   1095 {
   1096     /**
   1097      * The number of legacy prefixes.
   1098      */
   1099     ZyanU8 prefix_count;
   1100     /**
   1101      * Detailed info about the legacy prefixes (including `REX`).
   1102      */
   1103     struct ZydisDecodedInstructionRawPrefixes_
   1104     {
   1105         /**
   1106          * The prefix type.
   1107          */
   1108         ZydisPrefixType type;
   1109         /**
   1110          * The prefix byte.
   1111          */
   1112         ZyanU8 value;
   1113     } prefixes[ZYDIS_MAX_INSTRUCTION_LENGTH];
   1114 
   1115     /*
   1116      * Copy of the `encoding` field.
   1117      *
   1118      * This is here to allow the Rust bindings to treat the following union as an `enum`,
   1119      * sparing us a lot of unsafe code. Prefer using the regular `encoding` field in C/C++ code.
   1120      */
   1121     ZydisInstructionEncoding encoding2;
   1122     /*
   1123      * Union for things from various mutually exclusive encodings.
   1124      */
   1125     union
   1126     {
   1127         ZydisDecodedInstructionRawRex rex;
   1128         ZydisDecodedInstructionRawXop xop;
   1129         ZydisDecodedInstructionRawVex vex;
   1130         ZydisDecodedInstructionRawEvex evex;
   1131         ZydisDecodedInstructionRawMvex mvex;
   1132     };
   1133 
   1134     /**
   1135      * Detailed info about the `ModRM` byte.
   1136      */
   1137     struct ZydisDecodedInstructionModRm_
   1138     {
   1139         /**
   1140          * The addressing mode.
   1141          */
   1142         ZyanU8 mod;
   1143         /**
   1144          * Register specifier or opcode-extension.
   1145          */
   1146         ZyanU8 reg;
   1147         /**
   1148          * Register specifier or opcode-extension.
   1149          */
   1150         ZyanU8 rm;
   1151         /**
   1152          * The offset of the `ModRM` byte, relative to the beginning of the
   1153          * instruction, in bytes.
   1154          */
   1155         ZyanU8 offset;
   1156     } modrm;
   1157     /**
   1158      * Detailed info about the `SIB` byte.
   1159      */
   1160     struct ZydisDecodedInstructionRawSib_
   1161     {
   1162         /**
   1163          * The scale factor.
   1164          */
   1165         ZyanU8 scale;
   1166         /**
   1167          * The index-register specifier.
   1168          */
   1169         ZyanU8 index;
   1170         /**
   1171          * The base-register specifier.
   1172          */
   1173         ZyanU8 base;
   1174         /**
   1175          * The offset of the `SIB` byte, relative to the beginning of the
   1176          * instruction, in bytes.
   1177          */
   1178         ZyanU8 offset;
   1179     } sib;
   1180     /**
   1181      * Detailed info about displacement-bytes.
   1182      */
   1183     struct ZydisDecodedInstructionRawDisp_
   1184     {
   1185         /**
   1186          * The displacement value
   1187          */
   1188         ZyanI64 value;
   1189         /**
   1190          * The physical displacement size, in bits.
   1191          */
   1192         ZyanU8 size;
   1193         // TODO: publish cd8 scale
   1194         /**
   1195          * The offset of the displacement data, relative to the beginning of the
   1196          * instruction, in bytes.
   1197          */
   1198         ZyanU8 offset;
   1199     } disp;
   1200     /**
   1201      * Detailed info about immediate-bytes.
   1202      */
   1203     struct ZydisDecodedInstructionRawImm_
   1204     {
   1205         /**
   1206          * Signals, if the immediate value is signed.
   1207          */
   1208         ZyanBool is_signed;
   1209         /**
   1210          * Signals, if the immediate value contains a relative offset. You can use
   1211          * `ZydisCalcAbsoluteAddress` to determine the absolute address value.
   1212          */
   1213         ZyanBool is_relative;
   1214         /**
   1215          * The immediate value.
   1216          */
   1217         union ZydisDecodedInstructionRawImmValue_
   1218         {
   1219             ZyanU64 u;
   1220             ZyanI64 s;
   1221         } value;
   1222         /**
   1223          * The physical immediate size, in bits.
   1224          */
   1225         ZyanU8 size;
   1226         /**
   1227          * The offset of the immediate data, relative to the beginning of the
   1228          * instruction, in bytes.
   1229          */
   1230         ZyanU8 offset;
   1231     } imm[2];
   1232 } ZydisDecodedInstructionRaw;
   1233 
   1234 /**
   1235  * Information about a decoded instruction.
   1236  */
   1237 typedef struct ZydisDecodedInstruction_
   1238 {
   1239     /**
   1240      * The machine mode used to decode this instruction.
   1241      */
   1242     ZydisMachineMode machine_mode;
   1243     /**
   1244      * The instruction-mnemonic.
   1245      */
   1246     ZydisMnemonic mnemonic;
   1247     /**
   1248      * The length of the decoded instruction.
   1249      */
   1250     ZyanU8 length;
   1251     /**
   1252      * The instruction-encoding (`LEGACY`, `3DNOW`, `VEX`, `EVEX`, `XOP`).
   1253      */
   1254     ZydisInstructionEncoding encoding;
   1255     /**
   1256      * The opcode-map.
   1257      */
   1258     ZydisOpcodeMap opcode_map;
   1259     /**
   1260      * The instruction-opcode.
   1261      */
   1262     ZyanU8 opcode;
   1263     /**
   1264      * The stack width.
   1265      */
   1266     ZyanU8 stack_width;
   1267     /**
   1268      * The effective operand width.
   1269      */
   1270     ZyanU8 operand_width;
   1271     /**
   1272      * The effective address width.
   1273      */
   1274     ZyanU8 address_width;
   1275     /**
   1276      * The number of instruction-operands.
   1277      *
   1278      * Explicit and implicit operands are guaranteed to be in the front and ordered as they are
   1279      * printed by the formatter in `Intel` mode. No assumptions can be made about the order of
   1280      * hidden operands, except that they always located behind the explicit and implicit operands.
   1281      */
   1282     ZyanU8 operand_count;
   1283     /**
   1284      * The number of explicit (visible) instruction-operands.
   1285      *
   1286      * Explicit and implicit operands are guaranteed to be in the front and ordered as they are
   1287      * printed by the formatter in `Intel` mode.
   1288      */
   1289     ZyanU8 operand_count_visible;
   1290     /**
   1291      * See @ref instruction_attributes.
   1292      */
   1293     ZydisInstructionAttributes attributes;
   1294     /**
   1295      * Information about CPU flags accessed by the instruction.
   1296      *
   1297      * The bits in the masks correspond to the actual bits in the `FLAGS/EFLAGS/RFLAGS`
   1298      * register. See @ref decoder_cpu_flags.
   1299      */
   1300     const ZydisAccessedFlags* cpu_flags;
   1301     /**
   1302      * Information about FPU flags accessed by the instruction.
   1303      * 
   1304      * See @ref decoder_fpu_flags.
   1305      */
   1306     const ZydisAccessedFlags* fpu_flags;
   1307     /**
   1308      * Extended info for `AVX` instructions.
   1309      */
   1310     ZydisDecodedInstructionAvx avx;
   1311     /**
   1312      * Meta info.
   1313      */
   1314     ZydisDecodedInstructionMeta meta;
   1315     /**
   1316      * Detailed info about different instruction-parts like `ModRM`, `SIB` or
   1317      * encoding-prefixes.
   1318      */
   1319     ZydisDecodedInstructionRaw raw;
   1320 } ZydisDecodedInstruction;
   1321 
   1322 /* ---------------------------------------------------------------------------------------------- */
   1323 /* Decoder context                                                                                */
   1324 /* ---------------------------------------------------------------------------------------------- */
   1325 
   1326 /**
   1327  * The decoder context is used to preserve some internal state between subsequent decode
   1328  * operations for THE SAME instruction.
   1329  *
   1330  * The context is initialized by @c ZydisDecoderDecodeInstruction and required by e.g.
   1331  * @c ZydisDecoderDecodeOperands.
   1332  *
   1333  * All fields in this struct should be considered as "private". Any changes may lead to unexpected
   1334  * behavior.
   1335  *
   1336  * This struct is neither ABI nor API stable!
   1337  */
   1338 typedef struct ZydisDecoderContext_
   1339 {
   1340     /**
   1341      * A pointer to the internal instruction definition.
   1342      */
   1343     const void* definition;
   1344     /**
   1345      * Contains the effective operand-size index.
   1346      *
   1347      * 0 = 16 bit, 1 = 32 bit, 2 = 64 bit
   1348      */
   1349     ZyanU8 eosz_index;
   1350     /**
   1351      * Contains the effective address-size index.
   1352      *
   1353      * 0 = 16 bit, 1 = 32 bit, 2 = 64 bit
   1354      */
   1355     ZyanU8 easz_index;
   1356     /**
   1357      * Contains some cached REX/XOP/VEX/EVEX/MVEX values to provide uniform access.
   1358      */
   1359     struct
   1360     {
   1361         ZyanU8 W;
   1362         ZyanU8 R;
   1363         ZyanU8 X;
   1364         ZyanU8 B;
   1365         ZyanU8 L;
   1366         ZyanU8 LL;
   1367         ZyanU8 R2;
   1368         ZyanU8 V2;
   1369         ZyanU8 vvvv;
   1370         ZyanU8 mask;
   1371     } vector_unified;
   1372     /**
   1373      * Information about encoded operand registers.
   1374      */
   1375     struct
   1376     {
   1377         /**
   1378          * Signals if the `modrm.mod == 3` or `reg` form is forced for the instruction.
   1379          */
   1380         ZyanBool is_mod_reg;
   1381         /**
   1382          * The final register id for the `reg` encoded register.
   1383          */
   1384         ZyanU8 id_reg;
   1385         /**
   1386          * The final register id for the `rm` encoded register.
   1387          *
   1388          * This value is only set, if a register is encoded in `modrm.rm`.
   1389          */
   1390         ZyanU8 id_rm;
   1391         /**
   1392          * The final register id for the `ndsndd` (`.vvvv`) encoded register.
   1393          */
   1394         ZyanU8 id_ndsndd;
   1395         /**
   1396          * The final register id for the base register.
   1397          *
   1398          * This value is only set, if a memory operand is encoded in `modrm.rm`.
   1399          */
   1400         ZyanU8 id_base;
   1401         /**
   1402          * The final register id for the index register.
   1403          *
   1404          * This value is only set, if a memory operand is encoded in `modrm.rm` and the `SIB` byte
   1405          * is present.
   1406          */
   1407         ZyanU8 id_index;
   1408     } reg_info;
   1409     /**
   1410      * Internal EVEX-specific information.
   1411      */
   1412     struct
   1413     {
   1414         /**
   1415          * The EVEX tuple-type.
   1416          */
   1417         ZyanU8 tuple_type;
   1418         /**
   1419          * The EVEX element-size.
   1420          */
   1421         ZyanU8 element_size;
   1422     } evex;
   1423     /**
   1424      * Internal MVEX-specific information.
   1425      */
   1426     struct
   1427     {
   1428         /**
   1429          * The MVEX functionality.
   1430          */
   1431         ZyanU8 functionality;
   1432     } mvex;
   1433     /**
   1434      * The scale factor for EVEX/MVEX compressed 8-bit displacement values.
   1435      */
   1436     ZyanU8 cd8_scale; // TODO: Could make sense to expose this in the ZydisDecodedInstruction
   1437 } ZydisDecoderContext;
   1438 
   1439 /* ---------------------------------------------------------------------------------------------- */
   1440 
   1441 /* ============================================================================================== */
   1442 
   1443 #ifdef __cplusplus
   1444 }
   1445 #endif
   1446 
   1447 #endif /* ZYDIS_INSTRUCTIONINFO_H */