/* { dg-do run } */
/* { dg-require-effective-target p9vector_hw } */
/* { dg-options "-mdejagnu-cpu=power9 -O2 " } */

#include <altivec.h> // vector

void abort (void);

int main() {
  int i;

  vector signed char vsca, vscr, vscexpt;
  vector unsigned char vuca, vucr, vucexpt;
  vector signed short int vssa, vssr, vssexpt;
  vector unsigned short int vusa, vusr, vusexpt;
  vector signed int vsia, vsir, vsiexpt;
  vector unsigned int vuia, vuir, vuiexpt;
  vector signed long long vslla, vsllr, vsllexpt;
  vector unsigned long long vulla, vullr, vullexpt;

  vsca = (vector signed char) {0, 1, 2, 3, 4, 5, 6, 7,
			       8, 9, 10, 11, 12, 13, 14, 15};

  vscexpt = (vector signed char) {8, 0, 1, 0, 2, 0, 1, 0,
				  3, 0, 1, 0, 2, 0, 1, 0};

  vuca = (vector unsigned char) {'0', '3', '6', '9', 'A', 'B', 'E', 'F',
				 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N'};
											
  vucexpt = (vector unsigned char) {4, 0, 1, 0, 0, 1, 0, 1,
				    0, 3, 0, 1, 0, 2, 0, 1};

  vssa = (vector short int) {0x1, 0x10, 0x100, 0x1000,
			     0x2, 0x20, 0x200, 0x2000};

  vssexpt = (vector short int) {0, 4, 8, 12, 1, 5, 9, 13};

  vusa = (vector unsigned short int) {0x4, 0x40, 0x400, 0x4000,
				      0x8, 0x80, 0x800, 0x8000};
  vusexpt = (vector unsigned short int) {2, 6, 10, 14, 3, 7, 11, 15};

  vsia = (vector int) {0x10000, 0x100000, 0x1000000, 0x10000000};
  vsiexpt = (vector int){16, 20, 24, 28};

  vuia = (vector unsigned int) {0x2, 0x20, 0x200, 0x2000};
  vuiexpt = (vector unsigned int){1, 5, 9, 13};

  vslla = (vector long long) {0x0000000000010000LL, 0x0001000100010000LL};
  vsllexpt = (vector long long){16, 16};

  vulla = (vector unsigned long long) {0x0000400000000000LL, 0x0080000000000000ULL};

  vullexpt = (vector unsigned long long) {46, 55};

  vscr = vec_cnttz (vsca);
  vucr = vec_cnttz (vuca);
  vssr = vec_cnttz (vssa);
  vusr = vec_cnttz (vusa);
  vsir = vec_cnttz (vsia);
  vuir = vec_cnttz (vuia);
  vsllr = vec_cnttz (vslla);
  vullr = vec_cnttz (vulla);

  for (i=0; i<16; i++) {
    if (vscr[i] != vscexpt[i])
      abort();

    if (vucr[i] != vucexpt[i])
      abort();
  }

  for (i=0; i<8; i++) {
    if (vssr[i] != vssexpt[i])
      abort();

    if (vusr[i] != vusexpt[i])
      abort();
  }

  for (i=0; i<4; i++) {
    if (vsir[i] != vsiexpt[i])
      abort();

    if (vuir[i] != vuiexpt[i])
      abort();
  }

  for (i=0; i<2; i++) {
    if (vsllr[i] != vsllexpt[i])
      abort();

    if (vullr[i] != vullexpt[i])
      abort();
  }	
}
