From 58fdb3b09aae005c594ea66bfb85b395d7193636 Mon Sep 17 00:00:00 2001 From: Jan Vesely Date: Tue, 15 May 2018 04:22:43 +0000 Subject: [PATCH] rootn: Use denormal path only It's OK to either flush to 0 or return denormal result if the device does not support denormals. See sec 7.2 and 7.5.3 of OCL specs Use 0.0f explicitly intead of relying on GPU to flush it. Fixes CTS on carrizo and turks Signed-off-by: Jan Vesely Acked-by: Aaron Watry Tested-by: Aaron Watry llvm-svn: 332324 --- libclc/generic/lib/math/clc_rootn.cl | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/libclc/generic/lib/math/clc_rootn.cl b/libclc/generic/lib/math/clc_rootn.cl index d7ee185..0a2c98d 100644 --- a/libclc/generic/lib/math/clc_rootn.cl +++ b/libclc/generic/lib/math/clc_rootn.cl @@ -170,16 +170,7 @@ _CLC_DEF _CLC_OVERLOAD float __clc_rootn(float x, int ny) tv = USE_TABLE(exp_tbl_ep, j); float expylogx = mad(tv.s0, poly, mad(tv.s1, poly, tv.s1)) + tv.s0; - float sexpylogx; - if (!__clc_fp32_subnormals_supported()) { - int explg = ((as_uint(expylogx) & EXPBITS_SP32 >> 23) - 127); - m = (23-(m + 149)) == 0 ? 1: m; - uint mantissa = ((as_uint(expylogx) & MANTBITS_SP32)|IMPBIT_SP32) >> (23-(m + 149)); - sexpylogx = as_float(mantissa); - } else { - sexpylogx = expylogx * as_float(0x1 << (m + 149)); - } - + float sexpylogx = __clc_fp32_subnormals_supported() ? expylogx * as_float(0x1 << (m + 149)) : 0.0f; float texpylogx = as_float(as_int(expylogx) + m2); expylogx = m < -125 ? sexpylogx : texpylogx; -- 2.7.4