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

Reply via email to