X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=gesamt%2Fcode.bfe;fp=gesamt%2Fcode.bfe;h=fb0044768de8a55751b29e1b723b739efa7faa0d;hb=53fd1c254c4bad576328130c8d4456c86a320a9b;hp=a95ed5b6996ca83b07df25c842bad44043b77c4c;hpb=3cc9774c47638019932f476371f731bc61a7f1eb;p=uebersetzerbau-ss10.git diff --git a/gesamt/code.bfe b/gesamt/code.bfe index a95ed5b..fb00447 100644 --- a/gesamt/code.bfe +++ b/gesamt/code.bfe @@ -187,17 +187,20 @@ 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; + short *sc = bnode->sc; + int j, off = 0; printf("\t//params pushen\n"); for(j = 0; j < bnode->soffset; j++) { 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("\txchg %%%s, %d(%%rsp)\n", param_reg(j), (j - off)*8); + else { + if (sc[j] == 0) { + printf("\tpushq %%%s\n", param_reg(j)); + off++; + } + } } printf("\t//vars pushen\n"); for(j = bnode->soffset; j < bnode->soffset + bnode->vars; j++) { @@ -221,16 +224,17 @@ void make_call(struct treenode *bnode) printf("\tpopq %%rax\n"); } - /* vars poppen */ + printf("\t//vars poppen\n"); for(j = bnode->soffset + bnode->vars - 1; j > bnode->soffset - 1; j--) { printf("\tpopq %%%s\n", param_reg(j)); } - /* params poppen */ + printf("\t//params poppen (sc == 0)\n"); for(j = bnode->soffset - 1; j >= 0; j--) { if(sc[j] == 0) printf("\tpopq %%%s\n", param_reg(j)); } + printf("\t//params poppen (sc != 0)\n"); for(j = 0; j < bnode->soffset; j++) { if(sc[j] > 0) printf("\tpopq %%%s\n", param_reg(j)); @@ -243,21 +247,21 @@ void make_call(struct treenode *bnode) void prep_arg(struct treenode *bnode, int moveit) { + short *sc = bnode->sc; 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) { - KIDREG2PARM(1); - printf("\tpushq %%%s\n", KID_REG(1)); - } else { - printf("\tpushq %%%s\n", param_reg(bnode->soffset)); - sc[bnode->soffset] = 2; - } + if(moveit == 1) { /* expr */ + if(( bnode->kids[0] != TREENULL && bnode->kids[0]->op == O_NOTHING && + bnode->kids[0] != TREENULL && bnode->kids[0]->op == O_NOTHING)) { + printf("\tpushq %%%s\n", param_reg(bnode->soffset)); + sc[bnode->soffset] = 2; } else { printf("\tpushq %%%s\n", BN_REG); } - } else { /* just O_ID */ + } else if(moveit == 2) { /* O_ID right */ + KIDREG2PARM(1); + printf("\tpushq %%%s\n", KID_REG(1)); + } else if(moveit == 0) { /* O_ID left */ KIDREG2PARM(0); printf("\tpushq %%%s\n", KID_REG(0)); } @@ -317,9 +321,10 @@ expr: O_ID # 0 # expr: imm # 1 # moveimm(BN_VAL, BN_REG); expr: O_BOOL(expr) # 0 # -expr: O_CALL(expr) # 0 # make_call(bnode); +expr: O_CALL(expr,expr) # 0 # make_call(bnode); expr: O_ARG(expr,expr) # 1 # prep_arg(bnode, 1); expr: O_ARG(O_ID,expr) # 1 # prep_arg(bnode, 0); +expr: O_ARG(expr,O_ID) # 1 # prep_arg(bnode, 2); expr: O_NOTHING # 0 # expr: O_SUB(expr,expr) # 2 # gen_e_eno(bnode, "subq");