diff options
| author | Hugo Porcher <hugo.r.porcher@gmail.com> | 2019-03-20 21:19:34 -0400 |
|---|---|---|
| committer | Hugo Porcher <hugo.r.porcher@gmail.com> | 2019-03-20 21:19:34 -0400 |
| commit | 9352e00584b64efd54f15e2c128f7482da64ae10 (patch) | |
| tree | 1c18dd926b3319cf947baf67c1c7bbfadd076fe8 /miasm/expression/simplifications_common.py | |
| parent | 91fb9d3f393bb511a3bdb57a38115ec29315c644 (diff) | |
| download | focaccia-miasm-9352e00584b64efd54f15e2c128f7482da64ae10.tar.gz focaccia-miasm-9352e00584b64efd54f15e2c128f7482da64ae10.zip | |
Add compose_and_mask simplification pass
Diffstat (limited to 'miasm/expression/simplifications_common.py')
| -rw-r--r-- | miasm/expression/simplifications_common.py | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/miasm/expression/simplifications_common.py b/miasm/expression/simplifications_common.py index cda9c5e2..ddd21a63 100644 --- a/miasm/expression/simplifications_common.py +++ b/miasm/expression/simplifications_common.py @@ -607,7 +607,6 @@ def simp_compose(e_s, expr): return ExprCond(cond, arg1, arg2) return ExprCompose(*args) - def simp_cond(_, expr): """ Common simplifications on ExprCond. @@ -1554,3 +1553,24 @@ def simp_add_multiple(_, expr): if len(out) == 1: return out[0] return ExprOp('+', *out) + +def simp_compose_and_mask(_, expr): + """ + {X 0 8, Y 8 16} & 0xFF => X + {X 0 32} & 0xFFFF => X[0:16] + {X 0 8, Y 8 24, Z 24 32} & 0xFFFFFF => X|Y + """ + if not expr.is_op('&'): + return expr + # handle the case where arg2 = arg1.mask + if len(expr.args) != 2: + return expr + arg1, arg2 = expr.args + if not arg1.is_compose(): + return expr + if not arg2.is_int(): + return expr + for i in range(8, arg1.size, 8): + if arg2.arg == ExprInt(0, i).mask.arg: + return ExprSlice(arg1, 0, i) + return expr |