diff options
| author | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2018-10-09 08:16:02 +0200 |
|---|---|---|
| committer | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2018-10-09 08:17:50 +0200 |
| commit | bc794faa282b7d1ea621e5bf76d4e6900146c055 (patch) | |
| tree | d66505282599825fb7291e051ce6eb6cb4190421 /miasm2/expression/simplifications_common.py | |
| parent | 6e57273dfa0d4ea8a04873647194042933892251 (diff) | |
| download | miasm-bc794faa282b7d1ea621e5bf76d4e6900146c055.tar.gz miasm-bc794faa282b7d1ea621e5bf76d4e6900146c055.zip | |
Simplifications: fix hl cond reduction
Match code to comment
Diffstat (limited to 'miasm2/expression/simplifications_common.py')
| -rw-r--r-- | miasm2/expression/simplifications_common.py | 38 |
1 files changed, 16 insertions, 22 deletions
diff --git a/miasm2/expression/simplifications_common.py b/miasm2/expression/simplifications_common.py index 676501a0..9c002fa5 100644 --- a/miasm2/expression/simplifications_common.py +++ b/miasm2/expression/simplifications_common.py @@ -884,37 +884,34 @@ def simp_cond_flag(expr_simp, expr): return expr -def simp_cond_int(expr_simp, expr): +def simp_cmp_int(expr_simp, expr): # ({X, 0} == int) => X == int[:] # X + int1 == int2 => X == int2-int1 - if (expr.cond.is_op(TOK_EQUAL) and - expr.cond.args[1].is_int() and - expr.cond.args[0].is_compose() and - len(expr.cond.args[0].args) == 2 and - expr.cond.args[0].args[1].is_int(0)): + if (expr.is_op(TOK_EQUAL) and + expr.args[1].is_int() and + expr.args[0].is_compose() and + len(expr.args[0].args) == 2 and + expr.args[0].args[1].is_int(0)): # ({X, 0} == int) => X == int[:] - src = expr.cond.args[0].args[0] - int_val = int(expr.cond.args[1]) + src = expr.args[0].args[0] + int_val = int(expr.args[1]) new_int = ExprInt(int_val, src.size) expr = expr_simp( - ExprCond( - ExprOp(TOK_EQUAL, src, new_int), - expr.src1, - expr.src2) + ExprOp(TOK_EQUAL, src, new_int) ) - elif (expr.cond.is_op() and - expr.cond.op in [ + elif (expr.is_op() and + expr.op in [ TOK_EQUAL, ] and - expr.cond.args[1].is_int() and - expr.cond.args[0].is_op("+") and - expr.cond.args[0].args[-1].is_int()): + 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.cond.args + left, right = expr.args left, int_diff = left.args[:-1], left.args[-1] if len(left) == 1: left = left[0] @@ -922,10 +919,7 @@ def simp_cond_int(expr_simp, expr): left = ExprOp('+', *left) new_int = expr_simp(right - int_diff) expr = expr_simp( - ExprCond( - ExprOp(expr.cond.op, left, new_int), - expr.src1, - expr.src2) + ExprOp(expr.op, left, new_int), ) return expr |