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

Reply via email to