Mercurial > hg > CbC > old > device
changeset 232:8a23c20ac92d
*** empty log message ***
author | kono |
---|---|
date | Thu, 29 Apr 2004 03:47:07 +0900 |
parents | f5efe15629d4 |
children | 2208a18f3799 |
files | Changes mc-code-powerpc.c mc-codegen.c stdio.h test/float.c test/long.c |
diffstat | 6 files changed, 63 insertions(+), 45 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Wed Apr 28 21:33:45 2004 +0900 +++ b/Changes Thu Apr 29 03:47:07 2004 +0900 @@ -4081,3 +4081,13 @@ でもないか。 なんか、いろいろ直した割に、進んでないな。 + +code_bool がjmpを使うのはいかにもまずいよね。そうねぇ。 + +しかし、float/double printf("%d",f0>f1) の真偽値だけが反転する +バグが取れない。 + +code-gen.c の方は動いたが、float.c の方がだめ。 +なんか、まるででたらめに動いているみたい.... + +function() の中で、lreg がinput registerと重なってしまう。
--- a/mc-code-powerpc.c Wed Apr 28 21:33:45 2004 +0900 +++ b/mc-code-powerpc.c Thu Apr 29 03:47:07 2004 +0900 @@ -1711,19 +1711,21 @@ // put whole long long anyway arg = list2(LVAR,caller_arg_offset_v(nargs)); arg_assign = list2( - assign_expr0(get_input_register_var(reg_arg,0,0), + assign_expr0(r0=get_input_register_var(reg_arg,0,0), arg,INT,INT), arg_assign); + use_reg(cadr(r0)); } else if (!simple_args(e3) && cadr(e3)) { arg = get_lregister_var(0); arg_assign = list2( - assign_expr0(get_input_lregister_var(reg_arg,0,0), + assign_expr0(r0=get_input_lregister_var(reg_arg,0,0), arg,t,t), arg_assign); + use_reg(cadr(r0)); } else { arg = get_input_lregister_var(reg_arg,0,0); + use_reg(cadr(arg)); } - if (car(arg)==LREGISTER) use_reg(cadr(arg)); reg_arg_list = list2(arg,reg_arg_list); g_expr_u(assign_expr0(arg,e4,t,t)); nargs ++ ; reg_arg++; @@ -3207,17 +3209,17 @@ if (!cond) { switch(op) { case FOP+GT: - drexpr(e2,e1,l1,FOP+GE,1); break; + drexpr(e2,e1,l1,FOP+GE,1); return; case FOP+GE: - drexpr(e2,e1,l1,FOP+GT,1); break; + drexpr(e2,e1,l1,FOP+GT,1); return; case FOP+EQ: op=FOP+NEQ; break; case FOP+NEQ: op=FOP+EQ; break; case DOP+GT: - drexpr(e2,e1,l1,DOP+GE,1); break; + drexpr(e2,e1,l1,DOP+GE,1); return; case DOP+GE: - drexpr(e2,e1,l1,DOP+GT,1); break; + drexpr(e2,e1,l1,DOP+GT,1); return; case DOP+EQ: op=DOP+NEQ; break; case DOP+NEQ: @@ -3225,17 +3227,17 @@ } } g_expr(list3( - ((op==DOP+GT||op==DOP+GE||op==FOP+GT||op==FOP+GE)?DCMPGE:DCMP), + ((op==DOP+GE||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); + printf("\tble\tcr0,L_%d\n",l1); break; case DOP+GE: case FOP+GE: - printf("\tble\tcr0,L_%d\n",l1); + printf("\tcrnor 30,29,30\n"); + printf("\tbeq\tcr7,L_%d\n",l1); break; case DOP+EQ: case FOP+EQ:
--- a/mc-codegen.c Wed Apr 28 21:33:45 2004 +0900 +++ b/mc-codegen.c Thu Apr 29 03:47:07 2004 +0900 @@ -436,6 +436,7 @@ int rop_dual(op) { + // x op y => y dual(op) x switch(op) { case GT: return LT; case UGT: return ULT; @@ -531,16 +532,10 @@ drexpr(cadr(e1),caddr(e1),l1,car(e1),cond); return; case FOP+LT: - drexpr(caddr(e1),cadr(e1),l1,FOP+GE,!cond); - return; case FOP+LE: - drexpr(caddr(e1),cadr(e1),l1,FOP+GT,!cond); - return; case DOP+LT: - drexpr(caddr(e1),cadr(e1),l1,DOP+GE,!cond); - return; case DOP+LE: - drexpr(caddr(e1),cadr(e1),l1,DOP+GT,!cond); + drexpr(caddr(e1),cadr(e1),l1,rop_dual(car(e1)),cond); return; #endif #if LONGLONG_CODE @@ -548,23 +543,15 @@ case LOP+GE: case LOP+EQ: case LOP+NEQ: - lrexpr(cadr(e1),caddr(e1),l1,car(e1),cond); - return; - case LOP+LT: - lrexpr(caddr(e1),cadr(e1),l1,LOP+GE,!cond); - return; - case LOP+LE: - lrexpr(caddr(e1),cadr(e1),l1,LOP+GT,!cond); - return; case LOP+UGT: case LOP+UGE: lrexpr(cadr(e1),caddr(e1),l1,car(e1),cond); return; + case LOP+LT: + case LOP+LE: case LOP+ULT: - lrexpr(caddr(e1),cadr(e1),l1,LOP+UGE,!cond); - return; case LOP+ULE: - lrexpr(caddr(e1),cadr(e1),l1,LOP+UGT,!cond); + lrexpr(caddr(e1),cadr(e1),l1,rop_dual(car(e1)),cond); return; #endif case LAND:
--- a/stdio.h Wed Apr 28 21:33:45 2004 +0900 +++ b/stdio.h Thu Apr 29 03:47:07 2004 +0900 @@ -1,7 +1,9 @@ #ifndef __micro_c__aaa #include "/usr/include/stdio.h" +long long strtoll(const char *, char **, int); #else + #ifdef __APPLE__ typedef struct {
--- a/test/float.c Wed Apr 28 21:33:45 2004 +0900 +++ b/test/float.c Thu Apr 29 03:47:07 2004 +0900 @@ -46,22 +46,37 @@ g = 1.0; g = -g; - printf("%g\ncond ",g); - if(f==f*1.0) printf("1 "); - if(d==f*1.0) printf("2 "); - if(f==f1) printf("3 "); - if(d==d1) printf("4 "); - if(d==d2) printf("-4 "); - if(d>d1) printf("5 "); - if(d>d2) printf("-5 "); - if(d>=d1) printf("6 "); - if(d>=d2) printf("-6 "); - if(d!=d1) printf("7 "); - if(d!=d2) printf("-7 "); - if(d<d1) printf("8 "); - if(d<d2) printf("-8 "); - if(d<=d1) printf("9 "); - if(d<=d2) printf("-9 "); + printf("%d\ncond0 ",1); + if(f==f*1.0) printf("t "); + printf("%d\ncond1 ",f==f*1.0); + if(d==f*1.0) printf("t "); + printf("%d\ncond2 ",d==f*1.0); + if(f==f1) printf("t "); + printf("%d\ncond3 ",f==f1); + if(d==d1) printf("t "); + printf("%d\ncond4 ",d==d2); + if(d==d2) printf("t "); + printf("%d\ncond5 ",(d==d2)); + if(d>d1) printf("t "); + printf("%d\ncond6 ",d>d1); + if(d>d2) printf("t "); + printf("%d\ncond7 ",d>d2); + if(d>=d1) printf("t "); + printf("%d\ncond8 ",d>=d1); + if(d>=d2) printf("t "); + printf("%d\ncond9 ",d>=d2); + if(d!=d1) printf("t "); + printf("%d\ncond10 ",d!=d1); + if(d!=d2) printf("5 "); + printf("%d\ncond11 ",d!=d2); + if(d<d1) printf("t "); + printf("%d\ncond12 ",d<d1); + if(d<d2) printf("t "); + printf("%d\ncond13 ",d<d2); + if(d<=d1) printf("t "); + printf("%d\ncond14 ",d<=d1); + if(d<=d2) printf("t "); + printf("%d\ncond15 ",d<=d2); d = 123.4234; f=-234.333; i = d; d = i;
--- a/test/long.c Wed Apr 28 21:33:45 2004 +0900 +++ b/test/long.c Thu Apr 29 03:47:07 2004 +0900 @@ -160,6 +160,7 @@ printf("*up-- = %lld\n",*up--); printf("*--up = %lld\n",*--up); + printf("f(%lld %llu %llu %lld %lld)\n",i,j,k,m,a[33]); ii = f(i,j,k,m,a[33]); printf("f()=%lld\n",ii); @@ -173,6 +174,7 @@ long long f(long long i,unsigned long long j,unsigned long long k,long long m,long long a) { + printf("f(%lld %llu %llu %lld %lld)\n",i,j,k,m,a); return i+j*k-m/a; }