Mercurial > hg > CbC > old > device
diff mc-codegen.c @ 89:917947ffeb7c
power pc version
author | kono |
---|---|
date | Thu, 06 Mar 2003 23:47:42 +0900 |
parents | 5c8553d7f984 |
children | 9b1aeb62e0b9 |
line wrap: on
line diff
--- a/mc-codegen.c Wed Mar 05 23:07:00 2003 +0900 +++ b/mc-codegen.c Thu Mar 06 23:47:42 2003 +0900 @@ -54,172 +54,6 @@ void assop(int e1); void g_expr0(int e1); -int -get_register(void) -{ /* 使われていないレジスタを調べる */ - int i; - for(i=0;i<MAX_REGISTER;i++) { - if (! regs[i]) { /* 使われていないなら */ - regs[i]=1; /* そのレジスタを使うことを宣言し */ - return i; /* その場所を表す番号を返す */ - } - } - return -1; /* 空いている場所がないなら、それを表す -1 を返す */ -} - -void -free_register(int i) { /* いらなくなったレジスタを開放 */ - regv[i]=regs[i]=0; -} - -int -register_full(void) -{ - int i; - for(i=0;i<MAX_REGISTER;i++) { - if (! regs[i]) { - return 0; - } - } - return 1; -} - -int -free_register_count(void) -{ - int i,count; - count = 0; - for(i=0;i<MAX_REGISTER;i++) { - if (! regs[i] && ! regv[i]) count++; - } - return count; -} - -void -free_all_register(void) -{ - int i; - for(i=0;i<MAX_REGISTER;i++) { - regs[i]=regv[i]=0; - } - creg = get_register(); - dreg = get_register(); - return; -} - -void -use_register_var(int i) { - regv[i]=1; -} - -void -set_register_var() { -} - -void -arg_register0(int args) -{ - NMTBL *n; - if (args) { - /* process in reverse order */ - n = (NMTBL*)caddr(args); - if(n->sc==REGISTER) { - if ((n->dsp = get_register_var()) <0) { - error(-1); return; - } - use_register_var(n->dsp); /* it has now value in it */ - } - arg_register0(cadr(args)); - } -} - -void -arg_register(NMTBL *fnptr) -{ - arg_register0(fnptr->dsp); -} - -void -register_usage(char *s) -{ - int i; - if (chk) return; - printf("# %d: %s:",lineno,s); - printf(" creg=%s dreg=%s ",register_name(creg,0),register_name(dreg,0)); - for(i=0;i<MAX_REGISTER;i++) { - printf("%d",regs[i]); - } - printf(":"); - for(i=0;i<MAX_REGISTER;i++) { - printf("%d",regv[i]); - } -#if 0 - printf(" regs_stack",register_name(creg,0),register_name(dreg,0)); - for(i=reg_sp;i>=0;i--) { - if(reg_stack[i]>=0) - printf(" %s",register_name(reg_stack[i],0)); - } -#endif - printf("\n"); -} - -void -gexpr_init(void) -{ - while(reg_sp > 0) { - free_register(reg_stack[--reg_sp]); - } - text_mode(); - gexpr_code_init(); - register_usage("gexpr_init"); -} - - -void -emit_init(void) -{ - int i; - for(i=0;i<MAX_REGISTER;i++) { regs[i]=0; regv[i]=0;rname[i]=i;} - free_all_register(); - reg_sp = 0; - text_mode(); -} - -int -virtual(int real) -{ - int real_v,i; - real_v = -1; - for(i=0;i<MAX_REGISTER;i++) { - if (rname[i]==real) { - real_v=i; - break; - } - } - return real_v; -} - -int -pop_register(void) -{ /* レジスタから値を取り出す */ - return reg_stack[--reg_sp]; -} - -int -stack_used(void) { - return reg_stack[--reg_sp]<0; -} - -void -emit_pop_free(int xreg) -{ - if (xreg==dreg) { - regv[dreg]=0; - } else if (xreg!=-1) { - free_register(xreg); - } -} - void gexpr(int e1,int use0) { @@ -409,7 +243,7 @@ return; case DMUL: case DDIV: case DADD: case DSUB: - case DCOMP: + case DCMP: dmachinop(e1); return; case COND: @@ -483,34 +317,34 @@ b_expr(e2,!cond,l1,0); return; case GT: - rexpr(e1,l1,code_gt(cond)); + rexpr(e1,l1,code_gt(cond),INT); return; case UGT: - rexpr(e1,l1,code_ugt(cond)); + rexpr(e1,l1,code_ugt(cond),UNSIGNED); return; case GE: - rexpr(e1,l1,code_ge(cond)); + rexpr(e1,l1,code_ge(cond),INT); return; case UGE: - rexpr(e1,l1,code_uge(cond)); + rexpr(e1,l1,code_uge(cond),UNSIGNED); return; case LT: - rexpr(e1,l1,code_ge(!cond)); + rexpr(e1,l1,code_ge(!cond),INT); return; case ULT: - rexpr(e1,l1,code_uge(!cond)); + rexpr(e1,l1,code_uge(!cond),UNSIGNED); return; case LE: - rexpr(e1,l1,code_gt(!cond)); + rexpr(e1,l1,code_gt(!cond),INT); return; case ULE: - rexpr(e1,l1,code_ugt(!cond)); + rexpr(e1,l1,code_ugt(!cond),UNSIGNED); return; case EQ: - rexpr(e1,l1,code_eq(cond)); + rexpr(e1,l1,code_eq(cond),INT); return; case NEQ: - rexpr(e1,l1,code_eq(!cond)); + rexpr(e1,l1,code_eq(!cond),INT); return; case DOP+GT: @@ -588,6 +422,12 @@ } +void +arg_register(NMTBL *fnptr) +{ + code_arg_register(fnptr->dsp); +} + /* goto arguments list */ /* target list4(list2(tag,disp),cdr,ty,source_expr) */ /* source expr=listn(tag,...) */