codea: schoenerer ansatz bei der registerauswahl
[uebersetzerbau-ss10.git] / codea / tree.c
index 9ee0b479161005c252aa2b103b4c5c2488589ed2..82d986a6fa921f2921683c615d361be301041d5e 100644 (file)
@@ -22,16 +22,21 @@ static struct treenode *_new_plain(int op)
 
 struct treenode *new_node(int op, struct treenode *l, struct treenode *r, int exprcount)
 {
-       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, exprcount);
+               free(l); free(r);
+       } else  {
+               new = _new_plain(op);
+               new->kids[0] = l;
+               new->kids[1] = r;
+               new->exprcount = exprcount;
+       }
        new->name = (char *)NULL;
-       new->exprcount = exprcount;
        return new;
 }
 
@@ -47,13 +52,39 @@ 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 = new_node(O_FIELD, l, r, exprcount);
+
+#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, int exprcount)
 {
-       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
@@ -76,6 +107,7 @@ 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);
        if(node->kids[0] != TREENULL) {