diff options
| -rw-r--r-- | miasm2/ir/translators/C.py | 8 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr.c | 60 | ||||
| -rw-r--r-- | miasm2/jitter/vm_mngr.h | 48 |
3 files changed, 22 insertions, 94 deletions
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<<b)&0xff; - case 16: - return (a<<b)&0xffff; - case 32: - return (a<<b)&0xffffffff; - case 64: - return (a<<b)&0xffffffffffffffff; - default: - fprintf(stderr, "inv size in shift %"PRIx64"\n", size); - exit(0); - } -} - unsigned int mul_lo_op(unsigned int size, unsigned int a, unsigned int b) { unsigned int mask; diff --git a/miasm2/jitter/vm_mngr.h b/miasm2/jitter/vm_mngr.h index 74ad49ad..757c3b3e 100644 --- a/miasm2/jitter/vm_mngr.h +++ b/miasm2/jitter/vm_mngr.h @@ -199,10 +199,7 @@ 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); -int shift_right_arith(unsigned int size, 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); 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); @@ -402,32 +399,23 @@ unsigned int load_segment_limit(unsigned int d); unsigned int load_segment_limit_ok(unsigned int d); unsigned int load_tr_segment_selector(unsigned int d); -#define shift_right_arith_08(a, b)\ - ((((char)(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 |