<div dir="ltr">Would be nice. I tried to stick to the original API and we don't have dvbcsa_lib_init() function there, And quite a lot projects  uses this API. Hmm, checking on every decrypt/encrypt... Wouldn't it be costly? But it's certainly good for binary packages and should be implemented. My plan was first make it run fast, then make it more convenient. Now we at the first stage.<br></div><div class="gmail_extra"><br><div class="gmail_quote">2015-07-06 19:13 GMT+03:00 Jean-Baptiste Kempf <span dir="ltr"><<a href="mailto:jb@videolan.org" target="_blank">jb@videolan.org</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Can't we have NEON runtime detection, btw?<br>
<span class=""><br>
On 26 Jun, glenvt18 wrote :<br>
</span><div><div class="h5">> ---<br>
>  <a href="http://configure.ac" rel="noreferrer" target="_blank">configure.ac</a>         |  6 ++++++<br>
>  src/Makefile.am      |  2 +-<br>
>  src/dvbcsa_bs.h      |  3 +++<br>
>  src/dvbcsa_bs_neon.h | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++<br>
>  test/testbsops.c     | 29 +++++++++++++++++++++++++++<br>
>  5 files changed, 95 insertions(+), 1 deletion(-)<br>
>  create mode 100644 src/dvbcsa_bs_neon.h<br>
><br>
> diff --git a/<a href="http://configure.ac" rel="noreferrer" target="_blank">configure.ac</a> b/<a href="http://configure.ac" rel="noreferrer" target="_blank">configure.ac</a><br>
> index ed8a1ad..cefdf8a 100644<br>
> --- a/<a href="http://configure.ac" rel="noreferrer" target="_blank">configure.ac</a><br>
> +++ b/<a href="http://configure.ac" rel="noreferrer" target="_blank">configure.ac</a><br>
> @@ -14,6 +14,7 @@ AC_ARG_ENABLE(uint64, AC_HELP_STRING(--enable-uint64, [Use native 64 bits intege<br>
>  AC_ARG_ENABLE(mmx, AC_HELP_STRING(--enable-mmx, [Use MMX for bitslice]), mmx_debug=$enableval, enable_mmx=no)<br>
>  AC_ARG_ENABLE(sse2, AC_HELP_STRING(--enable-sse2, [Use SSE2 for bitslice]), sse2_debug=$enableval, enable_sse2=no)<br>
>  AC_ARG_ENABLE(altivec, AC_HELP_STRING(--enable-altivec, [Use AltiVec for bitslice]), altivec_debug=$enableval, enable_altivec=no)<br>
> +AC_ARG_ENABLE(neon, AC_HELP_STRING(--enable-neon, [Use NEON for bitslice]), neon_debug=$enableval, enable_neon=no)<br>
><br>
>  AM_INIT_AUTOMAKE(libdvbcsa, 1.1.0)<br>
>  AC_CONFIG_HEADERS(config.h)<br>
> @@ -46,6 +47,11 @@ elif test "$enable_altivec" = "yes" ; then<br>
>       AC_DEFINE(DVBCSA_USE_ALTIVEC, 1, Using AltiVec bitslice.)<br>
>       GCC_CFLAGS="$GCC_CFLAGS -maltivec -mabi=altivec"<br>
><br>
> +elif test "$enable_neon" = "yes" ; then<br>
> +     transpose_128=yes<br>
> +     AC_DEFINE(DVBCSA_USE_NEON, 1, Using NEON bitslice.)<br>
> +     GCC_CFLAGS="$GCC_CFLAGS -mfpu=neon"<br>
> +<br>
>  elif test "$enable_uint32" = "yes" ; then<br>
>       transpose_32=yes<br>
>       AC_DEFINE(DVBCSA_USE_UINT32, 1, Using 32 bits integer bitslice.)<br>
> diff --git a/src/Makefile.am b/src/Makefile.am<br>
> index dec4f55..3bad07a 100644<br>
> --- a/src/Makefile.am<br>
> +++ b/src/Makefile.am<br>
> @@ -7,7 +7,7 @@ libdvbcsa_la_SOURCES = dvbcsa_algo.c dvbcsa_block.c dvbcsa_bs_algo.c  \<br>
>       dvbcsa_bs_block.c dvbcsa_bs_key.c dvbcsa_bs_stream.c            \<br>
>       dvbcsa_stream.c dvbcsa_bs.h dvbcsa_pv.h dvbcsa_bs_uint64.h      \<br>
>       dvbcsa_bs_uint32.h dvbcsa_bs_mmx.h dvbcsa_bs_sse.h              \<br>
> -     dvbcsa_bs_altivec.h dvbcsa_bs_transpose.c dvbcsa_key.c  \<br>
> +     dvbcsa_bs_altivec.h dvbcsa_bs_neon.h dvbcsa_bs_transpose.c dvbcsa_key.c \<br>
>       dvbcsa_bs_stream_kernel.inc dvbcsa_bs_stream_kernel.h<br>
><br>
>  if TRANSPOSE_128<br>
> diff --git a/src/dvbcsa_bs.h b/src/dvbcsa_bs.h<br>
> index 75cabc9..7145048 100644<br>
> --- a/src/dvbcsa_bs.h<br>
> +++ b/src/dvbcsa_bs.h<br>
> @@ -43,6 +43,9 @@<br>
>  #elif defined(DVBCSA_USE_ALTIVEC)<br>
>  # include "dvbcsa_bs_altivec.h"<br>
><br>
> +#elif defined(DVBCSA_USE_NEON)<br>
> +# include "dvbcsa_bs_neon.h"<br>
> +<br>
>  #else<br>
>  # error No dvbcsa word size defined<br>
>  #endif<br>
> diff --git a/src/dvbcsa_bs_neon.h b/src/dvbcsa_bs_neon.h<br>
> new file mode 100644<br>
> index 0000000..7bf0156<br>
> --- /dev/null<br>
> +++ b/src/dvbcsa_bs_neon.h<br>
> @@ -0,0 +1,56 @@<br>
> +/*<br>
> +<br>
> +    This file is part of libdvbcsa.<br>
> +<br>
> +    libdvbcsa is free software; you can redistribute it and/or modify<br>
> +    it under the terms of the GNU General Public License as published<br>
> +    by the Free Software Foundation; either version 2 of the License,<br>
> +    or (at your option) any later version.<br>
> +<br>
> +    libdvbcsa is distributed in the hope that it will be useful, but<br>
> +    WITHOUT ANY WARRANTY; without even the implied warranty of<br>
> +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU<br>
> +    General Public License for more details.<br>
> +<br>
> +    You should have received a copy of the GNU General Public License<br>
> +    along with libdvbcsa; if not, write to the Free Software<br>
> +    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA<br>
> +    02111-1307 USA<br>
> +<br>
> +    Based on FFdecsa, Copyright (C) 2003-2004  fatih89r<br>
> +<br>
> +    (c) 2006-2008 Alexandre Becoulet <<a href="mailto:alexandre.becoulet@free.fr">alexandre.becoulet@free.fr</a>><br>
> +<br>
> +*/<br>
> +<br>
> +#ifndef DVBCSA_NEON_H_<br>
> +#define DVBCSA_NEON_H_<br>
> +<br>
> +# include <arm_neon.h><br>
> +<br>
> +typedef uint64x2_t dvbcsa_bs_word_t;<br>
> +<br>
> +#define BS_BATCH_SIZE 128<br>
> +#define BS_BATCH_BYTES 16<br>
> +<br>
> +#define BS_VAL(n, m)    vcombine_u64((uint64_t)(m), (uint64_t)(n))<br>
> +#define BS_VAL64(n)     vdupq_n_u64(0x##n##ULL)<br>
> +#define BS_VAL32(n)     vreinterpretq_u64_u32(vdupq_n_u32(0x##n))<br>
> +#define BS_VAL16(n)     vreinterpretq_u64_u16(vdupq_n_u16(0x##n))<br>
> +#define BS_VAL8(n)      vreinterpretq_u64_u8(vdupq_n_u8(0x##n))<br>
> +<br>
> +#define BS_AND(a, b)    vandq_u64 ((a), (b))<br>
> +#define BS_OR(a, b)     vorrq_u64 ((a), (b))<br>
> +#define BS_XOR(a, b)    veorq_u64 ((a), (b))<br>
> +#define BS_NOT(a)       vreinterpretq_u64_u8(vmvnq_u8(vreinterpretq_u8_u64(a)))<br>
> +<br>
> +#define BS_SHL(a, n)    vshlq_n_u64 ((a), n)<br>
> +#define BS_SHR(a, n)    vshrq_n_u64 ((a), n)<br>
> +#define BS_SHL8(a, n)   BS_SHL(a, 8 * (n))<br>
> +#define BS_SHR8(a, n)   BS_SHR(a, 8 * (n))<br>
> +#define BS_EXTRACT8(a, n) (((uint8_t*)&(a))[n])<br>
> +<br>
> +#define BS_EMPTY()<br>
> +<br>
> +#endif<br>
> +<br>
> diff --git a/test/testbsops.c b/test/testbsops.c<br>
> index 50748ab..a8588bd 100644<br>
> --- a/test/testbsops.c<br>
> +++ b/test/testbsops.c<br>
> @@ -248,17 +248,30 @@ main            (void)<br>
>    vec_testeq(b, c);<br>
><br>
>    a = BS_VAL(0xaaaaaaaaaaaaaaaaLL, 0x5555555555555555LL);<br>
> +  /* there is no neon instruction to shift a whole register */<br>
> +#ifdef DVBCSA_USE_NEON<br>
> +  b = BS_VAL(0xaaaaaaaaaaaaaa00LL, 0x5555555555555500LL);<br>
> +#else<br>
>    b = BS_VAL(0xaaaaaaaaaaaaaa55LL, 0x5555555555555500LL);<br>
> +#endif<br>
>    c = BS_SHL8(a, 1);<br>
>    vec_testeq(b, c);<br>
><br>
>    a = BS_VAL(0xffffffffffffffffLL, 0xffffffffffffffffLL);<br>
> +#ifdef DVBCSA_USE_NEON<br>
> +  b = BS_VAL(0xffffffffffffff00LL, 0xffffffffffffff00LL);<br>
> +#else<br>
>    b = BS_VAL(0xffffffffffffffffLL, 0xffffffffffffff00LL);<br>
> +#endif<br>
>    c = BS_SHL8(a, 1);<br>
>    vec_testeq(b, c);<br>
><br>
>    a = BS_VAL(0xffffffffffffffffLL, 0xffffffffffffffffLL);<br>
> +#ifdef DVBCSA_USE_NEON<br>
> +  b = BS_VAL(0xffffffff00000000LL, 0xffffffff00000000LL);<br>
> +#else<br>
>    b = BS_VAL(0xffffffffffffffffLL, 0xffffffff00000000LL);<br>
> +#endif<br>
>    c = BS_SHL8(a, 4);<br>
>    vec_testeq(b, c);<br>
><br>
> @@ -270,22 +283,38 @@ main            (void)<br>
>    vec_testeq(b, c);<br>
><br>
>    a = BS_VAL(0xaaaaaaaaaaaaaaaaLL, 0x5555555555555555LL);<br>
> +#ifdef DVBCSA_USE_NEON<br>
> +  b = BS_VAL(0x00aaaaaaaaaaaaaaLL, 0x0055555555555555LL);<br>
> +#else<br>
>    b = BS_VAL(0x00aaaaaaaaaaaaaaLL, 0xaa55555555555555LL);<br>
> +#endif<br>
>    c = BS_SHR8(a, 1);<br>
>    vec_testeq(b, c);<br>
><br>
>    a = BS_VAL(0xffffffffffffffffLL, 0xffffffffffffffffLL);<br>
> +#ifdef DVBCSA_USE_NEON<br>
> +  b = BS_VAL(0x00ffffffffffffffLL, 0x00ffffffffffffffLL);<br>
> +#else<br>
>    b = BS_VAL(0x00ffffffffffffffLL, 0xffffffffffffffffLL);<br>
> +#endif<br>
>    c = BS_SHR8(a, 1);<br>
>    vec_testeq(b, c);<br>
><br>
>    a = BS_VAL(0xffffffffffffffffLL, 0xffffffffffffffffLL);<br>
> +#ifdef DVBCSA_USE_NEON<br>
> +  b = BS_VAL(0x00000000ffffffffLL, 0x00000000ffffffffLL);<br>
> +#else<br>
>    b = BS_VAL(0x00000000ffffffffLL, 0xffffffffffffffffLL);<br>
> +#endif<br>
>    c = BS_SHR8(a, 4);<br>
>    vec_testeq(b, c);<br>
><br>
>    a = BS_VAL(0xffffffffffffffffLL, 0xffffffffffffffffLL);<br>
> +#ifdef DVBCSA_USE_NEON<br>
> +  b = BS_VAL(0x000000ffffffffffLL, 0x000000ffffffffffLL);<br>
> +#else<br>
>    b = BS_VAL(0x000000ffffffffffLL, 0xffffffffffffffffLL);<br>
> +#endif<br>
>    c = BS_SHR8(a, 3);<br>
>    vec_testeq(b, c);<br>
><br>
> --<br>
> 1.9.1<br>
><br>
</div></div><span class="">> _______________________________________________<br>
> vlc-devel mailing list<br>
> To unsubscribe or modify your subscription options:<br>
> <a href="https://mailman.videolan.org/listinfo/vlc-devel" rel="noreferrer" target="_blank">https://mailman.videolan.org/listinfo/vlc-devel</a><br>
<br>
</span>--<br>
<div class="HOEnZb"><div class="h5">With my kindest regards,<br>
<br>
--<br>
Jean-Baptiste Kempf<br>
<a href="http://www.jbkempf.com/" rel="noreferrer" target="_blank">http://www.jbkempf.com/</a> - +33 672 704 734<br>
Sent from my Electronic Device<br>
_______________________________________________<br>
vlc-devel mailing list<br>
To unsubscribe or modify your subscription options:<br>
<a href="https://mailman.videolan.org/listinfo/vlc-devel" rel="noreferrer" target="_blank">https://mailman.videolan.org/listinfo/vlc-devel</a><br>
</div></div></blockquote></div><br></div>