changeset 582:3f60e599cc04 intel-register-removal

*** empty log message ***
author kono
date Mon, 16 Jan 2006 00:52:56 +0900
parents ad9ef203f95b
children 421be86892b3
files Changes mc-code-ia32.c mc-codegen.c test/throw.c test/throw.code-out
diffstat 5 files changed, 73 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Sun Jan 15 22:40:23 2006 +0900
+++ b/Changes	Mon Jan 16 00:52:56 2006 +0900
@@ -8386,7 +8386,32 @@
 そもそも、そうでないと parallel assignment がうまく動かない
 はずだよね。
 
-
-
-
-
+というわけで、disp_offset==code_disp_offset は必須ということに
+なりました。これで、code_fix_frame_pointer はなくなりました。
+
+non destructive creg ってのは、あっても良いかも。
+
+Sun Jan 15 23:16:10 JST 2006
+
+あーぁ、ia32 のレジスタ変数がloopでは、virtualがずれるので
+うまく動かない。jmp では、標準に直すべきなのか。ってことは、
+ia32 ではレジスタはやっぱり禁止か。か、あるいは、virtual
+を止めるかだね。esi/edi はvirtualしないっていう風にすれば
+いいか。lreg は?
+
+いや、だめですね。check_virtual みたいな方法だと、もっと、
+いろいろ変更しないと動かない。use_data_reg() とかは、
+根本的にだめってことじゃないか? (いまさら?)
+
+use_register(reg,REG_EAX) などが、 reg = use_register(reg,REG_EAX);
+という形式ならば、rename し切れなかった時に、別なレジスタを返せる。
+
+通常は register はcopy して使うわけだから、rename はされな
+い。setup_edx とか、get_register で esi/edi が返されて rename
+されてしまった時がまずいわけだけよね。 その時だけ check_virtual
+すれば?
+
+esi/edi をget_regsiter しないと、assop などで、致命的に足り
+ないことになる。
+
+
--- a/mc-code-ia32.c	Sun Jan 15 22:40:23 2006 +0900
+++ b/mc-code-ia32.c	Mon Jan 16 00:52:56 2006 +0900
@@ -713,7 +713,13 @@
 int
 get_register_var(NMTBL *nptr)
 {
+#if 0
     int i,j;
+    どうしても、%esi,%edi がvirtualでずれてループしてしまうのを
+    止められないので、とりえあず諦める。
+
+    edx_setup あたりがまずいらしいが...
+
     if (reg_var<2) {
 	for(i=REG_ESI;i<REG_EBP;i++) {
 	    j = virtual(i);
@@ -725,6 +731,7 @@
 	    }
 	}
     }
+#endif
     return list3(LVAR,new_lvar(SIZE_OF_INT),0);
 }
 
@@ -734,7 +741,7 @@
     return list3(LVAR,new_lvar(d?SIZE_OF_DOUBLE:SIZE_OF_FLOAT),0);
 }
 
-void 
+static void 
 use_register(int virt, int real, int move)
 {
     int real_v;
@@ -750,7 +757,28 @@
     rname[virt] = real; 
 }
 
-void 
+#if 0
+static void
+check_virtual()
+{
+    int real;
+    if (rname[REG_ESI]!=REG_ESI) {
+	real = rname[REG_ESI];
+	printf("\txchg %%esi,%s\n",reg_name[real]);
+	rname[real] = real;
+	rname[REG_ESI] = REG_ESI;
+    }
+    if (rname[REG_EDI]!=REG_EDI) {
+	real = rname[REG_EDI];
+	printf("\txchg %%edi,%s\n",reg_name[real]);
+	rname[real] = real;
+	rname[REG_EDI] = REG_EDI;
+    }
+}
+#endif
+
+#if 0
+static void 
 use_pointer(int virt, int move)
 {
     int i;
@@ -765,6 +793,7 @@
     /* we prefer EBX */
     use_register(virt,REG_EBX,move);
 }
+#endif
 
 void 
 use_data_reg(int virt, int move)
@@ -809,10 +838,6 @@
 {
     int xreg;
     if ((xreg=pop_register())==-1) {
-	if (type==POINTER_REG)
-	    use_pointer(dreg,0);
-	else if (type==DATA_REG)
-	    use_data_reg(dreg,0);
 if (regv[dreg]) {
     printf("### emit_pop dreg conflict\n");
     error(-1);
@@ -1025,6 +1050,7 @@
     g_expr(e2);
     xrn = register_name(creg,0);
     use_int(reg);
+    // use_data_reg(reg);
     printf("\t%s $%d,(%s)\n",(sz==1)?"addb":(sz==SIZE_OF_SHORT)?"addw":"addl",dir,xrn);
     printf("\t%s (%s),%s\n",cload(sign,sz),xrn,register_name(reg,0));
 }
@@ -1044,6 +1070,7 @@
     emit_push();  
     xrn = register_name((e2=emit_pop(0)),0);
     use_int(reg);
+    // use_data_reg(reg);
     printf("\t%s (%s),%s\n",cload(sign,sz),xrn,register_name(reg,0));
     printf("\t%s $%d,(%s)\n",(sz==1)?"addb":(sz==SIZE_OF_SHORT)?"addw":"addl",dir,xrn);
     emit_pop_free(e2);
--- a/mc-codegen.c	Sun Jan 15 22:40:23 2006 +0900
+++ b/mc-codegen.c	Mon Jan 16 00:52:56 2006 +0900
@@ -932,7 +932,7 @@
 /*     source (after) list2(tag,disp)                       */
 /* source list    list3(e,cdr,sz)                           */
 
-#define DEBUG_PARALLEL_ASSIGN 9
+#define DEBUG_PARALLEL_ASSIGN 0
 
 static int is_writable(int);
 
--- a/test/throw.c	Sun Jan 15 22:40:23 2006 +0900
+++ b/test/throw.c	Mon Jan 16 00:52:56 2006 +0900
@@ -23,7 +23,7 @@
 code
 throw1(interface1 arg,int i,int j)
 {
-    printf("%d %d %d %d\n",arg.last,arg.a,arg.c[99],j);
+    printf("%d %d %d %d %d\n",arg.last,arg.a,arg.c[99],i,j);
     arg.last=96;
     goto throw2(arg,i,74);
 }
@@ -32,7 +32,7 @@
 throw(interface1 arg,int i,int j)
 {
     char *space = (char *)malloc(ENVSIZE)+ENVSIZE;
-    printf("%d %d %d %d\n",arg.last,arg.a,arg.c[99],j);
+    printf("%d %d %d %d %d\n",arg.last,arg.a,arg.c[99],i,j);
     arg.last=97;
     goto throw1(arg,i,75),space;
 }
@@ -40,7 +40,7 @@
 void
 setup(interface1 *arg)
 {
-    for(int i=0;i<100;i++) arg->c[i]=i;
+    for(register int i=0;i<100;i++) arg->c[i]=i;
 }
 
 int
@@ -58,7 +58,7 @@
     ret = return;
     env = environment;
 
-    goto throw(arg,1,76);
+    goto throw(arg,-7,76);
 }
 
 int
@@ -79,7 +79,7 @@
     ret = return;
     env = environment;
 
-    goto throw1(arg,1,77),space;
+    goto throw1(arg,-6,77),space;
 }
 
 int
@@ -99,7 +99,7 @@
     ret = return;
     env = environment;
 
-    goto throw1(arg,1,78);
+    goto throw1(arg,-5,78);
 }
 
 int
--- a/test/throw.code-out	Sun Jan 15 22:40:23 2006 +0900
+++ b/test/throw.code-out	Mon Jan 16 00:52:56 2006 +0900
@@ -1,7 +1,7 @@
 main0
-96 3 66 76
-97 3 66 75
+96 3 66 -7 76
+97 3 66 -7 75
 main1
-98 3 66 77
+98 3 66 -6 77
 main2
-99 3 66 78
+99 3 66 -5 78