gesamt: bugfix bei mehreren methodenaufrufen in einer Expr
authorBernhard Urban <lewurm@gmail.com>
Sun, 6 Jun 2010 19:14:43 +0000 (21:14 +0200)
committerBernhard Urban <lewurm@gmail.com>
Sun, 6 Jun 2010 19:14:43 +0000 (21:14 +0200)
gesamt/chelper.c
gesamt/code.bfe

index 448b07b2d47e76cf5c8bd85a5fdf9f809cc94568..25362ddd00c331acfc075091fbc388a021ce2291 100644 (file)
@@ -25,8 +25,8 @@ void func_header(char *s, int vars, int parms, int call)
        need_stack = (vars || parms) && call;
        if(need_stack) {
                printf("\tpushq %%rbp\n"
-                               "\tmovq %%rsp, %%rbp\n",
-                               "\tsubq $%d, %%rsp\n", 8*(vars+parms));
+                               "\tmovq %%rsp, %%rbp\n"
+                               "\tsubq $%d, %%rsp\n", 8*(vars+parms+2 /* fuer rax und r10*/));
        }
 }
 
index 8e3dfde8eb1444485cf2824b265d089798c4236f..9e85ee17abafb47722511d155aef96b151dd9301 100644 (file)
@@ -164,7 +164,9 @@ void gen_subspecial(struct treenode *bnode, short e)
        KIDKIDREG2PARM(1,0);
 
        if(e) {
-               printf("\tsubq $%d, %%%s\n", KIDKID_VAL(1,0), BN_REG);
+               if(KIDKID_VAL(1,0) != 0) {
+                       printf("\tsubq $%d, %%%s\n", KIDKID_VAL(1,0), BN_REG);
+               }
        } else {
                printf("\tsubq %%%s, %%%s\n", KIDKID_REG(1,0), BN_REG);
        }
@@ -189,7 +191,21 @@ void make_call(struct treenode *bnode)
        for(j = bnode->paramges; j < bnode->paramges + bnode->vars; j++) {
                printf("\tpushq %%%s\n", param_reg(j));
        }
+       /* TODO: schoener machen... */
+       if(strcmp(BN_REG, "rax")!=0) {
+               printf("\tpushq %%rax\n");
+               if(strcmp(BN_REG, "r10")!=0) {
+                       printf("\tpushq %%r10\n");
+               }
+       }
        printf("\tcall %s\n", bnode->name);
+       if(strcmp(BN_REG, "rax")!=0) {
+               move("rax", BN_REG);
+               if(strcmp(BN_REG, "r10")!=0) {
+                       printf("\tpopq %%r10\n");
+               }
+               printf("\tpopq %%rax\n");
+       }
 
        /* vars poppen */
        for(j = bnode->paramges + bnode->vars - 1; j >= bnode->paramges; j--) {