[Libclc-dev] [PATCH 2/2] frexp: Reuse types provided by gentype.inc

Jan Vesely via Libclc-dev libclc-dev at lists.llvm.org
Mon Feb 19 15:40:44 PST 2018


Signed-off-by: Jan Vesely <jan.vesely at rutgers.edu>
---
 generic/lib/math/frexp.cl  | 12 +++++++-
 generic/lib/math/frexp.inc | 75 +++++++++++++++++++---------------------------
 2 files changed, 41 insertions(+), 46 deletions(-)

diff --git a/generic/lib/math/frexp.cl b/generic/lib/math/frexp.cl
index da0b0fa..b331ff8 100644
--- a/generic/lib/math/frexp.cl
+++ b/generic/lib/math/frexp.cl
@@ -1,6 +1,16 @@
 #include <clc/clc.h>
 
-#include "math.h"
+#define __CLC_BODY <frexp.inc>
+#define __CLC_ADDRESS_SPACE private
+#include <clc/math/gentype.inc>
+#undef __CLC_ADDRESS_SPACE
+
+#define __CLC_BODY <frexp.inc>
+#define __CLC_ADDRESS_SPACE global
+#include <clc/math/gentype.inc>
+#undef __CLC_ADDRESS_SPACE
 
 #define __CLC_BODY <frexp.inc>
+#define __CLC_ADDRESS_SPACE local
 #include <clc/math/gentype.inc>
+#undef __CLC_ADDRESS_SPACE
diff --git a/generic/lib/math/frexp.inc b/generic/lib/math/frexp.inc
index 0f5ddea..cf3841c 100644
--- a/generic/lib/math/frexp.inc
+++ b/generic/lib/math/frexp.inc
@@ -22,45 +22,44 @@
  */
 #if __CLC_FPSIZE == 32
 #ifdef __CLC_SCALAR
-_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE frexp(float x, private int *ep) {
-    int i = as_int(x);
-    int ai = i & 0x7fffffff;
-    int d = ai > 0 & ai < 0x00800000;
+_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE frexp(float x, __CLC_ADDRESS_SPACE __CLC_INTN *ep) {
+    __CLC_INTN i = as_int(x);
+    __CLC_INTN ai = i & 0x7fffffff;
+    __CLC_INTN d = ai > 0 & ai < 0x00800000;
     // scale subnormal by 2^26 without multiplying
-    float s = as_float(ai | 0x0d800000) - 0x1.0p-100F;
+    __CLC_GENTYPE s = as_float(ai | 0x0d800000) - 0x1.0p-100F;
     ai = d ? as_int(s) : ai;
-    int e = (ai >> 23) - 126 - (d ? 26 : 0);
-    int t = ai == 0 | e == 129;
+    __CLC_INTN e = (ai >> 23) - 126 - (d ? 26 : 0);
+    __CLC_INTN t = ai == 0 | e == 129;
     i = (i & 0x80000000) | 0x3f000000 | (ai & 0x007fffff);
     *ep = t ? 0 : e;
     return t ? x : as_float(i);
 }
+#else
 #define __CLC_FREXP_VEC(width) \
-_CLC_OVERLOAD _CLC_DEF float##width frexp(float##width x, private int##width *ep) { \
-    int##width i = as_int##width(x); \
-    int##width ai = i & 0x7fffffff; \
-    int##width d = ai > 0 & ai < 0x00800000; \
+_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE frexp(__CLC_GENTYPE x, __CLC_ADDRESS_SPACE __CLC_INTN *ep) { \
+    __CLC_INTN i = as_int##width(x); \
+    __CLC_INTN ai = i & 0x7fffffff; \
+    __CLC_INTN d = ai > 0 & ai < 0x00800000; \
     /* scale subnormal by 2^26 without multiplying */ \
-    float##width s = as_float##width(ai | 0x0d800000) - 0x1.0p-100F; \
+    __CLC_GENTYPE s = as_float##width(ai | 0x0d800000) - 0x1.0p-100F; \
     ai = bitselect(ai, as_int##width(s), d); \
-    int##width e = (ai >> 23) - 126 - bitselect((int##width)0, (int##width)26, d); \
-    int##width t = ai == (int##width)0 | e == (int##width)129; \
-    i = (i & (int##width)0x80000000) | (int##width)0x3f000000 | (ai & 0x007fffff); \
-    *ep = bitselect(e, (int##width)0, t); \
+    __CLC_INTN e = (ai >> 23) - 126 - bitselect((__CLC_INTN)0, (__CLC_INTN)26, d); \
+    __CLC_INTN t = ai == (__CLC_INTN)0 | e == (__CLC_INTN)129; \
+    i = (i & (__CLC_INTN)0x80000000) | (__CLC_INTN)0x3f000000 | (ai & 0x007fffff); \
+    *ep = bitselect(e, (__CLC_INTN)0, t); \
     return bitselect(as_float##width(i), x, as_float##width(t)); \
 }
-__CLC_FREXP_VEC(2)
-__CLC_FREXP_VEC(3)
-__CLC_FREXP_VEC(4)
-__CLC_FREXP_VEC(8)
-__CLC_FREXP_VEC(16)
+#define __CLC_FREXP_VEC2(x) __CLC_FREXP_VEC(x)
+__CLC_FREXP_VEC2(__CLC_VECSIZE)
+#undef __CLC_FREXP_VEC2
 #undef __CLC_FREXP_VEC
 #endif
 #endif
 
 #if __CLC_FPSIZE == 64
 #ifdef __CLC_SCALAR
-_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE frexp(__CLC_GENTYPE x, private __CLC_INTN *ep) {
+_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE frexp(__CLC_GENTYPE x, __CLC_ADDRESS_SPACE __CLC_INTN *ep) {
     long i = as_long(x);
     long ai = i & 0x7fffffffffffffffL;
     int d = ai > 0 & ai < 0x0010000000000000L;
@@ -73,38 +72,24 @@ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE frexp(__CLC_GENTYPE x, private __CLC_INTN *
     *ep = t ? 0 : e;
     return t ? x : as_double(i);
 }
+#else
 #define __CLC_FREXP_VEC(width) \
-_CLC_OVERLOAD _CLC_DEF double##width frexp(double##width x, private int##width *ep) { \
+_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE frexp(__CLC_GENTYPE x, __CLC_ADDRESS_SPACE __CLC_INTN *ep) { \
     long##width i = as_long##width(x); \
     long##width ai = i & 0x7fffffffffffffffL; \
     long##width d = ai > 0 & ai < 0x0010000000000000L; \
     /* scale subnormal by 2^54 without multiplying */ \
-    double##width s = as_double##width(ai | 0x0370000000000000L) - 0x1.0p-968; \
+    __CLC_GENTYPE s = as_double##width(ai | 0x0370000000000000L) - 0x1.0p-968; \
     ai = bitselect(ai, as_long##width(s), d); \
-    int##width e = convert_int##width(ai >> 52) - 1022 - bitselect((int##width)0, (int##width)54, convert_int##width(d)); \
-    int##width t = convert_int##width(ai == (long##width)0) | (e == (int##width)129); \
+    __CLC_INTN e = convert_int##width(ai >> 52) - 1022 - bitselect((__CLC_INTN)0, (__CLC_INTN)54, convert_int##width(d)); \
+    __CLC_INTN t = convert_int##width(ai == (long##width)0) | (e == (__CLC_INTN)129); \
     i = (i & (long##width)0x8000000000000000L) | (long##width)0x3fe0000000000000L | (ai & 0x000fffffffffffffL); \
-    *ep = bitselect(e, (int##width)0, t); \
+    *ep = bitselect(e, (__CLC_INTN)0, t); \
     return bitselect(as_double##width(i), x, as_double##width(convert_long##width(t))); \
 }
-__CLC_FREXP_VEC(2)
-__CLC_FREXP_VEC(3)
-__CLC_FREXP_VEC(4)
-__CLC_FREXP_VEC(8)
-__CLC_FREXP_VEC(16)
+#define __CLC_FREXP_VEC2(x) __CLC_FREXP_VEC(x)
+__CLC_FREXP_VEC2(__CLC_VECSIZE)
+#undef __CLC_FREXP_VEC2
 #undef __CLC_FREXP_VEC
 #endif
 #endif
-
-#define __CLC_FREXP_DEF(addrspace) \
-  _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE frexp(__CLC_GENTYPE x, addrspace __CLC_INTN *iptr) { \
-    __CLC_INTN private_iptr; \
-    __CLC_GENTYPE ret = frexp(x, &private_iptr); \
-    *iptr = private_iptr; \
-    return ret; \
-}
-
-__CLC_FREXP_DEF(local);
-__CLC_FREXP_DEF(global);
-
-#undef __CLC_FREXP_DEF
-- 
2.14.3



More information about the Libclc-dev mailing list