gesamt: sicheres umgehen mit den vars, aber dafuer mehr befehle wo es oft nicht
authorBernhard Urban <lewurm@gmail.com>
Mon, 7 Jun 2010 17:43:17 +0000 (19:43 +0200)
committerBernhard Urban <lewurm@gmail.com>
Mon, 7 Jun 2010 17:43:17 +0000 (19:43 +0200)
noetigt waere :( (vgl. lewurm_08.0 @ gesamt wo es z.b. noetigt ist...)

gesamt/chelper.c

index dd345b0934bf7e8db0b2810ba0a899d51c550326..ff621b47d2a1017bf369b702773f7342835129af 100644 (file)
@@ -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");
 }