Commit 56fc64dfd009d1617f0433794f69321d1e4063bd
1 parent
a245f2e7
Sparc code generator update (fix qemu_ld & qemu_st)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5014 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
101 additions
and
129 deletions
tcg/sparc/tcg-target.c
| ... | ... | @@ -141,9 +141,6 @@ static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str) |
| 141 | 141 | tcg_regset_reset_reg(ct->u.regs, TCG_REG_O0); |
| 142 | 142 | tcg_regset_reset_reg(ct->u.regs, TCG_REG_O1); |
| 143 | 143 | tcg_regset_reset_reg(ct->u.regs, TCG_REG_O2); |
| 144 | - // Internal use | |
| 145 | - tcg_regset_reset_reg(ct->u.regs, TCG_REG_L0); | |
| 146 | - tcg_regset_reset_reg(ct->u.regs, TCG_REG_L1); | |
| 147 | 144 | break; |
| 148 | 145 | case 'I': |
| 149 | 146 | ct->ct |= TCG_CT_CONST_S11; |
| ... | ... | @@ -497,8 +494,8 @@ static const void * const qemu_st_helpers[4] = { |
| 497 | 494 | static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, |
| 498 | 495 | int opc) |
| 499 | 496 | { |
| 500 | - int addr_reg, data_reg, r0, r1, arg0, arg1, mem_index, s_bits; | |
| 501 | - int target_ld_op, host_ld_op; | |
| 497 | + int addr_reg, data_reg, arg0, arg1, arg2, mem_index, s_bits; | |
| 498 | + int target_ld_op, host_ld_op, sll_op, sra_op; | |
| 502 | 499 | #if defined(CONFIG_SOFTMMU) |
| 503 | 500 | uint32_t *label1_ptr, *label2_ptr; |
| 504 | 501 | #endif |
| ... | ... | @@ -508,10 +505,9 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, |
| 508 | 505 | mem_index = *args; |
| 509 | 506 | s_bits = opc & 3; |
| 510 | 507 | |
| 511 | - r0 = TCG_REG_L0; | |
| 512 | - r1 = TCG_REG_L1; | |
| 513 | 508 | arg0 = TCG_REG_O0; |
| 514 | 509 | arg1 = TCG_REG_O1; |
| 510 | + arg2 = TCG_REG_O2; | |
| 515 | 511 | |
| 516 | 512 | #if TARGET_LONG_BITS == 32 |
| 517 | 513 | target_ld_op = LDUW; |
| ... | ... | @@ -521,33 +517,39 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, |
| 521 | 517 | |
| 522 | 518 | #ifdef __arch64__ |
| 523 | 519 | host_ld_op = LDX; |
| 520 | + sll_op = SHIFT_SLLX; | |
| 521 | + sra_op = SHIFT_SRAX; | |
| 524 | 522 | #else |
| 525 | 523 | host_ld_op = LDUW; |
| 524 | + sll_op = SHIFT_SLL; | |
| 525 | + sra_op = SHIFT_SRA; | |
| 526 | 526 | #endif |
| 527 | 527 | |
| 528 | 528 | |
| 529 | 529 | #if defined(CONFIG_SOFTMMU) |
| 530 | - /* srl addr_reg, x, r1 */ | |
| 531 | - tcg_out_arithi(s, r1, addr_reg, TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS, | |
| 530 | + /* srl addr_reg, x, arg1 */ | |
| 531 | + tcg_out_arithi(s, arg1, addr_reg, TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS, | |
| 532 | 532 | SHIFT_SRL); |
| 533 | - /* and addr_reg, x, r0 */ | |
| 534 | - tcg_out_arithi(s, r0, addr_reg, TARGET_PAGE_MASK | ((1 << s_bits) - 1), | |
| 533 | + /* and addr_reg, x, arg0 */ | |
| 534 | + tcg_out_arithi(s, arg0, addr_reg, TARGET_PAGE_MASK | ((1 << s_bits) - 1), | |
| 535 | 535 | ARITH_AND); |
| 536 | 536 | |
| 537 | - /* and r1, x, r1 */ | |
| 538 | - tcg_out_andi(s, r1, (CPU_TLB_SIZE - 1) << CPU_TLB_ENTRY_BITS); | |
| 537 | + /* and arg1, x, arg1 */ | |
| 538 | + tcg_out_andi(s, arg1, (CPU_TLB_SIZE - 1) << CPU_TLB_ENTRY_BITS); | |
| 539 | 539 | |
| 540 | - /* add r1, x, r1 */ | |
| 541 | - tcg_out_addi(s, r1, offsetof(CPUState, tlb_table[mem_index][0].addr_read)); | |
| 540 | + /* add arg1, x, arg1 */ | |
| 541 | + tcg_out_addi(s, arg1, offsetof(CPUState, | |
| 542 | + tlb_table[mem_index][0].addr_read)); | |
| 542 | 543 | |
| 543 | - /* add env, r1, r1 */ | |
| 544 | - tcg_out_arith(s, r1, TCG_AREG0, r1, ARITH_ADD); | |
| 544 | + /* add env, arg1, arg1 */ | |
| 545 | + tcg_out_arith(s, arg1, TCG_AREG0, arg1, ARITH_ADD); | |
| 545 | 546 | |
| 546 | - /* ld [r1], arg1 */ | |
| 547 | - tcg_out32(s, target_ld_op | INSN_RD(arg1) | INSN_RS1(r1) | INSN_RS2(TCG_REG_G0)); | |
| 547 | + /* ld [arg1], arg2 */ | |
| 548 | + tcg_out32(s, target_ld_op | INSN_RD(arg2) | INSN_RS1(arg1) | | |
| 549 | + INSN_RS2(TCG_REG_G0)); | |
| 548 | 550 | |
| 549 | - /* subcc r0, arg1, %g0 */ | |
| 550 | - tcg_out_arith(s, TCG_REG_G0, r0, arg1, ARITH_SUBCC); | |
| 551 | + /* subcc arg0, arg2, %g0 */ | |
| 552 | + tcg_out_arith(s, TCG_REG_G0, arg0, arg2, ARITH_SUBCC); | |
| 551 | 553 | |
| 552 | 554 | /* will become: |
| 553 | 555 | be label1 */ |
| ... | ... | @@ -569,25 +571,25 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, |
| 569 | 571 | switch(opc) { |
| 570 | 572 | case 0 | 4: |
| 571 | 573 | /* sll arg0, 24/56, data_reg */ |
| 572 | - tcg_out_arithi(s, data_reg, arg0, sizeof(tcg_target_long) * 8 - 8, | |
| 573 | - SHIFT_SLL); | |
| 574 | + tcg_out_arithi(s, data_reg, arg0, (int)sizeof(tcg_target_long) * 8 - 8, | |
| 575 | + sll_op); | |
| 574 | 576 | /* sra data_reg, 24/56, data_reg */ |
| 575 | - tcg_out_arithi(s, data_reg, data_reg, sizeof(tcg_target_long) * 8 - 8, | |
| 576 | - SHIFT_SRA); | |
| 577 | + tcg_out_arithi(s, data_reg, data_reg, | |
| 578 | + (int)sizeof(tcg_target_long) * 8 - 8, sra_op); | |
| 577 | 579 | break; |
| 578 | 580 | case 1 | 4: |
| 579 | 581 | /* sll arg0, 16/48, data_reg */ |
| 580 | - tcg_out_arithi(s, data_reg, arg0, sizeof(tcg_target_long) * 8 - 16, | |
| 581 | - SHIFT_SLL); | |
| 582 | + tcg_out_arithi(s, data_reg, arg0, | |
| 583 | + (int)sizeof(tcg_target_long) * 8 - 16, sll_op); | |
| 582 | 584 | /* sra data_reg, 16/48, data_reg */ |
| 583 | - tcg_out_arithi(s, data_reg, data_reg, sizeof(tcg_target_long) * 8 - 16, | |
| 584 | - SHIFT_SRA); | |
| 585 | + tcg_out_arithi(s, data_reg, data_reg, | |
| 586 | + (int)sizeof(tcg_target_long) * 8 - 16, sra_op); | |
| 585 | 587 | break; |
| 586 | 588 | case 2 | 4: |
| 587 | 589 | /* sll arg0, 32, data_reg */ |
| 588 | - tcg_out_arithi(s, data_reg, arg0, 32, SHIFT_SLL); | |
| 590 | + tcg_out_arithi(s, data_reg, arg0, 32, sll_op); | |
| 589 | 591 | /* sra data_reg, 32, data_reg */ |
| 590 | - tcg_out_arithi(s, data_reg, data_reg, 32, SHIFT_SRA); | |
| 592 | + tcg_out_arithi(s, data_reg, data_reg, 32, sra_op); | |
| 591 | 593 | break; |
| 592 | 594 | case 0: |
| 593 | 595 | case 1: |
| ... | ... | @@ -612,67 +614,67 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, |
| 612 | 614 | INSN_OFF22((unsigned long)s->code_ptr - |
| 613 | 615 | (unsigned long)label1_ptr)); |
| 614 | 616 | |
| 615 | - /* ld [r1 + x], r1 */ | |
| 616 | - tcg_out_ldst(s, r1, r1, offsetof(CPUTLBEntry, addend) - | |
| 617 | + /* ld [arg1 + x], arg1 */ | |
| 618 | + tcg_out_ldst(s, arg1, arg1, offsetof(CPUTLBEntry, addend) - | |
| 617 | 619 | offsetof(CPUTLBEntry, addr_read), host_ld_op); |
| 618 | - /* add r0, r1, r0 */ | |
| 619 | - tcg_out_arith(s, r0, r1, r0, ARITH_ADD); | |
| 620 | + /* add addr_reg, arg1, arg0 */ | |
| 621 | + tcg_out_arith(s, arg0, addr_reg, arg1, ARITH_ADD); | |
| 620 | 622 | #else |
| 621 | - r0 = addr_reg; | |
| 623 | + arg0 = addr_reg; | |
| 622 | 624 | #endif |
| 623 | 625 | |
| 624 | 626 | switch(opc) { |
| 625 | 627 | case 0: |
| 626 | - /* ldub [r0], data_reg */ | |
| 627 | - tcg_out_ldst(s, data_reg, r0, 0, LDUB); | |
| 628 | + /* ldub [arg0], data_reg */ | |
| 629 | + tcg_out_ldst(s, data_reg, arg0, 0, LDUB); | |
| 628 | 630 | break; |
| 629 | 631 | case 0 | 4: |
| 630 | - /* ldsb [r0], data_reg */ | |
| 631 | - tcg_out_ldst(s, data_reg, r0, 0, LDSB); | |
| 632 | + /* ldsb [arg0], data_reg */ | |
| 633 | + tcg_out_ldst(s, data_reg, arg0, 0, LDSB); | |
| 632 | 634 | break; |
| 633 | 635 | case 1: |
| 634 | 636 | #ifdef TARGET_WORDS_BIGENDIAN |
| 635 | - /* lduh [r0], data_reg */ | |
| 636 | - tcg_out_ldst(s, data_reg, r0, 0, LDUH); | |
| 637 | + /* lduh [arg0], data_reg */ | |
| 638 | + tcg_out_ldst(s, data_reg, arg0, 0, LDUH); | |
| 637 | 639 | #else |
| 638 | - /* lduha [r0] ASI_PRIMARY_LITTLE, data_reg */ | |
| 639 | - tcg_out_ldst_asi(s, data_reg, r0, 0, LDUHA, ASI_PRIMARY_LITTLE); | |
| 640 | + /* lduha [arg0] ASI_PRIMARY_LITTLE, data_reg */ | |
| 641 | + tcg_out_ldst_asi(s, data_reg, arg0, 0, LDUHA, ASI_PRIMARY_LITTLE); | |
| 640 | 642 | #endif |
| 641 | 643 | break; |
| 642 | 644 | case 1 | 4: |
| 643 | 645 | #ifdef TARGET_WORDS_BIGENDIAN |
| 644 | - /* ldsh [r0], data_reg */ | |
| 645 | - tcg_out_ldst(s, data_reg, r0, 0, LDSH); | |
| 646 | + /* ldsh [arg0], data_reg */ | |
| 647 | + tcg_out_ldst(s, data_reg, arg0, 0, LDSH); | |
| 646 | 648 | #else |
| 647 | - /* ldsha [r0] ASI_PRIMARY_LITTLE, data_reg */ | |
| 648 | - tcg_out_ldst_asi(s, data_reg, r0, 0, LDSHA, ASI_PRIMARY_LITTLE); | |
| 649 | + /* ldsha [arg0] ASI_PRIMARY_LITTLE, data_reg */ | |
| 650 | + tcg_out_ldst_asi(s, data_reg, arg0, 0, LDSHA, ASI_PRIMARY_LITTLE); | |
| 649 | 651 | #endif |
| 650 | 652 | break; |
| 651 | 653 | case 2: |
| 652 | 654 | #ifdef TARGET_WORDS_BIGENDIAN |
| 653 | - /* lduw [r0], data_reg */ | |
| 654 | - tcg_out_ldst(s, data_reg, r0, 0, LDUW); | |
| 655 | + /* lduw [arg0], data_reg */ | |
| 656 | + tcg_out_ldst(s, data_reg, arg0, 0, LDUW); | |
| 655 | 657 | #else |
| 656 | - /* lduwa [r0] ASI_PRIMARY_LITTLE, data_reg */ | |
| 657 | - tcg_out_ldst_asi(s, data_reg, r0, 0, LDUWA, ASI_PRIMARY_LITTLE); | |
| 658 | + /* lduwa [arg0] ASI_PRIMARY_LITTLE, data_reg */ | |
| 659 | + tcg_out_ldst_asi(s, data_reg, arg0, 0, LDUWA, ASI_PRIMARY_LITTLE); | |
| 658 | 660 | #endif |
| 659 | 661 | break; |
| 660 | 662 | case 2 | 4: |
| 661 | 663 | #ifdef TARGET_WORDS_BIGENDIAN |
| 662 | - /* ldsw [r0], data_reg */ | |
| 663 | - tcg_out_ldst(s, data_reg, r0, 0, LDSW); | |
| 664 | + /* ldsw [arg0], data_reg */ | |
| 665 | + tcg_out_ldst(s, data_reg, arg0, 0, LDSW); | |
| 664 | 666 | #else |
| 665 | - /* ldswa [r0] ASI_PRIMARY_LITTLE, data_reg */ | |
| 666 | - tcg_out_ldst_asi(s, data_reg, r0, 0, LDSWA, ASI_PRIMARY_LITTLE); | |
| 667 | + /* ldswa [arg0] ASI_PRIMARY_LITTLE, data_reg */ | |
| 668 | + tcg_out_ldst_asi(s, data_reg, arg0, 0, LDSWA, ASI_PRIMARY_LITTLE); | |
| 667 | 669 | #endif |
| 668 | 670 | break; |
| 669 | 671 | case 3: |
| 670 | 672 | #ifdef TARGET_WORDS_BIGENDIAN |
| 671 | - /* ldx [r0], data_reg */ | |
| 672 | - tcg_out_ldst(s, data_reg, r0, 0, LDX); | |
| 673 | + /* ldx [arg0], data_reg */ | |
| 674 | + tcg_out_ldst(s, data_reg, arg0, 0, LDX); | |
| 673 | 675 | #else |
| 674 | - /* ldxa [r0] ASI_PRIMARY_LITTLE, data_reg */ | |
| 675 | - tcg_out_ldst_asi(s, data_reg, r0, 0, LDXA, ASI_PRIMARY_LITTLE); | |
| 676 | + /* ldxa [arg0] ASI_PRIMARY_LITTLE, data_reg */ | |
| 677 | + tcg_out_ldst_asi(s, data_reg, arg0, 0, LDXA, ASI_PRIMARY_LITTLE); | |
| 676 | 678 | #endif |
| 677 | 679 | break; |
| 678 | 680 | default: |
| ... | ... | @@ -690,7 +692,7 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, |
| 690 | 692 | static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, |
| 691 | 693 | int opc) |
| 692 | 694 | { |
| 693 | - int addr_reg, data_reg, r0, r1, arg0, arg1, arg2, mem_index, s_bits; | |
| 695 | + int addr_reg, data_reg, arg0, arg1, arg2, mem_index, s_bits; | |
| 694 | 696 | int target_ld_op, host_ld_op; |
| 695 | 697 | #if defined(CONFIG_SOFTMMU) |
| 696 | 698 | uint32_t *label1_ptr, *label2_ptr; |
| ... | ... | @@ -702,8 +704,6 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, |
| 702 | 704 | |
| 703 | 705 | s_bits = opc; |
| 704 | 706 | |
| 705 | - r0 = TCG_REG_L0; | |
| 706 | - r1 = TCG_REG_L1; | |
| 707 | 707 | arg0 = TCG_REG_O0; |
| 708 | 708 | arg1 = TCG_REG_O1; |
| 709 | 709 | arg2 = TCG_REG_O2; |
| ... | ... | @@ -721,28 +721,30 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, |
| 721 | 721 | #endif |
| 722 | 722 | |
| 723 | 723 | #if defined(CONFIG_SOFTMMU) |
| 724 | - /* srl addr_reg, x, r1 */ | |
| 725 | - tcg_out_arithi(s, r1, addr_reg, TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS, | |
| 724 | + /* srl addr_reg, x, arg1 */ | |
| 725 | + tcg_out_arithi(s, arg1, addr_reg, TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS, | |
| 726 | 726 | SHIFT_SRL); |
| 727 | 727 | |
| 728 | - /* and addr_reg, x, r0 */ | |
| 729 | - tcg_out_arithi(s, r0, addr_reg, TARGET_PAGE_MASK | ((1 << s_bits) - 1), | |
| 728 | + /* and addr_reg, x, arg0 */ | |
| 729 | + tcg_out_arithi(s, arg0, addr_reg, TARGET_PAGE_MASK | ((1 << s_bits) - 1), | |
| 730 | 730 | ARITH_AND); |
| 731 | 731 | |
| 732 | - /* and r1, x, r1 */ | |
| 733 | - tcg_out_andi(s, r1, (CPU_TLB_SIZE - 1) << CPU_TLB_ENTRY_BITS); | |
| 732 | + /* and arg1, x, arg1 */ | |
| 733 | + tcg_out_andi(s, arg1, (CPU_TLB_SIZE - 1) << CPU_TLB_ENTRY_BITS); | |
| 734 | 734 | |
| 735 | - /* add r1, x, r1 */ | |
| 736 | - tcg_out_addi(s, r1, offsetof(CPUState, tlb_table[mem_index][0].addr_write)); | |
| 735 | + /* add arg1, x, arg1 */ | |
| 736 | + tcg_out_addi(s, arg1, offsetof(CPUState, | |
| 737 | + tlb_table[mem_index][0].addr_write)); | |
| 737 | 738 | |
| 738 | - /* add env, r1, r1 */ | |
| 739 | - tcg_out_arith(s, r1, TCG_AREG0, r1, ARITH_ADD); | |
| 739 | + /* add env, arg1, arg1 */ | |
| 740 | + tcg_out_arith(s, arg1, TCG_AREG0, arg1, ARITH_ADD); | |
| 740 | 741 | |
| 741 | - /* ld [r1], arg1 */ | |
| 742 | - tcg_out32(s, target_ld_op | INSN_RD(arg1) | INSN_RS1(r1) | INSN_RS2(TCG_REG_G0)); | |
| 742 | + /* ld [arg1], arg2 */ | |
| 743 | + tcg_out32(s, target_ld_op | INSN_RD(arg2) | INSN_RS1(arg1) | | |
| 744 | + INSN_RS2(TCG_REG_G0)); | |
| 743 | 745 | |
| 744 | - /* subcc r0, arg1, %g0 */ | |
| 745 | - tcg_out_arith(s, TCG_REG_G0, r0, arg1, ARITH_SUBCC); | |
| 746 | + /* subcc arg0, arg2, %g0 */ | |
| 747 | + tcg_out_arith(s, TCG_REG_G0, arg0, arg2, ARITH_SUBCC); | |
| 746 | 748 | |
| 747 | 749 | /* will become: |
| 748 | 750 | be label1 */ |
| ... | ... | @@ -752,40 +754,8 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, |
| 752 | 754 | /* mov (delay slot) */ |
| 753 | 755 | tcg_out_mov(s, arg0, addr_reg); |
| 754 | 756 | |
| 755 | - /* arg1 = sign_extend(data_reg); */ | |
| 756 | - switch(opc) { | |
| 757 | - case 0 | 4: | |
| 758 | - /* sll data_reg, 24/56, arg1 */ | |
| 759 | - tcg_out_arithi(s, arg1, data_reg, sizeof(tcg_target_long) * 8 - 8, SHIFT_SLL); | |
| 760 | - /* sra arg1, 24/56, arg1 */ | |
| 761 | - tcg_out_arithi(s, arg1, arg1, sizeof(tcg_target_long) * 8 - 8, | |
| 762 | - SHIFT_SRA); | |
| 763 | - break; | |
| 764 | - case 1 | 4: | |
| 765 | - /* sll data_reg, 16/48, arg1 */ | |
| 766 | - tcg_out_arithi(s, data_reg, arg1, sizeof(tcg_target_long) * 8 - 16, SHIFT_SLL); | |
| 767 | - /* sra arg1, 16/48, arg1 */ | |
| 768 | - tcg_out_arithi(s, arg1, arg1, sizeof(tcg_target_long) * 8 - 16, | |
| 769 | - SHIFT_SRA); | |
| 770 | - break; | |
| 771 | - case 2 | 4: | |
| 772 | - /* sll data_reg, 32, arg1 */ | |
| 773 | - tcg_out_arithi(s, data_reg, arg1, 32, SHIFT_SLL); | |
| 774 | - /* sra arg1, 32, arg1 */ | |
| 775 | - tcg_out_arithi(s, arg1, arg1, 32, SHIFT_SRA); | |
| 776 | - break; | |
| 777 | - case 0: | |
| 778 | - case 1: | |
| 779 | - case 2: | |
| 780 | - case 3: | |
| 781 | - default: | |
| 782 | - /* mov */ | |
| 783 | - tcg_out_mov(s, arg1, data_reg); | |
| 784 | - break; | |
| 785 | - } | |
| 786 | - | |
| 787 | 757 | /* mov */ |
| 788 | - tcg_out_mov(s, arg0, addr_reg); | |
| 758 | + tcg_out_mov(s, arg1, data_reg); | |
| 789 | 759 | |
| 790 | 760 | /* XXX: move that code at the end of the TB */ |
| 791 | 761 | /* qemu_st_helper[s_bits](arg0, arg1, arg2) */ |
| ... | ... | @@ -808,46 +778,46 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, |
| 808 | 778 | INSN_OFF22((unsigned long)s->code_ptr - |
| 809 | 779 | (unsigned long)label1_ptr)); |
| 810 | 780 | |
| 811 | - /* ld [r1 + x], r1 */ | |
| 812 | - tcg_out_ldst(s, arg1, r1, offsetof(CPUTLBEntry, addend) - | |
| 781 | + /* ld [arg1 + x], arg1 */ | |
| 782 | + tcg_out_ldst(s, arg1, arg1, offsetof(CPUTLBEntry, addend) - | |
| 813 | 783 | offsetof(CPUTLBEntry, addr_write), host_ld_op); |
| 814 | 784 | |
| 815 | - /* add r0, r1, r0 */ | |
| 816 | - tcg_out_arith(s, r0, arg1, r0, ARITH_ADD); | |
| 785 | + /* add addr_reg, arg1, arg0 */ | |
| 786 | + tcg_out_arith(s, arg0, addr_reg, arg1, ARITH_ADD); | |
| 817 | 787 | #else |
| 818 | - r0 = addr_reg; | |
| 788 | + arg0 = addr_reg; | |
| 819 | 789 | #endif |
| 820 | 790 | |
| 821 | 791 | switch(opc) { |
| 822 | 792 | case 0: |
| 823 | - /* stb data_reg, [r0] */ | |
| 824 | - tcg_out_ldst(s, data_reg, r0, 0, STB); | |
| 793 | + /* stb data_reg, [arg0] */ | |
| 794 | + tcg_out_ldst(s, data_reg, arg0, 0, STB); | |
| 825 | 795 | break; |
| 826 | 796 | case 1: |
| 827 | 797 | #ifdef TARGET_WORDS_BIGENDIAN |
| 828 | - /* sth data_reg, [r0] */ | |
| 829 | - tcg_out_ldst(s, data_reg, r0, 0, STH); | |
| 798 | + /* sth data_reg, [arg0] */ | |
| 799 | + tcg_out_ldst(s, data_reg, arg0, 0, STH); | |
| 830 | 800 | #else |
| 831 | - /* stha data_reg, [r0] ASI_PRIMARY_LITTLE */ | |
| 832 | - tcg_out_ldst_asi(s, data_reg, r0, 0, STHA, ASI_PRIMARY_LITTLE); | |
| 801 | + /* stha data_reg, [arg0] ASI_PRIMARY_LITTLE */ | |
| 802 | + tcg_out_ldst_asi(s, data_reg, arg0, 0, STHA, ASI_PRIMARY_LITTLE); | |
| 833 | 803 | #endif |
| 834 | 804 | break; |
| 835 | 805 | case 2: |
| 836 | 806 | #ifdef TARGET_WORDS_BIGENDIAN |
| 837 | - /* stw data_reg, [r0] */ | |
| 838 | - tcg_out_ldst(s, data_reg, r0, 0, STW); | |
| 807 | + /* stw data_reg, [arg0] */ | |
| 808 | + tcg_out_ldst(s, data_reg, arg0, 0, STW); | |
| 839 | 809 | #else |
| 840 | - /* stwa data_reg, [r0] ASI_PRIMARY_LITTLE */ | |
| 841 | - tcg_out_ldst_asi(s, data_reg, r0, 0, STWA, ASI_PRIMARY_LITTLE); | |
| 810 | + /* stwa data_reg, [arg0] ASI_PRIMARY_LITTLE */ | |
| 811 | + tcg_out_ldst_asi(s, data_reg, arg0, 0, STWA, ASI_PRIMARY_LITTLE); | |
| 842 | 812 | #endif |
| 843 | 813 | break; |
| 844 | 814 | case 3: |
| 845 | 815 | #ifdef TARGET_WORDS_BIGENDIAN |
| 846 | - /* stx data_reg, [r0] */ | |
| 847 | - tcg_out_ldst(s, data_reg, r0, 0, STX); | |
| 816 | + /* stx data_reg, [arg0] */ | |
| 817 | + tcg_out_ldst(s, data_reg, arg0, 0, STX); | |
| 848 | 818 | #else |
| 849 | - /* stxa data_reg, [r0] ASI_PRIMARY_LITTLE */ | |
| 850 | - tcg_out_ldst_asi(s, data_reg, r0, 0, STXA, ASI_PRIMARY_LITTLE); | |
| 819 | + /* stxa data_reg, [arg0] ASI_PRIMARY_LITTLE */ | |
| 820 | + tcg_out_ldst_asi(s, data_reg, arg0, 0, STXA, ASI_PRIMARY_LITTLE); | |
| 851 | 821 | #endif |
| 852 | 822 | break; |
| 853 | 823 | default: |
| ... | ... | @@ -1164,6 +1134,8 @@ static const TCGTargetOpDef sparc_op_defs[] = { |
| 1164 | 1134 | { INDEX_op_st16_i64, { "r", "r" } }, |
| 1165 | 1135 | { INDEX_op_st32_i64, { "r", "r" } }, |
| 1166 | 1136 | { INDEX_op_st_i64, { "r", "r" } }, |
| 1137 | + { INDEX_op_qemu_ld64, { "L", "L" } }, | |
| 1138 | + { INDEX_op_qemu_st64, { "L", "L" } }, | |
| 1167 | 1139 | |
| 1168 | 1140 | { INDEX_op_add_i64, { "r", "r", "rJ" } }, |
| 1169 | 1141 | { INDEX_op_mul_i64, { "r", "r", "rJ" } }, | ... | ... |