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");
}
}
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");
}
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];
}
#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);
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);
}
}
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);
}
@{
/* 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);