changeset 719:4c5ac4025fbd

*** empty log message ***
author kono
date Wed, 28 Nov 2007 19:38:01 +0900
parents d12029c499df
children 6b7372e17970
files Changes mc-code-spu.c
diffstat 2 files changed, 99 insertions(+), 217 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Tue Nov 20 17:51:50 2007 +0900
+++ b/Changes	Wed Nov 28 19:38:01 2007 +0900
@@ -9716,4 +9716,84 @@
 #define FMINUS  (FOP+MINUS)
 
 とか、かっこわるいし。type 自体に、処理メソッドへのポインタを
-儲けるんだろうなぁ。 ちょっと修正が多いけど。少し考えてみないと。
+設けるんだろうなぁ。 ちょっと修正が多いけど。少し考えてみないと。
+
+Tue Nov 20 15:22:43 CET 2007
+
+SPUはかならず16byte でアクセスして、その後で、shuffle byte
+で処理する形らしい。なので、char でも、16byte load して、
+変更して書き込みという形になる。
+
+local 変数に関しては、16byte alignment で処理して、shuffle
+byte  を避けるので良いと思う。ただ、pack されたstruct とか
+はだめ。でも、lvar だったら、offset を見れば良い。
+
+でも、配列とかのアクセスだと、
+        lqd     $2,176($sp)
+        cbd     $3,0($sp)
+        shufb   $2,$4,$2,$3
+        stqd    $2,176($sp)
+が必須となる。まぁ、そうでしょうね。
+
+大域変数の場合も同様? 16byte alignment を仮定して良いらしい。
+
+pointer の場合はだめで、shuffle byte が必須。
+
+ptr_cache は、SPU の場合は、使わない方が良いらしい。256k
+しかメモリがないので、オフセットで足りてしまうらしい。
+16bit(64k) + 2bit alignment というわけですか。
+
+code もそれに含まれる?
+
+Sat Nov 24 11:19:15 CET 2007
+
+mc-code-spu.c をどんどん破壊しているなぁ。
+
+Sun Nov 25 12:21:26 JST 2007
+
+メモリ上に取られる局所変数は、spu ではほとんどないと思って良い。
+アドレスを取られているか、構造体か、どちらか。
+
+構造体もできるだけレジスタ上に置いた方が良い。それは、st_* で
+処理する? どういう条件で、構造体をレジスタにマップ出来るかは、
+結構、複雑らしい。
+
+かなり限定した場合だけにしてもいいんじゃないか?
+
+だとすれば、メモリ上の局所変数へのアクセスは、あまり効率
+良くなくても良いということ。だから、常にpackされていると
+仮定して良い。
+
+Sun Nov 25 21:07:43 JST 2007
+
+REGISTER.field の形式のみの時に、register にmapする?
+別にそうでなくても良いんだけど。
+
+address を取られてなければ、register にmapして良い。
+
+register 上にpackして、構造体を置く。でも、SPUの
+場合は、pack した方が良い場合と、そうでない場合を
+識別する必要がある。それは難しいだろ? (不可能じゃ
+ないだろうが...)
+
+Sun Nov 25 22:07:53 JST 2007
+
+char で16byte取るのも良いんだけど、char a[10] とかで、
+ *(a+1) = 3 とかやられると、だめ。こいつは、連続している
+必要がある。(逆に言えば、SPUでは、そんなことをしては
+いけない...)
+
+でも、毎回、shuffle byte するのは(32bit int でも、
+おこなう必要がある)ちょっと...
+
+いずれにせよ、一般的なbyte(8-32bit)アクセスを書く必要は
+ある。で、それが曖昧だからだめだめなんだよね。subroutine
+call してもいいんじゃないか?
+
+sp が16byte alignment だってのは仮定していいの? (おそらくは...)
+じゃぁ、cbd 8(sp)ってのが意味不明。
+
+Wed Nov 28 12:32:13 JST 2007
+
+おっと、ptr_cache を取るのは早すぎたが... lqa は aligned address
+しか扱わないので、汎用のshuffle byte code を使えない....
--- a/mc-code-spu.c	Tue Nov 20 17:51:50 2007 +0900
+++ b/mc-code-spu.c	Wed Nov 28 19:38:01 2007 +0900
@@ -386,13 +386,13 @@
 lvar(int l,char *cext)
 {
     if (large_lvar) {
-	printf("0(%s)\n##lvar0\n",register_name(large_lvar));
+	printf("0(%s)\n",register_name(large_lvar));
 	free_register(large_lvar);
 	return;
     }
     if (is_code(fnptr)) {
         if (l>=ARG_LVAR_OFFSET) {  /* caller's arguments */
-            printf("%d($sp)\n##lvar1\n",CODE_CALLER_ARG(l-ARG_LVAR_OFFSET));
+            printf("%d($sp)\n",CODE_CALLER_ARG(l-ARG_LVAR_OFFSET));
 	} else {
 	    printf("%d($sp)\n",CODE_LVAR(l));
 	}
@@ -976,196 +976,18 @@
     return i;
 }
 */
-#if FLOAT_CODE
-static int
-search_double_const(int tag,int value1,int value2,int *label)
-{
-    int p,i,j,list,prev;
-
-    for(j=0;j<2;j++) {
-	i = 0;
-	if(j==1) {
-	    if (!const_list_label) const_list_label = fwdlabel();
-	    *label = const_list_label;
-	    if (const_list==0) {
-		const_list = glist3(tag,glist3(tag,0,value2),value1);
-		return 0;
-	    } else {
-		prev = list = const_list;
-	    }
-	} else {
-	    prev =list = prev_const_list; *label = prev_const_list_label;
-	}
-	for(p = list; p ;prev=p,p=cadr(p),i+=SIZE_OF_INT) {
-	    if (car(p)!=tag) continue;
-	    switch(tag) {
-	    case DCONST: case LCONST:
-		if (caddr(p)!=value1) continue;
-		p = cadr(p);
-		if (!p||car(p)!=tag) error(-1);
-		if (caddr(p)!=value2) continue;
-		return i;
-	    }
-	    prev = p;
-	}
-    }
-    cadr(prev) = glist3(tag,glist3(tag,0,value2),value1);
-    if (i>CONST_TBL_COUNT) {
-	const_list_table();
-    }
-    return i;
-}
-#endif
-
-static int inst_count;
-
-static void
-const_list_table()
-{
-    int p,lb=0;
-    inst_count = 0;
-
-    if (const_list) {
-	if (control) {
-	    lb = fwdlabel();
-	    gen_jmp(lb);
-	    // printf("\t.align\t2\n");
-	}
-	fwddef(const_list_label);
-	control=0;
-	for(p = const_list; p ; p = cadr(p)) {
-	    switch(car(p)) {
-	    case GVAR:	printf("\t.word\t%s\n",(ncaddr(p))->nm); break;
-	    case DCONST: case LCONST:
-	    case CONST:	printf("\t.word\t%d\n",caddr(p)); break;
-	    case LABEL:	printf("\t.word\t.LC%d\n",caddr(p)); break;
-	    case LVAR:	printf("\t.word\t.LC%d+%d\n",
-		car(caddr(p)),cadr(caddr(p))); break;
-	    default: error(-1);
-	    }
-	}
-	if (lb) {
-	    fwddef(lb);  // control==1 now
-	}
-	prev_const_list_label=const_list_label;
-	const_list_label = 0;
-    }
-    for(p = prev_const_list; p ; p = cadr(p)) {
-	if (car(p)==LVAR) {
-	    free_glist2(caddr(p));
-	}
-    }
-    free_glist3_a(prev_const_list);
-    prev_const_list=const_list;
-    const_list = 0;
-}
-
 
 extern void
 code_ptr_cache_def(int r, NMTBL *nptr)
 {
-    char *rrn = register_name(r);
-    printf("\tlqd\t%s, %d($sp)\n",rrn,(nptr->sc)*16);
-}
-
-#define mask8(d,bit)   (d & (255 << bit))
-
-/*
-     mode   CONST or other (CMP is Ok only in stage 1 result)
-     *p1    stage 1 const
-     *p2    stage 2 const
-     *p3    stage 3 const
-     return 0 ... require 4 stage
-            1 ... positive result
-           -1 ... negative result
-
- */
-static int
-make_const(int c,int *p1,int *p2,int *p3,int mode)
-{
-    int sign,im,jm,km;
-    int min_stage = 4;
-    int msign=0,mim=0,mjm,mkm;
-    int id,jd,kd;
-    int i,j,k;
-    int d;
-    if (c == (d = mask8(c,0))) {
-	min_stage=1; min_stage=1; msign = 1;
-	    mim = d;mjm = 0;mkm = 0;
-    } else if (mode!=CONST) {
-	if (-c == (d = mask8(-c,0))) {
-	    min_stage=1; min_stage=1; msign = -1;
-		mim = d;mjm = 0;mkm = 0;
-	}
-    } else {
-	if (~c== (d = mask8(~c,0))) {
-	    min_stage=1; min_stage=1; msign = -1;
-		mim = d;mjm = 0;mkm = 0;
-	}
-    }
-    for(sign=1;sign>=-1;sign-=2) {
-	if (min_stage==1) break;
-        for(i=24;i>=0;i-=2) {
-	    jm = km = 0;
-	    if (sign>0) {
-		if (c == (d = mask8(c,i))) {
-		    min_stage=1; min_stage=1; msign = 1;
-			mim = d;mjm = 0;mkm = 0;
-		    break;
-		}
-		id = c - d;
-	    } else if (mode!=CONST) {
-		if (-c == (d = mask8(-c,i))) {
-		    min_stage=1; min_stage=1; msign = -1;
-			mim = d;mjm = 0;mkm = 0;
-		    break;
-		}
-		id = -c - d;
-	    } else {
-		if (~c== (d = mask8(~c,i))) {
-		    min_stage=1; min_stage=1; msign = -1;
-			mim = d;mjm = 0;mkm = 0;
-		    break;
-		}
-		id = ~c - d;
-	    }
-	    if (d==0) continue;
-	    im = d;
-	    if (min_stage<=2) continue;
-            for(j=i-8;j>=0;j-=2) {
-		km = 0;
-                if (!(jm=mask8(id,j))) continue;
-                jd = id - jm;
-		if (jd==0) {
-		    min_stage=2; msign = sign;
-		    mim = im;mjm = jm;mkm = km;
-		    break;
-		}
-		if (min_stage<=3) continue;
-                for(k=j-8;k>=0;k-=2) {
-                    if (!(km=mask8(jd,k))) continue;
-                    kd = jd - km;
-		    if (kd==0) { 
-			min_stage=3; msign = sign;
-			mim = im;mjm = jm;mkm = km;
-			break;
-		    }
-                }
-            }
-        }
-    }
-    if (min_stage<=3) {
-	*p1 = mim; *p2= mjm; *p3 = mkm; 
-	return msign;
-    } else return 0;
+     char *rrn = register_name(r);
+     printf("\tlqd\t%s, %d($sp)\n",rrn,(nptr->sc)*16);
 }
 
 static int
 is_stage1_const(int c,int mode)
 {
-    int sign,p1=0,p2=0,p3=0;
-    sign = make_const(c,&p1,&p2,&p3,mode);
-    return (c==0||(p1&&!p2&&!p3))?sign:0;
+    return mode?(0<=c && c<262143): (-32768<=c && c<32767);
 }
 
 extern void 
@@ -1218,34 +1040,9 @@
 	char *rn2 = register_name(r+1);
 	char *drn;
     int dreg;
-    int s,p1,p2,p3,h;
-    char *add;
     if (offset==0) {
         if(r!=reg)
             printf("\tori\t%s, %s, 0\n",crn,rrn);
-    } else if ((s=make_const(offset,&p1,&p2,&p3,0))) {
-	add = s>0?"a":"sf";
-	//printf("\t%s\t%s, %s, %d\n",add,crn,rrn,p1);
-	 if (-32768<(p1+p2+p3)&&(p1+p2+p3)<32768)
-                printf("\til\t%s,%d\n",rn2,(p1+p2+p3));
-	else if( (p1+p2+p3) > 32767 && (p1+p2+p3) < 262144) 
-		printf("\tila\t%s, %d\n",rn2,p1+p2+p3);
-	else if( (p1+p2+p3) > 262143) { 
-		printf("\tilhu\t%s, %d\n",rn2,(p1+p2+p3)/65536);
-		printf("\tiohl\t%s, %d\n",rn2,(p1+p2+p3)%65536);
-	} else {
-		h = (~(p1+p2+p3) >> 16) & 0xffff;
-                h += 1;
-                h = -h;
-                printf("\tilhu\t%s,%d\n",crn,h);
-                if(((p1+p2)&0xffff) > -262143)
-                        printf("\tiohl %s,%d\n",crn, ((p1+p2)&0xffff));
-                else
-                        printf("\tori %s,%s,%d\n",crn,crn,((p1+p2)&0xffff));
-
-	}
-	
-	printf("\t%s\t%s, %s, %s\n", add, crn, rrn ,rn2);
     } else {
 	drn = register_name(dreg = get_register());
 	printf("\ta\t%s, %s, %s\n",crn,drn,rrn);
@@ -1284,8 +1081,19 @@
 }
 
 
-#define cload(sz,sign) \
-    (sz==1?(sign?"lqd":"lqd"):sz==SIZE_OF_SHORT?(sign?"lqd":"lqd"):"lqd")
+/*
+
+store
+        lqd     $2,176($sp)
+        cbd     $3,0($sp)
+        shufb   $2,$4,$2,$3
+        stqd    $2,176($sp)
+unsigned load
+        rotqbyi $2,$2,13
+        andi    $4,$2,0x00ff
+
+ */
+
 
 
 #define cext(sign,sz,reg)
@@ -1306,21 +1114,17 @@
 void
 code_gvar(int e1,int reg) {
     use_int(reg);
-    code_add(reg,cadr(e1),get_ptr_cache(ncaddr(e1)));
     return;
 }
 
 void
 code_rgvar(int e1,int reg) {
     use_int(reg);
-    code_ld("lqd",reg,cadr(e1),get_ptr_cache(ncaddr(e1)),"");
 }
 
 void
 code_crgvar(int e1,int reg,int sign,int sz){
     use_int(reg);
-    code_ld(cload(sz,sign),reg,cadr(e1),get_ptr_cache(ncaddr(e1)),
-	cext_at(sz,sign));
     cext(sign,sz,reg);
 }
 
@@ -1445,8 +1249,6 @@
     } else {
 	drn = register_name(reg);
     }
-//        ldrb    r2, [ip, #-1]!  @ zero_extendqisi2
-//        ??????offset???????????12bit!
     code_ld(cload(sz,sign),reg,0,xreg,cext_at(sz,sign));
     code_add(reg,dir,reg);
     code_ldf(cstore(sz),drn,0,xreg,sz==SIZE_OF_SHORT?"  @ movhi":"");