Revision a7d3970d target-arm/translate.c
b/target-arm/translate.c | ||
---|---|---|
9454 | 9454 |
break; |
9455 | 9455 |
|
9456 | 9456 |
case 12: |
9457 |
{ |
|
9457 | 9458 |
/* load/store multiple */ |
9459 |
TCGv loaded_var; |
|
9460 |
TCGV_UNUSED(loaded_var); |
|
9458 | 9461 |
rn = (insn >> 8) & 0x7; |
9459 | 9462 |
addr = load_reg(s, rn); |
9460 | 9463 |
for (i = 0; i < 8; i++) { |
... | ... | |
9462 | 9465 |
if (insn & (1 << 11)) { |
9463 | 9466 |
/* load */ |
9464 | 9467 |
tmp = gen_ld32(addr, IS_USER(s)); |
9465 |
store_reg(s, i, tmp); |
|
9468 |
if (i == rn) { |
|
9469 |
loaded_var = tmp; |
|
9470 |
} else { |
|
9471 |
store_reg(s, i, tmp); |
|
9472 |
} |
|
9466 | 9473 |
} else { |
9467 | 9474 |
/* store */ |
9468 | 9475 |
tmp = load_reg(s, i); |
... | ... | |
9472 | 9479 |
tcg_gen_addi_i32(addr, addr, 4); |
9473 | 9480 |
} |
9474 | 9481 |
} |
9475 |
/* Base register writeback. */ |
|
9476 | 9482 |
if ((insn & (1 << rn)) == 0) { |
9483 |
/* base reg not in list: base register writeback */ |
|
9477 | 9484 |
store_reg(s, rn, addr); |
9478 | 9485 |
} else { |
9486 |
/* base reg in list: if load, complete it now */ |
|
9487 |
if (insn & (1 << 11)) { |
|
9488 |
store_reg(s, rn, loaded_var); |
|
9489 |
} |
|
9479 | 9490 |
tcg_temp_free_i32(addr); |
9480 | 9491 |
} |
9481 | 9492 |
break; |
9482 |
|
|
9493 |
} |
|
9483 | 9494 |
case 13: |
9484 | 9495 |
/* conditional branch or swi */ |
9485 | 9496 |
cond = (insn >> 8) & 0xf; |
Also available in: Unified diff