# HG changeset patch # User Shinji KONO # Date 1291251875 -32400 # Node ID d5dfc30826bab57acb14e9dc2e6f99f90040ad42 # Parent d0f48d1ea798ab8391fab784efbdbdc11ae13632 fix duplicate assignment diff -r d0f48d1ea798 -r d5dfc30826ba mc-code-spu.c --- a/mc-code-spu.c Sat Nov 27 14:14:17 2010 +0900 +++ b/mc-code-spu.c Thu Dec 02 10:04:35 2010 +0900 @@ -70,6 +70,7 @@ // static void data_mode(char *name); // static void text_mode(int alignment); +static void cext(int sz, int sign, int from, int to); static void ld_indexx(int byte, int n, int xreg,int reg,int sign); static void local_table(void); static void shift(char *op, int creg,int reg); @@ -784,15 +785,9 @@ code_register_overlap(int s,int t) { switch(car(s)) { - case REGISTER: - case FREGISTER: - case DREGISTER: - case LREGISTER: + case REGISTER: case FREGISTER: case DREGISTER: case LREGISTER: switch(car(t)) { - case REGISTER: - case FREGISTER: - case DREGISTER: - case LREGISTER: + case REGISTER: case FREGISTER: case DREGISTER: case LREGISTER: return cadr(s)==cadr(t); } } @@ -832,10 +827,6 @@ void gexpr_init(void) { - while(reg_sp > 0) { - error(-1); - free_register(reg_stack[--reg_sp]); - } use_int0(); text_mode(2); gexpr_code_init(); @@ -926,63 +917,10 @@ static int prev_const_list; static int prev_const_list_label; -/* - constant table - glist3( tag, next, value ) - LVAR glist2(label,offset) - GVAR nptr - CONST value - LABEL value - nth element has offset n * SIZE_OF_INT - */ - -#define CONST_TBL_COUNT 100 -/* -static int -search_const(int tag,int value,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,0,value); - 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 GVAR: case CONST: case LABEL: - if (caddr(p)!=value) continue; - return i; - case LVAR: - if (car(caddr(p))!=car(value)) continue; - if (cadr(caddr(p))!=cadr(value)) continue; - return i; - } - } - } - cadr(prev) = glist3(tag,0,value); - if (i>CONST_TBL_COUNT) { - const_list_table(); - } - return i; -} -*/ 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); } static int @@ -1041,11 +979,14 @@ // char *rn2 = register_name(r+1); char *drn; int dreg; - if (offset==0) { + if (-32768nm); } void code_rgvar(int e1,int reg) { - use_int(reg); + code_crvar(e1,reg,0,SIZE_OF_INT); } void code_crgvar(int e1,int reg,int sign,int sz){ use_int(reg); - cext(sign,sz,reg); + printf("\tlqr\t%s,%s",register_name(reg),ncaddr(e1)->nm); + cext(sz, sign, reg, reg); } void code_register(int e2,int reg) { use_int(reg); - // reg = e2 if (reg!=e2) { printf("\tori\t%s, %s, 0\n",register_name(reg),register_name(e2)); } @@ -1173,7 +1096,7 @@ } void -cext(int sz, int sign, int from, into to) +cext(int sz, int sign, int from, int to) { if (sz==1 && !sign) { // unsigned char @@ -1215,12 +1138,8 @@ void code_fname(NMTBL *n,int reg) { - int r; use_int(reg); - r = get_ptr_cache(n); - if(r!=reg) { - printf("\tori\t%s, %s, 0\n",register_name(reg),register_name(r)); - } + printf("\tila\t%s, %s\n",register_name(reg),n->nm); return; } @@ -1274,9 +1193,9 @@ } else { drn = register_name(reg); } - code_ld(cload(sz,sign),reg,0,xreg,cext_at(sz,sign)); + code_ld(cload(sz,sign),reg,0,xreg); code_add(reg,dir,reg); - code_ldf(cstore(sz),drn,0,xreg,sz==SIZE_OF_SHORT?" @ movhi":""); + code_ld(cstore(sz),drn,0,xreg); } @@ -1302,9 +1221,9 @@ } else { xrn = register_name(reg); } - code_ld(cload(sz,sign),reg,0,xreg,cext_at(sz,sign)); + code_ld(cload(sz,sign),reg,0,xreg); code_add(nreg,dir,reg); - code_ldf(cstore(sz),nrn,0,xreg,""); + code_ldf(cstore(sz),nrn,0,xreg); free_register(nreg); } @@ -1365,8 +1284,7 @@ void code_cmp_crgvar(int e1,int reg,int sz,int label,int cond) { use_int(reg); - code_ld(cload(sz,0),reg,cadr(e1),get_ptr_cache(ncaddr(e1)), - cext_at(sz,0)); + code_ld(cload(sz,0),reg,cadr(e1),get_ptr_cache(ncaddr(e1))); cext(0,sz,r); printf("\tceqi\t%s, %s, 0\n",register_name(reg), register_name(reg)); jcond(label,cond); @@ -1389,7 +1307,7 @@ void code_cmp_rgvar(int e1,int reg,int label,int cond) { use_int(reg); - code_ld("lqd",reg,cadr(e1),get_ptr_cache(ncaddr(e1)),""); + code_ld("lqd",reg,cadr(e1),get_ptr_cache(ncaddr(e1))); code_cmp_register(reg,label,cond); } @@ -2075,7 +1993,7 @@ if (!is_int_reg(creg)) error(-1); lreg = creg; use_int(reg); - code_ld(cload(sz,sign),reg,offset,lreg,cext_at(sz,sign)); + code_ld(cload(sz,sign),reg,offset,lreg); cext(sign,sz,reg); } @@ -2088,7 +2006,7 @@ if (!is_int_reg(creg)) error(-1); xreg = creg; use_float(d,reg); - code_ldf(d?"lqd":"lqd",register_name(reg),offset,xreg,""); + code_ld("lqd",reg,offset,xreg); return d?DOUBLE:FLOAT; } #endif @@ -2154,8 +2072,7 @@ void code_assign_gvar(int e2,int creg,int byte) { use_int(creg); - code_ldf(cstore(byte),register_name(creg),cadr(e2), - get_ptr_cache(ncaddr(e2)),byte==SIZE_OF_SHORT?" @ movhi":""); + printf("\tstqr\t%s,%s\n",regsister_name(creg),ncaddr(e2)->nm); } void diff -r d0f48d1ea798 -r d5dfc30826ba mc-codegen.c --- a/mc-codegen.c Sat Nov 27 14:14:17 2010 +0900 +++ b/mc-codegen.c Thu Dec 02 10:04:35 2010 +0900 @@ -216,7 +216,7 @@ return INT; case URLVAR: if (lp64) code_crlvar(e2,USE_CREG,0,size_of_int); - code_rlvar(e2,USE_CREG); + else code_rlvar(e2,USE_CREG); return UNSIGNED; case CRLVAR: code_crlvar(e2,USE_CREG,1,1);