(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
s390/
vxe/
popcount-1.c
       1  /* { dg-do run } */
       2  /* { dg-options "-O3 -mzarch -march=arch12 --save-temps" } */
       3  /* { dg-require-effective-target s390_vxe } */
       4  
       5  /* Vectorization currently only works for v4si.  v8hi at least uses 2x
       6     vpopctf but no vpopcth.  */
       7  
       8  typedef unsigned char     uv16qi __attribute__((vector_size(16)));
       9  typedef unsigned short     uv8hi __attribute__((vector_size(16)));
      10  typedef unsigned int       uv4si __attribute__((vector_size(16)));
      11  typedef unsigned long long uv2di __attribute__((vector_size(16)));
      12  
      13  uv16qi __attribute__((noinline))
      14  vpopctb (uv16qi a)
      15  {
      16    uv16qi r;
      17    int i;
      18  
      19    for (i = 0; i < 16; i++)
      20      r[i] = __builtin_popcount (a[i]);
      21  
      22    return r;
      23  }
      24  /* { dg-final { scan-assembler "vpopctb\t%v24,%v24" { xfail *-*-* } } } */
      25  
      26  uv8hi __attribute__((noinline))
      27  vpopcth (uv8hi a)
      28  {
      29    uv8hi r;
      30    int i;
      31  
      32    for (i = 0; i < 8; i++)
      33      r[i] = __builtin_popcount (a[i]);
      34  
      35    return r;
      36  }
      37  /* { dg-final { scan-assembler "vpopcth\t%v24,%v24" { xfail *-*-* } } } */
      38  
      39  uv4si __attribute__((noinline))
      40  vpopctf (uv4si a)
      41  {
      42    uv4si r;
      43    int i;
      44  
      45    for (i = 0; i < 4; i++)
      46      r[i] = __builtin_popcount (a[i]);
      47  
      48    return r;
      49  }
      50  /* { dg-final { scan-assembler "vpopctf\t%v24,%v24" } } */
      51  
      52  uv2di __attribute__((noinline))
      53  vpopctg (uv2di a)
      54  {
      55    uv2di r;
      56    int i;
      57  
      58    for (i = 0; i < 2; i++)
      59      r[i] = __builtin_popcount (a[i]);
      60  
      61    return r;
      62  }
      63  /* { dg-final { scan-assembler "vpopctg\t%v24,%v24" { xfail *-*-* } } } */
      64  
      65  int
      66  main ()
      67  {
      68    uv16qi a = (uv16qi){ 42, 1, ~0, 2, 42, 1, ~0, 2, 42, 1, ~0, 2, 42, 1, ~0, 2 };
      69    if (__builtin_s390_vec_any_ne (vpopctb (a),
      70  				 (uv16qi){ 3, 1, 8, 1, 3, 1, 8, 1,
      71  					   3, 1, 8, 1, 3, 1, 8, 1 }))
      72      __builtin_abort ();
      73  
      74    if (__builtin_s390_vec_any_ne (vpopcth ((uv8hi){ 42, 1, ~0, 2, 42, 1, ~0, 2 }),
      75  				 (uv8hi){ 3, 1, 16, 1, 3, 1, 16, 1 }))
      76      __builtin_abort ();
      77  
      78    if (__builtin_s390_vec_any_ne (vpopctf ((uv4si){ 42, 1, ~0, 2 }),
      79  				 (uv4si){ 3, 1, 32, 1 }))
      80      __builtin_abort ();
      81  
      82    if (__builtin_s390_vec_any_ne (vpopctg ((uv2di){ 42, 1 }),
      83  					  (uv2di){ 3, 1 }))
      84        __builtin_abort ();
      85  
      86  
      87    return 0;
      88  }