/* Wrappers definitions for tests of ABI of vector sincos/sincosf having
   vector declaration "#pragma omp declare simd notinbranch".
   Copyright (C) 2016-2018 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

#define INIT_VEC_PTRS_LOOP(vec, val, len)				\
  do									\
    {									\
      union { VEC_INT_TYPE v; __typeof__ ((val)[0]) *a[(len)]; } u;	\
      for (i = 0; i < len; i++)						\
	u.a[i] = &(val)[i];						\
      (vec) = u.v;							\
    }									\
  while (0)

/* Wrapper for vector sincos/sincosf compatible with x86_64 and x32 variants
   of _ZGVbN2vvv_sincos, _ZGVdN4vvv_sincos, _ZGVeN8vvv_sincos;
   x32 variants of _ZGVbN4vvv_sincosf, _ZGVcN4vvv_sincos, _ZGVdN8vvv_sincosf,
   _ZGVeN16vvv_sincosf.  */
#define VECTOR_WRAPPER_fFF_2(scalar_func, vector_func)		\
extern void vector_func (VEC_TYPE, VEC_INT_TYPE, VEC_INT_TYPE);	\
void scalar_func (FLOAT x, FLOAT * r, FLOAT * r1)		\
{								\
  int i;							\
  FLOAT r_loc[VEC_LEN], r1_loc[VEC_LEN];			\
  VEC_TYPE mx;							\
  VEC_INT_TYPE mr, mr1;						\
  INIT_VEC_LOOP (mx, x, VEC_LEN);				\
  INIT_VEC_PTRS_LOOP (mr, r_loc, VEC_LEN);			\
  INIT_VEC_PTRS_LOOP (mr1, r1_loc, VEC_LEN);			\
  vector_func (mx, mr, mr1);					\
  TEST_VEC_LOOP (r_loc, VEC_LEN);				\
  TEST_VEC_LOOP (r1_loc, VEC_LEN);				\
  *r = r_loc[0];						\
  *r1 = r1_loc[0];						\
  return;							\
}

/* Wrapper for vector sincos/sincosf compatible with x86_64 variants of
   _ZGVcN4vvv_sincos, _ZGVeN16vvv_sincosf, _ZGVbN4vvv_sincosf,
   _ZGVdN8vvv_sincosf, _ZGVcN8vvv_sincosf.  */
#define VECTOR_WRAPPER_fFF_3(scalar_func, vector_func)		\
extern void vector_func (VEC_TYPE, VEC_INT_TYPE, VEC_INT_TYPE,  \
			 VEC_INT_TYPE, VEC_INT_TYPE);		\
void scalar_func (FLOAT x, FLOAT * r, FLOAT * r1)		\
{								\
  int i;							\
  FLOAT r_loc[VEC_LEN/2], r1_loc[VEC_LEN/2];			\
  VEC_TYPE mx;							\
  VEC_INT_TYPE mr, mr1;						\
  INIT_VEC_LOOP (mx, x, VEC_LEN);				\
  INIT_VEC_PTRS_LOOP (mr, r_loc, VEC_LEN/2);			\
  INIT_VEC_PTRS_LOOP (mr1, r1_loc, VEC_LEN/2);			\
  vector_func (mx, mr, mr, mr1, mr1);				\
  TEST_VEC_LOOP (r_loc, VEC_LEN/2);				\
  TEST_VEC_LOOP (r1_loc, VEC_LEN/2);				\
  *r = r_loc[0];						\
  *r1 = r1_loc[0];						\
  return;							\
}

/* Wrapper for vector sincosf compatible with x86_64 variant of
   _ZGVcN8vvv_sincosf.  */
#define VECTOR_WRAPPER_fFF_4(scalar_func, vector_func) 		\
extern void vector_func (VEC_TYPE, VEC_INT_TYPE, VEC_INT_TYPE,	\
			 VEC_INT_TYPE, VEC_INT_TYPE,		\
			 VEC_INT_TYPE, VEC_INT_TYPE,		\
			 VEC_INT_TYPE, VEC_INT_TYPE);		\
void scalar_func (FLOAT x, FLOAT * r, FLOAT * r1)		\
{								\
  int i;							\
  FLOAT r_loc[VEC_LEN/4], r1_loc[VEC_LEN/4];			\
  VEC_TYPE mx;							\
  VEC_INT_TYPE mr, mr1;						\
  INIT_VEC_LOOP (mx, x, VEC_LEN);				\
  INIT_VEC_PTRS_LOOP (mr, r_loc, VEC_LEN/4);			\
  INIT_VEC_PTRS_LOOP (mr1, r1_loc, VEC_LEN/4);			\
  vector_func (mx, mr, mr, mr, mr, mr1, mr1, mr1, mr1);		\
  TEST_VEC_LOOP (r_loc, VEC_LEN/4);				\
  TEST_VEC_LOOP (r1_loc, VEC_LEN/4);				\
  *r = r_loc[0];						\
  *r1 = r1_loc[0];						\
  return;							\
}
