提交 c6a99a41 编写于 作者: Z Zihao Yu

x86,exec,arith: fix CF and OF for adc/sbb

* pass eflagstest
上级 7c324489
......@@ -112,10 +112,15 @@ static inline make_EHelper(adc) {
rtl_andi(s, s1, s1, 0xffffffffu >> ((4 - id_dest->width) * 8));
}
rtl_update_ZFSF(s, s1, id_dest->width);
rtl_is_add_overflow(s, s0, s1, ddest, s0, id_dest->width);
rtl_set_OF(s, s0);
rtl_is_add_carry(s, s0, s1, ddest);
// s1 = ddest + (dsrc1 + CF)
// new_CF = (CF ? s1 <= dsrc1 : s1 < dsrc1);
// = (CF ? s1 < dsrc1 + 1 : s1 < dsrc1);
// = s1 < dsrc1 + CF;
// = s1 < s0;
rtl_setrelop(s, RELOP_LTU, s0, s1, s0);
rtl_set_CF(s, s0);
rtl_is_add_overflow(s, s0, s1, ddest, dsrc1, id_dest->width);
rtl_set_OF(s, s0);
#endif
operand_write(s, id_dest, s1);
print_asm_template2(adc);
......@@ -137,10 +142,15 @@ static inline make_EHelper(sbb) {
rtl_andi(s, s1, s1, 0xffffffffu >> ((4 - id_dest->width) * 8));
}
rtl_update_ZFSF(s, s1, id_dest->width);
rtl_is_sub_overflow(s, s0, s1, ddest, s0, id_dest->width);
rtl_set_OF(s, s0);
rtl_is_sub_carry(s, s0, s1, ddest);
// s1 = ddest - (dsrc1 + CF)
// new_CF = (CF ? ddest <= dsrc1 : ddest < dsrc1);
// = (CF ? ddest < dsrc1 + 1 : ddest < dsrc1);
// = ddest < dsrc1 + CF;
// = ddest < s0;
rtl_setrelop(s, RELOP_LTU, s0, ddest, s0);
rtl_set_CF(s, s0);
rtl_is_sub_overflow(s, s0, s1, ddest, dsrc1, id_dest->width);
rtl_set_OF(s, s0);
#endif
operand_write(s, id_dest, s1);
print_asm_template2(sbb);
......
......@@ -110,13 +110,13 @@ IDEXW(0x00, G2E, add, 1) IDEX (0x01, G2E, add) IDEXW(0x02, E2G, add, 1)
EMPTY(0x04) IDEX (0x05, I2a, add)
IDEXW(0x08, G2E, or, 1) IDEX (0x09, G2E, or) IDEXW(0x0a, E2G, or, 1) IDEX (0x0b, E2G, or)
IDEXW(0x0c, I2a, or, 1) IDEX (0x0d, I2a, or) EMPTY(0x0e) EX (0x0f, 2byte_esc)
EMPTY(0x10) IDEX (0x11, G2E, adc) EMPTY(0x12) IDEX (0x13, E2G, adc)
IDEXW(0x10, G2E, adc, 1) IDEX (0x11, G2E, adc) EMPTY(0x12) IDEX (0x13, E2G, adc)
EMPTY(0x18) IDEX (0x19, G2E, sbb) EMPTY(0x1a) IDEX (0x1b, E2G, sbb)
IDEXW(0x18, G2E, sbb, 1) IDEX (0x19, G2E, sbb) EMPTY(0x1a) IDEX (0x1b, E2G, sbb)
IDEXW(0x20, G2E, and, 1) IDEX (0x21, G2E, and) IDEXW(0x22, E2G, and, 1) IDEX (0x23, E2G, and)
IDEXW(0x24, I2a, and, 1) IDEX (0x25, I2a, and)
EMPTY(0x28) IDEX (0x29, G2E, sub) EMPTY(0x2a) IDEX (0x2b, E2G, sub)
IDEXW(0x28, G2E, sub, 1) IDEX (0x29, G2E, sub) EMPTY(0x2a) IDEX (0x2b, E2G, sub)
EMPTY(0x2c) IDEX (0x2d, I2a, sub)
IDEXW(0x30, G2E, xor, 1) IDEX (0x31, G2E, xor) IDEXW(0x32, E2G, xor, 1) IDEX (0x33, E2G, xor)
EMPTY(0x34) IDEX (0x35, I2a, xor)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册