Commit 9322a4bf0b735f4e75bca50671aba9693958be09
1 parent
c48fcb47
Change handling of source register 1
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4134 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
36 additions
and
31 deletions
target-sparc/translate.c
@@ -1817,6 +1817,23 @@ static inline void gen_ldstub_asi(TCGv dst, TCGv addr, int insn) | @@ -1817,6 +1817,23 @@ static inline void gen_ldstub_asi(TCGv dst, TCGv addr, int insn) | ||
1817 | } | 1817 | } |
1818 | #endif | 1818 | #endif |
1819 | 1819 | ||
1820 | +static inline TCGv get_src1(unsigned int insn, TCGv def) | ||
1821 | +{ | ||
1822 | + TCGv r_rs1 = def; | ||
1823 | + unsigned int rs1; | ||
1824 | + | ||
1825 | + rs1 = GET_FIELD(insn, 13, 17); | ||
1826 | + if (rs1 == 0) | ||
1827 | + //r_rs1 = tcg_const_tl(0); | ||
1828 | + tcg_gen_movi_tl(def, 0); | ||
1829 | + else if (rs1 < 8) | ||
1830 | + //r_rs1 = cpu_gregs[rs1]; | ||
1831 | + tcg_gen_mov_tl(def, cpu_gregs[rs1]); | ||
1832 | + else | ||
1833 | + tcg_gen_ld_tl(def, cpu_regwptr, (rs1 - 8) * sizeof(target_ulong)); | ||
1834 | + return r_rs1; | ||
1835 | +} | ||
1836 | + | ||
1820 | /* before an instruction, dc->pc must be static */ | 1837 | /* before an instruction, dc->pc must be static */ |
1821 | static void disas_sparc_insn(DisasContext * dc) | 1838 | static void disas_sparc_insn(DisasContext * dc) |
1822 | { | 1839 | { |
@@ -1864,8 +1881,7 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -1864,8 +1881,7 @@ static void disas_sparc_insn(DisasContext * dc) | ||
1864 | (GET_FIELD_SP(insn, 20, 21) << 14); | 1881 | (GET_FIELD_SP(insn, 20, 21) << 14); |
1865 | target = sign_extend(target, 16); | 1882 | target = sign_extend(target, 16); |
1866 | target <<= 2; | 1883 | target <<= 2; |
1867 | - rs1 = GET_FIELD(insn, 13, 17); | ||
1868 | - gen_movl_reg_TN(rs1, cpu_src1); | 1884 | + cpu_src1 = get_src1(insn, cpu_src1); |
1869 | do_branch_reg(dc, target, insn, cpu_cond, cpu_src1); | 1885 | do_branch_reg(dc, target, insn, cpu_cond, cpu_src1); |
1870 | goto jmp_insn; | 1886 | goto jmp_insn; |
1871 | } | 1887 | } |
@@ -1939,8 +1955,7 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -1939,8 +1955,7 @@ static void disas_sparc_insn(DisasContext * dc) | ||
1939 | if (xop == 0x3a) { /* generate trap */ | 1955 | if (xop == 0x3a) { /* generate trap */ |
1940 | int cond; | 1956 | int cond; |
1941 | 1957 | ||
1942 | - rs1 = GET_FIELD(insn, 13, 17); | ||
1943 | - gen_movl_reg_TN(rs1, cpu_src1); | 1958 | + cpu_src1 = get_src1(insn, cpu_src1); |
1944 | if (IS_IMM) { | 1959 | if (IS_IMM) { |
1945 | rs2 = GET_FIELD(insn, 25, 31); | 1960 | rs2 = GET_FIELD(insn, 25, 31); |
1946 | tcg_gen_addi_tl(cpu_dst, cpu_src1, rs2); | 1961 | tcg_gen_addi_tl(cpu_dst, cpu_src1, rs2); |
@@ -2637,8 +2652,7 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -2637,8 +2652,7 @@ static void disas_sparc_insn(DisasContext * dc) | ||
2637 | 2652 | ||
2638 | l1 = gen_new_label(); | 2653 | l1 = gen_new_label(); |
2639 | cond = GET_FIELD_SP(insn, 14, 17); | 2654 | cond = GET_FIELD_SP(insn, 14, 17); |
2640 | - rs1 = GET_FIELD(insn, 13, 17); | ||
2641 | - gen_movl_reg_TN(rs1, cpu_src1); | 2655 | + cpu_src1 = get_src1(insn, cpu_src1); |
2642 | tcg_gen_brcond_tl(gen_tcg_cond_reg[cond], cpu_src1, | 2656 | tcg_gen_brcond_tl(gen_tcg_cond_reg[cond], cpu_src1, |
2643 | tcg_const_tl(0), l1); | 2657 | tcg_const_tl(0), l1); |
2644 | gen_op_load_fpr_FT0(rs2); | 2658 | gen_op_load_fpr_FT0(rs2); |
@@ -2650,8 +2664,7 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -2650,8 +2664,7 @@ static void disas_sparc_insn(DisasContext * dc) | ||
2650 | 2664 | ||
2651 | l1 = gen_new_label(); | 2665 | l1 = gen_new_label(); |
2652 | cond = GET_FIELD_SP(insn, 14, 17); | 2666 | cond = GET_FIELD_SP(insn, 14, 17); |
2653 | - rs1 = GET_FIELD(insn, 13, 17); | ||
2654 | - gen_movl_reg_TN(rs1, cpu_src1); | 2667 | + cpu_src1 = get_src1(insn, cpu_src1); |
2655 | tcg_gen_brcond_tl(gen_tcg_cond_reg[cond], cpu_src1, | 2668 | tcg_gen_brcond_tl(gen_tcg_cond_reg[cond], cpu_src1, |
2656 | tcg_const_tl(0), l1); | 2669 | tcg_const_tl(0), l1); |
2657 | gen_op_load_fpr_DT0(DFPREG(rs2)); | 2670 | gen_op_load_fpr_DT0(DFPREG(rs2)); |
@@ -2664,8 +2677,7 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -2664,8 +2677,7 @@ static void disas_sparc_insn(DisasContext * dc) | ||
2664 | 2677 | ||
2665 | l1 = gen_new_label(); | 2678 | l1 = gen_new_label(); |
2666 | cond = GET_FIELD_SP(insn, 14, 17); | 2679 | cond = GET_FIELD_SP(insn, 14, 17); |
2667 | - rs1 = GET_FIELD(insn, 13, 17); | ||
2668 | - gen_movl_reg_TN(rs1, cpu_src1); | 2680 | + cpu_src1 = get_src1(insn, cpu_src1); |
2669 | tcg_gen_brcond_tl(gen_tcg_cond_reg[cond], cpu_src1, | 2681 | tcg_gen_brcond_tl(gen_tcg_cond_reg[cond], cpu_src1, |
2670 | tcg_const_tl(0), l1); | 2682 | tcg_const_tl(0), l1); |
2671 | gen_op_load_fpr_QT0(QFPREG(rs2)); | 2683 | gen_op_load_fpr_QT0(QFPREG(rs2)); |
@@ -2848,7 +2860,7 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -2848,7 +2860,7 @@ static void disas_sparc_insn(DisasContext * dc) | ||
2848 | gen_movl_reg_TN(rs2, cpu_dst); | 2860 | gen_movl_reg_TN(rs2, cpu_dst); |
2849 | } | 2861 | } |
2850 | } else { | 2862 | } else { |
2851 | - gen_movl_reg_TN(rs1, cpu_src1); | 2863 | + cpu_src1 = get_src1(insn, cpu_src1); |
2852 | if (IS_IMM) { /* immediate */ | 2864 | if (IS_IMM) { /* immediate */ |
2853 | rs2 = GET_FIELDs(insn, 19, 31); | 2865 | rs2 = GET_FIELDs(insn, 19, 31); |
2854 | tcg_gen_ori_tl(cpu_dst, cpu_src1, (int)rs2); | 2866 | tcg_gen_ori_tl(cpu_dst, cpu_src1, (int)rs2); |
@@ -2865,8 +2877,7 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -2865,8 +2877,7 @@ static void disas_sparc_insn(DisasContext * dc) | ||
2865 | #endif | 2877 | #endif |
2866 | #ifdef TARGET_SPARC64 | 2878 | #ifdef TARGET_SPARC64 |
2867 | } else if (xop == 0x25) { /* sll, V9 sllx */ | 2879 | } else if (xop == 0x25) { /* sll, V9 sllx */ |
2868 | - rs1 = GET_FIELD(insn, 13, 17); | ||
2869 | - gen_movl_reg_TN(rs1, cpu_src1); | 2880 | + cpu_src1 = get_src1(insn, cpu_src1); |
2870 | if (IS_IMM) { /* immediate */ | 2881 | if (IS_IMM) { /* immediate */ |
2871 | rs2 = GET_FIELDs(insn, 20, 31); | 2882 | rs2 = GET_FIELDs(insn, 20, 31); |
2872 | if (insn & (1 << 12)) { | 2883 | if (insn & (1 << 12)) { |
@@ -2889,8 +2900,7 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -2889,8 +2900,7 @@ static void disas_sparc_insn(DisasContext * dc) | ||
2889 | } | 2900 | } |
2890 | gen_movl_TN_reg(rd, cpu_dst); | 2901 | gen_movl_TN_reg(rd, cpu_dst); |
2891 | } else if (xop == 0x26) { /* srl, V9 srlx */ | 2902 | } else if (xop == 0x26) { /* srl, V9 srlx */ |
2892 | - rs1 = GET_FIELD(insn, 13, 17); | ||
2893 | - gen_movl_reg_TN(rs1, cpu_src1); | 2903 | + cpu_src1 = get_src1(insn, cpu_src1); |
2894 | if (IS_IMM) { /* immediate */ | 2904 | if (IS_IMM) { /* immediate */ |
2895 | rs2 = GET_FIELDs(insn, 20, 31); | 2905 | rs2 = GET_FIELDs(insn, 20, 31); |
2896 | if (insn & (1 << 12)) { | 2906 | if (insn & (1 << 12)) { |
@@ -2913,8 +2923,7 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -2913,8 +2923,7 @@ static void disas_sparc_insn(DisasContext * dc) | ||
2913 | } | 2923 | } |
2914 | gen_movl_TN_reg(rd, cpu_dst); | 2924 | gen_movl_TN_reg(rd, cpu_dst); |
2915 | } else if (xop == 0x27) { /* sra, V9 srax */ | 2925 | } else if (xop == 0x27) { /* sra, V9 srax */ |
2916 | - rs1 = GET_FIELD(insn, 13, 17); | ||
2917 | - gen_movl_reg_TN(rs1, cpu_src1); | 2926 | + cpu_src1 = get_src1(insn, cpu_src1); |
2918 | if (IS_IMM) { /* immediate */ | 2927 | if (IS_IMM) { /* immediate */ |
2919 | rs2 = GET_FIELDs(insn, 20, 31); | 2928 | rs2 = GET_FIELDs(insn, 20, 31); |
2920 | if (insn & (1 << 12)) { | 2929 | if (insn & (1 << 12)) { |
@@ -2939,8 +2948,7 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -2939,8 +2948,7 @@ static void disas_sparc_insn(DisasContext * dc) | ||
2939 | gen_movl_TN_reg(rd, cpu_dst); | 2948 | gen_movl_TN_reg(rd, cpu_dst); |
2940 | #endif | 2949 | #endif |
2941 | } else if (xop < 0x36) { | 2950 | } else if (xop < 0x36) { |
2942 | - rs1 = GET_FIELD(insn, 13, 17); | ||
2943 | - gen_movl_reg_TN(rs1, cpu_src1); | 2951 | + cpu_src1 = get_src1(insn, cpu_src1); |
2944 | if (IS_IMM) { /* immediate */ | 2952 | if (IS_IMM) { /* immediate */ |
2945 | rs2 = GET_FIELDs(insn, 19, 31); | 2953 | rs2 = GET_FIELDs(insn, 19, 31); |
2946 | tcg_gen_movi_tl(cpu_src2, (int)rs2); | 2954 | tcg_gen_movi_tl(cpu_src2, (int)rs2); |
@@ -3479,8 +3487,7 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -3479,8 +3487,7 @@ static void disas_sparc_insn(DisasContext * dc) | ||
3479 | int cond = GET_FIELD_SP(insn, 10, 12); | 3487 | int cond = GET_FIELD_SP(insn, 10, 12); |
3480 | int l1; | 3488 | int l1; |
3481 | 3489 | ||
3482 | - rs1 = GET_FIELD(insn, 13, 17); | ||
3483 | - gen_movl_reg_TN(rs1, cpu_src1); | 3490 | + cpu_src1 = get_src1(insn, cpu_src1); |
3484 | 3491 | ||
3485 | l1 = gen_new_label(); | 3492 | l1 = gen_new_label(); |
3486 | 3493 | ||
@@ -3526,14 +3533,14 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -3526,14 +3533,14 @@ static void disas_sparc_insn(DisasContext * dc) | ||
3526 | // XXX | 3533 | // XXX |
3527 | goto illegal_insn; | 3534 | goto illegal_insn; |
3528 | case 0x010: /* VIS I array8 */ | 3535 | case 0x010: /* VIS I array8 */ |
3529 | - gen_movl_reg_TN(rs1, cpu_src1); | 3536 | + cpu_src1 = get_src1(insn, cpu_src1); |
3530 | gen_movl_reg_TN(rs2, cpu_src2); | 3537 | gen_movl_reg_TN(rs2, cpu_src2); |
3531 | tcg_gen_helper_1_2(helper_array8, cpu_dst, cpu_src1, | 3538 | tcg_gen_helper_1_2(helper_array8, cpu_dst, cpu_src1, |
3532 | cpu_src2); | 3539 | cpu_src2); |
3533 | gen_movl_TN_reg(rd, cpu_dst); | 3540 | gen_movl_TN_reg(rd, cpu_dst); |
3534 | break; | 3541 | break; |
3535 | case 0x012: /* VIS I array16 */ | 3542 | case 0x012: /* VIS I array16 */ |
3536 | - gen_movl_reg_TN(rs1, cpu_src1); | 3543 | + cpu_src1 = get_src1(insn, cpu_src1); |
3537 | gen_movl_reg_TN(rs2, cpu_src2); | 3544 | gen_movl_reg_TN(rs2, cpu_src2); |
3538 | tcg_gen_helper_1_2(helper_array8, cpu_dst, cpu_src1, | 3545 | tcg_gen_helper_1_2(helper_array8, cpu_dst, cpu_src1, |
3539 | cpu_src2); | 3546 | cpu_src2); |
@@ -3541,7 +3548,7 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -3541,7 +3548,7 @@ static void disas_sparc_insn(DisasContext * dc) | ||
3541 | gen_movl_TN_reg(rd, cpu_dst); | 3548 | gen_movl_TN_reg(rd, cpu_dst); |
3542 | break; | 3549 | break; |
3543 | case 0x014: /* VIS I array32 */ | 3550 | case 0x014: /* VIS I array32 */ |
3544 | - gen_movl_reg_TN(rs1, cpu_src1); | 3551 | + cpu_src1 = get_src1(insn, cpu_src1); |
3545 | gen_movl_reg_TN(rs2, cpu_src2); | 3552 | gen_movl_reg_TN(rs2, cpu_src2); |
3546 | tcg_gen_helper_1_2(helper_array8, cpu_dst, cpu_src1, | 3553 | tcg_gen_helper_1_2(helper_array8, cpu_dst, cpu_src1, |
3547 | cpu_src2); | 3554 | cpu_src2); |
@@ -3549,7 +3556,7 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -3549,7 +3556,7 @@ static void disas_sparc_insn(DisasContext * dc) | ||
3549 | gen_movl_TN_reg(rd, cpu_dst); | 3556 | gen_movl_TN_reg(rd, cpu_dst); |
3550 | break; | 3557 | break; |
3551 | case 0x018: /* VIS I alignaddr */ | 3558 | case 0x018: /* VIS I alignaddr */ |
3552 | - gen_movl_reg_TN(rs1, cpu_src1); | 3559 | + cpu_src1 = get_src1(insn, cpu_src1); |
3553 | gen_movl_reg_TN(rs2, cpu_src2); | 3560 | gen_movl_reg_TN(rs2, cpu_src2); |
3554 | tcg_gen_helper_1_2(helper_alignaddr, cpu_dst, cpu_src1, | 3561 | tcg_gen_helper_1_2(helper_alignaddr, cpu_dst, cpu_src1, |
3555 | cpu_src2); | 3562 | cpu_src2); |
@@ -3914,9 +3921,8 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -3914,9 +3921,8 @@ static void disas_sparc_insn(DisasContext * dc) | ||
3914 | #endif | 3921 | #endif |
3915 | #ifdef TARGET_SPARC64 | 3922 | #ifdef TARGET_SPARC64 |
3916 | } else if (xop == 0x39) { /* V9 return */ | 3923 | } else if (xop == 0x39) { /* V9 return */ |
3917 | - rs1 = GET_FIELD(insn, 13, 17); | ||
3918 | save_state(dc, cpu_cond); | 3924 | save_state(dc, cpu_cond); |
3919 | - gen_movl_reg_TN(rs1, cpu_src1); | 3925 | + cpu_src1 = get_src1(insn, cpu_src1); |
3920 | if (IS_IMM) { /* immediate */ | 3926 | if (IS_IMM) { /* immediate */ |
3921 | rs2 = GET_FIELDs(insn, 19, 31); | 3927 | rs2 = GET_FIELDs(insn, 19, 31); |
3922 | tcg_gen_addi_tl(cpu_dst, cpu_src1, (int)rs2); | 3928 | tcg_gen_addi_tl(cpu_dst, cpu_src1, (int)rs2); |
@@ -3939,8 +3945,7 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -3939,8 +3945,7 @@ static void disas_sparc_insn(DisasContext * dc) | ||
3939 | goto jmp_insn; | 3945 | goto jmp_insn; |
3940 | #endif | 3946 | #endif |
3941 | } else { | 3947 | } else { |
3942 | - rs1 = GET_FIELD(insn, 13, 17); | ||
3943 | - gen_movl_reg_TN(rs1, cpu_src1); | 3948 | + cpu_src1 = get_src1(insn, cpu_src1); |
3944 | if (IS_IMM) { /* immediate */ | 3949 | if (IS_IMM) { /* immediate */ |
3945 | rs2 = GET_FIELDs(insn, 19, 31); | 3950 | rs2 = GET_FIELDs(insn, 19, 31); |
3946 | tcg_gen_addi_tl(cpu_dst, cpu_src1, (int)rs2); | 3951 | tcg_gen_addi_tl(cpu_dst, cpu_src1, (int)rs2); |
@@ -4028,9 +4033,9 @@ static void disas_sparc_insn(DisasContext * dc) | @@ -4028,9 +4033,9 @@ static void disas_sparc_insn(DisasContext * dc) | ||
4028 | case 3: /* load/store instructions */ | 4033 | case 3: /* load/store instructions */ |
4029 | { | 4034 | { |
4030 | unsigned int xop = GET_FIELD(insn, 7, 12); | 4035 | unsigned int xop = GET_FIELD(insn, 7, 12); |
4031 | - rs1 = GET_FIELD(insn, 13, 17); | 4036 | + |
4032 | save_state(dc, cpu_cond); | 4037 | save_state(dc, cpu_cond); |
4033 | - gen_movl_reg_TN(rs1, cpu_src1); | 4038 | + cpu_src1 = get_src1(insn, cpu_src1); |
4034 | if (xop == 0x3c || xop == 0x3e) | 4039 | if (xop == 0x3c || xop == 0x3e) |
4035 | { | 4040 | { |
4036 | rs2 = GET_FIELD(insn, 27, 31); | 4041 | rs2 = GET_FIELD(insn, 27, 31); |