Mercurial > hg > CbC > old > device
diff mc-code-ia32.c @ 280:affb054fe920
lrexpr fix. rexpr in MIPS fix.
author | kono |
---|---|
date | Sun, 23 May 2004 15:27:25 +0900 |
parents | c922bade771d |
children | 179e22f166ef |
line wrap: on
line diff
--- a/mc-code-ia32.c Sat May 22 13:00:03 2004 +0900 +++ b/mc-code-ia32.c Sun May 23 15:27:25 2004 +0900 @@ -1593,8 +1593,22 @@ } void -rexpr(int e1, int l1, char *s,int t) -{ +rexpr(int e1, int l1, int cond,int t) +{ + char *s; + switch(car(e1)) { + case GT: s=code_gt(cond); break; + case UGT: s=code_ugt(cond); break; + case GE: s=code_ge(cond); break; + case UGE: s=code_uge(cond); break; + case LT: s=code_ge(!cond); break; + case ULT: s=code_uge(!cond);break; + case LE: s=code_gt(!cond); break; + case ULE: s=code_ugt(!cond);break; + case EQ: s=code_eq(cond); break; + case NEQ: s=code_eq(!cond); break; + default: error(-1); + } g_expr(list3(CMP,cadr(e1),caddr(e1))); printf("\tj%s\t_%d\n",s,l1); } @@ -2329,32 +2343,47 @@ void lrexpr(int e1, int e2,int l1, int op,int cond) { - int e3; + int l2; + code_save_stacks(); g_expr(e1); emit_lpush(); g_expr(e2); - ltosop(LSUB,USE_CREG,(e3==emit_lpop())); -// printf("\tpopl %%eax\n\tpopl %%edx\n"); // emit_pop_free + // we are sure %ecx,%ebx is free + printf("\tpopl %%ecx\n"); // LSW + printf("\tpopl %%ebx\n"); // MSW + printf("\tsubl %%edx,%%ebx\n"); + l2 = fwdlabel(); + // cond==0 jump on false condtion ( if(x) => rexpr(.. cond=0 ...) ) switch(op) { case LOP+GT: - pcond(code_gt(cond),l1); break; case LOP+GE: - pcond(code_ge(cond),l1); break; + pcond(code_gt(1),cond?l1:l2); + pcond(code_eq(0),cond?l2:l1); + break; + case LOP+UGT: + case LOP+UGE: + pcond(code_ugt(1),cond?l1:l2); + pcond(code_eq(0), cond?l2:l1); + break; case LOP+EQ: - pcond(code_eq(cond),l1); break; + pcond(code_eq(0),(cond?l2:l1)); + pcond(code_eq(cond),l1); + break; case LOP+NEQ: - pcond(code_eq(!cond),l1); break; - case LOP+LT: - pcond(code_ge(!cond),l1); break; - case LOP+LE: - pcond(code_gt(!cond),l1); break; - case LOP+UGT: - pcond(code_ugt(cond),l1); break; - case LOP+UGE: - pcond(code_uge(cond),l1); break; + pcond(code_eq(0),(cond?l1:l2)); + pcond(code_eq(!cond),l1); + break; default: error(-1); } + printf("\tsubl %%eax,%%ecx\n"); + switch(op) { + case LOP+GT: pcond(code_gt(cond), l1); break; + case LOP+GE: pcond(code_ge(cond), l1); break; + case LOP+UGT: pcond(code_ugt(cond), l1); break; + case LOP+UGE: pcond(code_uge(cond), l1); break; + } + fwddef(l2); } int emit_lpop()