38 unsigned shift_l =
sizeof (int32_t) * 8 - (
offset + width);
39 unsigned shift_r =
sizeof (int32_t) * 8 - width;
41 return ((int32_t) insn << shift_l) >> shift_r;
55 return (insn & mask) == pattern;
70 unsigned *rd, int32_t *
offset)
76 uint32_t immlo = (insn >> 29) & 0x3;
79 *is_adrp = (insn >> 31) & 0x1;
80 *rd = (insn >> 0) & 0x1f;
86 *
offset = (immhi | immlo) * 4096;
95 *is_adrp ?
"adrp" :
"adr", *rd);
120 *is_bl = (insn >> 31) & 0x1;
153 *cond = (insn >> 0) & 0xf;
180 unsigned *rn, int32_t *
offset)
186 *rn = (insn >> 0) & 0x1f;
187 *is64 = (insn >> 31) & 0x1;
188 *is_cbnz = (insn >> 24) & 0x1;
195 *is_cbnz ?
"cbnz" :
"cbz",
216 unsigned *
bit,
unsigned *rt, int32_t *imm)
222 *rt = (insn >> 0) & 0x1f;
223 *is_tbnz = (insn >> 24) & 0x1;
224 *
bit = ((insn >> (31 - 4)) & 0x20) | ((insn >> 19) & 0x1f);
231 *is_tbnz ?
"tbnz" :
"tbz", *rt, *
bit,
253 int *is64,
unsigned *rt, int32_t *
offset)
257 if ((insn & 0x3f000000) == 0x18000000)
259 *is_w = (insn >> 31) & 0x1;
267 *is64 = (insn >> 30) & 0x1;
269 *rt = (insn >> 0) & 0x1f;
275 *is_w ?
"ldrsw" :
"ldr",
276 *is64 ?
"x" :
"w", *rt);
353 switch (operand.
type)
366 uint32_t post_index =
ENCODE (1, 2, 10);
377 uint32_t pre_index =
ENCODE (3, 2, 10);
void(* tb)(const int32_t offset, int is_tbnz, const unsigned rt, unsigned bit, struct aarch64_insn_data *data)
enum aarch64_memory_operand_type type
static int decode_masked_match(uint32_t insn, uint32_t mask, uint32_t pattern)
static const struct aarch64_insn_visitor visitor
int aarch64_decode_adr(CORE_ADDR addr, uint32_t insn, int *is_adrp, unsigned *rd, int32_t *offset)
void aarch64_relocate_instruction(uint32_t insn, const struct aarch64_insn_visitor *visitor, struct aarch64_insn_data *data)
int aarch64_decode_ldr_literal(CORE_ADDR addr, uint32_t insn, int *is_w, int *is64, unsigned *rt, int32_t *offset)
void(* ldr_literal)(const int32_t offset, const int is_sw, const unsigned rt, const int is64, struct aarch64_insn_data *data)
int aarch64_decode_cb(CORE_ADDR addr, uint32_t insn, int *is64, int *is_cbnz, unsigned *rn, int32_t *offset)
void(* cb)(const int32_t offset, const int is_cbnz, const unsigned rn, int is64, struct aarch64_insn_data *data)
void(* adr)(const int32_t offset, const unsigned rd, const int is_adrp, struct aarch64_insn_data *data)
int aarch64_emit_insn(uint32_t *buf, uint32_t insn)
static int32_t extract_signed_bitfield(uint32_t insn, unsigned width, unsigned offset)
void(* b_cond)(const unsigned cond, const int32_t offset, struct aarch64_insn_data *data)
int aarch64_emit_load_store(uint32_t *buf, uint32_t size, enum aarch64_opcodes opcode, struct aarch64_register rt, struct aarch64_register rn, struct aarch64_memory_operand operand)
int aarch64_decode_bcond(CORE_ADDR addr, uint32_t insn, unsigned *cond, int32_t *offset)
int aarch64_decode_tb(CORE_ADDR addr, uint32_t insn, int *is_tbnz, unsigned *bit, unsigned *rt, int32_t *imm)
void(* b)(const int is_bl, const int32_t offset, struct aarch64_insn_data *data)
#define ENCODE(val, size, offset)
int aarch64_decode_b(CORE_ADDR addr, uint32_t insn, int *is_bl, int32_t *offset)
void debug_printf(const char *fmt,...)
const char * core_addr_to_string_nz(const CORE_ADDR addr)
void(* others)(const uint32_t insn, struct aarch64_insn_data *data)