Mercurial > hg > CbC > old > device
changeset 284:ec1a68133f6a
MIPS f2u bug fix.
author | kono |
---|---|
date | Mon, 24 May 2004 19:59:50 +0900 |
parents | 230a3b98b843 |
children | 912b54949344 |
files | Changes mc-code-mips.c mc-codegen.c test/float.c |
diffstat | 4 files changed, 30 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Mon May 24 13:21:22 2004 +0900 +++ b/Changes Mon May 24 19:59:50 2004 +0900 @@ -4539,3 +4539,17 @@ この一貫しないのやめてよ.... $sp!=$fp にすると、$gp がずれて しまう。call の前に $fp=$sp にするという手もあるが.... + +結局、自分で、 + lw $gp,16($sp) +するので解決。 + +Mon May 24 13:26:54 JST 2004 + +MIPS の jump は、できました。MIPSはR1SAVEしないのね。R1SAVE +の方が若干安全な気もするが、毎回手間があるのはいただけないよ +ね。 + +leave で、control が必ず on になるのは何故? + +次は、やっぱり、c2cbc でしょう。
--- a/mc-code-mips.c Mon May 24 13:21:22 2004 +0900 +++ b/mc-code-mips.c Mon May 24 19:59:50 2004 +0900 @@ -356,7 +356,7 @@ lvar_offsetv += round16(r1_offsetv)-r1_offsetv; r1_offsetv = round16(r1_offsetv); -#if 1 +#if 0 printf("# vars= %d, regs= %d/%d, args= %d, extra= %d\n", round16(-disp), max_reg_var+2, @@ -3582,10 +3582,11 @@ printf("\t.p2align 2\n"); fwddef(lb1); printf("\tsub.s %s,%s,%s\n",fr0,fr0,fr1); - printf("\tli $3,-2147483648 # 0x80000000\n"); + printf("\tli %s,-2147483648 # 0x80000000\n", + r0); printf("\ttrunc.w.s %s,%s,%s\n",fr1,fr0,r1); printf("\tmfc1 %s,%s\n",r1,fr1); - printf("\tor %s,%s,%s\n",r1,r1,r0); + printf("\tor %s,%s,%s\n",r0,r1,r0); fwddef(lb2); free_register(freg1); free_register(freg2); @@ -3606,17 +3607,18 @@ void code_u2f(int reg) { - int n = new_lvar(SIZE_OF_FLOAT); - int reg0,reg1; + // int n = new_lvar(SIZE_OF_FLOAT); + int /*reg0,*/reg1; int lb1,lb2; char *frn,*r0,*r1; - code_assign_lvar(n,ireg,0); + // code_assign_lvar(n,ireg,0); printf("\tbltz %s,$L_%d\n",r0=register_name(ireg),lb1=fwdlabel()); use_float(0,reg); - code_drlvar(n,0,reg); - r0= register_name(reg0 = get_register()); + // code_drlvar(n,0,reg); + // r0= register_name(reg0 = get_register()); r1= register_name(reg1 = get_register()); frn = fregister_name(reg); + printf("\tmtc1 %s,%s\n",r0,frn); printf("\tcvt.s.w %s,%s\n",frn,frn); printf("\tj $L_%d\n",lb2=fwdlabel()); printf("\t.p2align 2\n"); @@ -3628,7 +3630,7 @@ printf("\tcvt.s.w %s,%s\n",frn,frn); printf("\tadd.s %s,%s,%s\n",frn,frn,frn); fwddef(lb2); - free_register(reg0); + // free_register(reg0); free_register(reg1); }
--- a/mc-codegen.c Mon May 24 13:21:22 2004 +0900 +++ b/mc-codegen.c Mon May 24 19:59:50 2004 +0900 @@ -746,7 +746,7 @@ /* source (after) list2(tag,disp) */ /* source list list3(e,cdr,sz) */ -#define DEBUG_PARALLEL_ASSIGN 1 +#define DEBUG_PARALLEL_ASSIGN 0 int overrap(int t,int sz,int source)
--- a/test/float.c Mon May 24 13:21:22 2004 +0900 +++ b/test/float.c Mon May 24 19:59:50 2004 +0900 @@ -88,10 +88,13 @@ d = 4204967294.4234; f=4204967294.4234; u = d; + printf("1: u=%u d=%g f=%f\n",u,d,f); d = u; + printf("2: u=%u d=%g f=%f\n",u,d,f); u = f; + printf("3: u=%u d=%g f=%f\n",u,d,f); f = u; - printf("u=%u d=%g f=%f\n",u,d,f); + printf("4: u=%u d=%g f=%f\n",u,d,f); print(1.0); print(0.1234);