diff options
| author | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2014-10-31 10:47:21 +0100 |
|---|---|---|
| committer | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2014-10-31 10:47:21 +0100 |
| commit | 63e618f17434fec8236d0410ac11b16469e6f771 (patch) | |
| tree | 74ab363b23b9be29ac8932912b8f5f411ea85b2d | |
| parent | 80cfb30b725cf4d53dea151755a3328f18db68c3 (diff) | |
| download | miasm-63e618f17434fec8236d0410ac11b16469e6f771.tar.gz miasm-63e618f17434fec8236d0410ac11b16469e6f771.zip | |
Jitter: Support shift/rot for 64 bits
| -rw-r--r-- | miasm2/jitter/vm_mngr.c | 26 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr.h | 11 |
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 |