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,...)                   */