1#include <clc/clc.h>
2#include "relational.h"
3
4#define _CLC_DEFINE_ISORDERED(RET_TYPE, FUNCTION, ARG1_TYPE, ARG2_TYPE) \
5_CLC_DEF _CLC_OVERLOAD RET_TYPE FUNCTION(ARG1_TYPE x, ARG2_TYPE y) { \
6  return isequal(x, x) && isequal(y, y); \
7} \
8
9_CLC_DEFINE_ISORDERED(int, isordered, float, float)
10_CLC_DEFINE_RELATIONAL_BINARY_VEC_ALL(int, isordered, float, float)
11
12#ifdef cl_khr_fp64
13#pragma OPENCL EXTENSION cl_khr_fp64 : enable
14
15// The scalar version of isordered(double, double) returns an int, but the vector versions
16// return long.
17
18_CLC_DEFINE_ISORDERED(int, isordered, double, double)
19_CLC_DEFINE_RELATIONAL_BINARY_VEC_ALL(long, isordered, double, double)
20
21#endif
22#ifdef cl_khr_fp16
23#pragma OPENCL EXTENSION cl_khr_fp16 : enable
24
25// The scalar version of isordered(half, half) returns an int, but the vector versions
26// return short.
27
28_CLC_DEFINE_ISORDERED(int, isordered, half, half)
29_CLC_DEFINE_RELATIONAL_BINARY_VEC_ALL(short, isordered, half, half)
30
31#endif
32
33#undef _CLC_DEFINE_ISORDERED
34