This file is indexed.

/usr/include/fcml/fcml_common_utils.h is in libfcml-dev 1.1.3-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
/*
 * FCML - Free Code Manipulation Library.
 * Copyright (C) 2010-2015 Slawomir Wojtasiak
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */

/** @file fcml_common_utils.h
 *
 * Common general purpose utility functions.
 *
 * @copyright Copyright (C) 2010-2015 Slawomir Wojtasiak. All rights reserved.
 * This project is released under the GNU Lesser General Public License.
 */

#ifndef FCML_COMMON_UTILS_H_
#define FCML_COMMON_UTILS_H_

#include "fcml_lib_export.h"

#include "fcml_common.h"
#include "fcml_assembler.h"
#include "fcml_disassembler.h"
#include "fcml_instructions.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @defgroup REG_STRUCTURES_GROUP Registers
 * Declarations of structures describing all available registers.
 * @{
 */

extern LIB_EXPORT fcml_st_register fcml_reg_AL;
extern LIB_EXPORT fcml_st_register fcml_reg_AX;
extern LIB_EXPORT fcml_st_register fcml_reg_EAX;
extern LIB_EXPORT fcml_st_register fcml_reg_RAX;
extern LIB_EXPORT fcml_st_register fcml_reg_MM0;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM0;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM0;

extern LIB_EXPORT fcml_st_register fcml_reg_CL;
extern LIB_EXPORT fcml_st_register fcml_reg_CX;
extern LIB_EXPORT fcml_st_register fcml_reg_ECX;
extern LIB_EXPORT fcml_st_register fcml_reg_RCX;
extern LIB_EXPORT fcml_st_register fcml_reg_MM1;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM1;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM1;

extern LIB_EXPORT fcml_st_register fcml_reg_DL;
extern LIB_EXPORT fcml_st_register fcml_reg_DX;
extern LIB_EXPORT fcml_st_register fcml_reg_EDX;
extern LIB_EXPORT fcml_st_register fcml_reg_RDX;
extern LIB_EXPORT fcml_st_register fcml_reg_MM2;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM2;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM2;

extern LIB_EXPORT fcml_st_register fcml_reg_BL;
extern LIB_EXPORT fcml_st_register fcml_reg_BX;
extern LIB_EXPORT fcml_st_register fcml_reg_EBX;
extern LIB_EXPORT fcml_st_register fcml_reg_RBX;
extern LIB_EXPORT fcml_st_register fcml_reg_MM3;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM3;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM3;

extern LIB_EXPORT fcml_st_register fcml_reg_AH;
extern LIB_EXPORT fcml_st_register fcml_reg_SPL;
extern LIB_EXPORT fcml_st_register fcml_reg_SP;
extern LIB_EXPORT fcml_st_register fcml_reg_ESP;
extern LIB_EXPORT fcml_st_register fcml_reg_RSP;
extern LIB_EXPORT fcml_st_register fcml_reg_MM4;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM4;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM4;

extern LIB_EXPORT fcml_st_register fcml_reg_CH;
extern LIB_EXPORT fcml_st_register fcml_reg_BPL;
extern LIB_EXPORT fcml_st_register fcml_reg_BP;
extern LIB_EXPORT fcml_st_register fcml_reg_EBP;
extern LIB_EXPORT fcml_st_register fcml_reg_RBP;
extern LIB_EXPORT fcml_st_register fcml_reg_MM5;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM5;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM5;

extern LIB_EXPORT fcml_st_register fcml_reg_DH;
extern LIB_EXPORT fcml_st_register fcml_reg_SIL;
extern LIB_EXPORT fcml_st_register fcml_reg_SI;
extern LIB_EXPORT fcml_st_register fcml_reg_ESI;
extern LIB_EXPORT fcml_st_register fcml_reg_RSI;
extern LIB_EXPORT fcml_st_register fcml_reg_MM6;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM6;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM6;

extern LIB_EXPORT fcml_st_register fcml_reg_BH;
extern LIB_EXPORT fcml_st_register fcml_reg_DIL;
extern LIB_EXPORT fcml_st_register fcml_reg_DI;
extern LIB_EXPORT fcml_st_register fcml_reg_EDI;
extern LIB_EXPORT fcml_st_register fcml_reg_RDI;
extern LIB_EXPORT fcml_st_register fcml_reg_MM7;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM7;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM7;

extern LIB_EXPORT fcml_st_register fcml_reg_R8L;
extern LIB_EXPORT fcml_st_register fcml_reg_R8W;
extern LIB_EXPORT fcml_st_register fcml_reg_R8D;
extern LIB_EXPORT fcml_st_register fcml_reg_R8;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM8;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM8;

extern LIB_EXPORT fcml_st_register fcml_reg_R9L;
extern LIB_EXPORT fcml_st_register fcml_reg_R9W;
extern LIB_EXPORT fcml_st_register fcml_reg_R9D;
extern LIB_EXPORT fcml_st_register fcml_reg_R9;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM9;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM9;

extern LIB_EXPORT fcml_st_register fcml_reg_R10L;
extern LIB_EXPORT fcml_st_register fcml_reg_R10W;
extern LIB_EXPORT fcml_st_register fcml_reg_R10D;
extern LIB_EXPORT fcml_st_register fcml_reg_R10;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM10;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM10;

extern LIB_EXPORT fcml_st_register fcml_reg_R11L;
extern LIB_EXPORT fcml_st_register fcml_reg_R11W;
extern LIB_EXPORT fcml_st_register fcml_reg_R11D;
extern LIB_EXPORT fcml_st_register fcml_reg_R11;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM11;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM11;

extern LIB_EXPORT fcml_st_register fcml_reg_R12L;
extern LIB_EXPORT fcml_st_register fcml_reg_R12W;
extern LIB_EXPORT fcml_st_register fcml_reg_R12D;
extern LIB_EXPORT fcml_st_register fcml_reg_R12;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM12;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM12;

extern LIB_EXPORT fcml_st_register fcml_reg_R13L;
extern LIB_EXPORT fcml_st_register fcml_reg_R13W;
extern LIB_EXPORT fcml_st_register fcml_reg_R13D;
extern LIB_EXPORT fcml_st_register fcml_reg_R13;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM13;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM13;

extern LIB_EXPORT fcml_st_register fcml_reg_R14L;
extern LIB_EXPORT fcml_st_register fcml_reg_R14W;
extern LIB_EXPORT fcml_st_register fcml_reg_R14D;
extern LIB_EXPORT fcml_st_register fcml_reg_R14;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM14;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM14;

extern LIB_EXPORT fcml_st_register fcml_reg_R15L;
extern LIB_EXPORT fcml_st_register fcml_reg_R15W;
extern LIB_EXPORT fcml_st_register fcml_reg_R15D;
extern LIB_EXPORT fcml_st_register fcml_reg_R15;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM15;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM15;

extern LIB_EXPORT fcml_st_register fcml_reg_ES;
extern LIB_EXPORT fcml_st_register fcml_reg_CS;
extern LIB_EXPORT fcml_st_register fcml_reg_SS;
extern LIB_EXPORT fcml_st_register fcml_reg_DS;
extern LIB_EXPORT fcml_st_register fcml_reg_FS;
extern LIB_EXPORT fcml_st_register fcml_reg_GS;

extern LIB_EXPORT fcml_st_register fcml_reg_ST0;
extern LIB_EXPORT fcml_st_register fcml_reg_ST1;
extern LIB_EXPORT fcml_st_register fcml_reg_ST2;
extern LIB_EXPORT fcml_st_register fcml_reg_ST3;
extern LIB_EXPORT fcml_st_register fcml_reg_ST4;
extern LIB_EXPORT fcml_st_register fcml_reg_ST5;
extern LIB_EXPORT fcml_st_register fcml_reg_ST6;
extern LIB_EXPORT fcml_st_register fcml_reg_ST7;

extern LIB_EXPORT fcml_st_register fcml_reg_CR0;
extern LIB_EXPORT fcml_st_register fcml_reg_CR2;
extern LIB_EXPORT fcml_st_register fcml_reg_CR3;
extern LIB_EXPORT fcml_st_register fcml_reg_CR4;
extern LIB_EXPORT fcml_st_register fcml_reg_CR8;

extern LIB_EXPORT fcml_st_register fcml_reg_DR0;
extern LIB_EXPORT fcml_st_register fcml_reg_DR1;
extern LIB_EXPORT fcml_st_register fcml_reg_DR2;
extern LIB_EXPORT fcml_st_register fcml_reg_DR3;
extern LIB_EXPORT fcml_st_register fcml_reg_DR4;
extern LIB_EXPORT fcml_st_register fcml_reg_DR5;
extern LIB_EXPORT fcml_st_register fcml_reg_DR6;
extern LIB_EXPORT fcml_st_register fcml_reg_DR7;

extern LIB_EXPORT fcml_st_register fcml_reg_IP;
extern LIB_EXPORT fcml_st_register fcml_reg_EIP;
extern LIB_EXPORT fcml_st_register fcml_reg_RIP;

/** @} */

/** Prepares register operand for given register.
 * @param reg Register for instruction operator.
 * @return Prepared operand.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_reg( fcml_st_register *reg );

/* IMM.*/

/** Prepares immediate operand for unsigned int8.
 * @param value Value for immediate operand.
 * @return Prepared operand.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_unsigned_imm_8( fcml_uint8_t value );
/** Prepares immediate operand for signed int8.
 * @param value Value for immediate operand.
 * @return Prepared operand.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_signed_imm_8( fcml_int8_t value );
/** Prepares immediate operand for unsigned int16.
 * @param value Value for immediate operand.
 * @return Prepared operand.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_unsigned_imm_16( fcml_uint16_t value );
/** Prepares immediate operand for signed int16.
 * @param value Value for immediate operand.
 * @return Prepared operand.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_signed_imm_16( fcml_int16_t value );
/** Prepares immediate operand for unsigned int32.
 * @param value Value for immediate operand.
 * @return Prepared operand.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_unsigned_imm_32( fcml_uint32_t value );
/** Prepares immediate operand for signed int32.
 * @param value Value for immediate operand.
 * @return Prepared operand.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_signed_imm_32( fcml_int32_t value );
/** Prepares immediate operand for unsigned int64.
 * @param value Value for immediate operand.
 * @return Prepared operand.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_unsigned_imm_64( fcml_uint64_t value );
/** Prepares immediate operand for signed int64.
 * @param value Value for immediate operand.
 * @return Prepared operand.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_signed_imm_64( fcml_int64_t value );

/* Memory addressing.*/

/** Prepares far pointer operand for given segment and offset.
 * @param seg 16-bit code segment.
 * @param offset 16-bit code offset.
 * @return Prepared operand.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_far_pointer_offset16( fcml_int16_t seg, fcml_int16_t offset );
/** Prepares far pointer operand for given segment and offset.
 * @param seg 16-bit code segment.
 * @param offset 32-bit code offset.
 * @return Prepared operand.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_far_pointer_offset32( fcml_int16_t seg, fcml_int32_t offset );
/** Prepares memory addressing operand for 16-bit absolute offset.
 * @param offset 16-bit absolute offset.
 * @param size_operator Size operator.
 * @return Prepared operand.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_offset_16( fcml_int16_t offset, fcml_usize size_operator );
/** Prepares memory addressing operand for 32-bit absolute offset.
 * @param offset 32-bit absolute offset.
 * @param size_operator Size operator.
 * @return Prepared operand.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_offset_32( fcml_int32_t offset, fcml_usize size_operator );
/** Prepares memory addressing operand for 64-bit absolute offset. Function sets operand level hint: FCML_OP_HINT_ABSOLUTE_ADDRESSING.
 * @param offset 64-bit absolute offset.
 * @param size_operator Size operator.
 * @return Prepared operand.
 * @see RIP addressing.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_offset_abs_64( fcml_int64_t offset, fcml_usize size_operator );
/** Prepares memory addressing operand for 64-bit absolute offset. Function sets operand level hint: FCML_OP_HINT_RELATIVE_ADDRESSING.
 * @param offset 64-bit absolute offset.
 * @param size_operator Size operator.
 * @return Prepared operand.
 * @see RIP addressing.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_offset_rel_64( fcml_int64_t offset, fcml_usize size_operator );
/** Prepares effective memory addressing operand for 16-bit displacement.
 * @param disp 16-bit displacement.
 * @param size_operator Size operator.
 * @return Prepared operand.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_disp_16( fcml_int16_t disp, fcml_usize size_operator );
/** Prepares effective memory addressing operand for 32-bit displacement.
 * @param disp 32-bit displacement.
 * @param size_operator Size operator.
 * @return Prepared operand.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_disp_32( fcml_int32_t disp, fcml_usize size_operator );
/** Prepares effective memory addressing operand for 64-bit displacement.
 * @param disp 64-bit displacement.
 * @param size_operator Size operator.
 * @return Prepared operand.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_disp_64( fcml_int64_t disp, fcml_usize size_operator );
/** Prepares effective memory addressing operand for 8-bit displacement and base register.
 * @param base Base register.
 * @param disp 8-bit displacement.
 * @param size_operator Size operator.
 * @return Prepared operand.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_b_disp_8( fcml_st_register *base, fcml_int8_t disp, fcml_usize size_operator );
/** Prepares effective memory addressing operand for 16-bit displacement and base register.
 * @param base Base register.
 * @param disp 16-bit displacement.
 * @param size_operator Size operator.
 * @return Prepared operand.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_b_disp_16( fcml_st_register *base, fcml_int16_t disp, fcml_usize size_operator );
/** Prepares effective memory addressing operand for 32-bit displacement and base register.
 * @param base Base register.
 * @param disp 32-bit displacement.
 * @param size_operator Size operator.
 * @return Prepared operand.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_b_disp_32( fcml_st_register *base, fcml_int32_t disp, fcml_usize size_operator );
/** Prepares effective memory addressing operand for 64-bit displacement and base register.
 * @param base Base register.
 * @param disp 64-bit displacement.
 * @param size_operator Size operator.
 * @return Prepared operand.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_b_disp_64( fcml_st_register *base, fcml_int64_t disp, fcml_usize size_operator );
/** Prepares effective memory addressing operand for 8-bit displacement, scale factor and index register.
 * @param index Index register.
 * @param scale_factor Scale factor.
 * @param disp 8-bit displacement.
 * @param size_operator Size operator.
 * @return Prepared operand.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_is_disp_8( fcml_st_register *index, fcml_uint8_t scale_factor, fcml_int8_t disp, fcml_usize size_operator );
/** Prepares effective memory addressing operand for 16-bit displacement, scale factor and index register.
 * @param index Index register.
 * @param scale_factor Scale factor.
 * @param disp 16-bit displacement.
 * @param size_operator Size operator.
 * @return Prepared operand.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_is_disp_32( fcml_st_register *index, fcml_uint8_t scale_factor, fcml_int32_t disp, fcml_usize size_operator );
/** Prepares effective memory addressing operand for 32-bit displacement, scale factor and index register.
 * @param index Index register.
 * @param scale_factor Scale factor.
 * @param disp 32-bit displacement.
 * @param size_operator Size operator.
 * @return Prepared operand.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_is_disp_64( fcml_st_register *index, fcml_uint8_t scale_factor, fcml_int64_t disp, fcml_usize size_operator );
/** Prepares effective memory addressing operand for 8-bit displacement, base register, scale factor and index register.
 * @param base Base register.
 * @param index Index register.
 * @param scale_factor Scale factor.
 * @param disp 8-bit displacement.
 * @param size_operator Size operator.
 * @return Prepared operand.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_bis_disp_8( fcml_st_register *base, fcml_st_register *index, fcml_uint8_t scale_factor, fcml_int8_t disp, fcml_usize size_operator );
/** Prepares effective memory addressing operand for 16-bit displacement, base register, scale factor and index register.
 * @param base Base register.
 * @param index Index register.
 * @param scale_factor Scale factor.
 * @param disp 16-bit displacement.
 * @param size_operator Size operator.
 * @return Prepared operand.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_bis_disp_32( fcml_st_register *base, fcml_st_register *index, fcml_uint8_t scale_factor, fcml_int32_t disp, fcml_usize size_operator );
/** Prepares effective memory addressing operand for 32-bit displacement, base register, scale factor and index register.
 * @param base Base register.
 * @param index Index register.
 * @param scale_factor Scale factor.
 * @param disp 32-bit displacement.
 * @param size_operator Size operator.
 * @return Prepared operand.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_operand_addr_bis_disp_64( fcml_st_register *base, fcml_st_register *index, fcml_uint8_t scale_factor, fcml_int64_t disp, fcml_usize size_operator );

/** Adds hints to the operand.
 * @param operand Operand for hints.
 * @param hints Hints mask.
 * @return Prepared operand.
 */
LIB_EXPORT fcml_st_operand LIB_CALL fcml_fn_cu_add_operand_hints( fcml_st_operand operand, fcml_hints hints );

/** Clones given instruction.
 * Allocates new instance of instruction and makes a deep copy of
 * all fields. Remember that cloned instructions have to be freed
 * using fcml_fn_cu_free_instruction() function. Do not try to free
 * it on your own because it might be allocated on different
 * dedicated memory heap.
 * @param instruction Instruction to be cloned.
 * @return Cloned instruction.
 */
LIB_EXPORT fcml_st_instruction* LIB_CALL fcml_fn_cu_clone_instruction( fcml_st_instruction *instruction );

/** Frees given instruction.
 * Frees instruction allocated by fcml_fn_cu_clone_instruction() function.
 * @param instruction Instruction to be freed.
 */
LIB_EXPORT void LIB_CALL fcml_fn_cu_free_instruction( fcml_st_instruction *instruction );

/** Gets operand of given type or NULL if there is no such operand.
 * If more than one operand of given type exist, the first one is returned.
 * @param instruction Finds an operand of the given type for for given instruction.
 * @param operand_type Operand type.
 * @return Pointer to the operand of given type.
 */
LIB_EXPORT fcml_st_operand *fcml_fn_cu_find_operand( fcml_st_instruction *instruction, fcml_en_operand_type operand_type );

/* Some shortcuts for those who prefer to use macros instead of functions.*/

#define FCML_IMM8_S( x )		fcml_fn_cu_operand_signed_imm_8( x )
#define FCML_IMM8( x )			fcml_fn_cu_operand_unsigned_imm_8( x )
#define FCML_IMM16_S( x )		fcml_fn_cu_operand_signed_imm_16( x )
#define FCML_IMM16( x )			fcml_fn_cu_operand_unsigned_imm_16( x )
#define FCML_IMM32_S( x )		fcml_fn_cu_operand_signed_imm_32( x )
#define FCML_IMM32( x )			fcml_fn_cu_operand_unsigned_imm_32( x )
#define FCML_IMM64_S( x )		fcml_fn_cu_operand_signed_imm_64( x )
#define FCML_IMM64( x )			fcml_fn_cu_operand_unsigned_imm_64( x )

#ifdef FCML_USE_SHORT_REG
#define FCML_REG( x )			fcml_fn_cu_operand_reg( &fcml_reg_##x )
#else
#define FCML_REG( x )			fcml_fn_cu_operand_reg( &x )
#endif

#define FCML_FAR_POINTER_16( seg, offset )           fcml_fn_cu_operand_addr_far_pointer_offset16( seg, offset )
#define FCML_FAR_POINTER_32( seg, offset )           fcml_fn_cu_operand_addr_far_pointer_offset32( seg, offset )
#define FCML_OFFSET_16( offset )                     fcml_fn_cu_operand_addr_offset_16( offset )
#define FCML_OFFSET_32( offset )                     fcml_fn_cu_operand_addr_offset_32( offset )
#define FCML_OFFSET_ABS_64( offset )                 fcml_fn_cu_operand_addr_offset_abs_64( offset )
#define FCML_OFFSET_REL_64( offset )                 fcml_fn_cu_operand_addr_offset_rel_64( offset )
#define FCML_DISP_16( offset )                       fcml_fn_cu_operand_addr_disp_16( offset )
#define FCML_DISP_32( offset )                       fcml_fn_cu_operand_addr_disp_32( offset )
#define FCML_DISP_64( offset )                       fcml_fn_cu_operand_addr_disp_64( offset )

#ifdef FCML_USE_SHORT_REG
#define FCML_B_DISP_8( base, offset )                   fcml_fn_cu_operand_addr_b_disp_8( &fcml_reg_##base, offset )
#define FCML_B_DISP_16( base, offset )                  fcml_fn_cu_operand_addr_b_disp_16( &fcml_reg_##base, offset )
#define FCML_B_DISP_32( base, offset )                  fcml_fn_cu_operand_addr_b_disp_32( &fcml_reg_##base, offset )
#define FCML_B_DISP_64( base, offset )                  fcml_fn_cu_operand_addr_b_disp_64( &fcml_reg_##base, offset )
#define FCML_IS_DISP_8( index, scale, offset )          fcml_fn_cu_operand_addr_is_disp_8( &fcml_reg_##index, scale, offset )
#define FCML_IS_DISP_16( index, scale, offset )         fcml_fn_cu_operand_addr_is_disp_32( &fcml_reg_##index, scale, offset )
#define FCML_IS_DISP_32( index, scale, offset )         fcml_fn_cu_operand_addr_is_disp_64( &fcml_reg_##index, scale, offset )
#define FCML_BIS_DISP_8( base, index, scale, offset )   fcml_fn_cu_operand_addr_bis_disp_8( &fcml_reg_##base, &fcml_reg_##index, scale, offset )
#define FCML_BIS_DISP_16( base, index, scale, offset )  fcml_fn_cu_operand_addr_bis_disp_32( &fcml_reg_##base, &fcml_reg_##index, scale, offset )
#define FCML_BIS_DISP_32( base, index, scale, offset )  fcml_fn_cu_operand_addr_bis_disp_64( &fcml_reg_##base, &fcml_reg_##index, scale, offset )
#else
#define FCML_B_DISP_8( base, offset )                   fcml_fn_cu_operand_addr_b_disp_8( &base, offset )
#define FCML_B_DISP_16( base, offset )                  fcml_fn_cu_operand_addr_b_disp_16( &base, offset )
#define FCML_B_DISP_32( base, offset )                  fcml_fn_cu_operand_addr_b_disp_32( &base, offset )
#define FCML_B_DISP_64( base, offset )                  fcml_fn_cu_operand_addr_b_disp_64( &base, offset )
#define FCML_IS_DISP_8( index, scale, offset )          fcml_fn_cu_operand_addr_is_disp_8( &index, scale, offset )
#define FCML_IS_DISP_16( index, scale, offset )         fcml_fn_cu_operand_addr_is_disp_32( &index, scale, offset )
#define FCML_IS_DISP_32( index, scale, offset )         fcml_fn_cu_operand_addr_is_disp_64( &index, scale, offset )
#define FCML_BIS_DISP_8( base, index, scale, offset )   fcml_fn_cu_operand_addr_bis_disp_8( &base, &index, scale, offset )
#define FCML_BIS_DISP_16( base, index, scale, offset )  fcml_fn_cu_operand_addr_bis_disp_32( &base, &index, scale, offset )
#define FCML_BIS_DISP_32( base, index, scale, offset )  fcml_fn_cu_operand_addr_bis_disp_64( &base, &index, scale, offset )
#endif

#define FCML_IS_INSTRUCTION_GROUP( result, group )		( result.instruction_details.instruction_group & ( group ) )
#define FCML_IS_INSTRUCTION_CODE( result, _ins )		( result.instruction_details.instruction == _ins )

#ifdef __cplusplus
}
#endif

#endif /* FCML_COMMON_UTILS_H_ */