X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=uebersetzerbau-ss10.git;a=blobdiff_plain;f=gesamt%2Fcode.bfe;h=1c6c410014eae27dbfd9d6a9be359a16df438d07;hp=68d6089d3fa4d0b62cc39858496073fc20ec7c30;hb=44f4fb2a8cf8990a02b77d4e42aed5ac6f3e871f;hpb=3fa41a742ef73439fac40da45356f0b20ef8d8fc 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));