about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorserpilliere <serpilliere@users.noreply.github.com>2020-03-20 13:26:27 +0100
committerGitHub <noreply@github.com>2020-03-20 13:26:27 +0100
commita040288c541f3b2d05fe1ce50f4c30a22572a3fb (patch)
treeae6f62c1b4cc26c493f4b4ffa003a826989b4d8e
parentfc8c0c77c2e0d99ceaa37407ff6c5cbcf469962c (diff)
parent46d99843243bf5f8ebf1db653183aa8e4a2a4f87 (diff)
downloadmiasm-a040288c541f3b2d05fe1ce50f4c30a22572a3fb.tar.gz
miasm-a040288c541f3b2d05fe1ce50f4c30a22572a3fb.zip
Merge pull request #1161 from serpilliere/add_simplifications
Add simplifications
-rw-r--r--miasm/expression/simplifications.py2
-rw-r--r--miasm/expression/simplifications_common.py26
-rw-r--r--test/expression/simplifications.py1
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),