Mercurial > hg > CbC > old > device
diff mc-code-powerpc.c @ 288:ce7b4d90bc24
PowerPC code bool
author | kono |
---|---|
date | Thu, 03 Jun 2004 13:15:05 +0900 (2004-06-03) |
parents | a0779a414855 |
children | 55e611476cba |
line wrap: on
line diff
--- a/mc-code-powerpc.c Wed Jun 02 14:29:30 2004 +0900 +++ b/mc-code-powerpc.c Thu Jun 03 13:15:05 2004 +0900 @@ -1300,10 +1300,34 @@ #endif } +static int rexpr_bool(int e1,int reg); + +#if FLOAT_CODE +static int drexpr_bool(int e1,int reg); +#endif + +#if LONGLONG_CODE +static int lrexpr_bool(int e1,int reg) +{ + return 0; +} +#endif + + + void code_bool(int e1,int reg) { char *xrn; int e2,e3; + + if (rexpr_bool(e1,reg)) return; +#if FLOAT_CODE + else if (drexpr_bool(e1,reg)) return; +#endif +#if LONGLONG_CODE + else if (lrexpr_bool(e1,reg)) return; +#endif + b_expr(e1,1,e2=fwdlabel(),1); /* including > < ... */ use_int(reg); xrn = register_name(reg); @@ -2531,6 +2555,39 @@ printf(".text\n"); } +#define CRBITSIZ 4 + +static int +rexpr_bool(int e1,int reg) +{ + int t,flag=-1,eq=-1,neg=-1; + char *rn; + switch(car(e1)) { + case GT: t=INT; flag = 2; break; + case UGT: t=0; flag = 2; break; + case GE: t=INT; flag = 2; eq=3; break; + case UGE: t=0; flag = 2; eq=3; break; + case LT: t=INT; flag = 1; break; + case ULT: t=0; flag = 1; break; + case LE: t=INT; flag = 1; eq=3; break; + case ULE: t=0; flag = 1; eq=3; break; + case EQ: t=INT; flag = 3; break; + case NEQ: t=INT; flag = 3; neg=1; break; + default: return 0; + } + g_expr(list3((t==INT?CMP:UCMP),cadr(e1),caddr(e1))); + use_int(reg); + rn = register_name(reg); + if (eq>0) { + printf("\tcror %d,%d,%d\n",CRBITSIZ*cmpflag+flag-1, + CRBITSIZ*cmpflag+eq-1,CRBITSIZ*cmpflag+flag-1); + } + printf("\tmfcr %s\n",rn); + printf("\trlwinm %s,%s,%d,1\n",rn,rn,CRBITSIZ*cmpflag+flag); + if (neg>0) code_lnot(reg); + return 1; +} + void rexpr(int e1, int l1, int cond,int t) { @@ -2552,7 +2609,6 @@ printf("\tb%s cr%d,L_%d\n",s,cmpflag,l1); } - static void jcond(int l, char cond) { @@ -3422,12 +3478,12 @@ case DMUL: opn="fmul"; break; case FCMP: case DCMP: - printf("\tfcmpu cr7,%s,%s\n",frn,grn); + printf("\tfcmpu cr%d,%s,%s\n",cmpflag,frn,grn); if (ox!=-1) free_register(ox); return; case FCMPGE: case DCMPGE: - printf("\tfcmpu cr7,%s,%s\n",frn,grn); + printf("\tfcmpu cr%d,%s,%s\n",cmpflag,frn,grn); if (ox!=-1) free_register(ox); return; default: @@ -3543,6 +3599,33 @@ free_register(g); } +static int +drexpr_bool(int e1,int reg) +{ + int flag=-1,eq=-1,neg=-1; + char *rn; + switch(car(e1)) { + case DOP+GT: case FOP+GT: flag = 2; break; + case DOP+GE: case FOP+GE: flag = 2; eq=3; break; + case DOP+LT: case FOP+LT: flag = 1; break; + case DOP+LE: case FOP+LE: flag = 1; eq=3; break; + case DOP+EQ: case FOP+EQ: flag = 3; break; + case DOP+NEQ: case FOP+NEQ: flag = 3; neg=1; break; + default: return 0; + } + g_expr(list3(DCMP,cadr(e1),caddr(e1))); + use_int(reg); + rn = register_name(reg); + if (eq>0) { + printf("\tcror %d,%d,%d\n",CRBITSIZ*cmpflag+flag-1, + CRBITSIZ*cmpflag+eq-1,CRBITSIZ*cmpflag+flag-1); + } + printf("\tmfcr %s\n",rn); + printf("\trlwinm %s,%s,%d,1\n",rn,rn,CRBITSIZ*cmpflag+flag); + if (neg>0) code_lnot(reg); + return 1; +} + void drexpr(int e1, int e2,int l1, int op,int cond) { @@ -3566,26 +3649,19 @@ op=DOP+EQ; break; } } - // g_expr(list3( ((op==DOP+GE||op==FOP+GE)?DCMPGE:DCMP), e2,e1)); g_expr(list3(DCMP, e1,e2)); switch(op) { - case DOP+GT: - case FOP+GT: - printf("\tbgt\tcr7,L_%d\n",l1); + case DOP+GT: case FOP+GT: + printf("\tbgt\tcr%d,L_%d\n",cmpflag,l1); + break; + case DOP+GE: case FOP+GE: + printf("\tbge\tcr%d,L_%d\n",cmpflag,l1); break; - case DOP+GE: - case FOP+GE: - // printf("\tcrnor 30,29,30\n"); - // printf("\tbeq\tcr7,L_%d\n",l1); - printf("\tbge\tcr7,L_%d\n",l1); + case DOP+EQ: case FOP+EQ: + printf("\tbeq\tcr%d,L_%d\n",cmpflag,l1); break; - case DOP+EQ: - case FOP+EQ: - printf("\tbeq\tcr7,L_%d\n",l1); - break; - case DOP+NEQ: - case FOP+NEQ: - printf("\tbne\tcr7,L_%d\n",l1); + case DOP+NEQ: case FOP+NEQ: + printf("\tbne\tcr%d,L_%d\n",cmpflag,l1); break; } }