about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--miasm2/expression/simplifications_common.py14
1 files changed, 11 insertions, 3 deletions
diff --git a/miasm2/expression/simplifications_common.py b/miasm2/expression/simplifications_common.py
index f7171091..00b14554 100644
--- a/miasm2/expression/simplifications_common.py
+++ b/miasm2/expression/simplifications_common.py
@@ -1300,11 +1300,17 @@ def simp_slice_of_ext(_, expr):
     return expr
 
 def simp_slice_of_op_ext(expr_s, expr):
-    """(X.zeroExt() + ... + Int)[0:8] => X + ... + int[:]"""
+    """
+    (X.zeroExt() + {Z, } + ... + Int)[0:8] => X + ... + int[:]
+    (X.zeroExt() | ... | Int)[0:8] => X | ... | int[:]
+    ...
+    """
     if expr.start != 0:
         return expr
     src = expr.arg
-    if not src.is_op("+"):
+    if not src.is_op():
+        return expr
+    if src.op not in ['+', '|', '^', '&']:
         return expr
     is_ok = True
     for arg in src.args:
@@ -1314,12 +1320,14 @@ def simp_slice_of_op_ext(expr_s, expr):
             arg.op.startswith("zeroExt") and
             arg.args[0].size == expr.stop):
             continue
+        if arg.is_compose():
+            continue
         is_ok = False
         break
     if not is_ok:
         return expr
     args = [expr_s(arg[:expr.stop]) for arg in src.args]
-    return ExprOp("+", *args)
+    return ExprOp(src.op, *args)
 
 
 def simp_cond_logic_ext(expr_s, expr):