From cb1c0d7939dfd10ca439518ad798e00339eab3fa Mon Sep 17 00:00:00 2001 From: Tom Stellard Date: Mon, 23 Mar 2015 17:01:33 +0000 Subject: [PATCH] Fix implementation of length builtin v2 v2: - Move common code into a macro - Use the same constant for all vector types. llvm-svn: 232963 --- libclc/generic/lib/geometric/length.cl | 85 +++++++++++++++++++++++++++++++-- libclc/generic/lib/geometric/length.inc | 3 -- 2 files changed, 82 insertions(+), 6 deletions(-) delete mode 100644 libclc/generic/lib/geometric/length.inc diff --git a/libclc/generic/lib/geometric/length.cl b/libclc/generic/lib/geometric/length.cl index ef087c7..e7f31b4 100644 --- a/libclc/generic/lib/geometric/length.cl +++ b/libclc/generic/lib/geometric/length.cl @@ -1,8 +1,87 @@ +/* + * Copyright (c) 2014 Advanced Micro Devices, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + #include +_CLC_OVERLOAD _CLC_DEF float length(float p) { + return fabs(p); +} + +#define V_FLENGTH(p) \ + float l2 = dot(p, p); \ + \ + if (l2 < FLT_MIN) { \ + p *= 0x1.0p+86F; \ + return sqrt(dot(p, p)) * 0x1.0p-86F; \ + } else if (l2 == INFINITY) { \ + p *= 0x1.0p-65F; \ + return sqrt(dot(p, p)) * 0x1.0p+65F; \ + } \ + \ + return sqrt(l2); + +_CLC_OVERLOAD _CLC_DEF float length(float2 p) { + V_FLENGTH(p); +} + +_CLC_OVERLOAD _CLC_DEF float length(float3 p) { + V_FLENGTH(p); +} + +_CLC_OVERLOAD _CLC_DEF float length(float4 p) { + V_FLENGTH(p); +} + #ifdef cl_khr_fp64 #pragma OPENCL EXTENSION cl_khr_fp64 : enable -#endif -#define __CLC_BODY -#include +_CLC_OVERLOAD _CLC_DEF double length(double p){ + return fabs(p); +} + +#define V_DLENGTH(p) \ + double l2 = dot(p, p); \ + \ + if (l2 < DBL_MIN) { \ + p *= 0x1.0p+563; \ + return sqrt(dot(p, p)) * 0x1.0p-563; \ + } else if (l2 == INFINITY) { \ + p *= 0x1.0p-513; \ + return sqrt(dot(p, p)) * 0x1.0p+513; \ + } \ + \ + return sqrt(l2); + +_CLC_OVERLOAD _CLC_DEF double length(double2 p) { + V_DLENGTH(p); +} + +_CLC_OVERLOAD _CLC_DEF double length(double3 p) { + V_DLENGTH(p); +} + +_CLC_OVERLOAD _CLC_DEF double +length(double4 p) { + V_DLENGTH(p); +} + +#endif diff --git a/libclc/generic/lib/geometric/length.inc b/libclc/generic/lib/geometric/length.inc deleted file mode 100644 index 5faaaff..0000000 --- a/libclc/generic/lib/geometric/length.inc +++ /dev/null @@ -1,3 +0,0 @@ -_CLC_OVERLOAD _CLC_DEF __CLC_FLOAT length(__CLC_FLOATN p) { - return native_sqrt(dot(p, p)); -} -- 2.7.4