On Mon, Jan 2, 2012 at 9:31 PM, Richard Henderson <r...@redhat.com> wrote: > On 01/03/2012 06:47 AM, Uros Bizjak wrote: >> if (d->testing_p) >> return true; >> >> + hi = shift < nelt ? d->op1 : d->op0; >> + lo = shift < nelt ? d->op0 : d->op1; >> + >> + shift %= nelt; > > This bit only works for little-endian. It's why I had that assert > for shift range 1-63, for one thing. > > I guess an extra check for big-endian before the loop could fix that. > I.e. > > shift = d->perm[0]; > + if (BYTES_BIG_ENDIAN && shift > nelt) > + return false;
I tried to investigate -mbig-endian a bit, but unfortunately almost all gcc.dg/torture/vshuf-*.c tests FAIL with -O2 on unpatched gcc. Tests pass with -O0, though. Due to this, I committed only the obvious part of the patch, that is: 2012-01-02 Uros Bizjak <ubiz...@gmail.com> * config/ia64/ia64.c (expand_vec_perm_broadcast): Use correct operands for extzv pattern. Uros.