diff options
Diffstat (limited to 'miasm2/expression/simplifications_common.py')
| -rw-r--r-- | miasm2/expression/simplifications_common.py | 49 |
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) |