changeset 93:8f5d61239b93

*** empty log message ***
author kono
date Sun, 09 Mar 2003 18:31:00 +0900
parents e7f8515ba882
children 1ad7045741a7
files Changes Makefile mc-code-ia32.c mc-code-powerpc.c mc-code.h
diffstat 5 files changed, 135 insertions(+), 112 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Fri Mar 07 06:10:41 2003 +0900
+++ b/Changes	Sun Mar 09 18:31:00 2003 +0900
@@ -2016,3 +2016,53 @@
 
 label があると、code_base cache はclearしないといけない。
 それを判断するには fwddef をhookする必要があるけど。
+
+Fri Mar  7 09:17:10 JST 2003
+
+問題は、
+       register allocation
+と
+       function call/goto call
+の構成だな。goto の方は machine dependentなところは
+ほとんどない。register のsaveさえ必要ないから。
+
+register allocation だけど。
+     r0
+     r1      frame pointer (or stack pointer )
+     r30     jj
+     r31     relocation register
+     r0,r1,r2    システムで使う
+     r0-r10  引数
+             引数でないところは優先的に使う
+     r20-r29 セーブして使う領域
+
+r10-r19 はどうなんだろう? セーブしないのか?
+
+ia32 の方でもfppのスタックを関数呼び出しのときに吐き出した方が
+良い。
+
+r0 r1 r2 r3 r4 r5 r6 r7 r8 r9
+r10 r11 r12 r13 r14 r15 r16
+r28 r29 r30 r31
+
+なので、もののみごとに、17-27 までが使われてないね。
+
+ということは、関す呼出し時には、保存されるレジスタはないと
+思った方が良いってこと? あるいは、r17-r28 は保存されると
+思って良いのかな。
+
+Sat Mar  8 19:28:42 JST 2003
+
+関数呼び出し時のレジスタセーブを避けるためには、関数呼び出し
+を優先して実行してやれば良い。関数呼び出しの結果は局所変数に
+セーブする。
+     f(g(h(a)+1)+2)
+は、
+    a1=h(a)
+    a2=g(a1+1)
+    f(a1+2)
+となる。そうすれば、関数呼び出しのときのスタックはかならず0になる。
+
+でも、結局、引数は関数呼び出しの前にセーブするのね。だったら、
+そんなことしないで、セーブすれば良いのか。
+
--- a/Makefile	Fri Mar 07 06:10:41 2003 +0900
+++ b/Makefile	Sun Mar 09 18:31:00 2003 +0900
@@ -8,10 +8,13 @@
 CONVERTER=conv/c.o conv/null.o
 # conv/c2cbc.o conv/cbc2c.o
 
+# CODE=mc-code-ia32.o
+CODE=mc-code-powerpc.o
+
 all: mc 
 
-mc : mc-parse.o mc-codegen.o mc-code-ia32.o mc-tree.o $(CONVERTER)
-	$(CC) -g mc-parse.o mc-codegen.o mc-code-ia32.o \
+mc : mc-parse.o mc-codegen.o $(CODE) mc-tree.o $(CONVERTER)
+	$(CC) -g mc-parse.o mc-codegen.o $(CODE) \
 		mc-tree.o $(CONVERTER) -o $@
 
 conv/conv.h: conv_func.tbl conv_func.pl
@@ -29,7 +32,8 @@
 	makedepend mc-code-ia32.c mc-code.h mc-codegen.c mc-codegen.h \
 		mc-parse.c mc-tree.c mc.h \
 	    conv/c.c conv/c.h conv/c2cbc.c conv/c2cbc.h conv/cbc2c.c \
-	    conv/cbc2c.h conv/conv.h conv/convdef.h conv/null.c conv/null.h
+	    conv/cbc2c.h conv/conv.h conv/convdef.h conv/null.c conv/null.h \
+                mc-code-powerpc.c
 
 clean :
 	-rm -f *.bak *.s *.o *.cc mc mc1 a.out *~ core* */*.o *.bak test/*.s test/*.cc test/*.o test/*.bak test/*~ conv/*.s conv/*.cc conv/*.o conv/*.bak conv/*~
@@ -56,52 +60,57 @@
 mc-code-ia32.o: /usr/include/machine/types.h /usr/include/ppc/types.h
 mc-code-ia32.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h
 mc-code-ia32.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h
-mc-code-ia32.o: conv/conv.h conv/c.h mc-codegen.h
+mc-code-ia32.o: conv/conv.h mc-codegen.h
 mc-codegen.o: mc.h /usr/include/stdio.h /usr/include/sys/types.h
 mc-codegen.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h
 mc-codegen.o: /usr/include/machine/types.h /usr/include/ppc/types.h
 mc-codegen.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h
 mc-codegen.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h
-mc-codegen.o: conv/conv.h conv/c.h mc-codegen.h mc-code.h
+mc-codegen.o: conv/conv.h mc-codegen.h mc-code.h
 mc-parse.o: mc.h /usr/include/stdio.h /usr/include/sys/types.h
 mc-parse.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h
 mc-parse.o: /usr/include/machine/types.h /usr/include/ppc/types.h
 mc-parse.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h
 mc-parse.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h
-mc-parse.o: conv/conv.h conv/c.h mc-codegen.h
+mc-parse.o: conv/conv.h mc-codegen.h
 mc-tree.o: mc.h /usr/include/stdio.h /usr/include/sys/types.h
 mc-tree.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h
 mc-tree.o: /usr/include/machine/types.h /usr/include/ppc/types.h
 mc-tree.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h
 mc-tree.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h
-mc-tree.o: conv/conv.h conv/c.h
+mc-tree.o: conv/conv.h
 mc.o: /usr/include/stdio.h /usr/include/sys/types.h
 mc.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h
 mc.o: /usr/include/machine/types.h /usr/include/ppc/types.h
 mc.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h
 mc.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h conv/conv.h
-mc.o: conv/c.h
 conv/c.o: mc.h /usr/include/stdio.h /usr/include/sys/types.h
 conv/c.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h
 conv/c.o: /usr/include/machine/types.h /usr/include/ppc/types.h
 conv/c.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h
 conv/c.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h conv/conv.h
-conv/c.o: conv/c.h conv/convdef.h
+conv/c.o: conv/convdef.h conv/c.h
 conv/c2cbc.o: mc.h /usr/include/stdio.h /usr/include/sys/types.h
 conv/c2cbc.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h
 conv/c2cbc.o: /usr/include/machine/types.h /usr/include/ppc/types.h
 conv/c2cbc.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h
 conv/c2cbc.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h
-conv/c2cbc.o: conv/conv.h conv/c.h
+conv/c2cbc.o: conv/conv.h
 conv/cbc2c.o: mc.h /usr/include/stdio.h /usr/include/sys/types.h
 conv/cbc2c.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h
 conv/cbc2c.o: /usr/include/machine/types.h /usr/include/ppc/types.h
 conv/cbc2c.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h
 conv/cbc2c.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h
-conv/cbc2c.o: conv/conv.h conv/c.h
+conv/cbc2c.o: conv/conv.h
 conv/null.o: mc.h /usr/include/stdio.h /usr/include/sys/types.h
 conv/null.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h
 conv/null.o: /usr/include/machine/types.h /usr/include/ppc/types.h
 conv/null.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h
 conv/null.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h
-conv/null.o: conv/conv.h conv/c.h
+conv/null.o: conv/conv.h conv/convdef.h conv/null.h
+mc-code-powerpc.o: mc.h /usr/include/stdio.h /usr/include/sys/types.h
+mc-code-powerpc.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h
+mc-code-powerpc.o: /usr/include/machine/types.h /usr/include/ppc/types.h
+mc-code-powerpc.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h
+mc-code-powerpc.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h
+mc-code-powerpc.o: conv/conv.h mc-codegen.h
--- a/mc-code-ia32.c	Fri Mar 07 06:10:41 2003 +0900
+++ b/mc-code-ia32.c	Sun Mar 09 18:31:00 2003 +0900
@@ -4,6 +4,7 @@
 #define EXTERN extern
 #include "mc.h"
 #include "mc-codegen.h"
+#include "mc-code.h"
 
 #define TEXT_EMIT_MODE 0
 #define DATA_EMIT_MODE 1
@@ -67,43 +68,18 @@
 static char *reg_name_l[4];
 static char *reg_name_w[4];
 
-void use_register(int virt, int real, int move);
-void code_preinc(int e1,int e2) ;
-void code_cmp_register(int e2) ;
-void code_assign_gvar(int e2,int byte) ;
-void tosop(int op,int oreg);
-void edx_cleanup();
-void shift(char *op, int reg);
-void ld_indexx(int byte, int n, int xreg);
-void jmp(int l);
-void local_table(void);
-void text_mode(void);
-void data_mode(char *name);
-
-char *register_name(int i,int byte);
-int register_var(int r);
-int get_register_var(void);
-void emit_push(void);
-int emit_pop(int type);
-void code_crlvar(int e2);
-void code_preinc(int e1,int e2);
-void code_postinc(int e1,int e2);
-void code_bool(int e1);
-void string(int e1);
-void emit_copy(int from,int  to,int length,int offset,int value,int det);
-int struct_push(int e4,int t);
-void function(int e1);
-void code_assop(int op,int byte);
-int edx_setup();
-void code_opening(char *filename);
-void code_closing();
-void code_leave(char *name);
-int lvar(int l);
-void global_table(void);
-int virtual(int real);
-char * fload(int d);
-int code_d1(double d);
-int code_d2(double d);
+static void use_register(int virt, int real, int move);
+static void use_register_var(int i);
+static int virtual(int real);
+static void shift(char *op, int reg);
+static void ld_indexx(int byte, int n, int xreg);
+static void data_mode(char *name);
+static int edx_setup();
+static void edx_cleanup();
+static void local_table(void);
+static char * fload(int d);
+static int code_d1(double d);
+static int code_d2(double d);
 
 void
 code_init(void)
--- a/mc-code-powerpc.c	Fri Mar 07 06:10:41 2003 +0900
+++ b/mc-code-powerpc.c	Sun Mar 09 18:31:00 2003 +0900
@@ -3,12 +3,21 @@
 
 #define EXTERN extern
 #include "mc.h"
+#include "mc-code.h"
 #include "mc-codegen.h"
 
 #define TEXT_EMIT_MODE 0
 #define DATA_EMIT_MODE 1
 #define RODATA_EMIT_MODE 2
 
+static void data_mode(char *name);
+static void init_ptr_cache();
+static void ld_indexx(int byte, int n, int xreg);
+static void local_table(void);
+static void shift(char *op, int reg);
+static void use_register(int virt, int real, int move);
+static void use_register_var(int i);
+
 static int output_mode = TEXT_EMIT_MODE;
 static int data_alignment = 0;
 
@@ -80,46 +89,6 @@
     "cr0","cr1","cr2","cr3","cr4","cr5","cr6","cr7"
 }; 
 
-void use_register(int virt, int real, int move);
-void code_preinc(int e1,int e2) ;
-void code_cmp_register(int e2) ;
-void code_assign_gvar(int e2,int byte) ;
-void tosop(int op,int oreg);
-void edx_cleanup();
-void shift(char *op, int reg);
-void ld_indexx(int byte, int n, int xreg);
-void jmp(int l);
-void local_table(void);
-void text_mode(void);
-void data_mode(char *name);
-int    init_ptr_cache();
-
-char *register_name(int i,int byte);
-int register_var(int r);
-int get_register_var(void);
-void emit_push(void);
-int emit_pop(int type);
-void code_crlvar(int e2);
-void code_preinc(int e1,int e2);
-void code_postinc(int e1,int e2);
-void code_bool(int e1);
-void string(int e1);
-void emit_copy(int from,int  to,int length,int offset,int value,int det);
-int struct_push(int e4,int t);
-void function(int e1);
-void code_assop(int op,int byte);
-int edx_setup();
-void code_opening(char *filename);
-void code_closing();
-void code_leave(char *name);
-int lvar(int l);
-void global_table(void);
-
-char * fstore(int d);
-char * fload(int d);
-int code_d1(double d);
-int code_d2(double d);
-
 void
 code_init(void)
 {
@@ -156,6 +125,27 @@
     return -1;    /* 空いている場所がないなら、それを表す -1 を返す */
 }
 
+int
+pop_register(void)
+{     /* レジスタから値を取り出す */
+    return reg_stack[--reg_sp];
+}
+
+int
+stack_used(void) {
+    return reg_stack[--reg_sp]<0;
+}
+
+void
+emit_pop_free(int xreg)
+{
+    if (xreg==dreg) {
+        regv[dreg]=0;
+    } else if (xreg!=-1) {
+        free_register(xreg);
+    }
+}
+
 void 
 free_register(int i) {    /* いらなくなったレジスタを開放 */
     regv[i]=regs[i]=0;
@@ -229,7 +219,7 @@
     int i;
     if (chk) return;
     printf("# %d: %s:",lineno,s);
-    printf(" creg=%s dreg=%s ",register_name(creg,0),register_name(dreg,0));
+    printf(" creg=%s dreg=%s ",register_name(creg),register_name(dreg));
     for(i=0;i<MAX_REGISTER;i++) {
 	printf("%d",regs[i]);
     }
@@ -238,7 +228,7 @@
 	printf("%d",regv[i]);
     }
 #if 0
-    printf(" regs_stack",register_name(creg,0),register_name(dreg,0));
+    printf(" regs_stack",register_name(creg),register_name(dreg));
     for(i=reg_sp;i>=0;i--) {
 	if(reg_stack[i]>=0)
 	    printf(" %s",register_name(reg_stack[i],0));
@@ -280,11 +270,11 @@
 {
     int i;
     for(i=0;i<MAX_REGISTGER_VAR;i++) {
-	if (REG_VAR_Base-i<=REG_ARG_MAX)
+	if (REG_VAR_BASE-i<=REG_ARG_MAX)
 	    return -1;
-        if (! regs[REG_VAR_Base-i]) {    /* 使われていないなら */
-            regs[REG_VAR_Base-i]=1;      /* そのレジスタを使うことを宣言し */
-            regv[REG_VAR_Base-i]=0;
+        if (! regs[REG_VAR_BASE-i]) {    /* 使われていないなら */
+            regs[REG_VAR_BASE-i]=1;      /* そのレジスタを使うことを宣言し */
+            regv[REG_VAR_BASE-i]=0;
             return i;                    /* その場所を表す番号を返す */
         }
     }
@@ -310,15 +300,15 @@
 }
 
 int
-emit_pop()
+emit_pop(int type)
 {
     int xreg;
     if ((xreg=pop_register())==-1) {
 	xreg=get_register();
 	if(!xreg) error(-1);
-	printf("\tlwz %s,(%s)\n",register_name(xreg),register_name(reg_sp);
+	printf("\tlwz %s,(%s)\n",register_name(xreg),register_name(reg_sp));
 	printf("\taddis %s,%s,%d\n",
-                 register_name(reg_sp),register_name(reg_sp),size_of_int;
+                 register_name(reg_sp),register_name(reg_sp),size_of_int);
 	regv[xreg]=1;
     } 
     return xreg;
@@ -330,7 +320,7 @@
 
 int ptr_cache=0;
 
-int
+void
 init_ptr_cache()
 {
     int i;
@@ -372,7 +362,7 @@
     cadr(p) = ptr_cache;   /* connect current queue to the last one */
     ptr_cache = p;         /* now the last one is the top */
     if (!caddr(p)) {
-	if((r=get_register())) {
+	if((r=get_register())) 
 	    caddr(p)=r;
 	else
 	    r=creg;
@@ -464,7 +454,7 @@
 
 void
 code_neg() {
-    printf("\tneg %s,%s\n", register_name(creg), register_name(creg);
+    printf("\tneg %s,%s\n", register_name(creg), register_name(creg));
 }
 
 
@@ -865,8 +855,8 @@
 	    printf("\tstwu %s,%d(%s)\n",drn,-size_of_int,srn);
 	}
     }
-    printf("\taddis %s,%s,ha16(%d)\n",srn,,srn,length);
-    printf("\taddi %s,%s,lo16(%d)\n",srn,,srn,length);
+    printf("\taddis %s,%s,ha16(%d)\n",srn,srn,length);
+    printf("\taddi %s,%s,lo16(%d)\n",srn,srn,length);
     /* downward direction copy */
     printf("\tmr %s,%s\n",drn,srn);
     emit_copy(creg,dreg,length,0,0,1);
@@ -955,7 +945,7 @@
 
 void
 code_frame_pointer(int e3) {
-    printf("\tmovl %s,r1\n",register_name(e3,0));
+    printf("\tmovl %s,r1\n",register_name(e3));
 }
 
 
@@ -964,7 +954,6 @@
     printf("\tla r1,%d(r1)\n",disp_offset);
 }
 
-
 void
 code_jmp(char *s) {
     printf("\tb L_%s$stub\n",s);
@@ -1058,9 +1047,9 @@
     char *xrn,*crn,*drn;
     int xreg;
     int edx = get_register(); if(!edx) error(-1);
-    xrn = register_name(xreg = emit_pop(0),0);       /* pop e3 value */
+    xrn = register_name(xreg = emit_pop(0));       /* pop e3 value */
     regv[xreg]=regs[xreg]=1;
-    printf("\tmovl %s,%s  # assop \n",register_name(creg),register_name(edx,0));
+    printf("\tmovl %s,%s  # assop \n",register_name(creg),register_name(edx));
     regv[edx]=1;
     ld_indexx(byte,0,edx);
     tosop(op,xreg);
@@ -1094,7 +1083,7 @@
 	shift("sraw",oreg);
 	return;
     }
-    orn = register_name(oreg,0);
+    orn = register_name(oreg);
     crn = register_name(creg);
     switch(op) {
     case ADD:
@@ -1148,8 +1137,8 @@
 void
 shift(char *op, int reg)
 {
-    char *crn = register_name(creg));
-    char *rrn = register_name(reg));
+    char *crn = register_name(creg);
+    char *rrn = register_name(reg);
     printf("\t%s %s,%s,%s\n",op,crn,rrn,crn);
 }
 
@@ -1563,7 +1552,7 @@
 { 
     char *frn = register_name(freg);
     disp-=size_of_double;
-    printf("\tfctiwz  %s,%s\n",);
+    printf("\tfctiwz  %s,%s\n",frn,frn);
     printf("\tstfd  %s,%d(r1)\n",disp);
     printf("\tlwz  %s,%d(r1)\n",crn,disp+size_of_double-size_of_int);
     fregs[freg]=0;
--- a/mc-code.h	Fri Mar 07 06:10:41 2003 +0900
+++ b/mc-code.h	Sun Mar 09 18:31:00 2003 +0900
@@ -108,7 +108,6 @@
 
 extern int get_register(void);
 extern void free_register(int i) ;
-extern int virtual(int real);
 extern int pop_register(void);
 extern void emit_pop_free(int xreg);