/* { dg-do run { target { powerpc*-*-* && p8vector_hw } } } */
/* { dg-options "-mdejagnu-cpu=power8 -O3" } */

/* Test that the vec_addec builtin works as expected.  */

#include "altivec.h"

#define N 4096

void abort ();

#define define_test_functions(STYPE, NAMESUFFIX) \
\
STYPE result_##NAMESUFFIX[N]; \
STYPE addend1_##NAMESUFFIX[N]; \
STYPE addend2_##NAMESUFFIX[N]; \
STYPE carry_##NAMESUFFIX[N]; \
STYPE expected_##NAMESUFFIX[N]; \
\
__attribute__((noinline)) void vector_tests_##NAMESUFFIX () \
{ \
  vector STYPE v1, v2, v3, tmp; \
  int i; \
  for (i = 0; i < N; i+=16/sizeof (STYPE)) \
    { \
      /* result=carry of addend1+addend2+(carry & 0x1).  */ \
      v1 = vec_vsx_ld (0, &addend1_##NAMESUFFIX[i]); \
      v2 = vec_vsx_ld (0, &addend2_##NAMESUFFIX[i]); \
      v3 = vec_vsx_ld (0, &carry_##NAMESUFFIX[i]); \
\
      tmp = vec_addec (v1, v2, v3); \
      vec_vsx_st (tmp, 0, &result_##NAMESUFFIX[i]); \
    } \
} \
\
__attribute__((noinline)) void init_##NAMESUFFIX () \
{ \
  int i; \
  for (i = 0; i < N; ++i) \
    { \
      result_##NAMESUFFIX[i] = 0; \
      if (i%6 == 0) \
	{ \
	  addend1_##NAMESUFFIX[i] = 0xfffffffd; \
	  addend2_##NAMESUFFIX[i] =  1; \
	  carry_##NAMESUFFIX[i] = 1; \
	  expected_##NAMESUFFIX[i] = 0; \
	} \
      else if (i%6 == 1) \
	{ \
	  addend1_##NAMESUFFIX[i] = 0xffffffff; \
	  addend2_##NAMESUFFIX[i] = 1; \
	  carry_##NAMESUFFIX[i] = 0; \
	  expected_##NAMESUFFIX[i] = 1; \
	} \
      else if (i%6 == 2) \
	{ \
	  addend1_##NAMESUFFIX[i] = 0xffffffff; \
	  addend2_##NAMESUFFIX[i] = 0; \
	  carry_##NAMESUFFIX[i] = 3; /* 3 should work like 1 here.  */ \
	  expected_##NAMESUFFIX[i] = 1; \
	} \
      else if (i%6 == 3) \
	{ \
	  addend1_##NAMESUFFIX[i] = 1; \
	  addend2_##NAMESUFFIX[i] = 0xffffffff; \
	  carry_##NAMESUFFIX[i] = 2; /* 2 should work like 0 here.  */ \
	  expected_##NAMESUFFIX[i] = 1; \
	} \
      else if (i%6 == 4) \
	{ \
	  addend1_##NAMESUFFIX[i] = 0; \
	  addend2_##NAMESUFFIX[i] = 0xffffffff; \
	  carry_##NAMESUFFIX[i] = 1; \
	  expected_##NAMESUFFIX[i] = 1; \
	} \
      else if (i%6 == 5) \
	{ \
	  addend1_##NAMESUFFIX[i] = 0xffff0000; \
	  addend2_##NAMESUFFIX[i] = 0x0000ffff; \
	  carry_##NAMESUFFIX[i] = 1; \
	  expected_##NAMESUFFIX[i] = 1; \
	} \
    } \
} \
\
__attribute__((noinline)) void verify_results_##NAMESUFFIX () \
{ \
  int i; \
  for (i = 0; i < N; ++i) \
    { \
      if (result_##NAMESUFFIX[i] != expected_##NAMESUFFIX[i]) \
	abort (); \
    } \
}


#define execute_test_functions(STYPE, NAMESUFFIX) \
{ \
  init_##NAMESUFFIX (); \
  vector_tests_##NAMESUFFIX (); \
  verify_results_##NAMESUFFIX (); \
}


define_test_functions (signed int, si);
define_test_functions (unsigned int, ui);

int main ()
{
  execute_test_functions (signed int, si);
  execute_test_functions (unsigned int, ui);

  return 0;
}


