about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorserpilliere <serpilliere@users.noreply.github.com>2018-08-23 12:20:21 +0200
committerGitHub <noreply@github.com>2018-08-23 12:20:21 +0200
commit256783dc0292e443a7de496784a0f7a039770ce4 (patch)
tree6b45ca90778eaf1f42f6c6185059c8980013bff3
parent46bb6b39453ea8b5abb04dfd62492e429376a8ea (diff)
parentdc7b532f0f50694e924e80618ef26333c7dda6c7 (diff)
downloadmiasm-256783dc0292e443a7de496784a0f7a039770ce4.tar.gz
miasm-256783dc0292e443a7de496784a0f7a039770ce4.zip
Merge pull request #817 from GAJaloyan/master
adding a new simplification for double zeroExtends.
-rw-r--r--miasm2/expression/simplifications.py2
-rw-r--r--miasm2/expression/simplifications_common.py19
2 files changed, 21 insertions, 0 deletions
diff --git a/miasm2/expression/simplifications.py b/miasm2/expression/simplifications.py
index 712488e3..d3628ae8 100644
--- a/miasm2/expression/simplifications.py
+++ b/miasm2/expression/simplifications.py
@@ -42,6 +42,8 @@ class ExpressionSimplifier(object):
             simplifications_common.simp_subwc_cf,
             simplifications_common.simp_subwc_of,
             simplifications_common.simp_sign_subwc_cf,
+            simplifications_common.simp_double_zeroext,
+            simplifications_common.simp_double_signext,
             simplifications_common.simp_zeroext_eq_cst,
 
         ],
diff --git a/miasm2/expression/simplifications_common.py b/miasm2/expression/simplifications_common.py
index fa2370bd..c786a6a5 100644
--- a/miasm2/expression/simplifications_common.py
+++ b/miasm2/expression/simplifications_common.py
@@ -990,6 +990,25 @@ def simp_sign_subwc_cf(expr_s, expr):
 
     return ExprOp("FLAG_SIGN_SUB", op1, op2)
 
+def simp_double_zeroext(expr_s, expr):
+    # A.zeroExt(X).zeroExt(Y) => A.zeroExt(Y)
+    if not (expr.is_op() and expr.op.startswith("zeroExt")):
+        return expr
+    arg1 = expr.args[0]
+    if not (arg1.is_op() and arg1.op.startswith("zeroExt")):
+        return expr
+    arg2 = arg1.args[0]
+    return ExprOp(expr.op, arg2)
+
+def simp_double_signext(expr_s, expr):
+    # A.signExt(X).signExt(Y) => A.signExt(Y)
+    if not (expr.is_op() and expr.op.startswith("signExt")):
+        return expr
+    arg1 = expr.args[0]
+    if not (arg1.is_op() and arg1.op.startswith("signExt")):
+        return expr
+    arg2 = arg1.args[0]
+    return ExprOp(expr.op, arg2)
 
 def simp_zeroext_eq_cst(expr_s, expr):
     # A.zeroExt(X) == int => A == int[:A.size]