Bug Summary

File:root/firefox-clang/js/src/zydis/Zydis/DecoderTypes.h
Warning:line 199, column 16
Excessive padding in 'struct ZydisDecodedOperand_' (15 padding bytes, where 7 is optimal). Optimal fields order: , visibility, encoding, element_type, type, size, element_size, element_count, id, actions, attributes, consider reordering the fields or adding explicit padding members

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -O3 -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name ZydisAPI.cpp -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -analyzer-config-compatibility-mode=true -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=all -relaxed-aliasing -ffp-contract=off -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/root/firefox-clang/obj-x86_64-pc-linux-gnu/js/src/zydis -fcoverage-compilation-dir=/root/firefox-clang/obj-x86_64-pc-linux-gnu/js/src/zydis -resource-dir /usr/lib/llvm-23/lib/clang/23 -include /root/firefox-clang/config/gcc_hidden.h -include /root/firefox-clang/obj-x86_64-pc-linux-gnu/mozilla-config.h -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/stl_wrappers -D _GLIBCXX_ASSERTIONS=1 -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/system_wrappers -U _FORTIFY_SOURCE -D _FORTIFY_SOURCE=2 -D DEBUG=1 -D WASM_SUPPORTS_HUGE_MEMORY -D JS_CACHEIR_SPEW -D JS_STRUCTURED_SPEW -D JS_HAS_CTYPES -D FFI_BUILDING -D EXPORT_JS_API -D MOZ_HAS_MOZGLUE -D MOZ_SUPPORT_LEAKCHECKING -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/js/src -I /root/firefox-clang/js/src -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/include -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/include/nspr -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/include/nss -D MOZILLA_CLIENT -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/16/../../../../include/c++/16 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/16/../../../../include/x86_64-linux-gnu/c++/16 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/16/../../../../include/c++/16/backward -internal-isystem /usr/lib/llvm-23/lib/clang/23/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/16/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -Wno-error=pessimizing-move -Wno-error=large-by-value-copy=128 -Wno-error=implicit-int-float-conversion -Wno-error=thread-safety-analysis -Wno-error=tautological-type-limit-compare -Wno-invalid-offsetof -Wno-range-loop-analysis -Wno-deprecated-anon-enum-enum-conversion -Wno-deprecated-enum-enum-conversion -Wno-inline-new-delete -Wno-error=deprecated-declarations -Wno-error=array-bounds -Wno-error=free-nonheap-object -Wno-error=atomic-alignment -Wno-error=deprecated-builtins -Wno-psabi -Wno-error=builtin-macro-redefined -Wno-vla-cxx-extension -Wno-unknown-warning-option -Wno-character-conversion -std=gnu++20 -fdeprecated-macro -ferror-limit 19 -fstrict-flex-arrays=1 -stack-protector 2 -fstack-clash-protection -ftrivial-auto-var-init=pattern -fno-rtti -fgnuc-version=4.2.1 -fno-implicit-modules -fskip-odr-check-in-gmf -fno-sized-deallocation -fno-aligned-allocation -fdiagnostics-absolute-paths -vectorize-loops -vectorize-slp -analyzer-checker optin.performance.Padding -analyzer-output=html -analyzer-config stable-report-filename=true -mllvm -dwarf-linkage-names=Abstract -faddrsig -fdwarf2-cfi-asm -o /tmp/scan-build-2026-09-01-224014-2642839-1 -x c++ /root/firefox-clang/js/src/zydis/ZydisAPI.cpp
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 "zydis/Zycore/Types.h"
36#include "zydis/Zydis/MetaInfo.h"
37#include "zydis/Zydis/Mnemonic.h"
38#include "zydis/Zydis/Register.h"
39#include "zydis/Zydis/SharedTypes.h"
40
41#ifdef __cplusplus202002L
42extern "C" {
43#endif
44
45/* ============================================================================================== */
46/* Decoded operand */
47/* ============================================================================================== */
48
49/* ---------------------------------------------------------------------------------------------- */
50/* Operand attributes */
51/* ---------------------------------------------------------------------------------------------- */
52
53/**
54 * Defines the `ZydisOperandAttributes` data-type.
55 */
56typedef 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_MULTISOURCE40x01 0x01 // (1 << 0)
67
68/* ---------------------------------------------------------------------------------------------- */
69/* Memory type */
70/* ---------------------------------------------------------------------------------------------- */
71
72/**
73 * Defines the `ZydisMemoryOperandType` enum.
74 */
75typedef 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)( (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE) >> (0))
> 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE) >>
(1)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE)
>> (2)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (3)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (4)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (5)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (6)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (7)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (8)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (9)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (10)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (11)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (12)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (13)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (14)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (15)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (16)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (17)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (18)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (19)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (20)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (21)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (22)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (23)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (24)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (25)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (26)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (27)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (28)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (29)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (30)) > 0) + (((unsigned long)(ZYDIS_MEMOP_TYPE_MAX_VALUE
) >> (31)) > 0) )
105} ZydisMemoryOperandType;
106
107/* ---------------------------------------------------------------------------------------------- */
108/* Decoded operand */
109/* ---------------------------------------------------------------------------------------------- */
110
111/**
112 * Extended info for register-operands.
113 */
114typedef struct ZydisDecodedOperandReg_
115{
116 /**
117 * The register value.
118 */
119 ZydisRegister value;
120} ZydisDecodedOperandReg;
121
122/**
123 * Extended info for memory-operands.
124 */
125typedef 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 */
166typedef struct ZydisDecodedOperandPtr_
167{
168 ZyanU16 segment;
169 ZyanU32 offset;
170} ZydisDecodedOperandPtr;
171
172/**
173 * Extended info for immediate-operands.
174 */
175typedef 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 */
199typedef struct ZydisDecodedOperand_
Excessive padding in 'struct ZydisDecodedOperand_' (15 padding bytes, where 7 is optimal). Optimal fields order: , visibility, encoding, element_type, type, size, element_size, element_count, id, actions, attributes, consider reordering the fields or adding explicit padding members
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 */
268typedef 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) (1ul << 0)
283/**
284 * Parity flag.
285 */
286#define ZYDIS_CPUFLAG_PF(1ul << 2) (1ul << 2)
287/**
288 * Adjust flag.
289 */
290#define ZYDIS_CPUFLAG_AF(1ul << 4) (1ul << 4)
291/**
292 * Zero flag.
293 */
294#define ZYDIS_CPUFLAG_ZF(1ul << 6) (1ul << 6)
295/**
296 * Sign flag.
297 */
298#define ZYDIS_CPUFLAG_SF(1ul << 7) (1ul << 7)
299/**
300 * Trap flag.
301 */
302#define ZYDIS_CPUFLAG_TF(1ul << 8) (1ul << 8)
303/**
304 * Interrupt enable flag.
305 */
306#define ZYDIS_CPUFLAG_IF(1ul << 9) (1ul << 9)
307/**
308 * Direction flag.
309 */
310#define ZYDIS_CPUFLAG_DF(1ul << 10) (1ul << 10)
311/**
312 * Overflow flag.
313 */
314#define ZYDIS_CPUFLAG_OF(1ul << 11) (1ul << 11)
315/**
316 * I/O privilege level flag.
317 */
318#define ZYDIS_CPUFLAG_IOPL(1ul << 12) (1ul << 12)
319/**
320 * Nested task flag.
321 */
322#define ZYDIS_CPUFLAG_NT(1ul << 14) (1ul << 14)
323/**
324 * Resume flag.
325 */
326#define ZYDIS_CPUFLAG_RF(1ul << 16) (1ul << 16)
327/**
328 * Virtual 8086 mode flag.
329 */
330#define ZYDIS_CPUFLAG_VM(1ul << 17) (1ul << 17)
331/**
332 * Alignment check.
333 */
334#define ZYDIS_CPUFLAG_AC(1ul << 18) (1ul << 18)
335/**
336 * Virtual interrupt flag.
337 */
338#define ZYDIS_CPUFLAG_VIF(1ul << 19) (1ul << 19)
339/**
340 * Virtual interrupt pending.
341 */
342#define ZYDIS_CPUFLAG_VIP(1ul << 20) (1ul << 20)
343/**
344 * Able to use CPUID instruction.
345 */
346#define ZYDIS_CPUFLAG_ID(1ul << 21) (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) (1ul << 0)
365/**
366 * FPU condition-code flag 1.
367 */
368#define ZYDIS_FPUFLAG_C1(1ul << 1) (1ul << 1)
369 /**
370 * FPU condition-code flag 2.
371 */
372#define ZYDIS_FPUFLAG_C2(1ul << 2) (1ul << 2)
373/**
374 * FPU condition-code flag 3.
375 */
376#define ZYDIS_FPUFLAG_C3(1ul << 3) (1ul << 3)
377
378/**
379 * @}
380 */
381
382/*
383 * Information about CPU/FPU flags accessed by the instruction.
384 */
385typedef 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 */
416typedef 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)( (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE) >> (0)
) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE) >>
(1)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (2)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (3)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (4)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (5)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (6)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (7)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (8)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (9)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (10)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (11)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (12)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (13)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (14)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (15)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (16)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (17)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (18)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (19)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (20)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (21)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (22)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (23)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (24)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (25)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (26)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (27)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (28)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (29)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (30)) > 0) + (((unsigned long)(ZYDIS_BRANCH_TYPE_MAX_VALUE
) >> (31)) > 0) )
443} ZydisBranchType;
444
445/* ---------------------------------------------------------------------------------------------- */
446/* SSE/AVX exception-class */
447/* ---------------------------------------------------------------------------------------------- */
448
449/**
450 * Defines the `ZydisExceptionClass` enum.
451 */
452typedef 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)( (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE) >>
(0)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (1)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (2)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (3)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (4)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (5)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (6)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (7)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (8)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (9)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (10)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (11)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (12)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (13)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (14)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (15)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (16)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (17)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (18)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (19)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (20)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (21)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (22)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (23)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (24)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (25)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (26)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (27)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (28)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (29)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (30)) > 0) + (((unsigned long)(ZYDIS_EXCEPTION_CLASS_MAX_VALUE
) >> (31)) > 0) )
510} ZydisExceptionClass;
511
512/* ---------------------------------------------------------------------------------------------- */
513/* AVX mask mode */
514/* ---------------------------------------------------------------------------------------------- */
515
516/**
517 * Defines the `ZydisMaskMode` enum.
518 */
519typedef 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)( (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE) >> (0)) >
0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE) >> (
1)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE) >>
(2)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE) >>
(3)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE) >>
(4)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE) >>
(5)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE) >>
(6)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE) >>
(7)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE) >>
(8)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE) >>
(9)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE) >>
(10)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE)
>> (11)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE
) >> (12)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE
) >> (13)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE
) >> (14)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE
) >> (15)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE
) >> (16)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE
) >> (17)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE
) >> (18)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE
) >> (19)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE
) >> (20)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE
) >> (21)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE
) >> (22)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE
) >> (23)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE
) >> (24)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE
) >> (25)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE
) >> (26)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE
) >> (27)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE
) >> (28)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE
) >> (29)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE
) >> (30)) > 0) + (((unsigned long)(ZYDIS_MASK_MODE_MAX_VALUE
) >> (31)) > 0) )
551} ZydisMaskMode;
552
553/* ---------------------------------------------------------------------------------------------- */
554/* AVX broadcast-mode */
555/* ---------------------------------------------------------------------------------------------- */
556
557/**
558 * Defines the `ZydisBroadcastMode` enum.
559 */
560typedef 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)( (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE) >> (
0)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (1)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (2)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (3)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (4)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (5)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (6)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (7)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (8)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (9)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (10)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (11)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (12)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (13)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (14)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (15)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (16)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (17)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (18)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (19)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (20)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (21)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (22)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (23)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (24)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (25)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (26)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (27)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (28)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (29)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (30)) > 0) + (((unsigned long)(ZYDIS_BROADCAST_MODE_MAX_VALUE
) >> (31)) > 0) )
584} ZydisBroadcastMode;
585
586/* ---------------------------------------------------------------------------------------------- */
587/* AVX rounding-mode */
588/* ---------------------------------------------------------------------------------------------- */
589
590/**
591 * Defines the `ZydisRoundingMode` enum.
592 */
593typedef 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)( (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE) >> (
0)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (1)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (2)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (3)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (4)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (5)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (6)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (7)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (8)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (9)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (10)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (11)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (12)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (13)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (14)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (15)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (16)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (17)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (18)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (19)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (20)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (21)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (22)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (23)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (24)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (25)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (26)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (27)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (28)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (29)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (30)) > 0) + (((unsigned long)(ZYDIS_ROUNDING_MODE_MAX_VALUE
) >> (31)) > 0) )
621} ZydisRoundingMode;
622
623/* ---------------------------------------------------------------------------------------------- */
624/* KNC swizzle-mode */
625/* ---------------------------------------------------------------------------------------------- */
626
627/**
628 * Defines the `ZydisSwizzleMode` enum.
629 */
630typedef 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)( (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE) >> (0
)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE) >>
(1)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (2)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (3)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (4)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (5)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (6)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (7)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (8)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (9)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (10)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (11)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (12)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (13)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (14)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (15)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (16)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (17)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (18)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (19)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (20)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (21)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (22)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (23)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (24)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (25)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (26)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (27)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (28)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (29)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (30)) > 0) + (((unsigned long)(ZYDIS_SWIZZLE_MODE_MAX_VALUE
) >> (31)) > 0) )
650} ZydisSwizzleMode;
651
652/* ---------------------------------------------------------------------------------------------- */
653/* KNC conversion-mode */
654/* ---------------------------------------------------------------------------------------------- */
655
656/**
657 * Defines the `ZydisConversionMode` enum.
658 */
659typedef 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)( (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE) >>
(0)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (1)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (2)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (3)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (4)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (5)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (6)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (7)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (8)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (9)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (10)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (11)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (12)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (13)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (14)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (15)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (16)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (17)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (18)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (19)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (20)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (21)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (22)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (23)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (24)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (25)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (26)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (27)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (28)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (29)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (30)) > 0) + (((unsigned long)(ZYDIS_CONVERSION_MODE_MAX_VALUE
) >> (31)) > 0) )
676} ZydisConversionMode;
677
678/* ---------------------------------------------------------------------------------------------- */
679/* Legacy prefix type */
680/* ---------------------------------------------------------------------------------------------- */
681
682/**
683 * Defines the `ZydisPrefixType` enum.
684 */
685typedef 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)( (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE) >> (0)
) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE) >>
(1)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (2)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (3)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (4)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (5)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (6)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (7)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (8)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (9)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (10)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (11)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (12)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (13)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (14)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (15)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (16)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (17)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (18)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (19)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (20)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (21)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (22)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (23)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (24)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (25)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (26)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (27)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (28)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (29)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (30)) > 0) + (((unsigned long)(ZYDIS_PREFIX_TYPE_MAX_VALUE
) >> (31)) > 0) )
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 */
725typedef 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 */
760typedef 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 */
805typedef 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 */
854typedef 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 */
923typedef 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 */
984typedef 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 */
1066typedef 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 */
1094typedef 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_LENGTH15];
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 */
1237typedef 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 */
1338typedef 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 __cplusplus202002L
1444}
1445#endif
1446
1447#endif /* ZYDIS_INSTRUCTIONINFO_H */