diff options
| author | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2017-09-01 16:15:19 +0200 |
|---|---|---|
| committer | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2017-09-04 22:42:53 +0200 |
| commit | a443268da284479438bfb82f59118d0634f074ed (patch) | |
| tree | 52e78215786ac30af74ee3eb1a6ed0bb68a7444d | |
| parent | 73a4d9dc920fcc29de50b776b2b263bfc12c89c1 (diff) | |
| download | miasm-a443268da284479438bfb82f59118d0634f074ed.tar.gz miasm-a443268da284479438bfb82f59118d0634f074ed.zip | |
X86: add sem pcmp*
| -rw-r--r-- | miasm2/arch/x86/sem.py | 44 |
1 files changed, 39 insertions, 5 deletions
diff --git a/miasm2/arch/x86/sem.py b/miasm2/arch/x86/sem.py index 1fceab30..5d564fb1 100644 --- a/miasm2/arch/x86/sem.py +++ b/miasm2/arch/x86/sem.py @@ -3819,25 +3819,53 @@ def pminud(ir, instr, dst, src): def pcmpeq(_, instr, dst, src, size): e = [] for i in xrange(0, dst.size, size): - test = dst[i:i + size] - src[i:i + size] + test = m2_expr.expr_is_equal(dst[i:i + size], src[i:i + size]) e.append(m2_expr.ExprAff(dst[i:i + size], m2_expr.ExprCond(test, - m2_expr.ExprInt(0, size), - m2_expr.ExprInt(-1, size)))) + m2_expr.ExprInt(-1, size), + m2_expr.ExprInt(0, size)))) + return e, [] + + +def pcmpgt(_, instr, dst, src, size): + e = [] + for i in xrange(0, dst.size, size): + test = m2_expr.expr_is_signed_greater(dst[i:i + size], src[i:i + size]) + e.append(m2_expr.ExprAff(dst[i:i + size], + m2_expr.ExprCond(test, + m2_expr.ExprInt(-1, size), + m2_expr.ExprInt(0, size)))) return e, [] def pcmpeqb(ir, instr, dst, src): return pcmpeq(ir, instr, dst, src, 8) - def pcmpeqw(ir, instr, dst, src): return pcmpeq(ir, instr, dst, src, 16) - def pcmpeqd(ir, instr, dst, src): return pcmpeq(ir, instr, dst, src, 32) +def pcmpeqq(ir, instr, dst, src): + return pcmpeq(ir, instr, dst, src, 64) + + + + +def pcmpgtb(ir, instr, dst, src): + return pcmpgt(ir, instr, dst, src, 8) + +def pcmpgtw(ir, instr, dst, src): + return pcmpgt(ir, instr, dst, src, 16) + +def pcmpgtd(ir, instr, dst, src): + return pcmpgt(ir, instr, dst, src, 32) + +def pcmpgtq(ir, instr, dst, src): + return pcmpgt(ir, instr, dst, src, 64) + + def punpck(_, instr, dst, src, size, off): e = [] @@ -4504,6 +4532,12 @@ mnemo_func = {'mov': mov, "pcmpeqb": pcmpeqb, "pcmpeqw": pcmpeqw, "pcmpeqd": pcmpeqd, + "pcmpeqq": pcmpeqq, + + "pcmpgtb": pcmpgtb, + "pcmpgtw": pcmpgtw, + "pcmpgtd": pcmpgtd, + "pcmpgtq": pcmpgtq, "punpckhbw": punpckhbw, "punpckhwd": punpckhwd, |