X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=gesamt%2Fchelper.c;h=edef8449a52f5522147691e48a72578faa50dd2e;hb=dc9777f5c4d517c8c4f2888449250c8f187f2fa6;hp=b4831a70d19754c9e0ccc6584b418d84ddde7a13;hpb=1016ac04fb98f0e5de8ff18711518b3113e2c7ce;p=uebersetzerbau-ss10.git diff --git a/gesamt/chelper.c b/gesamt/chelper.c index b4831a7..edef844 100644 --- a/gesamt/chelper.c +++ b/gesamt/chelper.c @@ -14,10 +14,20 @@ static char *regs8l[] = {"al", "r10b", "r11b", "r9b"}; /* ja, dirty.. */ static char *akt_func_name = (char*) NULL; -void func_header(char *s) +static char need_stack = 0; + +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); akt_func_name = s; + + need_stack = (vars || parms) && call; + if(need_stack) { + printf("\tpushq %%rbp\n" + "\tmovq %%rsp, %%rbp\n", + "\tsubq $%d, %%rsp\n", 8*(vars+parms)); + } } char *get_func_name(void) @@ -27,6 +37,8 @@ char *get_func_name(void) void func_footer(void) { + if(need_stack) + printf("\tleave\n"); printf("\tret\n"); }