[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