changeset 647:fe23fe842b82

*** empty log message ***
author kono
date Fri, 17 Nov 2006 20:00:37 +0900
parents 0d7baf338fc2
children 234bc5f79a11
files Changes mc-code-mips.c mc-code-powerpc.c mc-macro.c mc-parse.c test/code-gen.c test/ps2.c test/ps2code.c
diffstat 8 files changed, 149 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Mon Nov 06 20:15:54 2006 +0900
+++ b/Changes	Fri Nov 17 20:00:37 2006 +0900
@@ -9102,3 +9102,24 @@
 いろいろ出来るようになる。inmode=PARSE とかいうのを作るか。
 
 細かい問題があるみたいだね。
+
+Mon Nov  6 21:00:47 JST 2006
+
+asm("name")  の属性の処理をしないと。急ぐのか?
+
+asm/attribute の区別が必要。
+
+n->nm は、そここで使っているので、やっぱり、search 用の名前と
+表示用の名前と分けた方が良い。一旦、hash を引いてしまえば、
+表示用の名前の方でいいんじゃないか? orignal へのポインタは
+用意するとして。n->nm, n->name と二重にする手もあるけどね。
+そっちのが方が断然やさしいが。
+
+Fri Nov 17 19:04:49 JST 2006
+
+local variable のalignment を、mc-codegen.c の def() で
+制御する必要がある。stack のalignment 以上には制御できない
+わけだけどね。
+
+
+
--- a/mc-code-mips.c	Mon Nov 06 20:15:54 2006 +0900
+++ b/mc-code-mips.c	Fri Nov 17 20:00:37 2006 +0900
@@ -395,7 +395,7 @@
 int disp_offset = 0;
 #define disp_offset0  0
 
-#define func_disp_offset 8
+
 #define code_disp_offset0 0
 
 #define CODE_LVAR(l) ((l)+code_disp_offset0)
@@ -411,12 +411,10 @@
     // int code_f = (fnptr->sc==CODE);
 
     disp &= -SIZE_OF_INT;
-    lvar_offsetv = round16(-disp) +
-	round16((max_func_args<2?2:max_func_args)*SIZE_OF_INT) +
-	2*SIZE_OF_INT;
+    lvar_offsetv = round16(-disp+16) +
+	round16((max_func_args<2?2:max_func_args)*SIZE_OF_INT) ;
     r1_offsetv = lvar_offsetv + arg_offset + SIZE_OF_INT*2 +
 	max_reg_var*SIZE_OF_INT+max_freg_var*SIZE_OF_FLOAT+2*SIZE_OF_INT ;
-    lvar_offsetv += round16(r1_offsetv)-r1_offsetv;
     r1_offsetv = round16(r1_offsetv);
 
 #if 1
@@ -449,6 +447,12 @@
    printf("## max caller arg var=\t%d\n",CALLER_ARG(0));
    printf("##\n");
 #endif
+
+#if 1
+    printf("## $L_%d=%d\n",r1_offset_label,r1_offsetv);
+    printf("## $L_%d=%d\n",lvar_offset_label,r1_offsetv-lvar_offsetv);
+    printf("##\n");
+#endif
     fprintf(asi,"$L_%d=0x%x\n",mask_label,code_mask());
     fprintf(asi,"$L_%d=%d\n",mask_offset_label,code_mask_offset());
     fprintf(asi,"$L_%d=0x%x\n",fmask_label,code_fmask());
--- a/mc-code-powerpc.c	Mon Nov 06 20:15:54 2006 +0900
+++ b/mc-code-powerpc.c	Fri Nov 17 20:00:37 2006 +0900
@@ -328,20 +328,25 @@
 #define CALLER_ARG(l) ((l)+arg_offset1)
 #define CALLEE_ARG(l) ((l)+arg_offset)
 
+#define round16(a)    ((a+0xf)&~0xf)
+
 void
 code_offset_set()
 {
 #if 0
     int l;
 #endif
-    int lvar_offsetv = -disp+max_func_args*SIZE_OF_INT+func_disp_offset;
-    int r1_offsetv = lvar_offsetv-reg_save+12;
+    int lvar_offsetv = 
+	round16(-disp+max_func_args*SIZE_OF_INT+func_disp_offset);
+    int r1_offsetv = round16(lvar_offsetv-reg_save)+12;
+
     printf(".set L_%d,%d\n",lvar_offset_label,r1_offsetv-lvar_offsetv);
     if (r1_offsetv-lvar_offsetv > 65000) error(-1);
 	// too large function arguments?
     printf(".set L_%d,%d\n",r1_offset_label,r1_offsetv);
     if (max_func_arg_label) {
-	printf(".set L_%d,%d\n",max_func_arg_label,max_func_args*SIZE_OF_INT+24);
+	printf(".set L_%d,%d\n",max_func_arg_label,
+	    round16(max_func_args*SIZE_OF_INT)+24);
 	max_func_arg_label = 0;
     }
 
--- a/mc-macro.c	Mon Nov 06 20:15:54 2006 +0900
+++ b/mc-macro.c	Fri Nov 17 20:00:37 2006 +0900
@@ -426,6 +426,7 @@
 	    chptr = p;
 	    if (macro_processing()) return;
 	}
+	if (c==EOF) break;
     } while(!in_quote && (macro_if_skip || linebuf[0] == '#'));
 }
 
--- a/mc-parse.c	Mon Nov 06 20:15:54 2006 +0900
+++ b/mc-parse.c	Fri Nov 17 20:00:37 2006 +0900
@@ -967,7 +967,8 @@
 	    attribute = list3(IDENT,attribute,(int)nptr);
 	    getsym(0);
 	} else if (sym==STRING) {
-	    attribute = list3(STRING,attribute,(int)nptr->nm);
+	    attribute = list3(STRING,attribute,
+		list3(STRING,(int)nptr,nptr->dsp));
 	    getsym(0);
 	} else {
 	    attribute = list3(sym,attribute,symval);
--- a/test/code-gen.c	Mon Nov 06 20:15:54 2006 +0900
+++ b/test/code-gen.c	Fri Nov 17 20:00:37 2006 +0900
@@ -1,5 +1,4 @@
 /* Micro-C Code Generator Checker */
-/* $Id$ */
 
 #define FLOAT_CODE 1
 #define LONGLONG_CODE 1
--- a/test/ps2.c	Mon Nov 06 20:15:54 2006 +0900
+++ b/test/ps2.c	Fri Nov 17 20:00:37 2006 +0900
@@ -10,6 +10,9 @@
 typedef float        ps2_vu0_fmatrix[4][4] __attribute__((aligned (16)));
 typedef ps2_vu0_fmatrix FMATRIX;
 
+typedef float        ps2_vu0_fmatrix1[4][4];
+typedef ps2_vu0_fmatrix1 FMATRIX1;
+
 typedef struct objNode {
     void* object;
     void (*mtd)(struct objNode*);
@@ -59,6 +62,39 @@
 }
 
 
+#define mod16(a) (((int)(&a))%16)
+
+int
+align16(int i, FMATRIX a, FMATRIX b) {
+   FMATRIX m;
+   FMATRIX n;
+   int k = i;
+   FMATRIX o;
+   if (i==0) return i;
+#ifdef OFFSET
+   printf("offset %d\n",((char*)a) - ((char*)(&m)));
+#endif
+   printf("%d %d %d\n",mod16(m),mod16(n),mod16(o));
+   align16(i-1,m,n);
+   return k;
+}
+
+int
+align16_1(int i, FMATRIX1 a, FMATRIX1 b) {
+   FMATRIX1 m;
+   FMATRIX1 n;
+   int k = i;
+   FMATRIX1 o;
+   if (i==0) return i;
+#ifdef OFFSET
+   printf("offset %d\n",((char*)a) - ((char*)(&m)));
+#endif
+   printf("%d %d %d\n",mod16(m),mod16(n),mod16(o));
+   align16_1(i-1,m,n);
+   return k;
+}
+
+
 int
 main(int ac, char *av[])
 {
@@ -67,10 +103,10 @@
     m[1][1] = 0.5;
     ps2_vu0_unit_matrix(m);
     printf("%g\n",m[1][1]);
-
-    graphic_ObjNode_draw(&p, m);
-    printf("%g\n",m[1][1]);
-    
+    align16(2,m,m);
+    align16_1(2,m,m);
+    graphic_ObjNode_draw( &p, m);
 }
 
+
 /* end */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/ps2code.c	Fri Nov 17 20:00:37 2006 +0900
@@ -0,0 +1,68 @@
+#ifndef INLINE
+#define INLINE
+#endif
+
+int printf(const char *,...);
+void bzero(void *b, unsigned int len);
+
+
+
+typedef float        ps2_vu0_fmatrix[4][4] __attribute__((aligned (16)));
+typedef ps2_vu0_fmatrix FMATRIX;
+
+typedef float        ps2_vu0_fmatrix1[4][4];
+typedef ps2_vu0_fmatrix1 FMATRIX1;
+
+
+void  ps2_vu0_unit_matrix(ps2_vu0_fmatrix m)
+{
+    printf("%g\n",m[1][1]);
+    m[1][1] = -0.5;
+}
+
+
+#define mod16(a) (((int)(&a))%16)
+
+__code
+align16(int i, FMATRIX a, FMATRIX b) {
+   FMATRIX m;
+   FMATRIX n;
+   int k = i;
+   FMATRIX o;
+   ps2_vu0_unit_matrix(a);
+   if (i==0) goto align16_1(2,a,b);
+   printf("offset %d\n",((char*)a) - ((char*)(&m)));
+   printf("%d %d %d\n",mod16(m),mod16(n),mod16(o));
+   goto align16(i-1,m,n);
+}
+
+__code (*exit0)(int);
+void *env;
+
+__code
+align16_1(int i, FMATRIX1 a, FMATRIX1 b) {
+   FMATRIX1 m;
+   FMATRIX1 n;
+   int k = i;
+   FMATRIX1 o;
+   ps2_vu0_unit_matrix(a);
+   if (i==0) goto exit0(0),env;
+   printf("offset %d\n",((char*)a) - ((char*)(&m)));
+   printf("%d %d %d\n",mod16(m),mod16(n),mod16(o));
+   goto align16_1(i-1,m,n);
+}
+
+
+int
+main(int ac, char *av[])
+{
+    FMATRIX m;
+
+    m[1][1] = 0.5;
+    exit0 = return;
+    env = environment;
+    goto align16(2,m,m);
+}
+
+
+/* end */