diff options
| author | serpilliere <serpilliere@users.noreply.github.com> | 2020-03-20 13:26:27 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-03-20 13:26:27 +0100 |
| commit | a040288c541f3b2d05fe1ce50f4c30a22572a3fb (patch) | |
| tree | ae6f62c1b4cc26c493f4b4ffa003a826989b4d8e | |
| parent | fc8c0c77c2e0d99ceaa37407ff6c5cbcf469962c (diff) | |
| parent | 46d99843243bf5f8ebf1db653183aa8e4a2a4f87 (diff) | |
| download | miasm-a040288c541f3b2d05fe1ce50f4c30a22572a3fb.tar.gz miasm-a040288c541f3b2d05fe1ce50f4c30a22572a3fb.zip | |
Merge pull request #1161 from serpilliere/add_simplifications
Add simplifications
| -rw-r--r-- | miasm/expression/simplifications.py | 2 | ||||
| -rw-r--r-- | miasm/expression/simplifications_common.py | 26 | ||||
| -rw-r--r-- | test/expression/simplifications.py | 1 |
3 files changed, 29 insertions, 0 deletions
diff --git a/miasm/expression/simplifications.py b/miasm/expression/simplifications.py index d8a11382..7b1d3629 100644 --- a/miasm/expression/simplifications.py +++ b/miasm/expression/simplifications.py @@ -49,6 +49,8 @@ class ExpressionSimplifier(object): simplifications_common.simp_double_signext, simplifications_common.simp_zeroext_eq_cst, simplifications_common.simp_ext_eq_ext, + simplifications_common.simp_ext_cond_int, + simplifications_common.simp_sub_cf_zero, simplifications_common.simp_cmp_int, simplifications_common.simp_cmp_bijective_op, diff --git a/miasm/expression/simplifications_common.py b/miasm/expression/simplifications_common.py index 9db766d8..90f8945b 100644 --- a/miasm/expression/simplifications_common.py +++ b/miasm/expression/simplifications_common.py @@ -906,6 +906,15 @@ def simp_cond_flag(_, expr): return expr +def simp_sub_cf_zero(_, expr): + """FLAG_SUB_CF(0, X) => (X)?1:0""" + if not expr.is_op("FLAG_SUB_CF"): + return expr + if not expr.args[0].is_int(0): + return expr + return ExprCond(expr.args[1], ExprInt(1, 1), ExprInt(0, 1)) + + def simp_cmp_int(expr_simp, expr): """ ({X, 0} == int) => X == int[:] @@ -1362,6 +1371,23 @@ def simp_ext_cst(_, expr): return ret + +def simp_ext_cond_int(e_s, expr): + """ + zeroExt(ExprCond(X, Int, Int)) => ExprCond(X, Int, Int) + """ + if not (expr.op.startswith("zeroExt") or expr.op.startswith("signExt")): + return expr + arg = expr.args[0] + if not arg.is_cond(): + return expr + if not (arg.src1.is_int() and arg.src2.is_int()): + return expr + src1 = ExprOp(expr.op, arg.src1) + src2 = ExprOp(expr.op, arg.src2) + return e_s(ExprCond(arg.cond, src1, src2)) + + def simp_slice_of_ext(_, expr): """ C.zeroExt(X)[A:B] => 0 if A >= size(C) diff --git a/test/expression/simplifications.py b/test/expression/simplifications.py index f36a7b4d..1f243425 100644 --- a/test/expression/simplifications.py +++ b/test/expression/simplifications.py @@ -457,6 +457,7 @@ to_test = [(ExprInt(1, 32) - ExprInt(1, 32), ExprInt(0, 32)), (ExprOp("signExt_16", ExprInt(-0x8, 8)), ExprInt(-0x8, 16)), (ExprCond(a8.zeroExtend(32), a, b), ExprCond(a8, a, b)), + (ExprCond(a8, bi1, bi0).zeroExtend(32), ExprCond(a8, i1, i0)), (- (i2*a), a * im2), |