
/* { dg-do run } */
/* { dg-options "-O3 -std=c99" } */

#include "limits.h"

extern void abort (void);

#define N 16

#include "vect-abs.x"

#define SET_VEC(size, type) void set_vector_##size (pRINT##size a) \
		      	    {				        \
			      int i;			        \
			      for (i=0; i<N; i++)	        \
			        a[i] = (type##_MIN) + (i + 1);  \
		      	    }

#define SET_RVEC(size, type) void set_rvector_##size (pRINT##size a) \
		      	     {				      \
			       int i;			      \
			       for (i=0; i<N; i++)	      \
			         a[i] = type##_MAX - i;       \
		      	     }

#define CHECK_VEC(size) void check_vector_##size (pRINT##size a, \
						  pRINT##size b) \
			{				       \
			  int i;			       \
			  for (i=0; i<N; i++)		       \
			    if (a[i] != b[i])  		       \
			      abort (); 		       \
			}


SET_RVEC (8, SCHAR)
SET_RVEC (16, SHRT)
SET_RVEC (32, INT)
SET_RVEC (64, LLONG)

void
set_rvector_long (pRLONG a)
{
  int i;
  for (i=0; i<N; i++)
    a[i] = (LONG_MAX) - i;
}

SET_VEC (8, SCHAR)
SET_VEC (16, SHRT)
SET_VEC (32, INT)
SET_VEC (64, LLONG)

void
set_vector_long (long *__restrict__ a)
{
  long i;
  for (i=0; i<N; i++)
    a[i] = (LONG_MIN) + i + 1;
}

CHECK_VEC (8)
CHECK_VEC (16)
CHECK_VEC (32)
CHECK_VEC (64)

void
check_vector_long (long *__restrict__ a, long *__restrict__ b)
{
  long i;
  for (i=0; i<N; i++)
    if (a[i] != b[i])
      abort ();
}

int main (void)
{

  signed char a8[N];
  short a16[N];
  int a32[N];
  long long a64[N];
  /* abs () from stdlib.  */
  int alib32[N];
  long alibl[N];


  signed char b8[N];
  short b16[N];
  int b32[N];
  long long b64[N];
  /* abs () from stdlib.  */
  long blibl[N];

  signed char abs_vector_8[N];
  short abs_vector_16[N];
  int abs_vector_32[N];
  long long abs_vector_64[N];
  long abs_vector_long[N];

  /* Set up result vectors.  */
  set_rvector_8 (abs_vector_8);
  set_rvector_16 (abs_vector_16);
  set_rvector_32 (abs_vector_32);
  set_rvector_long (abs_vector_long);
  set_rvector_64 (abs_vector_64);

  /* Set up inputs.  */
  set_vector_8 (b8);
  set_vector_16 (b16);
  set_vector_32 (b32);
  set_vector_64 (b64);
  set_vector_long (blibl);

  /* Calculate their absolute values.  */
  absolute_s8 (a8, b8);
  absolute_s16 (a16, b16);
  absolute_s32 (a32, b32);
  absolute_s64 (a64, b64);
  /* abs () from stdlib.  */
  absolute_s32_lib (alib32, b32);
  absolute_l32_lib (alibl, blibl);

  /* Check.  */
  check_vector_8 (a8, abs_vector_8);
  check_vector_16 (a16, abs_vector_16);
  check_vector_32 (a32, abs_vector_32);
  check_vector_64 (a64, abs_vector_64);
  check_vector_32 (alib32, abs_vector_32);
  check_vector_long (alibl, abs_vector_long);

  return 0;
}
