u0.h 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. if (bytes > 0) {
  2. __m128i diag0 = _mm_loadu_si128((const __m128i *) (x + 0));
  3. __m128i diag1 = _mm_loadu_si128((const __m128i *) (x + 4));
  4. __m128i diag2 = _mm_loadu_si128((const __m128i *) (x + 8));
  5. __m128i diag3 = _mm_loadu_si128((const __m128i *) (x + 12));
  6. __m128i a0, a1, a2, a3, a4, a5, a6, a7;
  7. __m128i b0, b1, b2, b3, b4, b5, b6, b7;
  8. uint8_t partialblock[64];
  9. unsigned int i;
  10. a0 = diag1;
  11. for (i = 0; i < ROUNDS; i += 4) {
  12. a0 = _mm_add_epi32(a0, diag0);
  13. a1 = diag0;
  14. b0 = a0;
  15. a0 = _mm_slli_epi32(a0, 7);
  16. b0 = _mm_srli_epi32(b0, 25);
  17. diag3 = _mm_xor_si128(diag3, a0);
  18. diag3 = _mm_xor_si128(diag3, b0);
  19. a1 = _mm_add_epi32(a1, diag3);
  20. a2 = diag3;
  21. b1 = a1;
  22. a1 = _mm_slli_epi32(a1, 9);
  23. b1 = _mm_srli_epi32(b1, 23);
  24. diag2 = _mm_xor_si128(diag2, a1);
  25. diag3 = _mm_shuffle_epi32(diag3, 0x93);
  26. diag2 = _mm_xor_si128(diag2, b1);
  27. a2 = _mm_add_epi32(a2, diag2);
  28. a3 = diag2;
  29. b2 = a2;
  30. a2 = _mm_slli_epi32(a2, 13);
  31. b2 = _mm_srli_epi32(b2, 19);
  32. diag1 = _mm_xor_si128(diag1, a2);
  33. diag2 = _mm_shuffle_epi32(diag2, 0x4e);
  34. diag1 = _mm_xor_si128(diag1, b2);
  35. a3 = _mm_add_epi32(a3, diag1);
  36. a4 = diag3;
  37. b3 = a3;
  38. a3 = _mm_slli_epi32(a3, 18);
  39. b3 = _mm_srli_epi32(b3, 14);
  40. diag0 = _mm_xor_si128(diag0, a3);
  41. diag1 = _mm_shuffle_epi32(diag1, 0x39);
  42. diag0 = _mm_xor_si128(diag0, b3);
  43. a4 = _mm_add_epi32(a4, diag0);
  44. a5 = diag0;
  45. b4 = a4;
  46. a4 = _mm_slli_epi32(a4, 7);
  47. b4 = _mm_srli_epi32(b4, 25);
  48. diag1 = _mm_xor_si128(diag1, a4);
  49. diag1 = _mm_xor_si128(diag1, b4);
  50. a5 = _mm_add_epi32(a5, diag1);
  51. a6 = diag1;
  52. b5 = a5;
  53. a5 = _mm_slli_epi32(a5, 9);
  54. b5 = _mm_srli_epi32(b5, 23);
  55. diag2 = _mm_xor_si128(diag2, a5);
  56. diag1 = _mm_shuffle_epi32(diag1, 0x93);
  57. diag2 = _mm_xor_si128(diag2, b5);
  58. a6 = _mm_add_epi32(a6, diag2);
  59. a7 = diag2;
  60. b6 = a6;
  61. a6 = _mm_slli_epi32(a6, 13);
  62. b6 = _mm_srli_epi32(b6, 19);
  63. diag3 = _mm_xor_si128(diag3, a6);
  64. diag2 = _mm_shuffle_epi32(diag2, 0x4e);
  65. diag3 = _mm_xor_si128(diag3, b6);
  66. a7 = _mm_add_epi32(a7, diag3);
  67. a0 = diag1;
  68. b7 = a7;
  69. a7 = _mm_slli_epi32(a7, 18);
  70. b7 = _mm_srli_epi32(b7, 14);
  71. diag0 = _mm_xor_si128(diag0, a7);
  72. diag3 = _mm_shuffle_epi32(diag3, 0x39);
  73. diag0 = _mm_xor_si128(diag0, b7);
  74. a0 = _mm_add_epi32(a0, diag0);
  75. a1 = diag0;
  76. b0 = a0;
  77. a0 = _mm_slli_epi32(a0, 7);
  78. b0 = _mm_srli_epi32(b0, 25);
  79. diag3 = _mm_xor_si128(diag3, a0);
  80. diag3 = _mm_xor_si128(diag3, b0);
  81. a1 = _mm_add_epi32(a1, diag3);
  82. a2 = diag3;
  83. b1 = a1;
  84. a1 = _mm_slli_epi32(a1, 9);
  85. b1 = _mm_srli_epi32(b1, 23);
  86. diag2 = _mm_xor_si128(diag2, a1);
  87. diag3 = _mm_shuffle_epi32(diag3, 0x93);
  88. diag2 = _mm_xor_si128(diag2, b1);
  89. a2 = _mm_add_epi32(a2, diag2);
  90. a3 = diag2;
  91. b2 = a2;
  92. a2 = _mm_slli_epi32(a2, 13);
  93. b2 = _mm_srli_epi32(b2, 19);
  94. diag1 = _mm_xor_si128(diag1, a2);
  95. diag2 = _mm_shuffle_epi32(diag2, 0x4e);
  96. diag1 = _mm_xor_si128(diag1, b2);
  97. a3 = _mm_add_epi32(a3, diag1);
  98. a4 = diag3;
  99. b3 = a3;
  100. a3 = _mm_slli_epi32(a3, 18);
  101. b3 = _mm_srli_epi32(b3, 14);
  102. diag0 = _mm_xor_si128(diag0, a3);
  103. diag1 = _mm_shuffle_epi32(diag1, 0x39);
  104. diag0 = _mm_xor_si128(diag0, b3);
  105. a4 = _mm_add_epi32(a4, diag0);
  106. a5 = diag0;
  107. b4 = a4;
  108. a4 = _mm_slli_epi32(a4, 7);
  109. b4 = _mm_srli_epi32(b4, 25);
  110. diag1 = _mm_xor_si128(diag1, a4);
  111. diag1 = _mm_xor_si128(diag1, b4);
  112. a5 = _mm_add_epi32(a5, diag1);
  113. a6 = diag1;
  114. b5 = a5;
  115. a5 = _mm_slli_epi32(a5, 9);
  116. b5 = _mm_srli_epi32(b5, 23);
  117. diag2 = _mm_xor_si128(diag2, a5);
  118. diag1 = _mm_shuffle_epi32(diag1, 0x93);
  119. diag2 = _mm_xor_si128(diag2, b5);
  120. a6 = _mm_add_epi32(a6, diag2);
  121. a7 = diag2;
  122. b6 = a6;
  123. a6 = _mm_slli_epi32(a6, 13);
  124. b6 = _mm_srli_epi32(b6, 19);
  125. diag3 = _mm_xor_si128(diag3, a6);
  126. diag2 = _mm_shuffle_epi32(diag2, 0x4e);
  127. diag3 = _mm_xor_si128(diag3, b6);
  128. a7 = _mm_add_epi32(a7, diag3);
  129. a0 = diag1;
  130. b7 = a7;
  131. a7 = _mm_slli_epi32(a7, 18);
  132. b7 = _mm_srli_epi32(b7, 14);
  133. diag0 = _mm_xor_si128(diag0, a7);
  134. diag3 = _mm_shuffle_epi32(diag3, 0x39);
  135. diag0 = _mm_xor_si128(diag0, b7);
  136. }
  137. diag0 = _mm_add_epi32(diag0, _mm_loadu_si128((const __m128i *) (x + 0)));
  138. diag1 = _mm_add_epi32(diag1, _mm_loadu_si128((const __m128i *) (x + 4)));
  139. diag2 = _mm_add_epi32(diag2, _mm_loadu_si128((const __m128i *) (x + 8)));
  140. diag3 = _mm_add_epi32(diag3, _mm_loadu_si128((const __m128i *) (x + 12)));
  141. #define ONEQUAD_SHUFFLE(A, B, C, D) \
  142. do { \
  143. uint32_t in##A = _mm_cvtsi128_si32(diag0); \
  144. uint32_t in##B = _mm_cvtsi128_si32(diag1); \
  145. uint32_t in##C = _mm_cvtsi128_si32(diag2); \
  146. uint32_t in##D = _mm_cvtsi128_si32(diag3); \
  147. diag0 = _mm_shuffle_epi32(diag0, 0x39); \
  148. diag1 = _mm_shuffle_epi32(diag1, 0x39); \
  149. diag2 = _mm_shuffle_epi32(diag2, 0x39); \
  150. diag3 = _mm_shuffle_epi32(diag3, 0x39); \
  151. *(uint32_t *) (partialblock + (A * 4)) = in##A; \
  152. *(uint32_t *) (partialblock + (B * 4)) = in##B; \
  153. *(uint32_t *) (partialblock + (C * 4)) = in##C; \
  154. *(uint32_t *) (partialblock + (D * 4)) = in##D; \
  155. } while (0)
  156. #define ONEQUAD(A, B, C, D) ONEQUAD_SHUFFLE(A, B, C, D)
  157. ONEQUAD(0, 12, 8, 4);
  158. ONEQUAD(5, 1, 13, 9);
  159. ONEQUAD(10, 6, 2, 14);
  160. ONEQUAD(15, 11, 7, 3);
  161. #undef ONEQUAD
  162. #undef ONEQUAD_SHUFFLE
  163. for (i = 0; i < bytes; i++) {
  164. c[i] = m[i] ^ partialblock[i];
  165. }
  166. sodium_memzero(partialblock, sizeof partialblock);
  167. }