From 2286a935e6993a6bc756cf1a05b3b170229cd83f Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Mon, 7 Jun 2010 19:43:17 +0200 Subject: [PATCH] gesamt: sicheres umgehen mit den vars, aber dafuer mehr befehle wo es oft nicht noetigt waere :( (vgl. lewurm_08.0 @ gesamt wo es z.b. noetigt ist...) --- gesamt/chelper.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/gesamt/chelper.c b/gesamt/chelper.c index dd345b0..ff621b4 100644 --- a/gesamt/chelper.c +++ b/gesamt/chelper.c @@ -15,16 +15,29 @@ static char *regs8l[] = {"al", "r10b", "r11b", "r9b"}; /* ja, dirty.. */ static char *akt_func_name = (char*) NULL; static char need_stack = 0; +static int gvars; void func_header(char *s, int vars, int parms, int call) { printf("\t.globl %1$s\n\t.type %1$s, @function\n%1$s:\n", s); - printf("\t//vars: %i, parms: %i, call(bool): %i\n", vars, parms, call); + printf("\t//vars-> %i, parms-> %i, call(bool)-> %i\n", vars, parms, call); akt_func_name = s; +#if 0 need_stack = (vars || parms) && call; +#else + need_stack = vars || (parms && call); + gvars = vars; +#endif if(need_stack) { - printf("\tenter $%d, $0\n", 8*(vars + parms + 2 /* fuer rax und r10 */)); + /* 2 * 7 fuer paramterregs reservieren + 2 fuer rax und r10 */ + printf("\tenter $%d, $0\n", 8*(2*7 + 2)); + + int j; + printf("\t//vars pushen\n"); /* koennten parameter enthalten von anderen fkts... */ + for(j = VARBEGIN; j > VARBEGIN - vars; j--) { + printf("\tpushq %%%s\n", param_reg(j)); + } } } @@ -35,8 +48,14 @@ char *get_func_name(void) void func_footer(void) { - if(need_stack) + if(need_stack) { + int j; + /* vars poppen */ + for(j = VARBEGIN+1 - gvars; j < VARBEGIN+1; j++) { + printf("\tpopq %%%s\n", param_reg(j)); + } printf("\tleave\n"); + } printf("\tret\n\n\n"); } -- 2.25.1