X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=gesamt%2Fcode.bfe;h=dba50235426bbed1fe7f5ca1fafd391771e66342;hb=bb2b8ce82db6ac53f2973df099f0da7e62970b86;hp=9e85ee17abafb47722511d155aef96b151dd9301;hpb=2c41106ae4fd8e8b01f3e9c4ffe58f11263b318f;p=uebersetzerbau-ss10.git diff --git a/gesamt/code.bfe b/gesamt/code.bfe index 9e85ee1..dba5023 100644 --- a/gesamt/code.bfe +++ b/gesamt/code.bfe @@ -43,8 +43,11 @@ void gen_id_eno(struct treenode *bnode) { printf("\t//gen_id_eno\n"); KIDKIDREG2PARM(1,0); - printf("\taddq %%%s, %%%s\n", KIDKID_REG(1,0), KIDKID_REG(1,1)); + KIDKIDREG2PARM(1,1); + KIDREG2PARM(0); + move(KID_REG(0), BN_REG); printf("\tsubq %%%s, %%%s\n", KIDKID_REG(1,1), BN_REG); + printf("\tsubq %%%s, %%%s\n", KIDKID_REG(1,0), BN_REG); } void gen_e_field(struct treenode *bnode, char *instr) @@ -145,7 +148,7 @@ void gen_eqless(struct treenode *bnode, char *op, short e0, short e1, short deep void gen_lea(struct treenode *bnode, short e) { - printf("\t//gen_lea(e: %i)\n", e); + printf("\t//gen_lea(e= %i)\n", e); KIDREG2PARM(0); if(e) { KIDKIDREG2PARM(1,0); @@ -184,15 +187,24 @@ 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; - /* vars pushen */ - for(j = bnode->paramges; j < bnode->paramges + bnode->vars; j++) { + printf("\t//params pushen\n"); + for(j = 0; j < bnode->soffset; j++) { + 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--) { 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"); @@ -208,25 +220,38 @@ void make_call(struct treenode *bnode) } /* vars poppen */ - for(j = bnode->paramges + bnode->vars - 1; j >= bnode->paramges; j--) { + for(j = 7 - bnode->vars; j < 7; j++) { printf("\tpopq %%%s\n", param_reg(j)); } /* params poppen */ - for(j = bnode->soffset - 1; j >= 0; j--) { + for(j = 0; j < bnode->soffset; j++) { printf("\tpopq %%%s\n", param_reg(j)); } } void prep_arg(struct treenode *bnode, int moveit) { - printf("\t//args-nr.: %%%s to %%%s (moveit: %i)\n", BN_REG, param_reg(bnode->soffset), moveit); - printf("\tpushq %%%s\n", param_reg(bnode->soffset)); + printf("\t//args-nr-> %i (%%%s) [moveit= %i]\n", bnode->soffset, param_reg(bnode->soffset), moveit); + xchg_param[bnode->soffset] = 1; if(moveit) { /* expr */ - move(BN_REG, param_reg(bnode->soffset)); + 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)); + xchg_param[bnode->soffset] = 0; + } + } else { + printf("\tpushq %%%s\n", BN_REG); + } } else { /* just O_ID */ KIDREG2PARM(0); - move(KID_REG(0), param_reg(bnode->soffset)); + printf("\tpushq %%%s\n", KID_REG(0)); + if(strcmp(KID_REG(0), param_reg(bnode->soffset)) == 0) { + xchg_param[bnode->soffset] = 0; + } } } @@ -268,7 +293,7 @@ expr: O_ID # 0 # expr: imm # 1 # moveimm(BN_VAL, BN_REG); expr: O_BOOL(expr) # 0 # -expr: O_CALL(expr,expr) # 0 # make_call(bnode); +expr: O_CALL(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_NOTHING # 0 #