Commit 56fc64dfd009d1617f0433794f69321d1e4063bd

Authored by blueswir1
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" } },
... ...