提交 9a0036d1 编写于 作者: Z Zihao Yu

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
上级 d02d57c2
......@@ -3,14 +3,20 @@
#include <common.h>
#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))
......
......@@ -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);
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册