From 0a276d1b549b5f1e8b062878ada6f3b63f177240 Mon Sep 17 00:00:00 2001 From: Homer Hsing Date: Tue, 29 Oct 2013 11:12:46 +0800 Subject: [PATCH] fix built-in function "normalize" divide the parameter by its length ver 2: scalar typed function returns NaN if parameter is NaN. Signed-off-by: Homer Hsing Reviewed-by: Zhigang Gong --- backend/src/ocl_stdlib.tmpl.h | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/backend/src/ocl_stdlib.tmpl.h b/backend/src/ocl_stdlib.tmpl.h index 4f5da1c..a1f365c 100644 --- a/backend/src/ocl_stdlib.tmpl.h +++ b/backend/src/ocl_stdlib.tmpl.h @@ -1774,10 +1774,33 @@ 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; + if(isnan(x)) + return NAN; + 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)); } -- 2.7.4