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 /miasm2/jitter/vm_mngr.c | |
| parent | 80cfb30b725cf4d53dea151755a3328f18db68c3 (diff) | |
| download | miasm-63e618f17434fec8236d0410ac11b16469e6f771.tar.gz miasm-63e618f17434fec8236d0410ac11b16469e6f771.zip | |
Jitter: Support shift/rot for 64 bits
Diffstat (limited to 'miasm2/jitter/vm_mngr.c')
| -rw-r--r-- | miasm2/jitter/vm_mngr.c | 26 |
1 files changed, 16 insertions, 10 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); } } |