blob: 9ea835a1cf0703ff29281f49419b39cc72f2430e [file] [log] [blame]
/* { dg-do run } */
/* { dg-options "-O3 -mzarch -march=arch12 --save-temps" } */
/* { dg-require-effective-target s390_vxe } */
/* Vectorization currently only works for v4si. v8hi at least uses 2x
vpopctf but no vpopcth. */
typedef unsigned char uv16qi __attribute__((vector_size(16)));
typedef unsigned short uv8hi __attribute__((vector_size(16)));
typedef unsigned int uv4si __attribute__((vector_size(16)));
typedef unsigned long long uv2di __attribute__((vector_size(16)));
uv16qi __attribute__((noinline))
vpopctb (uv16qi a)
{
uv16qi r;
int i;
for (i = 0; i < 16; i++)
r[i] = __builtin_popcount (a[i]);
return r;
}
/* { dg-final { scan-assembler "vpopctb\t%v24,%v24" { xfail *-*-* } } } */
uv8hi __attribute__((noinline))
vpopcth (uv8hi a)
{
uv8hi r;
int i;
for (i = 0; i < 8; i++)
r[i] = __builtin_popcount (a[i]);
return r;
}
/* { dg-final { scan-assembler "vpopcth\t%v24,%v24" { xfail *-*-* } } } */
uv4si __attribute__((noinline))
vpopctf (uv4si a)
{
uv4si r;
int i;
for (i = 0; i < 4; i++)
r[i] = __builtin_popcount (a[i]);
return r;
}
/* { dg-final { scan-assembler "vpopctf\t%v24,%v24" } } */
uv2di __attribute__((noinline))
vpopctg (uv2di a)
{
uv2di r;
int i;
for (i = 0; i < 2; i++)
r[i] = __builtin_popcount (a[i]);
return r;
}
/* { dg-final { scan-assembler "vpopctg\t%v24,%v24" { xfail *-*-* } } } */
int
main ()
{
uv16qi a = (uv16qi){ 42, 1, ~0, 2, 42, 1, ~0, 2, 42, 1, ~0, 2, 42, 1, ~0, 2 };
if (__builtin_s390_vec_any_ne (vpopctb (a),
(uv16qi){ 3, 1, 8, 1, 3, 1, 8, 1,
3, 1, 8, 1, 3, 1, 8, 1 }))
__builtin_abort ();
if (__builtin_s390_vec_any_ne (vpopcth ((uv8hi){ 42, 1, ~0, 2, 42, 1, ~0, 2 }),
(uv8hi){ 3, 1, 16, 1, 3, 1, 16, 1 }))
__builtin_abort ();
if (__builtin_s390_vec_any_ne (vpopctf ((uv4si){ 42, 1, ~0, 2 }),
(uv4si){ 3, 1, 32, 1 }))
__builtin_abort ();
if (__builtin_s390_vec_any_ne (vpopctg ((uv2di){ 42, 1 }),
(uv2di){ 3, 1 }))
__builtin_abort ();
return 0;
}