提交 8627fc3b 编写于 作者: Z Zihao Yu

x86,exec,lazy_cc: only record necessary operands

* other operands can be re-computed
上级 5bb52137
......@@ -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);
......
......@@ -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;
......
......@@ -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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册