projects
/
uebersetzerbau-ss10.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
codea: optimierungen mit lea
[uebersetzerbau-ss10.git]
/
codea
/
tree.c
diff --git
a/codea/tree.c
b/codea/tree.c
index 7e7c715fab3f69dce60e446701a4b591147ccb7b..098f975e14bb3442c29cc0951becc55d2c6dcfce 100644
(file)
--- a/
codea/tree.c
+++ b/
codea/tree.c
@@
-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_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
#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->name = (char *)NULL;
- new->exprcount = exprcount;
return new;
}
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_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);
/* 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);
#ifdef DDTREE
fprintf(stderr, "new_number: %i\n", val);