diff --git a/src/isa/x86/exec/arith.h b/src/isa/x86/exec/arith.h index 79c74b4432130a030d7ab56673fb63c534bb0436..5e53c463be7da48875f2e55d9a04290222eeed88 100644 --- a/src/isa/x86/exec/arith.h +++ b/src/isa/x86/exec/arith.h @@ -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); diff --git a/src/isa/x86/exec/exec.c b/src/isa/x86/exec/exec.c index f24f39115c72b9a700edf72f9f3bcfedfa42741a..35e885e46703a4b8ef4f532a17bf3e594f212a88 100644 --- a/src/isa/x86/exec/exec.c +++ b/src/isa/x86/exec/exec.c @@ -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)