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

Jan Vesely via Libclc-dev libclc-dev at lists.llvm.org
Wed Feb 28 11:50:17 PST 2018


v2: Use select instead of bitselect to consolidate scalar and vector
versions

Passes CTS on Carrizo

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

diff --git a/generic/lib/math/frexp.cl b/generic/lib/math/frexp.cl
index da0b0fa..cd2c717 100644
--- a/generic/lib/math/frexp.cl
+++ b/generic/lib/math/frexp.cl
@@ -1,6 +1,17 @@
 #include <clc/clc.h>
+#include <utils.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..b61cc35 100644
--- a/generic/lib/math/frexp.inc
+++ b/generic/lib/math/frexp.inc
@@ -20,91 +20,55 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
+
+#define __CLC_AS_GENTYPE __CLC_XCONCAT(as_, __CLC_GENTYPE)
+#define __CLC_AS_INTN __CLC_XCONCAT(as_, __CLC_INTN)
+
 #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;
-    // scale subnormal by 2^26 without multiplying
-    float 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;
-    i = (i & 0x80000000) | 0x3f000000 | (ai & 0x007fffff);
-    *ep = t ? 0 : e;
-    return t ? x : as_float(i);
+_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE frexp(__CLC_GENTYPE x, __CLC_ADDRESS_SPACE __CLC_INTN *ep) {
+    __CLC_INTN i = __CLC_AS_INTN(x);
+    __CLC_INTN ai = i & 0x7fffffff;
+    __CLC_INTN d = ai > 0 & ai < 0x00800000;
+    /* scale subnormal by 2^26 without multiplying */
+    __CLC_GENTYPE s = __CLC_AS_GENTYPE(ai | 0x0d800000) - 0x1.0p-100f;
+    ai = select(ai, __CLC_AS_INTN(s), d);
+    __CLC_INTN e = (ai >> 23) - 126 - select((__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 = select(e, (__CLC_INTN)0, t);
+    return select(__CLC_AS_GENTYPE(i), x, t);
 }
-#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; \
-    /* scale subnormal by 2^26 without multiplying */ \
-    float##width 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); \
-    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)
-#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) {
-    long i = as_long(x);
-    long ai = i & 0x7fffffffffffffffL;
-    int d = ai > 0 & ai < 0x0010000000000000L;
-    // scale subnormal by 2^54 without multiplying
-    double s = as_double(ai | 0x0370000000000000L) - 0x1.0p-968;
-    ai = d ? as_long(s) : ai;
-    int e = (int)(ai >> 52) - 1022 - (d ? 54 : 0);
-    int t = ai == 0 | e == 1025;
-    i = (i & 0x8000000000000000L) | 0x3fe0000000000000L | (ai & 0x000fffffffffffffL);
-    *ep = t ? 0 : e;
-    return t ? x : as_double(i);
-}
-#define __CLC_FREXP_VEC(width) \
-_CLC_OVERLOAD _CLC_DEF double##width frexp(double##width x, private int##width *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; \
-    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); \
-    i = (i & (long##width)0x8000000000000000L) | (long##width)0x3fe0000000000000L | (ai & 0x000fffffffffffffL); \
-    *ep = bitselect(e, (int##width)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)
-#undef __CLC_FREXP_VEC
-#endif
+#define __CLC_AS_LONGN as_long
+#define __CLC_LONGN long
+#define __CLC_CONVERT_INTN convert_int
+#else
+#define __CLC_AS_LONGN __CLC_XCONCAT(as_long, __CLC_VECSIZE)
+#define __CLC_LONGN __CLC_XCONCAT(long, __CLC_VECSIZE)
+#define __CLC_CONVERT_INTN __CLC_XCONCAT(convert_int, __CLC_VECSIZE)
 #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_OVERLOAD _CLC_DEF __CLC_GENTYPE frexp(__CLC_GENTYPE x, __CLC_ADDRESS_SPACE __CLC_INTN *ep) {
+    __CLC_LONGN i = __CLC_AS_LONGN(x);
+    __CLC_LONGN ai = i & 0x7fffffffffffffffL;
+    __CLC_LONGN d = ai > 0 & ai < 0x0010000000000000L;
+    // scale subnormal by 2^54 without multiplying
+    __CLC_GENTYPE s = __CLC_AS_GENTYPE(ai | 0x0370000000000000L) - 0x1.0p-968;
+    ai = select(ai, __CLC_AS_LONGN(s), d);
+    __CLC_LONGN e = (ai >> 52) - (__CLC_LONGN)1022 - select((__CLC_LONGN)0, (__CLC_LONGN)54, d);
+    __CLC_LONGN t = ai == 0 | e == 1025;
+    i = (i & (__CLC_LONGN)0x8000000000000000L) | (__CLC_LONGN)0x3fe0000000000000L | (ai & (__CLC_LONGN)0x000fffffffffffffL);
+    *ep = __CLC_CONVERT_INTN(select(e, 0L, t));
+    return select(__CLC_AS_GENTYPE(i), x, t);
 }
 
-__CLC_FREXP_DEF(local);
-__CLC_FREXP_DEF(global);
+#undef __CLC_AS_LONGN
+#undef __CLC_LONGN
+#undef __CLC_CONVERT_INTN
+#endif
 
-#undef __CLC_FREXP_DEF
+#undef __CLC_AS_GENTYPE
+#undef __CLC_AS_INTN
-- 
2.14.3



More information about the Libclc-dev mailing list