about summary refs log tree commit diff stats
path: root/miasm2/jitter
diff options
context:
space:
mode:
Diffstat (limited to 'miasm2/jitter')
-rw-r--r--miasm2/jitter/llvmconvert.py28
-rw-r--r--miasm2/jitter/vm_mngr.c28
-rw-r--r--miasm2/jitter/vm_mngr.h4
3 files changed, 42 insertions, 18 deletions
diff --git a/miasm2/jitter/llvmconvert.py b/miasm2/jitter/llvmconvert.py
index 35db1538..eef34c16 100644
--- a/miasm2/jitter/llvmconvert.py
+++ b/miasm2/jitter/llvmconvert.py
@@ -227,12 +227,6 @@ class LLVMContext_JIT(LLVMContext):
         itype = LLVMType.IntType(64)
         fc = {"llvm.ctpop.i8": {"ret": i8,
                                 "args": [i8]},
-              "x86_bsr": {"ret": itype,
-                          "args": [itype,
-                                   itype]},
-              "x86_bsf": {"ret": itype,
-                          "args": [itype,
-                                   itype]},
               "segm2addr": {"ret": itype,
                             "args": [p8,
                                      itype,
@@ -377,9 +371,7 @@ class LLVMFunction():
     op_translate = {'cpuid': 'cpuid',
     }
     ## Add the size as first argument
-    op_translate_with_size = {'bsr': 'x86_bsr',
-                              'bsf': 'x86_bsf',
-    }
+    op_translate_with_size = {}
     ## Add the size as suffix
     op_translate_with_suffix_size = {'bcdadd': 'bcdadd',
                                      'bcdadd_cf': 'bcdadd_cf',
@@ -714,6 +706,24 @@ class LLVMFunction():
                 self.update_cache(expr, ret)
                 return ret
 
+            if op in ["cntleadzeros", "cnttrailzeros"]:
+                assert len(expr.args) == 1
+                arg = self.add_ir(expr.args[0])
+                func_name = {
+                    "cntleadzeros": "ctlz",
+                    "cnttrailzeros": "cttz",
+                }[op]
+                func_llvm_name = "llvm.%s.i%d" % (func_name, expr.size)
+                func_sig = {func_llvm_name: {
+                    "ret": LLVMType.IntType(expr.size),
+                    "args": [LLVMType.IntType(expr.args[0].size)]
+                }}
+                self.llvm_context.add_fc(func_sig, readonly=True)
+                ret = builder.call(self.mod.get_global(func_llvm_name),
+                                   [arg])
+                self.update_cache(expr, ret)
+                return ret
+
             if op == "segm":
                 fc_ptr = self.mod.get_global("segm2addr")
 
diff --git a/miasm2/jitter/vm_mngr.c b/miasm2/jitter/vm_mngr.c
index 3a0e51d3..4331a2ac 100644
--- a/miasm2/jitter/vm_mngr.c
+++ b/miasm2/jitter/vm_mngr.c
@@ -832,27 +832,41 @@ uint64_t rot_right(uint64_t size, uint64_t a, uint64_t b)
     }
 }
 
-unsigned int x86_bsr(uint64_t size, uint64_t src)
+/*
+ * Count leading zeros - count the number of zero starting at the most
+ * significant bit
+ *
+ * Example:
+ * - cntleadzeros(size=32, src=2): 30
+ * - cntleadzeros(size=32, src=0): 32
+ */
+unsigned int cntleadzeros(uint64_t size, uint64_t src)
 {
 	int64_t i;
 
 	for (i=(int64_t)size-1; i>=0; i--){
 		if (src & (1ull << i))
-			return i;
+			return size - (i + 1);
 	}
-	fprintf(stderr, "sanity check error bsr\n");
-	exit(EXIT_FAILURE);
+	return size;
 }
 
-unsigned int x86_bsf(uint64_t size, uint64_t src)
+/*
+ * Count trailing zeros - count the number of zero starting at the least
+ * significant bit
+ *
+ * Example:
+ * - cnttrailzeros(size=32, src=2): 1
+ * - cnttrailzeros(size=32, src=0): 32
+ */
+unsigned int cnttrailzeros(uint64_t size, uint64_t src)
 {
 	uint64_t i;
 	for (i=0; i<size; i++){
 		if (src & (1ull << i))
 			return i;
 	}
-	fprintf(stderr, "sanity check error bsf\n");
-	exit(EXIT_FAILURE);
+	return size;
 }
 
 
diff --git a/miasm2/jitter/vm_mngr.h b/miasm2/jitter/vm_mngr.h
index f050f7c0..b101b6ca 100644
--- a/miasm2/jitter/vm_mngr.h
+++ b/miasm2/jitter/vm_mngr.h
@@ -219,8 +219,8 @@ unsigned int umul16_hi(unsigned short a, unsigned short b);
 uint64_t rot_left(uint64_t size, uint64_t a, uint64_t b);
 uint64_t rot_right(uint64_t size, uint64_t a, uint64_t b);
 
-unsigned int x86_bsr(uint64_t size, uint64_t src);
-unsigned int x86_bsf(uint64_t size, uint64_t src);
+unsigned int cntleadzeros(uint64_t size, uint64_t src);
+unsigned int cnttrailzeros(uint64_t size, uint64_t src);
 
 #define UDIV(sizeA)						\
 	uint ## sizeA ## _t udiv ## sizeA (vm_cpu_t* vmcpu, uint ## sizeA ## _t a, uint ## sizeA ## _t b) \