OK. I've sent out version two. For the scalar type, returns NaN if x is NaN.
Homer -----Original Message----- From: Zhigang Gong [mailto:[email protected]] Sent: Tuesday, October 29, 2013 10:28 AM To: Xing, Homer Cc: [email protected] Subject: Re: [Beignet] [PATCH] fix built-in function "normalize" The same issue as previous patch. If the x is NaN, we should return NaN. For the vector version, this patch seems ok. But for the scalar version, it's broken. On Tue, Oct 29, 2013 at 09:22:33AM +0800, Homer Hsing wrote: > divide the parameter by its length > > Signed-off-by: Homer Hsing <[email protected]> > --- > backend/src/ocl_stdlib.tmpl.h | 29 +++++++++++++++++++++++++---- > 1 file changed, 25 insertions(+), 4 deletions(-) > > diff --git a/backend/src/ocl_stdlib.tmpl.h > b/backend/src/ocl_stdlib.tmpl.h index 38d1ab0..77b6bd0 100644 > --- a/backend/src/ocl_stdlib.tmpl.h > +++ b/backend/src/ocl_stdlib.tmpl.h > @@ -1766,10 +1766,31 @@ INLINE_OVERLOADABLE float distance(float x, > float y) { return length(x-y); } INLINE_OVERLOADABLE float > distance(float2 x, float2 y) { return length(x-y); } > INLINE_OVERLOADABLE float distance(float3 x, float3 y) { return > length(x-y); } INLINE_OVERLOADABLE float distance(float4 x, float4 y) > { return length(x-y); } -INLINE_OVERLOADABLE float normalize(float x) > { return 1.f; } -INLINE_OVERLOADABLE float2 normalize(float2 x) { > return x * rsqrt(dot(x, x)); } -INLINE_OVERLOADABLE float3 > normalize(float3 x) { return x * rsqrt(dot(x, x)); } > -INLINE_OVERLOADABLE float4 normalize(float4 x) { return x * > rsqrt(dot(x, x)); } > +INLINE_OVERLOADABLE float normalize(float x) { > + union { float f; unsigned u; } u; > + u.f = x; > + if(u.u == 0) > + return 0.f; > + return u.u < 0x7fffffff ? 1.f : -1.f; } INLINE_OVERLOADABLE float2 > +normalize(float2 x) { > + float m = length(x); > + if(m == 0) > + return 0; > + return x / m; > +} > +INLINE_OVERLOADABLE float3 normalize(float3 x) { > + float m = length(x); > + if(m == 0) > + return 0; > + return x / m; > +} > +INLINE_OVERLOADABLE float4 normalize(float4 x) { > + float m = length(x); > + if(m == 0) > + return 0; > + return x / m; > +} > > INLINE_OVERLOADABLE float fast_length(float x) { return > __gen_ocl_fabs(x); } INLINE_OVERLOADABLE float fast_length(float2 x) > { return sqrt(dot(x,x)); } > -- > 1.8.3.2 > > _______________________________________________ > Beignet mailing list > [email protected] > http://lists.freedesktop.org/mailman/listinfo/beignet _______________________________________________ Beignet mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/beignet
