diff options
| author | serpilliere <serpilliere@users.noreply.github.com> | 2018-11-10 16:55:38 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-11-10 16:55:38 +0100 |
| commit | 8d0f34b3049e31a9b789491d468cee0b72bfe24e (patch) | |
| tree | ed30c4888c861c1b8bec1edbc7557b32e738982c | |
| parent | 7ca62062fe1321c4b151a53530423952b5535d10 (diff) | |
| parent | 5c53563db1b912628a67d4972ea2a3e8b2c983ff (diff) | |
| download | miasm-8d0f34b3049e31a9b789491d468cee0b72bfe24e.tar.gz miasm-8d0f34b3049e31a9b789491d468cee0b72bfe24e.zip | |
Merge pull request #879 from w4kfu/mov_assignexpr_rot_shift
X86 sem : mov assignexpr rot / shift
| -rw-r--r-- | miasm2/arch/x86/sem.py | 24 | ||||
| -rw-r--r-- | miasm2/ir/translators/C.py | 2 |
2 files changed, 14 insertions, 12 deletions
diff --git a/miasm2/arch/x86/sem.py b/miasm2/arch/x86/sem.py index a3589344..565f7571 100644 --- a/miasm2/arch/x86/sem.py +++ b/miasm2/arch/x86/sem.py @@ -636,17 +636,18 @@ def _rotate_tpl(ir, instr, dst, src, op, left=False): m2_expr.ExprAssign(of, new_of), m2_expr.ExprAssign(dst, res) ] + e = [] + if dst.size == 32 and dst in replace_regs[64]: + e.append(m2_expr.ExprAssign(dst[:dst.size], dst)) # Don't generate conditional shifter on constant if isinstance(shifter, m2_expr.ExprInt): if int(shifter) != 0: return (e_do, []) else: - return ([], []) - e = [] + return (e, []) loc_do, loc_do_expr = ir.gen_loc_key_and_expr(ir.IRDst.size) loc_skip = ir.get_next_loc_key(instr) loc_skip_expr = m2_expr.ExprLoc(loc_skip, ir.IRDst.size) - e_do.append(m2_expr.ExprAssign(ir.IRDst, loc_skip_expr)) e.append(m2_expr.ExprAssign( ir.IRDst, m2_expr.ExprCond(shifter, loc_do_expr, loc_skip_expr))) @@ -685,17 +686,18 @@ def rotate_with_carry_tpl(ir, instr, op, dst, src): m2_expr.ExprAssign(of, new_of), m2_expr.ExprAssign(dst, new_dst) ] + e = [] + if dst.size == 32 and dst in replace_regs[64]: + e.append(m2_expr.ExprAssign(dst[:dst.size], dst)) # Don't generate conditional shifter on constant if isinstance(shifter, m2_expr.ExprInt): if int(shifter) != 0: return (e_do, []) else: - return ([], []) - e = [] + return (e, []) loc_do, loc_do_expr = ir.gen_loc_key_and_expr(ir.IRDst.size) loc_skip = ir.get_next_loc_key(instr) loc_skip_expr = m2_expr.ExprLoc(loc_skip, ir.IRDst.size) - e_do.append(m2_expr.ExprAssign(ir.IRDst, loc_skip_expr)) e.append(m2_expr.ExprAssign( ir.IRDst, m2_expr.ExprCond(shifter, loc_do_expr, loc_skip_expr))) @@ -772,15 +774,15 @@ def _shift_tpl(op, ir, instr, a, b, c=None, op_inv=None, left=False, m2_expr.ExprAssign(a, res), ] e_do += update_flag_znp(res) - + e = [] + if a.size == 32 and a in replace_regs[64]: + e.append(m2_expr.ExprAssign(a[:a.size], a)) # Don't generate conditional shifter on constant if isinstance(shifter, m2_expr.ExprInt): if int(shifter) != 0: - return e_do, [] + return (e_do, []) else: - return [], [] - - e = [] + return (e, []) loc_do, loc_do_expr = ir.gen_loc_key_and_expr(ir.IRDst.size) loc_skip = ir.get_next_loc_key(instr) loc_skip_expr = m2_expr.ExprLoc(loc_skip, ir.IRDst.size) diff --git a/miasm2/ir/translators/C.py b/miasm2/ir/translators/C.py index 20fa210e..a5453745 100644 --- a/miasm2/ir/translators/C.py +++ b/miasm2/ir/translators/C.py @@ -317,7 +317,7 @@ class TranslatorC(Translator): ">>>": "ror", "<<<": "rol" } - out = "bignum_%d(%s, %d, bignum_to_uint64(%s))" % ( + out = "bignum_%s(%s, %d, bignum_to_uint64(%s))" % ( op[expr.op], arg0, expr.size, arg1 ) out = "bignum_mask(%s, %d)"% (out, expr.size) |