diff options
| author | Tom Stellard <thomas.stellard@amd.com> | 2015-03-23 17:01:33 +0000 |
|---|---|---|
| committer | Tom Stellard <thomas.stellard@amd.com> | 2015-03-23 17:01:33 +0000 |
| commit | cb1c0d7939dfd10ca439518ad798e00339eab3fa (patch) | |
| tree | c87c49ca16db54e872d95d5544d9920ce0006a36 /libclc | |
| parent | ae0ad9c95ddb25f00e3284722acbbcef76a02d7f (diff) | |
| download | bcm5719-llvm-cb1c0d7939dfd10ca439518ad798e00339eab3fa.tar.gz bcm5719-llvm-cb1c0d7939dfd10ca439518ad798e00339eab3fa.zip | |
Fix implementation of length builtin v2
v2:
- Move common code into a macro
- Use the same constant for all vector types.
llvm-svn: 232963
Diffstat (limited to 'libclc')
| -rw-r--r-- | libclc/generic/lib/geometric/length.cl | 85 | ||||
| -rw-r--r-- | libclc/generic/lib/geometric/length.inc | 3 |
2 files changed, 82 insertions, 6 deletions
diff --git a/libclc/generic/lib/geometric/length.cl b/libclc/generic/lib/geometric/length.cl index ef087c75f9f..e7f31b43ae1 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/clc.h> +_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 <length.inc> -#include <clc/geometric/floatn.inc> +_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 5faaaffbd6a..00000000000 --- 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)); -} |

