comparison lwasm/insn_indexed.c @ 360:7d91ab7ac7d6

Indexed stage 2; set line structure to track pragmas in effect for that line
author lost@starbug
date Thu, 01 Apr 2010 18:39:40 -0600
parents f50a54d0293a
children 9c24d9d485b9
comparison
equal deleted inserted replaced
359:f50a54d0293a 360:7d91ab7ac7d6
284 { 284 {
285 l -> len = OPLEN(instab[l -> insn].ops[0]) + l -> lint + 1; 285 l -> len = OPLEN(instab[l -> insn].ops[0]) + l -> lint + 1;
286 } 286 }
287 } 287 }
288 288
289 void insn_resolve_indexed_aux(asmstate_t *as, line_t *l) 289 void insn_resolve_indexed_aux(asmstate_t *as, line_t *l, int force)
290 { 290 {
291 // here, we have an expression which needs to be
292 // resolved; the post byte is determined here as well
293 lw_expr_t e;
294
295 e = lwasm_fetch_expr(l, 0);
296 if (lw_expr_istype(e, lw_expr_type_int))
297 {
298 // we know how big it is
299 int v;
300 v = lw_expr_intval(e);
301 if (v < -128 || v > 127)
302 {
303 l -> lint = 2;
304 switch (l -> pb & 0x07)
305 {
306 case 0:
307 case 1:
308 case 2:
309 case 3:
310 v = 0x89 | (l -> pb & 0x03) | (0x10 * (l -> pb & 0x80));
311 break;
312
313 case 4: // W
314 v = (l -> pb & 0x80) ? 0xD0 : 0xCF;
315 break;
316
317 case 5: // PCR
318 case 6: // PC
319 v = (l -> pb & 0x80) ? 0x9D : 0x8D;
320 break;
321 }
322
323 return;
324 }
325 else if ((l -> pb & 0x80) || ((l -> pb & 0x07) > 3) || v < -16 || v > 15)
326 {
327 // if not a 5 bit value, is indirect, or is not X,Y,U,S
328 l -> lint = 1;
329 switch (l -> pb & 0x07)
330 {
331 case 0:
332 case 1:
333 case 2:
334 case 3:
335 v = 0x88 | (l -> pb & 0x03) | (0x10 * (l -> pb & 0x80));
336 break;
337
338 case 4: // W
339 // use 16 bit because W doesn't have 8 bit, unless 0
340 if (v == 0 && !(CURPRAGMA(l, PRAGMA_NOINDEX0TONONE) || l -> pb & 0x40))
341 {
342 v = (l -> pb & 0x80) ? 0x90 : 0x8F;
343 l -> lint = 0;
344 }
345 else
346 {
347 v = (l -> pb & 0x80) ? 0xD0 : 0xCF;
348 l -> lint = 2;
349 }
350 break;
351
352 case 5: // PCR
353 case 6: // PC
354 v = (l -> pb & 0x80) ? 0x9C : 0x8C;
355 break;
356 }
357
358 return;
359 }
360 else
361 {
362 // we have X,Y,U,S and a possible 15 bit here
363 l -> lint = 0;
364
365 if (v == 0 && !(CURPRAGMA(l, PRAGMA_NOINDEX0TONONE) || l -> pb & 0x40))
366 {
367 v = (l -> pb & 0x03) << 5 | v & 0x1F;
368 }
369 else
370 v = (l -> pb & 0x03) << 5 | 0x84;
371 return;
372 }
373 }
374 else
375 {
376 // we don't know how big it is
377 if (!force)
378 return;
379 // force 16 bit if we don't know
380 l -> lint = 2;
381 }
291 } 382 }
292 383
293 RESOLVEFUNC(insn_resolve_indexed) 384 RESOLVEFUNC(insn_resolve_indexed)
294 { 385 {
295 insn_resolve_indexed_aux(as, l); 386 if (l -> lint == -1)
387 insn_resolve_indexed_aux(as, l, force);
296 388
297 if (l -> lint != -1 && l -> pb != -1) 389 if (l -> lint != -1 && l -> pb != -1)
298 { 390 {
299 l -> len = OPLEN(instab[l -> insn].ops[0]) + l -> lint + 1; 391 l -> len = OPLEN(instab[l -> insn].ops[0]) + l -> lint + 1;
300 } 392 }