From 027d0484feb839bd68f4981981deffc415b869c1 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Mon, 7 Jun 2010 11:22:06 +0200 Subject: [PATCH] gesamt: xchg opt bei gleichen register --- gesamt/TODO | 6 ------ gesamt/code.bfe | 10 +++++++++- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/gesamt/TODO b/gesamt/TODO index 05d7ec9..39f9a26 100644 --- a/gesamt/TODO +++ b/gesamt/TODO @@ -1,8 +1,2 @@ - enter verwenden statt selbst prolog zu machen -- was ist wenn eine funktion die aufgerufen wird eine funktion aufruft die eine - viel laengere parameterliste hat? (die hinteren register wurden ja nicht - gesichert... :/) anmerkung: koennt vielleicht hinhauen weil ich die parameter - sichere (ohne ruecksicht darauf ob sie tatsaechlich paramter sind!) -- wenn push und xchg die selben register betreffen kann man das wegoptimieren - (globales array mit 0er und 1er drin machen?) - intelli_03: seiteneffekte in der ersten zeile *ahhhh* 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; + } } } -- 2.25.1