[Beignet] [PATCH v2] add built-in function "atan2pi"

Zhigang Gong zhigang.gong at linux.intel.com
Thu Sep 12 20:21:53 PDT 2013


Pushed, thanks.

On Fri, Sep 13, 2013 at 10:22:48AM +0800, Homer Hsing wrote:
> version 2: fix a typo. and add corner cases
> 
> Signed-off-by: Homer Hsing <homer.xing at intel.com>
> ---
>  backend/src/builtin_vector_proto.def |  2 +-
>  backend/src/ocl_stdlib.tmpl.h        | 61 ++++++++++++++++++++++++++++++++++++
>  2 files changed, 62 insertions(+), 1 deletion(-)
> 
> diff --git a/backend/src/builtin_vector_proto.def b/backend/src/builtin_vector_proto.def
> index 23ed8d3..2b8f913 100644
> --- a/backend/src/builtin_vector_proto.def
> +++ b/backend/src/builtin_vector_proto.def
> @@ -9,7 +9,7 @@ gentype atan (gentype y_over_x)
>  gentype atan2 (gentype y, gentype x)
>  gentype atanh (gentype)
>  gentype atanpi (gentype x)
> -#gentype atan2pi (gentype y, gentype x)
> +gentype atan2pi (gentype y, gentype x)
>  gentype cbrt (gentype)
>  gentype ceil (gentype)
>  gentype copysign (gentype x, gentype y)
> diff --git a/backend/src/ocl_stdlib.tmpl.h b/backend/src/ocl_stdlib.tmpl.h
> index bc6ecbe..0f91bf5 100644
> --- a/backend/src/ocl_stdlib.tmpl.h
> +++ b/backend/src/ocl_stdlib.tmpl.h
> @@ -1391,6 +1391,66 @@ INLINE_OVERLOADABLE float __gen_ocl_internal_atan2(float y, float x) {
>      return - M_PI_F + z;
>    }
>  }
> +INLINE_OVERLOADABLE float __gen_ocl_internal_atan2pi(float y, float x) {
> +  uint ix = as_uint(x), iy = as_uint(y),
> +       pos_zero = 0, neg_zero = 0x80000000u,
> +       pos_inf = 0x7f800000, neg_inf = 0xff800000u;
> +  if(iy == pos_zero) {
> +    if(ix == pos_zero)
> +      return 0;
> +    if(ix == neg_zero)
> +      return 1;
> +    if(x < 0)
> +      return 1;
> +    if(x > 0)
> +      return 0;
> +  }
> +  if(iy == neg_zero) {
> +    if(ix == pos_zero)
> +      return -0.f;
> +    if(ix == neg_zero)
> +      return -1;
> +    if(x < 0)
> +      return -1;
> +    if(x > 0)
> +      return -0.f;
> +  }
> +  if((ix & 0x7fffffff) == 0) {
> +    if(y < 0)
> +      return -.5f;
> +    if(y > 0)
> +      return .5f;
> +  }
> +  if(ix == pos_inf) {
> +    if(y > 0 && iy != pos_inf)
> +      return 0;
> +    if(y < 0 && iy != neg_inf)
> +      return -0.f;
> +  }
> +  if(ix == neg_inf) {
> +    if(y > 0 && iy != pos_inf)
> +      return 1;
> +    if(y < 0 && iy != neg_inf)
> +      return -1;
> +  }
> +  if(iy == pos_inf) {
> +    if(ix == pos_inf)
> +      return 0.25f;
> +    if(ix == neg_inf)
> +      return 0.75f;
> +    if(x >= 0 || x <= 0)
> +      return 0.5f;
> +  }
> +  if(iy == neg_inf) {
> +    if(ix == pos_inf)
> +      return -0.25f;
> +    if(ix == neg_inf)
> +      return -0.75f;
> +    if(x >= 0 || x <= 0)
> +      return -0.5f;
> +  }
> +  return __gen_ocl_internal_atan2(y, x) / M_PI_F;
> +}
>  INLINE_OVERLOADABLE float __gen_ocl_internal_fabs(float x)  { return __gen_ocl_fabs(x); }
>  INLINE_OVERLOADABLE float __gen_ocl_internal_trunc(float x) { return __gen_ocl_rndz(x); }
>  INLINE_OVERLOADABLE float __gen_ocl_internal_round(float x) { return __gen_ocl_rnde(x); }
> @@ -1424,6 +1484,7 @@ INLINE_OVERLOADABLE float __gen_ocl_internal_rint(float x) {
>  #define tanh __gen_ocl_internal_tanh
>  #define atan __gen_ocl_internal_atan
>  #define atan2 __gen_ocl_internal_atan2
> +#define atan2pi __gen_ocl_internal_atan2pi
>  #define atanpi __gen_ocl_internal_atanpi
>  #define atanh __gen_ocl_internal_atanh
>  #define pow powr
> -- 
> 1.8.1.2
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list