blob: 6d83b062d3225ad6791cac78256040af34228a97 [file]
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "clc/clcfunc.h"
#include "clc/utils.h"
// Define some useful macros for type conversions.
#define __CLC_AS_GENTYPE __CLC_XCONCAT(__clc_as_, __CLC_GENTYPE)
#define __CLC_CONVERT_GENTYPE __CLC_XCONCAT(__clc_convert_, __CLC_GENTYPE)
// Define some macros for types matching the same vector size as __CLC_GENTYPE.
#define __CLC_HALFN __CLC_XCONCAT(half, __CLC_VECSIZE)
#define __CLC_FLOATN __CLC_XCONCAT(float, __CLC_VECSIZE)
#define __CLC_DOUBLEN __CLC_XCONCAT(double, __CLC_VECSIZE)
#define __CLC_CHARN __CLC_XCONCAT(char, __CLC_VECSIZE)
#define __CLC_SHORTN __CLC_XCONCAT(short, __CLC_VECSIZE)
#define __CLC_INTN __CLC_XCONCAT(int, __CLC_VECSIZE)
#define __CLC_LONGN __CLC_XCONCAT(long, __CLC_VECSIZE)
#define __CLC_UCHARN __CLC_XCONCAT(uchar, __CLC_VECSIZE)
#define __CLC_USHORTN __CLC_XCONCAT(ushort, __CLC_VECSIZE)
#define __CLC_UINTN __CLC_XCONCAT(uint, __CLC_VECSIZE)
#define __CLC_ULONGN __CLC_XCONCAT(ulong, __CLC_VECSIZE)
#define __CLC_AS_HALFN __CLC_XCONCAT(__clc_as_, __CLC_HALFN)
#define __CLC_AS_FLOATN __CLC_XCONCAT(__clc_as_, __CLC_FLOATN)
#define __CLC_AS_DOUBLEN __CLC_XCONCAT(__clc_as_, __CLC_DOUBLEN)
#define __CLC_AS_CHARN __CLC_XCONCAT(__clc_as_, __CLC_CHARN)
#define __CLC_AS_SHORTN __CLC_XCONCAT(__clc_as_, __CLC_SHORTN)
#define __CLC_AS_INTN __CLC_XCONCAT(__clc_as_, __CLC_INTN)
#define __CLC_AS_LONGN __CLC_XCONCAT(__clc_as_, __CLC_LONGN)
#define __CLC_AS_UCHARN __CLC_XCONCAT(__clc_as_, __CLC_UCHARN)
#define __CLC_AS_USHORTN __CLC_XCONCAT(__clc_as_, __CLC_USHORTN)
#define __CLC_AS_UINTN __CLC_XCONCAT(__clc_as_, __CLC_UINTN)
#define __CLC_AS_ULONGN __CLC_XCONCAT(__clc_as_, __CLC_ULONGN)
#define __CLC_CONVERT_HALFN __CLC_XCONCAT(__clc_convert_half, __CLC_VECSIZE)
#define __CLC_CONVERT_FLOATN __CLC_XCONCAT(__clc_convert_float, __CLC_VECSIZE)
#define __CLC_CONVERT_DOUBLEN __CLC_XCONCAT(__clc_convert_double, __CLC_VECSIZE)
#define __CLC_CONVERT_CHARN __CLC_XCONCAT(__clc_convert_, __CLC_CHARN)
#define __CLC_CONVERT_SHORTN __CLC_XCONCAT(__clc_convert_, __CLC_SHORTN)
#define __CLC_CONVERT_INTN __CLC_XCONCAT(__clc_convert_, __CLC_INTN)
#define __CLC_CONVERT_LONGN __CLC_XCONCAT(__clc_convert_, __CLC_LONGN)
#define __CLC_CONVERT_UCHARN __CLC_XCONCAT(__clc_convert_, __CLC_UCHARN)
#define __CLC_CONVERT_USHORTN __CLC_XCONCAT(__clc_convert_, __CLC_USHORTN)
#define __CLC_CONVERT_UINTN __CLC_XCONCAT(__clc_convert_, __CLC_UINTN)
#define __CLC_CONVERT_ULONGN __CLC_XCONCAT(__clc_convert_, __CLC_ULONGN)
#define __CLC_CONVERT_BIT_INTN __CLC_XCONCAT(__clc_convert_, __CLC_BIT_INTN)
// See definitions of __CLC_S_GENTYPE/__CLC_U_GENTYPE below, which depend on the
// specific size of floating-point type. These are the signed and unsigned
// integers of the same bitwidth and element count as the GENTYPE. They match
// the naming conventions in the integer version gentype.inc, for
// convenience.
#define __CLC_AS_S_GENTYPE __CLC_XCONCAT(__clc_as_, __CLC_S_GENTYPE)
#define __CLC_AS_U_GENTYPE __CLC_XCONCAT(__clc_as_, __CLC_U_GENTYPE)
#define __CLC_CONVERT_S_GENTYPE __CLC_XCONCAT(__clc_convert_, __CLC_S_GENTYPE)
#define __CLC_CONVERT_U_GENTYPE __CLC_XCONCAT(__clc_convert_, __CLC_U_GENTYPE)
#define __CLC_GENTYPE_S_SIGNBIT (__CLC_S_GENTYPE)((1ll << (__CLC_FPSIZE - 1)))
#define __CLC_GENTYPE_U_SIGNBIT (__CLC_U_GENTYPE)((1ull << (__CLC_FPSIZE - 1u)))
#if (!defined(__CLC_HALF_ONLY) && !defined(__CLC_DOUBLE_ONLY))
#define __CLC_SCALAR_GENTYPE float
#define __CLC_FPSIZE 32
#define __CLC_FP_LIT(x) (__CLC_GENTYPE) x##F
#define __CLC_GENTYPE_NAN (__CLC_GENTYPE) FLT_NAN
#define __CLC_GENTYPE_INF (__CLC_GENTYPE) INFINITY
#define __CLC_GENTYPE_MIN (__CLC_GENTYPE) FLT_MIN
#define __CLC_GENTYPE_TRUE_MIN (__CLC_GENTYPE) FLT_TRUE_MIN
#define __CLC_S_GENTYPE __CLC_XCONCAT(int, __CLC_VECSIZE)
#define __CLC_U_GENTYPE __CLC_XCONCAT(uint, __CLC_VECSIZE)
#define __CLC_GENTYPE_DENORMS_ARE_ZERO __clc_denormals_are_zero_fp32()
#define __CLC_GENTYPE float
#define __CLC_BIT_INT int
#define __CLC_BIT_INTN int
#define __CLC_SCALAR
#define __CLC_VECSIZE
#define __CLC_VECSIZE_OR_1 1
#include __CLC_BODY
#undef __CLC_VECSIZE_OR_1
#undef __CLC_VECSIZE
#undef __CLC_GENTYPE
#undef __CLC_BIT_INTN
#undef __CLC_SCALAR
#define __CLC_VECSIZE_OR_1 __CLC_VECSIZE
#define __CLC_GENTYPE float2
#define __CLC_BIT_INTN int2
#define __CLC_VECSIZE 2
#include __CLC_BODY
#undef __CLC_VECSIZE
#undef __CLC_GENTYPE
#undef __CLC_BIT_INTN
#define __CLC_GENTYPE float3
#define __CLC_BIT_INTN int3
#define __CLC_VECSIZE 3
#include __CLC_BODY
#undef __CLC_VECSIZE
#undef __CLC_GENTYPE
#undef __CLC_BIT_INTN
#define __CLC_GENTYPE float4
#define __CLC_BIT_INTN int4
#define __CLC_VECSIZE 4
#include __CLC_BODY
#undef __CLC_VECSIZE
#undef __CLC_GENTYPE
#undef __CLC_BIT_INTN
#define __CLC_GENTYPE float8
#define __CLC_BIT_INTN int8
#define __CLC_VECSIZE 8
#include __CLC_BODY
#undef __CLC_VECSIZE
#undef __CLC_GENTYPE
#undef __CLC_BIT_INTN
#define __CLC_GENTYPE float16
#define __CLC_BIT_INTN int16
#define __CLC_VECSIZE 16
#include __CLC_BODY
#undef __CLC_VECSIZE
#undef __CLC_GENTYPE
#undef __CLC_BIT_INT
#undef __CLC_BIT_INTN
#undef __CLC_VECSIZE_OR_1
#undef __CLC_U_GENTYPE
#undef __CLC_S_GENTYPE
#undef __CLC_GENTYPE_NAN
#undef __CLC_GENTYPE_MIN
#undef __CLC_GENTYPE_TRUE_MIN
#undef __CLC_GENTYPE_DENORMS_ARE_ZERO
#undef __CLC_FP_LIT
#undef __CLC_FPSIZE
#undef __CLC_SCALAR_GENTYPE
#endif
#if (!defined(__CLC_HALF_ONLY) && !defined(__CLC_FLOAT_ONLY))
#ifdef cl_khr_fp64
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
#define __CLC_SCALAR_GENTYPE double
#define __CLC_FPSIZE 64
#define __CLC_FP_LIT(x) (__CLC_GENTYPE)(x)
#define __CLC_GENTYPE_NAN (__CLC_GENTYPE) DBL_NAN
#define __CLC_GENTYPE_MIN (__CLC_GENTYPE) DBL_MIN
#define __CLC_GENTYPE_TRUE_MIN (__CLC_GENTYPE) DBL_TRUE_MIN
#define __CLC_GENTYPE_DENORMS_ARE_ZERO __clc_denormals_are_zero_fp64()
#define __CLC_S_GENTYPE __CLC_XCONCAT(long, __CLC_VECSIZE)
#define __CLC_U_GENTYPE __CLC_XCONCAT(ulong, __CLC_VECSIZE)
#define __CLC_SCALAR
#define __CLC_VECSIZE
#define __CLC_VECSIZE_OR_1 1
#define __CLC_GENTYPE double
#define __CLC_BIT_INT long
#define __CLC_BIT_INTN long
#include __CLC_BODY
#undef __CLC_VECSIZE_OR_1
#undef __CLC_GENTYPE
#undef __CLC_BIT_INTN
#undef __CLC_VECSIZE
#undef __CLC_SCALAR
#define __CLC_VECSIZE_OR_1 __CLC_VECSIZE
#define __CLC_GENTYPE double2
#define __CLC_BIT_INTN long2
#define __CLC_VECSIZE 2
#include __CLC_BODY
#undef __CLC_VECSIZE
#undef __CLC_GENTYPE
#undef __CLC_BIT_INTN
#define __CLC_GENTYPE double3
#define __CLC_BIT_INTN long3
#define __CLC_VECSIZE 3
#include __CLC_BODY
#undef __CLC_VECSIZE
#undef __CLC_GENTYPE
#undef __CLC_BIT_INTN
#define __CLC_GENTYPE double4
#define __CLC_BIT_INTN long4
#define __CLC_VECSIZE 4
#include __CLC_BODY
#undef __CLC_VECSIZE
#undef __CLC_GENTYPE
#undef __CLC_BIT_INTN
#define __CLC_GENTYPE double8
#define __CLC_BIT_INTN long8
#define __CLC_VECSIZE 8
#include __CLC_BODY
#undef __CLC_VECSIZE
#undef __CLC_GENTYPE
#undef __CLC_BIT_INTN
#define __CLC_GENTYPE double16
#define __CLC_BIT_INTN long16
#define __CLC_VECSIZE 16
#include __CLC_BODY
#undef __CLC_VECSIZE
#undef __CLC_GENTYPE
#undef __CLC_BIT_INT
#undef __CLC_BIT_INTN
#undef __CLC_VECSIZE_OR_1
#undef __CLC_U_GENTYPE
#undef __CLC_S_GENTYPE
#undef __CLC_GENTYPE_NAN
#undef __CLC_GENTYPE_MIN
#undef __CLC_GENTYPE_TRUE_MIN
#undef __CLC_GENTYPE_DENORMS_ARE_ZERO
#undef __CLC_FP_LIT
#undef __CLC_FPSIZE
#undef __CLC_SCALAR_GENTYPE
#endif
#endif
#if (!defined(__CLC_FLOAT_ONLY) && !defined(__CLC_DOUBLE_ONLY))
#ifdef cl_khr_fp16
#pragma OPENCL EXTENSION cl_khr_fp16 : enable
#define __CLC_SCALAR_GENTYPE half
#define __CLC_FPSIZE 16
#define __CLC_FP_LIT(x) (__CLC_GENTYPE) x##H
#define __CLC_GENTYPE_NAN (__CLC_GENTYPE) HALF_NAN
#define __CLC_GENTYPE_MIN (__CLC_GENTYPE) HALF_MIN
#define __CLC_GENTYPE_TRUE_MIN (__CLC_GENTYPE) HALF_TRUE_MIN
#define __CLC_GENTYPE_DENORMS_ARE_ZERO __clc_denormals_are_zero_fp16()
#define __CLC_S_GENTYPE __CLC_XCONCAT(short, __CLC_VECSIZE)
#define __CLC_U_GENTYPE __CLC_XCONCAT(ushort, __CLC_VECSIZE)
#define __CLC_SCALAR
#define __CLC_VECSIZE
#define __CLC_VECSIZE_OR_1 1
#define __CLC_GENTYPE half
#define __CLC_BIT_INT short
#define __CLC_BIT_INTN short
#include __CLC_BODY
#undef __CLC_GENTYPE
#undef __CLC_BIT_INTN
#undef __CLC_VECSIZE_OR_1
#undef __CLC_VECSIZE
#undef __CLC_SCALAR
#define __CLC_VECSIZE_OR_1 __CLC_VECSIZE
#define __CLC_GENTYPE half2
#define __CLC_BIT_INTN short2
#define __CLC_VECSIZE 2
#include __CLC_BODY
#undef __CLC_VECSIZE
#undef __CLC_GENTYPE
#undef __CLC_BIT_INTN
#define __CLC_GENTYPE half3
#define __CLC_BIT_INTN short3
#define __CLC_VECSIZE 3
#include __CLC_BODY
#undef __CLC_VECSIZE
#undef __CLC_GENTYPE
#undef __CLC_BIT_INTN
#define __CLC_GENTYPE half4
#define __CLC_BIT_INTN short4
#define __CLC_VECSIZE 4
#include __CLC_BODY
#undef __CLC_VECSIZE
#undef __CLC_GENTYPE
#undef __CLC_BIT_INTN
#define __CLC_GENTYPE half8
#define __CLC_BIT_INTN short8
#define __CLC_VECSIZE 8
#include __CLC_BODY
#undef __CLC_VECSIZE
#undef __CLC_GENTYPE
#undef __CLC_BIT_INTN
#define __CLC_GENTYPE half16
#define __CLC_BIT_INTN short16
#define __CLC_VECSIZE 16
#include __CLC_BODY
#undef __CLC_VECSIZE
#undef __CLC_GENTYPE
#undef __CLC_BIT_INT
#undef __CLC_BIT_INTN
#undef __CLC_VECSIZE_OR_1
#undef __CLC_U_GENTYPE
#undef __CLC_S_GENTYPE
#undef __CLC_GENTYPE_NAN
#undef __CLC_GENTYPE_MIN
#undef __CLC_GENTYPE_TRUE_MIN
#undef __CLC_GENTYPE_DENORMS_ARE_ZERO
#undef __CLC_FP_LIT
#undef __CLC_FPSIZE
#undef __CLC_SCALAR_GENTYPE
#endif
#endif
#undef __CLC_BODY
#undef __CLC_AS_U_GENTYPE
#undef __CLC_AS_S_GENTYPE
#undef __CLC_CONVERT_U_GENTYPE
#undef __CLC_CONVERT_S_GENTYPE
#undef __CLC_AS_CHARN
#undef __CLC_AS_SHORTN
#undef __CLC_AS_INTN
#undef __CLC_AS_LONGN
#undef __CLC_AS_HALFN
#undef __CLC_AS_FLOATN
#undef __CLC_AS_DOUBLEN
#undef __CLC_AS_UCHARN
#undef __CLC_AS_USHORTN
#undef __CLC_AS_UINTN
#undef __CLC_AS_ULONGN
#undef __CLC_CONVERT_HALFN
#undef __CLC_CONVERT_FLOATN
#undef __CLC_CONVERT_DOUBLEN
#undef __CLC_CONVERT_CHARN
#undef __CLC_CONVERT_SHORTN
#undef __CLC_CONVERT_INTN
#undef __CLC_CONVERT_LONGN
#undef __CLC_CONVERT_UCHARN
#undef __CLC_CONVERT_USHORTN
#undef __CLC_CONVERT_UINTN
#undef __CLC_CONVERT_ULONGN
#undef __CLC_CONVERT_BIT_INTN
#undef __CLC_ULONGN
#undef __CLC_UINTN
#undef __CLC_USHORTN
#undef __CLC_UCHARN
#undef __CLC_LONGN
#undef __CLC_INTN
#undef __CLC_SHORTN
#undef __CLC_CHARN
#undef __CLC_DOUBLEN
#undef __CLC_FLOATN
#undef __CLC_HALFN
#undef __CLC_AS_GENTYPE
#undef __CLC_CONVERT_GENTYPE
#undef __CLC_HALF_ONLY
#undef __CLC_FLOAT_ONLY
#undef __CLC_DOUBLE_ONLY