You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

661 lines
27 KiB

/*
* FCML - Free Code Manipulation Library.
* Copyright (C) 2010-2019 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-2017 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_ZMM0;
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_ZMM1;
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_ZMM2;
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_ZMM3;
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_ZMM4;
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_ZMM5;
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_ZMM6;
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_ZMM7;
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_ZMM8;
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_ZMM9;
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_ZMM10;
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_ZMM11;
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_ZMM12;
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_ZMM13;
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_ZMM14;
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_ZMM15;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM16;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM16;
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM16;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM17;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM17;
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM17;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM18;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM18;
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM18;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM19;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM19;
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM19;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM20;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM20;
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM20;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM21;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM21;
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM21;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM22;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM22;
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM22;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM23;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM23;
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM23;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM24;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM24;
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM24;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM25;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM25;
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM25;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM26;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM26;
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM26;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM27;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM27;
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM27;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM28;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM28;
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM28;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM29;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM29;
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM29;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM30;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM30;
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM30;
extern LIB_EXPORT fcml_st_register fcml_reg_XMM31;
extern LIB_EXPORT fcml_st_register fcml_reg_YMM31;
extern LIB_EXPORT fcml_st_register fcml_reg_ZMM31;
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_K0;
extern LIB_EXPORT fcml_st_register fcml_reg_K1;
extern LIB_EXPORT fcml_st_register fcml_reg_K2;
extern LIB_EXPORT fcml_st_register fcml_reg_K3;
extern LIB_EXPORT fcml_st_register fcml_reg_K4;
extern LIB_EXPORT fcml_st_register fcml_reg_K5;
extern LIB_EXPORT fcml_st_register fcml_reg_K6;
extern LIB_EXPORT fcml_st_register fcml_reg_K7;
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_ */