fix isnan (builtin function)
authorHomer Hsing <homer.xing@intel.com>
Wed, 9 Oct 2013 08:14:48 +0000 (16:14 +0800)
committerZhigang Gong <zhigang.gong@linux.intel.com>
Thu, 10 Oct 2013 05:22:17 +0000 (13:22 +0800)
this patch passes following piglit test case
  piglit/framework/../bin/cl-program-tester generated_tests/cl/builtin/relational/builtin-float-isnan-1.0.generated.cl

Signed-off-by: Homer Hsing <homer.xing@intel.com>
Reviewed-by: "Yang, Rong R" <rong.r.yang@intel.com>
backend/src/ocl_stdlib.tmpl.h

index 1982585..a4a1562 100644 (file)
@@ -225,7 +225,11 @@ uchar INLINE_OVERLOADABLE convert_uchar_sat(float x) {
 
 INLINE_OVERLOADABLE int isfinite(float x) { return __builtin_isfinite(x); }
 INLINE_OVERLOADABLE int isinf(float x) { return __builtin_isinf(x); }
-INLINE_OVERLOADABLE int isnan(float x) { return __builtin_isnan(x); }
+INLINE_OVERLOADABLE int isnan(float x) {
+  union { uint u; float f; } u;
+  u.f = x;
+  return (u.u & 0x7FFFFFFF) > 0x7F800000;
+}
 INLINE_OVERLOADABLE int isnormal(float x) { return __builtin_isnormal(x); }
 INLINE_OVERLOADABLE int isordered(float x, float y) { return isequal(x, x) && isequal(y, y); }
 INLINE_OVERLOADABLE int isunordered(float x, float y) { return isnan(x) || isnan(y); }