(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
powerpc/
vec-gnb-1.c
       1  /* { dg-do run { target { power10_hw } } } */
       2  /* { dg-do link { target { ! power10_hw } } } */
       3  /* { dg-require-effective-target power10_ok } */
       4  /* { dg-require-effective-target int128 } */
       5  /* { dg-options "-mdejagnu-cpu=power10" } */
       6  
       7  #include <altivec.h>
       8  
       9  extern void abort (void);
      10  
      11  unsigned long long int
      12  do_vec_gnb (vector unsigned __int128 source, int stride)
      13  {
      14    switch (stride)
      15      {
      16      case 2:
      17        return vec_gnb (source, 2);
      18      case 3:
      19        return vec_gnb (source, 3);
      20      case 4:
      21        return vec_gnb (source, 4);
      22      case 5:
      23        return vec_gnb (source, 5);
      24      case 6:
      25        return vec_gnb (source, 6);
      26      case 7:
      27        return vec_gnb (source, 7);
      28  
      29      default:
      30        /* Illegal value of stride */
      31        abort ();
      32        return 0;
      33      }
      34  }
      35  
      36  int
      37  main (int argc, char *argv [])
      38  {
      39    /* For result = 0xaaaa_0000_0000_0000, use:
      40        stride = 2: binary 1x0x_1x0x_1x0x_... = 0x8888_8888_0000_0000, 0
      41        stride = 4: binary 1xxx_0xxx_1xxx_0xxxx = 0x8080_8080_8080_8080, 0
      42  
      43       For result = 0xaaaa_aaaa_0000_0000, use:
      44        stride = 2: source = 0x8888_8888_8888_8888, 0x0 }
      45        stride = 4: source = { 0x8080_8080_8080_8080, 0x8080_8080_8080_8080 }
      46    */
      47  
      48    /* The last array element appears in the left-most (first) bit
      49       positions of the vector register.  */
      50    vector unsigned __int128 source_a =
      51      { ((unsigned __int128) 0x8888888800000000ull) << 64 };
      52    vector unsigned __int128 source_b =
      53      { ((unsigned __int128) 0x8080808080808080ull) << 64 };
      54    vector unsigned __int128 source_c =
      55      { ((unsigned __int128) 0x8888888888888888ull) << 64 };
      56    vector unsigned __int128 source_d =
      57      { 0x8080808080808080ull |
      58        ((unsigned __int128) 0x8080808080808080ull) << 64 };
      59  
      60    unsigned long long int results [] =
      61      { 0xaaaa000000000000ull, 0xaaaa000000000000ull,
      62        0xaaaaaaaa00000000ull, 0xaaaaaaaa00000000ull };
      63  
      64    if (do_vec_gnb (source_a, 2) != results [0])
      65      abort ();
      66    if (do_vec_gnb (source_b, 4) != results [1])
      67      abort ();
      68    if (do_vec_gnb (source_c, 2) != results [2])
      69      abort ();
      70    if (do_vec_gnb (source_d, 4) != results [3])
      71      abort ();
      72  
      73    return 0;
      74  }