Mercurial > hg > index.cgi
comparison lwasm/pass4.c @ 201:4503199d56ba
Short circuit unneeded loops in pass4
Added debugging messages to deduce why pass4.c ran so slow. Short circuit
unneeded looping yields approx. 70% reduction in execution time.
author | William Astle <lost@l-w.ca> |
---|---|
date | Fri, 16 Mar 2012 22:22:14 -0600 |
parents | 348e2816ce32 |
children | 8beb109dfd69 |
comparison
equal
deleted
inserted
replaced
200:348e2816ce32 | 201:4503199d56ba |
---|---|
54 debug_message(as, 60, "%d unresolved instructions", cnt); | 54 debug_message(as, 60, "%d unresolved instructions", cnt); |
55 | 55 |
56 // find an unresolved instruction | 56 // find an unresolved instruction |
57 for ( ; sl && sl -> len != -1; sl = sl -> next) | 57 for ( ; sl && sl -> len != -1; sl = sl -> next) |
58 { | 58 { |
59 debug_message(as, 200, "Search line %p", sl); | |
59 as -> cl = sl; | 60 as -> cl = sl; |
60 lwasm_reduce_expr(as, sl -> addr); | 61 lwasm_reduce_expr(as, sl -> addr); |
61 lwasm_reduce_expr(as, sl -> daddr); | 62 lwasm_reduce_expr(as, sl -> daddr); |
62 | 63 |
63 // simplify each expression | 64 // simplify each expression |
64 for (le = sl -> exprs; le; le = le -> next) | 65 for (le = sl -> exprs; le; le = le -> next) |
65 lwasm_reduce_expr(as, le -> expr); | 66 lwasm_reduce_expr(as, le -> expr); |
66 } | 67 } |
67 | 68 |
69 debug_message(as, 200, "Found line %p", sl); | |
68 // simplify address | 70 // simplify address |
69 as -> cl = sl; | 71 as -> cl = sl; |
70 lwasm_reduce_expr(as, sl -> addr); | 72 lwasm_reduce_expr(as, sl -> addr); |
71 lwasm_reduce_expr(as, sl -> daddr); | 73 lwasm_reduce_expr(as, sl -> daddr); |
72 | 74 |
76 | 78 |
77 | 79 |
78 if (sl -> len == -1 && sl -> insn >= 0 && instab[sl -> insn].resolve) | 80 if (sl -> len == -1 && sl -> insn >= 0 && instab[sl -> insn].resolve) |
79 { | 81 { |
80 (instab[sl -> insn].resolve)(as, sl, 1); | 82 (instab[sl -> insn].resolve)(as, sl, 1); |
83 debug_message(as, 200, "Try resolve = %d/%d", sl -> len, sl -> dlen); | |
81 if (force && sl -> len == -1 && sl -> dlen == -1) | 84 if (force && sl -> len == -1 && sl -> dlen == -1) |
82 { | 85 { |
83 lwasm_register_error(as, sl, "Instruction failed to resolve."); | 86 lwasm_register_error(as, sl, "Instruction failed to resolve."); |
84 return; | 87 return; |
85 } | 88 } |
86 } | 89 } |
87 cnt--; | 90 if (sl -> len != -1 && sl -> dlen != -1) |
88 if (cnt == 0) | 91 { |
89 return; | 92 cnt--; |
93 if (cnt == 0) | |
94 return; | |
95 | |
96 // this one resolved - try looking for the next one instead | |
97 // of wasting time running through the rest of the lines | |
98 continue; | |
99 } | |
90 | 100 |
91 do | 101 do |
92 { | 102 { |
103 debug_message(as, 200, "Flatten after..."); | |
93 rc = 0; | 104 rc = 0; |
94 for (cl = sl; cl; cl = cl -> next) | 105 for (cl = sl; cl; cl = cl -> next) |
95 { | 106 { |
107 debug_message(as, 200, "Flatten line %p", cl); | |
96 as -> cl = cl; | 108 as -> cl = cl; |
97 | 109 |
98 // simplify address | 110 // simplify address |
99 lwasm_reduce_expr(as, cl -> addr); | 111 lwasm_reduce_expr(as, cl -> addr); |
100 lwasm_reduce_expr(as, cl -> daddr); | 112 lwasm_reduce_expr(as, cl -> daddr); |
114 if (cl -> len == 0) | 126 if (cl -> len == 0) |
115 cl -> len = cl -> dlen; | 127 cl -> len = cl -> dlen; |
116 else | 128 else |
117 cl -> dlen = cl -> len; | 129 cl -> dlen = cl -> len; |
118 } | 130 } |
131 debug_message(as, 200, "Flatten resolve returns %d", cl -> len); | |
119 if (cl -> len != -1 && cl -> dlen != -1) | 132 if (cl -> len != -1 && cl -> dlen != -1) |
120 { | 133 { |
121 rc++; | 134 rc++; |
122 cnt--; | 135 cnt--; |
123 if (cnt == 0) | 136 if (cnt == 0) |