Viewing file: popcount-1.c (2 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* { 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; }
|