On Mon, 13 Sept 2021 at 14:56, Richard Henderson <richard.hender...@linaro.org> wrote: > > On 9/13/21 2:54 AM, Peter Maydell wrote: > > +static void do_gvec_shri_s(unsigned vece, uint32_t dofs, uint32_t aofs, > > + int64_t shift, uint32_t oprsz, uint32_t maxsz) > > +{ > > + /* > > + * We get here with a negated shift count, and we must handle > > + * shifts by the element size, which tcg_gen_gvec_sari() does not do. > > + */ > > + shift = -shift; > > You've already performed the negation in do_2shift_vec.
Here we are undoing the negation we did there, so as to get a "positive means shift right" shift count back again, which is what the instruction encoding has and what tcg_gen_gvic_shri() wants. > > + if (shift == (8 << vece)) { > > + shift--; > > + } > > + tcg_gen_gvec_sari(vece, dofs, aofs, shift, oprsz, maxsz); > ... > > + if (shift == (8 << vece)) { > > + tcg_gen_gvec_dup_imm(vece, dofs, oprsz, maxsz, 0); > > + } else { > > + tcg_gen_gvec_shri(vece, dofs, aofs, shift, oprsz, maxsz); > > + } > > > Perhaps worth placing these functions somewhere we can share code with NEON? > Tactical > error, perhaps, open-coding these tests in trans_VSHR_S_2sh and > trans_VSHR_U_2sh. I'm not convinced the resemblance is close enough to be worth the effort... -- PMM