arm64: codea/abgabe_aa.0
[uebersetzerbau-ss10.git] / gesamt_arm / tree.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include "tree.h"
5
6 #if 0
7 #define DDTREE
8 #endif
9
10 static struct treenode *_new_plain(int op)
11 {
12         struct treenode *new = (TREECAST) malloc(TREESIZE);
13         new->op = op;
14         new->kids[0] = new->kids[1] = TREENULL;
15         new->parent = TREENULL;
16         new->label = NULL;
17         new->name = new->reg = (char *)NULL;
18         new->val = new->paramges = new->vars = 0;
19         new->param_index = -1;
20         return new;
21 }
22
23 struct treenode *new_nothing(void)
24 {
25         return new_node(O_NOTHING, TREENULL, TREENULL);
26 }
27
28 struct treenode *new_node(int op, struct treenode *l, struct treenode *r)
29 {
30         struct treenode *new = TREENULL;
31
32 #ifdef DDTREE
33         fprintf(stderr, "new_node: %i (%s)\n", op, o_names[op]);
34 #endif
35         if(op == O_SUB && l != TREENULL && r != TREENULL && l->op == O_NUM && r->op == O_NUM) {
36                 new = new_number(l->val - r->val);
37                 free(l); free(r);
38         } else  {
39                 new = _new_plain(op);
40                 new->kids[0] = l;
41                 new->kids[1] = r;
42         }
43         new->name = (char *)NULL;
44         return new;
45 }
46
47 struct treenode *new_param(int op, char *name, struct treenode *l, struct treenode *r, int param_index)
48 {
49         struct treenode *new = new_node(op, l, r);
50
51 #ifdef DDTREE
52         fprintf(stderr, "new_param: %i (index)\n", param_index);
53 #endif
54         new->param_index = param_index;
55         new->name = name;
56         return new;
57 }
58
59 struct treenode *new_field(char *name, struct treenode *l, struct treenode *r, int soffset)
60 {
61         struct treenode *new = new_node(O_FIELD, l, r);
62
63 #ifdef DDTREE
64         fprintf(stderr, "new_field: %i (soffset)\n", soffset);
65 #endif
66         new->soffset = soffset;
67         new->name = name;
68         return new;
69 }
70
71 struct treenode *new_arg(struct treenode *l, struct treenode *r, int soffset)
72 {
73         struct treenode *new = new_node(O_ARG, l, r);
74
75 #ifdef DDTREE
76         fprintf(stderr, "new_arg: %i (soffset)\n", soffset);
77 #endif
78         new->soffset = soffset;
79         new->name = (char *) malloc(10);
80         sprintf(new->name, "%i", soffset);
81         return new;
82 }
83
84 struct treenode *new_call(char *name, struct treenode *l, struct treenode *r, int paramges, int vars)
85 {
86         struct treenode *new = new_node(O_CALL, l, r);
87
88 #ifdef DDTREE
89         fprintf(stderr, "new_call\n");
90 #endif
91         new->name = name;
92         new->paramges = paramges;
93         new->vars = vars;
94         return new;
95 }
96
97 struct treenode *new_number(long val)
98 {
99         struct treenode *new;
100         /* TODO: maximal groesse? */
101 #define BUFMAX 40
102         char *t = (char*) malloc(BUFMAX);
103
104         if (val == 0) {
105                 new = _new_plain(O_NULL);
106         } else if(val == -1) {
107                 new = _new_plain(O_MONE);
108         } else if(val == -2) {
109                 new = _new_plain(O_MTWO);
110         } else if(val == -4) {
111                 new = _new_plain(O_MFOUR);
112         } else if(val == -8) {
113                 new = _new_plain(O_MEIGHT);
114         } else {
115                 new = _new_plain(O_NUM);
116         }
117
118 #ifdef DDTREE
119         fprintf(stderr, "new_number: %i\n", val);
120 #endif
121         new->val = val;
122         memset(t, 0, BUFMAX);
123         sprintf(t, "%li", val);
124         new->name = t;
125
126         return new;
127 }
128
129 static void write_indent(int i)
130 {
131         int a;
132         for(a = 0; a < i; a++) {
133                 fprintf(stderr, "| ");
134         }
135 }
136
137 void write_tree(struct treenode *node, int indent)
138 {
139         if(node == TREENULL) return;
140         write_indent(indent);
141         fprintf(stderr, "%s @ %%%s. \"%s\"\n", o_names[node->op], node->reg, node->name == (char*) NULL ? "" : node->name);
142         if(node->kids[0] != TREENULL) {
143                 write_tree(node->kids[0], indent+1);
144         }
145         if(node->kids[1] != TREENULL) {
146                 write_tree(node->kids[1], indent+1);
147         }
148 }
149