X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=uebersetzerbau-ss10.git;a=blobdiff_plain;f=gesamt%2Fcode.bfe;h=b1afba625ff93889b01890893b8f371af57a95af;hp=76175ab861406e4a53d3926abe98321e77bf09f0;hb=027d0484feb839bd68f4981981deffc415b869c1;hpb=7ba1a3cafae8f8c6bf6caaedf5cc4a3f73a5aa10 diff --git a/gesamt/code.bfe b/gesamt/code.bfe index 76175ab..b1afba6 100644 --- a/gesamt/code.bfe +++ b/gesamt/code.bfe @@ -187,12 +187,15 @@ 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++) { - printf("\txchg %%%s, %d(%%rsp)\n", param_reg(j), j*8); + if(xchg_param[j] == 1) + printf("\txchg %%%s, %d(%%rsp)\n", param_reg(j), j*8); } printf("\t//vars pushen\n"); for(j = 6; j > 6 - bnode->vars; j--) { @@ -230,6 +233,7 @@ 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) { @@ -237,6 +241,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)); + xchg_param[bnode->soffset] = 0; } } else { printf("\tpushq %%%s\n", BN_REG); @@ -244,6 +249,9 @@ 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; + } } }