about summary refs log tree commit diff stats
path: root/miasm2/ir/translators/z3_ir.py
diff options
context:
space:
mode:
authorserpilliere <serpilliere@users.noreply.github.com>2018-05-15 11:19:41 +0200
committerGitHub <noreply@github.com>2018-05-15 11:19:41 +0200
commit4dae0d5df51165d2c535f0812761dc6bdadfe88e (patch)
tree392c861b580d89bb8be80856fd8403d1d7c0e2bf /miasm2/ir/translators/z3_ir.py
parent833524bb7291e82613afba2184b3c0c9801445f5 (diff)
parentde4295331794e81937a5c4073c37808ec63beaa4 (diff)
downloadmiasm-4dae0d5df51165d2c535f0812761dc6bdadfe88e.tar.gz
miasm-4dae0d5df51165d2c535f0812761dc6bdadfe88e.zip
Merge pull request #740 from commial/refactor/bsr-bsf
Refactor/bsr bsf
Diffstat (limited to '')
-rw-r--r--miasm2/ir/translators/z3_ir.py15
1 files changed, 8 insertions, 7 deletions
diff --git a/miasm2/ir/translators/z3_ir.py b/miasm2/ir/translators/z3_ir.py
index 74bdd79c..536daff1 100644
--- a/miasm2/ir/translators/z3_ir.py
+++ b/miasm2/ir/translators/z3_ir.py
@@ -207,19 +207,20 @@ class TranslatorZ3(Translator):
                 res = res ^ z3.Extract(i, i, arg)
         elif expr.op == '-':
             res = -res
-        elif expr.op == "bsf":
+        elif expr.op == "cnttrailzeros":
             size = expr.size
             src = res
-            res = z3.If((src & (1 << (size - 1))) != 0, size - 1, src)
-            for i in xrange(size - 2, -1, -1):
+            res = z3.If(src == 0, size, src)
+            for i in xrange(size - 1, -1, -1):
                 res = z3.If((src & (1 << i)) != 0, i, res)
-        elif expr.op == "bsr":
+        elif expr.op == "cntleadzeros":
             size = expr.size
             src = res
-            res = z3.If((src & 1) != 0, 0, src)
-            for i in xrange(size - 1, 0, -1):
+            res = z3.If(src == 0, size, src)
+            for i in xrange(size, 0, -1):
                 index = - i % size
-                res = z3.If((src & (1 << index)) != 0, index, res)
+                out = size - (index + 1)
+                res = z3.If((src & (1 << index)) != 0, out, res)
         else:
             raise NotImplementedError("Unsupported OP yet: %s" % expr.op)