diff options
author | Jan Vesely <jan.vesely@rutgers.edu> | 2018-03-06 17:48:43 +0000 |
---|---|---|
committer | Jan Vesely <jan.vesely@rutgers.edu> | 2018-03-06 17:48:43 +0000 |
commit | ae156b66f86dc07dc7c7e6b108d02c6ddaf14ddb (patch) | |
tree | fa436d6367ed3e8723bc5857422d54c6fe9252a1 /libclc/generic | |
parent | 44f21978a200b3fe94aaed8aa685cdf1d14da9ac (diff) | |
download | bcm5719-llvm-ae156b66f86dc07dc7c7e6b108d02c6ddaf14ddb.tar.gz bcm5719-llvm-ae156b66f86dc07dc7c7e6b108d02c6ddaf14ddb.zip |
select: Add vector implementation
Passes CTS on Carrizo
Reviewed-by: Aaron Watry <awatry@gmail.com>
Signed-off-by: Jan Vesely <jan.vesely@rutgers.edu>
llvm-svn: 326819
Diffstat (limited to 'libclc/generic')
-rw-r--r-- | libclc/generic/include/clc/relational/select.h | 12 | ||||
-rw-r--r-- | libclc/generic/include/clc/relational/select.inc | 25 | ||||
-rw-r--r-- | libclc/generic/lib/SOURCES | 1 | ||||
-rw-r--r-- | libclc/generic/lib/relational/select.cl | 7 | ||||
-rw-r--r-- | libclc/generic/lib/relational/select.inc | 47 |
5 files changed, 91 insertions, 1 deletions
diff --git a/libclc/generic/include/clc/relational/select.h b/libclc/generic/include/clc/relational/select.h index 33a6909fb92..d20deae0d2c 100644 --- a/libclc/generic/include/clc/relational/select.h +++ b/libclc/generic/include/clc/relational/select.h @@ -1 +1,11 @@ -#define select(a, b, c) ((c) ? (b) : (a)) +/* Duplciate these so we don't have to distribute utils.h */ +#define __CLC_CONCAT(x, y) x ## y +#define __CLC_XCONCAT(x, y) __CLC_CONCAT(x, y) + +#define __CLC_BODY <clc/relational/select.inc> +#include <clc/math/gentype.inc> +#define __CLC_BODY <clc/relational/select.inc> +#include <clc/integer/gentype.inc> + +#undef __CLC_CONCAT +#undef __CLC_XCONCAT diff --git a/libclc/generic/include/clc/relational/select.inc b/libclc/generic/include/clc/relational/select.inc new file mode 100644 index 00000000000..9c4aa674490 --- /dev/null +++ b/libclc/generic/include/clc/relational/select.inc @@ -0,0 +1,25 @@ +#ifdef __CLC_SCALAR +#define __CLC_VECSIZE +#endif + +#if __CLC_FPSIZE == 64 +#define __CLC_S_GENTYPE __CLC_XCONCAT(long, __CLC_VECSIZE) +#define __CLC_U_GENTYPE __CLC_XCONCAT(ulong, __CLC_VECSIZE) +#elif __CLC_FPSIZE == 32 +#define __CLC_S_GENTYPE __CLC_XCONCAT(int, __CLC_VECSIZE) +#define __CLC_U_GENTYPE __CLC_XCONCAT(uint, __CLC_VECSIZE) +#elif __CLC_FPSIZE == 16 +#define __CLC_S_GENTYPE __CLC_XCONCAT(char, __CLC_VECSIZE) +#define __CLC_U_GENTYPE __CLC_XCONCAT(uchar, __CLC_VECSIZE) +#endif + +_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE select(__CLC_GENTYPE x, __CLC_GENTYPE y, __CLC_S_GENTYPE z); +_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE select(__CLC_GENTYPE x, __CLC_GENTYPE y, __CLC_U_GENTYPE z); + +#ifdef __CLC_FPSIZE +#undef __CLC_S_GENTYPE +#undef __CLC_U_GENTYPE +#endif +#ifdef __CLC_SCALAR +#undef __CLC_VECSIZE +#endif diff --git a/libclc/generic/lib/SOURCES b/libclc/generic/lib/SOURCES index 13fe4fa98db..f9104a3f2a8 100644 --- a/libclc/generic/lib/SOURCES +++ b/libclc/generic/lib/SOURCES @@ -189,6 +189,7 @@ relational/isnormal.cl relational/isnotequal.cl relational/isordered.cl relational/isunordered.cl +relational/select.cl relational/signbit.cl shared/clamp.cl shared/max.cl diff --git a/libclc/generic/lib/relational/select.cl b/libclc/generic/lib/relational/select.cl new file mode 100644 index 00000000000..dc2e273c852 --- /dev/null +++ b/libclc/generic/lib/relational/select.cl @@ -0,0 +1,7 @@ +#include <clc/clc.h> +#include <utils.h> + +#define __CLC_BODY <select.inc> +#include <clc/math/gentype.inc> +#define __CLC_BODY <select.inc> +#include <clc/integer/gentype.inc> diff --git a/libclc/generic/lib/relational/select.inc b/libclc/generic/lib/relational/select.inc new file mode 100644 index 00000000000..a9790d174ad --- /dev/null +++ b/libclc/generic/lib/relational/select.inc @@ -0,0 +1,47 @@ +#ifdef __CLC_SCALAR +#define __CLC_VECSIZE +#endif + +#if __CLC_FPSIZE == 64 +#define __CLC_S_GENTYPE __CLC_XCONCAT(long, __CLC_VECSIZE) +#define __CLC_U_GENTYPE __CLC_XCONCAT(ulong, __CLC_VECSIZE) +#elif __CLC_FPSIZE == 32 +#define __CLC_S_GENTYPE __CLC_XCONCAT(int, __CLC_VECSIZE) +#define __CLC_U_GENTYPE __CLC_XCONCAT(uint, __CLC_VECSIZE) +#elif __CLC_FPSIZE == 16 +#define __CLC_S_GENTYPE __CLC_XCONCAT(char, __CLC_VECSIZE) +#define __CLC_U_GENTYPE __CLC_XCONCAT(uchar, __CLC_VECSIZE) +#endif +#ifdef __CLC_FPSIZE +#define __CLC_GENSIZE __CLC_FPSIZE +#endif + +#define __CLC_AS_S_GENTYPE __CLC_XCONCAT(as_, __CLC_S_GENTYPE) +#define __CLC_AS_GENTYPE __CLC_XCONCAT(as_, __CLC_GENTYPE) + +_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE select(__CLC_GENTYPE x, __CLC_GENTYPE y, __CLC_S_GENTYPE z) +{ +#ifdef __CLC_SCALAR + return z ? y : x; +#else + __CLC_S_GENTYPE bitmask = z >> (__CLC_GENSIZE - 1); + return __CLC_AS_GENTYPE(bitselect(__CLC_AS_S_GENTYPE(x), __CLC_AS_S_GENTYPE(y), bitmask)); +#endif +} + +_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE select(__CLC_GENTYPE x, __CLC_GENTYPE y, __CLC_U_GENTYPE z) +{ + return select(x, y, __CLC_AS_S_GENTYPE(z)); +} + +#undef __CLC_AS_S_GENTYPE +#undef __CLC_AS_GENTYPE + +#ifdef __CLC_FPSIZE +#undef __CLC_S_GENTYPE +#undef __CLC_U_GENTYPE +#undef __CLC_GENSIZE +#endif +#ifdef __CLC_SCALAR +#undef __CLC_VECSIZE +#endif |