diff options
| author | Tom Stellard <thomas.stellard@amd.com> | 2015-05-06 16:06:31 +0000 |
|---|---|---|
| committer | Tom Stellard <thomas.stellard@amd.com> | 2015-05-06 16:06:31 +0000 |
| commit | aed5f3cf7e31886a373b5b62585fb88a6bd85167 (patch) | |
| tree | 5e22f308a918e330abcec591c7dbf7a496dbcfdc | |
| parent | ad5ee0405876e62b24b6dbd7eb1618593bfdee0b (diff) | |
| download | bcm5719-llvm-aed5f3cf7e31886a373b5b62585fb88a6bd85167.tar.gz bcm5719-llvm-aed5f3cf7e31886a373b5b62585fb88a6bd85167.zip | |
Fix implementation of normalize builtin
The new implementation was ported from the AMD builtin library
and has been tested with piglit, OpenCV, and the ocl conformance tests.
llvm-svn: 236608
| -rw-r--r-- | libclc/generic/lib/geometric/normalize.cl | 155 | ||||
| -rw-r--r-- | libclc/generic/lib/geometric/normalize.inc | 3 |
2 files changed, 152 insertions, 6 deletions
diff --git a/libclc/generic/lib/geometric/normalize.cl b/libclc/generic/lib/geometric/normalize.cl index b06b2fe3a4c..f61ac9444b0 100644 --- a/libclc/generic/lib/geometric/normalize.cl +++ b/libclc/generic/lib/geometric/normalize.cl @@ -1,8 +1,157 @@ +/* + * 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/clc.h> +_CLC_OVERLOAD _CLC_DEF float normalize(float p) { + return sign(p); +} + +_CLC_OVERLOAD _CLC_DEF float2 normalize(float2 p) { + if (all(p == (float2)0.0F)) + return p; + + float l2 = dot(p, p); + + if (l2 < FLT_MIN) { + p *= 0x1.0p+86F; + l2 = dot(p, p); + } else if (l2 == INFINITY) { + p *= 0x1.0p-65f; + l2 = dot(p, p); + if (l2 == INFINITY) { + p = copysign(select((float2)0.0F, (float2)1.0F, isinf(p)), p); + l2 = dot(p, p); + } + } + return p * rsqrt(l2); +} + +_CLC_OVERLOAD _CLC_DEF float3 normalize(float3 p) { + if (all(p == (float3)0.0F)) + return p; + + float l2 = dot(p, p); + + if (l2 < FLT_MIN) { + p *= 0x1.0p+86F; + l2 = dot(p, p); + } else if (l2 == INFINITY) { + p *= 0x1.0p-66f; + l2 = dot(p, p); + if (l2 == INFINITY) { + p = copysign(select((float3)0.0F, (float3)1.0F, isinf(p)), p); + l2 = dot(p, p); + } + } + return p * rsqrt(l2); +} + +_CLC_OVERLOAD _CLC_DEF float4 normalize(float4 p) { + if (all(p == (float4)0.0F)) + return p; + + float l2 = dot(p, p); + + if (l2 < FLT_MIN) { + p *= 0x1.0p+86F; + l2 = dot(p, p); + } else if (l2 == INFINITY) { + p *= 0x1.0p-66f; + l2 = dot(p, p); + if (l2 == INFINITY) { + p = copysign(select((float4)0.0F, (float4)1.0F, isinf(p)), p); + l2 = dot(p, p); + } + } + return p * rsqrt(l2); +} + #ifdef cl_khr_fp64 + #pragma OPENCL EXTENSION cl_khr_fp64 : enable -#endif -#define __CLC_BODY <normalize.inc> -#include <clc/geometric/floatn.inc> +_CLC_OVERLOAD _CLC_DEF double normalize(double p) { + return sign(p); +} + +_CLC_OVERLOAD _CLC_DEF double2 normalize(double2 p) { + if (all(p == (double2)0.0)) + return p; + + double l2 = dot(p, p); + + if (l2 < DBL_MIN) { + p *= 0x1.0p+563; + l2 = dot(p, p); + } else if (l2 == INFINITY) { + p *= 0x1.0p-513; + l2 = dot(p, p); + if (l2 == INFINITY) { + p = copysign(select((double2)0.0, (double2)1.0, isinf(p)), p); + l2 = dot(p, p); + } + } + return p * rsqrt(l2); +} + +_CLC_OVERLOAD _CLC_DEF double3 normalize(double3 p) { + if (all(p == (double3)0.0)) + return p; + + double l2 = dot(p, p); + + if (l2 < DBL_MIN) { + p *= 0x1.0p+563; + l2 = dot(p, p); + } else if (l2 == INFINITY) { + p *= 0x1.0p-514; + l2 = dot(p, p); + if (l2 == INFINITY) { + p = copysign(select((double3)0.0, (double3)1.0, isinf(p)), p); + l2 = dot(p, p); + } + } + return p * rsqrt(l2); +} + +_CLC_OVERLOAD _CLC_DEF double4 normalize(double4 p) { + if (all(p == (double4)0.0)) + return p; + + double l2 = dot(p, p); + + if (l2 < DBL_MIN) { + p *= 0x1.0p+563; + l2 = dot(p, p); + } else if (l2 == INFINITY) { + p *= 0x1.0p-514; + l2 = dot(p, p); + if (l2 == INFINITY) { + p = copysign(select((double4)0.0, (double4)1.0, isinf(p)), p); + l2 = dot(p, p); + } + } + return p * rsqrt(l2); +} + +#endif diff --git a/libclc/generic/lib/geometric/normalize.inc b/libclc/generic/lib/geometric/normalize.inc deleted file mode 100644 index 423ff79fc4e..00000000000 --- a/libclc/generic/lib/geometric/normalize.inc +++ /dev/null @@ -1,3 +0,0 @@ -_CLC_OVERLOAD _CLC_DEF __CLC_FLOATN normalize(__CLC_FLOATN p) { - return p/length(p); -} |

