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.
+ 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.
r~