about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--miasm2/jitter/arch/JitCore_aarch64.c1
-rw-r--r--miasm2/jitter/arch/JitCore_arm.c1
-rw-r--r--miasm2/jitter/arch/JitCore_mips32.c1
-rw-r--r--miasm2/jitter/arch/JitCore_x86.c1
-rw-r--r--miasm2/jitter/emulatedsymbexec.py2
-rw-r--r--miasm2/jitter/jitcore_cc_base.py1
-rw-r--r--miasm2/jitter/op_semantics.c776
-rw-r--r--miasm2/jitter/op_semantics.h137
-rw-r--r--miasm2/jitter/vm_mngr.c778
-rw-r--r--miasm2/jitter/vm_mngr.h144
-rwxr-xr-xsetup.py12
11 files changed, 934 insertions, 920 deletions
diff --git a/miasm2/jitter/arch/JitCore_aarch64.c b/miasm2/jitter/arch/JitCore_aarch64.c
index ff8241c6..0224bfe2 100644
--- a/miasm2/jitter/arch/JitCore_aarch64.c
+++ b/miasm2/jitter/arch/JitCore_aarch64.c
@@ -6,6 +6,7 @@
 #include "../vm_mngr.h"
 #include "../vm_mngr_py.h"
 #include "../JitCore.h"
+#include "../op_semantics.h"
 #include "JitCore_aarch64.h"
 
 
diff --git a/miasm2/jitter/arch/JitCore_arm.c b/miasm2/jitter/arch/JitCore_arm.c
index cce0997d..60b8f95b 100644
--- a/miasm2/jitter/arch/JitCore_arm.c
+++ b/miasm2/jitter/arch/JitCore_arm.c
@@ -6,6 +6,7 @@
 #include "../vm_mngr.h"
 #include "../vm_mngr_py.h"
 #include "../JitCore.h"
+#include "../op_semantics.h"
 #include "JitCore_arm.h"
 
 
diff --git a/miasm2/jitter/arch/JitCore_mips32.c b/miasm2/jitter/arch/JitCore_mips32.c
index 7722c055..2142e8cc 100644
--- a/miasm2/jitter/arch/JitCore_mips32.c
+++ b/miasm2/jitter/arch/JitCore_mips32.c
@@ -6,6 +6,7 @@
 #include "../vm_mngr.h"
 #include "../vm_mngr_py.h"
 #include "../JitCore.h"
+#include "../op_semantics.h"
 #include "JitCore_mips32.h"
 
 
diff --git a/miasm2/jitter/arch/JitCore_x86.c b/miasm2/jitter/arch/JitCore_x86.c
index 5c929dab..e1e36989 100644
--- a/miasm2/jitter/arch/JitCore_x86.c
+++ b/miasm2/jitter/arch/JitCore_x86.c
@@ -6,6 +6,7 @@
 #include "../vm_mngr.h"
 #include "../vm_mngr_py.h"
 #include "../JitCore.h"
+#include "../op_semantics.h"
 #include "JitCore_x86.h"
 
 
diff --git a/miasm2/jitter/emulatedsymbexec.py b/miasm2/jitter/emulatedsymbexec.py
index 4107dc75..ce3ad017 100644
--- a/miasm2/jitter/emulatedsymbexec.py
+++ b/miasm2/jitter/emulatedsymbexec.py
@@ -117,7 +117,7 @@ class EmulatedSymbExec(SymbolicExecutionEngine):
         return e_s(m2_expr.ExprInt(segmaddr, expr.size) + expr.args[1])
 
     def _simp_handle_cpuid(self, e_s, expr):
-        """From miasm2/jitter/vm_mngr.h: cpuid"""
+        """From miasm2/jitter/op_semantics.h: cpuid"""
         if expr.op != "cpuid":
             return expr
 
diff --git a/miasm2/jitter/jitcore_cc_base.py b/miasm2/jitter/jitcore_cc_base.py
index 9280d952..4dd8825a 100644
--- a/miasm2/jitter/jitcore_cc_base.py
+++ b/miasm2/jitter/jitcore_cc_base.py
@@ -13,6 +13,7 @@ def gen_core(arch, attrib):
 
     txt = ""
     txt += '#include "%s/queue.h"\n' % lib_dir
+    txt += '#include "%s/op_semantics.h"\n' % lib_dir
     txt += '#include "%s/vm_mngr.h"\n' % lib_dir
     txt += '#include "%s/vm_mngr_py.h"\n' % lib_dir
     txt += '#include "%s/JitCore.h"\n' % lib_dir
diff --git a/miasm2/jitter/op_semantics.c b/miasm2/jitter/op_semantics.c
new file mode 100644
index 00000000..5500ea92
--- /dev/null
+++ b/miasm2/jitter/op_semantics.c
@@ -0,0 +1,776 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <inttypes.h>
+#include <math.h>
+#include "op_semantics.h"
+
+const uint8_t parity_table[256] = {
+    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
+    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
+    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
+    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
+    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
+    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
+    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
+    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
+    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
+    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
+    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
+    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
+    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
+    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
+    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
+    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
+    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
+    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
+    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
+    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
+    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
+    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
+    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
+    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
+    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
+    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
+    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
+    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
+    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
+    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
+    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
+    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
+};
+
+uint16_t bcdadd_16(uint16_t a, uint16_t b)
+{
+	int carry = 0;
+	int i,j = 0;
+	uint16_t res = 0;
+	int nib_a, nib_b;
+	for (i = 0; i < 16; i += 4) {
+		nib_a = (a  >> i) & (0xF);
+		nib_b = (b >> i) & (0xF);
+
+		j = (carry + nib_a + nib_b);
+		if (j >= 10) {
+			carry = 1;
+			j -= 10;
+			j &=0xf;
+		}
+		else {
+			carry = 0;
+		}
+		res += j << i;
+	}
+	return res;
+}
+
+uint16_t bcdadd_cf_16(uint16_t a, uint16_t b)
+{
+	int carry = 0;
+	int i,j = 0;
+	int nib_a, nib_b;
+	for (i = 0; i < 16; i += 4) {
+		nib_a = (a >> i) & (0xF);
+		nib_b = (b >> i) & (0xF);
+
+		j = (carry + nib_a + nib_b);
+		if (j >= 10) {
+			carry = 1;
+			j -= 10;
+			j &=0xf;
+		}
+		else {
+			carry = 0;
+		}
+	}
+	return carry;
+}
+
+unsigned int mul_lo_op(unsigned int size, unsigned int a, unsigned int b)
+{
+	unsigned int mask;
+
+	switch (size) {
+		case 8: mask = 0xff; break;
+		case 16: mask = 0xffff; break;
+		case 32: mask = 0xffffffff; break;
+		default: fprintf(stderr, "inv size in mul %d\n", size); exit(EXIT_FAILURE);
+	}
+
+	a &= mask;
+	b &= mask;
+	return ((int64_t)a * (int64_t) b) & mask;
+}
+
+unsigned int mul_hi_op(unsigned int size, unsigned int a, unsigned int b)
+{
+	uint64_t res = 0;
+	unsigned int mask;
+
+	switch (size) {
+		case 8: mask = 0xff; break;
+		case 16: mask = 0xffff; break;
+		case 32: mask = 0xffffffff; break;
+		default: fprintf(stderr, "inv size in mul %d\n", size); exit(EXIT_FAILURE);
+	}
+
+	a &= mask;
+	b &= mask;
+	res = ((uint64_t)a * (uint64_t)b);
+	return (res >> 32) & mask;
+}
+
+
+unsigned int imul_lo_op_08(char a, char b)
+{
+	return a*b;
+}
+
+unsigned int imul_lo_op_16(short a, short b)
+{
+	return a*b;
+}
+
+unsigned int imul_lo_op_32(int a, int b)
+{
+	return a*b;
+}
+
+int imul_hi_op_08(char a, char b)
+{
+	int64_t res = 0;
+	res = a*b;
+	return res>>8;
+}
+
+int imul_hi_op_16(short a, short b)
+{
+	int64_t res = 0;
+	res = a*b;
+	return res>>16;
+}
+
+int imul_hi_op_32(int a, int b)
+{
+	int64_t res = 0;
+	res = (int64_t)a*(int64_t)b;
+	return res>>32ULL;
+}
+
+unsigned int umul16_lo(unsigned short a, unsigned short b)
+{
+	return (a*b) & 0xffff;
+}
+
+unsigned int umul16_hi(unsigned short a, unsigned short b)
+{
+	uint32_t c;
+	c = a*b;
+	return (c>>16) & 0xffff;
+}
+
+uint64_t rot_left(uint64_t size, uint64_t a, uint64_t b)
+{
+    uint64_t tmp;
+
+    b = b & 0x3F;
+    b %= size;
+    switch(size){
+	    case 8:
+		    tmp = (a << b) | ((a & 0xFF) >> (size - b));
+		    return tmp & 0xFF;
+	    case 16:
+		    tmp = (a << b) | ((a & 0xFFFF) >> (size - b));
+		    return tmp & 0xFFFF;
+	    case 32:
+		    tmp = (a << b) | ((a & 0xFFFFFFFF) >> (size - b));
+		    return tmp & 0xFFFFFFFF;
+	    case 64:
+		    tmp = (a << b) | ((a&0xFFFFFFFFFFFFFFFF) >> (size - b));
+		    return tmp & 0xFFFFFFFFFFFFFFFF;
+
+	    /* Support cases for rcl */
+	    case 9:
+		    tmp = (a << b) | ((a & 0x1FF) >> (size - b));
+		    return tmp & 0x1FF;
+	    case 17:
+		    tmp = (a << b) | ((a & 0x1FFFF) >> (size - b));
+		    return tmp & 0x1FFFF;
+	    case 33:
+		    tmp = (a << b) | ((a & 0x1FFFFFFFF) >> (size - b));
+		    return tmp & 0x1FFFFFFFF;
+	    /* TODO XXX: support rcl in 64 bit mode */
+
+	    default:
+		    fprintf(stderr, "inv size in rotleft %"PRIX64"\n", size);
+		    exit(EXIT_FAILURE);
+    }
+}
+
+uint64_t rot_right(uint64_t size, uint64_t a, uint64_t b)
+{
+    uint64_t tmp;
+
+    b = b & 0x3F;
+    b %= size;
+    switch(size){
+	    case 8:
+		    tmp = ((a & 0xFF) >> b) | (a << (size - b));
+		    return tmp & 0xff;
+	    case 16:
+		    tmp = ((a & 0xFFFF) >> b) | (a << (size - b));
+		    return tmp & 0xFFFF;
+	    case 32:
+		    tmp = ((a & 0xFFFFFFFF) >> b) | (a << (size - b));
+		    return tmp & 0xFFFFFFFF;
+	    case 64:
+		    tmp = ((a & 0xFFFFFFFFFFFFFFFF) >> b) | (a << (size - b));
+		    return tmp & 0xFFFFFFFFFFFFFFFF;
+
+	    /* Support cases for rcr */
+	    case 9:
+		    tmp = ((a & 0x1FF) >> b) | (a << (size - b));
+		    return tmp & 0x1FF;
+	    case 17:
+		    tmp = ((a & 0x1FFFF) >> b) | (a << (size - b));
+		    return tmp & 0x1FFFF;
+	    case 33:
+		    tmp = ((a & 0x1FFFFFFFF) >> b) | (a << (size - b));
+		    return tmp & 0x1FFFFFFFF;
+	    /* TODO XXX: support rcr in 64 bit mode */
+
+	    default:
+		    fprintf(stderr, "inv size in rotright %"PRIX64"\n", size);
+		    exit(EXIT_FAILURE);
+    }
+}
+
+/*
+ * 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 size - (i + 1);
+	}
+	return size;
+}
+
+/*
+ * 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;
+	}
+	return size;
+}
+
+
+unsigned int my_imul08(unsigned int a, unsigned int b)
+{
+	char a08, b08;
+	short a16;
+
+	a08 = a&0xFF;
+	b08 = b&0xFF;
+	a16 = a08*b08;
+	return (int)a16;
+}
+
+
+
+unsigned int cpuid(unsigned int a, unsigned int reg_num)
+{
+	if (reg_num >3){
+		fprintf(stderr, "not implemented cpuid reg %x\n", reg_num);
+		exit(EXIT_FAILURE);
+	}
+
+	if (a == 0){
+		switch(reg_num){
+		case 0:
+			return 0xa;
+		case 1:
+			return 0x756E6547;
+		case 2:
+			return 0x6C65746E;
+		case 3:
+			return 0x49656E69;
+		}
+	}
+
+	else if (a == 1){
+		switch(reg_num){
+		case 0:
+			//return 0x000006FB;
+			return 0x00020652;
+		case 1:
+			//return 0x02040800;
+			return 0x00000800;
+		case 2:
+			//return 0x0004E3BD;
+			return 0x00000209;
+		case 3:
+			//return 0xBFEBFBFF;
+			return 0x078bf9ff;
+		}
+	}
+	else{
+		fprintf(stderr, "WARNING not implemented cpuid index %X!\n", a);
+		//exit(EXIT_FAILURE);
+	}
+	return 0;
+}
+
+//#define DEBUG_MIASM_DOUBLE
+
+void dump_float(void)
+{
+	/*
+	printf("%e\n", vmmngr.float_st0);
+	printf("%e\n", vmmngr.float_st1);
+	printf("%e\n", vmmngr.float_st2);
+	printf("%e\n", vmmngr.float_st3);
+	printf("%e\n", vmmngr.float_st4);
+	printf("%e\n", vmmngr.float_st5);
+	printf("%e\n", vmmngr.float_st6);
+	printf("%e\n", vmmngr.float_st7);
+	*/
+}
+
+double mem_32_to_double(unsigned int m)
+{
+	float f;
+	double d;
+
+	f = *((float*)&m);
+	d = f;
+#ifdef DEBUG_MIASM_DOUBLE
+	dump_float();
+	printf("%d float %e\n", m, d);
+#endif
+	return d;
+}
+
+
+double mem_64_to_double(uint64_t m)
+{
+	double d;
+	d = *((double*)&m);
+#ifdef DEBUG_MIASM_DOUBLE
+	dump_float();
+	printf("%"PRId64" double %e\n", m, d);
+#endif
+	return d;
+}
+
+double int_16_to_double(unsigned int m)
+{
+	double d;
+
+	d = (double)(m&0xffff);
+#ifdef DEBUG_MIASM_DOUBLE
+	dump_float();
+	printf("%d double %e\n", m, d);
+#endif
+	return d;
+}
+
+double int_32_to_double(unsigned int m)
+{
+	double d;
+
+	d = (double)m;
+#ifdef DEBUG_MIASM_DOUBLE
+	dump_float();
+	printf("%d double %e\n", m, d);
+#endif
+	return d;
+}
+
+double int_64_to_double(uint64_t m)
+{
+	double d;
+
+	d = (double)m;
+#ifdef DEBUG_MIASM_DOUBLE
+	dump_float();
+	printf("%"PRId64" double %e\n", m, d);
+#endif
+	return d;
+}
+
+int16_t double_to_int_16(double d)
+{
+	int16_t i;
+
+	i = (int16_t)d;
+#ifdef DEBUG_MIASM_DOUBLE
+	dump_float();
+	printf("%e int %d\n", d, i);
+#endif
+	return i;
+}
+
+int32_t double_to_int_32(double d)
+{
+	int32_t i;
+
+	i = (int32_t)d;
+#ifdef DEBUG_MIASM_DOUBLE
+	dump_float();
+	printf("%e int %d\n", d, i);
+#endif
+	return i;
+}
+
+int64_t double_to_int_64(double d)
+{
+	int64_t i;
+
+	i = (int64_t)d;
+#ifdef DEBUG_MIASM_DOUBLE
+	dump_float();
+	printf("%e int %"PRId64"\n", d, i);
+#endif
+	return i;
+}
+
+
+double fpu_fadd(double a, double b)
+{
+	double c;
+	c = a + b;
+#ifdef DEBUG_MIASM_DOUBLE
+	dump_float();
+	printf("%e + %e -> %e\n", a, b, c);
+#endif
+	return c;
+}
+
+double fpu_fsub(double a, double b)
+{
+	double c;
+	c = a - b;
+#ifdef DEBUG_MIASM_DOUBLE
+	dump_float();
+	printf("%e - %e -> %e\n", a, b, c);
+#endif
+	return c;
+}
+
+double fpu_fmul(double a, double b)
+{
+	double c;
+	c = a * b;
+#ifdef DEBUG_MIASM_DOUBLE
+	dump_float();
+	printf("%e * %e -> %e\n", a, b, c);
+#endif
+	return c;
+}
+
+double fpu_fdiv(double a, double b)
+{
+	double c;
+	c = a / b;
+#ifdef DEBUG_MIASM_DOUBLE
+	dump_float();
+	printf("%e / %e -> %e\n", a, b, c);
+#endif
+	return c;
+}
+
+double fpu_ftan(double a)
+{
+	double b;
+	b = tan(a);
+#ifdef DEBUG_MIASM_DOUBLE
+	dump_float();
+	printf("%e tan %e\n", a, b);
+#endif
+	return b;
+}
+
+double fpu_frndint(double a)
+{
+	int64_t b;
+	double c;
+	b = (int64_t)a;
+	c = (double)b;
+#ifdef DEBUG_MIASM_DOUBLE
+	dump_float();
+	printf("%e double %e\n", a, c);
+#endif
+	return c;
+}
+
+double fpu_fsin(double a)
+{
+	double b;
+	b = sin(a);
+#ifdef DEBUG_MIASM_DOUBLE
+	dump_float();
+	printf("%e sin %e\n", a, b);
+#endif
+	return b;
+}
+
+double fpu_fcos(double a)
+{
+	double b;
+	b = cos(a);
+#ifdef DEBUG_MIASM_DOUBLE
+	dump_float();
+	printf("%e cos %e\n", a, b);
+#endif
+	return b;
+}
+
+
+double fpu_fscale(double a, double b)
+{
+	double c;
+	c = a * exp2(trunc(b));
+#ifdef DEBUG_MIASM_DOUBLE
+	dump_float();
+	printf("%e *exp2 %e -> %e\n", a, b, c);
+#endif
+	return c;
+}
+
+double fpu_f2xm1(double a)
+{
+	double b;
+	b = exp2(a)-1;
+#ifdef DEBUG_MIASM_DOUBLE
+	dump_float();
+	printf("%e exp2 -1 %e\n", a, b);
+#endif
+	return b;
+}
+
+double fpu_fsqrt(double a)
+{
+	double b;
+	b = sqrt(a);
+#ifdef DEBUG_MIASM_DOUBLE
+	dump_float();
+	printf("%e sqrt %e\n", a, b);
+#endif
+	return b;
+}
+
+double fpu_fabs(double a)
+{
+	double b;
+	b = abs(a);
+#ifdef DEBUG_MIASM_DOUBLE
+	dump_float();
+	printf("%e abs %e\n", a, b);
+#endif
+	return b;
+}
+
+double fpu_fprem(double a, double b)
+{
+	double c;
+	c = fmod(a, b);
+#ifdef DEBUG_MIASM_DOUBLE
+	dump_float();
+	printf("%e %% %e -> %e\n", a, b, c);
+#endif
+	return c;
+}
+
+unsigned int fpu_fprem_lsb(double a, double b)
+{
+	// Inspired from qemu/fpu_helper.c
+	double c;
+	signed long long int q;
+	c = a / b; /* ST0 / ST1 */
+	/* round dblq towards zero */
+	c = (c < 0.0) ? ceil(c) : floor(c);
+
+	/* convert dblq to q by truncating towards zero */
+	if (c < 0.0) {
+	    q = (signed long long int)(-c);
+	} else {
+	    q = (signed long long int)c;
+	}
+#ifdef DEBUG_MIASM_DOUBLE
+	dump_float();
+	printf("%e %% %e -> %d %d %d\n", a, b, q & 0x4,
+	       q & 0x2, q & 0x1);
+#endif
+	return q;
+}
+
+double fpu_fchs(double a)
+{
+	double b;
+	b = -a;
+#ifdef DEBUG_MIASM_DOUBLE
+	dump_float();
+	printf(" - %e -> %e\n", a, b);
+#endif
+	return b;
+}
+
+double fpu_fyl2x(double a, double b)
+{
+	double c;
+	c = b * (log(a) / log(2));
+#ifdef DEBUG_MIASM_DOUBLE
+	dump_float();
+	printf("%e * log(%e) -> %e\n", b, a, c);
+#endif
+	return c;
+}
+
+double fpu_fpatan(double a, double b)
+{
+	double c;
+	c = atan2(b, a);
+#ifdef DEBUG_MIASM_DOUBLE
+	dump_float();
+	printf("arctan(%e / %e) -> %e\n", b, a, c);
+#endif
+	return c;
+}
+
+unsigned int fpu_fcom_c0(double a, double b)
+{
+	if (isnan(a) || isnan(b))
+		return 1;
+	if (a>=b)
+		return 0;
+	return 1;
+}
+unsigned int fpu_fcom_c1(double a, double b)
+{
+	//XXX
+	return 0;
+}
+unsigned int fpu_fcom_c2(double a, double b)
+{
+	if (isnan(a) || isnan(b))
+		return 1;
+	return 0;
+}
+unsigned int fpu_fcom_c3(double a, double b)
+{
+	if (isnan(a) || isnan(b))
+		return 1;
+	if (a==b)
+		return 1;
+	return 0;
+}
+
+unsigned int fpu_fxam_c0(double a)
+{
+	switch(fpclassify(a)) {
+		case FP_NAN:
+			return 1;
+		case FP_NORMAL:
+			return 0;
+		case FP_INFINITE:
+			return 1;
+		case FP_ZERO:
+			return 0;
+		case FP_SUBNORMAL:
+			return 0;
+		default:
+			// ClassEmpty
+			// ClassUnsupported
+			return 0;
+	}
+}
+
+unsigned int fpu_fxam_c1(double a)
+{
+	if ((a < 0) || isnan(a))
+		return 1;
+	return 0;
+}
+
+unsigned int fpu_fxam_c2(double a)
+{
+	switch(fpclassify(a)) {
+		case FP_NAN:
+			return 0;
+		case FP_NORMAL:
+			return 1;
+		case FP_INFINITE:
+			return 1;
+		case FP_ZERO:
+			return 0;
+		case FP_SUBNORMAL:
+			return 1;
+		default:
+			// ClassEmpty
+			// ClassUnsupported
+			return 0;
+	}
+}
+
+unsigned int fpu_fxam_c3(double a)
+{
+	switch(fpclassify(a)) {
+		case FP_NAN:
+			return 0;
+		case FP_NORMAL:
+			return 0;
+		case FP_INFINITE:
+			return 0;
+		case FP_ZERO:
+			return 1;
+		case FP_SUBNORMAL:
+			return 1;
+		default:
+			// ClassEmpty
+			// ClassUnsupported
+			return 0;
+	}
+}
+
+unsigned int double_to_mem_32(double d)
+{
+	unsigned int m;
+	float f;
+	f = d;
+	m = *((unsigned int*)&f);
+#ifdef DEBUG_MIASM_DOUBLE
+	dump_float();
+	printf("%d %e\n", m, d);
+#endif
+	return m;
+}
+
+uint64_t double_to_mem_64(double d)
+{
+	uint64_t m;
+	m = *((uint64_t*)&d);
+#ifdef DEBUG_MIASM_DOUBLE
+	dump_float();
+	printf("%"PRId64" %e\n", m, d);
+#endif
+	return m;
+}
diff --git a/miasm2/jitter/op_semantics.h b/miasm2/jitter/op_semantics.h
new file mode 100644
index 00000000..3b71f6c6
--- /dev/null
+++ b/miasm2/jitter/op_semantics.h
@@ -0,0 +1,137 @@
+#ifndef OP_SEMANTICS_H
+#define OP_SEMANTICS_H
+
+#define CC_P 1
+extern const uint8_t parity_table[256];
+#define parity(a) parity_table[(a) & 0xFF]
+
+unsigned int my_imul08(unsigned int a, unsigned int b);
+unsigned int mul_lo_op(unsigned int size, unsigned int a, unsigned int b);
+unsigned int mul_hi_op(unsigned int size, unsigned int a, unsigned int b);
+unsigned int imul_lo_op_08(char a, char b);
+unsigned int imul_lo_op_16(short a, short b);
+unsigned int imul_lo_op_32(int a, int b);
+int imul_hi_op_08(char a, char b);
+int imul_hi_op_16(short a, short b);
+int imul_hi_op_32(int a, int b);
+
+
+unsigned int umul16_lo(unsigned short a, unsigned short b);
+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 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) \
+	{								\
+		uint ## sizeA ## _t r;					\
+		if (b == 0) {						\
+			fprintf(stderr, "Should not happen\n");		\
+			exit(EXIT_FAILURE);				\
+		}							\
+		r = a/b;						\
+		return r;						\
+	}
+
+
+#define UMOD(sizeA)						\
+	uint ## sizeA ## _t umod ## sizeA (vm_cpu_t* vmcpu, uint ## sizeA ## _t a, uint ## sizeA ## _t b) \
+	{								\
+		uint ## sizeA ## _t r;					\
+		if (b == 0) {						\
+			fprintf(stderr, "Should not happen\n");		\
+			exit(EXIT_FAILURE);				\
+		}							\
+		r = a%b;						\
+		return r;						\
+	}
+
+
+#define IDIV(sizeA)						\
+	int ## sizeA ## _t idiv ## sizeA (vm_cpu_t* vmcpu, int ## sizeA ## _t a, int ## sizeA ## _t b) \
+	{								\
+		int ## sizeA ## _t r;					\
+		if (b == 0) {						\
+			fprintf(stderr, "Should not happen\n");		\
+			exit(EXIT_FAILURE);				\
+		}							\
+		r = a/b;						\
+		return r;						\
+	}
+
+
+#define IMOD(sizeA)						\
+	int ## sizeA ## _t imod ## sizeA (vm_cpu_t* vmcpu, int ## sizeA ## _t a, int ## sizeA ## _t b) \
+	{								\
+		int ## sizeA ## _t r;					\
+		if (b == 0) {						\
+			fprintf(stderr, "Should not happen\n");		\
+			exit(EXIT_FAILURE);				\
+		}							\
+		r = a%b;						\
+		return r;						\
+	}
+
+unsigned int cpuid(unsigned int a, unsigned int reg_num);
+double int2double(unsigned int m);
+
+double fpu_fadd(double a, double b);
+double fpu_fsub(double a, double b);
+double fpu_fmul(double a, double b);
+double fpu_fdiv(double a, double b);
+double fpu_ftan(double a);
+double fpu_frndint(double a);
+double fpu_fsin(double a);
+double fpu_fcos(double a);
+double fpu_fscale(double a, double b);
+double fpu_f2xm1(double a);
+double fpu_fsqrt(double a);
+double fpu_fabs(double a);
+double fpu_fprem(double a, double b);
+double fpu_fchs(double a);
+double fpu_fyl2x(double a, double b);
+double fpu_fpatan(double a, double b);
+unsigned int fpu_fprem_lsb(double a, double b);
+unsigned int fpu_fcom_c0(double a, double b);
+unsigned int fpu_fcom_c1(double a, double b);
+unsigned int fpu_fcom_c2(double a, double b);
+unsigned int fpu_fcom_c3(double a, double b);
+unsigned int fpu_fxam_c0(double a);
+unsigned int fpu_fxam_c1(double a);
+unsigned int fpu_fxam_c2(double a);
+unsigned int fpu_fxam_c3(double a);
+
+
+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);
+int16_t double_to_int_16(double d);
+int32_t double_to_int_32(double d);
+int64_t double_to_int_64(double d);
+unsigned int double_to_mem_32(double d);
+uint64_t double_to_mem_64(double d);
+
+
+#define SHIFT_RIGHT_ARITH(size, value, shift)				\
+	((uint ## size ## _t)((((uint64_t) (shift)) > ((size) - 1))?	\
+			      (((int ## size ## _t) (value)) < 0 ? -1 : 0) : \
+			      (((int ## size ## _t) (value)) >> (shift))))
+
+#define SHIFT_RIGHT_LOGIC(size, value, shift)				\
+	((uint ## size ## _t)((((uint64_t) (shift)) > ((size) - 1))?	\
+			      0 :					\
+			      (((uint ## size ## _t) (value)) >> (shift))))
+
+#define SHIFT_LEFT_LOGIC(size, value, shift)		\
+	((uint ## size ## _t)((((uint64_t) (shift)) > ((size) - 1))?	\
+			      0 :					\
+			      (((uint ## size ## _t) (value)) << (shift))))
+
+#endif
diff --git a/miasm2/jitter/vm_mngr.c b/miasm2/jitter/vm_mngr.c
index 4331a2ac..6da7bfed 100644
--- a/miasm2/jitter/vm_mngr.c
+++ b/miasm2/jitter/vm_mngr.c
@@ -19,12 +19,10 @@
 
 #include <stdio.h>
 #include <stdlib.h>
-#include <ctype.h>
-#include <string.h>
 
 #include <stdint.h>
 #include <inttypes.h>
-#include <math.h>
+
 
 #include "queue.h"
 #include "vm_mngr.h"
@@ -40,42 +38,6 @@
 #define MIN(a,b)  (((a)<(b))?(a):(b))
 #define MAX(a,b)  (((a)>(b))?(a):(b))
 
-
-const uint8_t parity_table[256] = {
-    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
-    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
-    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
-    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
-    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
-    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
-    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
-    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
-    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
-    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
-    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
-    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
-    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
-    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
-    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
-    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
-    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
-    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
-    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
-    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
-    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
-    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
-    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
-    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
-    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
-    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
-    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
-    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
-    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
-    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
-    CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
-    0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
-};
-
 // #define DEBUG_MIASM_AUTOMOD_CODE
 
 void memory_access_list_init(struct memory_access_list * access)
@@ -368,55 +330,6 @@ static void memory_page_write(vm_mngr_t* vm_mngr, unsigned int my_size,
 	}
 }
 
-/* TODO: Those functions have to be moved to a common operations file, with
- * parity, ...
- */
-
-uint16_t bcdadd_16(uint16_t a, uint16_t b)
-{
-	int carry = 0;
-	int i,j = 0;
-	uint16_t res = 0;
-	int nib_a, nib_b;
-	for (i = 0; i < 16; i += 4) {
-		nib_a = (a  >> i) & (0xF);
-		nib_b = (b >> i) & (0xF);
-
-		j = (carry + nib_a + nib_b);
-		if (j >= 10) {
-			carry = 1;
-			j -= 10;
-			j &=0xf;
-		}
-		else {
-			carry = 0;
-		}
-		res += j << i;
-	}
-	return res;
-}
-
-uint16_t bcdadd_cf_16(uint16_t a, uint16_t b)
-{
-	int carry = 0;
-	int i,j = 0;
-	int nib_a, nib_b;
-	for (i = 0; i < 16; i += 4) {
-		nib_a = (a >> i) & (0xF);
-		nib_b = (b >> i) & (0xF);
-
-		j = (carry + nib_a + nib_b);
-		if (j >= 10) {
-			carry = 1;
-			j -= 10;
-			j &=0xf;
-		}
-		else {
-			carry = 0;
-		}
-	}
-	return carry;
-}
 // ##################
 
 void dump_code_bloc(vm_mngr_t* vm_mngr)
@@ -673,695 +586,6 @@ int is_mapped(vm_mngr_t* vm_mngr, uint64_t addr, uint64_t size)
        return 1;
 }
 
-unsigned int mul_lo_op(unsigned int size, unsigned int a, unsigned int b)
-{
-	unsigned int mask;
-
-	switch (size) {
-		case 8: mask = 0xff; break;
-		case 16: mask = 0xffff; break;
-		case 32: mask = 0xffffffff; break;
-		default: fprintf(stderr, "inv size in mul %d\n", size); exit(EXIT_FAILURE);
-	}
-
-	a &= mask;
-	b &= mask;
-	return ((int64_t)a * (int64_t) b) & mask;
-}
-
-unsigned int mul_hi_op(unsigned int size, unsigned int a, unsigned int b)
-{
-	uint64_t res = 0;
-	unsigned int mask;
-
-	switch (size) {
-		case 8: mask = 0xff; break;
-		case 16: mask = 0xffff; break;
-		case 32: mask = 0xffffffff; break;
-		default: fprintf(stderr, "inv size in mul %d\n", size); exit(EXIT_FAILURE);
-	}
-
-	a &= mask;
-	b &= mask;
-	res = ((uint64_t)a * (uint64_t)b);
-	return (res >> 32) & mask;
-}
-
-
-unsigned int imul_lo_op_08(char a, char b)
-{
-	return a*b;
-}
-
-unsigned int imul_lo_op_16(short a, short b)
-{
-	return a*b;
-}
-
-unsigned int imul_lo_op_32(int a, int b)
-{
-	return a*b;
-}
-
-int imul_hi_op_08(char a, char b)
-{
-	int64_t res = 0;
-	res = a*b;
-	return res>>8;
-}
-
-int imul_hi_op_16(short a, short b)
-{
-	int64_t res = 0;
-	res = a*b;
-	return res>>16;
-}
-
-int imul_hi_op_32(int a, int b)
-{
-	int64_t res = 0;
-	res = (int64_t)a*(int64_t)b;
-	return res>>32ULL;
-}
-
-unsigned int umul16_lo(unsigned short a, unsigned short b)
-{
-	return (a*b) & 0xffff;
-}
-
-unsigned int umul16_hi(unsigned short a, unsigned short b)
-{
-	uint32_t c;
-	c = a*b;
-	return (c>>16) & 0xffff;
-}
-
-uint64_t rot_left(uint64_t size, uint64_t a, uint64_t b)
-{
-    uint64_t tmp;
-
-    b = b & 0x3F;
-    b %= size;
-    switch(size){
-	    case 8:
-		    tmp = (a << b) | ((a & 0xFF) >> (size - b));
-		    return tmp & 0xFF;
-	    case 16:
-		    tmp = (a << b) | ((a & 0xFFFF) >> (size - b));
-		    return tmp & 0xFFFF;
-	    case 32:
-		    tmp = (a << b) | ((a & 0xFFFFFFFF) >> (size - b));
-		    return tmp & 0xFFFFFFFF;
-	    case 64:
-		    tmp = (a << b) | ((a&0xFFFFFFFFFFFFFFFF) >> (size - b));
-		    return tmp & 0xFFFFFFFFFFFFFFFF;
-
-	    /* Support cases for rcl */
-	    case 9:
-		    tmp = (a << b) | ((a & 0x1FF) >> (size - b));
-		    return tmp & 0x1FF;
-	    case 17:
-		    tmp = (a << b) | ((a & 0x1FFFF) >> (size - b));
-		    return tmp & 0x1FFFF;
-	    case 33:
-		    tmp = (a << b) | ((a & 0x1FFFFFFFF) >> (size - b));
-		    return tmp & 0x1FFFFFFFF;
-	    /* TODO XXX: support rcl in 64 bit mode */
-
-	    default:
-		    fprintf(stderr, "inv size in rotleft %"PRIX64"\n", size);
-		    exit(EXIT_FAILURE);
-    }
-}
-
-uint64_t rot_right(uint64_t size, uint64_t a, uint64_t b)
-{
-    uint64_t tmp;
-
-    b = b & 0x3F;
-    b %= size;
-    switch(size){
-	    case 8:
-		    tmp = ((a & 0xFF) >> b) | (a << (size - b));
-		    return tmp & 0xff;
-	    case 16:
-		    tmp = ((a & 0xFFFF) >> b) | (a << (size - b));
-		    return tmp & 0xFFFF;
-	    case 32:
-		    tmp = ((a & 0xFFFFFFFF) >> b) | (a << (size - b));
-		    return tmp & 0xFFFFFFFF;
-	    case 64:
-		    tmp = ((a & 0xFFFFFFFFFFFFFFFF) >> b) | (a << (size - b));
-		    return tmp & 0xFFFFFFFFFFFFFFFF;
-
-	    /* Support cases for rcr */
-	    case 9:
-		    tmp = ((a & 0x1FF) >> b) | (a << (size - b));
-		    return tmp & 0x1FF;
-	    case 17:
-		    tmp = ((a & 0x1FFFF) >> b) | (a << (size - b));
-		    return tmp & 0x1FFFF;
-	    case 33:
-		    tmp = ((a & 0x1FFFFFFFF) >> b) | (a << (size - b));
-		    return tmp & 0x1FFFFFFFF;
-	    /* TODO XXX: support rcr in 64 bit mode */
-
-	    default:
-		    fprintf(stderr, "inv size in rotright %"PRIX64"\n", size);
-		    exit(EXIT_FAILURE);
-    }
-}
-
-/*
- * 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 size - (i + 1);
-	}
-	return size;
-}
-
-/*
- * 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;
-	}
-	return size;
-}
-
-
-unsigned int my_imul08(unsigned int a, unsigned int b)
-{
-	char a08, b08;
-	short a16;
-
-	a08 = a&0xFF;
-	b08 = b&0xFF;
-	a16 = a08*b08;
-	return (int)a16;
-}
-
-
-
-unsigned int cpuid(unsigned int a, unsigned int reg_num)
-{
-	if (reg_num >3){
-		fprintf(stderr, "not implemented cpuid reg %x\n", reg_num);
-		exit(EXIT_FAILURE);
-	}
-
-	if (a == 0){
-		switch(reg_num){
-		case 0:
-			return 0xa;
-		case 1:
-			return 0x756E6547;
-		case 2:
-			return 0x6C65746E;
-		case 3:
-			return 0x49656E69;
-		}
-	}
-
-	else if (a == 1){
-		switch(reg_num){
-		case 0:
-			//return 0x000006FB;
-			return 0x00020652;
-		case 1:
-			//return 0x02040800;
-			return 0x00000800;
-		case 2:
-			//return 0x0004E3BD;
-			return 0x00000209;
-		case 3:
-			//return 0xBFEBFBFF;
-			return 0x078bf9ff;
-		}
-	}
-	else{
-		fprintf(stderr, "WARNING not implemented cpuid index %X!\n", a);
-		//exit(EXIT_FAILURE);
-	}
-	return 0;
-}
-
-//#define DEBUG_MIASM_DOUBLE
-
-void dump_float(void)
-{
-	/*
-	printf("%e\n", vmmngr.float_st0);
-	printf("%e\n", vmmngr.float_st1);
-	printf("%e\n", vmmngr.float_st2);
-	printf("%e\n", vmmngr.float_st3);
-	printf("%e\n", vmmngr.float_st4);
-	printf("%e\n", vmmngr.float_st5);
-	printf("%e\n", vmmngr.float_st6);
-	printf("%e\n", vmmngr.float_st7);
-	*/
-}
-
-double mem_32_to_double(unsigned int m)
-{
-	float f;
-	double d;
-
-	f = *((float*)&m);
-	d = f;
-#ifdef DEBUG_MIASM_DOUBLE
-	dump_float();
-	printf("%d float %e\n", m, d);
-#endif
-	return d;
-}
-
-
-double mem_64_to_double(uint64_t m)
-{
-	double d;
-	d = *((double*)&m);
-#ifdef DEBUG_MIASM_DOUBLE
-	dump_float();
-	printf("%"PRId64" double %e\n", m, d);
-#endif
-	return d;
-}
-
-double int_16_to_double(unsigned int m)
-{
-	double d;
-
-	d = (double)(m&0xffff);
-#ifdef DEBUG_MIASM_DOUBLE
-	dump_float();
-	printf("%d double %e\n", m, d);
-#endif
-	return d;
-}
-
-double int_32_to_double(unsigned int m)
-{
-	double d;
-
-	d = (double)m;
-#ifdef DEBUG_MIASM_DOUBLE
-	dump_float();
-	printf("%d double %e\n", m, d);
-#endif
-	return d;
-}
-
-double int_64_to_double(uint64_t m)
-{
-	double d;
-
-	d = (double)m;
-#ifdef DEBUG_MIASM_DOUBLE
-	dump_float();
-	printf("%"PRId64" double %e\n", m, d);
-#endif
-	return d;
-}
-
-int16_t double_to_int_16(double d)
-{
-	int16_t i;
-
-	i = (int16_t)d;
-#ifdef DEBUG_MIASM_DOUBLE
-	dump_float();
-	printf("%e int %d\n", d, i);
-#endif
-	return i;
-}
-
-int32_t double_to_int_32(double d)
-{
-	int32_t i;
-
-	i = (int32_t)d;
-#ifdef DEBUG_MIASM_DOUBLE
-	dump_float();
-	printf("%e int %d\n", d, i);
-#endif
-	return i;
-}
-
-int64_t double_to_int_64(double d)
-{
-	int64_t i;
-
-	i = (int64_t)d;
-#ifdef DEBUG_MIASM_DOUBLE
-	dump_float();
-	printf("%e int %"PRId64"\n", d, i);
-#endif
-	return i;
-}
-
-
-double fpu_fadd(double a, double b)
-{
-	double c;
-	c = a + b;
-#ifdef DEBUG_MIASM_DOUBLE
-	dump_float();
-	printf("%e + %e -> %e\n", a, b, c);
-#endif
-	return c;
-}
-
-double fpu_fsub(double a, double b)
-{
-	double c;
-	c = a - b;
-#ifdef DEBUG_MIASM_DOUBLE
-	dump_float();
-	printf("%e - %e -> %e\n", a, b, c);
-#endif
-	return c;
-}
-
-double fpu_fmul(double a, double b)
-{
-	double c;
-	c = a * b;
-#ifdef DEBUG_MIASM_DOUBLE
-	dump_float();
-	printf("%e * %e -> %e\n", a, b, c);
-#endif
-	return c;
-}
-
-double fpu_fdiv(double a, double b)
-{
-	double c;
-	c = a / b;
-#ifdef DEBUG_MIASM_DOUBLE
-	dump_float();
-	printf("%e / %e -> %e\n", a, b, c);
-#endif
-	return c;
-}
-
-double fpu_ftan(double a)
-{
-	double b;
-	b = tan(a);
-#ifdef DEBUG_MIASM_DOUBLE
-	dump_float();
-	printf("%e tan %e\n", a, b);
-#endif
-	return b;
-}
-
-double fpu_frndint(double a)
-{
-	int64_t b;
-	double c;
-	b = (int64_t)a;
-	c = (double)b;
-#ifdef DEBUG_MIASM_DOUBLE
-	dump_float();
-	printf("%e double %e\n", a, c);
-#endif
-	return c;
-}
-
-double fpu_fsin(double a)
-{
-	double b;
-	b = sin(a);
-#ifdef DEBUG_MIASM_DOUBLE
-	dump_float();
-	printf("%e sin %e\n", a, b);
-#endif
-	return b;
-}
-
-double fpu_fcos(double a)
-{
-	double b;
-	b = cos(a);
-#ifdef DEBUG_MIASM_DOUBLE
-	dump_float();
-	printf("%e cos %e\n", a, b);
-#endif
-	return b;
-}
-
-
-double fpu_fscale(double a, double b)
-{
-	double c;
-	c = a * exp2(trunc(b));
-#ifdef DEBUG_MIASM_DOUBLE
-	dump_float();
-	printf("%e *exp2 %e -> %e\n", a, b, c);
-#endif
-	return c;
-}
-
-double fpu_f2xm1(double a)
-{
-	double b;
-	b = exp2(a)-1;
-#ifdef DEBUG_MIASM_DOUBLE
-	dump_float();
-	printf("%e exp2 -1 %e\n", a, b);
-#endif
-	return b;
-}
-
-double fpu_fsqrt(double a)
-{
-	double b;
-	b = sqrt(a);
-#ifdef DEBUG_MIASM_DOUBLE
-	dump_float();
-	printf("%e sqrt %e\n", a, b);
-#endif
-	return b;
-}
-
-double fpu_fabs(double a)
-{
-	double b;
-	b = abs(a);
-#ifdef DEBUG_MIASM_DOUBLE
-	dump_float();
-	printf("%e abs %e\n", a, b);
-#endif
-	return b;
-}
-
-double fpu_fprem(double a, double b)
-{
-	double c;
-	c = fmod(a, b);
-#ifdef DEBUG_MIASM_DOUBLE
-	dump_float();
-	printf("%e %% %e -> %e\n", a, b, c);
-#endif
-	return c;
-}
-
-unsigned int fpu_fprem_lsb(double a, double b)
-{
-	// Inspired from qemu/fpu_helper.c
-	double c;
-	signed long long int q;
-	c = a / b; /* ST0 / ST1 */
-	/* round dblq towards zero */
-	c = (c < 0.0) ? ceil(c) : floor(c);
-
-	/* convert dblq to q by truncating towards zero */
-	if (c < 0.0) {
-	    q = (signed long long int)(-c);
-	} else {
-	    q = (signed long long int)c;
-	}
-#ifdef DEBUG_MIASM_DOUBLE
-	dump_float();
-	printf("%e %% %e -> %d %d %d\n", a, b, q & 0x4,
-	       q & 0x2, q & 0x1);
-#endif
-	return q;
-}
-
-double fpu_fchs(double a)
-{
-	double b;
-	b = -a;
-#ifdef DEBUG_MIASM_DOUBLE
-	dump_float();
-	printf(" - %e -> %e\n", a, b);
-#endif
-	return b;
-}
-
-double fpu_fyl2x(double a, double b)
-{
-	double c;
-	c = b * (log(a) / log(2));
-#ifdef DEBUG_MIASM_DOUBLE
-	dump_float();
-	printf("%e * log(%e) -> %e\n", b, a, c);
-#endif
-	return c;
-}
-
-double fpu_fpatan(double a, double b)
-{
-	double c;
-	c = atan2(b, a);
-#ifdef DEBUG_MIASM_DOUBLE
-	dump_float();
-	printf("arctan(%e / %e) -> %e\n", b, a, c);
-#endif
-	return c;
-}
-
-unsigned int fpu_fcom_c0(double a, double b)
-{
-	if (isnan(a) || isnan(b))
-		return 1;
-	if (a>=b)
-		return 0;
-	return 1;
-}
-unsigned int fpu_fcom_c1(double a, double b)
-{
-	//XXX
-	return 0;
-}
-unsigned int fpu_fcom_c2(double a, double b)
-{
-	if (isnan(a) || isnan(b))
-		return 1;
-	return 0;
-}
-unsigned int fpu_fcom_c3(double a, double b)
-{
-	if (isnan(a) || isnan(b))
-		return 1;
-	if (a==b)
-		return 1;
-	return 0;
-}
-
-unsigned int fpu_fxam_c0(double a)
-{
-	switch(fpclassify(a)) {
-		case FP_NAN:
-			return 1;
-		case FP_NORMAL:
-			return 0;
-		case FP_INFINITE:
-			return 1;
-		case FP_ZERO:
-			return 0;
-		case FP_SUBNORMAL:
-			return 0;
-		default:
-			// ClassEmpty
-			// ClassUnsupported
-			return 0;
-	}
-}
-
-unsigned int fpu_fxam_c1(double a)
-{
-	if ((a < 0) || isnan(a))
-		return 1;
-	return 0;
-}
-
-unsigned int fpu_fxam_c2(double a)
-{
-	switch(fpclassify(a)) {
-		case FP_NAN:
-			return 0;
-		case FP_NORMAL:
-			return 1;
-		case FP_INFINITE:
-			return 1;
-		case FP_ZERO:
-			return 0;
-		case FP_SUBNORMAL:
-			return 1;
-		default:
-			// ClassEmpty
-			// ClassUnsupported
-			return 0;
-	}
-}
-
-unsigned int fpu_fxam_c3(double a)
-{
-	switch(fpclassify(a)) {
-		case FP_NAN:
-			return 0;
-		case FP_NORMAL:
-			return 0;
-		case FP_INFINITE:
-			return 0;
-		case FP_ZERO:
-			return 1;
-		case FP_SUBNORMAL:
-			return 1;
-		default:
-			// ClassEmpty
-			// ClassUnsupported
-			return 0;
-	}
-}
-
-unsigned int double_to_mem_32(double d)
-{
-	unsigned int m;
-	float f;
-	f = d;
-	m = *((unsigned int*)&f);
-#ifdef DEBUG_MIASM_DOUBLE
-	dump_float();
-	printf("%d %e\n", m, d);
-#endif
-	return m;
-}
-
-uint64_t double_to_mem_64(double d)
-{
-	uint64_t m;
-	m = *((uint64_t*)&d);
-#ifdef DEBUG_MIASM_DOUBLE
-	dump_float();
-	printf("%"PRId64" %e\n", m, d);
-#endif
-	return m;
-}
-
 struct memory_page_node * create_memory_page_node(uint64_t ad, unsigned int size, unsigned int access, char* name)
 {
 	struct memory_page_node * mpn;
diff --git a/miasm2/jitter/vm_mngr.h b/miasm2/jitter/vm_mngr.h
index b101b6ca..eff5e0da 100644
--- a/miasm2/jitter/vm_mngr.h
+++ b/miasm2/jitter/vm_mngr.h
@@ -167,6 +167,8 @@ int is_mem_mapped(vm_mngr_t* vm_mngr, uint64_t ad);
 uint64_t get_mem_base_addr(vm_mngr_t* vm_mngr, uint64_t addr, uint64_t *addr_base);
 unsigned int MEM_LOOKUP(vm_mngr_t* vm_mngr, unsigned int my_size, uint64_t addr);
 
+int is_mapped(vm_mngr_t* vm_mngr, uint64_t addr, uint64_t size);
+void vm_throw(vm_mngr_t* vm_mngr, unsigned long flags);
 
 void vm_MEM_WRITE_08(vm_mngr_t* vm_mngr, uint64_t addr, unsigned char src);
 void vm_MEM_WRITE_16(vm_mngr_t* vm_mngr, uint64_t addr, unsigned short src);
@@ -192,88 +194,6 @@ uint64_t MEM_LOOKUP_64_PASSTHROUGH(uint64_t addr);
 int vm_read_mem(vm_mngr_t* vm_mngr, uint64_t addr, char** buffer_ptr, uint64_t size);
 int vm_write_mem(vm_mngr_t* vm_mngr, uint64_t addr, char *buffer, uint64_t size);
 
-#define CC_P 1
-
-extern const uint8_t parity_table[256];
-#define parity(a) parity_table[(a) & 0xFF]
-
-unsigned int my_imul08(unsigned int a, unsigned int b);
-
-int is_mapped(vm_mngr_t* vm_mngr, uint64_t addr, uint64_t size);
-void vm_throw(vm_mngr_t* vm_mngr, unsigned long flags);
-
-unsigned int mul_lo_op(unsigned int size, unsigned int a, unsigned int b);
-unsigned int mul_hi_op(unsigned int size, unsigned int a, unsigned int b);
-unsigned int imul_lo_op_08(char a, char b);
-unsigned int imul_lo_op_16(short a, short b);
-unsigned int imul_lo_op_32(int a, int b);
-int imul_hi_op_08(char a, char b);
-int imul_hi_op_16(short a, short b);
-int imul_hi_op_32(int a, int b);
-
-
-unsigned int umul16_lo(unsigned short a, unsigned short b);
-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 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) \
-	{								\
-		uint ## sizeA ## _t r;					\
-		if (b == 0) {						\
-			fprintf(stderr, "Should not happen\n");		\
-			exit(EXIT_FAILURE);				\
-		}							\
-		r = a/b;						\
-		return r;						\
-	}
-
-
-#define UMOD(sizeA)						\
-	uint ## sizeA ## _t umod ## sizeA (vm_cpu_t* vmcpu, uint ## sizeA ## _t a, uint ## sizeA ## _t b) \
-	{								\
-		uint ## sizeA ## _t r;					\
-		if (b == 0) {						\
-			fprintf(stderr, "Should not happen\n");		\
-			exit(EXIT_FAILURE);				\
-		}							\
-		r = a%b;						\
-		return r;						\
-	}
-
-
-#define IDIV(sizeA)						\
-	int ## sizeA ## _t idiv ## sizeA (vm_cpu_t* vmcpu, int ## sizeA ## _t a, int ## sizeA ## _t b) \
-	{								\
-		int ## sizeA ## _t r;					\
-		if (b == 0) {						\
-			fprintf(stderr, "Should not happen\n");		\
-			exit(EXIT_FAILURE);				\
-		}							\
-		r = a/b;						\
-		return r;						\
-	}
-
-
-#define IMOD(sizeA)						\
-	int ## sizeA ## _t imod ## sizeA (vm_cpu_t* vmcpu, int ## sizeA ## _t a, int ## sizeA ## _t b) \
-	{								\
-		int ## sizeA ## _t r;					\
-		if (b == 0) {						\
-			fprintf(stderr, "Should not happen\n");		\
-			exit(EXIT_FAILURE);				\
-		}							\
-		r = a%b;						\
-		return r;						\
-	}
-
-
 void memory_access_list_init(struct memory_access_list * access);
 void memory_access_list_reset(struct memory_access_list * access);
 void memory_access_list_add(struct memory_access_list * access, uint64_t start, uint64_t stop);
@@ -351,48 +271,6 @@ void func_virtualfree_memory_page(void);
 void func_loadlib_fake(void);
 void func_getproc_fake(void);
 
-
-unsigned int cpuid(unsigned int a, unsigned int reg_num);
-double int2double(unsigned int m);
-
-double fpu_fadd(double a, double b);
-double fpu_fsub(double a, double b);
-double fpu_fmul(double a, double b);
-double fpu_fdiv(double a, double b);
-double fpu_ftan(double a);
-double fpu_frndint(double a);
-double fpu_fsin(double a);
-double fpu_fcos(double a);
-double fpu_fscale(double a, double b);
-double fpu_f2xm1(double a);
-double fpu_fsqrt(double a);
-double fpu_fabs(double a);
-double fpu_fprem(double a, double b);
-double fpu_fchs(double a);
-double fpu_fyl2x(double a, double b);
-double fpu_fpatan(double a, double b);
-unsigned int fpu_fprem_lsb(double a, double b);
-unsigned int fpu_fcom_c0(double a, double b);
-unsigned int fpu_fcom_c1(double a, double b);
-unsigned int fpu_fcom_c2(double a, double b);
-unsigned int fpu_fcom_c3(double a, double b);
-unsigned int fpu_fxam_c0(double a);
-unsigned int fpu_fxam_c1(double a);
-unsigned int fpu_fxam_c2(double a);
-unsigned int fpu_fxam_c3(double a);
-
-
-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);
-int16_t double_to_int_16(double d);
-int32_t double_to_int_32(double d);
-int64_t double_to_int_64(double d);
-unsigned int double_to_mem_32(double d);
-uint64_t double_to_mem_64(double d);
-
 unsigned int access_segment(unsigned int d);
 unsigned int access_segment_ok(unsigned int d);
 
@@ -401,22 +279,4 @@ unsigned int load_segment_limit_ok(unsigned int d);
 
 unsigned int load_tr_segment_selector(unsigned int d);
 
-
-#define SHIFT_RIGHT_ARITH(size, value, shift)				\
-	((uint ## size ## _t)((((uint64_t) (shift)) > ((size) - 1))?	\
-			      (((int ## size ## _t) (value)) < 0 ? -1 : 0) : \
-			      (((int ## size ## _t) (value)) >> (shift))))
-
-#define SHIFT_RIGHT_LOGIC(size, value, shift)				\
-	((uint ## size ## _t)((((uint64_t) (shift)) > ((size) - 1))?	\
-			      0 :					\
-			      (((uint ## size ## _t) (value)) >> (shift))))
-
-#define SHIFT_LEFT_LOGIC(size, value, shift)		\
-	((uint ## size ## _t)((((uint64_t) (shift)) > ((size) - 1))?	\
-			      0 :					\
-			      (((uint ## size ## _t) (value)) << (shift))))
-
-
-
 #endif
diff --git a/setup.py b/setup.py
index e6851364..ff4e98d8 100755
--- a/setup.py
+++ b/setup.py
@@ -32,26 +32,32 @@ def buil_all():
         Extension("miasm2.jitter.arch.JitCore_x86",
                   ["miasm2/jitter/JitCore.c",
                    "miasm2/jitter/vm_mngr.c",
+                   "miasm2/jitter/op_semantics.c",
                    "miasm2/jitter/arch/JitCore_x86.c"]),
         Extension("miasm2.jitter.arch.JitCore_arm",
                   ["miasm2/jitter/JitCore.c",
                    "miasm2/jitter/vm_mngr.c",
+                   "miasm2/jitter/op_semantics.c",
                    "miasm2/jitter/arch/JitCore_arm.c"]),
         Extension("miasm2.jitter.arch.JitCore_aarch64",
                   ["miasm2/jitter/JitCore.c",
                    "miasm2/jitter/vm_mngr.c",
+                   "miasm2/jitter/op_semantics.c",
                    "miasm2/jitter/arch/JitCore_aarch64.c"]),
         Extension("miasm2.jitter.arch.JitCore_msp430",
                   ["miasm2/jitter/JitCore.c",
                    "miasm2/jitter/vm_mngr.c",
+                   "miasm2/jitter/op_semantics.c",
                    "miasm2/jitter/arch/JitCore_msp430.c"]),
         Extension("miasm2.jitter.arch.JitCore_mips32",
                   ["miasm2/jitter/JitCore.c",
                    "miasm2/jitter/vm_mngr.c",
+                   "miasm2/jitter/op_semantics.c",
                    "miasm2/jitter/arch/JitCore_mips32.c"]),
         Extension("miasm2.jitter.arch.JitCore_ppc32",
                   ["miasm2/jitter/JitCore.c",
                    "miasm2/jitter/vm_mngr.c",
+                   "miasm2/jitter/op_semantics.c",
                    "miasm2/jitter/arch/JitCore_ppc32.c"],
                   depends=["miasm2/jitter/arch/JitCore_ppc32.h",
                            "miasm2/jitter/arch/JitCore_ppc32_regs.h"]),
@@ -68,26 +74,32 @@ def buil_all():
         Extension("miasm2.jitter.arch.JitCore_x86",
                   ["miasm2/jitter/JitCore.c",
                    "miasm2/jitter/vm_mngr.c",
+                   "miasm2/jitter/op_semantics.c",
                    "miasm2/jitter/arch/JitCore_x86.c"]),
         Extension("miasm2.jitter.arch.JitCore_arm",
                   ["miasm2/jitter/JitCore.c",
                    "miasm2/jitter/vm_mngr.c",
+                   "miasm2/jitter/op_semantics.c",
                    "miasm2/jitter/arch/JitCore_arm.c"]),
         Extension("miasm2.jitter.arch.JitCore_aarch64",
                   ["miasm2/jitter/JitCore.c",
                    "miasm2/jitter/vm_mngr.c",
+                   "miasm2/jitter/op_semantics.c",
                    "miasm2/jitter/arch/JitCore_aarch64.c"]),
         Extension("miasm2.jitter.arch.JitCore_msp430",
                   ["miasm2/jitter/JitCore.c",
                    "miasm2/jitter/vm_mngr.c",
+                   "miasm2/jitter/op_semantics.c",
                    "miasm2/jitter/arch/JitCore_msp430.c"]),
         Extension("miasm2.jitter.arch.JitCore_mips32",
                   ["miasm2/jitter/JitCore.c",
                    "miasm2/jitter/vm_mngr.c",
+                   "miasm2/jitter/op_semantics.c",
                    "miasm2/jitter/arch/JitCore_mips32.c"]),
         Extension("miasm2.jitter.arch.JitCore_ppc32",
                   ["miasm2/jitter/JitCore.c",
                    "miasm2/jitter/vm_mngr.c",
+                   "miasm2/jitter/op_semantics.c",
                    "miasm2/jitter/arch/JitCore_ppc32.c"],
                   depends=["miasm2/jitter/arch/JitCore_ppc32.h",
                            "miasm2/jitter/arch/JitCore_ppc32_regs.h"]),