6 /* char *function_name; */
7 /* char *reg_return; */
8 extern char *saved_reg;
10 char *reg_names[]={"rax", "r10", "r11", "r9", "r8", "rcx", "rdx", "rsi", "rdi"};
12 void function_header(char *name, int vars, int has_call, int num_pars) {
15 variables = vars+(has_call ? num_pars : 0);
16 printf("# setting call to %i\n", has_call);
19 printf("\t.globl %s\n\t.type %s, @function\n%s:\n", name, name, name);
20 printf("# %i %i %i %i\n",vars,has_call,num_pars,(has_call ? num_pars : 0));
21 if(vars+(has_call ? num_pars : 0)>0) {
22 printf("\tpushq %%rbp\n\tmovq %%rsp, %%rbp\n\tsubq $%i, %%rsp\n", 8*(vars+num_pars));
23 if(num_pars>0 && has_call) {
24 for(a=0;a<num_pars;a++) {
25 printf("\tmovq %%%s, %i(%%rsp)\n",get_param_reg(a+1),8*(vars+num_pars-a-1));
31 void prepare_call(char *function, char *reg_return) {
33 /* TODO don't save all registers */
35 printf("\tpushq %%%s\n",reg_names[a]);
39 void do_call(char *function, char *reg_return) {
41 /* TODO don't restore all registers */
42 printf("\tcall %s\n", function);
43 move("rax",reg_return);
44 /* TODO return value? */
46 if(strcmp(reg_return,reg_names[a])) {
47 printf("\tpopq %%%s\n",reg_names[a]);
50 printf("\taddq $8, %%rsp\n");
55 char *get_next_reg(char *name, int skip_reg) {
57 if(name==(char *)NULL) {
62 if(!strcmp(name,reg_names[a])) {
74 return reg_names[index];
77 char *get_next_param_reg(char *reg) {
80 if(strcmp(get_param_reg(a),reg)==0) {
81 return get_param_reg(a+1);
87 char *get_param_reg(long number) {
88 char *reg_names[]={"rdi", "rsi", "rdx", "rcx", "r8", "r9"};
89 return reg_names[number-1];
99 void move(char *src, char *dst) {
100 if(strcmp(src,dst)) {
101 printf("\tmovq %%%s, %%%s\n",src,dst);