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) { | ... | ... |