Mercurial > hg-old > index.cgi
comparison lwasm/pass3.c @ 365:6a98cc90c14f
Added resolve passes
author | lost@starbug |
---|---|
date | Wed, 14 Apr 2010 20:49:04 -0600 |
parents | 0b5a26bedbe1 |
children |
comparison
equal
deleted
inserted
replaced
364:0b5a26bedbe1 | 365:6a98cc90c14f |
---|---|
37 until nothing more reduces | 37 until nothing more reduces |
38 | 38 |
39 */ | 39 */ |
40 void do_pass3(asmstate_t *as) | 40 void do_pass3(asmstate_t *as) |
41 { | 41 { |
42 int rc; | |
43 line_t *cl; | |
44 struct line_expr_s *le; | |
45 | |
46 do | |
47 { | |
48 rc = 0; | |
49 for (cl = as -> line_head; cl; cl = cl -> next) | |
50 { | |
51 as -> cl = cl; | |
52 | |
53 // simplify address | |
54 lwasm_reduce_expr(as, cl -> addr); | |
55 | |
56 // simplify each expression | |
57 for (le = cl -> exprs; le; le = le -> next) | |
58 lwasm_reduce_expr(as, le -> expr); | |
59 | |
60 if (cl -> len == -1) | |
61 { | |
62 // try resolving the instruction length | |
63 // but don't force resolution | |
64 if (cl -> insn >= 0 && instab[cl -> insn].resolve) | |
65 { | |
66 (instab[cl -> insn].resolve)(as, cl, 0); | |
67 if (cl -> len != -1) | |
68 rc++; | |
69 } | |
70 } | |
71 } | |
72 if (as -> errorcount > 0) | |
73 return; | |
74 } while (rc > 0); | |
42 } | 75 } |