[libclc] r185004 - libclc: Implement clz() builtin

Tom Stellard thomas.stellard at amd.com
Wed Jun 26 11:21:56 PDT 2013


Author: tstellar
Date: Wed Jun 26 13:21:55 2013
New Revision: 185004

URL: http://llvm.org/viewvc/llvm-project?rev=185004&view=rev
Log:
libclc: Implement clz() builtin

Squashed commit of the following:

commit a0df0a0e86c55c1bdc0b9c0f5a739e5adef4b056
Author: Aaron Watry <awatry at gmail.com>
Date:   Mon Apr 15 18:42:04 2013 -0500

    libclc: Rename clz.ll to clz_if.ll to ensure it gets built.

    configure.py treats files that have the same name with the .cl and .ll
    extensions as overriding eachother.

    E.g. If you have clz.cl and clz.ll both specified to be built in the same
    SOURCES file, only the first file listed will actually be built.

    Since the contents of clz.ll were an interface that is implemented in
    clz_impl.ll, rename clz.ll to clz_if.ll to make sure that the interface is
    built.

commit 931b62bed05c58f737de625bd415af09571a6a5a
Author: Aaron Watry <awatry at gmail.com>
Date:   Sat Apr 13 12:32:54 2013 -0500

    libclc: llvm assembly implementation of clz

    Untested... currently crashes in the same manner as add_sat.

commit 6ef0b7b0b6d2e5584086b4b9a9243743b2e0538f
Author: Aaron Watry <awatry at gmail.com>
Date:   Sat Mar 23 12:35:27 2013 -0500

    libclc: Add stub clz builtin

    For scalar int/uint, attempt to use the clz llvm builtin.. for all others
    return 0 until an actual implementation is finished.

Patch by: Aaron Watry

Added:
    libclc/trunk/generic/include/clc/integer/clz.h
    libclc/trunk/generic/include/clc/integer/clz.inc
    libclc/trunk/generic/lib/integer/clz.cl
    libclc/trunk/generic/lib/integer/clz_if.ll
    libclc/trunk/generic/lib/integer/clz_impl.ll
Modified:
    libclc/trunk/generic/include/clc/clc.h
    libclc/trunk/generic/lib/SOURCES

Modified: libclc/trunk/generic/include/clc/clc.h
URL: http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/include/clc/clc.h?rev=185004&r1=185003&r2=185004&view=diff
==============================================================================
--- libclc/trunk/generic/include/clc/clc.h (original)
+++ libclc/trunk/generic/include/clc/clc.h Wed Jun 26 13:21:55 2013
@@ -63,6 +63,7 @@
 #include <clc/integer/abs.h>
 #include <clc/integer/abs_diff.h>
 #include <clc/integer/add_sat.h>
+#include <clc/integer/clz.h>
 #include <clc/integer/rotate.h>
 #include <clc/integer/sub_sat.h>
 

Added: libclc/trunk/generic/include/clc/integer/clz.h
URL: http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/include/clc/integer/clz.h?rev=185004&view=auto
==============================================================================
--- libclc/trunk/generic/include/clc/integer/clz.h (added)
+++ libclc/trunk/generic/include/clc/integer/clz.h Wed Jun 26 13:21:55 2013
@@ -0,0 +1,2 @@
+#define BODY <clc/integer/clz.inc>
+#include <clc/integer/gentype.inc>

Added: libclc/trunk/generic/include/clc/integer/clz.inc
URL: http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/include/clc/integer/clz.inc?rev=185004&view=auto
==============================================================================
--- libclc/trunk/generic/include/clc/integer/clz.inc (added)
+++ libclc/trunk/generic/include/clc/integer/clz.inc Wed Jun 26 13:21:55 2013
@@ -0,0 +1 @@
+_CLC_OVERLOAD _CLC_DECL GENTYPE clz(GENTYPE x);

Modified: libclc/trunk/generic/lib/SOURCES
URL: http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/SOURCES?rev=185004&r1=185003&r2=185004&view=diff
==============================================================================
--- libclc/trunk/generic/lib/SOURCES (original)
+++ libclc/trunk/generic/lib/SOURCES Wed Jun 26 13:21:55 2013
@@ -8,6 +8,9 @@ integer/abs_diff.cl
 integer/add_sat.cl
 integer/add_sat_if.ll
 integer/add_sat_impl.ll
+integer/clz.cl
+integer/clz_if.ll
+integer/clz_impl.ll
 integer/rotate.cl
 integer/sub_sat.cl
 integer/sub_sat_if.ll

Added: libclc/trunk/generic/lib/integer/clz.cl
URL: http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/integer/clz.cl?rev=185004&view=auto
==============================================================================
--- libclc/trunk/generic/lib/integer/clz.cl (added)
+++ libclc/trunk/generic/lib/integer/clz.cl Wed Jun 26 13:21:55 2013
@@ -0,0 +1,52 @@
+#include <clc/clc.h>
+
+// From clz.ll
+_CLC_DECL char   __clc_clz_s8(char);
+_CLC_DECL uchar  __clc_clz_u8(uchar);
+_CLC_DECL short  __clc_clz_s16(short);
+_CLC_DECL ushort __clc_clz_u16(ushort);
+_CLC_DECL int    __clc_clz_s32(int);
+_CLC_DECL uint   __clc_clz_u32(uint);
+_CLC_DECL long   __clc_clz_s64(long);
+_CLC_DECL ulong  __clc_clz_u64(ulong);
+
+_CLC_OVERLOAD _CLC_DEF char clz(char x) {
+  return __clc_clz_s8(x);
+}
+
+_CLC_OVERLOAD _CLC_DEF uchar clz(uchar x) {
+  return __clc_clz_u8(x);
+}
+
+_CLC_OVERLOAD _CLC_DEF short clz(short x) {
+  return __clc_clz_s16(x);
+}
+
+_CLC_OVERLOAD _CLC_DEF ushort clz(ushort x) {
+  return __clc_clz_u16(x);
+}
+
+_CLC_OVERLOAD _CLC_DEF int clz(int x) {
+  return __clc_clz_s32(x);
+}
+
+_CLC_OVERLOAD _CLC_DEF uint clz(uint x) {
+  return __clc_clz_u32(x);
+}
+
+_CLC_OVERLOAD _CLC_DEF long clz(long x) {
+  return __clc_clz_s64(x);
+}
+
+_CLC_OVERLOAD _CLC_DEF ulong clz(ulong x) {
+  return __clc_clz_u64(x);
+}
+
+_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, char, clz, char)
+_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, uchar, clz, uchar)
+_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, short, clz, short)
+_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, ushort, clz, ushort)
+_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, int, clz, int)
+_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, uint, clz, uint)
+_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, long, clz, long)
+_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, ulong, clz, ulong)

Added: libclc/trunk/generic/lib/integer/clz_if.ll
URL: http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/integer/clz_if.ll?rev=185004&view=auto
==============================================================================
--- libclc/trunk/generic/lib/integer/clz_if.ll (added)
+++ libclc/trunk/generic/lib/integer/clz_if.ll Wed Jun 26 13:21:55 2013
@@ -0,0 +1,55 @@
+declare i8 @__clc_clz_impl_s8(i8 %x)
+
+define i8 @__clc_clz_s8(i8 %x) nounwind readnone alwaysinline {
+  %call = call i8 @__clc_clz_impl_s8(i8 %x)
+  ret i8 %call
+}
+
+declare i8 @__clc_clz_impl_u8(i8 %x)
+
+define i8 @__clc_clz_u8(i8 %x) nounwind readnone alwaysinline {
+  %call = call i8 @__clc_clz_impl_u8(i8 %x)
+  ret i8 %call
+}
+
+declare i16 @__clc_clz_impl_s16(i16 %x)
+
+define i16 @__clc_clz_s16(i16 %x) nounwind readnone alwaysinline {
+  %call = call i16 @__clc_clz_impl_s16(i16 %x)
+  ret i16 %call
+}
+
+declare i16 @__clc_clz_impl_u16(i16 %x)
+
+define i16 @__clc_clz_u16(i16 %x) nounwind readnone alwaysinline {
+  %call = call i16 @__clc_clz_impl_u16(i16 %x)
+  ret i16 %call
+}
+
+declare i32 @__clc_clz_impl_s32(i32 %x)
+
+define i32 @__clc_clz_s32(i32 %x) nounwind readnone alwaysinline {
+  %call = call i32 @__clc_clz_impl_s32(i32 %x)
+  ret i32 %call
+}
+
+declare i32 @__clc_clz_impl_u32(i32 %x)
+
+define i32 @__clc_clz_u32(i32 %x) nounwind readnone alwaysinline {
+  %call = call i32 @__clc_clz_impl_u32(i32 %x)
+  ret i32 %call
+}
+
+declare i64 @__clc_clz_impl_s64(i64 %x)
+
+define i64 @__clc_clz_s64(i64 %x) nounwind readnone alwaysinline {
+  %call = call i64 @__clc_clz_impl_s64(i64 %x)
+  ret i64 %call
+}
+
+declare i64 @__clc_clz_impl_u64(i64 %x)
+
+define i64 @__clc_clz_u64(i64 %x) nounwind readnone alwaysinline {
+  %call = call i64 @__clc_clz_impl_u64(i64 %x)
+  ret i64 %call
+}

Added: libclc/trunk/generic/lib/integer/clz_impl.ll
URL: http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/integer/clz_impl.ll?rev=185004&view=auto
==============================================================================
--- libclc/trunk/generic/lib/integer/clz_impl.ll (added)
+++ libclc/trunk/generic/lib/integer/clz_impl.ll Wed Jun 26 13:21:55 2013
@@ -0,0 +1,44 @@
+declare i8 @llvm.ctlz.i8(i8, i1)
+declare i16 @llvm.ctlz.i16(i16, i1)
+declare i32 @llvm.ctlz.i32(i32, i1)
+declare i64 @llvm.ctlz.i64(i64, i1)
+
+define i8 @__clc_clz_impl_s8(i8 %x) nounwind readnone alwaysinline {
+  %call = call i8 @llvm.ctlz.i8(i8 %x, i1 0)
+  ret i8 %call
+}
+
+define i8 @__clc_clz_impl_u8(i8 %x) nounwind readnone alwaysinline {
+  %call = call i8 @llvm.ctlz.i8(i8 %x, i1 0)
+  ret i8 %call
+}
+
+define i16 @__clc_clz_impl_s16(i16 %x) nounwind readnone alwaysinline {
+  %call = call i16 @llvm.ctlz.i16(i16 %x, i1 0)
+  ret i16 %call
+}
+
+define i16 @__clc_clz_impl_u16(i16 %x) nounwind readnone alwaysinline {
+  %call = call i16 @llvm.ctlz.i16(i16 %x, i1 0)
+  ret i16 %call
+}
+
+define i32 @__clc_clz_impl_s32(i32 %x) nounwind readnone alwaysinline {
+  %call = call i32 @llvm.ctlz.i32(i32 %x, i1 0)
+  ret i32 %call
+}
+
+define i32 @__clc_clz_impl_u32(i32 %x) nounwind readnone alwaysinline {
+  %call = call i32 @llvm.ctlz.i32(i32 %x, i1 0)
+  ret i32 %call
+}
+
+define i64 @__clc_clz_impl_s64(i64 %x) nounwind readnone alwaysinline {
+  %call = call i64 @llvm.ctlz.i64(i64 %x, i1 0)
+  ret i64 %call
+}
+
+define i64 @__clc_clz_impl_u64(i64 %x) nounwind readnone alwaysinline {
+  %call = call i64 @llvm.ctlz.i64(i64 %x, i1 0)
+  ret i64 %call
+}





More information about the cfe-commits mailing list