From f8a6a326d88ce84fb401b75c5adc881016d60995 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Mon, 7 Jun 2010 20:55:55 +0200 Subject: [PATCH] gesamt: bessere taktik zum VAR sichern --- gesamt/code.bfe | 10 +--------- gesamt/parser.y | 4 ++-- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/gesamt/code.bfe b/gesamt/code.bfe index 9390e22..14121c9 100644 --- a/gesamt/code.bfe +++ b/gesamt/code.bfe @@ -187,15 +187,12 @@ void assign_var(struct treenode *bnode) printf("\tsub $%d, %%%s\n", KIDKID_VAL(0,1), KID_REG(1)); } -/* dirty...*/ -static short xchg_param[7] = {0}; void make_call(struct treenode *bnode) { int j; printf("\t//params pushen\n"); for(j = 0; j < bnode->soffset; j++) { - if(xchg_param[j] == 1) - printf("\txchg %%%s, %d(%%rsp)\n", param_reg(j), j*8); + printf("\txchg %%%s, %d(%%rsp)\n", param_reg(j), j*8); } printf("\t//vars pushen\n"); for(j = VARBEGIN; j > VARBEGIN - bnode->vars; j--) { @@ -233,7 +230,6 @@ void make_call(struct treenode *bnode) void prep_arg(struct treenode *bnode, int moveit) { printf("\t//args-nr-> %i (%%%s) [moveit= %i]\n", bnode->soffset, param_reg(bnode->soffset), moveit); - xchg_param[bnode->soffset] = 1; if(moveit) { /* expr */ if((BN_REG == (char *) NULL) || (bnode->kids[1] != TREENULL && bnode->kids[1]->op == O_ID && bnode->kids[1]->kids[0] == TREENULL && bnode->kids[1]->kids[1] == TREENULL)) { if(bnode->kids[1]->name != (char *) NULL && strcmp(bnode->kids[1]->name,"this")!=0) { @@ -241,7 +237,6 @@ void prep_arg(struct treenode *bnode, int moveit) printf("\tpushq %%%s\n", KID_REG(1)); } else { printf("\tpushq %%%s\n", param_reg(bnode->soffset)); - xchg_param[bnode->soffset] = 0; } } else { printf("\tpushq %%%s\n", BN_REG); @@ -249,9 +244,6 @@ void prep_arg(struct treenode *bnode, int moveit) } else { /* just O_ID */ KIDREG2PARM(0); printf("\tpushq %%%s\n", KID_REG(0)); - if(strcmp(KID_REG(0), param_reg(bnode->soffset)) == 0) { - xchg_param[bnode->soffset] = 0; - } } } diff --git a/gesamt/parser.y b/gesamt/parser.y index c5271db..55ca382 100644 --- a/gesamt/parser.y +++ b/gesamt/parser.y @@ -562,7 +562,7 @@ Term: @i { @Term.node@ = new_call(@IDENT.name@, new_arg(@Exprs.node@, new_nothing(), 0) /*this*/, TREENULL, @Term.gparamges@, @Term.vars_in@); - @Term.node@->soffset = @Exprs.paramcount@; + @Term.node@->soffset = MAX(@Exprs.paramcount@, @Term.gparamges@); } @i @Exprs.cnt@ = 1; @i @Term.imm@ = 0; @@ -575,7 +575,7 @@ Term: @i { @Term.node@ = new_call(@IDENT.name@, new_arg(@Exprs.node@, @Term.1.node@, 0) /*this*/, TREENULL, @Term.gparamges@, @Term.vars_in@); - @Term.node@->soffset = @Exprs.paramcount@; + @Term.node@->soffset = MAX(@Exprs.paramcount@, @Term.gparamges@); } @i @Exprs.cnt@ = 1; @i @Term.imm@ = 0; -- 2.25.1