brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.1 KiB · 48e28c0 Raw
82 lines · plain
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include <clc/internal/clc.h>10#include <clc/math/clc_fabs.h>11#include <clc/relational/clc_isnan.h>12 13// This file provides OpenCL C implementations of __clc_nextafter for14// targets that don't support the clang builtin.15 16#define __CLC_CLC_AS_TYPE(x) __clc_as_##x17 18#define __CLC_NEXTAFTER(FLOAT_TYPE, UINT_TYPE, INT_TYPE, INT_TYPE_SCALAR)      \19  _CLC_OVERLOAD _CLC_DEF FLOAT_TYPE __clc_nextafter(FLOAT_TYPE x,              \20                                                    FLOAT_TYPE y) {            \21    const UINT_TYPE sign_bit = (UINT_TYPE)1                                    \22                               << (sizeof(INT_TYPE_SCALAR) * 8 - 1);           \23    UINT_TYPE ix = __CLC_CLC_AS_TYPE(UINT_TYPE)(x);                            \24    FLOAT_TYPE absx = __clc_fabs(x);                                           \25    UINT_TYPE mxu = sign_bit - ix;                                             \26    INT_TYPE mx = __CLC_CLC_AS_TYPE(INT_TYPE)(mxu);                            \27    mx = __CLC_CLC_AS_TYPE(INT_TYPE)(ix) < (INT_TYPE)0                         \28             ? mx                                                              \29             : __CLC_CLC_AS_TYPE(INT_TYPE)(ix);                                \30    UINT_TYPE iy = __CLC_CLC_AS_TYPE(UINT_TYPE)(y);                            \31    FLOAT_TYPE absy = __clc_fabs(y);                                           \32    UINT_TYPE myu = sign_bit - iy;                                             \33    INT_TYPE my = __CLC_CLC_AS_TYPE(INT_TYPE)(myu);                            \34    my = __CLC_CLC_AS_TYPE(INT_TYPE)(iy) < (INT_TYPE)0                         \35             ? my                                                              \36             : __CLC_CLC_AS_TYPE(INT_TYPE)(iy);                                \37    INT_TYPE t = mx + (mx < my ? (INT_TYPE)1 : (INT_TYPE) - 1);                \38    UINT_TYPE r = sign_bit - __CLC_CLC_AS_TYPE(UINT_TYPE)(t);                  \39    r = (t < (INT_TYPE)0 || (t == (INT_TYPE)0 && mx < my))                     \40            ? r                                                                \41            : __CLC_CLC_AS_TYPE(UINT_TYPE)(t);                                 \42    r = __clc_isnan(x) ? ix : r;                                               \43    r = __clc_isnan(y) ? iy : r;                                               \44    r = ((__CLC_CLC_AS_TYPE(UINT_TYPE)(absx) |                                 \45          __CLC_CLC_AS_TYPE(UINT_TYPE)(absy)) == (UINT_TYPE)0 ||               \46         ix == iy)                                                             \47            ? iy                                                               \48            : r;                                                               \49    return __CLC_CLC_AS_TYPE(FLOAT_TYPE)(r);                                   \50  }51 52__CLC_NEXTAFTER(float, uint, int, int)53__CLC_NEXTAFTER(float2, uint2, int2, int)54__CLC_NEXTAFTER(float3, uint3, int3, int)55__CLC_NEXTAFTER(float4, uint4, int4, int)56__CLC_NEXTAFTER(float8, uint8, int8, int)57__CLC_NEXTAFTER(float16, uint16, int16, int)58 59#ifdef cl_khr_fp6460#pragma OPENCL EXTENSION cl_khr_fp64 : enable61 62__CLC_NEXTAFTER(double, ulong, long, long)63__CLC_NEXTAFTER(double2, ulong2, long2, long)64__CLC_NEXTAFTER(double3, ulong3, long3, long)65__CLC_NEXTAFTER(double4, ulong4, long4, long)66__CLC_NEXTAFTER(double8, ulong8, long8, long)67__CLC_NEXTAFTER(double16, ulong16, long16, long)68 69#endif70 71#ifdef cl_khr_fp1672#pragma OPENCL EXTENSION cl_khr_fp16 : enable73 74__CLC_NEXTAFTER(half, ushort, short, short)75__CLC_NEXTAFTER(half2, ushort2, short2, short)76__CLC_NEXTAFTER(half3, ushort3, short3, short)77__CLC_NEXTAFTER(half4, ushort4, short4, short)78__CLC_NEXTAFTER(half8, ushort8, short8, short)79__CLC_NEXTAFTER(half16, ushort16, short16, short)80 81#endif82