blake2b-compress-sse41.h 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #ifndef blake2b_compress_sse41_H
  2. #define blake2b_compress_sse41_H
  3. #define LOADU(p) _mm_loadu_si128((const __m128i *) (const void *) (p))
  4. #define STOREU(p, r) _mm_storeu_si128((__m128i *) (void *) (p), r)
  5. #define _mm_roti_epi64(x, c) \
  6. (-(c) == 32) \
  7. ? _mm_shuffle_epi32((x), _MM_SHUFFLE(2, 3, 0, 1)) \
  8. : (-(c) == 24) \
  9. ? _mm_shuffle_epi8((x), r24) \
  10. : (-(c) == 16) \
  11. ? _mm_shuffle_epi8((x), r16) \
  12. : (-(c) == 63) \
  13. ? _mm_xor_si128(_mm_srli_epi64((x), -(c)), \
  14. _mm_add_epi64((x), (x))) \
  15. : _mm_xor_si128(_mm_srli_epi64((x), -(c)), \
  16. _mm_slli_epi64((x), 64 - (-(c))))
  17. #define G1(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h, b0, b1) \
  18. row1l = _mm_add_epi64(_mm_add_epi64(row1l, b0), row2l); \
  19. row1h = _mm_add_epi64(_mm_add_epi64(row1h, b1), row2h); \
  20. \
  21. row4l = _mm_xor_si128(row4l, row1l); \
  22. row4h = _mm_xor_si128(row4h, row1h); \
  23. \
  24. row4l = _mm_roti_epi64(row4l, -32); \
  25. row4h = _mm_roti_epi64(row4h, -32); \
  26. \
  27. row3l = _mm_add_epi64(row3l, row4l); \
  28. row3h = _mm_add_epi64(row3h, row4h); \
  29. \
  30. row2l = _mm_xor_si128(row2l, row3l); \
  31. row2h = _mm_xor_si128(row2h, row3h); \
  32. \
  33. row2l = _mm_roti_epi64(row2l, -24); \
  34. row2h = _mm_roti_epi64(row2h, -24);
  35. #define G2(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h, b0, b1) \
  36. row1l = _mm_add_epi64(_mm_add_epi64(row1l, b0), row2l); \
  37. row1h = _mm_add_epi64(_mm_add_epi64(row1h, b1), row2h); \
  38. \
  39. row4l = _mm_xor_si128(row4l, row1l); \
  40. row4h = _mm_xor_si128(row4h, row1h); \
  41. \
  42. row4l = _mm_roti_epi64(row4l, -16); \
  43. row4h = _mm_roti_epi64(row4h, -16); \
  44. \
  45. row3l = _mm_add_epi64(row3l, row4l); \
  46. row3h = _mm_add_epi64(row3h, row4h); \
  47. \
  48. row2l = _mm_xor_si128(row2l, row3l); \
  49. row2h = _mm_xor_si128(row2h, row3h); \
  50. \
  51. row2l = _mm_roti_epi64(row2l, -63); \
  52. row2h = _mm_roti_epi64(row2h, -63);
  53. #define DIAGONALIZE(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h) \
  54. t0 = _mm_alignr_epi8(row2h, row2l, 8); \
  55. t1 = _mm_alignr_epi8(row2l, row2h, 8); \
  56. row2l = t0; \
  57. row2h = t1; \
  58. \
  59. t0 = row3l; \
  60. row3l = row3h; \
  61. row3h = t0; \
  62. \
  63. t0 = _mm_alignr_epi8(row4h, row4l, 8); \
  64. t1 = _mm_alignr_epi8(row4l, row4h, 8); \
  65. row4l = t1; \
  66. row4h = t0;
  67. #define UNDIAGONALIZE(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h) \
  68. t0 = _mm_alignr_epi8(row2l, row2h, 8); \
  69. t1 = _mm_alignr_epi8(row2h, row2l, 8); \
  70. row2l = t0; \
  71. row2h = t1; \
  72. \
  73. t0 = row3l; \
  74. row3l = row3h; \
  75. row3h = t0; \
  76. \
  77. t0 = _mm_alignr_epi8(row4l, row4h, 8); \
  78. t1 = _mm_alignr_epi8(row4h, row4l, 8); \
  79. row4l = t1; \
  80. row4h = t0;
  81. #include "blake2b-load-sse41.h"
  82. #define ROUND(r) \
  83. LOAD_MSG_##r##_1(b0, b1); \
  84. G1(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h, b0, b1); \
  85. LOAD_MSG_##r##_2(b0, b1); \
  86. G2(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h, b0, b1); \
  87. DIAGONALIZE(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h); \
  88. LOAD_MSG_##r##_3(b0, b1); \
  89. G1(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h, b0, b1); \
  90. LOAD_MSG_##r##_4(b0, b1); \
  91. G2(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h, b0, b1); \
  92. UNDIAGONALIZE(row1l, row2l, row3l, row4l, row1h, row2h, row3h, row4h);
  93. #endif