u1.h 6.7 KB

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