about summary refs log tree commit diff stats
path: root/miasm2/expression/simplifications_common.py
diff options
context:
space:
mode:
authorFabrice Desclaux <fabrice.desclaux@cea.fr>2015-02-12 15:24:10 +0100
committerFabrice Desclaux <fabrice.desclaux@cea.fr>2015-02-13 13:26:24 +0100
commit35b5007249fcc55e4b0a49b60145a07bc620c04b (patch)
treeec763a754cbb872ab416e6711efd2ffbd4d68e92 /miasm2/expression/simplifications_common.py
parentd58c585396324bb8e6c7f403ef4496320a44a7a6 (diff)
downloadmiasm-35b5007249fcc55e4b0a49b60145a07bc620c04b.tar.gz
miasm-35b5007249fcc55e4b0a49b60145a07bc620c04b.zip
Expression/Simplification: add op/compose simplification
Diffstat (limited to 'miasm2/expression/simplifications_common.py')
-rw-r--r--miasm2/expression/simplifications_common.py16
1 files changed, 16 insertions, 0 deletions
diff --git a/miasm2/expression/simplifications_common.py b/miasm2/expression/simplifications_common.py
index a073f41e..13588ffd 100644
--- a/miasm2/expression/simplifications_common.py
+++ b/miasm2/expression/simplifications_common.py
@@ -312,6 +312,22 @@ def simp_cst_propagation(e_s, e):
         return ExprCompose(filter_args)
 
 
+    # Compose(a) OP Compose(b) with a/b same bounds => Compose(a OP b)
+    if op in ['|', '&', '^'] and all([isinstance(arg, ExprCompose) for arg in args]):
+        bounds = set()
+        for arg in args:
+            bound = tuple([(start, stop) for (expr, start, stop) in arg.args])
+            bounds.add(bound)
+        if len(bounds) == 1:
+            bound = list(bounds)[0]
+            new_args = [[expr] for (expr, start, stop) in args[0].args]
+            for sub_arg in args[1:]:
+                for i, (expr, start, stop) in enumerate(sub_arg.args):
+                    new_args[i].append(expr)
+            for i, arg in enumerate(new_args):
+                new_args[i] = ExprOp(op, *arg), bound[i][0], bound[i][1]
+            return ExprCompose(new_args)
+
     return ExprOp(op, *args)