Mercurial > hg-old > index.cgi
comparison lwasm/insn_gen.c @ 382:eacdae8a1575
Various bugfixes
author | lost@starbug |
---|---|
date | Sat, 15 May 2010 13:39:21 -0600 |
parents | 4867f18c872f |
children | 848d3cca8078 |
comparison
equal
deleted
inserted
replaced
381:1624a36f12a3 | 382:eacdae8a1575 |
---|---|
28 | 28 |
29 #include "lwasm.h" | 29 #include "lwasm.h" |
30 #include "instab.h" | 30 #include "instab.h" |
31 | 31 |
32 extern void insn_indexed_parse_aux(asmstate_t *as, line_t *l, char **p); | 32 extern void insn_indexed_parse_aux(asmstate_t *as, line_t *l, char **p); |
33 extern void insn_indexed_resolve_aux(asmstate_t *as, line_t *l, int force); | 33 extern void insn_indexed_resolve_aux(asmstate_t *as, line_t *l, int force, int elen); |
34 extern void insn_indexed_emit_aux(asmstate_t *as, line_t *l); | 34 extern void insn_indexed_emit_aux(asmstate_t *as, line_t *l); |
35 | 35 |
36 // "extra" is required due to the way OIM, EIM, TIM, and AIM work | 36 // "extra" is required due to the way OIM, EIM, TIM, and AIM work |
37 void insn_parse_gen_aux(asmstate_t *as, line_t *l, char **p) | 37 void insn_parse_gen_aux(asmstate_t *as, line_t *l, char **p) |
38 { | 38 { |
122 l -> len = OPLEN(instab[l -> insn].ops[1]) + l -> lint + 1; | 122 l -> len = OPLEN(instab[l -> insn].ops[1]) + l -> lint + 1; |
123 } | 123 } |
124 } | 124 } |
125 } | 125 } |
126 | 126 |
127 void insn_resolve_gen_aux(asmstate_t *as, line_t *l, int force) | 127 void insn_resolve_gen_aux(asmstate_t *as, line_t *l, int force, int elen) |
128 { | 128 { |
129 lw_expr_t *e; | 129 lw_expr_t *e; |
130 | 130 |
131 if (l -> lint2 == 1) | 131 if (l -> lint2 == 1) |
132 { | 132 { |
133 // indexed | 133 // indexed |
134 insn_resolve_indexed_aux(as, l, force); | 134 insn_resolve_indexed_aux(as, l, force, elen); |
135 goto out; | 135 goto out; |
136 } | 136 } |
137 | 137 |
138 if (l -> lint2 != -1) | 138 if (l -> lint2 != -1) |
139 return; | 139 return; |
185 lwasm_emitop(l, instab[l -> insn].ops[l -> lint2]); | 185 lwasm_emitop(l, instab[l -> insn].ops[l -> lint2]); |
186 | 186 |
187 if (extra != -1) | 187 if (extra != -1) |
188 lwasm_emit(l, extra); | 188 lwasm_emit(l, extra); |
189 | 189 |
190 if (l, l -> lint2 == 1) | 190 if (l -> lint2 == 1) |
191 { | 191 { |
192 lwasm_emit(l, l -> pb); | 192 lwasm_emit(l, l -> pb); |
193 lwasm_emitexpr(l, e, l -> lint); | 193 if (l -> lint > 0) |
194 lwasm_emitexpr(l, e, l -> lint); | |
194 return; | 195 return; |
195 } | 196 } |
196 | 197 |
197 if (l -> lint2 == 2) | 198 if (l -> lint2 == 2) |
198 lwasm_emitexpr(l, e, 2); | 199 lwasm_emitexpr(l, e, 2); |
217 { | 218 { |
218 if (l -> len != -1) | 219 if (l -> len != -1) |
219 return; | 220 return; |
220 | 221 |
221 // handle non-immediate | 222 // handle non-immediate |
222 insn_resolve_gen_aux(as, l, force); | 223 insn_resolve_gen_aux(as, l, force, 0); |
223 } | 224 } |
224 | 225 |
225 EMITFUNC(insn_emit_gen0) | 226 EMITFUNC(insn_emit_gen0) |
226 { | 227 { |
227 insn_emit_gen_aux(as, l, -1); | 228 insn_emit_gen_aux(as, l, -1); |
269 { | 270 { |
270 if (l -> len != -1) | 271 if (l -> len != -1) |
271 return; | 272 return; |
272 | 273 |
273 // handle non-immediate | 274 // handle non-immediate |
274 insn_resolve_gen_aux(as, l, force); | 275 insn_resolve_gen_aux(as, l, force, 0); |
275 } | 276 } |
276 | 277 |
277 EMITFUNC(insn_emit_gen8) | 278 EMITFUNC(insn_emit_gen8) |
278 { | 279 { |
279 if (l -> lint2 == 3) | 280 if (l -> lint2 == 3) |
330 { | 331 { |
331 if (l -> len != -1) | 332 if (l -> len != -1) |
332 return; | 333 return; |
333 | 334 |
334 // handle non-immediate | 335 // handle non-immediate |
335 insn_resolve_gen_aux(as, l, force); | 336 insn_resolve_gen_aux(as, l, force, 0); |
336 } | 337 } |
337 | 338 |
338 EMITFUNC(insn_emit_gen16) | 339 EMITFUNC(insn_emit_gen16) |
339 { | 340 { |
340 if (l -> lint2 == 3) | 341 if (l -> lint2 == 3) |
391 { | 392 { |
392 if (l -> len != -1) | 393 if (l -> len != -1) |
393 return; | 394 return; |
394 | 395 |
395 // handle non-immediate | 396 // handle non-immediate |
396 insn_resolve_gen_aux(as, l, force); | 397 insn_resolve_gen_aux(as, l, force, 0); |
397 } | 398 } |
398 | 399 |
399 EMITFUNC(insn_emit_gen32) | 400 EMITFUNC(insn_emit_gen32) |
400 { | 401 { |
401 if (l -> lint2 == 3) | 402 if (l -> lint2 == 3) |