Commit f8edcbaa2dc25fb5ff6ad0c384d9c9cbea1b3015

Authored by malc
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) {
... ...