Mercurial > hg > CbC > old > device
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 */