as: Fold labels with known values - scc - simple c99 compiler (HTM) git clone git://git.simple-cc.org/scc (DIR) Log (DIR) Files (DIR) Refs (DIR) Submodules (DIR) README (DIR) LICENSE --- (DIR) commit 774054fa8b77986acb2fa39f0bfe2a8c642b32c5 (DIR) parent 676d846b1588b139ee9192f9e5d5a90f74fa5ec5 (HTM) 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: M src/cmd/as/expr.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) --- (DIR) 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;