about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--miasm2/expression/simplifications.py1
-rw-r--r--miasm2/expression/simplifications_common.py14
-rw-r--r--test/expression/simplifications.py3
3 files changed, 18 insertions, 0 deletions
diff --git a/miasm2/expression/simplifications.py b/miasm2/expression/simplifications.py
index b30ee1d0..a5978fbb 100644
--- a/miasm2/expression/simplifications.py
+++ b/miasm2/expression/simplifications.py
@@ -45,6 +45,7 @@ class ExpressionSimplifier(object):
             simplifications_common.simp_double_zeroext,
             simplifications_common.simp_double_signext,
             simplifications_common.simp_zeroext_eq_cst,
+            simplifications_common.simp_ext_eq_ext,
 
             simplifications_common.simp_cmp_int,
             simplifications_common.simp_cmp_int_int,
diff --git a/miasm2/expression/simplifications_common.py b/miasm2/expression/simplifications_common.py
index 9c002fa5..1ebd4878 100644
--- a/miasm2/expression/simplifications_common.py
+++ b/miasm2/expression/simplifications_common.py
@@ -1043,6 +1043,20 @@ def simp_zeroext_eq_cst(expr_s, expr):
         return ExprInt(0, 1)
     return ExprOp(TOK_EQUAL, src, ExprInt(int(arg2), src.size))
 
+def simp_ext_eq_ext(expr_s, expr):
+    # A.zeroExt(X) == B.zeroExt(X) => A == B
+    # A.signExt(X) == B.signExt(X) => A == B
+    if not expr.is_op(TOK_EQUAL):
+        return expr
+    arg1, arg2 = expr.args
+    if (not ((arg1.is_op() and arg1.op.startswith("zeroExt") and
+              arg2.is_op() and arg2.op.startswith("zeroExt")) or
+             (arg1.is_op() and arg1.op.startswith("signExt") and
+               arg2.is_op() and arg2.op.startswith("signExt")))):
+        return expr
+    if arg1.args[0].size != arg2.args[0].size:
+        return expr
+    return ExprOp(TOK_EQUAL, arg1.args[0], arg2.args[0])
 
 def simp_cond_eq_zero(expr_s, expr):
     # (X == 0)?(A:B) => X?(B:A)
diff --git a/test/expression/simplifications.py b/test/expression/simplifications.py
index 8f9656d4..741d6adb 100644
--- a/test/expression/simplifications.py
+++ b/test/expression/simplifications.py
@@ -495,6 +495,9 @@ to_test = [
     (ExprOp(TOK_INF_EQUAL_SIGNED, i1, im1), ExprInt(0, 1)),
     (ExprOp(TOK_INF_EQUAL_UNSIGNED, i1, im1), ExprInt(1, 1)),
 
+    (ExprOp(TOK_EQUAL, a8.zeroExtend(32), b8.zeroExtend(32)), ExprOp(TOK_EQUAL, a8, b8)),
+    (ExprOp(TOK_EQUAL, a8.signExtend(32), b8.signExtend(32)), ExprOp(TOK_EQUAL, a8, b8)),
+
 ]
 
 for e_input, e_check in to_test: