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 | 1817 | } |
| 1818 | 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 | 1837 | /* before an instruction, dc->pc must be static */ |
| 1821 | 1838 | static void disas_sparc_insn(DisasContext * dc) |
| 1822 | 1839 | { |
| ... | ... | @@ -1864,8 +1881,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 1864 | 1881 | (GET_FIELD_SP(insn, 20, 21) << 14); |
| 1865 | 1882 | target = sign_extend(target, 16); |
| 1866 | 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 | 1885 | do_branch_reg(dc, target, insn, cpu_cond, cpu_src1); |
| 1870 | 1886 | goto jmp_insn; |
| 1871 | 1887 | } |
| ... | ... | @@ -1939,8 +1955,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 1939 | 1955 | if (xop == 0x3a) { /* generate trap */ |
| 1940 | 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 | 1959 | if (IS_IMM) { |
| 1945 | 1960 | rs2 = GET_FIELD(insn, 25, 31); |
| 1946 | 1961 | tcg_gen_addi_tl(cpu_dst, cpu_src1, rs2); |
| ... | ... | @@ -2637,8 +2652,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2637 | 2652 | |
| 2638 | 2653 | l1 = gen_new_label(); |
| 2639 | 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 | 2656 | tcg_gen_brcond_tl(gen_tcg_cond_reg[cond], cpu_src1, |
| 2643 | 2657 | tcg_const_tl(0), l1); |
| 2644 | 2658 | gen_op_load_fpr_FT0(rs2); |
| ... | ... | @@ -2650,8 +2664,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2650 | 2664 | |
| 2651 | 2665 | l1 = gen_new_label(); |
| 2652 | 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 | 2668 | tcg_gen_brcond_tl(gen_tcg_cond_reg[cond], cpu_src1, |
| 2656 | 2669 | tcg_const_tl(0), l1); |
| 2657 | 2670 | gen_op_load_fpr_DT0(DFPREG(rs2)); |
| ... | ... | @@ -2664,8 +2677,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2664 | 2677 | |
| 2665 | 2678 | l1 = gen_new_label(); |
| 2666 | 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 | 2681 | tcg_gen_brcond_tl(gen_tcg_cond_reg[cond], cpu_src1, |
| 2670 | 2682 | tcg_const_tl(0), l1); |
| 2671 | 2683 | gen_op_load_fpr_QT0(QFPREG(rs2)); |
| ... | ... | @@ -2848,7 +2860,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2848 | 2860 | gen_movl_reg_TN(rs2, cpu_dst); |
| 2849 | 2861 | } |
| 2850 | 2862 | } else { |
| 2851 | - gen_movl_reg_TN(rs1, cpu_src1); | |
| 2863 | + cpu_src1 = get_src1(insn, cpu_src1); | |
| 2852 | 2864 | if (IS_IMM) { /* immediate */ |
| 2853 | 2865 | rs2 = GET_FIELDs(insn, 19, 31); |
| 2854 | 2866 | tcg_gen_ori_tl(cpu_dst, cpu_src1, (int)rs2); |
| ... | ... | @@ -2865,8 +2877,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2865 | 2877 | #endif |
| 2866 | 2878 | #ifdef TARGET_SPARC64 |
| 2867 | 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 | 2881 | if (IS_IMM) { /* immediate */ |
| 2871 | 2882 | rs2 = GET_FIELDs(insn, 20, 31); |
| 2872 | 2883 | if (insn & (1 << 12)) { |
| ... | ... | @@ -2889,8 +2900,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2889 | 2900 | } |
| 2890 | 2901 | gen_movl_TN_reg(rd, cpu_dst); |
| 2891 | 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 | 2904 | if (IS_IMM) { /* immediate */ |
| 2895 | 2905 | rs2 = GET_FIELDs(insn, 20, 31); |
| 2896 | 2906 | if (insn & (1 << 12)) { |
| ... | ... | @@ -2913,8 +2923,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2913 | 2923 | } |
| 2914 | 2924 | gen_movl_TN_reg(rd, cpu_dst); |
| 2915 | 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 | 2927 | if (IS_IMM) { /* immediate */ |
| 2919 | 2928 | rs2 = GET_FIELDs(insn, 20, 31); |
| 2920 | 2929 | if (insn & (1 << 12)) { |
| ... | ... | @@ -2939,8 +2948,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 2939 | 2948 | gen_movl_TN_reg(rd, cpu_dst); |
| 2940 | 2949 | #endif |
| 2941 | 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 | 2952 | if (IS_IMM) { /* immediate */ |
| 2945 | 2953 | rs2 = GET_FIELDs(insn, 19, 31); |
| 2946 | 2954 | tcg_gen_movi_tl(cpu_src2, (int)rs2); |
| ... | ... | @@ -3479,8 +3487,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 3479 | 3487 | int cond = GET_FIELD_SP(insn, 10, 12); |
| 3480 | 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 | 3492 | l1 = gen_new_label(); |
| 3486 | 3493 | |
| ... | ... | @@ -3526,14 +3533,14 @@ static void disas_sparc_insn(DisasContext * dc) |
| 3526 | 3533 | // XXX |
| 3527 | 3534 | goto illegal_insn; |
| 3528 | 3535 | case 0x010: /* VIS I array8 */ |
| 3529 | - gen_movl_reg_TN(rs1, cpu_src1); | |
| 3536 | + cpu_src1 = get_src1(insn, cpu_src1); | |
| 3530 | 3537 | gen_movl_reg_TN(rs2, cpu_src2); |
| 3531 | 3538 | tcg_gen_helper_1_2(helper_array8, cpu_dst, cpu_src1, |
| 3532 | 3539 | cpu_src2); |
| 3533 | 3540 | gen_movl_TN_reg(rd, cpu_dst); |
| 3534 | 3541 | break; |
| 3535 | 3542 | case 0x012: /* VIS I array16 */ |
| 3536 | - gen_movl_reg_TN(rs1, cpu_src1); | |
| 3543 | + cpu_src1 = get_src1(insn, cpu_src1); | |
| 3537 | 3544 | gen_movl_reg_TN(rs2, cpu_src2); |
| 3538 | 3545 | tcg_gen_helper_1_2(helper_array8, cpu_dst, cpu_src1, |
| 3539 | 3546 | cpu_src2); |
| ... | ... | @@ -3541,7 +3548,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 3541 | 3548 | gen_movl_TN_reg(rd, cpu_dst); |
| 3542 | 3549 | break; |
| 3543 | 3550 | case 0x014: /* VIS I array32 */ |
| 3544 | - gen_movl_reg_TN(rs1, cpu_src1); | |
| 3551 | + cpu_src1 = get_src1(insn, cpu_src1); | |
| 3545 | 3552 | gen_movl_reg_TN(rs2, cpu_src2); |
| 3546 | 3553 | tcg_gen_helper_1_2(helper_array8, cpu_dst, cpu_src1, |
| 3547 | 3554 | cpu_src2); |
| ... | ... | @@ -3549,7 +3556,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 3549 | 3556 | gen_movl_TN_reg(rd, cpu_dst); |
| 3550 | 3557 | break; |
| 3551 | 3558 | case 0x018: /* VIS I alignaddr */ |
| 3552 | - gen_movl_reg_TN(rs1, cpu_src1); | |
| 3559 | + cpu_src1 = get_src1(insn, cpu_src1); | |
| 3553 | 3560 | gen_movl_reg_TN(rs2, cpu_src2); |
| 3554 | 3561 | tcg_gen_helper_1_2(helper_alignaddr, cpu_dst, cpu_src1, |
| 3555 | 3562 | cpu_src2); |
| ... | ... | @@ -3914,9 +3921,8 @@ static void disas_sparc_insn(DisasContext * dc) |
| 3914 | 3921 | #endif |
| 3915 | 3922 | #ifdef TARGET_SPARC64 |
| 3916 | 3923 | } else if (xop == 0x39) { /* V9 return */ |
| 3917 | - rs1 = GET_FIELD(insn, 13, 17); | |
| 3918 | 3924 | save_state(dc, cpu_cond); |
| 3919 | - gen_movl_reg_TN(rs1, cpu_src1); | |
| 3925 | + cpu_src1 = get_src1(insn, cpu_src1); | |
| 3920 | 3926 | if (IS_IMM) { /* immediate */ |
| 3921 | 3927 | rs2 = GET_FIELDs(insn, 19, 31); |
| 3922 | 3928 | tcg_gen_addi_tl(cpu_dst, cpu_src1, (int)rs2); |
| ... | ... | @@ -3939,8 +3945,7 @@ static void disas_sparc_insn(DisasContext * dc) |
| 3939 | 3945 | goto jmp_insn; |
| 3940 | 3946 | #endif |
| 3941 | 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 | 3949 | if (IS_IMM) { /* immediate */ |
| 3945 | 3950 | rs2 = GET_FIELDs(insn, 19, 31); |
| 3946 | 3951 | tcg_gen_addi_tl(cpu_dst, cpu_src1, (int)rs2); |
| ... | ... | @@ -4028,9 +4033,9 @@ static void disas_sparc_insn(DisasContext * dc) |
| 4028 | 4033 | case 3: /* load/store instructions */ |
| 4029 | 4034 | { |
| 4030 | 4035 | unsigned int xop = GET_FIELD(insn, 7, 12); |
| 4031 | - rs1 = GET_FIELD(insn, 13, 17); | |
| 4036 | + | |
| 4032 | 4037 | save_state(dc, cpu_cond); |
| 4033 | - gen_movl_reg_TN(rs1, cpu_src1); | |
| 4038 | + cpu_src1 = get_src1(insn, cpu_src1); | |
| 4034 | 4039 | if (xop == 0x3c || xop == 0x3e) |
| 4035 | 4040 | { |
| 4036 | 4041 | rs2 = GET_FIELD(insn, 27, 31); | ... | ... |