From 9a0036d1ed1c6546e6e3238b3624412fdde9e852 Mon Sep 17 00:00:00 2001 From: Zihao Yu Date: Fri, 13 Mar 2020 21:17:08 +0800 Subject: [PATCH] x86,logic: fix shld/shld with sdi or jit mode * we can not access runtime value at the translation time * fix by guarding the shift amount with mask in the interpreter --- src/engine/interpreter/c_op.h | 12 +++++++++--- src/isa/x86/exec/logic.h | 36 ++++++++++++++++------------------- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/engine/interpreter/c_op.h b/src/engine/interpreter/c_op.h index 54fd7e9f..c5373c64 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 c078db7c..d7251780 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); } -- GitLab