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.py49
1 files changed, 49 insertions, 0 deletions
diff --git a/miasm2/expression/simplifications_common.py b/miasm2/expression/simplifications_common.py
index 489869f3..a073f41e 100644
--- a/miasm2/expression/simplifications_common.py
+++ b/miasm2/expression/simplifications_common.py
@@ -263,6 +263,55 @@ def simp_cst_propagation(e_s, e):
             return -ExprOp(op, *new_args)
         args = new_args
 
+    # A << int with A ExprCompose => move index
+    if op == "<<" and isinstance(args[0], ExprCompose) and isinstance(args[1], ExprInt):
+        final_size = args[0].size
+        shift = int(args[1].arg)
+        new_args = []
+        # shift indexes
+        for expr, start, stop in args[0].args:
+            new_args.append((expr, start+shift, stop+shift))
+        # filter out expression
+        filter_args = []
+        min_index = final_size
+        for expr, start, stop in new_args:
+            if start >= final_size:
+                continue
+            if stop > final_size:
+                expr = expr[:expr.size  - (stop - final_size)]
+                stop = final_size
+            filter_args.append((expr, start, stop))
+            min_index = min(start, min_index)
+        # create entry 0
+        expr = ExprInt_fromsize(min_index, 0)
+        filter_args = [(expr, 0, min_index)] + filter_args
+        return ExprCompose(filter_args)
+
+    # A >> int with A ExprCompose => move index
+    if op == ">>" and isinstance(args[0], ExprCompose) and isinstance(args[1], ExprInt):
+        final_size = args[0].size
+        shift = int(args[1].arg)
+        new_args = []
+        # shift indexes
+        for expr, start, stop in args[0].args:
+            new_args.append((expr, start-shift, stop-shift))
+        # filter out expression
+        filter_args = []
+        max_index = 0
+        for expr, start, stop in new_args:
+            if stop <= 0:
+                continue
+            if start < 0:
+                expr = expr[-start:]
+                start = 0
+            filter_args.append((expr, start, stop))
+            max_index = max(stop, max_index)
+        # create entry 0
+        expr = ExprInt_fromsize(final_size - max_index, 0)
+        filter_args += [(expr, max_index, final_size)]
+        return ExprCompose(filter_args)
+
+
     return ExprOp(op, *args)