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,9 +474,9 @@ static void *qemu_st_helpers[4] = { | ||
| 474 | 474 | ||
| 475 | static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc) | 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 | #ifdef CONFIG_SOFTMMU | 478 | #ifdef CONFIG_SOFTMMU |
| 479 | - int r1, r2; | 479 | + int r2; |
| 480 | void *label1_ptr, *label2_ptr; | 480 | void *label1_ptr, *label2_ptr; |
| 481 | #endif | 481 | #endif |
| 482 | #if TARGET_LONG_BITS == 64 | 482 | #if TARGET_LONG_BITS == 64 |
| @@ -599,6 +599,7 @@ static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc) | @@ -599,6 +599,7 @@ static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc) | ||
| 599 | 599 | ||
| 600 | #else /* !CONFIG_SOFTMMU */ | 600 | #else /* !CONFIG_SOFTMMU */ |
| 601 | r0 = addr_reg; | 601 | r0 = addr_reg; |
| 602 | + r1 = 3; | ||
| 602 | #endif | 603 | #endif |
| 603 | 604 | ||
| 604 | #ifdef TARGET_WORDS_BIGENDIAN | 605 | #ifdef TARGET_WORDS_BIGENDIAN |
| @@ -632,17 +633,9 @@ static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc) | @@ -632,17 +633,9 @@ static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc) | ||
| 632 | break; | 633 | break; |
| 633 | case 3: | 634 | case 3: |
| 634 | if (bswap) { | 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 | else { | 640 | else { |
| 648 | if (r0 == data_reg2) { | 641 | if (r0 == data_reg2) { |