[Libclc-dev] [PATCH 2/4] Implement atan2 builtin

Aaron Watry awatry at gmail.com
Tue Sep 2 10:03:04 PDT 2014


Hi Tom,

I was working on implementing asin/acos and a few others recently, and
I noticed that atan2 doesn't actually run on evergreen (CEDAR).

Using the attached piglit test, I get the following error:
LLVM triggered Diagnostic Handler: unsupported call to function
__extendsfdf2 in test_1_atan2_float

Note that the atan function passes all of the tests, it's just the
atan2 function which doesn't seem to work on evergreen (works on
radeonsi, however).

--Aaron



On Wed, Jul 2, 2014 at 3:11 PM, Tom Stellard <thomas.stellard at amd.com> wrote:
> ---
>  generic/include/clc/clc.h |  2 ++
>  generic/lib/SOURCES       |  1 +
>  generic/lib/math/atan2.cl | 81 +++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 84 insertions(+)
>  create mode 100644 generic/lib/math/atan2.cl
>
> diff --git a/generic/include/clc/clc.h b/generic/include/clc/clc.h
> index af177dc..892503a 100644
> --- a/generic/include/clc/clc.h
> +++ b/generic/include/clc/clc.h
> @@ -33,6 +33,8 @@
>
>  /* 6.11.2 Math Functions */
>  #include <clc/math/atan.h>
> +#include <clc/math/atan2.h>
> +#include <clc/math/copysign.h>
>  #include <clc/math/cos.h>
>  #include <clc/math/ceil.h>
>  #include <clc/math/exp.h>
> diff --git a/generic/lib/SOURCES b/generic/lib/SOURCES
> index ed93084..aa8b88d 100644
> --- a/generic/lib/SOURCES
> +++ b/generic/lib/SOURCES
> @@ -28,6 +28,7 @@ integer/sub_sat_if.ll
>  integer/sub_sat_impl.ll
>  integer/upsample.cl
>  math/atan.cl
> +math/atan2.cl
>  math/exp.cl
>  math/fmax.cl
>  math/fmin.cl
> diff --git a/generic/lib/math/atan2.cl b/generic/lib/math/atan2.cl
> new file mode 100644
> index 0000000..809ab5b
> --- /dev/null
> +++ b/generic/lib/math/atan2.cl
> @@ -0,0 +1,81 @@
> +/*
> + * 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.
> + */
> +
> +#define INFINITY 0.0f/0.0f
> +#include "math.h"
> +
> +#include <clc/clc.h>
> +
> +_CLC_OVERLOAD _CLC_DEF float atan2(float y, float x)
> +{
> +    const float pi = 0x1.921fb6p+1f;
> +    const float piby2 = 0x1.921fb6p+0f;
> +    const float piby4 = 0x1.921fb6p-1f;
> +    const float threepiby4 = 0x1.2d97c8p+1f;
> +
> +    float ax = fabs(x);
> +    float ay = fabs(y);
> +    float v = min(ax, ay);
> +    float u = max(ax, ay);
> +
> +    // Scale since u could be large, as in "regular" divide
> +    float s = u > 0x1.0p+96f ? 0x1.0p-32f : 1.0f;
> +    float vbyu = s * MATH_DIVIDE(v, s*u);
> +
> +    float vbyu2 = vbyu * vbyu;
> +
> +#define USE_2_2_APPROXIMATION
> +#if defined USE_2_2_APPROXIMATION
> +    float p = mad(vbyu2, mad(vbyu2, -0x1.7e1f78p-9f, -0x1.7d1b98p-3f), -0x1.5554d0p-2f) * vbyu2 * vbyu;
> +    float q = mad(vbyu2, mad(vbyu2, 0x1.1a714cp-2f, 0x1.287c56p+0f), 1.0f);
> +#else
> +    float p = mad(vbyu2, mad(vbyu2, -0x1.55cd22p-5f, -0x1.26cf76p-2f), -0x1.55554ep-2f) * vbyu2 * vbyu;
> +    float q = mad(vbyu2, mad(vbyu2, mad(vbyu2, 0x1.9f1304p-5f, 0x1.2656fap-1f), 0x1.76b4b8p+0f), 1.0f);
> +#endif
> +
> +    // Octant 0 result
> +    float a = mad(p, MATH_RECIP(q), vbyu);
> +
> +    // Fix up 3 other octants
> +    float at = piby2 - a;
> +    a = ay > ax ? at : a;
> +    at = pi - a;
> +    a = x < 0.0F ? at : a;
> +
> +    // y == 0 => 0 for x >= 0, pi for x < 0
> +    at = as_int(x) < 0 ? pi : 0.0f;
> +    a = y == 0.0f ? at : a;
> +
> +    // if (!FINITE_ONLY()) {
> +        // x and y are +- Inf
> +        at = x > 0.0f ? piby4 : threepiby4;
> +        a = ax == INFINITY & ay == INFINITY ? at : a;
> +
> +       // x or y is NaN
> +       a = isnan(x) | isnan(y) ? as_float(QNANBITPATT_SP32) : a;
> +    // }
> +
> +    // Fixup sign and return
> +    return copysign(a, y);
> +}
> +
> +_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, float, atan2, float, float);
> --
> 1.8.1.5
>
>
> _______________________________________________
> Libclc-dev mailing list
> Libclc-dev at pcc.me.uk
> http://www.pcc.me.uk/cgi-bin/mailman/listinfo/libclc-dev
-------------- next part --------------
A non-text attachment was scrubbed...
Name: builtin-float-atan2-1.0.generated.cl
Type: application/octet-stream
Size: 9208 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libclc-dev/attachments/20140902/41ac0fe4/attachment-0002.obj>


More information about the Libclc-dev mailing list