blob: 7fdebd744ffbfa763cbb40eda3e8fb4f9311e720 [file] [log] [blame]
/* **********************************************************
* Copyright (c) 2011-2014 Google, Inc. All rights reserved.
* Copyright (c) 2002-2010 VMware, Inc. All rights reserved.
* **********************************************************/
/*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* * Neither the name of VMware, Inc. nor the names of its contributors may be
* used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL VMWARE, INC. OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*/
/* Copyright (c) 2003-2007 Determina Corp. */
/* Copyright (c) 2002-2003 Massachusetts Institute of Technology */
#ifndef _INSTR_CREATE_H_
#define _INSTR_CREATE_H_ 1
#include "../instr_create_shared.h"
/* DR_API EXPORT TOFILE dr_ir_macros_arm.h */
/* DR_API EXPORT BEGIN */
/**
* Create an absolute address operand encoded as pc-relative.
* Encoding will fail if addr is out of the maximum signed displacement
* reach for the architecture and ISA mode.
*/
#define OPND_CREATE_ABSMEM(addr, size) \
opnd_create_rel_addr(addr, size)
/** Create a negated register operand. */
#define OPND_CREATE_NEG_REG(reg) opnd_create_reg_ex(reg, 0, DR_OPND_NEGATED)
/** The immediate opnd_t for use with OP_msr to write the nzcvq status flags. */
#define OPND_CREATE_INT_MSR_NZCVQ() opnd_create_immed_int(0x8, OPSZ_4b)
/** The immediate opnd_t for use with OP_msr to write the apsr_g status flags. */
#define OPND_CREATE_INT_MSR_G() opnd_create_immed_int(0x8, OPSZ_4b)
/** The immediate opnd_t for use with OP_msr to write the apsr_nzcvqg status flags. */
#define OPND_CREATE_INT_MSR_NZCVQG() opnd_create_immed_int(0xc, OPSZ_4b)
/* Macros for building instructions, one for each opcode.
* Each INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The macro parameter types, encoded by name, are:
* dc = DR Context*
* op = uint = opcode
* s = opnd_t = source operand
* i = opnd_t = source operand that is an immediate
* ri = opnd_t = source operand that can be a register or an immediate
* t = opnd_t = source operand that is a jump target
* m = opnd_t = source operand that can only reference memory
* f = opnd_t = floating point register operand
* d = opnd_t = destination operand
*/
/****************************************************************************
* Platform-independent INSTR_CREATE_* macros
*/
/** @name Platform-independent macros */
/* @{ */ /* doxygen start group */
/**
* This platform-independent macro creates an instr_t for a debug trap
* instruction, automatically supplying any implicit operands.
* \param dc The void * dcontext used to allocate memory for the instr_t.
*/
#define XINST_CREATE_debug_instr(dc) INSTR_CREATE_bkpt((dc), OPND_CREATE_INT8(1))
/**
* This platform-independent creates an instr_t for a memory load instruction.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param r The destination register opnd.
* \param m The source memory opnd.
*/
#define XINST_CREATE_load(dc, r, m) INSTR_CREATE_ldr((dc), (r), (m))
/**
* This platform-independent macro creates an instr_t for a memory store instruction.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param m The destination memory opnd.
* \param r The source register opnd.
*/
#define XINST_CREATE_store(dc, m, r) INSTR_CREATE_str((dc), (m), (r))
/**
* This platform-independent macro creates an instr_t for a register
* to register move instruction.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param d The destination register opnd.
* \param s The source register opnd.
*/
#define XINST_CREATE_move(dc, d, s) INSTR_CREATE_mov((dc), (d), (s))
/**
* This platform-independent macro creates an instr_t for a multimedia
* register load instruction.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param r The destination register opnd.
* \param m The source memory opnd.
*
* \note Loading to 128-bit registers is not supported on 32-bit ARM.
*/
#define XINST_CREATE_load_simd(dc, r, m) INSTR_CREATE_vldr((dc), (r), (m))
/**
* This platform-independent macro creates an instr_t for a multimedia
* register store instruction.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param m The destination memory opnd.
* \param r The source register opnd.
*
* \note Storing from 128-bit registers is not supported on 32-bit ARM.
*/
#define XINST_CREATE_store_simd(dc, m, r) INSTR_CREATE_vstr((dc), (m), (r))
/**
* This platform-independent macro creates an instr_t for an indirect
* jump through memory instruction.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param m The memory opnd holding the target.
*/
#define XINST_CREATE_jump_mem(dc, m) \
INSTR_CREATE_ldr((dc), opnd_create_reg(DR_REG_PC), (m))
/**
* This platform-independent macro creates an instr_t for an immediate
* integer load instruction.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param r The destination register opnd.
* \param i The source immediate integer opnd.
*/
#define XINST_CREATE_load_int(dc, r, i) \
(opnd_get_immed_int(i) < 0 ? \
INSTR_CREATE_mvn((dc), (r), OPND_CREATE_INTPTR(-opnd_get_immed_int(i))) : \
INSTR_CREATE_movw((dc), (r), (i)))
/**
* This platform-independent macro creates an instr_t for a return instruction.
* \param dc The void * dcontext used to allocate memory for the instr_t.
*/
#define XINST_CREATE_return(dc) INSTR_CREATE_pop(dc, opnd_create_reg(DR_REG_PC))
/**
* This platform-independent macro creates an instr_t for an unconditional
* branch instruction.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param t The opnd_t target operand for the instruction, which can be
* either a pc (opnd_create_pc)()) or an instr_t (opnd_create_instr()).
* Be sure to ensure that the limited reach of this short branch will reach
* the target (a pc operand is not suitable for most uses unless you know
* precisely where this instruction will be encoded).
*/
#define XINST_CREATE_jump(dc, t) INSTR_CREATE_b((dc), (t))
/**
* This platform-independent macro creates an instr_t for an addition
* instruction that does not affect the status flags.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param d The opnd_t explicit destination operand for the instruction.
* \param s The opnd_t explicit source operand for the instruction.
*/
#define XINST_CREATE_add(dc, d, s) INSTR_CREATE_add((dc), (d), (d), (s))
/**
* This platform-independent macro creates an instr_t for an addition
* instruction that does affect the status flags.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param d The opnd_t explicit destination operand for the instruction.
* \param s The opnd_t explicit source operand for the instruction.
*/
#define XINST_CREATE_add_s(dc, d, s) INSTR_CREATE_adds((dc), (d), (d), (s))
/**
* This platform-independent macro creates an instr_t for a subtraction
* instruction that does not affect the status flags.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param d The opnd_t explicit destination operand for the instruction.
* \param s The opnd_t explicit source operand for the instruction.
*/
#define XINST_CREATE_sub(dc, d, s) INSTR_CREATE_sub((dc), (d), (d), (s))
/**
* This platform-independent macro creates an instr_t for a subtraction
* instruction that does affect the status flags.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param d The opnd_t explicit destination operand for the instruction.
* \param s The opnd_t explicit source operand for the instruction.
*/
#define XINST_CREATE_sub_s(dc, d, s) INSTR_CREATE_subs((dc), (d), (d), (s))
/**
* This platform-independent macro creates an instr_t for a bitwise and
* instruction that does affect the status flags.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param d The opnd_t explicit destination operand for the instruction.
* \param s The opnd_t explicit source operand for the instruction.
*/
#define XINST_CREATE_and_s(dc, d, s) \
instr_create_1dst_2src((dc), OP_ands, (d), (s), (d))
/**
* This platform-independent macro creates an instr_t for a comparison
* instruction.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param s1 The opnd_t explicit destination operand for the instruction.
* \param s2 The opnd_t explicit source operand for the instruction.
*/
#define XINST_CREATE_cmp(dc, s1, s2) \
instr_create_0dst_2src((dc), OP_cmp, (s1), (s2))
/**
* This platform-independent macro creates an instr_t for a software
* interrupt instruction.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param i The source integer constant opnd_t operand.
*/
#define XINST_CREATE_interrupt(dc, i) INSTR_CREATE_svc(dc, (i))
/* @} */ /* end doxygen group */
/****************************************************************************
* Manually-added ARM-specific INSTR_CREATE_* macros
*/
/**
* This macro creates an instr_t for a pop instruction into a single
* register, automatically supplying any implicit operands.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
*/
#define INSTR_CREATE_pop(dc, Rd) \
INSTR_CREATE_ldr_wbimm((dc), (Rd), OPND_CREATE_MEMPTR(DR_REG_XSP, 0), \
OPND_CREATE_INT16(sizeof(void*)))
/**
* This macro creates an instr_t for a pop instruction into a list of
* registers, automatically supplying any implicit operands.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param list_len The number of registers in the register list.
* \param ... The register list as separate opnd_t arguments.
*/
#define INSTR_CREATE_pop_list(dc, list_len, ...) \
INSTR_CREATE_ldm_wb((dc), OPND_CREATE_MEMPTR(DR_REG_XSP, 0), list_len, __VA_ARGS__)
/**
* This macro creates an instr_t for a push instruction of a single
* register, automatically supplying any implicit operands.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
*/
#define INSTR_CREATE_push(dc, Rt) \
INSTR_CREATE_str_wbimm((dc), OPND_CREATE_MEMPTR(DR_REG_XSP, 0), (Rt), \
OPND_CREATE_INT16(sizeof(void*)))
/**
* This macro creates an instr_t for a push instruction of a list of
* registers, automatically supplying any implicit operands.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param list_len The number of registers in the register list.
* \param ... The register list as separate opnd_t arguments.
*/
#define INSTR_CREATE_push_list(dc, list_len, ...) \
INSTR_CREATE_stmdb_wb((dc), OPND_CREATE_MEMPTR(DR_REG_XSP, 0), list_len, __VA_ARGS__)
/**
* This macro creates an instr_t for a negate instruction,
automatically supplying any implicit operands.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param Rn The source register opnd_t operand.
*/
#define INSTR_CREATE_neg(dc, Rd, Rn) \
INSTR_CREATE_rsb((dc), (Rd), (Rn), OPND_CREATE_INT16(0))
/* XXX i#1551: add macros for the other opcode aliases */
/****************************************************************************
* Automatically-generated ARM-specific INSTR_CREATE_* macros.
* These were generated from tools/arm_macros_gen.pl.
* DO NOT EDIT THESE MANUALLY so we can continue using the script for easy
* updates on table changes.
*/
/** @name Signature: () */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
*/
#define INSTR_CREATE_clrex(dc) \
instr_create_0dst_0src((dc), OP_clrex)
#define INSTR_CREATE_eret(dc) \
instr_create_0dst_0src((dc), OP_eret)
#define INSTR_CREATE_nop(dc) \
instr_create_0dst_0src((dc), OP_nop)
#define INSTR_CREATE_sev(dc) \
instr_create_0dst_0src((dc), OP_sev)
#define INSTR_CREATE_sevl(dc) \
instr_create_0dst_0src((dc), OP_sevl)
#define INSTR_CREATE_wfe(dc) \
instr_create_0dst_0src((dc), OP_wfe)
#define INSTR_CREATE_wfi(dc) \
instr_create_0dst_0src((dc), OP_wfi)
#define INSTR_CREATE_yield(dc) \
instr_create_0dst_0src((dc), OP_yield)
/* @} */ /* end doxygen group */
/** @name Signature: (Rd) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
*/
#define INSTR_CREATE_vmrs(dc, Rd) \
instr_create_1dst_1src((dc), OP_vmrs, (Rd), opnd_create_reg(DR_REG_FPSCR))
/* @} */ /* end doxygen group */
/** @name Signature: (Rm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rm The source register opnd_t operand.
*/
#define INSTR_CREATE_blx_ind(dc, Rm) \
instr_create_1dst_1src((dc), OP_blx_ind, opnd_create_reg(DR_REG_LR), (Rm))
#define INSTR_CREATE_bx(dc, Rm) \
instr_create_0dst_1src((dc), OP_bx, (Rm))
#define INSTR_CREATE_bxj(dc, Rm) \
instr_create_0dst_1src((dc), OP_bxj, (Rm))
/* @} */ /* end doxygen group */
/** @name Signature: (Rt) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rt The source register opnd_t operand.
*/
#define INSTR_CREATE_vmsr(dc, Rt) \
instr_create_1dst_1src((dc), OP_vmsr, opnd_create_reg(DR_REG_FPSCR), (Rt))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, Rm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param Rm The source register opnd_t operand.
*/
#define INSTR_CREATE_clz(dc, Rd, Rm) \
instr_create_1dst_1src((dc), OP_clz, (Rd), (Rm))
#define INSTR_CREATE_rbit(dc, Rd, Rm) \
instr_create_1dst_1src((dc), OP_rbit, (Rd), (Rm))
#define INSTR_CREATE_rev(dc, Rd, Rm) \
instr_create_1dst_1src((dc), OP_rev, (Rd), (Rm))
#define INSTR_CREATE_rev16(dc, Rd, Rm) \
instr_create_1dst_1src((dc), OP_rev16, (Rd), (Rm))
#define INSTR_CREATE_revsh(dc, Rd, Rm) \
instr_create_1dst_1src((dc), OP_revsh, (Rd), (Rm))
#define INSTR_CREATE_rrx(dc, Rd, Rm) \
instr_create_1dst_1src((dc), OP_rrx, (Rd), (Rm))
#define INSTR_CREATE_rrxs(dc, Rd, Rm) \
instr_create_1dst_1src((dc), OP_rrxs, (Rd), (Rm))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, statreg) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param statreg The status register (usually DR_REG_CPSR) opnd_t operand.
*/
#define INSTR_CREATE_mrs(dc, Rd, statreg) \
instr_create_1dst_1src((dc), OP_mrs, (Rd), (statreg))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, Rm, Rn) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param Rm The source register opnd_t operand.
* \param Rn The source register opnd_t operand.
*/
#define INSTR_CREATE_qsub(dc, Rd, Rm, Rn) \
instr_create_1dst_2src((dc), OP_qsub, (Rd), (Rm), (Rn))
#define INSTR_CREATE_smulbb(dc, Rd, Rm, Rn) \
instr_create_1dst_2src((dc), OP_smulbb, (Rd), (Rm), (Rn))
#define INSTR_CREATE_smulbt(dc, Rd, Rm, Rn) \
instr_create_1dst_2src((dc), OP_smulbt, (Rd), (Rm), (Rn))
#define INSTR_CREATE_smultb(dc, Rd, Rm, Rn) \
instr_create_1dst_2src((dc), OP_smultb, (Rd), (Rm), (Rn))
#define INSTR_CREATE_smultt(dc, Rd, Rm, Rn) \
instr_create_1dst_2src((dc), OP_smultt, (Rd), (Rm), (Rn))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, Rn, Rm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param Rn The source register opnd_t operand.
* \param Rm The second source register opnd_t operand.
*/
#define INSTR_CREATE_crc32b(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_crc32b, (Rd), (Rn), (Rm))
#define INSTR_CREATE_crc32cb(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_crc32cb, (Rd), (Rn), (Rm))
#define INSTR_CREATE_crc32ch(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_crc32ch, (Rd), (Rn), (Rm))
#define INSTR_CREATE_crc32cw(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_crc32cw, (Rd), (Rn), (Rm))
#define INSTR_CREATE_crc32h(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_crc32h, (Rd), (Rn), (Rm))
#define INSTR_CREATE_crc32w(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_crc32w, (Rd), (Rn), (Rm))
#define INSTR_CREATE_mul(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_mul, (Rd), (Rn), (Rm))
#define INSTR_CREATE_muls(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_muls, (Rd), (Rn), (Rm))
#define INSTR_CREATE_qadd(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_qadd, (Rd), (Rn), (Rm))
#define INSTR_CREATE_qadd16(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_qadd16, (Rd), (Rn), (Rm))
#define INSTR_CREATE_qadd8(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_qadd8, (Rd), (Rn), (Rm))
#define INSTR_CREATE_qasx(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_qasx, (Rd), (Rn), (Rm))
#define INSTR_CREATE_qdadd(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_qdadd, (Rd), (Rn), (Rm))
#define INSTR_CREATE_qdsub(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_qdsub, (Rd), (Rn), (Rm))
#define INSTR_CREATE_qsax(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_qsax, (Rd), (Rn), (Rm))
#define INSTR_CREATE_qsub16(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_qsub16, (Rd), (Rn), (Rm))
#define INSTR_CREATE_qsub8(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_qsub8, (Rd), (Rn), (Rm))
#define INSTR_CREATE_sadd16(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_sadd16, (Rd), (Rn), (Rm))
#define INSTR_CREATE_sadd8(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_sadd8, (Rd), (Rn), (Rm))
#define INSTR_CREATE_sasx(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_sasx, (Rd), (Rn), (Rm))
#define INSTR_CREATE_sdiv(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_sdiv, (Rd), (Rn), (Rm))
#define INSTR_CREATE_sel(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_sel, (Rd), (Rn), (Rm))
#define INSTR_CREATE_shadd16(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_shadd16, (Rd), (Rn), (Rm))
#define INSTR_CREATE_shadd8(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_shadd8, (Rd), (Rn), (Rm))
#define INSTR_CREATE_shasx(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_shasx, (Rd), (Rn), (Rm))
#define INSTR_CREATE_shsax(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_shsax, (Rd), (Rn), (Rm))
#define INSTR_CREATE_shsub16(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_shsub16, (Rd), (Rn), (Rm))
#define INSTR_CREATE_shsub8(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_shsub8, (Rd), (Rn), (Rm))
#define INSTR_CREATE_smulwb(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_smulwb, (Rd), (Rn), (Rm))
#define INSTR_CREATE_smulwt(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_smulwt, (Rd), (Rn), (Rm))
#define INSTR_CREATE_ssax(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_ssax, (Rd), (Rn), (Rm))
#define INSTR_CREATE_ssub16(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_ssub16, (Rd), (Rn), (Rm))
#define INSTR_CREATE_ssub8(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_ssub8, (Rd), (Rn), (Rm))
#define INSTR_CREATE_uadd16(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_uadd16, (Rd), (Rn), (Rm))
#define INSTR_CREATE_uadd8(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_uadd8, (Rd), (Rn), (Rm))
#define INSTR_CREATE_uasx(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_uasx, (Rd), (Rn), (Rm))
#define INSTR_CREATE_udiv(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_udiv, (Rd), (Rn), (Rm))
#define INSTR_CREATE_uhadd16(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_uhadd16, (Rd), (Rn), (Rm))
#define INSTR_CREATE_uhadd8(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_uhadd8, (Rd), (Rn), (Rm))
#define INSTR_CREATE_uhasx(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_uhasx, (Rd), (Rn), (Rm))
#define INSTR_CREATE_uhsax(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_uhsax, (Rd), (Rn), (Rm))
#define INSTR_CREATE_uhsub16(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_uhsub16, (Rd), (Rn), (Rm))
#define INSTR_CREATE_uhsub8(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_uhsub8, (Rd), (Rn), (Rm))
#define INSTR_CREATE_uqadd16(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_uqadd16, (Rd), (Rn), (Rm))
#define INSTR_CREATE_uqadd8(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_uqadd8, (Rd), (Rn), (Rm))
#define INSTR_CREATE_uqasx(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_uqasx, (Rd), (Rn), (Rm))
#define INSTR_CREATE_uqsax(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_uqsax, (Rd), (Rn), (Rm))
#define INSTR_CREATE_uqsub16(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_uqsub16, (Rd), (Rn), (Rm))
#define INSTR_CREATE_uqsub8(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_uqsub8, (Rd), (Rn), (Rm))
#define INSTR_CREATE_usax(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_usax, (Rd), (Rn), (Rm))
#define INSTR_CREATE_usub16(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_usub16, (Rd), (Rn), (Rm))
#define INSTR_CREATE_usub8(dc, Rd, Rn, Rm) \
instr_create_1dst_2src((dc), OP_usub8, (Rd), (Rn), (Rm))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, Rn, Rm, Ra) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param Rn The source register opnd_t operand.
* \param Rm The second source register opnd_t operand.
* \param Ra The third source register opnd_t operand.
*/
#define INSTR_CREATE_mla(dc, Rd, Rn, Rm, Ra) \
instr_create_1dst_3src((dc), OP_mla, (Rd), (Rn), (Rm), (Ra))
#define INSTR_CREATE_mlas(dc, Rd, Rn, Rm, Ra) \
instr_create_1dst_3src((dc), OP_mlas, (Rd), (Rn), (Rm), (Ra))
#define INSTR_CREATE_mls(dc, Rd, Rn, Rm, Ra) \
instr_create_1dst_3src((dc), OP_mls, (Rd), (Rn), (Rm), (Ra))
#define INSTR_CREATE_smlabb(dc, Rd, Rn, Rm, Ra) \
instr_create_1dst_3src((dc), OP_smlabb, (Rd), (Rn), (Rm), (Ra))
#define INSTR_CREATE_smlabt(dc, Rd, Rn, Rm, Ra) \
instr_create_1dst_3src((dc), OP_smlabt, (Rd), (Rn), (Rm), (Ra))
#define INSTR_CREATE_smlad(dc, Rd, Rn, Rm, Ra) \
instr_create_1dst_3src((dc), OP_smlad, (Rd), (Rn), (Rm), (Ra))
#define INSTR_CREATE_smladx(dc, Rd, Rn, Rm, Ra) \
instr_create_1dst_3src((dc), OP_smladx, (Rd), (Rn), (Rm), (Ra))
#define INSTR_CREATE_smlatb(dc, Rd, Rn, Rm, Ra) \
instr_create_1dst_3src((dc), OP_smlatb, (Rd), (Rn), (Rm), (Ra))
#define INSTR_CREATE_smlatt(dc, Rd, Rn, Rm, Ra) \
instr_create_1dst_3src((dc), OP_smlatt, (Rd), (Rn), (Rm), (Ra))
#define INSTR_CREATE_smlawb(dc, Rd, Rn, Rm, Ra) \
instr_create_1dst_3src((dc), OP_smlawb, (Rd), (Rn), (Rm), (Ra))
#define INSTR_CREATE_smlawt(dc, Rd, Rn, Rm, Ra) \
instr_create_1dst_3src((dc), OP_smlawt, (Rd), (Rn), (Rm), (Ra))
#define INSTR_CREATE_smmla(dc, Rd, Rn, Rm, Ra) \
instr_create_1dst_3src((dc), OP_smmla, (Rd), (Rn), (Rm), (Ra))
#define INSTR_CREATE_smmlar(dc, Rd, Rn, Rm, Ra) \
instr_create_1dst_3src((dc), OP_smmlar, (Rd), (Rn), (Rm), (Ra))
#define INSTR_CREATE_smmls(dc, Rd, Rn, Rm, Ra) \
instr_create_1dst_3src((dc), OP_smmls, (Rd), (Rn), (Rm), (Ra))
#define INSTR_CREATE_smmlsr(dc, Rd, Rn, Rm, Ra) \
instr_create_1dst_3src((dc), OP_smmlsr, (Rd), (Rn), (Rm), (Ra))
#define INSTR_CREATE_usada8(dc, Rd, Rn, Rm, Ra) \
instr_create_1dst_3src((dc), OP_usada8, (Rd), (Rn), (Rm), (Ra))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, Rd2, Rm, Rn) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param Rd2 The second destination register opnd_t operand.
* \param Rm The source register opnd_t operand.
* \param Rn The source register opnd_t operand.
*/
#define INSTR_CREATE_smlalbb(dc, Rd, Rd2, Rm, Rn) \
instr_create_2dst_4src((dc), OP_smlalbb, (Rd), (Rd2), (Rd), (Rd2), (Rm), (Rn))
#define INSTR_CREATE_smlalbt(dc, Rd, Rd2, Rm, Rn) \
instr_create_2dst_4src((dc), OP_smlalbt, (Rd), (Rd2), (Rd), (Rd2), (Rm), (Rn))
#define INSTR_CREATE_smlaltb(dc, Rd, Rd2, Rm, Rn) \
instr_create_2dst_4src((dc), OP_smlaltb, (Rd), (Rd2), (Rd), (Rd2), (Rm), (Rn))
#define INSTR_CREATE_smlaltt(dc, Rd, Rd2, Rm, Rn) \
instr_create_2dst_4src((dc), OP_smlaltt, (Rd), (Rd2), (Rd), (Rd2), (Rm), (Rn))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, Rd2, Rn, Rm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param Rd2 The second destination register opnd_t operand.
* \param Rn The source register opnd_t operand.
* \param Rm The second source register opnd_t operand.
*/
#define INSTR_CREATE_smlal(dc, Rd, Rd2, Rn, Rm) \
instr_create_2dst_2src((dc), OP_smlal, (Rd), (Rd2), (Rn), (Rm))
#define INSTR_CREATE_smlald(dc, Rd, Rd2, Rn, Rm) \
instr_create_2dst_2src((dc), OP_smlald, (Rd), (Rd2), (Rn), (Rm))
#define INSTR_CREATE_smlaldx(dc, Rd, Rd2, Rn, Rm) \
instr_create_2dst_2src((dc), OP_smlaldx, (Rd), (Rd2), (Rn), (Rm))
#define INSTR_CREATE_smlals(dc, Rd, Rd2, Rn, Rm) \
instr_create_2dst_2src((dc), OP_smlals, (Rd), (Rd2), (Rn), (Rm))
#define INSTR_CREATE_smlsd(dc, Rd, Rd2, Rn, Rm) \
instr_create_2dst_2src((dc), OP_smlsd, (Rd), (Rd2), (Rn), (Rm))
#define INSTR_CREATE_smlsdx(dc, Rd, Rd2, Rn, Rm) \
instr_create_2dst_2src((dc), OP_smlsdx, (Rd), (Rd2), (Rn), (Rm))
#define INSTR_CREATE_smlsld(dc, Rd, Rd2, Rn, Rm) \
instr_create_2dst_2src((dc), OP_smlsld, (Rd), (Rd2), (Rn), (Rm))
#define INSTR_CREATE_smlsldx(dc, Rd, Rd2, Rn, Rm) \
instr_create_2dst_2src((dc), OP_smlsldx, (Rd), (Rd2), (Rn), (Rm))
#define INSTR_CREATE_smull(dc, Rd, Rd2, Rn, Rm) \
instr_create_2dst_2src((dc), OP_smull, (Rd), (Rd2), (Rn), (Rm))
#define INSTR_CREATE_smulls(dc, Rd, Rd2, Rn, Rm) \
instr_create_2dst_2src((dc), OP_smulls, (Rd), (Rd2), (Rn), (Rm))
#define INSTR_CREATE_umaal(dc, Rd, Rd2, Rn, Rm) \
instr_create_2dst_2src((dc), OP_umaal, (Rd), (Rd2), (Rn), (Rm))
#define INSTR_CREATE_umlal(dc, Rd, Rd2, Rn, Rm) \
instr_create_2dst_2src((dc), OP_umlal, (Rd), (Rd2), (Rn), (Rm))
#define INSTR_CREATE_umlals(dc, Rd, Rd2, Rn, Rm) \
instr_create_2dst_2src((dc), OP_umlals, (Rd), (Rd2), (Rn), (Rm))
#define INSTR_CREATE_umull(dc, Rd, Rd2, Rn, Rm) \
instr_create_2dst_2src((dc), OP_umull, (Rd), (Rd2), (Rn), (Rm))
#define INSTR_CREATE_umulls(dc, Rd, Rd2, Rn, Rm) \
instr_create_2dst_2src((dc), OP_umulls, (Rd), (Rd2), (Rn), (Rm))
/* @} */ /* end doxygen group */
/** @name Signature: (imm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param imm The integer constant opnd_t operand.
*/
#define INSTR_CREATE_b(dc, imm) \
instr_create_0dst_1src((dc), OP_b, (imm))
#define INSTR_CREATE_bkpt(dc, imm) \
instr_create_1dst_0src((dc), OP_bkpt, (imm))
#define INSTR_CREATE_bl(dc, imm) \
instr_create_1dst_1src((dc), OP_bl, opnd_create_reg(DR_REG_LR), (imm))
#define INSTR_CREATE_blx(dc, imm) \
instr_create_0dst_1src((dc), OP_blx, (imm))
#define INSTR_CREATE_cps(dc, imm) \
instr_create_0dst_1src((dc), OP_cps, (imm))
#define INSTR_CREATE_cpsid(dc, imm) \
instr_create_0dst_1src((dc), OP_cpsid, (imm))
#define INSTR_CREATE_cpsie(dc, imm) \
instr_create_0dst_1src((dc), OP_cpsie, (imm))
#define INSTR_CREATE_dbg(dc, imm) \
instr_create_1dst_0src((dc), OP_dbg, (imm))
#define INSTR_CREATE_dmb(dc, imm) \
instr_create_0dst_1src((dc), OP_dmb, (imm))
#define INSTR_CREATE_dsb(dc, imm) \
instr_create_0dst_1src((dc), OP_dsb, (imm))
#define INSTR_CREATE_hlt(dc, imm) \
instr_create_1dst_0src((dc), OP_hlt, (imm))
#define INSTR_CREATE_hvc(dc, imm) \
instr_create_1dst_0src((dc), OP_hvc, (imm))
#define INSTR_CREATE_isb(dc, imm) \
instr_create_0dst_1src((dc), OP_isb, (imm))
#define INSTR_CREATE_setend(dc, imm) \
instr_create_0dst_1src((dc), OP_setend, (imm))
#define INSTR_CREATE_smc(dc, imm) \
instr_create_0dst_1src((dc), OP_smc, (imm))
#define INSTR_CREATE_svc(dc, imm) \
instr_create_0dst_1src((dc), OP_svc, (imm))
#define INSTR_CREATE_udf(dc, imm) \
instr_create_0dst_1src((dc), OP_udf, (imm))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, imm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param imm The integer constant opnd_t operand.
*/
#define INSTR_CREATE_movt(dc, Rd, imm) \
instr_create_1dst_1src((dc), OP_movt, (Rd), (imm))
#define INSTR_CREATE_movw(dc, Rd, imm) \
instr_create_1dst_1src((dc), OP_movw, (Rd), (imm))
/* @} */ /* end doxygen group */
/** @name Signature: (imm, imm2) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param imm The integer constant opnd_t operand.
* \param imm2 The second integer constant opnd_t operand.
*/
#define INSTR_CREATE_cpsid_noflags(dc, imm, imm2) \
instr_create_0dst_2src((dc), OP_cpsid, (imm), (imm2))
#define INSTR_CREATE_cpsie_noflags(dc, imm, imm2) \
instr_create_0dst_2src((dc), OP_cpsie, (imm), (imm2))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, Rm_or_imm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param Rm_or_imm The source register, or integer constant, opnd_t operand.
*/
#define INSTR_CREATE_mov(dc, Rd, Rm_or_imm) \
instr_create_1dst_1src((dc), OP_mov, (Rd), (Rm_or_imm))
#define INSTR_CREATE_movs(dc, Rd, Rm_or_imm) \
instr_create_1dst_1src((dc), OP_movs, (Rd), (Rm_or_imm))
#define INSTR_CREATE_mvn(dc, Rd, Rm_or_imm) \
(opnd_is_reg(Rm_or_imm) ? \
INSTR_CREATE_mvn_shimm((dc), (Rd), (Rm_or_imm), \
OPND_CREATE_INT8(DR_SHIFT_NONE), OPND_CREATE_INT8(0)) : \
instr_create_1dst_1src((dc), OP_mvn, (Rd), (Rm_or_imm)))
#define INSTR_CREATE_mvns(dc, Rd, Rm_or_imm) \
(opnd_is_reg(Rm_or_imm) ? \
INSTR_CREATE_mvns_shimm((dc), (Rd), (Rm_or_imm), \
OPND_CREATE_INT8(DR_SHIFT_NONE), OPND_CREATE_INT8(0)) : \
instr_create_1dst_1src((dc), OP_mvns, (Rd), (Rm_or_imm)))
/* @} */ /* end doxygen group */
/** @name Signature: (Rn, Rm_or_imm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rn The source register opnd_t operand.
* \param Rm_or_imm The second source register, or integer constant, opnd_t operand.
*/
#define INSTR_CREATE_cmn(dc, Rn, Rm_or_imm) \
(opnd_is_reg(Rm_or_imm) ? \
INSTR_CREATE_cmn_shimm((dc), (Rn), (Rm_or_imm), \
OPND_CREATE_INT8(DR_SHIFT_NONE), OPND_CREATE_INT8(0)) : \
instr_create_0dst_2src((dc), OP_cmn, (Rn), (Rm_or_imm)))
#define INSTR_CREATE_cmp(dc, Rn, Rm_or_imm) \
(opnd_is_reg(Rm_or_imm) ? \
INSTR_CREATE_cmp_shimm((dc), (Rn), (Rm_or_imm), \
OPND_CREATE_INT8(DR_SHIFT_NONE), OPND_CREATE_INT8(0)) : \
instr_create_0dst_2src((dc), OP_cmp, (Rn), (Rm_or_imm)))
#define INSTR_CREATE_teq(dc, Rn, Rm_or_imm) \
(opnd_is_reg(Rm_or_imm) ? \
INSTR_CREATE_teq_shimm((dc), (Rn), (Rm_or_imm), \
OPND_CREATE_INT8(DR_SHIFT_NONE), OPND_CREATE_INT8(0)) : \
instr_create_0dst_2src((dc), OP_teq, (Rn), (Rm_or_imm)))
#define INSTR_CREATE_tst(dc, Rn, Rm_or_imm) \
(opnd_is_reg(Rm_or_imm) ? \
INSTR_CREATE_tst_shimm((dc), (Rn), (Rm_or_imm), \
OPND_CREATE_INT8(DR_SHIFT_NONE), OPND_CREATE_INT8(0)) : \
instr_create_0dst_2src((dc), OP_tst, (Rn), (Rm_or_imm)))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, imm, Rm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param imm The integer constant opnd_t operand.
* \param Rm The source register opnd_t operand.
*/
#define INSTR_CREATE_ssat16(dc, Rd, imm, Rm) \
instr_create_1dst_2src((dc), OP_ssat16, (Rd), (imm), (Rm))
#define INSTR_CREATE_usat16(dc, Rd, imm, Rm) \
instr_create_1dst_2src((dc), OP_usat16, (Rd), (imm), (Rm))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, imm, imm2) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param imm The integer constant opnd_t operand.
* \param imm2 The second integer constant opnd_t operand.
*/
#define INSTR_CREATE_bfc(dc, Rd, imm, imm2) \
instr_create_1dst_2src((dc), OP_bfc, (Rd), (imm), (imm2))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, Rm, Rn_or_imm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param Rm The source register opnd_t operand.
* \param Rn_or_imm The source register, or integer constant, opnd_t operand.
*/
#define INSTR_CREATE_asr(dc, Rd, Rm, Rn_or_imm) \
instr_create_1dst_2src((dc), OP_asr, (Rd), (Rm), (Rn_or_imm))
#define INSTR_CREATE_asrs(dc, Rd, Rm, Rn_or_imm) \
instr_create_1dst_2src((dc), OP_asrs, (Rd), (Rm), (Rn_or_imm))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, Rn, Rm_or_imm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param Rn The source register opnd_t operand.
* \param Rm_or_imm The second source register, or integer constant, opnd_t operand.
*/
#define INSTR_CREATE_adc(dc, Rd, Rn, Rm_or_imm) \
(opnd_is_reg(Rm_or_imm) ? \
INSTR_CREATE_adc_shimm((dc), (Rd), (Rn), (Rm_or_imm), \
OPND_CREATE_INT8(DR_SHIFT_NONE), OPND_CREATE_INT8(0)) : \
instr_create_1dst_2src((dc), OP_adc, (Rd), (Rn), (Rm_or_imm)))
#define INSTR_CREATE_adcs(dc, Rd, Rn, Rm_or_imm) \
(opnd_is_reg(Rm_or_imm) ? \
INSTR_CREATE_adcs_shimm((dc), (Rd), (Rn), (Rm_or_imm), \
OPND_CREATE_INT8(DR_SHIFT_NONE), OPND_CREATE_INT8(0)) : \
instr_create_1dst_2src((dc), OP_adcs, (Rd), (Rn), (Rm_or_imm)))
#define INSTR_CREATE_add(dc, Rd, Rn, Rm_or_imm) \
(opnd_is_reg(Rm_or_imm) ? \
INSTR_CREATE_add_shimm((dc), (Rd), (Rn), (Rm_or_imm), \
OPND_CREATE_INT8(DR_SHIFT_NONE), OPND_CREATE_INT8(0)) : \
instr_create_1dst_2src((dc), OP_add, (Rd), (Rn), (Rm_or_imm)))
#define INSTR_CREATE_adds(dc, Rd, Rn, Rm_or_imm) \
(opnd_is_reg(Rm_or_imm) ? \
INSTR_CREATE_adds_shimm((dc), (Rd), (Rn), (Rm_or_imm), \
OPND_CREATE_INT8(DR_SHIFT_NONE), OPND_CREATE_INT8(0)) : \
instr_create_1dst_2src((dc), OP_adds, (Rd), (Rn), (Rm_or_imm)))
#define INSTR_CREATE_and(dc, Rd, Rn, Rm_or_imm) \
(opnd_is_reg(Rm_or_imm) ? \
INSTR_CREATE_and_shimm((dc), (Rd), (Rn), (Rm_or_imm), \
OPND_CREATE_INT8(DR_SHIFT_NONE), OPND_CREATE_INT8(0)) : \
instr_create_1dst_2src((dc), OP_and, (Rd), (Rn), (Rm_or_imm)))
#define INSTR_CREATE_ands(dc, Rd, Rn, Rm_or_imm) \
(opnd_is_reg(Rm_or_imm) ? \
INSTR_CREATE_ands_shimm((dc), (Rd), (Rn), (Rm_or_imm), \
OPND_CREATE_INT8(DR_SHIFT_NONE), OPND_CREATE_INT8(0)) : \
instr_create_1dst_2src((dc), OP_ands, (Rd), (Rn), (Rm_or_imm)))
#define INSTR_CREATE_bic(dc, Rd, Rn, Rm_or_imm) \
(opnd_is_reg(Rm_or_imm) ? \
INSTR_CREATE_bic_shimm((dc), (Rd), (Rn), (Rm_or_imm), \
OPND_CREATE_INT8(DR_SHIFT_NONE), OPND_CREATE_INT8(0)) : \
instr_create_1dst_2src((dc), OP_bic, (Rd), (Rn), (Rm_or_imm)))
#define INSTR_CREATE_bics(dc, Rd, Rn, Rm_or_imm) \
(opnd_is_reg(Rm_or_imm) ? \
INSTR_CREATE_bics_shimm((dc), (Rd), (Rn), (Rm_or_imm), \
OPND_CREATE_INT8(DR_SHIFT_NONE), OPND_CREATE_INT8(0)) : \
instr_create_1dst_2src((dc), OP_bics, (Rd), (Rn), (Rm_or_imm)))
#define INSTR_CREATE_eor(dc, Rd, Rn, Rm_or_imm) \
(opnd_is_reg(Rm_or_imm) ? \
INSTR_CREATE_eor_shimm((dc), (Rd), (Rn), (Rm_or_imm), \
OPND_CREATE_INT8(DR_SHIFT_NONE), OPND_CREATE_INT8(0)) : \
instr_create_1dst_2src((dc), OP_eor, (Rd), (Rn), (Rm_or_imm)))
#define INSTR_CREATE_eors(dc, Rd, Rn, Rm_or_imm) \
(opnd_is_reg(Rm_or_imm) ? \
INSTR_CREATE_eors_shimm((dc), (Rd), (Rn), (Rm_or_imm), \
OPND_CREATE_INT8(DR_SHIFT_NONE), OPND_CREATE_INT8(0)) : \
instr_create_1dst_2src((dc), OP_eors, (Rd), (Rn), (Rm_or_imm)))
#define INSTR_CREATE_lsl(dc, Rd, Rn, Rm_or_imm) \
instr_create_1dst_2src((dc), OP_lsl, (Rd), (Rn), (Rm_or_imm))
#define INSTR_CREATE_lsls(dc, Rd, Rn, Rm_or_imm) \
instr_create_1dst_2src((dc), OP_lsls, (Rd), (Rn), (Rm_or_imm))
#define INSTR_CREATE_lsr(dc, Rd, Rn, Rm_or_imm) \
instr_create_1dst_2src((dc), OP_lsr, (Rd), (Rn), (Rm_or_imm))
#define INSTR_CREATE_lsrs(dc, Rd, Rn, Rm_or_imm) \
instr_create_1dst_2src((dc), OP_lsrs, (Rd), (Rn), (Rm_or_imm))
#define INSTR_CREATE_orr(dc, Rd, Rn, Rm_or_imm) \
(opnd_is_reg(Rm_or_imm) ? \
INSTR_CREATE_orr_shimm((dc), (Rd), (Rn), (Rm_or_imm), \
OPND_CREATE_INT8(DR_SHIFT_NONE), OPND_CREATE_INT8(0)) : \
instr_create_1dst_2src((dc), OP_orr, (Rd), (Rn), (Rm_or_imm)))
#define INSTR_CREATE_orrs(dc, Rd, Rn, Rm_or_imm) \
(opnd_is_reg(Rm_or_imm) ? \
INSTR_CREATE_orrs_shimm((dc), (Rd), (Rn), (Rm_or_imm), \
OPND_CREATE_INT8(DR_SHIFT_NONE), OPND_CREATE_INT8(0)) : \
instr_create_1dst_2src((dc), OP_orrs, (Rd), (Rn), (Rm_or_imm)))
#define INSTR_CREATE_ror(dc, Rd, Rn, Rm_or_imm) \
instr_create_1dst_2src((dc), OP_ror, (Rd), (Rn), (Rm_or_imm))
#define INSTR_CREATE_rors(dc, Rd, Rn, Rm_or_imm) \
instr_create_1dst_2src((dc), OP_rors, (Rd), (Rn), (Rm_or_imm))
#define INSTR_CREATE_rsb(dc, Rd, Rn, Rm_or_imm) \
(opnd_is_reg(Rm_or_imm) ? \
INSTR_CREATE_rsb_shimm((dc), (Rd), (Rn), (Rm_or_imm), \
OPND_CREATE_INT8(DR_SHIFT_NONE), OPND_CREATE_INT8(0)) : \
instr_create_1dst_2src((dc), OP_rsb, (Rd), (Rn), (Rm_or_imm)))
#define INSTR_CREATE_rsbs(dc, Rd, Rn, Rm_or_imm) \
(opnd_is_reg(Rm_or_imm) ? \
INSTR_CREATE_rsbs_shimm((dc), (Rd), (Rn), (Rm_or_imm), \
OPND_CREATE_INT8(DR_SHIFT_NONE), OPND_CREATE_INT8(0)) : \
instr_create_1dst_2src((dc), OP_rsbs, (Rd), (Rn), (Rm_or_imm)))
#define INSTR_CREATE_rsc(dc, Rd, Rn, Rm_or_imm) \
(opnd_is_reg(Rm_or_imm) ? \
INSTR_CREATE_rsc_shimm((dc), (Rd), (Rn), (Rm_or_imm), \
OPND_CREATE_INT8(DR_SHIFT_NONE), OPND_CREATE_INT8(0)) : \
instr_create_1dst_2src((dc), OP_rsc, (Rd), (Rn), (Rm_or_imm)))
#define INSTR_CREATE_rscs(dc, Rd, Rn, Rm_or_imm) \
(opnd_is_reg(Rm_or_imm) ? \
INSTR_CREATE_rscs_shimm((dc), (Rd), (Rn), (Rm_or_imm), \
OPND_CREATE_INT8(DR_SHIFT_NONE), OPND_CREATE_INT8(0)) : \
instr_create_1dst_2src((dc), OP_rscs, (Rd), (Rn), (Rm_or_imm)))
#define INSTR_CREATE_sbc(dc, Rd, Rn, Rm_or_imm) \
(opnd_is_reg(Rm_or_imm) ? \
INSTR_CREATE_sbc_shimm((dc), (Rd), (Rn), (Rm_or_imm), \
OPND_CREATE_INT8(DR_SHIFT_NONE), OPND_CREATE_INT8(0)) : \
instr_create_1dst_2src((dc), OP_sbc, (Rd), (Rn), (Rm_or_imm)))
#define INSTR_CREATE_sbcs(dc, Rd, Rn, Rm_or_imm) \
(opnd_is_reg(Rm_or_imm) ? \
INSTR_CREATE_sbcs_shimm((dc), (Rd), (Rn), (Rm_or_imm), \
OPND_CREATE_INT8(DR_SHIFT_NONE), OPND_CREATE_INT8(0)) : \
instr_create_1dst_2src((dc), OP_sbcs, (Rd), (Rn), (Rm_or_imm)))
#define INSTR_CREATE_sub(dc, Rd, Rn, Rm_or_imm) \
(opnd_is_reg(Rm_or_imm) ? \
INSTR_CREATE_sub_shimm((dc), (Rd), (Rn), (Rm_or_imm), \
OPND_CREATE_INT8(DR_SHIFT_NONE), OPND_CREATE_INT8(0)) : \
instr_create_1dst_2src((dc), OP_sub, (Rd), (Rn), (Rm_or_imm)))
#define INSTR_CREATE_subs(dc, Rd, Rn, Rm_or_imm) \
(opnd_is_reg(Rm_or_imm) ? \
INSTR_CREATE_subs_shimm((dc), (Rd), (Rn), (Rm_or_imm), \
OPND_CREATE_INT8(DR_SHIFT_NONE), OPND_CREATE_INT8(0)) : \
instr_create_1dst_2src((dc), OP_subs, (Rd), (Rn), (Rm_or_imm)))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, statreg, imm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param statreg The status register (usually DR_REG_CPSR) opnd_t operand.
* \param imm The integer constant opnd_t operand.
*/
#define INSTR_CREATE_mrs_priv(dc, Rd, statreg, imm) \
instr_create_1dst_2src((dc), OP_mrs_priv, (Rd), (statreg), (imm))
/* @} */ /* end doxygen group */
/** @name Signature: (statreg, imm, Rn) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param statreg The status register (usually DR_REG_CPSR) opnd_t operand.
* \param imm The integer constant opnd_t operand.
* \param Rn The source register opnd_t operand.
*/
#define INSTR_CREATE_msr_priv(dc, statreg, imm, Rn) \
instr_create_1dst_2src((dc), OP_msr_priv, (statreg), (imm), (Rn))
/* @} */ /* end doxygen group */
/** @name Signature: (statreg, imm, imm2) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param statreg The status register (usually DR_REG_CPSR) opnd_t operand.
* \param imm The integer constant opnd_t operand.
* \param imm2 The second integer constant opnd_t operand.
*/
#define INSTR_CREATE_msr_imm(dc, statreg, imm, imm2) \
instr_create_1dst_2src((dc), OP_msr, (statreg), (imm), (imm2))
/* @} */ /* end doxygen group */
/** @name Signature: (statreg, imm_msr, Rn) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param statreg The status register (usually DR_REG_CPSR) opnd_t operand.
* \param imm_msr The integer constant (typically from OPND_CREATE_INT_MSR*) opnd_t operand.
* \param Rn The source register opnd_t operand.
*/
#define INSTR_CREATE_msr(dc, statreg, imm_msr, Rn) \
instr_create_1dst_2src((dc), OP_msr, (statreg), (imm_msr), (Rn))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, Rn, Rm, imm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param Rn The source register opnd_t operand.
* \param Rm The second source register opnd_t operand.
* \param imm The integer constant opnd_t operand.
*/
#define INSTR_CREATE_sxtab(dc, Rd, Rn, Rm, imm) \
instr_create_1dst_3src((dc), OP_sxtab, (Rd), (Rn), (Rm), (imm))
#define INSTR_CREATE_sxtab16(dc, Rd, Rn, Rm, imm) \
instr_create_1dst_3src((dc), OP_sxtab16, (Rd), (Rn), (Rm), (imm))
#define INSTR_CREATE_sxtah(dc, Rd, Rn, Rm, imm) \
instr_create_1dst_3src((dc), OP_sxtah, (Rd), (Rn), (Rm), (imm))
#define INSTR_CREATE_uxtab(dc, Rd, Rn, Rm, imm) \
instr_create_1dst_3src((dc), OP_uxtab, (Rd), (Rn), (Rm), (imm))
#define INSTR_CREATE_uxtab16(dc, Rd, Rn, Rm, imm) \
instr_create_1dst_3src((dc), OP_uxtab16, (Rd), (Rn), (Rm), (imm))
#define INSTR_CREATE_uxtah(dc, Rd, Rn, Rm, imm) \
instr_create_1dst_3src((dc), OP_uxtah, (Rd), (Rn), (Rm), (imm))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, Rm, imm, imm2) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param Rm The source register opnd_t operand.
* \param imm The integer constant opnd_t operand.
* \param imm2 The second integer constant opnd_t operand.
*/
#define INSTR_CREATE_bfi(dc, Rd, Rm, imm, imm2) \
instr_create_1dst_3src((dc), OP_bfi, (Rd), (Rm), (imm), (imm2))
#define INSTR_CREATE_sbfx(dc, Rd, Rm, imm, imm2) \
instr_create_1dst_3src((dc), OP_sbfx, (Rd), (Rm), (imm), (imm2))
#define INSTR_CREATE_ubfx(dc, Rd, Rm, imm, imm2) \
instr_create_1dst_3src((dc), OP_ubfx, (Rd), (Rm), (imm), (imm2))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, Rm, shift, Rs) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param Rm The source register opnd_t operand.
* \param shift The shift type integer constant opnd_t operand.
* \param Rs The third source register opnd_t operand.
*/
#define INSTR_CREATE_mvn_shreg(dc, Rd, Rm, shift, Rs) \
instr_create_1dst_3src((dc), OP_mvn, (Rd), (Rm), (shift), (Rs))
#define INSTR_CREATE_mvns_shreg(dc, Rd, Rm, shift, Rs) \
instr_create_1dst_3src((dc), OP_mvns, (Rd), (Rm), (shift), (Rs))
/* @} */ /* end doxygen group */
/** @name Signature: (Rn, Rm, shift, Rs) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rn The source register opnd_t operand.
* \param Rm The second source register opnd_t operand.
* \param shift The shift type integer constant opnd_t operand.
* \param Rs The third source register opnd_t operand.
*/
#define INSTR_CREATE_cmn_shreg(dc, Rn, Rm, shift, Rs) \
instr_create_0dst_4src((dc), OP_cmn, (Rn), (Rm), (shift), (Rs))
#define INSTR_CREATE_cmp_shreg(dc, Rn, Rm, shift, Rs) \
instr_create_0dst_4src((dc), OP_cmp, (Rn), (Rm), (shift), (Rs))
#define INSTR_CREATE_teq_shreg(dc, Rn, Rm, shift, Rs) \
instr_create_0dst_4src((dc), OP_teq, (Rn), (Rm), (shift), (Rs))
#define INSTR_CREATE_tst_shreg(dc, Rn, Rm, shift, Rs) \
instr_create_0dst_4src((dc), OP_tst, (Rn), (Rm), (shift), (Rs))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, Rn, Rm, shift, Rs) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param Rn The source register opnd_t operand.
* \param Rm The second source register opnd_t operand.
* \param shift The shift type integer constant opnd_t operand.
* \param Rs The third source register opnd_t operand.
*/
#define INSTR_CREATE_adc_shreg(dc, Rd, Rn, Rm, shift, Rs) \
instr_create_1dst_4src((dc), OP_adc, (Rd), (Rn), (Rm), (shift), (Rs))
#define INSTR_CREATE_adcs_shreg(dc, Rd, Rn, Rm, shift, Rs) \
instr_create_1dst_4src((dc), OP_adcs, (Rd), (Rn), (Rm), (shift), (Rs))
#define INSTR_CREATE_add_shreg(dc, Rd, Rn, Rm, shift, Rs) \
instr_create_1dst_4src((dc), OP_add, (Rd), (Rn), (Rm), (shift), (Rs))
#define INSTR_CREATE_adds_shreg(dc, Rd, Rn, Rm, shift, Rs) \
instr_create_1dst_4src((dc), OP_adds, (Rd), (Rn), (Rm), (shift), (Rs))
#define INSTR_CREATE_and_shreg(dc, Rd, Rn, Rm, shift, Rs) \
instr_create_1dst_4src((dc), OP_and, (Rd), (Rn), (Rm), (shift), (Rs))
#define INSTR_CREATE_ands_shreg(dc, Rd, Rn, Rm, shift, Rs) \
instr_create_1dst_4src((dc), OP_ands, (Rd), (Rn), (Rm), (shift), (Rs))
#define INSTR_CREATE_bic_shreg(dc, Rd, Rn, Rm, shift, Rs) \
instr_create_1dst_4src((dc), OP_bic, (Rd), (Rn), (Rm), (shift), (Rs))
#define INSTR_CREATE_bics_shreg(dc, Rd, Rn, Rm, shift, Rs) \
instr_create_1dst_4src((dc), OP_bics, (Rd), (Rn), (Rm), (shift), (Rs))
#define INSTR_CREATE_eor_shreg(dc, Rd, Rn, Rm, shift, Rs) \
instr_create_1dst_4src((dc), OP_eor, (Rd), (Rn), (Rm), (shift), (Rs))
#define INSTR_CREATE_eors_shreg(dc, Rd, Rn, Rm, shift, Rs) \
instr_create_1dst_4src((dc), OP_eors, (Rd), (Rn), (Rm), (shift), (Rs))
#define INSTR_CREATE_orr_shreg(dc, Rd, Rn, Rm, shift, Rs) \
instr_create_1dst_4src((dc), OP_orr, (Rd), (Rn), (Rm), (shift), (Rs))
#define INSTR_CREATE_orrs_shreg(dc, Rd, Rn, Rm, shift, Rs) \
instr_create_1dst_4src((dc), OP_orrs, (Rd), (Rn), (Rm), (shift), (Rs))
#define INSTR_CREATE_rsb_shreg(dc, Rd, Rn, Rm, shift, Rs) \
instr_create_1dst_4src((dc), OP_rsb, (Rd), (Rn), (Rm), (shift), (Rs))
#define INSTR_CREATE_rsbs_shreg(dc, Rd, Rn, Rm, shift, Rs) \
instr_create_1dst_4src((dc), OP_rsbs, (Rd), (Rn), (Rm), (shift), (Rs))
#define INSTR_CREATE_rsc_shreg(dc, Rd, Rn, Rm, shift, Rs) \
instr_create_1dst_4src((dc), OP_rsc, (Rd), (Rn), (Rm), (shift), (Rs))
#define INSTR_CREATE_rscs_shreg(dc, Rd, Rn, Rm, shift, Rs) \
instr_create_1dst_4src((dc), OP_rscs, (Rd), (Rn), (Rm), (shift), (Rs))
#define INSTR_CREATE_sbc_shreg(dc, Rd, Rn, Rm, shift, Rs) \
instr_create_1dst_4src((dc), OP_sbc, (Rd), (Rn), (Rm), (shift), (Rs))
#define INSTR_CREATE_sbcs_shreg(dc, Rd, Rn, Rm, shift, Rs) \
instr_create_1dst_4src((dc), OP_sbcs, (Rd), (Rn), (Rm), (shift), (Rs))
#define INSTR_CREATE_sub_shreg(dc, Rd, Rn, Rm, shift, Rs) \
instr_create_1dst_4src((dc), OP_sub, (Rd), (Rn), (Rm), (shift), (Rs))
#define INSTR_CREATE_subs_shreg(dc, Rd, Rn, Rm, shift, Rs) \
instr_create_1dst_4src((dc), OP_subs, (Rd), (Rn), (Rm), (shift), (Rs))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, Rm, shift, imm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param Rm The source register opnd_t operand.
* \param shift The shift type integer constant opnd_t operand.
* \param imm The integer constant opnd_t operand.
*/
#define INSTR_CREATE_mvn_shimm(dc, Rd, Rm, shift, imm) \
instr_create_1dst_3src((dc), OP_mvn, (Rd), (Rm), (shift), (imm))
#define INSTR_CREATE_mvns_shimm(dc, Rd, Rm, shift, imm) \
instr_create_1dst_3src((dc), OP_mvns, (Rd), (Rm), (shift), (imm))
/* @} */ /* end doxygen group */
/** @name Signature: (Rn, Rm, shift, imm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rn The source register opnd_t operand.
* \param Rm The second source register opnd_t operand.
* \param shift The shift type integer constant opnd_t operand.
* \param imm The integer constant opnd_t operand.
*/
#define INSTR_CREATE_cmn_shimm(dc, Rn, Rm, shift, imm) \
instr_create_0dst_4src((dc), OP_cmn, (Rn), (Rm), (shift), (imm))
#define INSTR_CREATE_cmp_shimm(dc, Rn, Rm, shift, imm) \
instr_create_0dst_4src((dc), OP_cmp, (Rn), (Rm), (shift), (imm))
#define INSTR_CREATE_teq_shimm(dc, Rn, Rm, shift, imm) \
instr_create_0dst_4src((dc), OP_teq, (Rn), (Rm), (shift), (imm))
#define INSTR_CREATE_tst_shimm(dc, Rn, Rm, shift, imm) \
instr_create_0dst_4src((dc), OP_tst, (Rn), (Rm), (shift), (imm))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, Rn, Rm, shift, imm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param Rn The source register opnd_t operand.
* \param Rm The second source register opnd_t operand.
* \param shift The shift type integer constant opnd_t operand.
* \param imm The integer constant opnd_t operand.
*/
#define INSTR_CREATE_adc_shimm(dc, Rd, Rn, Rm, shift, imm) \
instr_create_1dst_4src((dc), OP_adc, (Rd), (Rn), (Rm), (shift), (imm))
#define INSTR_CREATE_adcs_shimm(dc, Rd, Rn, Rm, shift, imm) \
instr_create_1dst_4src((dc), OP_adcs, (Rd), (Rn), (Rm), (shift), (imm))
#define INSTR_CREATE_add_shimm(dc, Rd, Rn, Rm, shift, imm) \
instr_create_1dst_4src((dc), OP_add, (Rd), (Rn), (Rm), (shift), (imm))
#define INSTR_CREATE_adds_shimm(dc, Rd, Rn, Rm, shift, imm) \
instr_create_1dst_4src((dc), OP_adds, (Rd), (Rn), (Rm), (shift), (imm))
#define INSTR_CREATE_and_shimm(dc, Rd, Rn, Rm, shift, imm) \
instr_create_1dst_4src((dc), OP_and, (Rd), (Rn), (Rm), (shift), (imm))
#define INSTR_CREATE_ands_shimm(dc, Rd, Rn, Rm, shift, imm) \
instr_create_1dst_4src((dc), OP_ands, (Rd), (Rn), (Rm), (shift), (imm))
#define INSTR_CREATE_bic_shimm(dc, Rd, Rn, Rm, shift, imm) \
instr_create_1dst_4src((dc), OP_bic, (Rd), (Rn), (Rm), (shift), (imm))
#define INSTR_CREATE_bics_shimm(dc, Rd, Rn, Rm, shift, imm) \
instr_create_1dst_4src((dc), OP_bics, (Rd), (Rn), (Rm), (shift), (imm))
#define INSTR_CREATE_eor_shimm(dc, Rd, Rn, Rm, shift, imm) \
instr_create_1dst_4src((dc), OP_eor, (Rd), (Rn), (Rm), (shift), (imm))
#define INSTR_CREATE_eors_shimm(dc, Rd, Rn, Rm, shift, imm) \
instr_create_1dst_4src((dc), OP_eors, (Rd), (Rn), (Rm), (shift), (imm))
#define INSTR_CREATE_orr_shimm(dc, Rd, Rn, Rm, shift, imm) \
instr_create_1dst_4src((dc), OP_orr, (Rd), (Rn), (Rm), (shift), (imm))
#define INSTR_CREATE_orrs_shimm(dc, Rd, Rn, Rm, shift, imm) \
instr_create_1dst_4src((dc), OP_orrs, (Rd), (Rn), (Rm), (shift), (imm))
#define INSTR_CREATE_pkhbt_shimm(dc, Rd, Rn, Rm, shift, imm) \
instr_create_1dst_4src((dc), OP_pkhbt, (Rd), (Rn), (Rm), (shift), (imm))
#define INSTR_CREATE_pkhtb_shimm(dc, Rd, Rn, Rm, shift, imm) \
instr_create_1dst_4src((dc), OP_pkhtb, (Rd), (Rn), (Rm), (shift), (imm))
#define INSTR_CREATE_rsb_shimm(dc, Rd, Rn, Rm, shift, imm) \
instr_create_1dst_4src((dc), OP_rsb, (Rd), (Rn), (Rm), (shift), (imm))
#define INSTR_CREATE_rsbs_shimm(dc, Rd, Rn, Rm, shift, imm) \
instr_create_1dst_4src((dc), OP_rsbs, (Rd), (Rn), (Rm), (shift), (imm))
#define INSTR_CREATE_rsc_shimm(dc, Rd, Rn, Rm, shift, imm) \
instr_create_1dst_4src((dc), OP_rsc, (Rd), (Rn), (Rm), (shift), (imm))
#define INSTR_CREATE_rscs_shimm(dc, Rd, Rn, Rm, shift, imm) \
instr_create_1dst_4src((dc), OP_rscs, (Rd), (Rn), (Rm), (shift), (imm))
#define INSTR_CREATE_sbc_shimm(dc, Rd, Rn, Rm, shift, imm) \
instr_create_1dst_4src((dc), OP_sbc, (Rd), (Rn), (Rm), (shift), (imm))
#define INSTR_CREATE_sbcs_shimm(dc, Rd, Rn, Rm, shift, imm) \
instr_create_1dst_4src((dc), OP_sbcs, (Rd), (Rn), (Rm), (shift), (imm))
#define INSTR_CREATE_sub_shimm(dc, Rd, Rn, Rm, shift, imm) \
instr_create_1dst_4src((dc), OP_sub, (Rd), (Rn), (Rm), (shift), (imm))
#define INSTR_CREATE_subs_shimm(dc, Rd, Rn, Rm, shift, imm) \
instr_create_1dst_4src((dc), OP_subs, (Rd), (Rn), (Rm), (shift), (imm))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, imm, Rm, shift, imm2) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param imm The integer constant opnd_t operand.
* \param Rm The source register opnd_t operand.
* \param shift The shift type integer constant opnd_t operand.
* \param imm2 The second integer constant opnd_t operand.
*/
#define INSTR_CREATE_ssat_shimm(dc, Rd, imm, Rm, shift, imm2) \
instr_create_1dst_4src((dc), OP_ssat, (Rd), (imm), (Rm), (shift), (imm2))
#define INSTR_CREATE_usat_shimm(dc, Rd, imm, Rm, shift, imm2) \
instr_create_1dst_4src((dc), OP_usat, (Rd), (imm), (Rm), (shift), (imm2))
/* @} */ /* end doxygen group */
/** @name Signature: (mem) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param mem The memory opnd_t operand.
*/
#define INSTR_CREATE_pld(dc, mem) \
instr_create_0dst_1src((dc), OP_pld, (mem))
#define INSTR_CREATE_pldw(dc, mem) \
instr_create_0dst_1src((dc), OP_pldw, (mem))
#define INSTR_CREATE_pli(dc, mem) \
instr_create_0dst_1src((dc), OP_pli, (mem))
#define INSTR_CREATE_rfeda(dc, mem) \
instr_create_0dst_1src((dc), OP_rfeda, (mem))
#define INSTR_CREATE_rfeda_wb(dc, mem) \
instr_create_1dst_2src((dc), OP_rfeda, opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)))
#define INSTR_CREATE_rfedb(dc, mem) \
instr_create_0dst_1src((dc), OP_rfedb, (mem))
#define INSTR_CREATE_rfedb_wb(dc, mem) \
instr_create_1dst_2src((dc), OP_rfedb, opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)))
#define INSTR_CREATE_rfeia(dc, mem) \
instr_create_0dst_1src((dc), OP_rfeia, (mem))
#define INSTR_CREATE_rfeia_wb(dc, mem) \
instr_create_1dst_2src((dc), OP_rfeia, opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)))
#define INSTR_CREATE_rfeib(dc, mem) \
instr_create_0dst_1src((dc), OP_rfeib, (mem))
#define INSTR_CREATE_rfeib_wb(dc, mem) \
instr_create_1dst_2src((dc), OP_rfeib, opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)))
#define INSTR_CREATE_srsda(dc, mem) \
instr_create_1dst_0src((dc), OP_srsda, (mem))
#define INSTR_CREATE_srsda_wb(dc, mem) \
instr_create_2dst_1src((dc), OP_srsda, (mem), opnd_create_reg(opnd_get_base(mem)), opnd_create_reg(opnd_get_base(mem)))
#define INSTR_CREATE_srsdb(dc, mem) \
instr_create_1dst_0src((dc), OP_srsdb, (mem))
#define INSTR_CREATE_srsdb_wb(dc, mem) \
instr_create_2dst_1src((dc), OP_srsdb, (mem), opnd_create_reg(opnd_get_base(mem)), opnd_create_reg(opnd_get_base(mem)))
#define INSTR_CREATE_srsia(dc, mem) \
instr_create_1dst_0src((dc), OP_srsia, (mem))
#define INSTR_CREATE_srsia_wb(dc, mem) \
instr_create_2dst_1src((dc), OP_srsia, (mem), opnd_create_reg(opnd_get_base(mem)), opnd_create_reg(opnd_get_base(mem)))
#define INSTR_CREATE_srsib(dc, mem) \
instr_create_1dst_0src((dc), OP_srsib, (mem))
#define INSTR_CREATE_srsib_wb(dc, mem) \
instr_create_2dst_1src((dc), OP_srsib, (mem), opnd_create_reg(opnd_get_base(mem)), opnd_create_reg(opnd_get_base(mem)))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, mem) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param mem The memory opnd_t operand.
*/
#define INSTR_CREATE_lda(dc, Rd, mem) \
instr_create_1dst_1src((dc), OP_lda, (Rd), (mem))
#define INSTR_CREATE_ldab(dc, Rd, mem) \
instr_create_1dst_1src((dc), OP_ldab, (Rd), (mem))
#define INSTR_CREATE_ldaex(dc, Rd, mem) \
instr_create_1dst_1src((dc), OP_ldaex, (Rd), (mem))
#define INSTR_CREATE_ldaexb(dc, Rd, mem) \
instr_create_1dst_1src((dc), OP_ldaexb, (Rd), (mem))
#define INSTR_CREATE_ldaexh(dc, Rd, mem) \
instr_create_1dst_1src((dc), OP_ldaexh, (Rd), (mem))
#define INSTR_CREATE_ldah(dc, Rd, mem) \
instr_create_1dst_1src((dc), OP_ldah, (Rd), (mem))
#define INSTR_CREATE_ldr(dc, Rd, mem) \
instr_create_1dst_1src((dc), OP_ldr, (Rd), (mem))
#define INSTR_CREATE_ldrb(dc, Rd, mem) \
instr_create_1dst_1src((dc), OP_ldrb, (Rd), (mem))
#define INSTR_CREATE_ldrex(dc, Rd, mem) \
instr_create_1dst_1src((dc), OP_ldrex, (Rd), (mem))
#define INSTR_CREATE_ldrexb(dc, Rd, mem) \
instr_create_1dst_1src((dc), OP_ldrexb, (Rd), (mem))
#define INSTR_CREATE_ldrexh(dc, Rd, mem) \
instr_create_1dst_1src((dc), OP_ldrexh, (Rd), (mem))
#define INSTR_CREATE_ldrh(dc, Rd, mem) \
instr_create_1dst_1src((dc), OP_ldrh, (Rd), (mem))
#define INSTR_CREATE_ldrsb(dc, Rd, mem) \
instr_create_1dst_1src((dc), OP_ldrsb, (Rd), (mem))
#define INSTR_CREATE_ldrsh(dc, Rd, mem) \
instr_create_1dst_1src((dc), OP_ldrsh, (Rd), (mem))
/* @} */ /* end doxygen group */
/** @name Signature: (mem, Rm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param mem The memory opnd_t operand.
* \param Rm The source register opnd_t operand.
*/
#define INSTR_CREATE_stl(dc, mem, Rm) \
instr_create_1dst_1src((dc), OP_stl, (mem), (Rm))
#define INSTR_CREATE_stlb(dc, mem, Rm) \
instr_create_1dst_1src((dc), OP_stlb, (mem), (Rm))
#define INSTR_CREATE_stlh(dc, mem, Rm) \
instr_create_1dst_1src((dc), OP_stlh, (mem), (Rm))
/* @} */ /* end doxygen group */
/** @name Signature: (mem, Rt) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param mem The memory opnd_t operand.
* \param Rt The source register opnd_t operand.
*/
#define INSTR_CREATE_str(dc, mem, Rt) \
instr_create_1dst_1src((dc), OP_str, (mem), (Rt))
#define INSTR_CREATE_strb(dc, mem, Rt) \
instr_create_1dst_1src((dc), OP_strb, (mem), (Rt))
#define INSTR_CREATE_strh(dc, mem, Rt) \
instr_create_1dst_1src((dc), OP_strh, (mem), (Rt))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, Rd2, mem) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param Rd2 The second destination register opnd_t operand.
* \param mem The memory opnd_t operand.
*/
#define INSTR_CREATE_ldaexd(dc, Rd, Rd2, mem) \
instr_create_2dst_1src((dc), OP_ldaexd, (Rd), (Rd2), (mem))
#define INSTR_CREATE_ldrd(dc, Rd, Rd2, mem) \
instr_create_2dst_1src((dc), OP_ldrd, (Rd), (Rd2), (mem))
#define INSTR_CREATE_ldrexd(dc, Rd, Rd2, mem) \
instr_create_2dst_1src((dc), OP_ldrexd, (Rd), (Rd2), (mem))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, mem, Rm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param mem The memory opnd_t operand.
* \param Rm The source register opnd_t operand.
*/
#define INSTR_CREATE_ldrh_wbreg(dc, Rd, mem, Rm) \
instr_create_2dst_3src((dc), OP_ldrh, (Rd), opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)), (Rm))
#define INSTR_CREATE_ldrsb_wbreg(dc, Rd, mem, Rm) \
instr_create_2dst_3src((dc), OP_ldrsb, (Rd), opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)), (Rm))
#define INSTR_CREATE_ldrsh_wbreg(dc, Rd, mem, Rm) \
instr_create_2dst_3src((dc), OP_ldrsh, (Rd), opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)), (Rm))
/* @} */ /* end doxygen group */
/** @name Signature: (mem, Rd, Rm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param mem The memory opnd_t operand.
* \param Rd The destination register opnd_t operand.
* \param Rm The source register opnd_t operand.
*/
#define INSTR_CREATE_stlex(dc, mem, Rd, Rm) \
instr_create_2dst_1src((dc), OP_stlex, (mem), (Rd), (Rm))
#define INSTR_CREATE_stlexb(dc, mem, Rd, Rm) \
instr_create_2dst_1src((dc), OP_stlexb, (mem), (Rd), (Rm))
#define INSTR_CREATE_stlexh(dc, mem, Rd, Rm) \
instr_create_2dst_1src((dc), OP_stlexh, (mem), (Rd), (Rm))
#define INSTR_CREATE_strex(dc, mem, Rd, Rm) \
instr_create_2dst_1src((dc), OP_strex, (mem), (Rd), (Rm))
#define INSTR_CREATE_strexb(dc, mem, Rd, Rm) \
instr_create_2dst_1src((dc), OP_strexb, (mem), (Rd), (Rm))
#define INSTR_CREATE_strexh(dc, mem, Rd, Rm) \
instr_create_2dst_1src((dc), OP_strexh, (mem), (Rd), (Rm))
/* @} */ /* end doxygen group */
/** @name Signature: (mem, Rt, Rm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param mem The memory opnd_t operand.
* \param Rt The source register opnd_t operand.
* \param Rm The source register opnd_t operand.
*/
#define INSTR_CREATE_strh_wbreg(dc, mem, Rt, Rm) \
instr_create_2dst_3src((dc), OP_strh, (mem), opnd_create_reg(opnd_get_base(mem)), (Rt), opnd_create_reg(opnd_get_base(mem)), (Rm))
/* @} */ /* end doxygen group */
/** @name Signature: (mem, Rt, Rt2) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param mem The memory opnd_t operand.
* \param Rt The source register opnd_t operand.
* \param Rt2 The second source register opnd_t operand.
*/
#define INSTR_CREATE_strd(dc, mem, Rt, Rt2) \
instr_create_1dst_2src((dc), OP_strd, (mem), (Rt), (Rt2))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, Rd2, mem, Rm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param Rd2 The second destination register opnd_t operand.
* \param mem The memory opnd_t operand.
* \param Rm The source register opnd_t operand.
*/
#define INSTR_CREATE_ldrd_wbreg(dc, Rd, Rd2, mem, Rm) \
instr_create_3dst_3src((dc), OP_ldrd, (Rd), (Rd2), opnd_create_reg(opnd_get_base(mem)), (mem), (Rm), opnd_create_reg(opnd_get_base(mem)))
/* @} */ /* end doxygen group */
/** @name Signature: (mem, Rd, Rt, Rt2) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param mem The memory opnd_t operand.
* \param Rd The destination register opnd_t operand.
* \param Rt The source register opnd_t operand.
* \param Rt2 The second source register opnd_t operand.
*/
#define INSTR_CREATE_stlexd(dc, mem, Rd, Rt, Rt2) \
instr_create_2dst_2src((dc), OP_stlexd, (mem), (Rd), (Rt), (Rt2))
#define INSTR_CREATE_strexd(dc, mem, Rd, Rt, Rt2) \
instr_create_2dst_2src((dc), OP_strexd, (mem), (Rd), (Rt), (Rt2))
/* @} */ /* end doxygen group */
/** @name Signature: (mem, Rt, Rt2, Rm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param mem The memory opnd_t operand.
* \param Rt The source register opnd_t operand.
* \param Rt2 The second source register opnd_t operand.
* \param Rm The source register opnd_t operand.
*/
#define INSTR_CREATE_strd_wbreg(dc, mem, Rt, Rt2, Rm) \
instr_create_2dst_4src((dc), OP_strd, (mem), opnd_create_reg(opnd_get_base(mem)), (Rt), (Rt2), (Rm), opnd_create_reg(opnd_get_base(mem)))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, mem, imm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param mem The memory opnd_t operand.
* \param imm The integer constant opnd_t operand.
*/
#define INSTR_CREATE_ldr_wbimm(dc, Rd, mem, imm) \
instr_create_2dst_3src((dc), OP_ldr, (Rd), opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)), (imm))
#define INSTR_CREATE_ldrb_wbimm(dc, Rd, mem, imm) \
instr_create_2dst_3src((dc), OP_ldrb, (Rd), opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)), (imm))
#define INSTR_CREATE_ldrbt_wbimm(dc, Rd, mem, imm) \
instr_create_2dst_3src((dc), OP_ldrbt, (Rd), opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)), (imm))
#define INSTR_CREATE_ldrh_wbimm(dc, Rd, mem, imm) \
instr_create_2dst_3src((dc), OP_ldrh, (Rd), opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)), (imm))
#define INSTR_CREATE_ldrsb_wbimm(dc, Rd, mem, imm) \
instr_create_2dst_3src((dc), OP_ldrsb, (Rd), opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)), (imm))
#define INSTR_CREATE_ldrsh_wbimm(dc, Rd, mem, imm) \
instr_create_2dst_3src((dc), OP_ldrsh, (Rd), opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)), (imm))
#define INSTR_CREATE_ldrt_wbimm(dc, Rd, mem, imm) \
instr_create_2dst_3src((dc), OP_ldrt, (Rd), opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)), (imm))
/* @} */ /* end doxygen group */
/** @name Signature: (mem, Rt, imm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param mem The memory opnd_t operand.
* \param Rt The source register opnd_t operand.
* \param imm The integer constant opnd_t operand.
*/
#define INSTR_CREATE_str_wbimm(dc, mem, Rt, imm) \
instr_create_2dst_3src((dc), OP_str, (mem), opnd_create_reg(opnd_get_base(mem)), (Rt), opnd_create_reg(opnd_get_base(mem)), (imm))
#define INSTR_CREATE_strb_wbimm(dc, mem, Rt, imm) \
instr_create_2dst_3src((dc), OP_strb, (mem), opnd_create_reg(opnd_get_base(mem)), (Rt), opnd_create_reg(opnd_get_base(mem)), (imm))
#define INSTR_CREATE_strbt_wbimm(dc, mem, Rt, imm) \
instr_create_2dst_3src((dc), OP_strbt, (mem), opnd_create_reg(opnd_get_base(mem)), (Rt), opnd_create_reg(opnd_get_base(mem)), (imm))
#define INSTR_CREATE_strh_wbimm(dc, mem, Rt, imm) \
instr_create_2dst_3src((dc), OP_strh, (mem), opnd_create_reg(opnd_get_base(mem)), (Rt), opnd_create_reg(opnd_get_base(mem)), (imm))
#define INSTR_CREATE_strt_wbimm(dc, mem, Rt, imm) \
instr_create_2dst_3src((dc), OP_strt, (mem), opnd_create_reg(opnd_get_base(mem)), (Rt), opnd_create_reg(opnd_get_base(mem)), (imm))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, mem, Rm_or_imm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param mem The memory opnd_t operand.
* \param Rm_or_imm The source register, or integer constant, opnd_t operand.
*/
#define INSTR_CREATE_ldrht_wbreg(dc, Rd, mem, Rm_or_imm) \
instr_create_2dst_3src((dc), OP_ldrht, (Rd), opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)), (Rm_or_imm))
#define INSTR_CREATE_ldrsbt_wbreg(dc, Rd, mem, Rm_or_imm) \
instr_create_2dst_3src((dc), OP_ldrsbt, (Rd), opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)), (Rm_or_imm))
#define INSTR_CREATE_ldrsht_wbreg(dc, Rd, mem, Rm_or_imm) \
instr_create_2dst_3src((dc), OP_ldrsht, (Rd), opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)), (Rm_or_imm))
/* @} */ /* end doxygen group */
/** @name Signature: (mem, Rt, Rm_or_imm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param mem The memory opnd_t operand.
* \param Rt The source register opnd_t operand.
* \param Rm_or_imm The source register, or integer constant, opnd_t operand.
*/
#define INSTR_CREATE_strht_wbreg(dc, mem, Rt, Rm_or_imm) \
instr_create_2dst_3src((dc), OP_strht, (mem), opnd_create_reg(opnd_get_base(mem)), (Rt), opnd_create_reg(opnd_get_base(mem)), (Rm_or_imm))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, Rd2, mem, imm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param Rd2 The second destination register opnd_t operand.
* \param mem The memory opnd_t operand.
* \param imm The integer constant opnd_t operand.
*/
#define INSTR_CREATE_ldrd_wbimm(dc, Rd, Rd2, mem, imm) \
instr_create_3dst_3src((dc), OP_ldrd, (Rd), (Rd2), opnd_create_reg(opnd_get_base(mem)), (mem), (imm), opnd_create_reg(opnd_get_base(mem)))
/* @} */ /* end doxygen group */
/** @name Signature: (mem, Rt, Rt2, imm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param mem The memory opnd_t operand.
* \param Rt The source register opnd_t operand.
* \param Rt2 The second source register opnd_t operand.
* \param imm The integer constant opnd_t operand.
*/
#define INSTR_CREATE_strd_wbimm(dc, mem, Rt, Rt2, imm) \
instr_create_2dst_4src((dc), OP_strd, (mem), opnd_create_reg(opnd_get_base(mem)), (Rt), (Rt2), (imm), opnd_create_reg(opnd_get_base(mem)))
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, mem, Rm, shift, imm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param mem The memory opnd_t operand.
* \param Rm The source register opnd_t operand.
* \param shift The shift type integer constant opnd_t operand.
* \param imm The integer constant opnd_t operand.
*/
#define INSTR_CREATE_ldr_wbreg(dc, Rd, mem, Rm, shift, imm) \
instr_create_2dst_5src((dc), OP_ldr, (Rd), opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)), (Rm), (shift), (imm))
#define INSTR_CREATE_ldrb_wbreg(dc, Rd, mem, Rm, shift, imm) \
instr_create_2dst_5src((dc), OP_ldrb, (Rd), opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)), (Rm), (shift), (imm))
#define INSTR_CREATE_ldrbt_wbreg(dc, Rd, mem, Rm, shift, imm) \
instr_create_2dst_5src((dc), OP_ldrbt, (Rd), opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)), (Rm), (shift), (imm))
#define INSTR_CREATE_ldrt_wbreg(dc, Rd, mem, Rm, shift, imm) \
instr_create_2dst_5src((dc), OP_ldrt, (Rd), opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)), (Rm), (shift), (imm))
/* @} */ /* end doxygen group */
/** @name Signature: (mem, Rt, Rm, shift, imm) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param mem The memory opnd_t operand.
* \param Rt The source register opnd_t operand.
* \param Rm The source register opnd_t operand.
* \param shift The shift type integer constant opnd_t operand.
* \param imm The integer constant opnd_t operand.
*/
#define INSTR_CREATE_str_wbreg(dc, mem, Rt, Rm, shift, imm) \
instr_create_2dst_5src((dc), OP_str, (mem), opnd_create_reg(opnd_get_base(mem)), (Rt), opnd_create_reg(opnd_get_base(mem)), (Rm), (shift), (imm))
#define INSTR_CREATE_strb_wbreg(dc, mem, Rt, Rm, shift, imm) \
instr_create_2dst_5src((dc), OP_strb, (mem), opnd_create_reg(opnd_get_base(mem)), (Rt), opnd_create_reg(opnd_get_base(mem)), (Rm), (shift), (imm))
#define INSTR_CREATE_strbt_wbreg(dc, mem, Rt, Rm, shift, imm) \
instr_create_2dst_5src((dc), OP_strbt, (mem), opnd_create_reg(opnd_get_base(mem)), (Rt), opnd_create_reg(opnd_get_base(mem)), (Rm), (shift), (imm))
#define INSTR_CREATE_strt_wbreg(dc, mem, Rt, Rm, shift, imm) \
instr_create_2dst_5src((dc), OP_strt, (mem), opnd_create_reg(opnd_get_base(mem)), (Rt), opnd_create_reg(opnd_get_base(mem)), (Rm), (shift), (imm))
/* @} */ /* end doxygen group */
/** @name Signature: (mem, list_len, ...) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param mem The memory opnd_t operand.
* \param list_len The number of registers in the register list.
* \param ... The register list as separate opnd_t arguments.
*/
#define INSTR_CREATE_ldm(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_ldm, 0, 1, list_len, (mem), __VA_ARGS__)
#define INSTR_CREATE_ldm_priv(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_ldm_priv, 0, 1, list_len, (mem), __VA_ARGS__)
#define INSTR_CREATE_ldm_wb(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_ldm, 1, 2, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_ldmda(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_ldmda, 0, 1, list_len, (mem), __VA_ARGS__)
#define INSTR_CREATE_ldmda_priv(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_ldmda_priv, 0, 1, list_len, (mem), __VA_ARGS__)
#define INSTR_CREATE_ldmda_priv_wb(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_ldmda_priv, 1, 2, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_ldmda_wb(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_ldmda, 1, 2, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_ldmdb(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_ldmdb, 0, 1, list_len, (mem), __VA_ARGS__)
#define INSTR_CREATE_ldmdb_priv(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_ldmdb_priv, 0, 1, list_len, (mem), __VA_ARGS__)
#define INSTR_CREATE_ldmdb_priv_wb(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_ldmdb_priv, 1, 2, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_ldmdb_wb(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_ldmdb, 1, 2, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_ldmia_priv_wb(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_ldmia_priv, 1, 2, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_ldmib(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_ldmib, 0, 1, list_len, (mem), __VA_ARGS__)
#define INSTR_CREATE_ldmib_wb(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_ldmib, 1, 2, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_stm(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_stm, 1, 0, list_len, (mem), __VA_ARGS__)
#define INSTR_CREATE_stm_priv(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_stm_priv, 1, 0, list_len, (mem), __VA_ARGS__)
#define INSTR_CREATE_stm_wb(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_stm, 2, 1, list_len, (mem), opnd_create_reg(opnd_get_base(mem)), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_stmda(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_stmda, 1, 0, list_len, (mem), __VA_ARGS__)
#define INSTR_CREATE_stmda_priv(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_stmda_priv, 1, 0, list_len, (mem), __VA_ARGS__)
#define INSTR_CREATE_stmda_wb(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_stmda, 2, 1, list_len, (mem), opnd_create_reg(opnd_get_base(mem)), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_stmdb(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_stmdb, 1, 0, list_len, (mem), __VA_ARGS__)
#define INSTR_CREATE_stmdb_priv(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_stmdb_priv, 1, 0, list_len, (mem), __VA_ARGS__)
#define INSTR_CREATE_stmdb_wb(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_stmdb, 2, 1, list_len, (mem), opnd_create_reg(opnd_get_base(mem)), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_stmib(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_stmib, 1, 0, list_len, (mem), __VA_ARGS__)
#define INSTR_CREATE_stmib_wb(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_stmib, 2, 1, list_len, (mem), opnd_create_reg(opnd_get_base(mem)), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld1_dup_8(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld1_dup_8, 0, 1, list_len, (mem), __VA_ARGS__)
#define INSTR_CREATE_vld1_dup_8_wb(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld1_dup_8, 1, 2, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld2_dup_8(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld2_dup_8, 0, 1, list_len, (mem), __VA_ARGS__)
#define INSTR_CREATE_vld2_dup_8_wb(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld2_dup_8, 1, 2, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld3_dup_8(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld3_dup_8, 0, 1, list_len, (mem), __VA_ARGS__)
#define INSTR_CREATE_vld3_dup_8_wb(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld3_dup_8, 1, 2, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld4_dup_8(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld4_dup_8, 0, 1, list_len, (mem), __VA_ARGS__)
#define INSTR_CREATE_vld4_dup_8_wb(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld4_dup_8, 1, 2, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vldmia(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vldmia, 0, 1, list_len, (mem), __VA_ARGS__)
#define INSTR_CREATE_vstmia(dc, mem, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vstmia, 1, 0, list_len, (mem), __VA_ARGS__)
/* @} */ /* end doxygen group */
/** @name Signature: (mem, Rm, list_len, ...) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param mem The memory opnd_t operand.
* \param Rm The source register opnd_t operand.
* \param list_len The number of registers in the register list.
* \param ... The register list as separate opnd_t arguments.
*/
#define INSTR_CREATE_vld1_dup_8_wbreg(dc, mem, Rm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld1_dup_8, 1, 3, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (Rm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld2_dup_8_wbreg(dc, mem, Rm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld2_dup_8, 1, 3, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (Rm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld3_dup_8_wbreg(dc, mem, Rm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld3_dup_8, 1, 3, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (Rm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld4_dup_8_wbreg(dc, mem, Rm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld4_dup_8, 1, 3, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (Rm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
/* @} */ /* end doxygen group */
/** @name Signature: (mem, imm, list_len, ...) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param mem The memory opnd_t operand.
* \param imm The integer constant opnd_t operand.
* \param list_len The number of registers in the register list.
* \param ... The register list as separate opnd_t arguments.
*/
#define INSTR_CREATE_vld1_16(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld1_16, 0, 2, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vld1_16_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld1_16, 1, 3, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld1_32(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld1_32, 0, 2, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vld1_32_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld1_32, 1, 3, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld1_64(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld1_64, 0, 2, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vld1_64_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld1_64, 1, 3, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld1_8(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld1_8, 0, 2, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vld1_8_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld1_8, 1, 3, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld1_dup_16(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld1_dup_16, 0, 2, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vld1_dup_16_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld1_dup_16, 1, 3, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld1_dup_32(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld1_dup_32, 0, 2, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vld1_dup_32_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld1_dup_32, 1, 3, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld2_16(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld2_16, 0, 2, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vld2_16_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld2_16, 1, 3, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld2_32(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld2_32, 0, 2, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vld2_32_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld2_32, 1, 3, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld2_8(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld2_8, 0, 2, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vld2_8_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld2_8, 1, 3, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld2_dup_16(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld2_dup_16, 0, 2, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vld2_dup_16_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld2_dup_16, 1, 3, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld2_dup_32(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld2_dup_32, 0, 2, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vld2_dup_32_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld2_dup_32, 1, 3, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld2_lane_8(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld2_lane_8, 0, 2, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vld2_lane_8_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld2_lane_8, 1, 3, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld3_16(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld3_16, 0, 2, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vld3_16_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld3_16, 1, 3, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld3_32(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld3_32, 0, 2, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vld3_32_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld3_32, 1, 3, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld3_8(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld3_8, 0, 2, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vld3_8_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld3_8, 1, 3, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld3_dup_16(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld3_dup_16, 0, 2, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vld3_dup_16_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld3_dup_16, 1, 3, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld3_dup_32(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld3_dup_32, 0, 2, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vld3_dup_32_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld3_dup_32, 1, 3, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld3_lane_8(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld3_lane_8, 0, 2, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vld3_lane_8_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld3_lane_8, 1, 3, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld4_16(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld4_16, 0, 2, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vld4_16_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld4_16, 1, 3, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld4_32(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld4_32, 0, 2, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vld4_32_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld4_32, 1, 3, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld4_8(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld4_8, 0, 2, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vld4_8_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld4_8, 1, 3, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld4_dup_16(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld4_dup_16, 0, 2, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vld4_dup_16_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld4_dup_16, 1, 3, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld4_dup_32(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld4_dup_32, 0, 2, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vld4_dup_32_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld4_dup_32, 1, 3, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld4_lane_8(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld4_lane_8, 0, 2, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vld4_lane_8_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld4_lane_8, 1, 3, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vst1_16(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst1_16, 1, 1, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vst1_16_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst1_16, 2, 2, list_len, (mem), opnd_create_reg(opnd_get_base(mem)), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vst1_32(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst1_32, 1, 1, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vst1_32_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst1_32, 2, 2, list_len, (mem), opnd_create_reg(opnd_get_base(mem)), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vst1_64(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst1_64, 1, 1, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vst1_64_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst1_64, 2, 2, list_len, (mem), opnd_create_reg(opnd_get_base(mem)), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vst1_8(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst1_8, 1, 1, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vst1_8_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst1_8, 2, 2, list_len, (mem), opnd_create_reg(opnd_get_base(mem)), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vst2_16(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst2_16, 1, 1, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vst2_16_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst2_16, 2, 2, list_len, (mem), opnd_create_reg(opnd_get_base(mem)), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vst2_32(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst2_32, 1, 1, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vst2_32_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst2_32, 2, 2, list_len, (mem), opnd_create_reg(opnd_get_base(mem)), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vst2_8(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst2_8, 1, 1, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vst2_8_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst2_8, 2, 2, list_len, (mem), opnd_create_reg(opnd_get_base(mem)), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vst2_lane_8(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst2_lane_8, 1, 1, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vst2_lane_8_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst2_lane_8, 2, 2, list_len, (mem), opnd_create_reg(opnd_get_base(mem)), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vst3_16(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst3_16, 1, 1, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vst3_16_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst3_16, 2, 2, list_len, (mem), opnd_create_reg(opnd_get_base(mem)), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vst3_32(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst3_32, 1, 1, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vst3_32_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst3_32, 2, 2, list_len, (mem), opnd_create_reg(opnd_get_base(mem)), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vst3_8(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst3_8, 1, 1, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vst3_8_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst3_8, 2, 2, list_len, (mem), opnd_create_reg(opnd_get_base(mem)), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vst3_lane_8(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst3_lane_8, 1, 1, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vst3_lane_8_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst3_lane_8, 2, 2, list_len, (mem), opnd_create_reg(opnd_get_base(mem)), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vst4_16(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst4_16, 1, 1, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vst4_16_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst4_16, 2, 2, list_len, (mem), opnd_create_reg(opnd_get_base(mem)), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vst4_32(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst4_32, 1, 1, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vst4_32_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst4_32, 2, 2, list_len, (mem), opnd_create_reg(opnd_get_base(mem)), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vst4_8(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst4_8, 1, 1, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vst4_8_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst4_8, 2, 2, list_len, (mem), opnd_create_reg(opnd_get_base(mem)), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vst4_lane_8(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst4_lane_8, 1, 1, list_len, (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vst4_lane_8_wbimm(dc, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vst4_lane_8, 2, 2, list_len, (mem), opnd_create_reg(opnd_get_base(mem)), (imm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
/* @} */ /* end doxygen group */
/** @name Signature: (Rd, mem, imm, list_len, ...) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param Rd The destination register opnd_t operand.
* \param mem The memory opnd_t operand.
* \param imm The integer constant opnd_t operand.
* \param list_len The number of registers in the register list.
* \param ... The register list as separate opnd_t arguments.
*/
#define INSTR_CREATE_vldmdb(dc, Rd, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vldmdb, 1, 2, list_len, (Rd), (mem), (imm), __VA_ARGS__)
#define INSTR_CREATE_vldmia_imm(dc, Rd, mem, imm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vldmia, 1, 2, list_len, (Rd), (mem), (imm), __VA_ARGS__)
/* @} */ /* end doxygen group */
/** @name Signature: (mem, Rd, imm, list_len, ...) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param mem The memory opnd_t operand.
* \param Rd The destination register opnd_t operand.
* \param imm The integer constant opnd_t operand.
* \param list_len The number of registers in the register list.
* \param ... The register list as separate opnd_t arguments.
*/
#define INSTR_CREATE_vstmdb(dc, mem, Rd, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vstmdb, 2, 1, list_len, (mem), (Rd), (imm), __VA_ARGS__)
#define INSTR_CREATE_vstmia_imm(dc, mem, Rd, imm, list_len, ...) \
instr_create_Ndst_Msrc_varsrc((dc), OP_vstmia, 2, 1, list_len, (mem), (Rd), (imm), __VA_ARGS__)
/* @} */ /* end doxygen group */
/** @name Signature: (mem, imm, Rm, list_len, ...) */
/* @{ */ /* start doxygen group (via DISTRIBUTE_GROUP_DOC=YES). */
/**
* This INSTR_CREATE_xxx macro creates an instr_t with opcode OP_xxx and
* the given explicit operands, automatically supplying any implicit operands.
* The operands should be listed with destinations first, followed by sources.
* The ordering within these two groups should follow the conventional
* assembly ordering.
* \param dc The void * dcontext used to allocate memory for the instr_t.
* \param mem The memory opnd_t operand.
* \param imm The integer constant opnd_t operand.
* \param Rm The source register opnd_t operand.
* \param list_len The number of registers in the register list.
* \param ... The register list as separate opnd_t arguments.
*/
#define INSTR_CREATE_vld1_16_wbreg(dc, mem, imm, Rm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld1_16, 1, 4, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), (Rm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld1_32_wbreg(dc, mem, imm, Rm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld1_32, 1, 4, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), (Rm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld1_64_wbreg(dc, mem, imm, Rm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld1_64, 1, 4, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), (Rm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld1_8_wbreg(dc, mem, imm, Rm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld1_8, 1, 4, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), (Rm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld1_dup_16_wbreg(dc, mem, imm, Rm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld1_dup_16, 1, 4, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), (Rm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld1_dup_32_wbreg(dc, mem, imm, Rm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld1_dup_32, 1, 4, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), (Rm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld2_16_wbreg(dc, mem, imm, Rm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld2_16, 1, 4, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), (Rm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld2_32_wbreg(dc, mem, imm, Rm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld2_32, 1, 4, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), (Rm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld2_8_wbreg(dc, mem, imm, Rm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld2_8, 1, 4, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), (Rm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld2_dup_16_wbreg(dc, mem, imm, Rm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld2_dup_16, 1, 4, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), (Rm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld2_dup_32_wbreg(dc, mem, imm, Rm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld2_dup_32, 1, 4, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), (Rm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld2_lane_8_wbreg(dc, mem, imm, Rm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld2_lane_8, 1, 4, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), (Rm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld3_16_wbreg(dc, mem, imm, Rm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld3_16, 1, 4, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), (Rm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld3_32_wbreg(dc, mem, imm, Rm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld3_32, 1, 4, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), (Rm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld3_8_wbreg(dc, mem, imm, Rm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld3_8, 1, 4, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), (Rm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld3_dup_16_wbreg(dc, mem, imm, Rm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld3_dup_16, 1, 4, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), (Rm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld3_dup_32_wbreg(dc, mem, imm, Rm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld3_dup_32, 1, 4, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), (Rm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld3_lane_8_wbreg(dc, mem, imm, Rm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld3_lane_8, 1, 4, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm), (Rm), opnd_create_reg(opnd_get_base(mem)), __VA_ARGS__)
#define INSTR_CREATE_vld4_16_wbreg(dc, mem, imm, Rm, list_len, ...) \
instr_create_Ndst_Msrc_vardst((dc), OP_vld4_16, 1, 4, list_len, opnd_create_reg(opnd_get_base(mem)), (mem), (imm