doc: paulchen beispiele {code{a,b},gesamt} entpackt (jedes mal entpacken nervt langsa...
[uebersetzerbau-ss10.git] / aus_sammelwut / paulchen / ublu / ss08 / abgabe / codeb / code_gen.c
1 #include <stdio.h>
2 #include <string.h>
3 #include "code_gen.h"
4
5 int variables;
6
7 void function_header(char *name, int vars) {
8         variables = vars;
9         printf("\t.globl %s\n\t.type %s, @function\n%s:\n", name, name, name);
10         if(vars>0) {
11                 printf("\tpushq %%rbp\n\tmovq %%rsp, %%rbp\n\tsubq $%i, %%rsp\n", 8*vars);
12         }
13 }
14
15 char *get_next_reg(char *name, int skip_reg) {
16         char *reg_names[]={"rax", "r10", "r11", "r9", "r8", "rcx", "rdx", "rsi", "rdi"};
17         int index, a;
18         if(name==(char *)NULL) {
19                 index=0;
20         }
21         else {
22                 for(a=0;a<9;a++) {
23                         if(!strcmp(name,reg_names[a])) {
24                                 index=a+1;
25                                 break;
26                         }
27                 }
28         }
29         if(skip_reg) {
30                 index++;
31         }
32         return reg_names[index];
33 }
34
35 char *get_param_reg(long number) {
36         char *reg_names[]={"rdi", "rsi", "rdx", "rcx", "r8", "r9"};
37         return reg_names[number-1];
38 }
39
40 void ret(void) {
41         if(variables>0) {
42                 printf("\tleave\n");
43         }
44         printf("\tret\n");
45 }
46
47 void move(char *src, char *dst) {
48         if(strcmp(src,dst)) {
49                 printf("\tmovq %%%s, %%%s\n",src,dst);
50         }
51 }
52