https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98218
--- Comment #3 from Uroš Bizjak <ubizjak at gmail dot com> ---
Testcase 1:
--cut here--
typedef short vec __attribute__((vector_size(8)));
typedef unsigned short uvec __attribute__((vector_size(8)));
vec lt (vec a, vec b) { return a < b; }
vec le (vec a, vec b) { return a <= b; }
vec eq (vec a, vec b) { return a == b; }
vec ne (vec a, vec b) { return a != b; }
vec ge (vec a, vec b) { return a >= b; }
vec gt (vec a, vec b) { return a > b; }
vec ltu (uvec a, uvec b) { return a < b; }
vec leu (uvec a, uvec b) { return a <= b; }
vec geu (uvec a, uvec b) { return a >= b; }
vec gtu (uvec a, uvec b) { return a > b; }
--cut here--
Testcase 2:
--cut here--
typedef short T;
#define M 4
T a[M];
T b[M];
T s1[M];
T s2[M];
T r[M];
void foo (void)
{
int j;
for (j = 0; j < M; j++)
r[j] = (a[j] < b[j]) ? s1[j] : s2[j];
}
--cut here--
gcc -O3:
foo:
movq a(%rip), %xmm1
movq b(%rip), %xmm0
movq s2(%rip), %xmm2
pcmpgtw %xmm1, %xmm0
movq s1(%rip), %xmm1
pand %xmm0, %xmm1
pandn %xmm2, %xmm0
por %xmm1, %xmm0
movq %xmm0, r(%rip)
ret