From 44f4fb2a8cf8990a02b77d4e42aed5ac6f3e871f Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Mon, 7 Jun 2010 10:33:48 +0200 Subject: [PATCH] gesamt: bugfix fuer 'this.ID(...)' --- gesamt/TODO | 4 +++- gesamt/code.bfe | 16 +++++++++++++--- gesamt/parser.y | 1 + 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/gesamt/TODO b/gesamt/TODO index ec191c0..05d7ec9 100644 --- a/gesamt/TODO +++ b/gesamt/TODO @@ -3,4 +3,6 @@ viel laengere parameterliste hat? (die hinteren register wurden ja nicht gesichert... :/) anmerkung: koennt vielleicht hinhauen weil ich die parameter sichere (ohne ruecksicht darauf ob sie tatsaechlich paramter sind!) -- +- wenn push und xchg die selben register betreffen kann man das wegoptimieren + (globales array mit 0er und 1er drin machen?) +- intelli_03: seiteneffekte in der ersten zeile *ahhhh* diff --git a/gesamt/code.bfe b/gesamt/code.bfe index 68d6089..1c6c410 100644 --- a/gesamt/code.bfe +++ b/gesamt/code.bfe @@ -190,17 +190,18 @@ void assign_var(struct treenode *bnode) void make_call(struct treenode *bnode) { int j; - /* params pushen */ + printf("\t//params pushen\n"); for(j = 0; j < bnode->soffset; j++) { printf("\txchg %%%s, %d(%%rsp)\n", param_reg(j), j*8); } - /* vars pushen */ + printf("\t//vars pushen\n"); for(j = 6; j > 6 - bnode->vars - 1; j--) { printf("\tpushq %%%s\n", param_reg(j)); } /* TODO: schoener machen... */ if(strcmp(BN_REG, "rax")!=0) { + printf("\t//tmp register pushen\n"); printf("\tpushq %%rax\n"); if(strcmp(BN_REG, "r10")!=0) { printf("\tpushq %%r10\n"); @@ -230,7 +231,16 @@ void prep_arg(struct treenode *bnode, int moveit) { printf("\t//args-nr.: %i (%%%s) [moveit: %i]\n", bnode->soffset, param_reg(bnode->soffset), moveit); if(moveit) { /* expr */ - printf("\tpushq %%%s\n", BN_REG == (char *) NULL ? param_reg(bnode->soffset) : BN_REG); + 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) { + KIDREG2PARM(1); + printf("\tpushq %%%s\n", KID_REG(1)); + } else { + printf("\tpushq %%%s\n", param_reg(bnode->soffset)); + } + } else { + printf("\tpushq %%%s\n", BN_REG); + } } else { /* just O_ID */ KIDREG2PARM(0); printf("\tpushq %%%s\n", KID_REG(0)); diff --git a/gesamt/parser.y b/gesamt/parser.y index 2d42baa..f564b15 100644 --- a/gesamt/parser.y +++ b/gesamt/parser.y @@ -182,6 +182,7 @@ Statement: lblcountinout() @i @Statement.vars_out@ = @Statement.vars_in@ + 1; + @i @Expr.vars_in@ = @Statement.vars_in@ - 1; xxputsin(@Expr.s@,) -- 2.25.1