diff options
| author | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2019-02-08 21:06:19 +0100 |
|---|---|---|
| committer | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2019-02-12 10:26:29 +0100 |
| commit | 15976e2f8c0a490d6c6b8c3ef02d38762ed8585c (patch) | |
| tree | b44396641b3183bc1893072c8d018001ecbf0e21 /miasm2/expression/simplifications_common.py | |
| parent | ab5442f5301727edf77260947b2fca339ca9bd44 (diff) | |
| download | miasm-15976e2f8c0a490d6c6b8c3ef02d38762ed8585c.tar.gz miasm-15976e2f8c0a490d6c6b8c3ef02d38762ed8585c.zip | |
Add simp cst == X+ cst; X ^cst = cst
Diffstat (limited to 'miasm2/expression/simplifications_common.py')
| -rw-r--r-- | miasm2/expression/simplifications_common.py | 59 |
1 files changed, 37 insertions, 22 deletions
diff --git a/miasm2/expression/simplifications_common.py b/miasm2/expression/simplifications_common.py index 87720e08..a4b7c61e 100644 --- a/miasm2/expression/simplifications_common.py +++ b/miasm2/expression/simplifications_common.py @@ -909,6 +909,7 @@ def simp_cmp_int(expr_simp, expr): """ ({X, 0} == int) => X == int[:] X + int1 == int2 => X == int2-int1 + X ^ int1 == int2 => X == int1^int2 """ if (expr.is_op(TOK_EQUAL) and expr.args[1].is_int() and @@ -922,28 +923,42 @@ def simp_cmp_int(expr_simp, expr): expr = expr_simp( ExprOp(TOK_EQUAL, src, new_int) ) - elif (expr.is_op() and - expr.op in [ - TOK_EQUAL, - ] and - expr.args[1].is_int() and - expr.args[0].is_op("+") and - expr.args[0].args[-1].is_int()): - # X + int1 == int2 => X == int2-int1 - # WARNING: - # X - 0x10 <=u 0x20 gives X in [0x10 0x30] - # which is not equivalet to A <=u 0x10 - - left, right = expr.args - left, int_diff = left.args[:-1], left.args[-1] - if len(left) == 1: - left = left[0] - else: - left = ExprOp('+', *left) - new_int = expr_simp(right - int_diff) - expr = expr_simp( - ExprOp(expr.op, left, new_int), - ) + elif not expr.is_op(TOK_EQUAL): + return expr + assert len(expr.args) == 2 + + left, right = expr.args + if left.is_int() and not right.is_int(): + left, right = right, left + if not right.is_int(): + return expr + if not (left.is_op() and left.op in ['+', '^']): + return expr + if not left.args[-1].is_int(): + return expr + # X + int1 == int2 => X == int2-int1 + # WARNING: + # X - 0x10 <=u 0x20 gives X in [0x10 0x30] + # which is not equivalet to A <=u 0x10 + + left_orig = left + left, last_int = left.args[:-1], left.args[-1] + + if len(left) == 1: + left = left[0] + else: + left = ExprOp(left.op, *left) + + if left_orig.op == "+": + new_int = expr_simp(right - last_int) + elif left_orig.op == '^': + new_int = expr_simp(right ^ last_int) + else: + raise RuntimeError("Unsupported operator") + + expr = expr_simp( + ExprOp(TOK_EQUAL, left, new_int), + ) return expr |