Example #1
0
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);
}
Example #2
0
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);
}
Example #3
0
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);
}
Example #4
0
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);
}
Example #5
0
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);
}
Example #6
0
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);
}