codea: optimierungen mit lea
[uebersetzerbau-ss10.git] / codea / tree.c
index 7e7c715fab3f69dce60e446701a4b591147ccb7b..098f975e14bb3442c29cc0951becc55d2c6dcfce 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;
 }
 
@@ -61,10 +66,21 @@ struct treenode *new_field(char *name, struct treenode *l, struct treenode *r, i
 
 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 == -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 if(val == -1) {
+               new = _new_plain(O_MONE);
+       } else {
+               new = _new_plain(O_NUM);
+       }
 
 #ifdef DDTREE
        fprintf(stderr, "new_number: %i\n", val);