26#ifndef FCML_INT_COMMON_H_
27#define FCML_INT_COMMON_H_
35#define FCML_OPERANDS_COUNT 5
37#define FCML_INSTRUCTION_SIZE 15
39#define FCML_OPCODES_NUM 3
48#define FCML_PREFIX_LOCK 0x0001
50#define FCML_PREFIX_REPNE 0x0002
52#define FCML_PREFIX_REPNZ FCML_PREFIX_REPNE
54#define FCML_PREFIX_REP 0x0004
56#define FCML_PREFIX_REPE FCML_PREFIX_REP
58#define FCML_PREFIX_REPZ FCML_PREFIX_REP
60#define FCML_PREFIX_XACQUIRE 0x0008
62#define FCML_PREFIX_XRELEASE 0x0010
64#define FCML_PREFIX_BRANCH_HINT 0x0020
66#define FCML_PREFIX_NOBRANCH_HINT 0x0040
108#define FCML_REG_EAX 0
109#define FCML_REG_RAX 0
110#define FCML_REG_MM0 0
111#define FCML_REG_XMM0 0
112#define FCML_REG_YMM0 0
113#define FCML_REG_ZMM0 0
117#define FCML_REG_ECX 1
118#define FCML_REG_RCX 1
119#define FCML_REG_MM1 1
120#define FCML_REG_XMM1 1
121#define FCML_REG_YMM1 1
122#define FCML_REG_ZMM1 1
126#define FCML_REG_EDX 2
127#define FCML_REG_RDX 2
128#define FCML_REG_MM2 2
129#define FCML_REG_XMM2 2
130#define FCML_REG_YMM2 2
131#define FCML_REG_ZMM2 2
135#define FCML_REG_EBX 3
136#define FCML_REG_RBX 3
137#define FCML_REG_MM3 3
138#define FCML_REG_XMM3 3
139#define FCML_REG_YMM3 3
140#define FCML_REG_ZMM3 3
144#define FCML_REG_SPL 4
145#define FCML_REG_ESP 4
146#define FCML_REG_RSP 4
147#define FCML_REG_MM4 4
148#define FCML_REG_XMM4 4
149#define FCML_REG_YMM4 4
150#define FCML_REG_ZMM4 4
154#define FCML_REG_BPL 5
155#define FCML_REG_EBP 5
156#define FCML_REG_RBP 5
157#define FCML_REG_MM5 5
158#define FCML_REG_XMM5 5
159#define FCML_REG_YMM5 5
160#define FCML_REG_ZMM5 5
164#define FCML_REG_SIL 6
165#define FCML_REG_ESI 6
166#define FCML_REG_RSI 6
167#define FCML_REG_MM6 6
168#define FCML_REG_XMM6 6
169#define FCML_REG_YMM6 6
170#define FCML_REG_ZMM6 6
174#define FCML_REG_DIL 7
175#define FCML_REG_EDI 7
176#define FCML_REG_RDI 7
177#define FCML_REG_MM7 7
178#define FCML_REG_XMM7 7
179#define FCML_REG_YMM7 7
180#define FCML_REG_ZMM7 7
182#define FCML_REG_R8L 8
183#define FCML_REG_R8W 8
184#define FCML_REG_R8D 8
186#define FCML_REG_XMM8 8
187#define FCML_REG_YMM8 8
188#define FCML_REG_ZMM8 8
190#define FCML_REG_R9L 9
191#define FCML_REG_R9W 9
192#define FCML_REG_R9D 9
194#define FCML_REG_XMM9 9
195#define FCML_REG_YMM9 9
196#define FCML_REG_ZMM9 9
198#define FCML_REG_R10L 10
199#define FCML_REG_R10W 10
200#define FCML_REG_R10D 10
201#define FCML_REG_R10 10
202#define FCML_REG_XMM10 10
203#define FCML_REG_YMM10 10
204#define FCML_REG_ZMM10 10
206#define FCML_REG_R11L 11
207#define FCML_REG_R11W 11
208#define FCML_REG_R11D 11
209#define FCML_REG_R11 11
210#define FCML_REG_XMM11 11
211#define FCML_REG_YMM11 11
212#define FCML_REG_ZMM11 11
214#define FCML_REG_R12L 12
215#define FCML_REG_R12W 12
216#define FCML_REG_R12D 12
217#define FCML_REG_R12 12
218#define FCML_REG_XMM12 12
219#define FCML_REG_YMM12 12
220#define FCML_REG_ZMM12 12
222#define FCML_REG_R13L 13
223#define FCML_REG_R13W 13
224#define FCML_REG_R13D 13
225#define FCML_REG_R13 13
226#define FCML_REG_XMM13 13
227#define FCML_REG_YMM13 13
228#define FCML_REG_ZMM13 13
230#define FCML_REG_R14L 14
231#define FCML_REG_R14W 14
232#define FCML_REG_R14D 14
233#define FCML_REG_R14 14
234#define FCML_REG_XMM14 14
235#define FCML_REG_YMM14 14
236#define FCML_REG_ZMM14 14
238#define FCML_REG_R15L 15
239#define FCML_REG_R15W 15
240#define FCML_REG_R15D 15
241#define FCML_REG_R15 15
242#define FCML_REG_XMM15 15
243#define FCML_REG_YMM15 15
244#define FCML_REG_ZMM15 15
246#define FCML_REG_XMM16 16
247#define FCML_REG_YMM16 16
248#define FCML_REG_ZMM16 16
250#define FCML_REG_XMM17 17
251#define FCML_REG_YMM17 17
252#define FCML_REG_ZMM17 17
254#define FCML_REG_XMM18 18
255#define FCML_REG_YMM18 18
256#define FCML_REG_ZMM18 18
258#define FCML_REG_XMM19 19
259#define FCML_REG_YMM19 19
260#define FCML_REG_ZMM19 19
262#define FCML_REG_XMM20 20
263#define FCML_REG_YMM20 20
264#define FCML_REG_ZMM20 20
266#define FCML_REG_XMM21 21
267#define FCML_REG_YMM21 21
268#define FCML_REG_ZMM21 21
270#define FCML_REG_XMM22 22
271#define FCML_REG_YMM22 22
272#define FCML_REG_ZMM22 22
274#define FCML_REG_XMM23 23
275#define FCML_REG_YMM23 23
276#define FCML_REG_ZMM23 23
278#define FCML_REG_XMM24 24
279#define FCML_REG_YMM24 24
280#define FCML_REG_ZMM24 24
282#define FCML_REG_XMM25 25
283#define FCML_REG_YMM25 25
284#define FCML_REG_ZMM25 25
286#define FCML_REG_XMM26 26
287#define FCML_REG_YMM26 26
288#define FCML_REG_ZMM26 26
290#define FCML_REG_XMM27 27
291#define FCML_REG_YMM27 27
292#define FCML_REG_ZMM27 27
294#define FCML_REG_XMM28 28
295#define FCML_REG_YMM28 28
296#define FCML_REG_ZMM28 28
298#define FCML_REG_XMM29 29
299#define FCML_REG_YMM29 29
300#define FCML_REG_ZMM29 29
302#define FCML_REG_XMM30 30
303#define FCML_REG_YMM30 30
304#define FCML_REG_ZMM30 30
306#define FCML_REG_XMM31 31
307#define FCML_REG_YMM31 31
308#define FCML_REG_ZMM31 31
321#define FCML_REG_ST0 0
322#define FCML_REG_ST1 1
323#define FCML_REG_ST2 2
324#define FCML_REG_ST3 3
325#define FCML_REG_ST4 4
326#define FCML_REG_ST5 5
327#define FCML_REG_ST6 6
328#define FCML_REG_ST7 7
332#define FCML_REG_CR0 0
333#define FCML_REG_CR2 2
334#define FCML_REG_CR3 3
335#define FCML_REG_CR4 4
336#define FCML_REG_CR8 8
340#define FCML_REG_DR0 0
341#define FCML_REG_DR1 1
342#define FCML_REG_DR2 2
343#define FCML_REG_DR3 3
344#define FCML_REG_DR4 4
345#define FCML_REG_DR5 5
346#define FCML_REG_DR6 6
347#define FCML_REG_DR7 7
367#define FCML_DS_UNDEF 0
372#define FCML_DS_128 128
373#define FCML_DS_256 256
374#define FCML_DS_512 512
380#define FCML_OS_UNDEFINED 0
381#define FCML_OS_BYTE 8
382#define FCML_OS_WORD 16
383#define FCML_OS_DWORD 32
384#define FCML_OS_FWORD 48
385#define FCML_OS_QWORD 64
386#define FCML_OS_MWORD 64
387#define FCML_OS_TBYTE 80
388#define FCML_OS_OWORD 128
389#define FCML_OS_XWORD 128
390#define FCML_OS_YWORD 256
391#define FCML_OS_ZWORD 512
396#define FCML_TT_NONE 0
408#define FCML_TT_QVM 10
409#define FCML_TT_OVM 11
410#define FCML_TT_M128 12
411#define FCML_TT_DUP 13
412#define FCML_TT_T1x4 14
416#define FCML_ER_RN_SAE 0
417#define FCML_ER_RD_SAE 1
418#define FCML_ER_RU_SAE 2
419#define FCML_ER_RZ_SAE 3
466#define FCML_NUMBER_OF_CONDITIONS 8
499 fcml_bool is_negation;
513#define FCML_EN_ASF_ANY 0x00
514#define FCML_EN_ASF_16 0x01
515#define FCML_EN_ASF_32 0x02
516#define FCML_EN_ASF_64 0x04
517#define FCML_EN_ASF_ALL FCML_EN_ASF_16 | FCML_EN_ASF_32 | FCML_EN_ASF_64
646 FCML_ERC_RNE, FCML_ERC_RD, FCML_ERC_RU, FCML_ERC_RZ
fcml_int64_t fcml_ip
General instruction pointer holder.
Definition fcml_common.h:96
fcml_en_condition_type
Condition type.
Definition fcml_common.h:473
@ FCML_CONDITION_LE
7 Less than or equal to
Definition fcml_common.h:489
@ FCML_CONDITION_L
6 Less than
Definition fcml_common.h:487
@ FCML_CONDITION_BE
3 Below or equal
Definition fcml_common.h:481
@ FCML_CONDITION_O
0 Overflow
Definition fcml_common.h:475
@ FCML_CONDITION_P
5 Parity
Definition fcml_common.h:485
@ FCML_CONDITION_E
2 Equal
Definition fcml_common.h:479
@ FCML_CONDITION_B
1 Below
Definition fcml_common.h:477
@ FCML_CONDITION_S
4 Sign
Definition fcml_common.h:483
fcml_en_register
Register type.
Definition fcml_common.h:426
@ FCML_REG_FPU
FPU register.
Definition fcml_common.h:434
@ FCML_REG_CR
Control register.
Definition fcml_common.h:438
@ FCML_REG_SIMD
SIMD (SSE, MMX) register.
Definition fcml_common.h:432
@ FCML_REG_OPMASK
Operand mask register.
Definition fcml_common.h:444
@ FCML_REG_DR
Debug register.
Definition fcml_common.h:440
@ FCML_REG_GPR
General purpose register.
Definition fcml_common.h:430
@ FCML_REG_UNDEFINED
Undefined register type.
Definition fcml_common.h:428
@ FCML_REG_SEG
Segment register.
Definition fcml_common.h:436
@ FCML_REG_IP
Instruction pointer register.
Definition fcml_common.h:442
enum fcml_en_address_form fcml_en_effective_address_form
Memory addressing using ModR/M field
fcml_uint16_t fcml_prefixes
Type for explicit instruction prefixes bit mask.
Definition fcml_common.h:91
fcml_en_address_form
Memory addressing using ModR/M field
Definition fcml_common.h:572
@ FCML_AF_UNDEFINED
Default value set if memory addressing hasn't been configured.
Definition fcml_common.h:574
@ FCML_AF_COMBINED
Effective address combined from address components like base register, index registers,...
Definition fcml_common.h:579
@ FCML_AF_OFFSET
Absolute offset (address).
Definition fcml_common.h:576
fcml_uint16_t fcml_hints
Type used for storing instruction and operand hint masks.
Definition fcml_common.h:86
fcml_en_operand_type
Supported operand types.
Definition fcml_common.h:669
@ FCML_OT_REGISTER
Processor register.
Definition fcml_common.h:679
@ FCML_OT_NONE
Operand not used.
Definition fcml_common.h:671
@ FCML_OT_IMMEDIATE
Immediate integer value.
Definition fcml_common.h:673
@ FCML_OT_FAR_POINTER
Direct far pointer.
Definition fcml_common.h:675
@ FCML_OT_ADDRESS
Memory address.
Definition fcml_common.h:677
@ FCML_OT_VIRTUAL
Not an operand in a strict sense, only a container for attributes.
Definition fcml_common.h:684
fcml_en_operating_mode
Supported processor operating modes.
Definition fcml_common.h:73
@ FCML_OM_16_BIT
Real-addressing mode, virtual 8086 mode.
Definition fcml_common.h:75
@ FCML_OM_32_BIT
Protected/Compatibility mode when 'D' segment descriptor flag is set to 1.
Definition fcml_common.h:78
@ FCML_OM_64_BIT
64-bit mode.
Definition fcml_common.h:80
fcml_en_instruction_hints
Instruction level hints.
Definition fcml_common.h:758
@ FCML_HINT_NO_HINTS
No hints defined.
Definition fcml_common.h:760
@ FCML_HINT_FAR_POINTER
Hints instruction to use FAR pointer to address the memory.
Definition fcml_common.h:762
@ FCML_HINT_DIRECT_POINTER
Hints instruction to use DIRECT memory addressing.
Definition fcml_common.h:771
@ FCML_HINT_NEAR_POINTER
Hints instruction to use NEAR pointer to address the memory.
Definition fcml_common.h:764
@ FCML_HINT_LONG_FORM_POINTER
This hint is used only by assembler in order to force it to generate three byte VEX/XOP prefix even i...
Definition fcml_common.h:767
@ FCML_HINT_INDIRECT_POINTER
Hints instruction to use INDIRECT pointer to address the memory.
Definition fcml_common.h:769
#define FCML_OPERANDS_COUNT
Maximal number of the instruction operands.
Definition fcml_common.h:35
fcml_en_access_mode
Operand access mode.
Definition fcml_common.h:538
@ FCML_AM_WRITE
Operand is set by instruction.
Definition fcml_common.h:544
@ FCML_AM_READ_WRITE
Operand is read but can be also set.
Definition fcml_common.h:546
@ FCML_AM_ACCESS_MODE_UNDEFINED
Undefined mode.
Definition fcml_common.h:540
@ FCML_AM_READ
Operand is read by instruction.
Definition fcml_common.h:542
fcml_en_operand_hints
Operand hints.
Definition fcml_common.h:691
@ FCML_OP_HINT_MULTIMEDIA_INSTRUCTION
SIMD operand.
Definition fcml_common.h:701
@ FCML_OP_HINT_SIB_ENCODING
Encode ModR/M with optional SIB byte if possible.
Definition fcml_common.h:725
@ FCML_OP_HINT_DISPLACEMENT_RELATIVE_ADDRESS
Relative address.
Definition fcml_common.h:706
@ FCML_OP_HINT_PSEUDO_OPCODE
Pseudo opcode.
Definition fcml_common.h:713
@ FCML_OP_HINT_ABSOLUTE_ADDRESSING
Offset should be encoded as absolute address.
Definition fcml_common.h:717
@ FCML_OP_HINT_RELATIVE_ADDRESSING
Offset should be encoded as relative address.
Definition fcml_common.h:721
@ FCML_OP_HINT_UNDEFIEND
Undefined.
Definition fcml_common.h:695
fcml_en_embeeded_rounding_control
Rounding mode.
Definition fcml_common.h:645
Instruction codes and addressing modes/instruction forms.
Handles Win32 DLL symbols importing/exporting.
Definition fcml_types.h:217
Generic memory addressing operator.
Definition fcml_common.h:627
fcml_st_offset offset
Memory address for FCML_AF_OFFSET form.
Definition fcml_common.h:639
fcml_st_segment_selector segment_selector
Segment register.
Definition fcml_common.h:635
fcml_en_effective_address_form address_form
Memory addressing format: absolute offset/effective address.
Definition fcml_common.h:633
fcml_usize size_operator
Size of data accessed in memory.
Definition fcml_common.h:629
fcml_st_effective_address effective_address
Memory address for FCML_AF_COMBINED form.
Definition fcml_common.h:637
Defines instruction's condition.
Definition fcml_common.h:495
Effective address.
Definition fcml_common.h:601
fcml_st_register index
GPR index register.
Definition fcml_common.h:605
fcml_st_integer displacement
Displacement value.
Definition fcml_common.h:609
fcml_st_register base
GPR base register.
Definition fcml_common.h:603
fcml_uint8_t scale_factor
Scale factor 1,2,4 or 8.
Definition fcml_common.h:607
Describes address of an instruction code.
Definition fcml_common.h:820
fcml_usize operand_size_attribute
Default operand size attribute (See 'D' flag of segment descriptor.)
Definition fcml_common.h:826
fcml_ip ip
Instruction pointer EIP/RIP.
Definition fcml_common.h:829
fcml_usize address_size_attribute
Default address size attribute (See 'D' flag of segment descriptor.)
Definition fcml_common.h:824
fcml_en_operating_mode op_mode
Processor operating mode 16/32/64-bit.
Definition fcml_common.h:822
Representation of far pointer operand.
Definition fcml_common.h:552
fcml_uint16_t segment
16-bit Code segment.
Definition fcml_common.h:554
fcml_int16_t offset16
16-bit offset.
Definition fcml_common.h:558
fcml_usize offset_size
Size of the offset.
Definition fcml_common.h:556
fcml_int32_t offset32
32-bit offset.
Definition fcml_common.h:560
An encoded instruction.
Definition fcml_common.h:806
fcml_uint8_t * code
Pointer to the instruction code.
Definition fcml_common.h:808
fcml_usize code_length
Instruction code length.
Definition fcml_common.h:810
Generic instruction model.
Definition fcml_common.h:779
fcml_st_operand operands[FCML_OPERANDS_COUNT]
Fixed size array of instruction operands.
Definition fcml_common.h:794
fcml_st_condition condition
Describes condition used by assembled/disassembled conditional instruction.
Definition fcml_common.h:792
fcml_prefixes prefixes
Describes explicit instruction prefixes.
Definition fcml_common.h:782
fcml_hints hints
Holds instruction level hints.
Definition fcml_common.h:784
fcml_int operands_count
Number of operands defined for instruction.
Definition fcml_common.h:796
fcml_char * mnemonic
Dialect-dependent instruction mnemonic.
Definition fcml_common.h:787
fcml_bool is_conditional
True for conditional instructions.
Definition fcml_common.h:789
Definition fcml_types.h:257
Nullable wrapper for mask of size flags.
Definition fcml_common.h:524
fcml_flags flags
Mask of supported size values.
Definition fcml_common.h:528
fcml_bool is_set
True if mask is set.
Definition fcml_common.h:526
Absolute offset.
Definition fcml_common.h:585
fcml_int16_t off16
Place for 16-bit absolute offset.
Definition fcml_common.h:591
fcml_int32_t off32
Place for 32-bit absolute offset.
Definition fcml_common.h:593
fcml_int64_t off64
Place for 64-bit absolute offset.
Definition fcml_common.h:595
fcml_bool is_signed
True if offset should be treated as signed value.
Definition fcml_common.h:589
fcml_usize size
Offset size 16,32 or 64 bits.
Definition fcml_common.h:587
Container for operand decorators.
Definition fcml_common.h:653
fcml_bool sae
Indicates support for SAE (Suppress All Exceptions).
Definition fcml_common.h:663
fcml_st_register operand_mask_reg
The 64-bit k registers are: k0 through k7.
Definition fcml_common.h:659
fcml_bool z
Zeroing masking.
Definition fcml_common.h:657
fcml_nuint8_t er
Embedded rounding control.
Definition fcml_common.h:661
fcml_nuint8_t bcast
Broadcasting: 2, 4, 8, 16, 32, 64.
Definition fcml_common.h:655
Instruction operand.
Definition fcml_common.h:731
fcml_st_integer immediate
Immediate value operand.
Definition fcml_common.h:737
fcml_st_address address
Effective address or absolute offset.
Definition fcml_common.h:741
fcml_st_operand_decorators decorators
Operand decorators.
Definition fcml_common.h:745
fcml_st_register reg
Register operand.
Definition fcml_common.h:743
fcml_en_operand_type type
Operand type.
Definition fcml_common.h:733
fcml_hints hints
Optional operand level hints.
Definition fcml_common.h:735
fcml_st_far_pointer far_pointer
Far pointer operand.
Definition fcml_common.h:739
Structure describes x86_64 register.
Definition fcml_common.h:450
fcml_uint8_t reg
Register itself as a positive integer.
Definition fcml_common.h:456
fcml_usize size
Register size in bits.
Definition fcml_common.h:454
fcml_bool x64_exp
In case of SPL,BPL,SIL,DIL GPR registers has to be set to true.
Definition fcml_common.h:458
fcml_en_register type
Register type.
Definition fcml_common.h:452
Describes segment register.
Definition fcml_common.h:615
fcml_bool is_default_reg
Set to true if given segment register is a default one in given context.
Definition fcml_common.h:621
fcml_st_register segment_selector
Used segment register.
Definition fcml_common.h:617