Author: jvesely Date: Tue Feb 6 10:44:43 2018 New Revision: 324373 URL: http://llvm.org/viewvc/llvm-project?rev=324373&view=rev Log: Add vstore_half_rtz implementation
Passes CTS on carrizo Reviewer: Jeroen Ketema <j.ket...@xs4all.nl> Signed-off-by: Jan Vesely <jan.ves...@rutgers.edu> Modified: libclc/trunk/generic/include/clc/shared/vstore.h libclc/trunk/generic/lib/shared/vstore.cl Modified: libclc/trunk/generic/include/clc/shared/vstore.h URL: http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/include/clc/shared/vstore.h?rev=324373&r1=324372&r2=324373&view=diff ============================================================================== --- libclc/trunk/generic/include/clc/shared/vstore.h (original) +++ libclc/trunk/generic/include/clc/shared/vstore.h Tue Feb 6 10:44:43 2018 @@ -37,10 +37,12 @@ _CLC_VECTOR_VSTORE_PRIM1(ulong) _CLC_VECTOR_VSTORE_PRIM1(float) _CLC_VECTOR_VSTORE_HALF_PRIM1(float,) +_CLC_VECTOR_VSTORE_HALF_PRIM1(float, _rtz) #ifdef cl_khr_fp64 _CLC_VECTOR_VSTORE_PRIM1(double) _CLC_VECTOR_VSTORE_HALF_PRIM1(double,) + _CLC_VECTOR_VSTORE_HALF_PRIM1(double, _rtz) #endif #ifdef cl_khr_fp16 Modified: libclc/trunk/generic/lib/shared/vstore.cl URL: http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/shared/vstore.cl?rev=324373&r1=324372&r2=324373&view=diff ============================================================================== --- libclc/trunk/generic/lib/shared/vstore.cl (original) +++ libclc/trunk/generic/lib/shared/vstore.cl Tue Feb 6 10:44:43 2018 @@ -108,15 +108,48 @@ _CLC_DEF _CLC_OVERLOAD float __clc_noop( { return x; } +_CLC_DEF _CLC_OVERLOAD float __clc_rtz(float x) +{ + /* Remove lower 13 bits to make sure the number is rounded down */ + int mask = 0xffffe000; + const int exp = (as_uint(x) >> 23 & 0xff) - 127; + /* Denormals cannot be flushed, and they use different bit for rounding */ + if (exp < -14) + mask <<= min(-(exp + 14), 10); + /* RTZ does not produce Inf for large numbers */ + if (fabs(x) > 65504.0f && !isinf(x)) + return copysign(65504.0f, x); + /* Handle nan corner case */ + if (isnan(x)) + return x; + return as_float(as_uint(x) & mask); +} #ifdef cl_khr_fp64 _CLC_DEF _CLC_OVERLOAD double __clc_noop(double x) { return x; } +_CLC_DEF _CLC_OVERLOAD double __clc_rtz(double x) +{ + /* Remove lower 42 bits to make sure the number is rounded down */ + ulong mask = 0xfffffc0000000000UL; + const int exp = (as_ulong(x) >> 52 & 0x7ff) - 1023; + /* Denormals cannot be flushed, and they use different bit for rounding */ + if (exp < -14) + mask <<= min(-(exp + 14), 10); + /* RTZ does not produce Inf for large numbers */ + if (fabs(x) > 65504.0 && !isinf(x)) + return copysign(65504.0, x); + /* Handle nan corner case */ + if (isnan(x)) + return x; + return as_double(as_ulong(x) & mask); +} #endif #define __XFUNC(SUFFIX, VEC_SIZE, OFFSET, TYPE, STYPE, AS) \ - __FUNC(SUFFIX, VEC_SIZE, OFFSET, TYPE, STYPE, AS, __clc_noop) + __FUNC(SUFFIX, VEC_SIZE, OFFSET, TYPE, STYPE, AS, __clc_noop) \ + __FUNC(SUFFIX ## _rtz, VEC_SIZE, OFFSET, TYPE, STYPE, AS, __clc_rtz) #define FUNC(SUFFIX, VEC_SIZE, OFFSET, TYPE, STYPE, AS) \ __XFUNC(SUFFIX, VEC_SIZE, OFFSET, TYPE, STYPE, AS) _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits