[Libclc-dev] [PATCH 1/3] Add all(igentype) builtin
Tom Stellard
tom at stellard.net
Mon Jun 16 09:05:21 PDT 2014
On Mon, Jun 16, 2014 at 10:02:45AM -0500, Aaron Watry wrote:
> On Thu, Jun 12, 2014 at 4:18 PM, Tom Stellard <tom at stellard.net> wrote:
> > On Wed, Jun 11, 2014 at 04:59:57PM -0500, Aaron Watry wrote:
> >> Signed-off-by: Aaron Watry <awatry at gmail.com>
> >> ---
> >> generic/include/clc/clc.h | 1 +
> >> generic/include/clc/relational/all.h | 16 ++++++++++++++++
> >> generic/lib/SOURCES | 1 +
> >> generic/lib/relational/all.cl | 30 ++++++++++++++++++++++++++++++
> >> 4 files changed, 48 insertions(+)
> >> create mode 100644 generic/include/clc/relational/all.h
> >> create mode 100644 generic/lib/relational/all.cl
> >>
> >> diff --git a/generic/include/clc/clc.h b/generic/include/clc/clc.h
> >> index 4aa9caa..0a1503a 100644
> >> --- a/generic/include/clc/clc.h
> >> +++ b/generic/include/clc/clc.h
> >> @@ -102,6 +102,7 @@
> >> #include <clc/geometric/normalize.h>
> >>
> >> /* 6.11.6 Relational Functions */
> >> +#include <clc/relational/all.h>
> >> #include <clc/relational/any.h>
> >> #include <clc/relational/bitselect.h>
> >> #include <clc/relational/isgreater.h>
> >> diff --git a/generic/include/clc/relational/all.h b/generic/include/clc/relational/all.h
> >> new file mode 100644
> >> index 0000000..f917419
> >> --- /dev/null
> >> +++ b/generic/include/clc/relational/all.h
> >> @@ -0,0 +1,16 @@
> >> +
> >> +#define _CLC_ALL_DECL(TYPE) \
> >> + _CLC_OVERLOAD _CLC_DECL int all(TYPE v);
> >> +
> >> +#define _CLC_VECTOR_ALL_DECL(TYPE) \
> >> + _CLC_ALL_DECL(TYPE) \
> >> + _CLC_ALL_DECL(TYPE##2) \
> >> + _CLC_ALL_DECL(TYPE##3) \
> >> + _CLC_ALL_DECL(TYPE##4) \
> >> + _CLC_ALL_DECL(TYPE##8) \
> >> + _CLC_ALL_DECL(TYPE##16)
> >> +
> >> +_CLC_VECTOR_ALL_DECL(char)
> >> +_CLC_VECTOR_ALL_DECL(short)
> >> +_CLC_VECTOR_ALL_DECL(int)
> >> +_CLC_VECTOR_ALL_DECL(long)
> >> diff --git a/generic/lib/SOURCES b/generic/lib/SOURCES
> >> index 45f7c4a..6a8e34d 100644
> >> --- a/generic/lib/SOURCES
> >> +++ b/generic/lib/SOURCES
> >> @@ -34,6 +34,7 @@ math/mad.cl
> >> math/clc_nextafter.cl
> >> math/nextafter.cl
> >> math/sincos.cl
> >> +relational/all.cl
> >> relational/any.cl
> >> relational/isgreater.cl
> >> relational/isgreaterequal.cl
> >> diff --git a/generic/lib/relational/all.cl b/generic/lib/relational/all.cl
> >> new file mode 100644
> >> index 0000000..6fcc318
> >> --- /dev/null
> >> +++ b/generic/lib/relational/all.cl
> >> @@ -0,0 +1,30 @@
> >> +#include <clc/clc.h>
> >> +
> >> +#define _CLC_ALL(v) (((v) >> ((sizeof(v) * 8) - 1)) & 0x1)
> >> +#define _CLC_ALL2(v) (_CLC_ALL((v).s0) & _CLC_ALL((v).s1))
> >> +#define _CLC_ALL3(v) (_CLC_ALL2((v)) & _CLC_ALL((v).s2))
> >> +#define _CLC_ALL4(v) (_CLC_ALL3((v)) & _CLC_ALL((v).s3))
> >> +#define _CLC_ALL8(v) (_CLC_ALL4((v)) & _CLC_ALL((v).s4) & _CLC_ALL((v).s5) \
> >> + & _CLC_ALL((v).s6) & _CLC_ALL((v).s7))
> >> +#define _CLC_ALL16(v) (_CLC_ALL8((v)) & _CLC_ALL((v).s8) & _CLC_ALL((v).s9) \
> >> + & _CLC_ALL((v).sA) & _CLC_ALL((v).sB) \
> >> + & _CLC_ALL((v).sC) & _CLC_ALL((v).sD) \
> >> + & _CLC_ALL((v).sE) & _CLC_ALL((v).sf))
> >> +
> >> +
> >> +#define ALL_ID(TYPE) \
> >> + _CLC_OVERLOAD _CLC_DEF int all(TYPE v)
> >> +
> >> +#define ALL_VECTORIZE(TYPE) \
> >> + ALL_ID(TYPE) { return _CLC_ALL(v); } \
> >> + ALL_ID(TYPE##2) { return _CLC_ALL2(v); } \
> >> + ALL_ID(TYPE##3) { return _CLC_ALL3(v); } \
> >> + ALL_ID(TYPE##4) { return _CLC_ALL4(v); } \
> >> + ALL_ID(TYPE##8) { return _CLC_ALL8(v); } \
> >> + ALL_ID(TYPE##16) { return _CLC_ALL16(v); }
> >> +
> >
> > Have you looked at the macros in generic/include/clc/clcmacro.h? Do you
> > think you would be able to use some of those here.
> >
> > -Tom
>
> Sadly, the existing macros won't work. The macros in clmacro.h break
> all vector operations down to scalar, which then changes the return
> value of TRUE for the relational functions from -1 to 1. I tried
> using these macros at first, and kept getting invalid return values
> from the relational functions because of the nature of scalar/vector
> true.
>
> I could, however, change the macros in clmacro.h to only reduce down
> to vec2 operations, and then change the *_vectorize() macros to invoke
> both the operation which reduces vec2 to scalar and also invoke the
> expansion of vec3/4/8/16 to vec2 (although the vec3 expansion could be
> awkward as we usually treat that as a vec2 + scalar operation).
>
The patch is fine as is, I was just hoping there was an opportunity to share code
LGTM.
> --Aaron
>
> >
> >> +ALL_VECTORIZE(char)
> >> +ALL_VECTORIZE(short)
> >> +ALL_VECTORIZE(int)
> >> +ALL_VECTORIZE(long)
> >> +
> >> --
> >> 1.9.1
> >>
> >>
> >> _______________________________________________
> >> Libclc-dev mailing list
> >> Libclc-dev at pcc.me.uk
> >> http://www.pcc.me.uk/cgi-bin/mailman/listinfo/libclc-dev
More information about the Libclc-dev
mailing list