blamka-round-ssse3.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #ifndef blamka_round_ssse3_H
  2. #define blamka_round_ssse3_H
  3. #include "private/common.h"
  4. #include "private/sse2_64_32.h"
  5. #define r16 \
  6. (_mm_setr_epi8(2, 3, 4, 5, 6, 7, 0, 1, 10, 11, 12, 13, 14, 15, 8, 9))
  7. #define r24 \
  8. (_mm_setr_epi8(3, 4, 5, 6, 7, 0, 1, 2, 11, 12, 13, 14, 15, 8, 9, 10))
  9. #define _mm_roti_epi64(x, c) \
  10. (-(c) == 32) \
  11. ? _mm_shuffle_epi32((x), _MM_SHUFFLE(2, 3, 0, 1)) \
  12. : (-(c) == 24) \
  13. ? _mm_shuffle_epi8((x), r24) \
  14. : (-(c) == 16) \
  15. ? _mm_shuffle_epi8((x), r16) \
  16. : (-(c) == 63) \
  17. ? _mm_xor_si128(_mm_srli_epi64((x), -(c)), \
  18. _mm_add_epi64((x), (x))) \
  19. : _mm_xor_si128(_mm_srli_epi64((x), -(c)), \
  20. _mm_slli_epi64((x), 64 - (-(c))))
  21. static inline __m128i
  22. fBlaMka(__m128i x, __m128i y)
  23. {
  24. const __m128i z = _mm_mul_epu32(x, y);
  25. return _mm_add_epi64(_mm_add_epi64(x, y), _mm_add_epi64(z, z));
  26. }
  27. #define G1(A0, B0, C0, D0, A1, B1, C1, D1) \
  28. do { \
  29. A0 = fBlaMka(A0, B0); \
  30. A1 = fBlaMka(A1, B1); \
  31. \
  32. D0 = _mm_xor_si128(D0, A0); \
  33. D1 = _mm_xor_si128(D1, A1); \
  34. \
  35. D0 = _mm_roti_epi64(D0, -32); \
  36. D1 = _mm_roti_epi64(D1, -32); \
  37. \
  38. C0 = fBlaMka(C0, D0); \
  39. C1 = fBlaMka(C1, D1); \
  40. \
  41. B0 = _mm_xor_si128(B0, C0); \
  42. B1 = _mm_xor_si128(B1, C1); \
  43. \
  44. B0 = _mm_roti_epi64(B0, -24); \
  45. B1 = _mm_roti_epi64(B1, -24); \
  46. } while ((void) 0, 0)
  47. #define G2(A0, B0, C0, D0, A1, B1, C1, D1) \
  48. do { \
  49. A0 = fBlaMka(A0, B0); \
  50. A1 = fBlaMka(A1, B1); \
  51. \
  52. D0 = _mm_xor_si128(D0, A0); \
  53. D1 = _mm_xor_si128(D1, A1); \
  54. \
  55. D0 = _mm_roti_epi64(D0, -16); \
  56. D1 = _mm_roti_epi64(D1, -16); \
  57. \
  58. C0 = fBlaMka(C0, D0); \
  59. C1 = fBlaMka(C1, D1); \
  60. \
  61. B0 = _mm_xor_si128(B0, C0); \
  62. B1 = _mm_xor_si128(B1, C1); \
  63. \
  64. B0 = _mm_roti_epi64(B0, -63); \
  65. B1 = _mm_roti_epi64(B1, -63); \
  66. } while ((void) 0, 0)
  67. #define DIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1) \
  68. do { \
  69. __m128i t0 = _mm_alignr_epi8(B1, B0, 8); \
  70. __m128i t1 = _mm_alignr_epi8(B0, B1, 8); \
  71. B0 = t0; \
  72. B1 = t1; \
  73. \
  74. t0 = C0; \
  75. C0 = C1; \
  76. C1 = t0; \
  77. \
  78. t0 = _mm_alignr_epi8(D1, D0, 8); \
  79. t1 = _mm_alignr_epi8(D0, D1, 8); \
  80. D0 = t1; \
  81. D1 = t0; \
  82. } while ((void) 0, 0)
  83. #define UNDIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1) \
  84. do { \
  85. __m128i t0 = _mm_alignr_epi8(B0, B1, 8); \
  86. __m128i t1 = _mm_alignr_epi8(B1, B0, 8); \
  87. B0 = t0; \
  88. B1 = t1; \
  89. \
  90. t0 = C0; \
  91. C0 = C1; \
  92. C1 = t0; \
  93. \
  94. t0 = _mm_alignr_epi8(D0, D1, 8); \
  95. t1 = _mm_alignr_epi8(D1, D0, 8); \
  96. D0 = t1; \
  97. D1 = t0; \
  98. } while ((void) 0, 0)
  99. #define BLAKE2_ROUND(A0, A1, B0, B1, C0, C1, D0, D1) \
  100. do { \
  101. G1(A0, B0, C0, D0, A1, B1, C1, D1); \
  102. G2(A0, B0, C0, D0, A1, B1, C1, D1); \
  103. \
  104. DIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1); \
  105. \
  106. G1(A0, B0, C0, D0, A1, B1, C1, D1); \
  107. G2(A0, B0, C0, D0, A1, B1, C1, D1); \
  108. \
  109. UNDIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1); \
  110. } while ((void) 0, 0)
  111. #endif