From a5bee09cb0676b61453c976de26c3036a421b11e Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Wed, 9 Jun 2010 22:42:08 +0200 Subject: [PATCH] gesamt: kleinere spielerein bezueglich stack --- gesamt/code.bfe | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/gesamt/code.bfe b/gesamt/code.bfe index 33979ba..11c6734 100644 --- a/gesamt/code.bfe +++ b/gesamt/code.bfe @@ -187,12 +187,17 @@ void assign_var(struct treenode *bnode) printf("\tsub $%d, %%%s\n", KIDKID_VAL(0,1), KID_REG(1)); } +/* ... dirty */ +static short sc[8] = {0}; void make_call(struct treenode *bnode) { int j; printf("\t//params pushen\n"); for(j = 0; j < bnode->soffset; j++) { - printf("\txchg %%%s, %d(%%rsp)\n", param_reg(j), j*8); + if(sc[j] == 1) + printf("\txchg %%%s, %d(%%rsp)\n", param_reg(j), j*8); + else if (sc[j] == 0) + printf("\tpushq %%%s\n", param_reg(j)); } printf("\t//vars pushen\n"); for(j = bnode->soffset; j < bnode->soffset + bnode->vars; j++) { @@ -222,14 +227,24 @@ void make_call(struct treenode *bnode) } /* params poppen */ + for(j = bnode->soffset - 1; j >= 0; j--) { + if(sc[j] == 0) + printf("\tpopq %%%s\n", param_reg(j)); + } for(j = 0; j < bnode->soffset; j++) { - printf("\tpopq %%%s\n", param_reg(j)); + if(sc[j] > 0) + printf("\tpopq %%%s\n", param_reg(j)); } + + /* clear stack_control array */ + for(j = 0; j < sizeof sc / sizeof sc[0]; j++) + sc[j] = 0; } void prep_arg(struct treenode *bnode, int moveit) { printf("\t//args-nr-> %i (%%%s) [moveit= %i]\n", bnode->soffset, param_reg(bnode->soffset), moveit); + sc[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) { @@ -237,6 +252,7 @@ void prep_arg(struct treenode *bnode, int moveit) printf("\tpushq %%%s\n", KID_REG(1)); } else { printf("\tpushq %%%s\n", param_reg(bnode->soffset)); + sc[bnode->soffset] = 2; } } else { printf("\tpushq %%%s\n", BN_REG); -- 2.25.1