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)