From: Bernhard Urban Date: Thu, 10 Jun 2010 14:03:02 +0000 (+0200) Subject: ppc: kleinere spielerein bezueglich stack X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=uebersetzerbau-ss10.git;a=commitdiff_plain;h=fe7933757ada120de8e4b10cbaef73f3705d2239 ppc: kleinere spielerein bezueglich stack folgende Testfaelle gehen noch nicht: codeb_georg_asm{a,b}* codeb_intelli_14.0 old_abgabe_cf.0 skinner33_01.0 # vermutlich selbes problem wie bei cf, sehr komisches verhalten! --- diff --git a/gesamt_ppc/code.bfe b/gesamt_ppc/code.bfe index e9234f9..f97b517 100644 --- a/gesamt_ppc/code.bfe +++ b/gesamt_ppc/code.bfe @@ -199,14 +199,20 @@ void assign_var(struct treenode *bnode) printf("\tsubi %s,%s,%d\n", KID_REG(1), KID_REG(1), KIDKID_VAL(0,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("\tlwz 20,%d(1)\n", j*4); - printf("\tstw %s,%d(1)\n", param_reg(j), j*4); - printf("\tmr %s,20\n", param_reg(j)); + if(sc[j] == 1) { + printf("\tlwz 20,%d(1)\n", j*4); + printf("\tstw %s,%d(1)\n", param_reg(j), j*4); + printf("\tmr %s,20\n", param_reg(j)); + } else if (sc[j] == 0) { + printf("\tstw %s,%d(1)\n", param_reg(j), j*4); + } } printf("\t#vars pushen\n"); for(j = bnode->soffset; j < bnode->soffset + bnode->vars; j++) { @@ -245,14 +251,24 @@ void make_call(struct treenode *bnode) } printf("\t#params poppen\n"); + for(j = bnode->soffset - 1; j >= 0; j--) { + if(sc[j] == 0) + printf("\tlwz %s,%d(1)\n", param_reg(j), j*4); + } for(j = 0; j < bnode->soffset; j++) { - printf("\tlwz %s,%d(1)\n", param_reg(j), j*4); + if(sc[j] > 0) + printf("\tlwz %s,%d(1)\n", param_reg(j), j*4); } + + /* 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) { @@ -260,6 +276,7 @@ void prep_arg(struct treenode *bnode, int moveit) printf("\tstw %s,%d(1)\n", KID_REG(1),bnode->soffset*4); } else { printf("\tstw %s,%d(1)\n", param_reg(bnode->soffset), bnode->soffset*4); + sc[bnode->soffset] = 2; } } else { printf("\tstw %s,%d(1)\n", BN_REG, bnode->soffset*4);