Commit f8edcbaa2dc25fb5ff6ad0c384d9c9cbea1b3015
1 parent
3018f259
Avoid clobbering input register in qemu_ld64+bswap+useronly case
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5287 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
6 additions
and
13 deletions
tcg/ppc/tcg-target.c
| ... | ... | @@ -474,9 +474,9 @@ static void *qemu_st_helpers[4] = { |
| 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,6 +599,7 @@ static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc) |
| 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,17 +633,9 @@ static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc) |
| 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) { | ... | ... |