/* This testcase is part of GDB, the GNU debugger.

   Copyright 2011-2021 Free Software Foundation, Inc.

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

   This program 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 General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.

   Contributed by Ulrich Weigand <ulrich.weigand.ibm.com>  */

__constant int opencl_version = __OPENCL_VERSION__;

#ifdef HAVE_cl_khr_fp64
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
__constant int have_cl_khr_fp64 = 1;
#else
__constant int have_cl_khr_fp64 = 0;
#endif

#ifdef HAVE_cl_khr_fp16
#pragma OPENCL EXTENSION cl_khr_fp16 : enable
__constant int have_cl_khr_fp16 = 1;
#else
__constant int have_cl_khr_fp16 = 0;
#endif

#define def_call_func(type) \
  type call_##type (type a, type b) { return a + b; }

#ifdef CL_VERSION_1_1
#define def_call_family(type) \
  def_call_func(type) \
  def_call_func(type##2) \
  def_call_func(type##3) \
  def_call_func(type##4) \
  def_call_func(type##8) \
  def_call_func(type##16)
#else
#define def_call_family(type) \
  def_call_func(type) \
  def_call_func(type##2) \
  def_call_func(type##4) \
  def_call_func(type##8) \
  def_call_func(type##16)
#endif

def_call_family(char)
def_call_family(uchar)
def_call_family(short)
def_call_family(ushort)
def_call_family(int)
def_call_family(uint)
def_call_family(long)
def_call_family(ulong)
#ifdef cl_khr_fp16
def_call_family(half)
#endif
def_call_family(float)
#ifdef cl_khr_fp64
def_call_family(double)
#endif

#define call_func(type, var) \
  var = call_##type (var, var);

#ifdef CL_VERSION_1_1
#define call_family(type, var) \
  call_func(type, var) \
  call_func(type##2, var##2) \
  call_func(type##3, var##3) \
  call_func(type##4, var##4) \
  call_func(type##8, var##8) \
  call_func(type##16, var##16)
#else
#define call_family(type, var) \
  call_func(type, var) \
  call_func(type##2, var##2) \
  call_func(type##4, var##4) \
  call_func(type##8, var##8) \
  call_func(type##16, var##16)
#endif

__kernel void testkernel (__global int *data)
{
  bool b = 0;

  char   c   = 1;
  char2  c2  = (char2) (1, 2);
#ifdef CL_VERSION_1_1
  char3  c3  = (char3) (1, 2, 3);
#endif
  char4  c4  = (char4) (1, 2, 3, 4);
  char8  c8  = (char8) (1, 2, 3, 4, 5, 6, 7, 8);
  char16 c16 = (char16)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);

  uchar   uc   = 1;
  uchar2  uc2  = (uchar2) (1, 2);
#ifdef CL_VERSION_1_1
  uchar3  uc3  = (uchar3) (1, 2, 3);
#endif
  uchar4  uc4  = (uchar4) (1, 2, 3, 4);
  uchar8  uc8  = (uchar8) (1, 2, 3, 4, 5, 6, 7, 8);
  uchar16 uc16 = (uchar16)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);

  short   s   = 1;
  short2  s2  = (short2) (1, 2);
#ifdef CL_VERSION_1_1
  short3  s3  = (short3) (1, 2, 3);
#endif
  short4  s4  = (short4) (1, 2, 3, 4);
  short8  s8  = (short8) (1, 2, 3, 4, 5, 6, 7, 8);
  short16 s16 = (short16)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);

  ushort   us   = 1;
  ushort2  us2  = (ushort2) (1, 2);
#ifdef CL_VERSION_1_1
  ushort3  us3  = (ushort3) (1, 2, 3);
#endif
  ushort4  us4  = (ushort4) (1, 2, 3, 4);
  ushort8  us8  = (ushort8) (1, 2, 3, 4, 5, 6, 7, 8);
  ushort16 us16 = (ushort16)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);

  int   i   = 1;
  int2  i2  = (int2) (1, 2);
#ifdef CL_VERSION_1_1
  int3  i3  = (int3) (1, 2, 3);
#endif
  int4  i4  = (int4) (1, 2, 3, 4);
  int8  i8  = (int8) (1, 2, 3, 4, 5, 6, 7, 8);
  int16 i16 = (int16)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);

  uint   ui   = 1;
  uint2  ui2  = (uint2) (1, 2);
#ifdef CL_VERSION_1_1
  uint3  ui3  = (uint3) (1, 2, 3);
#endif
  uint4  ui4  = (uint4) (1, 2, 3, 4);
  uint8  ui8  = (uint8) (1, 2, 3, 4, 5, 6, 7, 8);
  uint16 ui16 = (uint16)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);

  long   l   = 1;
  long2  l2  = (long2) (1, 2);
#ifdef CL_VERSION_1_1
  long3  l3  = (long3) (1, 2, 3);
#endif
  long4  l4  = (long4) (1, 2, 3, 4);
  long8  l8  = (long8) (1, 2, 3, 4, 5, 6, 7, 8);
  long16 l16 = (long16)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);

  ulong   ul   = 1;
  ulong2  ul2  = (ulong2) (1, 2);
#ifdef CL_VERSION_1_1
  ulong3  ul3  = (ulong3) (1, 2, 3);
#endif
  ulong4  ul4  = (ulong4) (1, 2, 3, 4);
  ulong8  ul8  = (ulong8) (1, 2, 3, 4, 5, 6, 7, 8);
  ulong16 ul16 = (ulong16)(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);

#ifdef cl_khr_fp16
  half   h   = 1.0;
  half2  h2  = (half2) (1.0, 2.0);
#ifdef CL_VERSION_1_1
  half3  h3  = (half3) (1.0, 2.0, 3.0);
#endif
  half4  h4  = (half4) (1.0, 2.0, 3.0, 4.0);
  half8  h8  = (half8) (1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
  half16 h16 = (half16)(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0);
#endif

  float   f   = 1.0;
  float2  f2  = (float2) (1.0, 2.0);
#ifdef CL_VERSION_1_1
  float3  f3  = (float3) (1.0, 2.0, 3.0);
#endif
  float4  f4  = (float4) (1.0, 2.0, 3.0, 4.0);
  float8  f8  = (float8) (1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
  float16 f16 = (float16)(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0);

#ifdef cl_khr_fp64
  double   d   = 1.0;
  double2  d2  = (double2) (1.0, 2.0);
#ifdef CL_VERSION_1_1
  double3  d3  = (double3) (1.0, 2.0, 3.0);
#endif
  double4  d4  = (double4) (1.0, 2.0, 3.0, 4.0);
  double8  d8  = (double8) (1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
  double16 d16 = (double16)(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0);
#endif

  /* marker! */

  call_family (char, c);
  call_family (uchar, uc);
  call_family (short, s);
  call_family (ushort, us);
  call_family (int, i);
  call_family (uint, ui);
  call_family (long, l);
  call_family (ulong, ul);
#ifdef cl_khr_fp16
  call_family (half, h);
#endif
  call_family (float, f);
#ifdef cl_khr_fp64
  call_family (double, d);
#endif

  data[get_global_id(0)] = 1;
}
