about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--miasm2/arch/x86/sem.py13
-rw-r--r--miasm2/jitter/arch/JitCore_x86.c3
-rw-r--r--miasm2/jitter/llvmconvert.py30
-rw-r--r--test/test_all.py2
4 files changed, 43 insertions, 5 deletions
diff --git a/miasm2/arch/x86/sem.py b/miasm2/arch/x86/sem.py
index 152208d4..ea5830e3 100644
--- a/miasm2/arch/x86/sem.py
+++ b/miasm2/arch/x86/sem.py
@@ -1732,9 +1732,11 @@ def float_pop(avoid_flt=None, popcount=1):
         if avoid_flt != float_list[i]:
             e.append(m2_expr.ExprAff(float_list[i],
                                      float_list[i + popcount]))
+    fill_value = m2_expr.ExprOp("int_64_to_double",
+                                m2_expr.ExprInt(0, float_list[i].size))
     for i in xrange(8 - popcount, 8):
         e.append(m2_expr.ExprAff(float_list[i],
-                                 m2_expr.ExprInt(0, float_list[i].size)))
+                                 fill_value))
     e.append(
         m2_expr.ExprAff(float_stack_ptr,
                         float_stack_ptr - m2_expr.ExprInt(popcount, 3)))
@@ -2906,13 +2908,20 @@ def bittest_get(a, b):
         b_mask = {16: 4, 32: 5, 64: 6}
         b_decal = {16: 1, 32: 3, 64: 7}
         ptr = a.arg
+        segm = a.is_op_segm()
+        if segm:
+            ptr = ptr.args[1]
+
         off_bit = b.zeroExtend(
             a.size) & m2_expr.ExprInt((1 << b_mask[a.size]) - 1,
                                       a.size)
         off_byte = ((b.zeroExtend(ptr.size) >> m2_expr.ExprInt(3, ptr.size)) &
                     m2_expr.ExprInt(((1 << a.size) - 1) ^ b_decal[a.size], ptr.size))
 
-        d = m2_expr.ExprMem(ptr + off_byte, a.size)
+        addr = ptr + off_byte
+        if segm:
+            addr = m2_expr.ExprOp("segm", a.arg.args[0], addr)
+        d = m2_expr.ExprMem(addr, a.size)
     else:
         off_bit = m2_expr.ExprOp('&', b, m2_expr.ExprInt(a.size - 1, a.size))
         d = a
diff --git a/miasm2/jitter/arch/JitCore_x86.c b/miasm2/jitter/arch/JitCore_x86.c
index 66c3fb56..461e2224 100644
--- a/miasm2/jitter/arch/JitCore_x86.c
+++ b/miasm2/jitter/arch/JitCore_x86.c
@@ -603,6 +603,9 @@ PyObject* get_gpreg_offset_all(void)
     get_reg_off(exception_flags);
 
     get_reg_off(float_stack_ptr);
+    get_reg_off(reg_float_cs);
+    get_reg_off(reg_float_eip);
+    get_reg_off(reg_float_control);
 
     return dict;
 }
diff --git a/miasm2/jitter/llvmconvert.py b/miasm2/jitter/llvmconvert.py
index 08b1986b..cfe89059 100644
--- a/miasm2/jitter/llvmconvert.py
+++ b/miasm2/jitter/llvmconvert.py
@@ -228,6 +228,9 @@ class LLVMContext_JIT(LLVMContext):
                                    "args": [p8,
                                             itype,
                                             itype]}})
+        self.add_fc({"cpuid": {"ret": itype,
+                               "args": [itype,
+                                        itype]}})
 
         for k in [8, 16]:
             self.add_fc({"bcdadd_%s" % k: {"ret": LLVMType.IntType(k),
@@ -327,6 +330,7 @@ class LLVMFunction():
     # Operation translation
     ## Basics
     op_translate = {'parity': 'parity',
+                    'cpuid': 'cpuid',
     }
     ## Add the size as first argument
     op_translate_with_size = {'<<<': 'rot_left',
@@ -418,9 +422,13 @@ class LLVMFunction():
         ptr = builder.gep(self.local_vars["vmcpu"],
                           [llvm_ir.Constant(LLVMType.IntType(),
                                             offset)])
-        int_size = LLVMType.IntType(expr.size)
+        regs = self.llvm_context.ir_arch.arch.regs
+        if hasattr(regs, "float_list") and expr in regs.float_list:
+            pointee_type = llvm_ir.DoubleType()
+        else:
+            pointee_type = LLVMType.IntType(expr.size)
         ptr_casted = builder.bitcast(ptr,
-                                     llvm_ir.PointerType(int_size))
+                                     llvm_ir.PointerType(pointee_type))
         # Store in cache
         self.local_vars_pointers[name] = ptr_casted
 
@@ -702,6 +710,20 @@ class LLVMFunction():
                 self.update_cache(expr, ret)
                 return ret
 
+            if op in ["int_16_to_double", "int_32_to_double", "int_64_to_double",
+                      "mem_16_to_double", "mem_32_to_double", "mem_64_to_double"]:
+                arg = self.add_ir(expr.args[0])
+                ret = builder.uitofp(arg, llvm_ir.DoubleType())
+                self.update_cache(expr, ret)
+                return ret
+
+            if op in ["double_to_int_16", "double_to_int_32", "double_to_int_64",
+                      "double_to_mem_16", "double_to_mem_32", "double_to_mem_64"]:
+                arg = self.add_ir(expr.args[0])
+                ret = builder.fptoui(arg, llvm_ir.IntType(expr.size))
+                self.update_cache(expr, ret)
+                return ret
+
             if len(expr.args) > 1:
 
                 if op == "*":
@@ -718,6 +740,10 @@ class LLVMFunction():
                     callback = builder.urem
                 elif op == "/":
                     callback = builder.udiv
+                elif op == "fadd":
+                    callback = builder.fadd
+                elif op == "fdiv":
+                    callback = builder.fdiv
                 else:
                     raise NotImplementedError('Unknown op: %s' % op)
 
diff --git a/test/test_all.py b/test/test_all.py
index 7cc8f6eb..68830b48 100644
--- a/test/test_all.py
+++ b/test/test_all.py
@@ -55,7 +55,7 @@ class ArchUnitTest(RegressionTest):
 
 # script -> blacklisted jitter
 blacklist = {
-    "x86/unit/mn_float.py": ["python", "llvm"],
+    "x86/unit/mn_float.py": ["python"],
 }
 for script in ["x86/sem.py",
                "x86/unit/mn_strings.py",