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

Tom Stellard tom at stellard.net
Tue Sep 2 10:17:53 PDT 2014


On Tue, Sep 02, 2014 at 12:03:04PM -0500, Aaron Watry wrote:
> 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
> 

__extendsfdf2 is the library function for converting f32 to f64, so this error
means evergreen does not implement this conversion.  I think this is a bug
in the way we report double support, since evergreen should not be using any
double types.  I will look into this.

-Tom


> 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


> _______________________________________________
> Libclc-dev mailing list
> Libclc-dev at pcc.me.uk
> http://www.pcc.me.uk/cgi-bin/mailman/listinfo/libclc-dev





More information about the Libclc-dev mailing list