about summary refs log tree commit diff stats
path: root/miasm2/expression
diff options
context:
space:
mode:
Diffstat (limited to 'miasm2/expression')
-rw-r--r--miasm2/expression/simplifications.py6
-rw-r--r--miasm2/expression/simplifications_common.py53
-rw-r--r--miasm2/expression/simplifications_explicit.py8
3 files changed, 57 insertions, 10 deletions
diff --git a/miasm2/expression/simplifications.py b/miasm2/expression/simplifications.py
index 8ea9c41f..483331a6 100644
--- a/miasm2/expression/simplifications.py
+++ b/miasm2/expression/simplifications.py
@@ -55,6 +55,7 @@ class ExpressionSimplifier(object):
             simplifications_common.simp_zeroext_and_cst_eq_cst,
             simplifications_common.simp_test_signext_inf,
             simplifications_common.simp_test_zeroext_inf,
+            simplifications_common.simp_cond_inf_eq_unsigned_zero,
 
         ],
 
@@ -67,6 +68,7 @@ class ExpressionSimplifier(object):
         m2_expr.ExprCond: [
             simplifications_common.simp_cond,
             simplifications_common.simp_cond_zeroext,
+            simplifications_common.simp_cond_add,
             # CC op
             simplifications_common.simp_cond_flag,
             simplifications_common.simp_cmp_int_arg,
@@ -75,11 +77,13 @@ class ExpressionSimplifier(object):
             simplifications_common.simp_x_and_cst_eq_cst,
             simplifications_common.simp_cond_logic_ext,
             simplifications_common.simp_cond_sign_bit,
+            simplifications_common.simp_cond_eq_1_0,
         ],
         m2_expr.ExprMem: [simplifications_common.simp_mem],
 
     }
 
+
     # Heavy passes
     PASS_HEAVY = {}
 
@@ -193,8 +197,6 @@ class ExpressionSimplifier(object):
 expr_simp = ExpressionSimplifier()
 expr_simp.enable_passes(ExpressionSimplifier.PASS_COMMONS)
 
-
-
 expr_simp_high_to_explicit = ExpressionSimplifier()
 expr_simp_high_to_explicit.enable_passes(ExpressionSimplifier.PASS_HIGH_TO_EXPLICIT)
 
diff --git a/miasm2/expression/simplifications_common.py b/miasm2/expression/simplifications_common.py
index 00b14554..87720e08 100644
--- a/miasm2/expression/simplifications_common.py
+++ b/miasm2/expression/simplifications_common.py
@@ -1375,6 +1375,59 @@ def simp_cond_sign_bit(_, expr):
     return ExprCond(cond, expr.src1, expr.src2)
 
 
+def simp_cond_add(expr_s, expr):
+    """
+    (a+b)?X:Y => (a == b)?Y:X
+    (a^b)?X:Y => (a == b)?Y:X
+    """
+    cond = expr.cond
+    if not cond.is_op():
+        return expr
+    if cond.op not in ['+', '^']:
+        return expr
+    if len(cond.args) != 2:
+        return expr
+    arg1, arg2 = cond.args
+    if cond.is_op('+'):
+        new_cond = ExprOp('==', arg1, expr_s(-arg2))
+    elif cond.is_op('^'):
+        new_cond = ExprOp('==', arg1, arg2)
+    else:
+        raise ValueError('Bad case')
+    return ExprCond(new_cond, expr.src2, expr.src1)
+
+
+def simp_cond_eq_1_0(expr_s, expr):
+    """
+    (a == b)?ExprInt(1, 1):ExprInt(0, 1) => a == b
+    (a <s b)?ExprInt(1, 1):ExprInt(0, 1) => a == b
+    ...
+    """
+    cond = expr.cond
+    if not cond.is_op():
+        return expr
+    if cond.op not in [
+            TOK_EQUAL,
+            TOK_INF_SIGNED, TOK_INF_EQUAL_SIGNED,
+            TOK_INF_UNSIGNED, TOK_INF_EQUAL_UNSIGNED
+            ]:
+        return expr
+    if expr.src1 != ExprInt(1, 1) or expr.src2 != ExprInt(0, 1):
+        return expr
+    return cond
+
+
+def simp_cond_inf_eq_unsigned_zero(expr_s, expr):
+    """
+    (a <=u 0) => a == 0
+    """
+    if not expr.is_op(TOK_INF_EQUAL_UNSIGNED):
+        return expr
+    if not expr.args[1].is_int(0):
+        return expr
+    return ExprOp(TOK_EQUAL, expr.args[0], expr.args[1])
+
+
 def simp_test_signext_inf(expr_s, expr):
     """A.signExt() <s int => A <s int[:]"""
     if not (expr.is_op(TOK_INF_SIGNED) or expr.is_op(TOK_INF_EQUAL_SIGNED)):
diff --git a/miasm2/expression/simplifications_explicit.py b/miasm2/expression/simplifications_explicit.py
index 4c5dde3e..00892201 100644
--- a/miasm2/expression/simplifications_explicit.py
+++ b/miasm2/expression/simplifications_explicit.py
@@ -155,13 +155,5 @@ def simp_flags(_, expr):
         op_nf, = args
         return ~op_nf
 
-    elif expr.is_op(TOK_EQUAL):
-        arg1, arg2 = args
-        return ExprCond(
-            arg1 - arg2,
-            ExprInt(0, expr.size),
-            ExprInt(1, expr.size),
-        )
-
     return expr