/* { dg-do compile { target powerpc*-*-* } } */
/* { dg-require-effective-target powerpc_altivec_ok } */
/* { dg-options "-maltivec" } */

#include <altivec.h>

#ifdef DEBUG
#include <stdio.h>
#endif

/* Endian considerations: The "high" half of a vector with n elements is the
   first n/2 elements of the vector. For little endian, these elements are in
   the rightmost half of the vector. For big endian, these elements are in the
   leftmost half of the vector.  */


void abort (void);

int main ()
{
  int i;
  vector bool short vec_bs_arg;
  vector bool short vec_bs_result, vec_bs_expected;
  vector bool int vec_bi_arg;
  vector bool int vec_bi_result, vec_bi_expected;
  vector bool char vec_bc_arg;
  vector bool char vec_bc_result, vec_bc_expected;
  vector signed short vec_ss_arg;
  vector signed short vec_ss_result, vec_ss_expected;
  vector signed int vec_si_arg;
  vector signed int vec_si_result, vec_si_expected;
  vector signed char vec_sc_arg;
  vector signed char vec_sc_result, vec_sc_expected;
  vector pixel vec_pixel_arg;
  vector unsigned int vec_ui_result, vec_ui_expected;

  vec_bs_arg = (vector bool short){ 0, 101, 202, 303,
				    404, 505, 606, 707 };
  vec_bi_expected = (vector bool int){ 0, 101, 202, 303 };

  vec_bi_result = vec_unpackh (vec_bs_arg);

  for (i = 0; i < 4; i++) {
    if (vec_bi_expected[i] != vec_bi_result[i])
#if DEBUG
       printf("ERROR: vec_unpackh(),  vec_bi_expected[%d] = %d does not match vec_bi_result[%d] = %d\n",
	      i, vec_bi_expected[i], i, vec_bi_result[i]);
#else
       abort();
#endif
  }

  vec_bi_expected = (vector bool int){ 404, 505, 606, 707 };
  vec_bi_result = vec_unpackl (vec_bs_arg);

  for (i = 0; i < 4; i++) {
    if (vec_bi_expected[i] != vec_bi_result[i])
#if DEBUG
       printf("ERROR: vec_unpackl(), vec_bi_expected[%d] = %d does not match vec_bi_result[%d] = %d\n",
	      i, vec_bi_expected[i], i, vec_bi_result[i]);
#else
       abort();
#endif
  }

  
  vec_ss_arg = (vector signed short){ 0, 101, 202, 303,
				    404, 505, 606, 707 };
  vec_si_expected = (vector signed int){ 0, 101, 202, 303 };

  vec_si_result = vec_unpackh (vec_ss_arg);

  for (i = 0; i < 4; i++) {
    if (vec_si_expected[i] != vec_si_result[i])
#if DEBUG
       printf("ERROR: vec_unpackh(), vec_si_expected[%d] = %d does not match vec_si_result[%d] = %d\n",
	      i, vec_si_expected[i], i, vec_si_result[i]);
#else
       abort();
#endif
  }

  vec_si_expected = (vector signed int){ 404, 505, 606, 707 };

  vec_si_result = vec_unpackl (vec_ss_arg);

  for (i = 0; i < 4; i++) {
    if (vec_si_expected[i] != vec_si_result[i])
#if DEBUG
       printf("ERROR: vec_unpackl(), vec_si_expected[%d] = %d does not match vec_si_result[%d] = %d\n",
	      i, vec_si_expected[i], i, vec_si_result[i]);
#else
       abort();
#endif
  }


  vec_pixel_arg = (vector pixel){ 0x0, 0x65, 0xca, 0x12f,
				  0x194, 0x1f9, 0x25e, 0x2c3 };
  vec_ui_expected = (vector unsigned int){ 0x0, 0x305, 0x60a, 0x90f };

  vec_ui_result = vec_unpackh (vec_pixel_arg);

  for (i = 0; i < 4; i++) {
    if (vec_ui_expected[i] != vec_ui_result[i])
#if DEBUG
       printf("ERROR: vec_unpackh(), vec_ui_expected[%d] = 0x%x does not match vec_ui_result[%d] = 0x%x\n",
	      i, vec_ui_expected[i], i, vec_ui_result[i]);
#else
       abort();
#endif
  }

  vec_ui_expected = (vector unsigned int){ 0xc14, 0xf19, 0x121e, 0x1603 };

  vec_ui_result = vec_unpackl (vec_pixel_arg);

  for (i = 0; i < 4; i++) {
    if (vec_ui_expected[i] != vec_ui_result[i])
#if DEBUG
       printf("ERROR: vec_unpackl(), vec_ui_expected[%d] = 0x%x does not match vec_ui_result[%d] = 0x%x\n",
	      i, vec_ui_expected[i], i, vec_ui_result[i]);
#else
       abort();
#endif
  }


  vec_bc_arg = (vector bool char){ 0, 1, 0, 1, 0, 1, 0, 1,
				   0, 0, 1, 1, 0, 0, 1, 1 };

  vec_bs_expected = (vector bool short){ 0, 1, 0, 1, 0, 1, 0, 1 };

  vec_bs_result = vec_unpackh (vec_bc_arg);

  for (i = 0; i < 8; i++) {
    if (vec_bs_expected[i] != vec_bs_result[i])
#if DEBUG
       printf("ERROR: vec_unpackh(), vec_bs_expected[%d] = %d does not match vec_bs_result[%d] = %d\n",
	      i, vec_bs_expected[i], i, vec_bs_result[i]);
#else
       abort();
#endif
  }

  vec_bs_expected = (vector bool short){ 0, 0, 1, 1, 0, 0, 1, 1 };

  vec_bs_result = vec_unpackl (vec_bc_arg);

  for (i = 0; i < 8; i++) {
    if (vec_bs_expected[i] != vec_bs_result[i])
#if DEBUG
       printf("ERROR: vec_unpackh(), vec_bs_expected[%d] = %d does not match vec_bs_result[%d] = %d\n",
	      i, vec_bs_expected[i], i, vec_bs_result[i]);
#else
       abort();
#endif
  }

  vec_bs_expected = (vector bool short){ 0, 0, 1, 1, 0, 0, 1, 1 };

  vec_bs_result = vec_unpackl (vec_bc_arg);

  for (i = 0; i < 8; i++) {
    if (vec_bs_expected[i] != vec_bs_result[i])
#if DEBUG
       printf("ERROR: vec_unpackl(), vec_bs_expected[%d] = %d does not match vec_bs_result[%d] = %d\n",
	      i, vec_bs_expected[i], i, vec_bs_result[i]);
#else
       abort();
#endif
  }


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

  vec_ss_expected = (vector signed short){ 0, 1, 2, 3, 4, 5, 6, 7 };

  vec_ss_result = vec_unpackh (vec_sc_arg);

  for (i = 0; i < 8; i++) {
    if (vec_ss_expected[i] != vec_ss_result[i])
#if DEBUG
       printf("ERROR: vec_unpackh(), vec_ss_expected[%d] = %d does not match vec_ss_result[%d] = %d\n",
	      i, vec_ss_expected[i], i, vec_ss_result[i]);
#else
       abort();
#endif
  }

  vec_ss_expected = (vector signed short){ 8, 9, 10, 11, 12, 13, 14, 15 };

  vec_ss_result = vec_unpackl (vec_sc_arg);

  for (i = 0; i < 8; i++) {
    if (vec_ss_expected[i] != vec_ss_result[i])
#if DEBUG
       printf("ERROR: vec_unpackl(), vec_ss_expected[%d] = %d does not match vec_ss_result[%d] = %d\n",
	      i, vec_ss_expected[i], i, vec_ss_result[i]);
#else
       abort();
#endif
  }

  return 0;
}
