about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorFabrice Desclaux <fabrice.desclaux@cea.fr>2014-10-31 10:47:21 +0100
committerFabrice Desclaux <fabrice.desclaux@cea.fr>2014-10-31 10:47:21 +0100
commit63e618f17434fec8236d0410ac11b16469e6f771 (patch)
tree74ab363b23b9be29ac8932912b8f5f411ea85b2d
parent80cfb30b725cf4d53dea151755a3328f18db68c3 (diff)
downloadmiasm-63e618f17434fec8236d0410ac11b16469e6f771.tar.gz
miasm-63e618f17434fec8236d0410ac11b16469e6f771.zip
Jitter: Support shift/rot for 64 bits
-rw-r--r--miasm2/jitter/vm_mngr.c26
-rw-r--r--miasm2/jitter/vm_mngr.h11
2 files changed, 24 insertions, 13 deletions
diff --git a/miasm2/jitter/vm_mngr.c b/miasm2/jitter/vm_mngr.c
index 950528f9..188f0372 100644
--- a/miasm2/jitter/vm_mngr.c
+++ b/miasm2/jitter/vm_mngr.c
@@ -597,10 +597,10 @@ int shift_right_arith_32(int a, unsigned int b)
 	return (i32_a >> b)&0xffffffff;
 }
 */
-unsigned int shift_right_logic(unsigned int size,
-			       unsigned int a, unsigned int b)
+uint64_t shift_right_logic(uint64_t size,
+			   uint64_t a, uint64_t b)
 {
-    unsigned int u32_a;
+    uint64_t u32_a;
     unsigned short u16_a;
     unsigned char u8_a;
     switch(size){
@@ -614,7 +614,7 @@ unsigned int shift_right_logic(unsigned int size,
 		    u32_a = a;
 		    return (u32_a >> b)&0xffffffff;
 	    default:
-		    fprintf(stderr, "inv size in shift %d\n", size);
+		    fprintf(stderr, "inv size in shift %"PRIx64"\n", size);
 		    exit(0);
     }
 }
@@ -640,7 +640,8 @@ int shift_right_logic_32(unsigned int a, unsigned int b)
 	return (u32_a >> b)&0xffffffff;
 }
 */
-int shift_left_logic(unsigned int size, unsigned int a, unsigned int b)
+
+uint64_t shift_left_logic(uint64_t size, uint64_t a, uint64_t b)
 {
     switch(size){
 	    case 8:
@@ -649,8 +650,10 @@ int shift_left_logic(unsigned int size, unsigned int a, unsigned int b)
 		    return (a<<b)&0xffff;
 	    case 32:
 		    return (a<<b)&0xffffffff;
+	    case 64:
+		    return (a<<b)&0xffffffffffffffff;
 	    default:
-		    fprintf(stderr, "inv size in shift %d\n", size);
+		    fprintf(stderr, "inv size in shift %"PRIx64"\n", size);
 		    exit(0);
     }
 }
@@ -788,11 +791,11 @@ unsigned int rem_op(unsigned int size, unsigned int a, unsigned int b, unsigned
 }
 
 
-unsigned int rot_left(unsigned int size, unsigned int a, unsigned int b)
+uint64_t rot_left(uint64_t size, uint64_t a, uint64_t b)
 {
-    unsigned int tmp;
+    uint64_t tmp;
 
-    b = b&0x1F;
+    b = b&0x3F;
     b %= size;
     switch(size){
 	    case 8:
@@ -804,8 +807,11 @@ unsigned int rot_left(unsigned int size, unsigned int a, unsigned int b)
 	    case 32:
 		    tmp = (a << b) | ((a&0xFFFFFFFF) >> (size-b));
 		    return tmp&0xffffffff;
+	    case 64:
+		    tmp = (a << b) | ((a&0xFFFFFFFFFFFFFFFF) >> (size-b));
+		    return tmp&0xFFFFFFFFFFFFFFFF;
 	    default:
-		    fprintf(stderr, "inv size in rotleft %d\n", size);
+		    fprintf(stderr, "inv size in rotleft %"PRIX64"\n", size);
 		    exit(0);
     }
 }
diff --git a/miasm2/jitter/vm_mngr.h b/miasm2/jitter/vm_mngr.h
index deb56042..92e0f7ed 100644
--- a/miasm2/jitter/vm_mngr.h
+++ b/miasm2/jitter/vm_mngr.h
@@ -177,8 +177,9 @@ unsigned int my_imul08(unsigned int a, unsigned int b);
 
 void vm_throw(vm_mngr_t* vm_mngr, unsigned long flags);
 int shift_right_arith(unsigned int size, int a, unsigned int b);
-unsigned int shift_right_logic(unsigned int size, unsigned int a, unsigned int b);
-int shift_left_logic(unsigned int size, unsigned int a, unsigned int b);
+
+uint64_t shift_right_logic(uint64_t size, uint64_t a, uint64_t b);
+uint64_t shift_left_logic(uint64_t size, uint64_t a, uint64_t b);
 /*
 int shift_left_logic_08(unsigned int a, unsigned int b);
 int shift_left_logic_16(unsigned int a, unsigned int b);
@@ -200,7 +201,7 @@ unsigned int umul16_hi(unsigned short a, unsigned short b);
 
 unsigned int div_op(unsigned int size, unsigned int a, unsigned int b, unsigned int c);
 unsigned int rem_op(unsigned int size, unsigned int a, unsigned int b, unsigned int c);
-unsigned int rot_left(unsigned int size, unsigned int a, unsigned int b);
+uint64_t rot_left(uint64_t size, uint64_t a, uint64_t b);
 unsigned int rot_right(unsigned int size, unsigned int a, unsigned int b);
 int rcl_rez_op(unsigned int size, unsigned int a, unsigned int b, unsigned int cf);
 int rcl_cf_op(unsigned int size, unsigned int a, unsigned int b, unsigned int cf);
@@ -352,6 +353,8 @@ unsigned int load_tr_segment_selector(unsigned int d);
 	((((unsigned short)(a)) >> ((unsigned int)(b)&0x1f))&0xffff)
 #define shift_right_logic_32(a, b)\
 	((((unsigned int)(a)) >> ((unsigned int)(b)&0x1f))&0xffffffff)
+#define shift_right_logic_64(a, b)\
+	((((int64_t)(a)) >> ((int64_t)(b)&0x3f))&0xffffffffffffffff)
 
 #define shift_left_logic_08(a, b)\
 	(((a)<<((b)&0x1f))&0xff)
@@ -359,5 +362,7 @@ unsigned int load_tr_segment_selector(unsigned int d);
 	(((a)<<((b)&0x1f))&0xffff)
 #define shift_left_logic_32(a, b)\
 	(((a)<<((b)&0x1f))&0xffffffff)
+#define shift_left_logic_64(a, b)\
+	(((a)<<((b)&0x3f))&0xffffffffffffffff)
 
 #endif