diff options
| author | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2018-08-05 20:47:06 +0200 |
|---|---|---|
| committer | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2018-08-06 16:03:48 +0200 |
| commit | 9faaa42a9dc4c4d2ef142b33c358d7a2ac2ae21d (patch) | |
| tree | d78bfbbfeb8496f1399d60e4c2cfc0d177882208 /miasm2/ir/translators/C.py | |
| parent | 96d8c26cefb2bc9341805b7d410b7241d50191dd (diff) | |
| download | miasm-9faaa42a9dc4c4d2ef142b33c358d7a2ac2ae21d.tar.gz miasm-9faaa42a9dc4c4d2ef142b33c358d7a2ac2ae21d.zip | |
Translator/C: add zero/sign extend
Diffstat (limited to '')
| -rw-r--r-- | miasm2/ir/translators/C.py | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/miasm2/ir/translators/C.py b/miasm2/ir/translators/C.py index 11ccf137..33c21049 100644 --- a/miasm2/ir/translators/C.py +++ b/miasm2/ir/translators/C.py @@ -1,7 +1,7 @@ from miasm2.ir.translators.translator import Translator from miasm2.core import asmblock from miasm2.expression.modint import size2mask - +from miasm2.expression.expression import ExprInt, ExprCond, ExprCompose def int_size_to_bn(value, size): if size < 32: @@ -125,6 +125,28 @@ class TranslatorC(Translator): out = 'parity(%s)' % out return out + elif expr.op.startswith("zeroExt_"): + arg = expr.args[0] + if expr.size == arg.size: + return arg + return self.from_expr(ExprCompose(arg, ExprInt(0, expr.size - arg.size))) + + elif expr.op.startswith("signExt_"): + arg = expr.args[0] + if expr.size == arg.size: + return arg + add_size = expr.size - arg.size + new_expr = ExprCompose( + arg, + ExprCond( + arg.msb(), + ExprInt(size2mask(add_size), add_size), + ExprInt(0, add_size) + ) + ) + return self.from_expr(new_expr) + + elif expr.op in ['cntleadzeros', 'cnttrailzeros']: arg = expr.args[0] out = self.from_expr(arg) |