Revision f8edcbaa
b/tcg/ppc/tcg-target.c | ||
---|---|---|
474 | 474 |
|
475 | 475 |
static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc) |
476 | 476 |
{ |
477 |
int addr_reg, data_reg, data_reg2, r0, mem_index, s_bits, bswap; |
|
477 |
int addr_reg, data_reg, data_reg2, r0, r1, mem_index, s_bits, bswap;
|
|
478 | 478 |
#ifdef CONFIG_SOFTMMU |
479 |
int r1, r2;
|
|
479 |
int r2; |
|
480 | 480 |
void *label1_ptr, *label2_ptr; |
481 | 481 |
#endif |
482 | 482 |
#if TARGET_LONG_BITS == 64 |
... | ... | |
599 | 599 |
|
600 | 600 |
#else /* !CONFIG_SOFTMMU */ |
601 | 601 |
r0 = addr_reg; |
602 |
r1 = 3; |
|
602 | 603 |
#endif |
603 | 604 |
|
604 | 605 |
#ifdef TARGET_WORDS_BIGENDIAN |
... | ... | |
632 | 633 |
break; |
633 | 634 |
case 3: |
634 | 635 |
if (bswap) { |
635 |
if (r0 == data_reg) { |
|
636 |
tcg_out32 (s, LWBRX | RT (0) | RB (r0)); |
|
637 |
tcg_out32 (s, ADDI | RT (r0) | RA (r0) | 4); |
|
638 |
tcg_out32 (s, LWBRX | RT (data_reg2) | RB (r0)); |
|
639 |
tcg_out_mov (s, data_reg, 0); |
|
640 |
} |
|
641 |
else { |
|
642 |
tcg_out32 (s, LWBRX | RT (data_reg) | RB (r0)); |
|
643 |
tcg_out32 (s, ADDI | RT (r0) | RA (r0) | 4); |
|
644 |
tcg_out32 (s, LWBRX | RT (data_reg2) | RB (r0)); |
|
645 |
} |
|
636 |
tcg_out32 (s, ADDI | RT (r1) | RA (r0) | 4); |
|
637 |
tcg_out32 (s, LWBRX | RT (data_reg) | RB (r0)); |
|
638 |
tcg_out32 (s, LWBRX | RT (data_reg2) | RB (r1)); |
|
646 | 639 |
} |
647 | 640 |
else { |
648 | 641 |
if (r0 == data_reg2) { |
Also available in: Unified diff