about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--miasm/arch/ia32_sem.py12
-rw-r--r--miasm/expression/expression.py2
-rw-r--r--miasm/tools/emul_lib/libcodenat.c11
-rw-r--r--miasm/tools/emul_lib/libcodenat.h1
4 files changed, 22 insertions, 4 deletions
diff --git a/miasm/arch/ia32_sem.py b/miasm/arch/ia32_sem.py
index 211e0bfd..b66fd8dd 100644
--- a/miasm/arch/ia32_sem.py
+++ b/miasm/arch/ia32_sem.py
@@ -1778,7 +1778,7 @@ def fadd(info, a, b = None):
     return e
 
 def faddp(info, a, b = None):
-    e = fadd(a, b)
+    e = fadd(info, a, b)
     if b == None:
         e+=float_pop(float_st0)
     else:
@@ -1858,8 +1858,13 @@ def fdiv(info, a, b = None):
 
 def fdivp(info, a):
     # Invalid emulation
-    e = []
-    e.append(ExprAff(a, ExprOp('fdiv', a, float_st0)))
+    e = fdiv(info, a)
+    e+=float_pop(a)
+    return e
+
+def fmulp(info, a):
+    # Invalid emulation
+    e = fmul(info, a)
     e+=float_pop(a)
     return e
 
@@ -2396,6 +2401,7 @@ mnemo_func = {'mov': mov,
               'faddp':faddp,
               'fsub':fsub,
               'fmul':fmul,
+              'fmulp':fmulp,
               'fdiv':fdiv,
               'fdivp':fdivp,
               'fxch':fxch,
diff --git a/miasm/expression/expression.py b/miasm/expression/expression.py
index 1029b319..acf2cac8 100644
--- a/miasm/expression/expression.py
+++ b/miasm/expression/expression.py
@@ -444,7 +444,7 @@ class ExprOp(Expr):
                 return "parity(%s&0x%x)"%(self.args[0].toC(), my_size_mask[self.args[0].get_size()])
             elif self.op == '!':
                 return "(~ %s)&0x%x"%(self.args[0].toC(), my_size_mask[self.args[0].get_size()])
-            elif self.op in ['int_32_to_double', 'int_64_to_double']:
+            elif self.op in ['int_16_to_double', 'int_32_to_double', 'int_64_to_double']:
                 return "%s(%s)"%(self.op, self.args[0].toC())
             elif self.op == 'double_to_int_32':
                 return "%s(%s)"%(self.op, self.args[0].toC())
diff --git a/miasm/tools/emul_lib/libcodenat.c b/miasm/tools/emul_lib/libcodenat.c
index 31a2be31..4a558b4b 100644
--- a/miasm/tools/emul_lib/libcodenat.c
+++ b/miasm/tools/emul_lib/libcodenat.c
@@ -942,6 +942,17 @@ double mem_64_to_double(uint64_t m)
 	return d;
 }
 
+double int_16_to_double(unsigned int m)
+{
+	double d;
+
+	d = (double)(m&0xffff);
+#ifdef DEBUG_MIASM_DOUBLE
+	printf("%d %e\n", m, d);
+#endif
+	return d;
+}
+
 double int_32_to_double(unsigned int m)
 {
 	double d;
diff --git a/miasm/tools/emul_lib/libcodenat.h b/miasm/tools/emul_lib/libcodenat.h
index 8865b285..d0f4930a 100644
--- a/miasm/tools/emul_lib/libcodenat.h
+++ b/miasm/tools/emul_lib/libcodenat.h
@@ -506,6 +506,7 @@ unsigned int fcom_c3(double a, double b);
 
 double mem_32_to_double(unsigned int m);
 double mem_64_to_double(uint64_t m);
+double int_16_to_double(unsigned int m);
 double int_32_to_double(unsigned int m);
 double int_64_to_double(uint64_t m);
 int double_to_int_32(double d);