commit 774054fa8b77986acb2fa39f0bfe2a8c642b32c5
parent 676d846b1588b139ee9192f9e5d5a90f74fa5ec5
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date: Sat, 10 Feb 2024 22:54:28 +0100
as: Fold labels with known values
When a label has a constant value then it can be fold like
any other number.
Diffstat:
1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/src/cmd/as/expr.c b/src/cmd/as/expr.c
@@ -36,12 +36,25 @@ deltree(Node *np)
delete(arena, np);
}
+static int
+constant(Node *np)
+{
+ if (np->op == NUMBER)
+ return 1;
+ if (np->op == IDEN && np->sym->flags & FDEF)
+ return 1;
+ return 0;
+}
+
static Node *
fold(int op, Node *l, Node *r)
{
Node *np;
TUINT val, lv, rv;
+ if (!constant(l) || !constant(r))
+ return NULL;
+
lv = l->sym->value;
rv = r->sym->value;
@@ -115,10 +128,10 @@ binary(int op, Node *l, Node *r)
int addr;
Node *np;
- if (l->op == NUMBER && r->op == NUMBER)
- return fold(op, l, r);
- else
- abort();
+ if ((np = fold(op, l, r)) != NULL)
+ return np;
+ abort();
+
np = node(op, l, r);
np->addr = addr;