about summary refs log tree commit diff stats
path: root/miasm2/jitter/llvmconvert.py
diff options
context:
space:
mode:
authorAjax <commial@gmail.com>2018-12-20 16:01:57 +0100
committerAjax <commial@gmail.com>2018-12-20 16:01:57 +0100
commit31b0a6b52e75192f7eae24d0acaf2264b272dcd6 (patch)
tree36d31a52a3c5f96c348f70aff0f60304ee02a586 /miasm2/jitter/llvmconvert.py
parenta679b2fc7783004b3eb610428d07721dcc9d86d6 (diff)
downloadmiasm-31b0a6b52e75192f7eae24d0acaf2264b272dcd6.tar.gz
miasm-31b0a6b52e75192f7eae24d0acaf2264b272dcd6.zip
LLVM: add basic support for unsigned comparison
Diffstat (limited to '')
-rw-r--r--miasm2/jitter/llvmconvert.py18
1 files changed, 17 insertions, 1 deletions
diff --git a/miasm2/jitter/llvmconvert.py b/miasm2/jitter/llvmconvert.py
index 4fa67eaf..5ae94d9b 100644
--- a/miasm2/jitter/llvmconvert.py
+++ b/miasm2/jitter/llvmconvert.py
@@ -482,7 +482,7 @@ class LLVMContext_IRCompilation(LLVMContext):
         return builder.store(value, ptr_casted)
 
 
-class LLVMFunction():
+class LLVMFunction(object):
     """Represent a LLVM function
 
     Implementation note:
@@ -893,6 +893,22 @@ class LLVMFunction():
                 self.update_cache(expr, ret)
                 return ret
 
+            unsigned_cmps = {
+                "==": "==",
+                "<u": "<",
+                "<=u": "<="
+            }
+            if op in unsigned_cmps:
+                op = unsigned_cmps[op]
+                args = [self.add_ir(arg) for arg in expr.args]
+                ret = builder.select(builder.icmp_unsigned(op,
+                                                           args[0],
+                                                           args[1]),
+                                     llvm_ir.IntType(expr.size)(1),
+                                     llvm_ir.IntType(expr.size)(0))
+                self.update_cache(expr, ret)
+                return ret
+
             if op in [">>", "<<", "a>>"]:
                 assert len(expr.args) == 2
                 # Undefined behavior must be enforced to 0