# HG changeset patch # User William Astle # Date 1406848811 21600 # Node ID 30b2bad9b5eb4bb0599488c5b7fc0cfd377bbda9 # Parent af78bad4922cff0368e0942c0c92bf0255d27d1c Factor some code for simplifying lines so it can be reused diff -r af78bad4922c -r 30b2bad9b5eb lwasm/lwasm.c --- a/lwasm/lwasm.c Fri May 02 21:30:25 2014 -0600 +++ b/lwasm/lwasm.c Thu Jul 31 17:20:11 2014 -0600 @@ -31,6 +31,7 @@ #include #include "lwasm.h" +#include "instab.h" void lwasm_register_error(asmstate_t *as, line_t *l, const char *msg, ...); @@ -1095,3 +1096,47 @@ return -1; return 0; } + +void lwasm_reduce_line_exprs(line_t *cl) +{ + asmstate_t *as; + struct line_expr_s *le; + int i; + + as = cl -> as; + as -> cl = cl; + + // simplify address + lwasm_reduce_expr(as, cl -> addr); + + // simplify data address + lwasm_reduce_expr(as, cl -> daddr); + + // simplify each expression + for (i = 0, le = cl -> exprs; le; le = le -> next, i++) + { + lwasm_reduce_expr(as, le -> expr); + debug_message(as, 100, "Reduce expressions: exp[%d] = %s", i, lw_expr_print(le -> expr)); + } + + if (cl -> len == -1 || cl -> dlen == -1) + { + // try resolving the instruction length + // but don't force resolution + if (cl -> insn >= 0 && instab[cl -> insn].resolve) + { + (instab[cl -> insn].resolve)(as, cl, 0); + if ((cl -> inmod == 0) && cl -> len >= 0 && cl -> dlen >= 0) + { + if (cl -> len == 0) + cl -> len = cl -> dlen; + else + cl -> dlen = cl -> len; + } + } + } + debug_message(as, 100, "Reduce expressions: len = %d", cl -> len); + debug_message(as, 100, "Reduce expressions: dlen = %d", cl -> dlen); + debug_message(as, 100, "Reduce expressions: addr = %s", lw_expr_print(cl -> addr)); + debug_message(as, 100, "Reduce expressions: daddr = %s", lw_expr_print(cl -> daddr)); +} diff -r af78bad4922c -r 30b2bad9b5eb lwasm/lwasm.h --- a/lwasm/lwasm.h Fri May 02 21:30:25 2014 -0600 +++ b/lwasm/lwasm.h Thu Jul 31 17:20:11 2014 -0600 @@ -354,6 +354,8 @@ extern int lwasm_calculate_range(asmstate_t *as, lw_expr_t expr, int *min, int *max); +extern void lwasm_reduce_line_exprs(line_t *cl); + #endif extern void debug_message(asmstate_t *as, int level, const char *fmt, ...); diff -r af78bad4922c -r 30b2bad9b5eb lwasm/pass1.c --- a/lwasm/pass1.c Fri May 02 21:30:25 2014 -0600 +++ b/lwasm/pass1.c Thu Jul 31 17:20:11 2014 -0600 @@ -338,8 +338,6 @@ if (as -> instruct == 0 || instab[opnum].flags & lwasm_insn_struct) { - struct line_expr_s *le; - cl -> len = -1; // call parse function debug_message(as, 100, "len = %d, dlen = %d", cl -> len, cl -> dlen); @@ -359,28 +357,7 @@ } /* do a reduction on the line expressions to avoid carrying excessive expression baggage if not needed */ - as -> cl = cl; - - // simplify address - lwasm_reduce_expr(as, cl -> addr); - - // simplify each expression - for (le = cl -> exprs; le; le = le -> next) - lwasm_reduce_expr(as, le -> expr); - - /* try resolving the instruction as well */ - if (cl -> insn >= 0 && instab[cl -> insn].resolve) - { - (instab[cl -> insn].resolve)(as, cl, 0); - if ((cl -> inmod == 0) && cl -> len >= 0 && cl -> dlen >= 0) - { - if (cl -> len == 0) - cl -> len = cl -> dlen; - else - cl -> dlen = cl -> len; - } - } - + lwasm_reduce_line_exprs(cl); } else if (as -> instruct == 1) {