[Libclc-dev] [PATCH] Implement generic upsample()
Tom Stellard
tom at stellard.net
Fri Jul 19 08:00:16 PDT 2013
On Thu, Jul 18, 2013 at 06:22:58PM -0500, Aaron Watry wrote:
> Reduces all vector upsamples down to its scalar components, so probably
> not the most efficient thing in the world, but it does what the
> spec says it needs to do.
>
> Another possible implementation would be to convert/cast everything as
> unsigned if necessary, upsample the input vectors, create the upsampled
> value, and then cast back to signed if required.
>
Reviewed-by: Tom Stellard <thomas.stellard at amd.com>
> Signed-off-by: Aaron Watry <awatry at gmail.com>
> ---
> generic/include/clc/clc.h | 1 +
> generic/include/clc/integer/upsample.h | 25 +++++++++++++++++++++++++
> generic/lib/SOURCES | 1 +
> generic/lib/integer/upsample.cl | 34 ++++++++++++++++++++++++++++++++++
> 4 files changed, 61 insertions(+)
> create mode 100644 generic/include/clc/integer/upsample.h
> create mode 100644 generic/lib/integer/upsample.cl
>
> diff --git a/generic/include/clc/clc.h b/generic/include/clc/clc.h
> index dfdf747..9a2f443 100644
> --- a/generic/include/clc/clc.h
> +++ b/generic/include/clc/clc.h
> @@ -68,6 +68,7 @@
> #include <clc/integer/mul24.h>
> #include <clc/integer/rotate.h>
> #include <clc/integer/sub_sat.h>
> +#include <clc/integer/upsample.h>
>
> /* 6.11.2 and 6.11.3 Shared Integer/Math Functions */
> #include <clc/shared/clamp.h>
> diff --git a/generic/include/clc/integer/upsample.h b/generic/include/clc/integer/upsample.h
> new file mode 100644
> index 0000000..127debf
> --- /dev/null
> +++ b/generic/include/clc/integer/upsample.h
> @@ -0,0 +1,25 @@
> +#define __CLC_UPSAMPLE_DECL(BGENTYPE, GENTYPE, UGENTYPE) \
> + _CLC_OVERLOAD _CLC_DECL BGENTYPE upsample(GENTYPE hi, UGENTYPE lo);
> +
> +#define __CLC_UPSAMPLE_VEC(BGENTYPE, GENTYPE, UGENTYPE) \
> + __CLC_UPSAMPLE_DECL(BGENTYPE, GENTYPE, UGENTYPE); \
> + __CLC_UPSAMPLE_DECL(BGENTYPE##2, GENTYPE##2, UGENTYPE##2); \
> + __CLC_UPSAMPLE_DECL(BGENTYPE##3, GENTYPE##3, UGENTYPE##3); \
> + __CLC_UPSAMPLE_DECL(BGENTYPE##4, GENTYPE##4, UGENTYPE##4); \
> + __CLC_UPSAMPLE_DECL(BGENTYPE##8, GENTYPE##8, UGENTYPE##8); \
> + __CLC_UPSAMPLE_DECL(BGENTYPE##16, GENTYPE##16, UGENTYPE##16); \
> +
> +#define __CLC_UPSAMPLE_TYPES() \
> + __CLC_UPSAMPLE_VEC(short, char, uchar) \
> + __CLC_UPSAMPLE_VEC(ushort, uchar, uchar) \
> + __CLC_UPSAMPLE_VEC(int, short, ushort) \
> + __CLC_UPSAMPLE_VEC(uint, ushort, ushort) \
> + __CLC_UPSAMPLE_VEC(long, int, uint) \
> + __CLC_UPSAMPLE_VEC(ulong, uint, uint) \
> +
> +__CLC_UPSAMPLE_TYPES()
> +
> +#undef __CLC_UPSAMPLE_TYPES
> +#undef __CLC_UPSAMPLE_DECL
> +#undef __CLC_UPSAMPLE_VEC
> +
> diff --git a/generic/lib/SOURCES b/generic/lib/SOURCES
> index 21a7eaa..9ac08bd 100644
> --- a/generic/lib/SOURCES
> +++ b/generic/lib/SOURCES
> @@ -17,6 +17,7 @@ integer/rotate.cl
> integer/sub_sat.cl
> integer/sub_sat_if.ll
> integer/sub_sat_impl.ll
> +integer/upsample.cl
> math/fmax.cl
> math/fmin.cl
> math/hypot.cl
> diff --git a/generic/lib/integer/upsample.cl b/generic/lib/integer/upsample.cl
> new file mode 100644
> index 0000000..7301cc3
> --- /dev/null
> +++ b/generic/lib/integer/upsample.cl
> @@ -0,0 +1,34 @@
> +#include <clc/clc.h>
> +
> +#define __CLC_UPSAMPLE_IMPL(BGENTYPE, GENTYPE, UGENTYPE, GENSIZE) \
> + _CLC_OVERLOAD _CLC_DECL BGENTYPE upsample(GENTYPE hi, UGENTYPE lo){ \
> + return ((BGENTYPE)hi << GENSIZE) | lo; \
> + } \
> + _CLC_OVERLOAD _CLC_DECL BGENTYPE##2 upsample(GENTYPE##2 hi, UGENTYPE##2 lo){ \
> + return (BGENTYPE##2){upsample(hi.s0, lo.s0), upsample(hi.s1, lo.s1)}; \
> + } \
> + _CLC_OVERLOAD _CLC_DECL BGENTYPE##3 upsample(GENTYPE##3 hi, UGENTYPE##3 lo){ \
> + return (BGENTYPE##3){upsample(hi.s0, lo.s0), upsample(hi.s1, lo.s1), upsample(hi.s2, lo.s2)}; \
> + } \
> + _CLC_OVERLOAD _CLC_DECL BGENTYPE##4 upsample(GENTYPE##4 hi, UGENTYPE##4 lo){ \
> + return (BGENTYPE##4){upsample(hi.lo, lo.lo), upsample(hi.hi, lo.hi)}; \
> + } \
> + _CLC_OVERLOAD _CLC_DECL BGENTYPE##8 upsample(GENTYPE##8 hi, UGENTYPE##8 lo){ \
> + return (BGENTYPE##8){upsample(hi.lo, lo.lo), upsample(hi.hi, lo.hi)}; \
> + } \
> + _CLC_OVERLOAD _CLC_DECL BGENTYPE##16 upsample(GENTYPE##16 hi, UGENTYPE##16 lo){ \
> + return (BGENTYPE##16){upsample(hi.lo, lo.lo), upsample(hi.hi, lo.hi)}; \
> + } \
> +
> +#define __CLC_UPSAMPLE_TYPES() \
> + __CLC_UPSAMPLE_IMPL(short, char, uchar, 8) \
> + __CLC_UPSAMPLE_IMPL(ushort, uchar, uchar, 8) \
> + __CLC_UPSAMPLE_IMPL(int, short, ushort, 16) \
> + __CLC_UPSAMPLE_IMPL(uint, ushort, ushort, 16) \
> + __CLC_UPSAMPLE_IMPL(long, int, uint, 32) \
> + __CLC_UPSAMPLE_IMPL(ulong, uint, uint, 32) \
> +
> +__CLC_UPSAMPLE_TYPES()
> +
> +#undef __CLC_UPSAMPLE_TYPES
> +#undef __CLC_UPSAMPLE_IMPL
> --
> 1.8.1.2
>
>
> _______________________________________________
> 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