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