diff --git a/src/engine/interpreter/c_op.h b/src/engine/interpreter/c_op.h index 54fd7e9fd3543e12f4847375feb67046d7a632ad..c5373c64bde98e3d8f2eb3b7f0779875536ab8ea 100644 --- a/src/engine/interpreter/c_op.h +++ b/src/engine/interpreter/c_op.h @@ -3,14 +3,20 @@ #include +#ifdef ISA64 +#define c_shift_mask 0x3f +#else +#define c_shift_mask 0x1f +#endif + #define c_add(a, b) ((a) + (b)) #define c_sub(a, b) ((a) - (b)) #define c_and(a, b) ((a) & (b)) #define c_or(a, b) ((a) | (b)) #define c_xor(a, b) ((a) ^ (b)) -#define c_shl(a, b) ((a) << (b)) -#define c_shr(a, b) ((a) >> (b)) -#define c_sar(a, b) ((sword_t)(a) >> (b)) +#define c_shl(a, b) ((a) << (b & c_shift_mask)) +#define c_shr(a, b) ((a) >> (b & c_shift_mask)) +#define c_sar(a, b) ((sword_t)(a) >> (b & c_shift_mask)) #define c_mul_lo(a, b) ((a) * (b)) #define c_imul_lo(a, b) ((sword_t)(a) * (sword_t)(b)) diff --git a/src/isa/x86/exec/logic.h b/src/isa/x86/exec/logic.h index c078db7cb18c54668c126586612db90f0ffc9c2e..d7251780f04706e9c238ad40eedc36b90b798d50 100644 --- a/src/isa/x86/exec/logic.h +++ b/src/isa/x86/exec/logic.h @@ -96,36 +96,32 @@ static inline make_EHelper(not) { static inline make_EHelper(shld) { rtl_andi(s, dsrc1, dsrc1, 31); - if (*dsrc1 != 0) { - rtl_shl(s, s0, ddest, dsrc1); + rtl_shl(s, s0, ddest, dsrc1); - rtl_li(s, s1, 32); - rtl_sub(s, s1, s1, dsrc1); - rtl_shr(s, s1, dsrc2, s1); + rtl_li(s, s1, 32); + rtl_sub(s, s1, s1, dsrc1); + rtl_shr(s, s1, dsrc2, s1); - rtl_or(s, s0, s0, s1); + rtl_or(s, s0, s0, s1); - operand_write(s, id_dest, s0); - rtl_update_ZFSF(s, s0, id_dest->width); - // unnecessary to update CF and OF in NEMU - } + operand_write(s, id_dest, s0); + rtl_update_ZFSF(s, s0, id_dest->width); + // unnecessary to update CF and OF in NEMU print_asm_template3(shld); } static inline make_EHelper(shrd) { rtl_andi(s, dsrc1, dsrc1, 31); - if (*dsrc1 != 0) { - rtl_shr(s, s0, ddest, dsrc1); + rtl_shr(s, s0, ddest, dsrc1); - rtl_li(s, s1, 32); - rtl_sub(s, s1, s1, dsrc1); - rtl_shl(s, s1, dsrc2, s1); + rtl_li(s, s1, 32); + rtl_sub(s, s1, s1, dsrc1); + rtl_shl(s, s1, dsrc2, s1); - rtl_or(s, s0, s0, s1); + rtl_or(s, s0, s0, s1); - operand_write(s, id_dest, s0); - rtl_update_ZFSF(s, s0, id_dest->width); - // unnecessary to update CF and OF in NEMU - } + operand_write(s, id_dest, s0); + rtl_update_ZFSF(s, s0, id_dest->width); + // unnecessary to update CF and OF in NEMU print_asm_template3(shrd); }