/* 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("\tpushq %%rbp\n"
- "\tmovq %%rsp, %%rbp\n"
- "\tsubq $%d, %%rsp\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));
+ }
}
}
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");
}