Mercurial > hg-old > index.cgi
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 } |