Mercurial > hg > CbC > old > device
changeset 229:d793c84b3679
*** empty log message ***
author | kono |
---|---|
date | Wed, 28 Apr 2004 00:02:59 +0900 |
parents | 21b311266011 |
children | d60c6c31f63a |
files | mc-code-powerpc.c mc-code.h mc-codegen.c test/code-gen.c |
diffstat | 4 files changed, 63 insertions(+), 41 deletions(-) [+] |
line wrap: on
line diff
--- a/mc-code-powerpc.c Tue Apr 27 23:16:02 2004 +0900 +++ b/mc-code-powerpc.c Wed Apr 28 00:02:59 2004 +0900 @@ -3190,17 +3190,39 @@ } void -drexpr(int e1, int e2,int l1, int op) -{ - g_expr(list3(((op==DOP+GE)?DCMPGE:DCMP),e1,e2)); +drexpr(int e1, int e2,int l1, int op,int cond) +{ + if (cond) { + switch(op) { + case FOP+GT: + drexpr(e2,e1,l1,FOP+GE,0); break; + case FOP+GE: + drexpr(e2,e1,l1,FOP+GT,0); break; + case FOP+EQ: + op=FOP+NEQ; break; + case FOP+NEQ: + op=FOP+EQ; break; + case DOP+GT: + drexpr(e2,e1,l1,DOP+GE,0); break; + case DOP+GE: + drexpr(e2,e1,l1,DOP+GT,0); break; + case DOP+EQ: + op=DOP+NEQ; break; + case DOP+NEQ: + op=DOP+EQ; break; + } + } + g_expr(list3( + ((op==DOP+GT||op==DOP+GE||op==FOP+GT||op==FOP+GE)?DCMPGE:DCMP), + e2,e1)); switch(op) { + case DOP+GT: + case FOP+GT: + printf("\tcror 30,29,30\n"); + printf("\tbeq\tcr0,L_%d\n",l1); + break; case DOP+GE: case FOP+GE: - printf("\tcrnor 30,29,30\n"); - printf("\tbeq\tcr0,L_%d\n",l1); - break; - case DOP+GT: - case FOP+GT: printf("\tble\tcr0,L_%d\n",l1); break; case DOP+EQ: @@ -3270,13 +3292,13 @@ } static void -cond(char *s,int l1) +pcond(char *s,int l1) { printf("\tb%s cr0,L_%d\n",s,l1); } void -lrexpr(int e1, int e2,int l1, int op) +lrexpr(int e1, int e2,int l1, int op,int cond) { int reg; int e3; @@ -3290,42 +3312,42 @@ tosop(CMP,regv_h(reg),regv_h(e3)); switch(op) { case LOP+GT: - cond(code_gt(1),l1); break; + pcond(code_gt(cond),l1); break; case LOP+GE: - cond(code_ge(1),l1); break; + pcond(code_ge(cond),l1); break; case LOP+EQ: - cond(code_eq(1),l1); break; + pcond(code_eq(cond),l1); break; case LOP+NEQ: - cond(code_eq(0),l1); break; + pcond(code_eq(!cond),l1); break; case LOP+LT: - cond(code_ge(0),l1); break; + pcond(code_ge(!cond),l1); break; case LOP+LE: - cond(code_gt(0),l1); break; + pcond(code_gt(!cond),l1); break; case LOP+UGT: - cond(code_ugt(1),l1); break; + pcond(code_ugt(cond),l1); break; case LOP+UGE: - cond(code_uge(1),l1); break; + pcond(code_uge(cond),l1); break; default: error(-1); } tosop(CMP,regv_l(reg),regv_l(e3)); switch(op) { case LOP+GT: - cond(code_gt(1),l1); break; + pcond(code_gt(cond),l1); break; case LOP+GE: - cond(code_ge(1),l1); break; + pcond(code_ge(cond),l1); break; case LOP+EQ: - cond(code_eq(1),l1); break; + pcond(code_eq(cond),l1); break; case LOP+NEQ: - cond(code_eq(0),l1); break; + pcond(code_eq(!cond),l1); break; case LOP+LT: - cond(code_ge(0),l1); break; + pcond(code_ge(!cond),l1); break; case LOP+LE: - cond(code_gt(0),l1); break; + pcond(code_gt(!cond),l1); break; case LOP+UGT: - cond(code_ugt(1),l1); break; + pcond(code_ugt(cond),l1); break; case LOP+UGE: - cond(code_uge(1),l1); break; + pcond(code_uge(cond),l1); break; default: error(-1); }
--- a/mc-code.h Tue Apr 27 23:16:02 2004 +0900 +++ b/mc-code.h Wed Apr 28 00:02:59 2004 +0900 @@ -112,7 +112,7 @@ #if FLOAT_CODE /* floating point part */ -extern void drexpr(int e1, int e2,int l1, int op); +extern void drexpr(int e1, int e2,int l1, int op,int cond); extern int dpop_register(); extern int emit_dpop(int); extern void code_dregister(int e2,int reg,int d); @@ -152,7 +152,7 @@ #if LONGLONG_CODE /* 64bit int part */ -extern void lrexpr(int e1, int e2,int l1, int op); +extern void lrexpr(int e1, int e2,int l1, int op,int cond); extern int lpop_register(); extern int emit_lpop(); extern void code_lregister(int e2,int reg);
--- a/mc-codegen.c Tue Apr 27 23:16:02 2004 +0900 +++ b/mc-codegen.c Wed Apr 28 00:02:59 2004 +0900 @@ -528,19 +528,19 @@ case FOP+GE: case FOP+EQ: case FOP+NEQ: - drexpr(cadr(e1),caddr(e1),l1,car(e1)); + drexpr(cadr(e1),caddr(e1),l1,car(e1),cond); return; case FOP+LT: - drexpr(caddr(e1),cadr(e1),l1,FOP+GT); + drexpr(caddr(e1),cadr(e1),l1,FOP+GT,cond); return; case FOP+LE: - drexpr(caddr(e1),cadr(e1),l1,FOP+GE); + drexpr(caddr(e1),cadr(e1),l1,FOP+GE,cond); return; case DOP+LT: - drexpr(caddr(e1),cadr(e1),l1,DOP+GT); + drexpr(caddr(e1),cadr(e1),l1,DOP+GT,cond); return; case DOP+LE: - drexpr(caddr(e1),cadr(e1),l1,DOP+GE); + drexpr(caddr(e1),cadr(e1),l1,DOP+GE,cond); return; #endif #if LONGLONG_CODE @@ -548,23 +548,23 @@ case LOP+GE: case LOP+EQ: case LOP+NEQ: - lrexpr(cadr(e1),caddr(e1),l1,car(e1)); + lrexpr(cadr(e1),caddr(e1),l1,car(e1),cond); return; case LOP+LT: - lrexpr(caddr(e1),cadr(e1),l1,LOP+GT); + lrexpr(caddr(e1),cadr(e1),l1,LOP+GT,cond); return; case LOP+LE: - lrexpr(caddr(e1),cadr(e1),l1,LOP+GE); + lrexpr(caddr(e1),cadr(e1),l1,LOP+GE,cond); return; case LOP+UGT: case LOP+UGE: - lrexpr(cadr(e1),caddr(e1),l1,car(e1)); + lrexpr(cadr(e1),caddr(e1),l1,car(e1),cond); return; case LOP+ULT: - lrexpr(caddr(e1),cadr(e1),l1,LOP+UGT); + lrexpr(caddr(e1),cadr(e1),l1,LOP+UGT,cond); return; case LOP+ULE: - lrexpr(caddr(e1),cadr(e1),l1,LOP+UGE); + lrexpr(caddr(e1),cadr(e1),l1,LOP+UGE,cond); return; #endif case LAND: