#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include "tree.h"
-#if 1
+#if 0
#define DDTREE
#endif
-struct treenode *new_node(int op, struct treenode *l, struct treenode *r)
+static struct treenode *_new_plain(int op)
{
struct treenode *new = (TREECAST) malloc(TREESIZE);
+ new->op = op;
+ new->kids[0] = new->kids[1] = TREENULL;
+ new->parent = TREENULL;
+ new->label = NULL;
+ new->name = new->reg = (char *)NULL;
+ new->val = 0;
+ new->param_index = -1;
+ return new;
+}
+
+struct treenode *new_node(int op, struct treenode *l, struct treenode *r)
+{
+ struct treenode *new = TREENULL;
#ifdef DDTREE
fprintf(stderr, "new_node: %i (%s)\n", op, o_names[op]);
#endif
-
- new->kids[0] = l;
- new->kids[1] = r;
- new->op = op;
+ if(op == O_SUB && l != TREENULL && r != TREENULL && l->op == O_NUM && r->op == O_NUM) {
+ new = new_number(l->val - r->val);
+ free(l); free(r);
+ } else {
+ new = _new_plain(op);
+ new->kids[0] = l;
+ new->kids[1] = r;
+ }
new->name = (char *)NULL;
return new;
}
+struct treenode *new_param(int op, char *name, struct treenode *l, struct treenode *r, int param_index)
+{
+ struct treenode *new = new_node(op, l, r);
+
+#ifdef DDTREE
+ fprintf(stderr, "new_param: %i (index)\n", param_index);
+#endif
+ new->param_index = param_index;
+ new->name = name;
+ return new;
+}
+
+struct treenode *new_field(char *name, struct treenode *l, struct treenode *r, int soffset)
+{
+ struct treenode *new = new_node(O_FIELD, l, r);
+
+#ifdef DDTREE
+ fprintf(stderr, "new_field: %i (soffset)\n", soffset);
+#endif
+ new->soffset = soffset;
+ new->name = name;
+ return new;
+}
+
+struct treenode *new_number(long val)
+{
+ struct treenode *new;
+ /* TODO: maximal groesse? */
+#define BUFMAX 40
+ char *t = (char*) malloc(BUFMAX);
+
+ if (val == 0) {
+ new = _new_plain(O_NULL);
+ } else if(val == -1) {
+ new = _new_plain(O_MONE);
+ } else if(val == -2) {
+ new = _new_plain(O_MTWO);
+ } else if(val == -4) {
+ new = _new_plain(O_MFOUR);
+ } else if(val == -8) {
+ new = _new_plain(O_MEIGHT);
+ } else {
+ new = _new_plain(O_NUM);
+ }
+
+#ifdef DDTREE
+ fprintf(stderr, "new_number: %i\n", val);
+#endif
+ new->val = val;
+ memset(t, 0, BUFMAX);
+ sprintf(t, "%li", val);
+ new->name = t;
+
+ return new;
+}
+
+static void write_indent(int i)
+{
+ int a;
+ for(a = 0; a < i; a++) {
+ fprintf(stderr, "| ");
+ }
+}
+
+void write_tree(struct treenode *node, int indent)
+{
+ if(node == TREENULL) return;
+ write_indent(indent);
+ fprintf(stderr, "%s @ %%%s. \"%s\"\n", o_names[node->op], node->reg, node->name == (char*) NULL ? "" : node->name);
+ if(node->kids[0] != TREENULL) {
+ write_tree(node->kids[0], indent+1);
+ }
+ if(node->kids[1] != TREENULL) {
+ write_tree(node->kids[1], indent+1);
+ }
+}
+