Mercurial > hg > CbC > old > device
changeset 230:d60c6c31f63a
*** empty log message ***
author | kono |
---|---|
date | Wed, 28 Apr 2004 15:06:01 +0900 |
parents | d793c84b3679 |
children | f5efe15629d4 |
files | Changes mc-code-ia32.c mc-code-powerpc.c mc-codegen.c |
diffstat | 4 files changed, 74 insertions(+), 29 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Wed Apr 28 00:02:59 2004 +0900 +++ b/Changes Wed Apr 28 15:06:01 2004 +0900 @@ -4059,3 +4059,15 @@ あぁ、そうか、long の引数の渡し方は、 r10 はレジスタ、残りはメモリに入るわけね。 + +Wed Apr 28 13:01:13 JST 2004 + +だいぶ、通りました。ltosop は、終り。 + +drexpr, lrexpr で cond を処理してなかった。 + +浮動小数点の誤差はどうしようもないの? printf の問題? + +あぁ、なんか、まだ、printf が局所変数を壊しているね。 + +そういえば、局所変数のアライメントは合わせてないけどいいの?
--- a/mc-code-ia32.c Wed Apr 28 00:02:59 2004 +0900 +++ b/mc-code-ia32.c Wed Apr 28 15:06:01 2004 +0900 @@ -1976,8 +1976,28 @@ } void -drexpr(int e1, int e2,int l1, int op) +drexpr(int e1, int e2,int l1, int op,int cond) { + if (cond) { + switch(op) { + case DOP+GE: + drexpr(e2,e1,l1,DOP+GT,0); break; + case FOP+GE: + drexpr(e2,e1,l1,FOP+GT,0); break; + case DOP+GT: + drexpr(e2,e1,l1,DOP+GE,0); break; + case FOP+GT: + drexpr(e2,e1,l1,FOP+GE,0); break; + case DOP+EQ: + op = DOP+NEQ; break; + case FOP+EQ: + op = FOP+NEQ; break; + case DOP+NEQ: + op = DOP+EQ; break; + case FOP+NEQ: + op = FOP+EQ; break; + } + } g_expr(list3(DCMP,e1,e2)); switch(op) { case DOP+GE: @@ -2104,7 +2124,7 @@ /* 64bit int part */ -void lrexpr(int e1, int e2,int l1, int op) +void lrexpr(int e1, int e2,int l1, int op,int cond) { }
--- a/mc-code-powerpc.c Wed Apr 28 00:02:59 2004 +0900 +++ b/mc-code-powerpc.c Wed Apr 28 15:06:01 2004 +0900 @@ -261,7 +261,8 @@ */ int arg_offset = 24; int arg_offset1 = 24; int disp_offset = -12; -#define func_disp_offset 60 +// #define func_disp_offset 60 +#define func_disp_offset 68 #define r1_offset func_disp_offset+12 int code_disp_offset = 0; int jump_offset = 0; #define CODE_LVAR l+code_disp_offset @@ -1011,7 +1012,24 @@ static char *cload(int sz) { return sz==1?"lbz":sz==size_of_short?"lhz":"lwz"; } static char *cstore(int sz) { return sz==1?"stb":sz==size_of_short?"sth":"stw"; } -static char *cext(int sz) { return sz==size_of_short?"extsh":"extsb"; } + +static void +cext(int sign,int sz,int reg) +{ + char *crn = register_name(reg); + if (sign) { + if (sz==1) + printf("\textsb %s,%s\n",crn,crn); + else if (sz==size_of_short) + printf("\textsh %s,%s\n",crn,crn); + } else { + if (sz==1) + printf("\trlwinm %s,%s,0,0xff\n",crn,crn); + else if (sz==size_of_short) + printf("\trlwinm %s,%s,0,0xffff\n",crn,crn); + } +} + void code_label(int labelno) @@ -1044,8 +1062,7 @@ crn = register_name(reg); printf("\t%s %s,0(%s)\n",cload(sz),crn, register_name(get_ptr_cache((NMTBL*)cadr(e1)))); - if (sign) - printf("\t%s %s,%s\n",cext(sz),crn,crn); + cext(sign,sz,reg); } @@ -1072,14 +1089,9 @@ lvar_intro(e2); printf("\t%s %s,",cload(sz),register_name(reg)); lvar(e2); - if (sign) - printf("\t%s %s,%s\n",cext(sz),register_name(reg),register_name(reg)); + cext(sign,sz,reg); } - - - - void code_fname(NMTBL *n,int reg) { int r; @@ -1150,8 +1162,7 @@ drn = register_name(reg); } printf("\t%s %s,0(%s)\n",cload(sz),drn,xrn); - if (use && sign && sz!=size_of_int) - printf("\t%s %s,%s\n",cext(sz),drn,drn); + if (use) cext(sign,sz,dreg); printf("\taddi %s,%s,%d\n",drn,drn,dir); printf("\t%s %s,0(%s)\n",cstore(sz),drn,xrn); } @@ -1181,8 +1192,7 @@ xrn = register_name(reg); } printf("\t%s %s,0(%s)\n",cload(sz),xrn,crn); - if (use && sign && sz!=size_of_int) - printf("\t%s %s,%s\n",cext(sz),xrn,xrn); + if (use) cext(sign,sz,reg); printf("\taddi %s,%s,%d\n",nrn,xrn,dir); printf("\t%s %s,0(%s)\n",cstore(sz),nrn,crn); free_register(nreg); @@ -1260,6 +1270,7 @@ crn = register_name(reg); r = get_ptr_cache((NMTBL*)cadr(e1)); printf("\t%s %s,0(%s)\n",cload(sz),crn,register_name(r)); + cext(0,sz,r); printf("\tcmpwi cr0,%s,0\n",crn); } @@ -1272,6 +1283,7 @@ lvar_intro(e2); printf("\t%s %s,",cload(sz),crn); lvar(e2); + cext(0,sz,reg); code_cmp_register(reg); } @@ -2814,6 +2826,7 @@ return; } rrn = register_name((r=get_register())); + use_reg(r); // to clear ptr cache printf(" \t.data\n\t.align 3\n"); lb=fwdlabel(); printf("L_%d:\n",lb); @@ -3324,9 +3337,9 @@ case LOP+LE: pcond(code_gt(!cond),l1); break; case LOP+UGT: - pcond(code_ugt(cond),l1); break; + pcond(code_ugt(!cond),l1); break; case LOP+UGE: - pcond(code_uge(cond),l1); break; + pcond(code_uge(!cond),l1); break; default: error(-1); } @@ -3345,9 +3358,9 @@ case LOP+LE: pcond(code_gt(!cond),l1); break; case LOP+UGT: - pcond(code_ugt(cond),l1); break; + pcond(code_ugt(!cond),l1); break; case LOP+UGE: - pcond(code_uge(cond),l1); break; + pcond(code_uge(!cond),l1); break; default: error(-1); }
--- a/mc-codegen.c Wed Apr 28 00:02:59 2004 +0900 +++ b/mc-codegen.c Wed Apr 28 15:06:01 2004 +0900 @@ -531,16 +531,16 @@ drexpr(cadr(e1),caddr(e1),l1,car(e1),cond); return; case FOP+LT: - drexpr(caddr(e1),cadr(e1),l1,FOP+GT,cond); + drexpr(caddr(e1),cadr(e1),l1,FOP+GT,!cond); return; case FOP+LE: - drexpr(caddr(e1),cadr(e1),l1,FOP+GE,cond); + drexpr(caddr(e1),cadr(e1),l1,FOP+GE,!cond); return; case DOP+LT: - drexpr(caddr(e1),cadr(e1),l1,DOP+GT,cond); + drexpr(caddr(e1),cadr(e1),l1,DOP+GT,!cond); return; case DOP+LE: - drexpr(caddr(e1),cadr(e1),l1,DOP+GE,cond); + drexpr(caddr(e1),cadr(e1),l1,DOP+GE,!cond); return; #endif #if LONGLONG_CODE @@ -551,20 +551,20 @@ lrexpr(cadr(e1),caddr(e1),l1,car(e1),cond); return; case LOP+LT: - lrexpr(caddr(e1),cadr(e1),l1,LOP+GT,cond); + lrexpr(caddr(e1),cadr(e1),l1,LOP+GT,!cond); return; case LOP+LE: - lrexpr(caddr(e1),cadr(e1),l1,LOP+GE,cond); + lrexpr(caddr(e1),cadr(e1),l1,LOP+GE,!cond); return; case LOP+UGT: case LOP+UGE: - lrexpr(cadr(e1),caddr(e1),l1,car(e1),cond); + lrexpr(cadr(e1),caddr(e1),l1,car(e1),!cond); return; case LOP+ULT: - lrexpr(caddr(e1),cadr(e1),l1,LOP+UGT,cond); + lrexpr(caddr(e1),cadr(e1),l1,LOP+UGT,!cond); return; case LOP+ULE: - lrexpr(caddr(e1),cadr(e1),l1,LOP+UGE,cond); + lrexpr(caddr(e1),cadr(e1),l1,LOP+UGE,!cond); return; #endif case LAND: