From e440a51fdcd27ac08ec40c9c9fed78895302e980 Mon Sep 17 00:00:00 2001 From: Fabrice Desclaux Date: Tue, 25 Jul 2017 13:48:27 +0200 Subject: Jitter: fix shifter macro --- miasm2/ir/translators/C.py | 8 +++---- miasm2/jitter/vm_mngr.c | 60 ---------------------------------------------- miasm2/jitter/vm_mngr.h | 48 ++++++++++++++----------------------- 3 files changed, 22 insertions(+), 94 deletions(-) (limited to 'miasm2') diff --git a/miasm2/ir/translators/C.py b/miasm2/ir/translators/C.py index 1dfdbb00..7a3080ca 100644 --- a/miasm2/ir/translators/C.py +++ b/miasm2/ir/translators/C.py @@ -76,10 +76,10 @@ class TranslatorC(Translator): self.from_expr(expr.args[0]), size2mask(expr.args[0].size), self.from_expr(expr.args[1]), size2mask(expr.args[1].size)) elif expr.op in self.dct_shift: - return 'shift_%s_%.2d(%s , %s)' % (self.dct_shift[expr.op], - expr.args[0].size, - self.from_expr(expr.args[0]), - self.from_expr(expr.args[1])) + return 'SHIFT_%s(%d, %s, %s)' % (self.dct_shift[expr.op].upper(), + expr.args[0].size, + self.from_expr(expr.args[0]), + self.from_expr(expr.args[1])) elif expr.is_associative() or expr.op in ["%", "/"]: oper = ['(%s&0x%x)' % (self.from_expr(arg), size2mask(arg.size)) for arg in expr.args] diff --git a/miasm2/jitter/vm_mngr.c b/miasm2/jitter/vm_mngr.c index 0df1abaf..59cbdf6e 100644 --- a/miasm2/jitter/vm_mngr.c +++ b/miasm2/jitter/vm_mngr.c @@ -673,66 +673,6 @@ int is_mapped(vm_mngr_t* vm_mngr, uint64_t addr, uint64_t size) return 1; } -int shift_right_arith(unsigned int size, int a, unsigned int b) -{ - int i32_a; - short i16_a; - char i8_a; - switch(size){ - case 8: - i8_a = a; - return (i8_a >> b)&0xff; - case 16: - i16_a = a; - return (i16_a >> b)&0xffff; - case 32: - i32_a = a; - return (i32_a >> b)&0xffffffff; - default: - fprintf(stderr, "inv size in shift %d\n", size); - exit(0); - } -} - -uint64_t shift_right_logic(uint64_t size, - uint64_t a, uint64_t b) -{ - uint64_t u32_a; - unsigned short u16_a; - unsigned char u8_a; - switch(size){ - case 8: - u8_a = a; - return (u8_a >> b)&0xff; - case 16: - u16_a = a; - return (u16_a >> b)&0xffff; - case 32: - u32_a = a; - return (u32_a >> b)&0xffffffff; - default: - fprintf(stderr, "inv size in shift %"PRIx64"\n", size); - exit(0); - } -} - -uint64_t shift_left_logic(uint64_t size, uint64_t a, uint64_t b) -{ - switch(size){ - case 8: - return (a<> ((int)(b)&0x1f))&0xff) -#define shift_right_arith_16(a, b)\ - ((((short)(a)) >> ((int)(b)&0x1f))&0xffff) -#define shift_right_arith_32(a, b)\ - ((((int)(a)) >> ((int)(b)&0x1f))&0xffffffff) -#define shift_right_arith_64(a, b)\ - ((((int64_t)(a)) >> ((int64_t)(b)&0x3f))&0xffffffffffffffff) - - -#define shift_right_logic_08(a, b)\ - ((((unsigned char)(a)) >> ((unsigned int)(b)&0x1f))&0xff) -#define shift_right_logic_16(a, b)\ - ((((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)\ - ((((uint64_t)(a)) >> ((uint64_t)(b)&0x3f))&0xffffffffffffffff) - -#define shift_left_logic_08(a, b)\ - (((a)<<((b)&0x1f))&0xff) -#define shift_left_logic_16(a, b)\ - (((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) + + +#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 -- cgit 1.4.1