<div dir="ltr"><div>No, it doesn't. The input is assumed unaligned. testbitslice.c takes care of generating packets with random offsets and sizes. All dvbcsa_bs_word buffers are "naturally" aligned by a compiler. Unaligned access is handled by inline functions dvbcsa_xor_XX, dvbcsa_copy_XX, dvbcsa_load/store_XX (dvbcsa_pv.h) and it does have noticeable effect on performance. As for the scratch buffers, the only restriction is that scratch2 must be at least 16 bit aligned (for patch #7). All bs words in the current implementation are at least 32 bit aligned. BTW, neon uint64x2_t words are 64 bit aligned by a compiler, not 128. In other words, as long as something like uint8x16_t is not used as a bs word for scratch2 it's OK. I also tried to manually align buffers at 128 bit forcing gcc generate vld1 @128 instructions and didn't notice any performance changes on cortex-a7.<br><br>>Does this add latency?<br></div><div>No, actually, the scratch buffers remove latency. This patch could as well be titled "fix block cipher performance on modern x86 architectures". Doesn't have that much effect on ARM.<br></div><div><br></div><div class="gmail_extra"><br><div class="gmail_quote">2015-07-06 19:08 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">LGTM.<br>
Does this add a special requirement to the input, like alignment?<br>
Does this add latency?<br>
<br>
On 26 Jun, glenvt18 wrote :<br>
<div><div class="h5">> 1. Use a dvbcsa_bs_world_t x 8 scratch buffer between the output of sbox and the input of<br>
> the permute logic. It reduces the dependency between sbox output and permute logic input.<br>
> 2x speed-up of CSA on x86 with both uint64 and sse2.<br>
><br>
> 2. Lookup 4 values at a time (a, b, c, d) - reduces dependency on a read value.<br>
><br>
> 3. Use separate scratch buffers for reading and writing.<br>
><br>
> Changes 2 and 3 add about 5% depending on the architecture.<br>
> ---<br>
>  src/dvbcsa_bs_block.c | 96 +++++++++++++++++++++++++++++++++------------------<br>
>  1 file changed, 63 insertions(+), 33 deletions(-)<br>
><br>
> diff --git a/src/dvbcsa_bs_block.c b/src/dvbcsa_bs_block.c<br>
> index 58f6ca9..e4f532c 100644<br>
> --- a/src/dvbcsa_bs_block.c<br>
> +++ b/src/dvbcsa_bs_block.c<br>
> @@ -31,32 +31,48 @@<br>
>  DVBCSA_INLINE static inline void<br>
>  dvbcsa_bs_block_decrypt_register (const dvbcsa_bs_word_t *block, dvbcsa_bs_word_t *r)<br>
>  {<br>
> -  int        i, j, g;<br>
> +  dvbcsa_bs_word_t scratch1[8];<br>
> +  dvbcsa_bs_word_t scratch2[8];<br>
> +  int i, j, g;<br>
><br>
>    r += 8 * 56;<br>
><br>
> -  // loop over kk[55]..kk[0]<br>
> +  /* loop over kk[55]..kk[0] */<br>
>    for (i = 55; i >= 0; i--)<br>
>      {<br>
>        dvbcsa_bs_word_t *r6_N = r + 8 * 6;<br>
><br>
> -      r -= 8;        /* virtual shift of registers */<br>
> +      r -= 8;   /* virtual shift of registers */<br>
><br>
>        for (g = 0; g < 8; g++)<br>
> -     {<br>
> -       union {<br>
> -         dvbcsa_bs_word_t so;<br>
> -         uint8_t si[BS_BATCH_BYTES];<br>
> -       } u;<br>
> +        scratch1[g] = BS_XOR(block[i], r6_N[g]);<br>
> +<br>
> +      /* sbox */<br>
> +      {<br>
> +      uint8_t *p1, *p2;<br>
> +      uint8_t a, b, c, d;<br>
> +<br>
> +      p1 = (uint8_t *)scratch1;<br>
> +      p2 = (uint8_t *)scratch2;<br>
> +      for (j = 0; j < BS_BATCH_BYTES * 8; j += 4)<br>
> +        {<br>
> +          a = p1[j + 0];<br>
> +          b = p1[j + 1];<br>
> +          c = p1[j + 2];<br>
> +          d = p1[j + 3];<br>
> +          p2[j + 0] = dvbcsa_block_sbox[a];<br>
> +          p2[j + 1] = dvbcsa_block_sbox[b];<br>
> +          p2[j + 2] = dvbcsa_block_sbox[c];<br>
> +          p2[j + 3] = dvbcsa_block_sbox[d];<br>
> +        }<br>
> +      }<br>
><br>
> -       u.so = BS_XOR(block[i], r6_N[g]);<br>
> -<br>
> -       for (j = 0; j < BS_BATCH_BYTES; j++)<br>
> -         <a href="http://u.si" rel="noreferrer" target="_blank">u.si</a>[j] = dvbcsa_block_sbox[<a href="http://u.si" rel="noreferrer" target="_blank">u.si</a>[j]];<br>
> -<br>
> -       dvbcsa_bs_word_t sbox_out = u.so;<br>
> +      for (g = 0; g < 8; g++)<br>
> +        {<br>
> +          dvbcsa_bs_word_t sbox_out = scratch2[g];<br>
> +          dvbcsa_bs_word_t w;<br>
><br>
> -       // bit permutation<br>
> +          /* bit permutation */<br>
><br>
>         dvbcsa_bs_word_t in = BS_OR(<br>
>                                     BS_OR(<br>
> @@ -67,8 +83,7 @@ dvbcsa_bs_block_decrypt_register (const dvbcsa_bs_word_t *block, dvbcsa_bs_word_<br>
>                                     BS_OR(       BS_SHR (BS_AND (sbox_out, BS_VAL8(40)), 6),<br>
>                                                  BS_SHR (BS_AND (sbox_out, BS_VAL8(80)), 4)));<br>
><br>
> -       dvbcsa_bs_word_t w = BS_XOR(r[8 * 8 + g], sbox_out);<br>
> -<br>
> +          w = BS_XOR(r[8 * 8 + g], sbox_out);<br>
>         r[8 * 0 + g] = w;<br>
>         BS_XOREQ(r[8 * 2 + g], w);<br>
>         BS_XOREQ(r[8 * 3 + g], w);<br>
> @@ -116,30 +131,46 @@ void dvbcsa_bs_block_decrypt_batch(const struct dvbcsa_bs_key_s *key,<br>
>  DVBCSA_INLINE static inline void<br>
>  dvbcsa_bs_block_encrypt_register (const dvbcsa_bs_word_t *block, dvbcsa_bs_word_t *r)<br>
>  {<br>
> -  int        i, j, g;<br>
> +  dvbcsa_bs_word_t scratch1[8];<br>
> +  dvbcsa_bs_word_t scratch2[8];<br>
> +  int i, j, g;<br>
><br>
> -  // loop over kk[55]..kk[0]<br>
> +  /* loop over kk[55]..kk[0] */<br>
>    for (i = 0; i < 56; i++)<br>
>      {<br>
>        dvbcsa_bs_word_t *r7_N = r + 8 * 7;<br>
><br>
> -      r += 8;        /* virtual shift of registers */<br>
> +      r += 8;   /* virtual shift of registers */<br>
><br>
>        for (g = 0; g < 8; g++)<br>
> -     {<br>
> -       union {<br>
> -         dvbcsa_bs_word_t so;<br>
> -         uint8_t si[BS_BATCH_BYTES];<br>
> -       } u;<br>
> +          scratch1[g] = BS_XOR(block[i], r7_N[g]);<br>
> +<br>
> +      /* sbox */<br>
> +      {<br>
> +      uint8_t *p1, *p2;<br>
> +      uint8_t a, b, c, d;<br>
> +<br>
> +      p1 = (uint8_t *)scratch1;<br>
> +      p2 = (uint8_t *)scratch2;<br>
> +      for (j = 0; j < BS_BATCH_BYTES * 8; j += 4)<br>
> +        {<br>
> +          a = p1[j + 0];<br>
> +          b = p1[j + 1];<br>
> +          c = p1[j + 2];<br>
> +          d = p1[j + 3];<br>
> +          p2[j + 0] = dvbcsa_block_sbox[a];<br>
> +          p2[j + 1] = dvbcsa_block_sbox[b];<br>
> +          p2[j + 2] = dvbcsa_block_sbox[c];<br>
> +          p2[j + 3] = dvbcsa_block_sbox[d];<br>
> +        }<br>
> +      }<br>
><br>
> -       u.so = BS_XOR(block[i], r7_N[g]);<br>
> -<br>
> -       for (j = 0; j < BS_BATCH_BYTES; j++)<br>
> -         <a href="http://u.si" rel="noreferrer" target="_blank">u.si</a>[j] = dvbcsa_block_sbox[<a href="http://u.si" rel="noreferrer" target="_blank">u.si</a>[j]];<br>
> -<br>
> -       dvbcsa_bs_word_t sbox_out = u.so;<br>
> +      for (g = 0; g < 8; g++)<br>
> +        {<br>
> +          dvbcsa_bs_word_t sbox_out = scratch2[g];<br>
> +          dvbcsa_bs_word_t w = r[-8 * 1 + g];<br>
><br>
> -       // bit permutation<br>
> +          /* bit permutation */<br>
><br>
>         dvbcsa_bs_word_t in = BS_OR(<br>
>                                     BS_OR(<br>
> @@ -150,7 +181,6 @@ dvbcsa_bs_block_encrypt_register (const dvbcsa_bs_word_t *block, dvbcsa_bs_word_<br>
>                                     BS_OR(       BS_SHR (BS_AND (sbox_out, BS_VAL8(40)), 6),<br>
>                                                  BS_SHR (BS_AND (sbox_out, BS_VAL8(80)), 4)));<br>
><br>
> -       dvbcsa_bs_word_t w = r[-8 * 1 + g];<br>
><br>
>         r[8 * 7 + g] = BS_XOR(w, sbox_out);<br>
>         BS_XOREQ(r[8 * 1 + g], w);<br>
> --<br>
> 1.9.1<br>
><br>
</div></div>> _______________________________________________<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>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
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>
</font></span></blockquote></div><br></div></div>