about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorserpilliere <serpilliere@users.noreply.github.com>2021-09-04 18:06:55 +0200
committerGitHub <noreply@github.com>2021-09-04 18:06:55 +0200
commit9a36c6d7849335c83a9460fc558afb55ff0a2aa1 (patch)
tree23a9c55430395b40b6e672e34b8d10909cc683a4
parent6a78add917efbbd3bc5c815c50feafaca1eb9e57 (diff)
parent21ed885735381c1ea37e22977e8e68072e1cdf6e (diff)
downloadmiasm-9a36c6d7849335c83a9460fc558afb55ff0a2aa1.tar.gz
miasm-9a36c6d7849335c83a9460fc558afb55ff0a2aa1.zip
Merge pull request #1384 from serpilliere/add_simplification
Add flag cst simplification
-rw-r--r--miasm/expression/simplifications.py1
-rw-r--r--miasm/expression/simplifications_common.py18
2 files changed, 18 insertions, 1 deletions
diff --git a/miasm/expression/simplifications.py b/miasm/expression/simplifications.py
index f76de3f2..88e59983 100644
--- a/miasm/expression/simplifications.py
+++ b/miasm/expression/simplifications.py
@@ -66,6 +66,7 @@ class ExpressionSimplifier(ExprVisitorCallbackBottomToTop):
             simplifications_common.simp_bcdadd_cf,
             simplifications_common.simp_bcdadd,
             simplifications_common.simp_smod_sext,
+            simplifications_common.simp_flag_cst,
         ],
 
         m2_expr.ExprSlice: [
diff --git a/miasm/expression/simplifications_common.py b/miasm/expression/simplifications_common.py
index 2ceb507c..835f8723 100644
--- a/miasm/expression/simplifications_common.py
+++ b/miasm/expression/simplifications_common.py
@@ -10,7 +10,7 @@ from miasm.expression.expression import ExprInt, ExprSlice, ExprMem, \
     TOK_INF_EQUAL_SIGNED, TOK_INF_EQUAL_UNSIGNED, TOK_EQUAL
 from miasm.expression.expression_helper import parity, op_propag_cst, \
     merge_sliceto_slice
-
+from miasm.expression.simplifications_explicit import simp_flags
 
 def simp_cst_propagation(e_s, expr):
     """This passe includes:
@@ -1850,3 +1850,19 @@ def simp_smod_sext(expr_s, expr):
                 # Case: int, b.signext()
                 return ExprOp("smod", src1, src2).signExtend(expr.size)
     return expr
+
+# FLAG_SUB_OF(CST1, CST2) => CST
+def simp_flag_cst(expr_simp, expr):
+    if expr.op not in [
+            "FLAG_EQ", "FLAG_EQ_AND", "FLAG_SIGN_SUB", "FLAG_EQ_CMP", "FLAG_ADD_CF",
+            "FLAG_SUB_CF", "FLAG_ADD_OF", "FLAG_SUB_OF", "FLAG_EQ_ADDWC", "FLAG_ADDWC_OF",
+            "FLAG_SUBWC_OF", "FLAG_ADDWC_CF", "FLAG_SUBWC_CF", "FLAG_SIGN_ADDWC",
+            "FLAG_SIGN_SUBWC", "FLAG_EQ_SUBWC",
+            "CC_U<=", "CC_U>=", "CC_S<", "CC_S>", "CC_S<=", "CC_S>=", "CC_U>",
+            "CC_U<", "CC_NEG", "CC_EQ", "CC_NE", "CC_POS"
+    ]:
+        return expr
+    if not all(arg.is_int() for arg in expr.args):
+        return expr
+    new_expr = expr_simp(simp_flags(expr_simp, expr))
+    return new_expr