about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorFabrice Desclaux <fabrice.desclaux@cea.fr>2020-12-28 20:07:22 +0100
committerFabrice Desclaux <fabrice.desclaux@cea.fr>2020-12-28 20:07:22 +0100
commit6f3a19f40c9d941666cdba8742d4f431579d42c9 (patch)
tree04c87810ee20653215d523468eafe818263e24c0
parentde3d1ed055e39525803cba0c2ffdb3f65f11607e (diff)
downloadmiasm-6f3a19f40c9d941666cdba8742d4f431579d42c9.tar.gz
miasm-6f3a19f40c9d941666cdba8742d4f431579d42c9.zip
Add simplification
The simplification added in ce175bb51 may take reduction before
simp_cc_conds. This add simplifications for remaining case.
-rw-r--r--miasm/expression/simplifications.py1
-rw-r--r--miasm/expression/simplifications_common.py12
-rw-r--r--test/expression/simplifications.py11
3 files changed, 24 insertions, 0 deletions
diff --git a/miasm/expression/simplifications.py b/miasm/expression/simplifications.py
index 38c4cbf4..f76de3f2 100644
--- a/miasm/expression/simplifications.py
+++ b/miasm/expression/simplifications.py
@@ -89,6 +89,7 @@ class ExpressionSimplifier(ExprVisitorCallbackBottomToTop):
             simplifications_common.simp_cond_sign_bit,
             simplifications_common.simp_cond_eq_1_0,
             simplifications_common.simp_cond_cc_flag,
+            simplifications_common.simp_cond_sub_cf,
         ],
         m2_expr.ExprMem: [simplifications_common.simp_mem],
 
diff --git a/miasm/expression/simplifications_common.py b/miasm/expression/simplifications_common.py
index af409286..2ceb507c 100644
--- a/miasm/expression/simplifications_common.py
+++ b/miasm/expression/simplifications_common.py
@@ -965,6 +965,18 @@ def simp_cond_cc_flag(expr_simp, expr):
         return ExprCond(arg, expr.src2, expr.src1)
     return expr
 
+def simp_cond_sub_cf(expr_simp, expr):
+    """
+    ExprCond(FLAG_SUB_CF(A, B), X, Y) => ExprCond(A <u B, X, Y)
+    """
+    if not expr.is_cond():
+        return expr
+    if not expr.cond.is_op("FLAG_SUB_CF"):
+        return expr
+    cond = ExprOp(TOK_INF_UNSIGNED, *expr.cond.args)
+    return ExprCond(cond, expr.src1, expr.src2)
+
+
 def simp_cmp_int(expr_simp, expr):
     """
     ({X, 0} == int) => X == int[:]
diff --git a/test/expression/simplifications.py b/test/expression/simplifications.py
index c75dc0d3..96ab8a59 100644
--- a/test/expression/simplifications.py
+++ b/test/expression/simplifications.py
@@ -807,6 +807,17 @@ to_test = [
         ),
     ),
 
+    (
+        ExprCond(
+            ExprOp("FLAG_SUB_CF", a, b),
+            c, d
+        ),
+        ExprCond(
+            ExprOp("<u", a, b),
+            c, d
+        ),
+    ),
+
 
 
 ]