Mercurial > hg > CbC > old > device
changeset 142:de272ad4ddce
mips continue
author | kono |
---|---|
date | Sun, 18 May 2003 21:03:39 +0900 |
parents | b70018bb3c0e |
children | 66ddda268ac5 |
files | Changes mc-code-mips.c |
diffstat | 2 files changed, 38 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Mon May 12 00:39:57 2003 +0900 +++ b/Changes Sun May 18 21:03:39 2003 +0900 @@ -2958,6 +2958,25 @@ り当てられるから、そのあたりでテストすることは可能だろうね。 まぁ、これ自体は難しくはないが... +code segment では浮動小数点レジスタに割り振られてしまうので、 +実はエラーが出ていたんじゃないかな。これはテストプログラム +を書くべきでしょうね。 + あるいは#define REG register でテストする必要があるわけね。 MIPSでは、$4,$5,$6,$7 は、本当に特別扱いしないとだめだね。 + +Thu May 15 21:25:45 JST 2003 + +fregv は、やっぱりサブルーチン・コールにするんだろ? +(さすがに授業が始まってしまうと、なかなか進まない...) + +Sat May 17 13:57:12 JST 2003 + +$4,$5 を常に creg または、double のfregとして使う。 +$f12 はfloating 用。 + +もちろん、emit_pushすればずれちゃうけどね。rename するべきか? +そもそもrenameは必要ないんじゃないの? + +あともう少しなんだけどねぇ。やる気がでん...
--- a/mc-code-mips.c Mon May 12 00:39:57 2003 +0900 +++ b/mc-code-mips.c Sun May 18 21:03:39 2003 +0900 @@ -2286,15 +2286,19 @@ } void code_f2i(int freg,int creg) { + printf("\ttrunc.w.s %s,%s,%s\n",freg,freg,creg); } void code_f2u(int freg,int creg) { + printf("\ttrunc.w.s %s,%s,%s\n",freg,freg,creg); } void code_i2f(int creg,int freg) { + printf("\tcvt.s.w %s,%s\n",freg,freg); } void code_u2f(int creg,int freg) { + printf("\tcvt.s.w %s,%s\n",freg,freg); } void code_drgvar(int e2,int d,int freg) @@ -2412,7 +2416,7 @@ case DMUL: dtosop0("dpmul",e1,1,0); return; case DCMPGE: case DCMP: dtosop0("dpcmp",e1,1,1); return; - case FCMPGE: + case FCMPGE: dtosop0("c.le.s",e1,0,1); return; case FCMP: dtosop0("c.eq.s",e1,0,1); return; default: error(-1); return; @@ -2536,23 +2540,31 @@ void drexpr(int e1, int e2,int l1, int op) { - g_expr(list3(((op==DOP+GE)?DCMPGE:DCMP),e1,e2)); + g_expr(list3(((op==FOP+EQ||op==FOP+NEQ)?DCMP:FCMPGE),e1,e2)); switch(op) { case DOP+GE: - case FOP+GE: printf("\tbgez\tL_%d\n",l1); break; case DOP+GT: - case FOP+GT: printf("\tbltz\tL_%d\n",l1); break; case DOP+EQ: - case FOP+EQ: printf("\tbeq\tL_%d\n",l1); break; case DOP+NEQ: + printf("\tbne\tL_%d\n",l1); + break; + case FOP+GE: + printf("\tbc1tl\tL_%d\n",l1); + break; + case FOP+GT: + printf("\tbc1tl\tL_%d\n",l1); + break; + case FOP+EQ: + printf("\tbc1f\tL_%d\n",l1); + break; case FOP+NEQ: - printf("\tbne\tL_%d\n",l1); + printf("\tbc1f\tL_%d\n",l1); break; } } @@ -2563,7 +2575,7 @@ xreg=pop_fregister(); if (xreg<= -REG_LVAR_OFFSET) { reg = get_dregister(d); - code_drlvar(REG_LVAR_OFFSET+xreg,1,reg); + code_drlvar(REG_LVAR_OFFSET+xreg,d,reg); free_lvar(REG_LVAR_OFFSET+xreg); fregv[reg]=1; xreg=reg; }