95 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/relational/relational.h>11 12#define _CLC_DEFINE_RELATIONAL_UNARY_VEC2(RET_TYPE, __CLC_FUNCTION, ARG_TYPE) \13 _CLC_DEF _CLC_OVERLOAD RET_TYPE __CLC_FUNCTION(ARG_TYPE x) { \14 return (RET_TYPE)((RET_TYPE){__CLC_FUNCTION(x.lo), \15 __CLC_FUNCTION(x.hi)} != (RET_TYPE)0); \16 }17 18#define _CLC_DEFINE_RELATIONAL_UNARY_VEC3(RET_TYPE, __CLC_FUNCTION, ARG_TYPE) \19 _CLC_DEF _CLC_OVERLOAD RET_TYPE __CLC_FUNCTION(ARG_TYPE x) { \20 return (RET_TYPE)((RET_TYPE){__CLC_FUNCTION(x.s0), __CLC_FUNCTION(x.s1), \21 __CLC_FUNCTION(x.s2)} != (RET_TYPE)0); \22 }23 24#define _CLC_DEFINE_RELATIONAL_UNARY_VEC4(RET_TYPE, __CLC_FUNCTION, ARG_TYPE) \25 _CLC_DEF _CLC_OVERLOAD RET_TYPE __CLC_FUNCTION(ARG_TYPE x) { \26 return (RET_TYPE)((RET_TYPE){__CLC_FUNCTION(x.s0), __CLC_FUNCTION(x.s1), \27 __CLC_FUNCTION(x.s2), \28 __CLC_FUNCTION(x.s3)} != (RET_TYPE)0); \29 }30 31#define _CLC_DEFINE_RELATIONAL_UNARY_VEC8(RET_TYPE, __CLC_FUNCTION, ARG_TYPE) \32 _CLC_DEF _CLC_OVERLOAD RET_TYPE __CLC_FUNCTION(ARG_TYPE x) { \33 return (RET_TYPE)((RET_TYPE){__CLC_FUNCTION(x.s0), __CLC_FUNCTION(x.s1), \34 __CLC_FUNCTION(x.s2), __CLC_FUNCTION(x.s3), \35 __CLC_FUNCTION(x.s4), __CLC_FUNCTION(x.s5), \36 __CLC_FUNCTION(x.s6), \37 __CLC_FUNCTION(x.s7)} != (RET_TYPE)0); \38 }39 40#define _CLC_DEFINE_RELATIONAL_UNARY_VEC16(RET_TYPE, __CLC_FUNCTION, ARG_TYPE) \41 _CLC_DEF _CLC_OVERLOAD RET_TYPE __CLC_FUNCTION(ARG_TYPE x) { \42 return (RET_TYPE)((RET_TYPE){__CLC_FUNCTION(x.s0), __CLC_FUNCTION(x.s1), \43 __CLC_FUNCTION(x.s2), __CLC_FUNCTION(x.s3), \44 __CLC_FUNCTION(x.s4), __CLC_FUNCTION(x.s5), \45 __CLC_FUNCTION(x.s6), __CLC_FUNCTION(x.s7), \46 __CLC_FUNCTION(x.s8), __CLC_FUNCTION(x.s9), \47 __CLC_FUNCTION(x.sa), __CLC_FUNCTION(x.sb), \48 __CLC_FUNCTION(x.sc), __CLC_FUNCTION(x.sd), \49 __CLC_FUNCTION(x.se), \50 __CLC_FUNCTION(x.sf)} != (RET_TYPE)0); \51 }52 53#define _CLC_DEFINE_RELATIONAL_UNARY_VEC_ALL(RET_TYPE, __CLC_FUNCTION, \54 ARG_TYPE) \55 _CLC_DEFINE_RELATIONAL_UNARY_VEC2(RET_TYPE##2, __CLC_FUNCTION, ARG_TYPE##2) \56 _CLC_DEFINE_RELATIONAL_UNARY_VEC3(RET_TYPE##3, __CLC_FUNCTION, ARG_TYPE##3) \57 _CLC_DEFINE_RELATIONAL_UNARY_VEC4(RET_TYPE##4, __CLC_FUNCTION, ARG_TYPE##4) \58 _CLC_DEFINE_RELATIONAL_UNARY_VEC8(RET_TYPE##8, __CLC_FUNCTION, ARG_TYPE##8) \59 _CLC_DEFINE_RELATIONAL_UNARY_VEC16(RET_TYPE##16, __CLC_FUNCTION, ARG_TYPE##16)60 61_CLC_DEF _CLC_OVERLOAD int __clc_signbit(float x) {62 return __builtin_signbitf(x);63}64 65_CLC_DEFINE_RELATIONAL_UNARY_VEC_ALL(int, __clc_signbit, float)66 67#ifdef cl_khr_fp6468 69#pragma OPENCL EXTENSION cl_khr_fp64 : enable70 71// The scalar version of __clc_signbit(double) returns an int, but the vector72// versions return long.73 74_CLC_DEF _CLC_OVERLOAD int __clc_signbit(double x) {75 return __builtin_signbit(x);76}77 78_CLC_DEFINE_RELATIONAL_UNARY_VEC_ALL(long, __clc_signbit, double)79 80#endif81#ifdef cl_khr_fp1682 83#pragma OPENCL EXTENSION cl_khr_fp16 : enable84 85// The scalar version of __clc_signbit(half) returns an int, but the vector86// versions return short.87 88_CLC_DEF _CLC_OVERLOAD int __clc_signbit(half x) {89 return __builtin_signbit(x);90}91 92_CLC_DEFINE_RELATIONAL_UNARY_VEC_ALL(short, __clc_signbit, half)93 94#endif95