arm64: codea/abgabe_aa.0
[uebersetzerbau-ss10.git] / codea / tree.c
index 7e7c715fab3f69dce60e446701a4b591147ccb7b..593709c5c71ce7fc17171a07eef934013ec3af5d 100644 (file)
@@ -15,29 +15,33 @@ static struct treenode *_new_plain(int op)
        new->parent = TREENULL;
        new->label = NULL;
        new->name = new->reg = (char *)NULL;
-       new->val = new->skip = new->exprcount = 0;
+       new->val = 0;
        new->param_index = -1;
        return new;
 }
 
-struct treenode *new_node(int op, struct treenode *l, struct treenode *r, int exprcount)
+struct treenode *new_node(int op, struct treenode *l, struct treenode *r)
 {
-       struct treenode *new = _new_plain(op);
+       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;
+       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;
-       new->exprcount = exprcount;
        return new;
 }
 
-struct treenode *new_param(int op, char *name, struct treenode *l, struct treenode *r, int param_index, int exprcount)
+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, exprcount);
+       struct treenode *new = new_node(op, l, r);
 
 #ifdef DDTREE
        fprintf(stderr, "new_param: %i (index)\n", param_index);
@@ -47,9 +51,9 @@ struct treenode *new_param(int op, char *name, struct treenode *l, struct treeno
        return new;
 }
 
-struct treenode *new_field(char *name, struct treenode *l, struct treenode *r, int soffset, int exprcount)
+struct treenode *new_field(char *name, struct treenode *l, struct treenode *r, int soffset)
 {
-       struct treenode *new = new_node(O_FIELD, l, r, exprcount);
+       struct treenode *new = new_node(O_FIELD, l, r);
 
 #ifdef DDTREE
        fprintf(stderr, "new_field: %i (soffset)\n", soffset);
@@ -59,18 +63,31 @@ struct treenode *new_field(char *name, struct treenode *l, struct treenode *r, i
        return new;
 }
 
-struct treenode *new_number(long val, int exprcount)
+struct treenode *new_number(long val)
 {
-       struct treenode *new = _new_plain(O_NUM);
+       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;
-       new->exprcount = exprcount;
        memset(t, 0, BUFMAX);
        sprintf(t, "%li", val);
        new->name = t;
@@ -88,8 +105,9 @@ static void write_indent(int i)
 
 void write_tree(struct treenode *node, int indent)
 {
+       if(node == TREENULL) return;
        write_indent(indent);
-       fprintf(stderr, "%s @ %%%s (%i). \"%s\"\n", o_names[node->op], node->reg, node->exprcount, node->name == (char*) NULL ? "" : node->name);
+       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);
        }