diff options
Diffstat (limited to 'miasm2/arch/x86/sem.py')
| -rw-r--r-- | miasm2/arch/x86/sem.py | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/miasm2/arch/x86/sem.py b/miasm2/arch/x86/sem.py index 28e42353..cdc98fba 100644 --- a/miasm2/arch/x86/sem.py +++ b/miasm2/arch/x86/sem.py @@ -3606,19 +3606,25 @@ def ps_rl_ll(ir, instr, a, b, op, size): mask = {16: 0xF, 32: 0x1F, 64: 0x3F}[size] - test = count & m2_expr.ExprInt(((1 << a.size) - 1) ^ mask, a.size) + test = expr_simp(count & m2_expr.ExprInt(((1 << a.size) - 1) ^ mask, a.size)) e = [m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(test, lbl_zero, lbl_do))] - e_zero = [m2_expr.ExprAff(a, m2_expr.ExprInt(0, a.size)), - m2_expr.ExprAff(ir.IRDst, lbl_next)] - - e_do = [] slices = [] for i in xrange(0, a.size, size): slices.append((m2_expr.ExprOp(op, a[i:i + size], count[:size]), i, i + size)) + + if isinstance(test, m2_expr.ExprInt): + if int(test.arg) == 0: + return [m2_expr.ExprAff(a[0:a.size], m2_expr.ExprCompose(slices))], [] + else: + return [m2_expr.ExprAff(a, m2_expr.ExprInt(0, a.size))], [] + + e_zero = [m2_expr.ExprAff(a, m2_expr.ExprInt(0, a.size)), + m2_expr.ExprAff(ir.IRDst, lbl_next)] + e_do = [] e.append(m2_expr.ExprAff(a[0:a.size], m2_expr.ExprCompose(slices))) e_do.append(m2_expr.ExprAff(ir.IRDst, lbl_next)) return e, [irbloc(lbl_do.name, [e_do]), irbloc(lbl_zero.name, [e_zero])] @@ -4484,7 +4490,6 @@ class ir_x86_16(ir): instr_ir, extra_ir = mnemo_func[ instr.name.lower()](self, instr, *args) - self.mod_pc(instr, instr_ir, extra_ir) self.mod_pc(instr, instr_ir, extra_ir) instr.additional_info.except_on_instr = False @@ -4566,7 +4571,8 @@ class ir_x86_16(ir): dst = self.expr_fix_regs_for_mode(dst, mode) src = self.expr_fix_regs_for_mode(src, mode) assignblk[dst] = src - irbloc.dst = self.expr_fix_regs_for_mode(irbloc.dst, mode) + if irbloc.dst is not None: + irbloc.dst = self.expr_fix_regs_for_mode(irbloc.dst, mode) class ir_x86_32(ir_x86_16): |