diff options
| author | serpilliere <serpilliere@users.noreply.github.com> | 2021-09-04 18:06:55 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-09-04 18:06:55 +0200 |
| commit | 9a36c6d7849335c83a9460fc558afb55ff0a2aa1 (patch) | |
| tree | 23a9c55430395b40b6e672e34b8d10909cc683a4 | |
| parent | 6a78add917efbbd3bc5c815c50feafaca1eb9e57 (diff) | |
| parent | 21ed885735381c1ea37e22977e8e68072e1cdf6e (diff) | |
| download | miasm-9a36c6d7849335c83a9460fc558afb55ff0a2aa1.tar.gz miasm-9a36c6d7849335c83a9460fc558afb55ff0a2aa1.zip | |
Merge pull request #1384 from serpilliere/add_simplification
Add flag cst simplification
| -rw-r--r-- | miasm/expression/simplifications.py | 1 | ||||
| -rw-r--r-- | miasm/expression/simplifications_common.py | 18 |
2 files changed, 18 insertions, 1 deletions
diff --git a/miasm/expression/simplifications.py b/miasm/expression/simplifications.py index f76de3f2..88e59983 100644 --- a/miasm/expression/simplifications.py +++ b/miasm/expression/simplifications.py @@ -66,6 +66,7 @@ class ExpressionSimplifier(ExprVisitorCallbackBottomToTop): simplifications_common.simp_bcdadd_cf, simplifications_common.simp_bcdadd, simplifications_common.simp_smod_sext, + simplifications_common.simp_flag_cst, ], m2_expr.ExprSlice: [ diff --git a/miasm/expression/simplifications_common.py b/miasm/expression/simplifications_common.py index 2ceb507c..835f8723 100644 --- a/miasm/expression/simplifications_common.py +++ b/miasm/expression/simplifications_common.py @@ -10,7 +10,7 @@ from miasm.expression.expression import ExprInt, ExprSlice, ExprMem, \ TOK_INF_EQUAL_SIGNED, TOK_INF_EQUAL_UNSIGNED, TOK_EQUAL from miasm.expression.expression_helper import parity, op_propag_cst, \ merge_sliceto_slice - +from miasm.expression.simplifications_explicit import simp_flags def simp_cst_propagation(e_s, expr): """This passe includes: @@ -1850,3 +1850,19 @@ def simp_smod_sext(expr_s, expr): # Case: int, b.signext() return ExprOp("smod", src1, src2).signExtend(expr.size) return expr + +# FLAG_SUB_OF(CST1, CST2) => CST +def simp_flag_cst(expr_simp, expr): + if expr.op not in [ + "FLAG_EQ", "FLAG_EQ_AND", "FLAG_SIGN_SUB", "FLAG_EQ_CMP", "FLAG_ADD_CF", + "FLAG_SUB_CF", "FLAG_ADD_OF", "FLAG_SUB_OF", "FLAG_EQ_ADDWC", "FLAG_ADDWC_OF", + "FLAG_SUBWC_OF", "FLAG_ADDWC_CF", "FLAG_SUBWC_CF", "FLAG_SIGN_ADDWC", + "FLAG_SIGN_SUBWC", "FLAG_EQ_SUBWC", + "CC_U<=", "CC_U>=", "CC_S<", "CC_S>", "CC_S<=", "CC_S>=", "CC_U>", + "CC_U<", "CC_NEG", "CC_EQ", "CC_NE", "CC_POS" + ]: + return expr + if not all(arg.is_int() for arg in expr.args): + return expr + new_expr = expr_simp(simp_flags(expr_simp, expr)) + return new_expr |