blamka-round-avx2.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #ifndef blamka_round_avx2_H
  2. #define blamka_round_avx2_H
  3. #include "private/common.h"
  4. #include "private/sse2_64_32.h"
  5. #define rotr32(x) _mm256_shuffle_epi32(x, _MM_SHUFFLE(2, 3, 0, 1))
  6. #define rotr24(x) _mm256_shuffle_epi8(x, _mm256_setr_epi8(3, 4, 5, 6, 7, 0, 1, 2, 11, 12, 13, 14, 15, 8, 9, 10, 3, 4, 5, 6, 7, 0, 1, 2, 11, 12, 13, 14, 15, 8, 9, 10))
  7. #define rotr16(x) _mm256_shuffle_epi8(x, _mm256_setr_epi8(2, 3, 4, 5, 6, 7, 0, 1, 10, 11, 12, 13, 14, 15, 8, 9, 2, 3, 4, 5, 6, 7, 0, 1, 10, 11, 12, 13, 14, 15, 8, 9))
  8. #define rotr63(x) _mm256_xor_si256(_mm256_srli_epi64((x), 63), _mm256_add_epi64((x), (x)))
  9. #define G1_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \
  10. do { \
  11. __m256i ml = _mm256_mul_epu32(A0, B0); \
  12. ml = _mm256_add_epi64(ml, ml); \
  13. A0 = _mm256_add_epi64(A0, _mm256_add_epi64(B0, ml)); \
  14. D0 = _mm256_xor_si256(D0, A0); \
  15. D0 = rotr32(D0); \
  16. \
  17. ml = _mm256_mul_epu32(C0, D0); \
  18. ml = _mm256_add_epi64(ml, ml); \
  19. C0 = _mm256_add_epi64(C0, _mm256_add_epi64(D0, ml)); \
  20. \
  21. B0 = _mm256_xor_si256(B0, C0); \
  22. B0 = rotr24(B0); \
  23. \
  24. ml = _mm256_mul_epu32(A1, B1); \
  25. ml = _mm256_add_epi64(ml, ml); \
  26. A1 = _mm256_add_epi64(A1, _mm256_add_epi64(B1, ml)); \
  27. D1 = _mm256_xor_si256(D1, A1); \
  28. D1 = rotr32(D1); \
  29. \
  30. ml = _mm256_mul_epu32(C1, D1); \
  31. ml = _mm256_add_epi64(ml, ml); \
  32. C1 = _mm256_add_epi64(C1, _mm256_add_epi64(D1, ml)); \
  33. \
  34. B1 = _mm256_xor_si256(B1, C1); \
  35. B1 = rotr24(B1); \
  36. } while((void)0, 0);
  37. #define G2_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \
  38. do { \
  39. __m256i ml = _mm256_mul_epu32(A0, B0); \
  40. ml = _mm256_add_epi64(ml, ml); \
  41. A0 = _mm256_add_epi64(A0, _mm256_add_epi64(B0, ml)); \
  42. D0 = _mm256_xor_si256(D0, A0); \
  43. D0 = rotr16(D0); \
  44. \
  45. ml = _mm256_mul_epu32(C0, D0); \
  46. ml = _mm256_add_epi64(ml, ml); \
  47. C0 = _mm256_add_epi64(C0, _mm256_add_epi64(D0, ml)); \
  48. B0 = _mm256_xor_si256(B0, C0); \
  49. B0 = rotr63(B0); \
  50. \
  51. ml = _mm256_mul_epu32(A1, B1); \
  52. ml = _mm256_add_epi64(ml, ml); \
  53. A1 = _mm256_add_epi64(A1, _mm256_add_epi64(B1, ml)); \
  54. D1 = _mm256_xor_si256(D1, A1); \
  55. D1 = rotr16(D1); \
  56. \
  57. ml = _mm256_mul_epu32(C1, D1); \
  58. ml = _mm256_add_epi64(ml, ml); \
  59. C1 = _mm256_add_epi64(C1, _mm256_add_epi64(D1, ml)); \
  60. B1 = _mm256_xor_si256(B1, C1); \
  61. B1 = rotr63(B1); \
  62. } while((void)0, 0);
  63. #define DIAGONALIZE_1(A0, B0, C0, D0, A1, B1, C1, D1) \
  64. do { \
  65. B0 = _mm256_permute4x64_epi64(B0, _MM_SHUFFLE(0, 3, 2, 1)); \
  66. C0 = _mm256_permute4x64_epi64(C0, _MM_SHUFFLE(1, 0, 3, 2)); \
  67. D0 = _mm256_permute4x64_epi64(D0, _MM_SHUFFLE(2, 1, 0, 3)); \
  68. \
  69. B1 = _mm256_permute4x64_epi64(B1, _MM_SHUFFLE(0, 3, 2, 1)); \
  70. C1 = _mm256_permute4x64_epi64(C1, _MM_SHUFFLE(1, 0, 3, 2)); \
  71. D1 = _mm256_permute4x64_epi64(D1, _MM_SHUFFLE(2, 1, 0, 3)); \
  72. } while((void)0, 0);
  73. #define DIAGONALIZE_2(A0, A1, B0, B1, C0, C1, D0, D1) \
  74. do { \
  75. __m256i tmp1 = _mm256_blend_epi32(B0, B1, 0xCC); \
  76. __m256i tmp2 = _mm256_blend_epi32(B0, B1, 0x33); \
  77. B1 = _mm256_permute4x64_epi64(tmp1, _MM_SHUFFLE(2,3,0,1)); \
  78. B0 = _mm256_permute4x64_epi64(tmp2, _MM_SHUFFLE(2,3,0,1)); \
  79. \
  80. tmp1 = C0; \
  81. C0 = C1; \
  82. C1 = tmp1; \
  83. \
  84. tmp1 = _mm256_blend_epi32(D0, D1, 0xCC); \
  85. tmp2 = _mm256_blend_epi32(D0, D1, 0x33); \
  86. D0 = _mm256_permute4x64_epi64(tmp1, _MM_SHUFFLE(2,3,0,1)); \
  87. D1 = _mm256_permute4x64_epi64(tmp2, _MM_SHUFFLE(2,3,0,1)); \
  88. } while(0);
  89. #define UNDIAGONALIZE_1(A0, B0, C0, D0, A1, B1, C1, D1) \
  90. do { \
  91. B0 = _mm256_permute4x64_epi64(B0, _MM_SHUFFLE(2, 1, 0, 3)); \
  92. C0 = _mm256_permute4x64_epi64(C0, _MM_SHUFFLE(1, 0, 3, 2)); \
  93. D0 = _mm256_permute4x64_epi64(D0, _MM_SHUFFLE(0, 3, 2, 1)); \
  94. \
  95. B1 = _mm256_permute4x64_epi64(B1, _MM_SHUFFLE(2, 1, 0, 3)); \
  96. C1 = _mm256_permute4x64_epi64(C1, _MM_SHUFFLE(1, 0, 3, 2)); \
  97. D1 = _mm256_permute4x64_epi64(D1, _MM_SHUFFLE(0, 3, 2, 1)); \
  98. } while((void)0, 0);
  99. #define UNDIAGONALIZE_2(A0, A1, B0, B1, C0, C1, D0, D1) \
  100. do { \
  101. __m256i tmp1 = _mm256_blend_epi32(B0, B1, 0xCC); \
  102. __m256i tmp2 = _mm256_blend_epi32(B0, B1, 0x33); \
  103. B0 = _mm256_permute4x64_epi64(tmp1, _MM_SHUFFLE(2,3,0,1)); \
  104. B1 = _mm256_permute4x64_epi64(tmp2, _MM_SHUFFLE(2,3,0,1)); \
  105. \
  106. tmp1 = C0; \
  107. C0 = C1; \
  108. C1 = tmp1; \
  109. \
  110. tmp1 = _mm256_blend_epi32(D0, D1, 0x33); \
  111. tmp2 = _mm256_blend_epi32(D0, D1, 0xCC); \
  112. D0 = _mm256_permute4x64_epi64(tmp1, _MM_SHUFFLE(2,3,0,1)); \
  113. D1 = _mm256_permute4x64_epi64(tmp2, _MM_SHUFFLE(2,3,0,1)); \
  114. } while((void)0, 0);
  115. #define BLAKE2_ROUND_1(A0, A1, B0, B1, C0, C1, D0, D1) \
  116. do{ \
  117. G1_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \
  118. G2_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \
  119. \
  120. DIAGONALIZE_1(A0, B0, C0, D0, A1, B1, C1, D1) \
  121. \
  122. G1_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \
  123. G2_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \
  124. \
  125. UNDIAGONALIZE_1(A0, B0, C0, D0, A1, B1, C1, D1) \
  126. } while((void)0, 0);
  127. #define BLAKE2_ROUND_2(A0, A1, B0, B1, C0, C1, D0, D1) \
  128. do{ \
  129. G1_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \
  130. G2_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \
  131. \
  132. DIAGONALIZE_2(A0, A1, B0, B1, C0, C1, D0, D1) \
  133. \
  134. G1_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \
  135. G2_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \
  136. \
  137. UNDIAGONALIZE_2(A0, A1, B0, B1, C0, C1, D0, D1) \
  138. } while((void)0, 0);
  139. #endif