static void instr_create_ldstex(dcontext_t *dcontext, int len, uint *pc, instr_t *instr, OUT instr_t *instr_ldstex) { int num_dsts = 0; int num_srcs = 0; int i, d, s, j; for (i = 0; i < len; i++) { ASSERT(instr[i].length == AARCH64_INSTR_SIZE && instr[i].bytes == instr[0].bytes + AARCH64_INSTR_SIZE * i); num_dsts += instr_num_dsts(&instr[i]); num_srcs += instr_num_srcs(&instr[i]); } instr_set_opcode(instr_ldstex, OP_ldstex); instr_set_num_opnds(dcontext, instr_ldstex, num_dsts, num_srcs); d = 0; s = 0; for (i = 0; i < len; i++) { int dsts = instr_num_dsts(&instr[i]); int srcs = instr_num_srcs(&instr[i]); for (j = 0; j < dsts; j++) instr_set_dst(instr_ldstex, d++, instr_get_dst(&instr[i], j)); for (j = 0; j < srcs; j++) instr_set_src(instr_ldstex, s++, instr_get_src(&instr[i], j)); } ASSERT(d == num_dsts && s == num_srcs); /* Set raw bits to original encoding. */ instr_set_raw_bits(instr_ldstex, instr[0].bytes, len * AARCH64_INSTR_SIZE); /* Conservatively assume all flags are read and written. */ instr_ldstex->eflags = EFLAGS_READ_ALL | EFLAGS_WRITE_ALL; instr_set_eflags_valid(instr_ldstex, true); }
static inline void instr_set_1dst_0src(dcontext_t *dc, instr_t *instr, int op, opnd_t dst0) { instr_set_opcode(instr, op); instr_set_num_opnds(dc, instr, 1, 0); instr_set_dst(instr, 0, dst0); }
static inline void instr_set_0dst_1src(dcontext_t *dc, instr_t *instr, int op, opnd_t src0) { instr_set_opcode(instr, op); instr_set_num_opnds(dc, instr, 0, 1); instr_set_src(instr, 0, src0); }
static inline void instr_set_0dst_3src(dcontext_t *dc, instr_t *instr, int op, opnd_t src0, opnd_t src1, opnd_t src2) { instr_set_opcode(instr, op); instr_set_num_opnds(dc, instr, 0, 3); instr_set_src(instr, 0, src0); instr_set_src(instr, 1, src1); instr_set_src(instr, 2, src2); }
static inline void instr_set_1dst_2src(dcontext_t *dc, instr_t *instr, int op, opnd_t dst0, opnd_t src0, opnd_t src1) { instr_set_opcode(instr, op); instr_set_num_opnds(dc, instr, 1, 2); instr_set_dst(instr, 0, dst0); instr_set_src(instr, 0, src0); instr_set_src(instr, 1, src1); }
static inline void instr_set_0dst_0src(dcontext_t *dc, instr_t *instr, int op) { instr_set_opcode(instr, op); instr_set_num_opnds(dc, instr, 0, 0); }