ppc: fixed stack fail und ein kleines clean up
authorBernhard Urban <lewurm@gmail.com>
Wed, 9 Jun 2010 21:25:14 +0000 (23:25 +0200)
committerBernhard Urban <lewurm@gmail.com>
Thu, 10 Jun 2010 01:10:23 +0000 (03:10 +0200)
gesamt_ppc/chelper.c
gesamt_ppc/chelper.h
gesamt_ppc/code.bfe
gesamt_ppc/parser.y

index c8746eb3e941361754d3c73bc14274aba89d6c25..3f4776d735f98b7259289e9ae9685d443825c20a 100644 (file)
@@ -23,14 +23,10 @@ void func_header(char *s, int vars, int parms, int call)
 
        need_stack = (vars || parms) && call;
        if(need_stack) {
-#if 0
-               printf("\tenter $%d, $0\n", 8*(vars + parms + 2 /* fuer rax und r10 */));
-#else
                /* save the link register */
-               printf("\tmflr 0; stw 0,8(1)\n");
+               printf("\tmflr 0; stw 0,-8(1)\n");
                /* create the stack */
-               printf("\tstwu 1, -64(1)\n");
-#endif
+               printf("\tstwu 1, -80(1)\n");
        }
 }
 
@@ -42,14 +38,10 @@ char *get_func_name(void)
 void func_footer(void)
 {
        if(need_stack) {
-#if 0
-               printf("\tleave\n");
-#else
                /* remove stack frame */
-               printf("\taddi 1,1,64\n");
+               printf("\taddi 1,1,80\n");
                /* restore link register */
-               printf("\tlwz 0,8(1); mtlr 0\n");
-#endif
+               printf("\tlwz 0,-8(1); mtlr 0\n");
        }
        printf("\tblr\n\n\n");
 }
@@ -92,7 +84,7 @@ char *reg_64to8l(char *s)
 
 char *param_reg(int num)
 {
-       char *regs[] = {"3", "4", "5", "6", "7", "8", "9"};
+       char *regs[] = {"3", "4", "5", "6", "7", "8", "9", "10"};
        return regs[num];
 }
 
index 004dcdb9680dbef51b861cb30a7d996607eb7104..5c8eb271bff7e654c524451def330e78dc01a105 100644 (file)
@@ -1,6 +1,5 @@
 #ifndef __CHELPER_H
 #define __CHELPER_H
-#define VARBEGIN 5
 
 void func_header(char *s, int vars, int parms, int call);
 char *get_func_name(void);
index ea5636519ca218fc08360cc97de80dd58ecac3c1..97dc26946b5bf724e4ac394240e6ea599645fe04 100644 (file)
@@ -223,7 +223,7 @@ void make_call(struct treenode *bnode)
                printf("\tmr %s,20\n", param_reg(j));
        }
        printf("\t#vars pushen\n");
-       for(j = VARBEGIN; j > VARBEGIN - bnode->vars; j--) {
+       for(j = bnode->soffset; j < bnode->soffset + bnode->vars; j++) {
                printf("\tstw %s,%d(1)\n", param_reg(j), j*4);
        }
 
@@ -254,7 +254,7 @@ void make_call(struct treenode *bnode)
        }
 
        printf("\t#vars poppen\n");
-       for(j = VARBEGIN+1 - bnode->vars; j < VARBEGIN+1; j++) {
+       for(j = bnode->soffset + bnode->vars - 1; j > bnode->soffset - 1; j--) {
                printf("\tlwz %s,%d(1)\n", param_reg(j), j*4);
        }
 
index c0088d01c744f0e111c5423629726c161d1c6f81..ab8d442bb4d521a3568d5227f7da465f6dc9ee41 100644 (file)
@@ -178,14 +178,14 @@ Statement:
          @{
                /* tab_clone ist hier noetig, vgl. folgendes statement
                 * > var x := x - 1; */
-               @i @Statement.sout@ = tab_add_symbol(tab_clone(@Statement.sin@), @IDENT.name@, S_VAR, 1, VARBEGIN - @Statement.vars_in@, -1);
+               @i @Statement.sout@ = tab_add_symbol(tab_clone(@Statement.sin@), @IDENT.name@, S_VAR, 1, @Statement.gparamges@ + @Statement.vars_in@, -1);
                lblcountinout()
 
                @i @Statement.vars_out@ = @Statement.vars_in@ + 1;
 
                xxputsin(@Expr.s@,)
 
-               @i @Statement.node@ = new_node(O_ASSIGN, @Expr.node@, new_param(O_ID, @IDENT.name@, TREENULL, TREENULL, VARBEGIN - @Statement.vars_in@));
+               @i @Statement.node@ = new_node(O_ASSIGN, @Expr.node@, new_param(O_ID, @IDENT.name@, TREENULL, TREENULL, @Statement.gparamges@ + @Statement.vars_in@));
                @reg @Statement.node@->reg = @Expr.node@->reg = next_reg((char *)NULL, @Expr.gparamges@);
 
                @gen write_tree(@Statement.node@, 0); burm_label(@Statement.node@); burm_reduce(@Statement.node@, 1);