diff options
Diffstat (limited to 'miasm2/jitter')
| -rw-r--r-- | miasm2/jitter/llvmconvert.py | 28 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr.c | 28 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr.h | 4 |
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) \ |