Mercurial > hg > CbC > old > device
changeset 207:8a3516f6eb66
*** empty log message ***
author | kono |
---|---|
date | Wed, 21 Apr 2004 14:26:47 +0900 |
parents | 4170cefb48f6 |
children | 70b1da1864f6 |
files | .gdbinit Changes mc-code-powerpc.c mc.h |
diffstat | 4 files changed, 209 insertions(+), 161 deletions(-) [+] |
line wrap: on
line diff
--- a/.gdbinit Thu Apr 15 07:25:38 2004 +0900 +++ b/.gdbinit Wed Apr 21 14:26:47 2004 +0900 @@ -1,6 +1,6 @@ tb main -# run -s -ob00.s mc-parse.c -run -s -Itest/ test/code-gen-all.c +run -s -ob00.s mc-parse.c +# run -s -Itest/ test/code-gen-all.c define regs printf "pc =%08x lr =%08x r0 =%08x r1 =%08x r3= %08x r4= %08x\n",$pc,$lr,$r0,$r1,$r3,$r4 printf "r10=%08x r11=%08x r12=%08x r13=%08x r14=%08x r15=%08x\n",$r10,$r11,$r12,$r13,$r14,$r15
--- a/Changes Thu Apr 15 07:25:38 2004 +0900 +++ b/Changes Wed Apr 21 14:26:47 2004 +0900 @@ -3929,3 +3929,9 @@ use_int とかで lreg は解放して良いんじゃない? creg =0 で free_register(creg) が呼ばれているね。困ったな。 + +Sat Apr 17 17:01:02 JST 2004 + +long long register で、regsと regv をそろえる +必要はない。regs は普通に用意して、regv ではなくて、 +lreg_hとlreg_lみたいな感じにする。
--- a/mc-code-powerpc.c Thu Apr 15 07:25:38 2004 +0900 +++ b/mc-code-powerpc.c Wed Apr 21 14:26:47 2004 +0900 @@ -67,19 +67,20 @@ #define MIN_TMP_FREG 1 #define MAX_TMP_FREG 14 -#define RET_REGISTER regv[3] -#define RET_FREGISTER regv[(1+FREG_OFFSET)] -#define RET_LREGISTER_L 4 /* low word */ -#define RET_LREGISTER_H 3 /* high word */ -static int lreg_ret; -#define RET_LREGISTER lreg_ret - int MAX_REGISTER=30; /* PowerPCのレジスタを10個まで使う*/ int MAX_FREGISTER=31; #define REAL_MAX_REGISTER 32 /* PowerPCのレジスタが32ということ*/ #define REAL_MAX_FREGISTER 32 /* PowerPCのレジスタが32ということ*/ +#define REAL_MAX_LREGISTER 16 #define FREG_OFFSET REAL_MAX_REGISTER +#define LREG_OFFSET (REAL_MAX_REGISTER+REAL_MAX_FREGISTER) + +#define RET_REGISTER 3 +#define RET_FREGISTER (1+FREG_OFFSET) +#define RET_LREGISTER_L 4 /* low word */ +#define RET_LREGISTER_H 3 /* high word */ +#define RET_LREGISTER LREG_OFFSET int MAX_INPUT_REGISTER_VAR = 11-MIN_TMP_REG; int MAX_CODE_INPUT_REGISTER_VAR = 11-MIN_TMP_REG; @@ -88,13 +89,18 @@ int MAX_CODE_INPUT_DREGISTER_VAR = 14-MIN_TMP_FREG; int MAX_CODE_INPUT_FREGISTER_VAR = 14-MIN_TMP_FREG; -static int powerpc_regs[REAL_MAX_REGISTER+REAL_MAX_FREGISTER]; -static int regv[REAL_MAX_REGISTER+REAL_MAX_FREGISTER]; +static int powerpc_regs[REAL_MAX_REGISTER+REAL_MAX_FREGISTER+ + REAL_MAX_LREGISTER]; +static int regv_h0[REAL_MAX_LREGISTER]; +static int regv_l0[REAL_MAX_LREGISTER]; +#define regv_h(i) regv_h0[i-LREG_OFFSET] +#define regv_l(i) regv_l0[i-LREG_OFFSET] static int *regs = powerpc_regs; -#define CREG_REGISTER regv[MAX_TMP_REG] -#define FREG_FREGISTER regv[MAX_TMP_FREG+FREG_OFFSET] +#define CREG_REGISTER (MAX_TMP_REG) +#define FREG_FREGISTER (MAX_TMP_FREG+FREG_OFFSET) +#define LREG_LREGISTER (MAX_TMP_REG+LREG_OFFSET) static int max_reg_var, max_freg_var; @@ -110,50 +116,54 @@ "f30","f31" }; -#define register_name(i) reg_name[cadr(i)] -#define fregister_name(i) reg_name[cadr(i)] -#define lregister_name_low(i) reg_name[cadr(i)] -#define lregister_name_high(i) reg_name[caddr(i)] - -#define is_int_reg_0(i) (0<=i&&i<REAL_MAX_REGISTER) -#define is_float_reg_0(i) (REAL_MAX_REGISTER<=i&&i<REAL_MAX_FREGISTER+REAL_MAX_REGISTER) - -#define is_int_reg(i) (car(i)==REGISTER) -#define is_float_reg(i) (car(i)==DREGISTER) -#define is_longlong_reg(i) (car(i)==LREGISTER) +#define register_name(i) reg_name[i] +#define fregister_name(i) reg_name[i] +#define lregister_name_low(i) reg_name[regv_l(i)] +#define lregister_name_high(i) reg_name[regv_l(i)] + +#define is_int_reg(i) (0<=i&&i<REAL_MAX_REGISTER) +#define is_float_reg(i) (REAL_MAX_REGISTER<=i&&i<REAL_MAX_FREGISTER+REAL_MAX_REGISTER) +#define is_longlong_reg(i) (LREG_OFFSET<=i&&i<LREG_OFFSET+REAL_MAX_LREGISTER) int use_int(int i) { - if (lreg) { - free_register(lreg); lreg = 0; - } if (!is_int_reg(i)) { + if (lreg) { free_register(lreg); lreg = 0; } if (!ireg) ireg = get_register(); i = ireg; } + if (!regs[i]) regs[i]=USING_REG; return i; } int use_float(int i) { - if (!is_float_reg(i)) i = freg; - if (!regs[cadr(i)]) regs[cadr(i)]=1; + if (!is_float_reg(i)) { + if (lreg) { free_register(lreg); lreg = 0; } + if (!freg) freg = get_dregister(0); + i = freg; + } + if (!regs[i]) regs[i]=USING_REG; return i; } int use_double(int i) { - if (!is_float_reg(i)) i = freg; - if (!regs[cadr(i)]) regs[cadr(i)]=1; + if (!is_float_reg(i)) { + if (lreg) { free_register(lreg); lreg = 0; } + if (!freg) freg = get_dregister(1); + i = freg; + } + if (!regs[i]) regs[i]=USING_REG; return i; } int use_longlong(int i) { - if (ireg) { - free_register(ireg); ireg = 0; - } if (!is_longlong_reg(i)) { if (!lreg) lreg = get_lregister(); i = lreg; } + if (!regs[i]) regs[i]=USING_REG; + if (!regs[regv_l(i)]) regs[regv_l(i)]=USING_REG; + if (!regs[regv_h(i)]) regs[regv_h(i)]=USING_REG; return i; } @@ -177,7 +187,7 @@ static void code_save_stacks(); static void code_save_input_registers(); static void clear_ptr_cache_reg(int r); -static void set_creg(int,int); +static void set_ireg(int,int); static void set_freg(int,int); static void set_lreg(int,int); @@ -336,15 +346,13 @@ void code_init(void) { - int i; macro_define("__ppc__ 1\n"); macro_define("__BIG_ENDIAN__ 1\n"); // macro_define("_BSD_CT_RUNE_T_ int\n"); macro_define("__STDC__ 1\n"); init_ptr_cache(); - lreg_ret = glist3(LREGISTER, RET_LREGISTER_L,RET_LREGISTER_H); - for(i=0;i<MAX_REGISTER;i++) { regv[i]=glist2(REGISTER,i); } - for(i=0;i<MAX_FREGISTER;i++) { regv[i+FREG_OFFSET]=glist2(DREGISTER,i+FREG_OFFSET); } + regv_l(RET_LREGISTER) = RET_LREGISTER_L; + regv_h(RET_LREGISTER) = RET_LREGISTER_H; } void @@ -372,7 +380,7 @@ void code_gexpr(int e){ - if (is_int_reg(creg) && creg!=ireg) error(-1); +// if (is_int_reg(creg) && creg!=ireg) error(-1); } @@ -385,6 +393,7 @@ int freg_var = 0; int type; int reg; + int i; int is_code0 = is_code(fnptr); while (args) { @@ -394,33 +403,34 @@ if (scalar(type)) { if ((reg = get_input_register_var(reg_var,n,is_code0))) { n->sc = REGISTER; - n->dsp = reg; - regs[cadr(n->dsp)]= INPUT_REG; + n->dsp = cadr(reg); + regs[n->dsp]= INPUT_REG; reg_var++; cadddr(args)=size_of_int; } } else if (type==FLOAT) { if ((reg = get_input_dregister_var(freg_var,n,is_code0,0))) { n->sc = DREGISTER; - n->dsp = reg; - regs[cadr(n->dsp)]= INPUT_REG; + n->dsp = cadr(reg); + regs[n->dsp]= INPUT_REG; freg_var++; cadddr(args)=size(type); } } else if (type==DOUBLE) { if ((reg = get_input_dregister_var(freg_var,n,is_code0,1))) { n->sc = DREGISTER; - n->dsp = reg; - regs[cadr(n->dsp)]= INPUT_REG; + n->dsp = cadr(reg); + regs[n->dsp]= INPUT_REG; freg_var++; cadddr(args)=size(type); } } else if (type==LONGLONG||type==ULONGLONG) { if ((reg = get_input_lregister_var(reg_var,n,is_code0))) { n->sc = LREGISTER; - n->dsp = reg; - regs[cadr(n->dsp)]= INPUT_REG; - regs[caddr(n->dsp)]= INPUT_REG; + n->dsp = cadr(reg); + regs[i=n->dsp]= INPUT_REG; + regs[regv_l(i)]= INPUT_REG; + regs[regv_h(i)]= INPUT_REG; reg_var+=2; cadddr(args)=size(type); } @@ -438,7 +448,7 @@ for(i=MAX_TMP_REG;i>MIN_TMP_REG;i--) { if (regs[i]) continue; /* 使われている */ regs[i]=USING_REG; /* そのレジスタを使うことを宣言し */ - return regv[i]; /* その場所を表す番号を返す */ + return i; /* その場所を表す番号を返す */ } /* PTR_CACHE をつぶす */ for(i=MAX_TMP_REG;i>MIN_TMP_REG;i--) { @@ -447,7 +457,7 @@ } else continue; regs[i]=USING_REG; /* そのレジスタを使うことを宣言し */ - return regv[i]; /* その場所を表す番号を返す */ + return i; /* その場所を表す番号を返す */ } /* search register stack */ for(i=0;i<reg_sp;i++) { @@ -475,7 +485,7 @@ if (! regs[reg]) { /* 使われていないなら */ regs[reg]=USING_REG; /* そのレジスタを使うことを宣言し */ if (i>max_reg_var) max_reg_var=i; - return regv[reg]; /* その場所を表す番号を返す */ + return reg; /* その場所を表す番号を返す */ } } /* 空いている場所がないなら、エラー (いったい誰が使ってるの?) */ @@ -496,7 +506,7 @@ for(i=MAX_TMP_FREG+FREG_OFFSET;i>MIN_TMP_FREG+FREG_OFFSET;i--) { if (regs[i]) continue; /* 使われている */ regs[i]=USING_REG; /* そのレジスタを使うことを宣言し */ - return regv[i]; /* その場所を表す番号を返す */ + return i; /* その場所を表す番号を返す */ } /* search register stack */ for(i=0;i<freg_sp;i++) { @@ -512,7 +522,7 @@ if (! regs[reg]) { /* 使われていないなら */ regs[reg]=USING_REG; /* そのレジスタを使うことを宣言し */ if (i>max_freg_var) max_freg_var=i; - return regv[reg]; /* その場所を表す番号を返す */ + return reg; /* その場所を表す番号を返す */ } } /* 空いている場所がないなら、エラー (いったい誰が使ってるの?) */ @@ -527,40 +537,69 @@ #endif int +get_lregister0() +{ + int i; + for(i=LREG_OFFSET+1;i<REAL_MAX_LREGISTER+LREG_OFFSET;i++) { + if (regs[i]==0) { + return i; + } + } + return -1; +} + +int get_lregister() { - int h,l,h0,l0; - h = get_register(); h0 = cadr(h); - l = get_register(); l0 = cadr(l); - return glist3(LREGISTER,l0,h0); + int h,l,i; + i = get_lregister0(); + if (i==-1) return -1; + if (regs[i]==0) { + h = get_register(); + if (h==-1) return -1; + regv_h(i) = h; + l = get_register(); + if (l==-1) { free_register(h); return -1; } + regv_l(i) = l; + regs[i]=USING_REG; + return i; + } + return -1; } int get_lregister_var(NMTBL *n) { - int i,j; + int i,j,ll; int max_reg_var_save=max_reg_var; - for(i=0;i<REG_VAR_BASE-REG_VAR_MIN;i++) { - if (! regs[REG_VAR_BASE-i]) { /* 使われていないなら */ - /* そのレジスタを使うことを宣言し */ - regs[REG_VAR_BASE-i]=USING_REG; - if (i>max_reg_var) max_reg_var=i; - for(j=0;j<REG_VAR_BASE-REG_VAR_MIN;j++) { - if (! regs[REG_VAR_BASE-j]) { /* 使われていないなら */ - /* そのレジスタを使うことを宣言し */ - regs[REG_VAR_BASE-j]=USING_REG; - if (j>max_reg_var) max_reg_var=j; - /* その場所を表す番号を返す */ - return list3(LREGISTER, - glist3(LREGISTER,REG_VAR_BASE-j,REG_VAR_BASE-i), - (int)n); + ll = get_lregister0(); + if (ll==-1) return -1; + if (regs[ll]==0) { + for(i=0;i<REG_VAR_BASE-REG_VAR_MIN;i++) { + if (! regs[REG_VAR_BASE-i]) { /* 使われていないなら */ + /* そのレジスタを使うことを宣言し */ + regs[REG_VAR_BASE-i]=USING_REG; + if (i>max_reg_var) max_reg_var=i; + for(j=0;j<REG_VAR_BASE-REG_VAR_MIN;j++) { + if (! regs[REG_VAR_BASE-j]) { + /* 使われていないなら */ + /* そのレジスタを使うことを宣言し */ + regs[REG_VAR_BASE-j]=USING_REG; + if (j>max_reg_var) max_reg_var=j; + /* その場所を表す番号を返す */ + regv_l(ll) = REG_VAR_BASE-j; + regv_h(ll) = REG_VAR_BASE-i; + return list3(LREGISTER,ll,(int)n); + } } + /* ひとつしかなかった */ + regs[REG_VAR_BASE-i]=0; + max_reg_var=max_reg_var_save; + goto not_found; } - /* ひとつしかなかった */ - regs[REG_VAR_BASE-i]=0; - max_reg_var=max_reg_var_save; } } +not_found: return list2(LVAR,new_lvar(size_of_longlong)); } @@ -573,12 +612,10 @@ void free_register(int i) { /* いらなくなったレジスタを開放 */ - int j; - if (i==0) return; - j = cadr(i); regs[j]=0; - if (car(i)==LREGISTER) { - j = caddr(i); regs[j]=0; - free_glist3(i); + regs[i]=0; + if (is_longlong_reg(i)) { + regs[regv_l(i)]=0; + regs[regv_h(i)]=0; } } @@ -592,20 +629,26 @@ if (i<0||i>=MAX_INPUT_DREGISTER_VAR) return 0; i = i+MIN_TMP_FREG+FREG_OFFSET; } - return list3(DREGISTER,regv[i],(int)n); + return list3(DREGISTER,i,(int)n); } int get_input_lregister_var(int i,NMTBL *n,int is_code) { - if (is_code) { - if(!(i+1<REG_VAR_BASE-REG_VAR_MIN)) return 0; - i = REG_VAR_BASE-i; - } else { - if (i<0||i+1>=MAX_INPUT_REGISTER_VAR) return 0; - i = i+MIN_TMP_REG; - } - return list3(LREGISTER,list3(LREGISTER,i+1,i),(int)n); + int ll; + ll = get_lregister0(); + if (i!=-1) { + if (is_code) { + if(!(i+1<REG_VAR_BASE-REG_VAR_MIN)) return 0; + i = REG_VAR_BASE-i; + } else { + if (i<0||i+1>=MAX_INPUT_REGISTER_VAR) return 0; + i = i+MIN_TMP_REG; + } + regv_l(ll)=i; + regv_h(ll)=i+1; + } else { error(-1); ll=LREG_OFFSET+2; } + return list3(LREGISTER,ll,(int)n); } int @@ -618,7 +661,7 @@ if (i<0||i>=MAX_INPUT_REGISTER_VAR) return 0; i = i+MIN_TMP_REG; } - return list3(REGISTER,regv[i],(int)n); + return list3(REGISTER,i,(int)n); } /* double register case? */ @@ -633,7 +676,7 @@ if (i<0||i>=MAX_INPUT_REGISTER_VAR+1) return 0; i = i+MIN_TMP_REG; } - return list3(REGISTER,regv[i],(int)n); + return list3(REGISTER,i,(int)n); } int @@ -670,8 +713,9 @@ { int i; #if LONGLONG_CODE - if (lreg) free_register(lreg); + for(i=0;i<REAL_MAX_LREGISTER;i++) { regs[i+LREG_OFFSET]=0; } lreg = 0; + set_lreg(LREG_LREGISTER,0); #endif for(i=0;i<MAX_REGISTER;i++) { regs[i]=0; } for(i=0;i<MAX_FREGISTER;i++) { regs[i+FREG_OFFSET]=0; } @@ -680,14 +724,14 @@ set_freg(FREG_FREGISTER,0); #endif ireg = creg = get_register(); - set_creg(CREG_REGISTER,0); + set_ireg(CREG_REGISTER,0); return; } void register_usage(char *s) { -#if 0 +#if 1 int i; #endif if (chk) return; @@ -697,14 +741,28 @@ if (freg) printf(" freg=%s",fregister_name(freg)); if (lreg) printf(" lreg=%s,%s",lregister_name_high(lreg), lregister_name_low(lreg)); -#if 0 +#if 1 printf("\n# regs:"); - for(i=0;i<MAX_REGISTER;i++) { printf("%d",regs[i]); } + for(i=0;i<MAX_REGISTER;i++) { printf("%d ",regs[i]); } + printf(" stack "); + for(i=reg_sp;i>0;i--) { + if(reg_stack[i-1]>=0) + printf(" %s",register_name(reg_stack[i])); + } printf("\n# freg:"); - for(i=0;i<MAX_FREGISTER;i++) { printf("%d",regs[i+FREG_OFFSET]); } - for(i=reg_sp;i>=0;i--) { - if(reg_stack[i]>=0) - printf(" %s",register_name(reg_stack[i])); + for(i=0;i<MAX_FREGISTER;i++) { printf("%d ",regs[i+FREG_OFFSET]); } + printf(" stack "); + for(i=freg_sp;i>0;i--) { + if(freg_stack[i-1]>=0) + printf(" %s",fregister_name(freg_stack[i])); + } + printf("\n# lreg:"); + for(i=0;i<REAL_MAX_LREGISTER;i++) { printf("%d ",regs[i+LREG_OFFSET]); } + printf(" stack "); + for(i=lreg_sp;i>0;i--) { + if(lreg_stack[i-1]>=0) + printf(" %s",lregister_name_high(lreg_stack[i])); + printf(",%s",lregister_name_low(lreg_stack[i])); } #endif printf("\n"); @@ -749,7 +807,7 @@ regs[REG_VAR_BASE-i]=USING_REG; if (i>max_reg_var) max_reg_var=i; /* その場所を表す番号を返す */ - return list3(REGISTER,glist2(REGISTER,REG_VAR_BASE-i),(int)n); + return list3(REGISTER,REG_VAR_BASE-i,(int)n); } } return list2(LVAR,new_lvar(size_of_int)); @@ -765,7 +823,7 @@ if (i>max_freg_var) max_freg_var=i; /* その場所を表す番号を返す */ return list3(DREGISTER, - glist2(DREGISTER,FREG_VAR_BASE-i+FREG_OFFSET),(int)n); + FREG_VAR_BASE-i+FREG_OFFSET,(int)n); } } return list2(LVAR,new_lvar(size_of_double)); @@ -795,28 +853,6 @@ return xreg; } -int -stack_top(int type) -{ - int xreg; - if (type==INT) { - xreg = reg_stack[reg_sp]; - if (xreg<= -REG_LVAR_OFFSET) { - return list2(LVAR,REG_LVAR_OFFSET+xreg); - } else { - return xreg; - } - } else { - xreg = freg_stack[freg_sp]; - if (xreg<= -REG_LVAR_OFFSET) { - return list2(LVAR,REG_LVAR_OFFSET+xreg); - } else { - return xreg; - } - } - return xreg; -} - static int code_base; #define MAX_PTR_CACHE 10 @@ -881,7 +917,7 @@ ptr_cache = p; /* now the last one is the top */ if (!caddr(p)) { if((r=get_register())) { - caddr(p)=r; regs[cadr(r)]=PTRC_REG; + caddr(p)=r; regs[r]=PTRC_REG; } else { error(-1); r=creg; /* this can't happen */ @@ -1269,7 +1305,7 @@ printf("\tbl L_%s$stub\n",memmove); extern_define(memmove,0,FUNCTION,1); fix=0; - set_creg(RET_REGISTER,0); + set_ireg(RET_REGISTER,0); if (creg!=to) { free_register(to); to = creg; } @@ -1323,15 +1359,16 @@ } void -set_creg(int reg,int mode) +set_ireg(int reg,int mode) { + if (!is_int_reg(reg)) error(-1); if (reg!=creg) { clear_ptr_cache_reg(reg); if (ireg && reg!=ireg && mode) { printf("\tmr %s,%s\n",register_name(reg),register_name(ireg)); } free_register(creg); - regs[cadr(creg)]=USING_REG; + regs[creg]=USING_REG; } creg = ireg = reg; } @@ -1339,12 +1376,13 @@ void set_freg(int reg,int mode) { + if (!is_float_reg(reg)) error(-1); if (reg!=creg) { if (reg!=freg && mode) { printf("\tfmr %s,%s\n",fregister_name(reg),fregister_name(freg)); } - free_register(creg); - regs[cadr(freg)]=USING_REG; + if (creg!=ireg) free_register(creg); + regs[freg]=USING_REG; } creg = freg = reg; } @@ -1352,6 +1390,7 @@ void set_lreg(int reg,int mode) { + if (!is_longlong_reg(reg)) error(-1); if (reg!=creg) { if (reg!=lreg && mode) { printf("\tmr %s,%s\n", @@ -1359,23 +1398,21 @@ printf("\tmr %s,%s\n", lregister_name_high(reg),lregister_name_high(lreg)); } - regs[cadr(lreg)]=USING_REG; - regs[caddr(lreg)]=USING_REG; - free_register(creg); + regs[reg]=USING_REG; + regs[regv_l(reg)]=USING_REG; + regs[regv_h(reg)]=USING_REG; + if (creg!=ireg) free_register(creg); } creg = lreg = reg; } void -use_var(int arg) +use_reg(int arg) { - if (car(arg)==REGISTER) - regs[cadr(arg)]=USING_REG; - else if (car(arg)==DREGISTER) - regs[cadr(arg)]=USING_REG; - else if (car(arg)==LREGISTER) { - regs[cadr(arg)]=USING_REG; - regs[caddr(arg)]=USING_REG; + regs[arg]=USING_REG; + if (is_longlong_reg(arg)) { + regs[regv_l(arg)]=USING_REG; + regs[regv_h(arg)]=USING_REG; } } @@ -1485,7 +1522,8 @@ /* now all input register vars are free */ code_save_stacks(); - set_creg(CREG_REGISTER,0); + set_lreg(LREG_LREGISTER,0); + set_ireg(CREG_REGISTER,0); set_freg(FREG_FREGISTER,0); nargs = reg_arg = freg_arg = arg_assign = 0; @@ -1504,7 +1542,7 @@ } else { arg = get_input_register_var(reg_arg,0,0); } - use_var(arg); /* protect from input register free */ + use_reg(arg); /* protect from input register free */ reg_arg_list = list2(arg,reg_arg_list); g_expr_u(assign_expr0(arg,e4,t,t)); nargs ++ ; reg_arg++; @@ -1521,7 +1559,7 @@ } else { arg = get_input_lregister_var(reg_arg,0,0); } - use_var(arg); /* protect from input register free */ + use_reg(arg); /* protect from input register free */ reg_arg_list = list2(arg,reg_arg_list); g_expr_u(assign_expr0(arg,e4,t,t)); nargs ++ ; reg_arg++; @@ -1551,8 +1589,8 @@ /* else if (regs[r1]) error(-1); */ r1=get_input_register_var_1(reg_arg+1,0,0); - use_var(r0); /* protect from input register free */ - use_var(r1); /* protect from input register free */ + use_reg(r0); /* protect from input register free */ + use_reg(r1); /* protect from input register free */ reg_arg_list = list2(r0,reg_arg_list); reg_arg_list = list2(r1,reg_arg_list); arg_assign = list2( assign_expr0(r0,e5,INT,INT), arg_assign); @@ -1583,7 +1621,7 @@ } else { arg = get_input_dregister_var(freg_arg,0,0,1); } - use_var(arg); /* protect from input register free */ + use_reg(arg); /* protect from input register free */ reg_arg_list = list2(arg,reg_arg_list); g_expr_u(assign_expr0(arg,e4,t,t)); /* XXX */ freg_arg++; @@ -1621,9 +1659,10 @@ set_freg(RET_FREGISTER,0); } else if (ret_type==ULONGLONG||ret_type==LONGLONG) { set_lreg(RET_LREGISTER,0); + use_reg(RET_LREGISTER); } else if (ret_type==VOID) { } else { - set_creg(RET_REGISTER,0); + set_ireg(RET_REGISTER,0); } return ret_type; } @@ -2055,7 +2094,8 @@ void code_enter1(int args) { - set_creg(CREG_REGISTER,0); + set_lreg(LREG_LREGISTER,0); + set_ireg(CREG_REGISTER,0); set_freg(FREG_FREGISTER,0); } @@ -2101,7 +2141,8 @@ enter1() { text_mode(); - set_creg(CREG_REGISTER,0); + set_lreg(LREG_LREGISTER,0); + set_ireg(CREG_REGISTER,0); set_freg(FREG_FREGISTER,0); } @@ -2196,7 +2237,7 @@ set_lreg(RET_LREGISTER,mode); } else if (cadr(fnptr->ty)==VOID) { } else { - set_creg(RET_REGISTER,mode); + set_ireg(RET_REGISTER,mode); } } @@ -2211,8 +2252,9 @@ set_freg(reg,mode); } else if (type==LONGLONG||type==ULONGLONG) { set_lreg(reg,mode); + use_reg(reg); } else { - set_creg(reg,mode); + set_ireg(reg,mode); } } @@ -2674,7 +2716,7 @@ i2d_lib_used = 1; clear_ptr_cache(); code_save_stacks(); - set_creg(RET_REGISTER,1); + set_ireg(RET_REGISTER,1); printf("\tbl i2d_\n"); set_freg(RET_FREGISTER,0); } @@ -2722,7 +2764,7 @@ d2u_lib_used=1; set_freg(RET_FREGISTER,1); printf("\tbl d2u_\n"); - set_creg(RET_REGISTER,0); + set_ireg(RET_REGISTER,0); } static int u2d_lib_used=0; @@ -2757,7 +2799,7 @@ code_save_stacks(); clear_ptr_cache(); u2d_lib_used = 1; - set_creg(RET_REGISTER,1); + set_ireg(RET_REGISTER,1); printf("\tbl u2d_\n"); set_freg(FREG_FREGISTER,0); } @@ -3030,19 +3072,19 @@ } -static long long ll = 1LL; +static long long ll0 = 1LL; static int code_l1(long long d) { - int *i = (int *)≪ int *j = (int *)&d; + int *i = (int *)&ll0; int *j = (int *)&d; return (i[1] == 1)?j[1]:j[0]; } static int code_l2(long long d) { - int *i = (int *)≪ int *j = (int *)&d; + int *i = (int *)&ll0; int *j = (int *)&d; return (i[1] == 1)?j[0]:j[1]; }
--- a/mc.h Thu Apr 15 07:25:38 2004 +0900 +++ b/mc.h Wed Apr 21 14:26:47 2004 +0900 @@ -196,7 +196,7 @@ #define FRINDIRECT (FOP+RINDIRECT) #define DRINDIRECT (DOP+RINDIRECT) #define LRINDIRECT (LOP+RINDIRECT) -#define LURINDIRECT (LOP+CURINDIRECT) +#define LURINDIRECT (LOP+URINDIRECT) #define RSTRUCT 27 #define CONV 28