about summary refs log tree commit diff stats
path: root/miasm2/expression/simplifications_common.py
diff options
context:
space:
mode:
Diffstat (limited to 'miasm2/expression/simplifications_common.py')
-rw-r--r--miasm2/expression/simplifications_common.py59
1 files changed, 37 insertions, 22 deletions
diff --git a/miasm2/expression/simplifications_common.py b/miasm2/expression/simplifications_common.py
index 87720e08..a4b7c61e 100644
--- a/miasm2/expression/simplifications_common.py
+++ b/miasm2/expression/simplifications_common.py
@@ -909,6 +909,7 @@ def simp_cmp_int(expr_simp, expr):
     """
     ({X, 0} == int) => X == int[:]
     X + int1 == int2 => X == int2-int1
+    X ^ int1 == int2 => X == int1^int2
     """
     if (expr.is_op(TOK_EQUAL) and
           expr.args[1].is_int() and
@@ -922,28 +923,42 @@ def simp_cmp_int(expr_simp, expr):
         expr = expr_simp(
             ExprOp(TOK_EQUAL, src, new_int)
         )
-    elif (expr.is_op() and
-          expr.op in [
-              TOK_EQUAL,
-          ] and
-          expr.args[1].is_int() and
-          expr.args[0].is_op("+") and
-          expr.args[0].args[-1].is_int()):
-        # X + int1 == int2 => X == int2-int1
-        # WARNING:
-        # X - 0x10 <=u 0x20 gives X in [0x10 0x30]
-        # which is not equivalet to A <=u 0x10
-
-        left, right = expr.args
-        left, int_diff = left.args[:-1], left.args[-1]
-        if len(left) == 1:
-            left = left[0]
-        else:
-            left = ExprOp('+', *left)
-        new_int = expr_simp(right - int_diff)
-        expr = expr_simp(
-            ExprOp(expr.op, left, new_int),
-        )
+    elif not expr.is_op(TOK_EQUAL):
+        return expr
+    assert len(expr.args) == 2
+
+    left, right = expr.args
+    if left.is_int() and not right.is_int():
+        left, right = right, left
+    if not right.is_int():
+        return expr
+    if not (left.is_op() and left.op in ['+', '^']):
+        return expr
+    if not left.args[-1].is_int():
+        return expr
+    # X + int1 == int2 => X == int2-int1
+    # WARNING:
+    # X - 0x10 <=u 0x20 gives X in [0x10 0x30]
+    # which is not equivalet to A <=u 0x10
+
+    left_orig = left
+    left, last_int = left.args[:-1], left.args[-1]
+
+    if len(left) == 1:
+        left = left[0]
+    else:
+        left = ExprOp(left.op, *left)
+
+    if left_orig.op == "+":
+        new_int = expr_simp(right - last_int)
+    elif left_orig.op == '^':
+        new_int = expr_simp(right ^ last_int)
+    else:
+        raise RuntimeError("Unsupported operator")
+
+    expr = expr_simp(
+        ExprOp(TOK_EQUAL, left, new_int),
+    )
     return expr