diff --git a/src/isa/x86/exec/arith.h b/src/isa/x86/exec/arith.h index 6091d91cdcb229285d7674b2fbe8163ea3dbd928..23e47c5950702e43410300c9e35231a9de5ffd66 100644 --- a/src/isa/x86/exec/arith.h +++ b/src/isa/x86/exec/arith.h @@ -4,7 +4,7 @@ static inline make_EHelper(add) { // TODO(); rtl_add(s, s0, ddest, dsrc1); #ifdef LAZY_CC - rtl_set_lazycc(s, s0, dsrc1, ddest, LAZYCC_ADD, id_dest->width); + rtl_set_lazycc(s, s0, ddest, NULL, LAZYCC_ADD, id_dest->width); #else rtl_update_ZFSF(s, s0, id_dest->width); if (id_dest->width != 4) { @@ -24,7 +24,7 @@ static inline void cmp_internal(DecodeExecState *s) { rtl_sub(s, s0, ddest, dsrc1); #ifdef LAZY_CC - rtl_set_lazycc(s, s0, ddest, dsrc1, LAZYCC_SUB, id_dest->width); + rtl_set_lazycc(s, s0, ddest, NULL, LAZYCC_SUB, id_dest->width); #else rtl_update_ZFSF(s, s0, id_dest->width); @@ -56,7 +56,7 @@ static inline make_EHelper(inc) { // TODO(); rtl_addi(s, s0, ddest, 1); #ifdef LAZY_CC - rtl_set_lazycc(s, s0, ddest, NULL, LAZYCC_INC, id_dest->width); + rtl_set_lazycc(s, s0, NULL, NULL, LAZYCC_INC, id_dest->width); #else rtl_update_ZFSF(s, s0, id_dest->width); rtl_setrelopi(s, RELOP_EQ, s1, s0, 0x80000000); @@ -70,7 +70,7 @@ static inline make_EHelper(dec) { // TODO(); rtl_subi(s, s0, ddest, 1); #ifdef LAZY_CC - rtl_set_lazycc(s, s0, ddest, NULL, LAZYCC_DEC, id_dest->width); + rtl_set_lazycc(s, s0, NULL, NULL, LAZYCC_DEC, id_dest->width); #else rtl_update_ZFSF(s, s0, id_dest->width); rtl_setrelopi(s, RELOP_EQ, s1, s0, 0x7fffffff); @@ -84,7 +84,7 @@ static inline make_EHelper(neg) { // TODO(); rtl_sub(s, s0, rz, ddest); #ifdef LAZY_CC - rtl_set_lazycc(s, s0, NULL, ddest, LAZYCC_NEG, id_dest->width); + rtl_set_lazycc(s, s0, NULL, NULL, LAZYCC_NEG, id_dest->width); #else rtl_update_ZFSF(s, s0, id_dest->width); rtl_setrelopi(s, RELOP_NE, s1, ddest, 0); diff --git a/src/isa/x86/exec/lazycc.h b/src/isa/x86/exec/lazycc.h index ec73e9d8163cc4fa55f605a8148a51758b8d6ffa..18c5df8454fd28cd1c40e3e4677fb6446ed99ec7 100644 --- a/src/isa/x86/exec/lazycc.h +++ b/src/isa/x86/exec/lazycc.h @@ -33,13 +33,17 @@ static inline make_rtl(lazy_jcc, uint32_t cc) { switch (cpu.cc_op) { case LAZYCC_DEC: - rtl_li(s, &cpu.cc_src2, 1); - // fall through + if (cc2relop[cc] != -1) { + rtl_jrelop(s, cc2relop[cc], &cpu.cc_dest, rz, s->jmp_pc); + return; + } + break; case LAZYCC_SBB: // FIXME: should consider CF case LAZYCC_SUB: if (cc2relop[cc] != -1) { //Log("cc = %d, src1 = 0x%x, src2 = 0x%x", cc, cpu.cc_src1, cpu.cc_src2); - rtl_jrelop(s, cc2relop[cc], &cpu.cc_src1, &cpu.cc_src2, s->jmp_pc); + rtl_sub(s, t0, &cpu.cc_src1, &cpu.cc_dest); + rtl_jrelop(s, cc2relop[cc], &cpu.cc_src1, t0, s->jmp_pc); return; } break; @@ -59,7 +63,8 @@ static inline make_rtl(lazy_setcc, rtlreg_t *dest, uint32_t cc) { switch (cpu.cc_op) { case LAZYCC_SUB: if (cc2relop[cc] != -1) { - rtl_setrelop(s, cc2relop[cc], dest, &cpu.cc_src1, &cpu.cc_src2); + rtl_sub(s, t0, &cpu.cc_src1, &cpu.cc_dest); + rtl_setrelop(s, cc2relop[cc], dest, &cpu.cc_src1, t0); return; } break; diff --git a/src/isa/x86/exec/logic.h b/src/isa/x86/exec/logic.h index 5d9bdff2fb1140059c06da9c16c4a88fccb2da5d..3b55f6d5ac40718cdba6cbc8bac75351fb199db9 100644 --- a/src/isa/x86/exec/logic.h +++ b/src/isa/x86/exec/logic.h @@ -4,7 +4,7 @@ static inline void and_internal(DecodeExecState *s) { rtl_and(s, s0, ddest, dsrc1); #ifdef LAZY_CC - rtl_set_lazycc(s, s0, dsrc1, ddest, LAZYCC_LOGIC, id_dest->width); + rtl_set_lazycc(s, s0, NULL, NULL, LAZYCC_LOGIC, id_dest->width); #else rtl_update_ZFSF(s, s0, id_dest->width); rtl_mv(s, &cpu.CF, rz); @@ -26,7 +26,7 @@ static inline make_EHelper(and) { static inline make_EHelper(xor) { rtl_xor(s, s0, ddest, dsrc1); #ifdef LAZY_CC - rtl_set_lazycc(s, s0, dsrc1, ddest, LAZYCC_LOGIC, id_dest->width); + rtl_set_lazycc(s, s0, NULL, NULL, LAZYCC_LOGIC, id_dest->width); #else rtl_update_ZFSF(s, s0, id_dest->width); rtl_mv(s, &cpu.CF, rz); @@ -39,7 +39,7 @@ static inline make_EHelper(xor) { static inline make_EHelper(or) { rtl_or(s, s0, ddest, dsrc1); #ifdef LAZY_CC - rtl_set_lazycc(s, s0, dsrc1, ddest, LAZYCC_LOGIC, id_dest->width); + rtl_set_lazycc(s, s0, NULL, NULL, LAZYCC_LOGIC, id_dest->width); #else rtl_update_ZFSF(s, s0, id_dest->width); rtl_mv(s, &cpu.CF, rz);