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);