diff options
| author | serpilliere <fabrice.desclaux@cea.fr> | 2015-10-17 22:26:59 +0200 |
|---|---|---|
| committer | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2015-10-23 10:47:24 +0200 |
| commit | ea40c6b0bf5967694e844b2731c22cacc2931950 (patch) | |
| tree | e8074019048538a48ea3761a965b0926b72f1ac4 | |
| parent | 619a75e44fdf0a9e9e0a485615f41941fd60d78e (diff) | |
| download | miasm-ea40c6b0bf5967694e844b2731c22cacc2931950.tar.gz miasm-ea40c6b0bf5967694e844b2731c22cacc2931950.zip | |
Arch/x86/sem: Fix vectorized subtraction generation
* We cannot call ExprOp('-', A, B) as '-' is unary operator.
* We must write A - B which will generate ExprOp('+', A, ExprOp('-', B))
* Expression could be modified to automatize this behaviour, but we keep it like this to allow this representation
| -rw-r--r-- | miasm2/arch/x86/sem.py | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/miasm2/arch/x86/sem.py b/miasm2/arch/x86/sem.py index f99d2d9d..5ea99915 100644 --- a/miasm2/arch/x86/sem.py +++ b/miasm2/arch/x86/sem.py @@ -3115,22 +3115,35 @@ def xorps(ir, instr, a, b): def vec_vertical_sem(op, elt_size, reg_size, a, b): assert(reg_size % elt_size == 0) n = reg_size/elt_size - ops = [(m2_expr.ExprOp(op, a[i*elt_size:(i+1)*elt_size], - b[i*elt_size:(i+1)*elt_size]), - i*elt_size, - (i+1)*elt_size) for i in xrange(0, n)] + if op == '-': + ops = [((a[i*elt_size:(i+1)*elt_size] - b[i*elt_size:(i+1)*elt_size]), + i*elt_size, (i+1)*elt_size) for i in xrange(0, n)] + else: + ops = [(m2_expr.ExprOp(op, a[i*elt_size:(i+1)*elt_size], + b[i*elt_size:(i+1)*elt_size]), + i*elt_size, + (i+1)*elt_size) for i in xrange(0, n)] + return m2_expr.ExprCompose(ops) def float_vec_vertical_sem(op, elt_size, reg_size, a, b): assert(reg_size % elt_size == 0) n = reg_size/elt_size - ops = [(m2_expr.ExprOp('double_to_int_%d' % elt_size, m2_expr.ExprOp(op, - m2_expr.ExprOp('int_%d_to_double' % elt_size, - a[i*elt_size:(i+1)*elt_size]), - m2_expr.ExprOp('int_%d_to_double' % elt_size, - b[i*elt_size:(i+1)*elt_size])) - ), - i*elt_size, (i+1)*elt_size) for i in xrange(0, n)] + + x_to_int, int_to_x = {32: ('float_to_int_%d', 'int_%d_to_float'), + 64: ('double_to_int_%d', 'int_%d_to_double')}[elt_size] + if op == '-': + ops = [(m2_expr.ExprOp(x_to_int % elt_size, + m2_expr.ExprOp(int_to_x % elt_size, a[i*elt_size:(i+1)*elt_size]) - + m2_expr.ExprOp(int_to_x % elt_size, b[i*elt_size:(i+1)*elt_size])), + i*elt_size, (i+1)*elt_size) for i in xrange(0, n)] + else: + ops = [(m2_expr.ExprOp(x_to_int % elt_size, + m2_expr.ExprOp(op, + m2_expr.ExprOp(int_to_x % elt_size, a[i*elt_size:(i+1)*elt_size]), + m2_expr.ExprOp(int_to_x % elt_size, b[i*elt_size:(i+1)*elt_size]))), + i*elt_size, (i+1)*elt_size) for i in xrange(0, n)] + return m2_expr.ExprCompose(ops) def __vec_vertical_instr_gen(op, elt_size, sem): |