about summary refs log tree commit diff stats
path: root/miasm2/expression/simplifications_common.py
diff options
context:
space:
mode:
authorAjax <commial@gmail.com>2017-06-01 17:33:13 +0200
committerAjax <commial@gmail.com>2017-06-01 17:33:13 +0200
commit274cff35ec85c149c9fbcccbc135349509baa31c (patch)
tree163258e5e4981a7a2b1b53eeee16ff80b0f55e6d /miasm2/expression/simplifications_common.py
parente0235fcd5ee2e29d0b6b13cc576ae6fe23ed0b30 (diff)
downloadmiasm-274cff35ec85c149c9fbcccbc135349509baa31c.tar.gz
miasm-274cff35ec85c149c9fbcccbc135349509baa31c.zip
Add a new simplification: {@X[base + i] 0 X, @Y[base + i + X] X (X + Y)} => @(X+Y)[base + i]
Diffstat (limited to 'miasm2/expression/simplifications_common.py')
-rw-r--r--miasm2/expression/simplifications_common.py11
1 files changed, 11 insertions, 0 deletions
diff --git a/miasm2/expression/simplifications_common.py b/miasm2/expression/simplifications_common.py
index 01db7597..eb9d0958 100644
--- a/miasm2/expression/simplifications_common.py
+++ b/miasm2/expression/simplifications_common.py
@@ -542,6 +542,17 @@ def simp_compose(e_s, e):
             new_e = args[0].arg >> ExprInt(args[0].start, args[0].arg.size)
             return new_e
 
+    # {@X[base + i] 0 X, @Y[base + i + X] X (X + Y)} => @(X+Y)[base + i]
+    for i, arg in enumerate(args[:-1]):
+        nxt = args[i + 1]
+        if arg.is_mem() and nxt.is_mem():
+            gap = e_s(nxt.arg - arg.arg)
+            if gap.is_int() and int(gap) == arg.size / 8:
+                args = args[:i] + [ExprMem(arg.arg,
+                                          arg.size + nxt.size)] + args[i + 2:]
+                return ExprCompose(*args)
+
+
     # Compose with ExprCond with integers for src1/src2 and intergers =>
     # propagage integers
     # {XXX?(0x0,0x1)?(0x0,0x1),0,8, 0x0,8,32} => XXX?(int1, int2)