fix builtin function "copysign"
authorHomer Hsing <homer.xing@intel.com>
Thu, 7 Nov 2013 06:31:36 +0000 (14:31 +0800)
committerZhigang Gong <zhigang.gong@intel.com>
Thu, 7 Nov 2013 07:02:31 +0000 (15:02 +0800)
using better algorithm

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 f20a1a9..2b01c34 100644 (file)
@@ -1423,7 +1423,11 @@ INLINE_OVERLOADABLE float __gen_ocl_internal_atanh(float x) {
   return 0.5f * native_sqrt((1 + x) / (1 - x));
 }
 INLINE_OVERLOADABLE float __gen_ocl_internal_copysign(float x, float y) {
-  return x * y < 0 ? -x : x;
+  union { unsigned u; float f; } ux, uy;
+  ux.f = x;
+  uy.f = y;
+  ux.u = (ux.u & 0x7fffffff) | (uy.u & 0x80000000u);
+  return ux.f;
 }
 INLINE_OVERLOADABLE float __gen_ocl_internal_erf(float x) {
   return M_2_SQRTPI_F * (x - __gen_ocl_pow(x, 3) / 3 + __gen_ocl_pow(x, 5) / 10 - __gen_ocl_pow(x, 7) / 42 + __gen_ocl_pow(x, 9) / 216);