diff options
| author | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2015-02-12 15:24:10 +0100 |
|---|---|---|
| committer | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2015-02-13 13:26:24 +0100 |
| commit | 35b5007249fcc55e4b0a49b60145a07bc620c04b (patch) | |
| tree | ec763a754cbb872ab416e6711efd2ffbd4d68e92 /miasm2/expression/simplifications_common.py | |
| parent | d58c585396324bb8e6c7f403ef4496320a44a7a6 (diff) | |
| download | miasm-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.py | 16 |
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) |