Commit dc5acc23943d5f81bdc09e1512d2364404151144
1 parent
fb951ff5
Convert disas_neon_ls_insn not to use cpu_T.
Signed-off-by: Filip Navara <filip.navara@gmail.com>
Showing
1 changed file
with
35 additions
and
34 deletions
target-arm/translate.c
... | ... | @@ -3767,6 +3767,7 @@ static int disas_neon_ls_insn(CPUState * env, DisasContext *s, uint32_t insn) |
3767 | 3767 | int load; |
3768 | 3768 | int shift; |
3769 | 3769 | int n; |
3770 | + TCGv addr; | |
3770 | 3771 | TCGv tmp; |
3771 | 3772 | TCGv tmp2; |
3772 | 3773 | |
... | ... | @@ -3776,6 +3777,7 @@ static int disas_neon_ls_insn(CPUState * env, DisasContext *s, uint32_t insn) |
3776 | 3777 | rn = (insn >> 16) & 0xf; |
3777 | 3778 | rm = insn & 0xf; |
3778 | 3779 | load = (insn & (1 << 21)) != 0; |
3780 | + addr = new_tmp(); | |
3779 | 3781 | if ((insn & (1 << 23)) == 0) { |
3780 | 3782 | /* Load store all elements. */ |
3781 | 3783 | op = (insn >> 8) & 0xf; |
... | ... | @@ -3784,32 +3786,30 @@ static int disas_neon_ls_insn(CPUState * env, DisasContext *s, uint32_t insn) |
3784 | 3786 | return 1; |
3785 | 3787 | nregs = neon_ls_element_type[op].nregs; |
3786 | 3788 | interleave = neon_ls_element_type[op].interleave; |
3787 | - gen_movl_T1_reg(s, rn); | |
3789 | + tcg_gen_mov_i32(addr, cpu_R[rn]); | |
3788 | 3790 | stride = (1 << size) * interleave; |
3789 | 3791 | for (reg = 0; reg < nregs; reg++) { |
3790 | 3792 | if (interleave > 2 || (interleave == 2 && nregs == 2)) { |
3791 | - gen_movl_T1_reg(s, rn); | |
3792 | - gen_op_addl_T1_im((1 << size) * reg); | |
3793 | + tcg_gen_add_i32(addr, cpu_R[rn], (1 << size) * reg); | |
3793 | 3794 | } else if (interleave == 2 && nregs == 4 && reg == 2) { |
3794 | - gen_movl_T1_reg(s, rn); | |
3795 | - gen_op_addl_T1_im(1 << size); | |
3795 | + tcg_gen_add_i32(addr, cpu_R[rn], 1 << size); | |
3796 | 3796 | } |
3797 | 3797 | for (pass = 0; pass < 2; pass++) { |
3798 | 3798 | if (size == 2) { |
3799 | 3799 | if (load) { |
3800 | - tmp = gen_ld32(cpu_T[1], IS_USER(s)); | |
3800 | + tmp = gen_ld32(addr, IS_USER(s)); | |
3801 | 3801 | neon_store_reg(rd, pass, tmp); |
3802 | 3802 | } else { |
3803 | 3803 | tmp = neon_load_reg(rd, pass); |
3804 | - gen_st32(tmp, cpu_T[1], IS_USER(s)); | |
3804 | + gen_st32(tmp, addr, IS_USER(s)); | |
3805 | 3805 | } |
3806 | - gen_op_addl_T1_im(stride); | |
3806 | + tcg_gen_addi_i32(addr, addr, stride); | |
3807 | 3807 | } else if (size == 1) { |
3808 | 3808 | if (load) { |
3809 | - tmp = gen_ld16u(cpu_T[1], IS_USER(s)); | |
3810 | - gen_op_addl_T1_im(stride); | |
3811 | - tmp2 = gen_ld16u(cpu_T[1], IS_USER(s)); | |
3812 | - gen_op_addl_T1_im(stride); | |
3809 | + tmp = gen_ld16u(addr, IS_USER(s)); | |
3810 | + tcg_gen_addi_i32(addr, addr, stride); | |
3811 | + tmp2 = gen_ld16u(addr, IS_USER(s)); | |
3812 | + tcg_gen_addi_i32(addr, addr, stride); | |
3813 | 3813 | gen_bfi(tmp, tmp, tmp2, 16, 0xffff); |
3814 | 3814 | dead_tmp(tmp2); |
3815 | 3815 | neon_store_reg(rd, pass, tmp); |
... | ... | @@ -3817,17 +3817,17 @@ static int disas_neon_ls_insn(CPUState * env, DisasContext *s, uint32_t insn) |
3817 | 3817 | tmp = neon_load_reg(rd, pass); |
3818 | 3818 | tmp2 = new_tmp(); |
3819 | 3819 | tcg_gen_shri_i32(tmp2, tmp, 16); |
3820 | - gen_st16(tmp, cpu_T[1], IS_USER(s)); | |
3821 | - gen_op_addl_T1_im(stride); | |
3822 | - gen_st16(tmp2, cpu_T[1], IS_USER(s)); | |
3823 | - gen_op_addl_T1_im(stride); | |
3820 | + gen_st16(tmp, addr, IS_USER(s)); | |
3821 | + tcg_gen_addi_i32(addr, addr, stride); | |
3822 | + gen_st16(tmp2, addr, IS_USER(s)); | |
3823 | + tcg_gen_addi_i32(addr, addr, stride); | |
3824 | 3824 | } |
3825 | 3825 | } else /* size == 0 */ { |
3826 | 3826 | if (load) { |
3827 | 3827 | TCGV_UNUSED(tmp2); |
3828 | 3828 | for (n = 0; n < 4; n++) { |
3829 | - tmp = gen_ld8u(cpu_T[1], IS_USER(s)); | |
3830 | - gen_op_addl_T1_im(stride); | |
3829 | + tmp = gen_ld8u(addr, IS_USER(s)); | |
3830 | + tcg_gen_addi_i32(addr, addr, stride); | |
3831 | 3831 | if (n == 0) { |
3832 | 3832 | tmp2 = tmp; |
3833 | 3833 | } else { |
... | ... | @@ -3845,8 +3845,8 @@ static int disas_neon_ls_insn(CPUState * env, DisasContext *s, uint32_t insn) |
3845 | 3845 | } else { |
3846 | 3846 | tcg_gen_shri_i32(tmp, tmp2, n * 8); |
3847 | 3847 | } |
3848 | - gen_st8(tmp, cpu_T[1], IS_USER(s)); | |
3849 | - gen_op_addl_T1_im(stride); | |
3848 | + gen_st8(tmp, addr, IS_USER(s)); | |
3849 | + tcg_gen_addi_i32(addr, addr, stride); | |
3850 | 3850 | } |
3851 | 3851 | dead_tmp(tmp2); |
3852 | 3852 | } |
... | ... | @@ -3854,7 +3854,7 @@ static int disas_neon_ls_insn(CPUState * env, DisasContext *s, uint32_t insn) |
3854 | 3854 | } |
3855 | 3855 | rd += neon_ls_element_type[op].spacing; |
3856 | 3856 | } |
3857 | - stride = nregs * 8; | |
3857 | + stride = nregs * 8; | |
3858 | 3858 | } else { |
3859 | 3859 | size = (insn >> 10) & 3; |
3860 | 3860 | if (size == 3) { |
... | ... | @@ -3864,26 +3864,26 @@ static int disas_neon_ls_insn(CPUState * env, DisasContext *s, uint32_t insn) |
3864 | 3864 | size = (insn >> 6) & 3; |
3865 | 3865 | nregs = ((insn >> 8) & 3) + 1; |
3866 | 3866 | stride = (insn & (1 << 5)) ? 2 : 1; |
3867 | - gen_movl_T1_reg(s, rn); | |
3867 | + tcg_gen_mov_i32(addr, cpu_R[rn]); | |
3868 | 3868 | for (reg = 0; reg < nregs; reg++) { |
3869 | 3869 | switch (size) { |
3870 | 3870 | case 0: |
3871 | - tmp = gen_ld8u(cpu_T[1], IS_USER(s)); | |
3871 | + tmp = gen_ld8u(addr, IS_USER(s)); | |
3872 | 3872 | gen_neon_dup_u8(tmp, 0); |
3873 | 3873 | break; |
3874 | 3874 | case 1: |
3875 | - tmp = gen_ld16u(cpu_T[1], IS_USER(s)); | |
3875 | + tmp = gen_ld16u(addr, IS_USER(s)); | |
3876 | 3876 | gen_neon_dup_low16(tmp); |
3877 | 3877 | break; |
3878 | 3878 | case 2: |
3879 | - tmp = gen_ld32(cpu_T[0], IS_USER(s)); | |
3879 | + tmp = gen_ld32(addr, IS_USER(s)); | |
3880 | 3880 | break; |
3881 | 3881 | case 3: |
3882 | 3882 | return 1; |
3883 | 3883 | default: /* Avoid compiler warnings. */ |
3884 | 3884 | abort(); |
3885 | 3885 | } |
3886 | - gen_op_addl_T1_im(1 << size); | |
3886 | + tcg_gen_addi_i32(addr, addr, 1 << size); | |
3887 | 3887 | tmp2 = new_tmp(); |
3888 | 3888 | tcg_gen_mov_i32(tmp2, tmp); |
3889 | 3889 | neon_store_reg(rd, 0, tmp2); |
... | ... | @@ -3911,18 +3911,18 @@ static int disas_neon_ls_insn(CPUState * env, DisasContext *s, uint32_t insn) |
3911 | 3911 | abort(); |
3912 | 3912 | } |
3913 | 3913 | nregs = ((insn >> 8) & 3) + 1; |
3914 | - gen_movl_T1_reg(s, rn); | |
3914 | + tcg_gen_mov_i32(addr, cpu_R[rn]); | |
3915 | 3915 | for (reg = 0; reg < nregs; reg++) { |
3916 | 3916 | if (load) { |
3917 | 3917 | switch (size) { |
3918 | 3918 | case 0: |
3919 | - tmp = gen_ld8u(cpu_T[1], IS_USER(s)); | |
3919 | + tmp = gen_ld8u(addr, IS_USER(s)); | |
3920 | 3920 | break; |
3921 | 3921 | case 1: |
3922 | - tmp = gen_ld16u(cpu_T[1], IS_USER(s)); | |
3922 | + tmp = gen_ld16u(addr, IS_USER(s)); | |
3923 | 3923 | break; |
3924 | 3924 | case 2: |
3925 | - tmp = gen_ld32(cpu_T[1], IS_USER(s)); | |
3925 | + tmp = gen_ld32(addr, IS_USER(s)); | |
3926 | 3926 | break; |
3927 | 3927 | default: /* Avoid compiler warnings. */ |
3928 | 3928 | abort(); |
... | ... | @@ -3939,22 +3939,23 @@ static int disas_neon_ls_insn(CPUState * env, DisasContext *s, uint32_t insn) |
3939 | 3939 | tcg_gen_shri_i32(tmp, tmp, shift); |
3940 | 3940 | switch (size) { |
3941 | 3941 | case 0: |
3942 | - gen_st8(tmp, cpu_T[1], IS_USER(s)); | |
3942 | + gen_st8(tmp, addr, IS_USER(s)); | |
3943 | 3943 | break; |
3944 | 3944 | case 1: |
3945 | - gen_st16(tmp, cpu_T[1], IS_USER(s)); | |
3945 | + gen_st16(tmp, addr, IS_USER(s)); | |
3946 | 3946 | break; |
3947 | 3947 | case 2: |
3948 | - gen_st32(tmp, cpu_T[1], IS_USER(s)); | |
3948 | + gen_st32(tmp, addr, IS_USER(s)); | |
3949 | 3949 | break; |
3950 | 3950 | } |
3951 | 3951 | } |
3952 | 3952 | rd += stride; |
3953 | - gen_op_addl_T1_im(1 << size); | |
3953 | + tcg_gen_addi_i32(addr, addr, 1 << size); | |
3954 | 3954 | } |
3955 | 3955 | stride = nregs * (1 << size); |
3956 | 3956 | } |
3957 | 3957 | } |
3958 | + dead_tmp(addr); | |
3958 | 3959 | if (rm != 15) { |
3959 | 3960 | TCGv base; |
3960 | 3961 | ... | ... |