mirror of https://github.com/oxen-io/lokinet
make format crypto/
parent
842fe039bc
commit
595b15d538
@ -1,340 +1,388 @@
|
||||
#ifndef blake2b_load_avx2_H
|
||||
#define blake2b_load_avx2_H
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_0_1(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpacklo_epi64(m0, m1); \
|
||||
t1 = _mm256_unpacklo_epi64(m2, m3); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_0_2(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpackhi_epi64(m0, m1); \
|
||||
t1 = _mm256_unpackhi_epi64(m2, m3); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_0_3(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpacklo_epi64(m4, m5); \
|
||||
t1 = _mm256_unpacklo_epi64(m6, m7); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_0_4(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpackhi_epi64(m4, m5); \
|
||||
t1 = _mm256_unpackhi_epi64(m6, m7); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_1_1(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpacklo_epi64(m7, m2); \
|
||||
t1 = _mm256_unpackhi_epi64(m4, m6); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_1_2(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpacklo_epi64(m5, m4); \
|
||||
t1 = _mm256_alignr_epi8(m3, m7, 8); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_1_3(b0) \
|
||||
do { \
|
||||
t0 = _mm256_shuffle_epi32(m0, _MM_SHUFFLE(1, 0, 3, 2)); \
|
||||
t1 = _mm256_unpackhi_epi64(m5, m2); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_1_4(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpacklo_epi64(m6, m1); \
|
||||
t1 = _mm256_unpackhi_epi64(m3, m1); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_2_1(b0) \
|
||||
do { \
|
||||
t0 = _mm256_alignr_epi8(m6, m5, 8); \
|
||||
t1 = _mm256_unpackhi_epi64(m2, m7); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_2_2(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpacklo_epi64(m4, m0); \
|
||||
t1 = _mm256_blend_epi32(m6, m1, 0x33); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_2_3(b0) \
|
||||
do { \
|
||||
t0 = _mm256_blend_epi32(m1, m5, 0x33); \
|
||||
t1 = _mm256_unpackhi_epi64(m3, m4); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_2_4(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpacklo_epi64(m7, m3); \
|
||||
t1 = _mm256_alignr_epi8(m2, m0, 8); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_3_1(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpackhi_epi64(m3, m1); \
|
||||
t1 = _mm256_unpackhi_epi64(m6, m5); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_3_2(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpackhi_epi64(m4, m0); \
|
||||
t1 = _mm256_unpacklo_epi64(m6, m7); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_3_3(b0) \
|
||||
do { \
|
||||
t0 = _mm256_blend_epi32(m2, m1, 0x33); \
|
||||
t1 = _mm256_blend_epi32(m7, m2, 0x33); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_3_4(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpacklo_epi64(m3, m5); \
|
||||
t1 = _mm256_unpacklo_epi64(m0, m4); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_4_1(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpackhi_epi64(m4, m2); \
|
||||
t1 = _mm256_unpacklo_epi64(m1, m5); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_4_2(b0) \
|
||||
do { \
|
||||
t0 = _mm256_blend_epi32(m3, m0, 0x33); \
|
||||
t1 = _mm256_blend_epi32(m7, m2, 0x33); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_4_3(b0) \
|
||||
do { \
|
||||
t0 = _mm256_blend_epi32(m5, m7, 0x33); \
|
||||
t1 = _mm256_blend_epi32(m1, m3, 0x33); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_4_4(b0) \
|
||||
do { \
|
||||
t0 = _mm256_alignr_epi8(m6, m0, 8); \
|
||||
t1 = _mm256_blend_epi32(m6, m4, 0x33); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_5_1(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpacklo_epi64(m1, m3); \
|
||||
t1 = _mm256_unpacklo_epi64(m0, m4); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_5_2(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpacklo_epi64(m6, m5); \
|
||||
t1 = _mm256_unpackhi_epi64(m5, m1); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_5_3(b0) \
|
||||
do { \
|
||||
t0 = _mm256_blend_epi32(m3, m2, 0x33); \
|
||||
t1 = _mm256_unpackhi_epi64(m7, m0); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_5_4(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpackhi_epi64(m6, m2); \
|
||||
t1 = _mm256_blend_epi32(m4, m7, 0x33); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_6_1(b0) \
|
||||
do { \
|
||||
t0 = _mm256_blend_epi32(m0, m6, 0x33); \
|
||||
t1 = _mm256_unpacklo_epi64(m7, m2); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_6_2(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpackhi_epi64(m2, m7); \
|
||||
t1 = _mm256_alignr_epi8(m5, m6, 8); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_6_3(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpacklo_epi64(m0, m3); \
|
||||
t1 = _mm256_shuffle_epi32(m4, _MM_SHUFFLE(1, 0, 3, 2)); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_6_4(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpackhi_epi64(m3, m1); \
|
||||
t1 = _mm256_blend_epi32(m5, m1, 0x33); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_7_1(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpackhi_epi64(m6, m3); \
|
||||
t1 = _mm256_blend_epi32(m1, m6, 0x33); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_7_2(b0) \
|
||||
do { \
|
||||
t0 = _mm256_alignr_epi8(m7, m5, 8); \
|
||||
t1 = _mm256_unpackhi_epi64(m0, m4); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_7_3(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpackhi_epi64(m2, m7); \
|
||||
t1 = _mm256_unpacklo_epi64(m4, m1); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_7_4(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpacklo_epi64(m0, m2); \
|
||||
t1 = _mm256_unpacklo_epi64(m3, m5); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_8_1(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpacklo_epi64(m3, m7); \
|
||||
t1 = _mm256_alignr_epi8(m0, m5, 8); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_8_2(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpackhi_epi64(m7, m4); \
|
||||
t1 = _mm256_alignr_epi8(m4, m1, 8); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_8_3(b0) \
|
||||
do { \
|
||||
t0 = m6; \
|
||||
t1 = _mm256_alignr_epi8(m5, m0, 8); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_8_4(b0) \
|
||||
do { \
|
||||
t0 = _mm256_blend_epi32(m3, m1, 0x33); \
|
||||
t1 = m2; \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_9_1(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpacklo_epi64(m5, m4); \
|
||||
t1 = _mm256_unpackhi_epi64(m3, m0); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_9_2(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpacklo_epi64(m1, m2); \
|
||||
t1 = _mm256_blend_epi32(m2, m3, 0x33); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_9_3(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpackhi_epi64(m7, m4); \
|
||||
t1 = _mm256_unpackhi_epi64(m1, m6); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_9_4(b0) \
|
||||
do { \
|
||||
t0 = _mm256_alignr_epi8(m7, m5, 8); \
|
||||
t1 = _mm256_unpacklo_epi64(m6, m0); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_10_1(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpacklo_epi64(m0, m1); \
|
||||
t1 = _mm256_unpacklo_epi64(m2, m3); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_10_2(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpackhi_epi64(m0, m1); \
|
||||
t1 = _mm256_unpackhi_epi64(m2, m3); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_10_3(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpacklo_epi64(m4, m5); \
|
||||
t1 = _mm256_unpacklo_epi64(m6, m7); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_10_4(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpackhi_epi64(m4, m5); \
|
||||
t1 = _mm256_unpackhi_epi64(m6, m7); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_11_1(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpacklo_epi64(m7, m2); \
|
||||
t1 = _mm256_unpackhi_epi64(m4, m6); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_11_2(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpacklo_epi64(m5, m4); \
|
||||
t1 = _mm256_alignr_epi8(m3, m7, 8); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_11_3(b0) \
|
||||
do { \
|
||||
t0 = _mm256_shuffle_epi32(m0, _MM_SHUFFLE(1, 0, 3, 2)); \
|
||||
t1 = _mm256_unpackhi_epi64(m5, m2); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_11_4(b0) \
|
||||
do { \
|
||||
t0 = _mm256_unpacklo_epi64(m6, m1); \
|
||||
t1 = _mm256_unpackhi_epi64(m3, m1); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while (0)
|
||||
#define BLAKE2B_LOAD_MSG_0_1(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpacklo_epi64(m0, m1); \
|
||||
t1 = _mm256_unpacklo_epi64(m2, m3); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_0_2(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpackhi_epi64(m0, m1); \
|
||||
t1 = _mm256_unpackhi_epi64(m2, m3); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_0_3(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpacklo_epi64(m4, m5); \
|
||||
t1 = _mm256_unpacklo_epi64(m6, m7); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_0_4(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpackhi_epi64(m4, m5); \
|
||||
t1 = _mm256_unpackhi_epi64(m6, m7); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_1_1(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpacklo_epi64(m7, m2); \
|
||||
t1 = _mm256_unpackhi_epi64(m4, m6); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_1_2(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpacklo_epi64(m5, m4); \
|
||||
t1 = _mm256_alignr_epi8(m3, m7, 8); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_1_3(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_shuffle_epi32(m0, _MM_SHUFFLE(1, 0, 3, 2)); \
|
||||
t1 = _mm256_unpackhi_epi64(m5, m2); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_1_4(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpacklo_epi64(m6, m1); \
|
||||
t1 = _mm256_unpackhi_epi64(m3, m1); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_2_1(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_alignr_epi8(m6, m5, 8); \
|
||||
t1 = _mm256_unpackhi_epi64(m2, m7); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_2_2(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpacklo_epi64(m4, m0); \
|
||||
t1 = _mm256_blend_epi32(m6, m1, 0x33); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_2_3(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_blend_epi32(m1, m5, 0x33); \
|
||||
t1 = _mm256_unpackhi_epi64(m3, m4); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_2_4(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpacklo_epi64(m7, m3); \
|
||||
t1 = _mm256_alignr_epi8(m2, m0, 8); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_3_1(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpackhi_epi64(m3, m1); \
|
||||
t1 = _mm256_unpackhi_epi64(m6, m5); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_3_2(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpackhi_epi64(m4, m0); \
|
||||
t1 = _mm256_unpacklo_epi64(m6, m7); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_3_3(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_blend_epi32(m2, m1, 0x33); \
|
||||
t1 = _mm256_blend_epi32(m7, m2, 0x33); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_3_4(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpacklo_epi64(m3, m5); \
|
||||
t1 = _mm256_unpacklo_epi64(m0, m4); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_4_1(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpackhi_epi64(m4, m2); \
|
||||
t1 = _mm256_unpacklo_epi64(m1, m5); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_4_2(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_blend_epi32(m3, m0, 0x33); \
|
||||
t1 = _mm256_blend_epi32(m7, m2, 0x33); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_4_3(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_blend_epi32(m5, m7, 0x33); \
|
||||
t1 = _mm256_blend_epi32(m1, m3, 0x33); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_4_4(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_alignr_epi8(m6, m0, 8); \
|
||||
t1 = _mm256_blend_epi32(m6, m4, 0x33); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_5_1(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpacklo_epi64(m1, m3); \
|
||||
t1 = _mm256_unpacklo_epi64(m0, m4); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_5_2(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpacklo_epi64(m6, m5); \
|
||||
t1 = _mm256_unpackhi_epi64(m5, m1); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_5_3(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_blend_epi32(m3, m2, 0x33); \
|
||||
t1 = _mm256_unpackhi_epi64(m7, m0); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_5_4(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpackhi_epi64(m6, m2); \
|
||||
t1 = _mm256_blend_epi32(m4, m7, 0x33); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_6_1(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_blend_epi32(m0, m6, 0x33); \
|
||||
t1 = _mm256_unpacklo_epi64(m7, m2); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_6_2(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpackhi_epi64(m2, m7); \
|
||||
t1 = _mm256_alignr_epi8(m5, m6, 8); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_6_3(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpacklo_epi64(m0, m3); \
|
||||
t1 = _mm256_shuffle_epi32(m4, _MM_SHUFFLE(1, 0, 3, 2)); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_6_4(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpackhi_epi64(m3, m1); \
|
||||
t1 = _mm256_blend_epi32(m5, m1, 0x33); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_7_1(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpackhi_epi64(m6, m3); \
|
||||
t1 = _mm256_blend_epi32(m1, m6, 0x33); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_7_2(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_alignr_epi8(m7, m5, 8); \
|
||||
t1 = _mm256_unpackhi_epi64(m0, m4); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_7_3(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpackhi_epi64(m2, m7); \
|
||||
t1 = _mm256_unpacklo_epi64(m4, m1); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_7_4(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpacklo_epi64(m0, m2); \
|
||||
t1 = _mm256_unpacklo_epi64(m3, m5); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_8_1(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpacklo_epi64(m3, m7); \
|
||||
t1 = _mm256_alignr_epi8(m0, m5, 8); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_8_2(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpackhi_epi64(m7, m4); \
|
||||
t1 = _mm256_alignr_epi8(m4, m1, 8); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_8_3(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = m6; \
|
||||
t1 = _mm256_alignr_epi8(m5, m0, 8); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_8_4(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_blend_epi32(m3, m1, 0x33); \
|
||||
t1 = m2; \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_9_1(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpacklo_epi64(m5, m4); \
|
||||
t1 = _mm256_unpackhi_epi64(m3, m0); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_9_2(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpacklo_epi64(m1, m2); \
|
||||
t1 = _mm256_blend_epi32(m2, m3, 0x33); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_9_3(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpackhi_epi64(m7, m4); \
|
||||
t1 = _mm256_unpackhi_epi64(m1, m6); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_9_4(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_alignr_epi8(m7, m5, 8); \
|
||||
t1 = _mm256_unpacklo_epi64(m6, m0); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_10_1(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpacklo_epi64(m0, m1); \
|
||||
t1 = _mm256_unpacklo_epi64(m2, m3); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_10_2(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpackhi_epi64(m0, m1); \
|
||||
t1 = _mm256_unpackhi_epi64(m2, m3); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_10_3(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpacklo_epi64(m4, m5); \
|
||||
t1 = _mm256_unpacklo_epi64(m6, m7); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_10_4(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpackhi_epi64(m4, m5); \
|
||||
t1 = _mm256_unpackhi_epi64(m6, m7); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_11_1(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpacklo_epi64(m7, m2); \
|
||||
t1 = _mm256_unpackhi_epi64(m4, m6); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_11_2(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpacklo_epi64(m5, m4); \
|
||||
t1 = _mm256_alignr_epi8(m3, m7, 8); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_11_3(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_shuffle_epi32(m0, _MM_SHUFFLE(1, 0, 3, 2)); \
|
||||
t1 = _mm256_unpackhi_epi64(m5, m2); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#define BLAKE2B_LOAD_MSG_11_4(b0) \
|
||||
do \
|
||||
{ \
|
||||
t0 = _mm256_unpacklo_epi64(m6, m1); \
|
||||
t1 = _mm256_unpackhi_epi64(m3, m1); \
|
||||
b0 = _mm256_blend_epi32(t0, t1, 0xF0); \
|
||||
} while(0)
|
||||
|
||||
#endif
|
||||
|
@ -1,86 +1,89 @@
|
||||
if (bytes > 0) {
|
||||
__m128i x_0, x_1, x_2, x_3;
|
||||
__m128i t_1;
|
||||
const __m128i rot16 =
|
||||
_mm_set_epi8(13, 12, 15, 14, 9, 8, 11, 10, 5, 4, 7, 6, 1, 0, 3, 2);
|
||||
const __m128i rot8 =
|
||||
_mm_set_epi8(14, 13, 12, 15, 10, 9, 8, 11, 6, 5, 4, 7, 2, 1, 0, 3);
|
||||
uint8_t partialblock[64];
|
||||
|
||||
unsigned int i;
|
||||
|
||||
x_0 = _mm_loadu_si128((__m128i*) (x + 0));
|
||||
x_1 = _mm_loadu_si128((__m128i*) (x + 4));
|
||||
x_2 = _mm_loadu_si128((__m128i*) (x + 8));
|
||||
x_3 = _mm_loadu_si128((__m128i*) (x + 12));
|
||||
|
||||
for (i = 0; i < ROUNDS; i += 2) {
|
||||
x_0 = _mm_add_epi32(x_0, x_1);
|
||||
x_3 = _mm_xor_si128(x_3, x_0);
|
||||
x_3 = _mm_shuffle_epi8(x_3, rot16);
|
||||
|
||||
x_2 = _mm_add_epi32(x_2, x_3);
|
||||
x_1 = _mm_xor_si128(x_1, x_2);
|
||||
|
||||
t_1 = x_1;
|
||||
x_1 = _mm_slli_epi32(x_1, 12);
|
||||
t_1 = _mm_srli_epi32(t_1, 20);
|
||||
x_1 = _mm_xor_si128(x_1, t_1);
|
||||
|
||||
x_0 = _mm_add_epi32(x_0, x_1);
|
||||
x_3 = _mm_xor_si128(x_3, x_0);
|
||||
x_0 = _mm_shuffle_epi32(x_0, 0x93);
|
||||
x_3 = _mm_shuffle_epi8(x_3, rot8);
|
||||
|
||||
x_2 = _mm_add_epi32(x_2, x_3);
|
||||
x_3 = _mm_shuffle_epi32(x_3, 0x4e);
|
||||
x_1 = _mm_xor_si128(x_1, x_2);
|
||||
x_2 = _mm_shuffle_epi32(x_2, 0x39);
|
||||
|
||||
t_1 = x_1;
|
||||
x_1 = _mm_slli_epi32(x_1, 7);
|
||||
t_1 = _mm_srli_epi32(t_1, 25);
|
||||
x_1 = _mm_xor_si128(x_1, t_1);
|
||||
|
||||
x_0 = _mm_add_epi32(x_0, x_1);
|
||||
x_3 = _mm_xor_si128(x_3, x_0);
|
||||
x_3 = _mm_shuffle_epi8(x_3, rot16);
|
||||
|
||||
x_2 = _mm_add_epi32(x_2, x_3);
|
||||
x_1 = _mm_xor_si128(x_1, x_2);
|
||||
|
||||
t_1 = x_1;
|
||||
x_1 = _mm_slli_epi32(x_1, 12);
|
||||
t_1 = _mm_srli_epi32(t_1, 20);
|
||||
x_1 = _mm_xor_si128(x_1, t_1);
|
||||
|
||||
x_0 = _mm_add_epi32(x_0, x_1);
|
||||
x_3 = _mm_xor_si128(x_3, x_0);
|
||||
x_0 = _mm_shuffle_epi32(x_0, 0x39);
|
||||
x_3 = _mm_shuffle_epi8(x_3, rot8);
|
||||
|
||||
x_2 = _mm_add_epi32(x_2, x_3);
|
||||
x_3 = _mm_shuffle_epi32(x_3, 0x4e);
|
||||
x_1 = _mm_xor_si128(x_1, x_2);
|
||||
x_2 = _mm_shuffle_epi32(x_2, 0x93);
|
||||
|
||||
t_1 = x_1;
|
||||
x_1 = _mm_slli_epi32(x_1, 7);
|
||||
t_1 = _mm_srli_epi32(t_1, 25);
|
||||
x_1 = _mm_xor_si128(x_1, t_1);
|
||||
}
|
||||
x_0 = _mm_add_epi32(x_0, _mm_loadu_si128((__m128i*) (x + 0)));
|
||||
x_1 = _mm_add_epi32(x_1, _mm_loadu_si128((__m128i*) (x + 4)));
|
||||
x_2 = _mm_add_epi32(x_2, _mm_loadu_si128((__m128i*) (x + 8)));
|
||||
x_3 = _mm_add_epi32(x_3, _mm_loadu_si128((__m128i*) (x + 12)));
|
||||
_mm_storeu_si128((__m128i*) (partialblock + 0), x_0);
|
||||
_mm_storeu_si128((__m128i*) (partialblock + 16), x_1);
|
||||
_mm_storeu_si128((__m128i*) (partialblock + 32), x_2);
|
||||
_mm_storeu_si128((__m128i*) (partialblock + 48), x_3);
|
||||
|
||||
for (i = 0; i < bytes; i++) {
|
||||
c[i] = m[i] ^ partialblock[i];
|
||||
}
|
||||
|
||||
sodium_memzero(partialblock, sizeof partialblock);
|
||||
if(bytes > 0)
|
||||
{
|
||||
__m128i x_0, x_1, x_2, x_3;
|
||||
__m128i t_1;
|
||||
const __m128i rot16 =
|
||||
_mm_set_epi8(13, 12, 15, 14, 9, 8, 11, 10, 5, 4, 7, 6, 1, 0, 3, 2);
|
||||
const __m128i rot8 =
|
||||
_mm_set_epi8(14, 13, 12, 15, 10, 9, 8, 11, 6, 5, 4, 7, 2, 1, 0, 3);
|
||||
uint8_t partialblock[64];
|
||||
|
||||
unsigned int i;
|
||||
|
||||
x_0 = _mm_loadu_si128((__m128i*)(x + 0));
|
||||
x_1 = _mm_loadu_si128((__m128i*)(x + 4));
|
||||
x_2 = _mm_loadu_si128((__m128i*)(x + 8));
|
||||
x_3 = _mm_loadu_si128((__m128i*)(x + 12));
|
||||
|
||||
for(i = 0; i < ROUNDS; i += 2)
|
||||
{
|
||||
x_0 = _mm_add_epi32(x_0, x_1);
|
||||
x_3 = _mm_xor_si128(x_3, x_0);
|
||||
x_3 = _mm_shuffle_epi8(x_3, rot16);
|
||||
|
||||
x_2 = _mm_add_epi32(x_2, x_3);
|
||||
x_1 = _mm_xor_si128(x_1, x_2);
|
||||
|
||||
t_1 = x_1;
|
||||
x_1 = _mm_slli_epi32(x_1, 12);
|
||||
t_1 = _mm_srli_epi32(t_1, 20);
|
||||
x_1 = _mm_xor_si128(x_1, t_1);
|
||||
|
||||
x_0 = _mm_add_epi32(x_0, x_1);
|
||||
x_3 = _mm_xor_si128(x_3, x_0);
|
||||
x_0 = _mm_shuffle_epi32(x_0, 0x93);
|
||||
x_3 = _mm_shuffle_epi8(x_3, rot8);
|
||||
|
||||
x_2 = _mm_add_epi32(x_2, x_3);
|
||||
x_3 = _mm_shuffle_epi32(x_3, 0x4e);
|
||||
x_1 = _mm_xor_si128(x_1, x_2);
|
||||
x_2 = _mm_shuffle_epi32(x_2, 0x39);
|
||||
|
||||
t_1 = x_1;
|
||||
x_1 = _mm_slli_epi32(x_1, 7);
|
||||
t_1 = _mm_srli_epi32(t_1, 25);
|
||||
x_1 = _mm_xor_si128(x_1, t_1);
|
||||
|
||||
x_0 = _mm_add_epi32(x_0, x_1);
|
||||
x_3 = _mm_xor_si128(x_3, x_0);
|
||||
x_3 = _mm_shuffle_epi8(x_3, rot16);
|
||||
|
||||
x_2 = _mm_add_epi32(x_2, x_3);
|
||||
x_1 = _mm_xor_si128(x_1, x_2);
|
||||
|
||||
t_1 = x_1;
|
||||
x_1 = _mm_slli_epi32(x_1, 12);
|
||||
t_1 = _mm_srli_epi32(t_1, 20);
|
||||
x_1 = _mm_xor_si128(x_1, t_1);
|
||||
|
||||
x_0 = _mm_add_epi32(x_0, x_1);
|
||||
x_3 = _mm_xor_si128(x_3, x_0);
|
||||
x_0 = _mm_shuffle_epi32(x_0, 0x39);
|
||||
x_3 = _mm_shuffle_epi8(x_3, rot8);
|
||||
|
||||
x_2 = _mm_add_epi32(x_2, x_3);
|
||||
x_3 = _mm_shuffle_epi32(x_3, 0x4e);
|
||||
x_1 = _mm_xor_si128(x_1, x_2);
|
||||
x_2 = _mm_shuffle_epi32(x_2, 0x93);
|
||||
|
||||
t_1 = x_1;
|
||||
x_1 = _mm_slli_epi32(x_1, 7);
|
||||
t_1 = _mm_srli_epi32(t_1, 25);
|
||||
x_1 = _mm_xor_si128(x_1, t_1);
|
||||
}
|
||||
x_0 = _mm_add_epi32(x_0, _mm_loadu_si128((__m128i*)(x + 0)));
|
||||
x_1 = _mm_add_epi32(x_1, _mm_loadu_si128((__m128i*)(x + 4)));
|
||||
x_2 = _mm_add_epi32(x_2, _mm_loadu_si128((__m128i*)(x + 8)));
|
||||
x_3 = _mm_add_epi32(x_3, _mm_loadu_si128((__m128i*)(x + 12)));
|
||||
_mm_storeu_si128((__m128i*)(partialblock + 0), x_0);
|
||||
_mm_storeu_si128((__m128i*)(partialblock + 16), x_1);
|
||||
_mm_storeu_si128((__m128i*)(partialblock + 32), x_2);
|
||||
_mm_storeu_si128((__m128i*)(partialblock + 48), x_3);
|
||||
|
||||
for(i = 0; i < bytes; i++)
|
||||
{
|
||||
c[i] = m[i] ^ partialblock[i];
|
||||
}
|
||||
|
||||
sodium_memzero(partialblock, sizeof partialblock);
|
||||
}
|
||||
|
@ -1,98 +1,101 @@
|
||||
while (bytes >= 64) {
|
||||
__m128i x_0, x_1, x_2, x_3;
|
||||
__m128i t_1;
|
||||
const __m128i rot16 =
|
||||
_mm_set_epi8(13, 12, 15, 14, 9, 8, 11, 10, 5, 4, 7, 6, 1, 0, 3, 2);
|
||||
const __m128i rot8 =
|
||||
_mm_set_epi8(14, 13, 12, 15, 10, 9, 8, 11, 6, 5, 4, 7, 2, 1, 0, 3);
|
||||
|
||||
uint32_t in12;
|
||||
uint32_t in13;
|
||||
int i;
|
||||
|
||||
x_0 = _mm_loadu_si128((__m128i*) (x + 0));
|
||||
x_1 = _mm_loadu_si128((__m128i*) (x + 4));
|
||||
x_2 = _mm_loadu_si128((__m128i*) (x + 8));
|
||||
x_3 = _mm_loadu_si128((__m128i*) (x + 12));
|
||||
|
||||
for (i = 0; i < ROUNDS; i += 2) {
|
||||
x_0 = _mm_add_epi32(x_0, x_1);
|
||||
x_3 = _mm_xor_si128(x_3, x_0);
|
||||
x_3 = _mm_shuffle_epi8(x_3, rot16);
|
||||
|
||||
x_2 = _mm_add_epi32(x_2, x_3);
|
||||
x_1 = _mm_xor_si128(x_1, x_2);
|
||||
|
||||
t_1 = x_1;
|
||||
x_1 = _mm_slli_epi32(x_1, 12);
|
||||
t_1 = _mm_srli_epi32(t_1, 20);
|
||||
x_1 = _mm_xor_si128(x_1, t_1);
|
||||
|
||||
x_0 = _mm_add_epi32(x_0, x_1);
|
||||
x_3 = _mm_xor_si128(x_3, x_0);
|
||||
x_0 = _mm_shuffle_epi32(x_0, 0x93);
|
||||
x_3 = _mm_shuffle_epi8(x_3, rot8);
|
||||
|
||||
x_2 = _mm_add_epi32(x_2, x_3);
|
||||
x_3 = _mm_shuffle_epi32(x_3, 0x4e);
|
||||
x_1 = _mm_xor_si128(x_1, x_2);
|
||||
x_2 = _mm_shuffle_epi32(x_2, 0x39);
|
||||
|
||||
t_1 = x_1;
|
||||
x_1 = _mm_slli_epi32(x_1, 7);
|
||||
t_1 = _mm_srli_epi32(t_1, 25);
|
||||
x_1 = _mm_xor_si128(x_1, t_1);
|
||||
|
||||
x_0 = _mm_add_epi32(x_0, x_1);
|
||||
x_3 = _mm_xor_si128(x_3, x_0);
|
||||
x_3 = _mm_shuffle_epi8(x_3, rot16);
|
||||
|
||||
x_2 = _mm_add_epi32(x_2, x_3);
|
||||
x_1 = _mm_xor_si128(x_1, x_2);
|
||||
|
||||
t_1 = x_1;
|
||||
x_1 = _mm_slli_epi32(x_1, 12);
|
||||
t_1 = _mm_srli_epi32(t_1, 20);
|
||||
x_1 = _mm_xor_si128(x_1, t_1);
|
||||
|
||||
x_0 = _mm_add_epi32(x_0, x_1);
|
||||
x_3 = _mm_xor_si128(x_3, x_0);
|
||||
x_0 = _mm_shuffle_epi32(x_0, 0x39);
|
||||
x_3 = _mm_shuffle_epi8(x_3, rot8);
|
||||
|
||||
x_2 = _mm_add_epi32(x_2, x_3);
|
||||
x_3 = _mm_shuffle_epi32(x_3, 0x4e);
|
||||
x_1 = _mm_xor_si128(x_1, x_2);
|
||||
x_2 = _mm_shuffle_epi32(x_2, 0x93);
|
||||
|
||||
t_1 = x_1;
|
||||
x_1 = _mm_slli_epi32(x_1, 7);
|
||||
t_1 = _mm_srli_epi32(t_1, 25);
|
||||
x_1 = _mm_xor_si128(x_1, t_1);
|
||||
}
|
||||
x_0 = _mm_add_epi32(x_0, _mm_loadu_si128((__m128i*) (x + 0)));
|
||||
x_1 = _mm_add_epi32(x_1, _mm_loadu_si128((__m128i*) (x + 4)));
|
||||
x_2 = _mm_add_epi32(x_2, _mm_loadu_si128((__m128i*) (x + 8)));
|
||||
x_3 = _mm_add_epi32(x_3, _mm_loadu_si128((__m128i*) (x + 12)));
|
||||
x_0 = _mm_xor_si128(x_0, _mm_loadu_si128((__m128i*) (m + 0)));
|
||||
x_1 = _mm_xor_si128(x_1, _mm_loadu_si128((__m128i*) (m + 16)));
|
||||
x_2 = _mm_xor_si128(x_2, _mm_loadu_si128((__m128i*) (m + 32)));
|
||||
x_3 = _mm_xor_si128(x_3, _mm_loadu_si128((__m128i*) (m + 48)));
|
||||
_mm_storeu_si128((__m128i*) (c + 0), x_0);
|
||||
_mm_storeu_si128((__m128i*) (c + 16), x_1);
|
||||
_mm_storeu_si128((__m128i*) (c + 32), x_2);
|
||||
_mm_storeu_si128((__m128i*) (c + 48), x_3);
|
||||
|
||||
in12 = x[12];
|
||||
in13 = x[13];
|
||||
in12++;
|
||||
if (in12 == 0) {
|
||||
in13++;
|
||||
}
|
||||
x[12] = in12;
|
||||
x[13] = in13;
|
||||
|
||||
bytes -= 64;
|
||||
c += 64;
|
||||
m += 64;
|
||||
while(bytes >= 64)
|
||||
{
|
||||
__m128i x_0, x_1, x_2, x_3;
|
||||
__m128i t_1;
|
||||
const __m128i rot16 =
|
||||
_mm_set_epi8(13, 12, 15, 14, 9, 8, 11, 10, 5, 4, 7, 6, 1, 0, 3, 2);
|
||||
const __m128i rot8 =
|
||||
_mm_set_epi8(14, 13, 12, 15, 10, 9, 8, 11, 6, 5, 4, 7, 2, 1, 0, 3);
|
||||
|
||||
uint32_t in12;
|
||||
uint32_t in13;
|
||||
int i;
|
||||
|
||||
x_0 = _mm_loadu_si128((__m128i*)(x + 0));
|
||||
x_1 = _mm_loadu_si128((__m128i*)(x + 4));
|
||||
x_2 = _mm_loadu_si128((__m128i*)(x + 8));
|
||||
x_3 = _mm_loadu_si128((__m128i*)(x + 12));
|
||||
|
||||
for(i = 0; i < ROUNDS; i += 2)
|
||||
{
|
||||
x_0 = _mm_add_epi32(x_0, x_1);
|
||||
x_3 = _mm_xor_si128(x_3, x_0);
|
||||
x_3 = _mm_shuffle_epi8(x_3, rot16);
|
||||
|
||||
x_2 = _mm_add_epi32(x_2, x_3);
|
||||
x_1 = _mm_xor_si128(x_1, x_2);
|
||||
|
||||
t_1 = x_1;
|
||||
x_1 = _mm_slli_epi32(x_1, 12);
|
||||
t_1 = _mm_srli_epi32(t_1, 20);
|
||||
x_1 = _mm_xor_si128(x_1, t_1);
|
||||
|
||||
x_0 = _mm_add_epi32(x_0, x_1);
|
||||
x_3 = _mm_xor_si128(x_3, x_0);
|
||||
x_0 = _mm_shuffle_epi32(x_0, 0x93);
|
||||
x_3 = _mm_shuffle_epi8(x_3, rot8);
|
||||
|
||||
x_2 = _mm_add_epi32(x_2, x_3);
|
||||
x_3 = _mm_shuffle_epi32(x_3, 0x4e);
|
||||
x_1 = _mm_xor_si128(x_1, x_2);
|
||||
x_2 = _mm_shuffle_epi32(x_2, 0x39);
|
||||
|
||||
t_1 = x_1;
|
||||
x_1 = _mm_slli_epi32(x_1, 7);
|
||||
t_1 = _mm_srli_epi32(t_1, 25);
|
||||
x_1 = _mm_xor_si128(x_1, t_1);
|
||||
|
||||
x_0 = _mm_add_epi32(x_0, x_1);
|
||||
x_3 = _mm_xor_si128(x_3, x_0);
|
||||
x_3 = _mm_shuffle_epi8(x_3, rot16);
|
||||
|
||||
x_2 = _mm_add_epi32(x_2, x_3);
|
||||
x_1 = _mm_xor_si128(x_1, x_2);
|
||||
|
||||
t_1 = x_1;
|
||||
x_1 = _mm_slli_epi32(x_1, 12);
|
||||
t_1 = _mm_srli_epi32(t_1, 20);
|
||||
x_1 = _mm_xor_si128(x_1, t_1);
|
||||
|
||||
x_0 = _mm_add_epi32(x_0, x_1);
|
||||
x_3 = _mm_xor_si128(x_3, x_0);
|
||||
x_0 = _mm_shuffle_epi32(x_0, 0x39);
|
||||
x_3 = _mm_shuffle_epi8(x_3, rot8);
|
||||
|
||||
x_2 = _mm_add_epi32(x_2, x_3);
|
||||
x_3 = _mm_shuffle_epi32(x_3, 0x4e);
|
||||
x_1 = _mm_xor_si128(x_1, x_2);
|
||||
x_2 = _mm_shuffle_epi32(x_2, 0x93);
|
||||
|
||||
t_1 = x_1;
|
||||
x_1 = _mm_slli_epi32(x_1, 7);
|
||||
t_1 = _mm_srli_epi32(t_1, 25);
|
||||
x_1 = _mm_xor_si128(x_1, t_1);
|
||||
}
|
||||
x_0 = _mm_add_epi32(x_0, _mm_loadu_si128((__m128i*)(x + 0)));
|
||||
x_1 = _mm_add_epi32(x_1, _mm_loadu_si128((__m128i*)(x + 4)));
|
||||
x_2 = _mm_add_epi32(x_2, _mm_loadu_si128((__m128i*)(x + 8)));
|
||||
x_3 = _mm_add_epi32(x_3, _mm_loadu_si128((__m128i*)(x + 12)));
|
||||
x_0 = _mm_xor_si128(x_0, _mm_loadu_si128((__m128i*)(m + 0)));
|
||||
x_1 = _mm_xor_si128(x_1, _mm_loadu_si128((__m128i*)(m + 16)));
|
||||
x_2 = _mm_xor_si128(x_2, _mm_loadu_si128((__m128i*)(m + 32)));
|
||||
x_3 = _mm_xor_si128(x_3, _mm_loadu_si128((__m128i*)(m + 48)));
|
||||
_mm_storeu_si128((__m128i*)(c + 0), x_0);
|
||||
_mm_storeu_si128((__m128i*)(c + 16), x_1);
|
||||
_mm_storeu_si128((__m128i*)(c + 32), x_2);
|
||||
_mm_storeu_si128((__m128i*)(c + 48), x_3);
|
||||
|
||||
in12 = x[12];
|
||||
in13 = x[13];
|
||||
in12++;
|
||||
if(in12 == 0)
|
||||
{
|
||||
in13++;
|
||||
}
|
||||
x[12] = in12;
|
||||
x[13] = in13;
|
||||
|
||||
bytes -= 64;
|
||||
c += 64;
|
||||
m += 64;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,40 +1,52 @@
|
||||
{
|
||||
{ 25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605 },
|
||||
{ -12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378 },
|
||||
{ -8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546 }
|
||||
},
|
||||
{
|
||||
{ 15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024 },
|
||||
{ 16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574 },
|
||||
{ 30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357 }
|
||||
},
|
||||
{
|
||||
{ 10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380 },
|
||||
{ 4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306 },
|
||||
{ 19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942 }
|
||||
},
|
||||
{
|
||||
{ 5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766 },
|
||||
{ -30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701 },
|
||||
{ 28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300 }
|
||||
},
|
||||
{
|
||||
{ -22518993, -6692182, 14201702, -8745502, -23510406, 8844726, 18474211, -1361450, -13062696, 13821877 },
|
||||
{ -6455177, -7839871, 3374702, -4740862, -27098617, -10571707, 31655028, -7212327, 18853322, -14220951 },
|
||||
{ 4566830, -12963868, -28974889, -12240689, -7602672, -2830569, -8514358, -10431137, 2207753, -3209784 }
|
||||
},
|
||||
{
|
||||
{ -25154831, -4185821, 29681144, 7868801, -6854661, -9423865, -12437364, -663000, -31111463, -16132436 },
|
||||
{ 25576264, -2703214, 7349804, -11814844, 16472782, 9300885, 3844789, 15725684, 171356, 6466918 },
|
||||
{ 23103977, 13316479, 9739013, -16149481, 817875, -15038942, 8965339, -14088058, -30714912, 16193877 }
|
||||
},
|
||||
{
|
||||
{ -33521811, 3180713, -2394130, 14003687, -16903474, -16270840, 17238398, 4729455, -18074513, 9256800 },
|
||||
{ -25182317, -4174131, 32336398, 5036987, -21236817, 11360617, 22616405, 9761698, -19827198, 630305 },
|
||||
{ -13720693, 2639453, -24237460, -7406481, 9494427, -5774029, -6554551, -15960994, -2449256, -14291300 }
|
||||
},
|
||||
{
|
||||
{ -3151181, -5046075, 9282714, 6866145, -31907062, -863023, -18940575, 15033784, 25105118, -7894876 },
|
||||
{ -24326370, 15950226, -31801215, -14592823, -11662737, -5090925, 1573892, -2625887, 2198790, -15804619 },
|
||||
{ -3099351, 10324967, -2241613, 7453183, -5446979, -2735503, -13812022, -16236442, -32461234, -12290683 }
|
||||
{{25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626,
|
||||
-11754271, -6079156, 2047605},
|
||||
{-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384,
|
||||
19500929, -15469378},
|
||||
{-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919,
|
||||
11864899, -24514362, -4438546}},
|
||||
{{15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600,
|
||||
-14772189, 28944400, -1550024},
|
||||
{16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577,
|
||||
-11775962, 7689662, 11199574},
|
||||
{30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774,
|
||||
10017326, -17749093, -9920357}},
|
||||
{{10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885,
|
||||
14515107, -15438304, 10819380},
|
||||
{4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668,
|
||||
12483688, -12668491, 5581306},
|
||||
{19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350,
|
||||
13850243, -23678021, -15815942}},
|
||||
{{5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134,
|
||||
-23952439, -15175766},
|
||||
{-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025,
|
||||
16520125, 30598449, 7715701},
|
||||
{28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660,
|
||||
1370708, 29794553, -1409300}},
|
||||
{{-22518993, -6692182, 14201702, -8745502, -23510406, 8844726, 18474211,
|
||||
-1361450, -13062696, 13821877},
|
||||
{-6455177, -7839871, 3374702, -4740862, -27098617, -10571707, 31655028,
|
||||
-7212327, 18853322, -14220951},
|
||||
{4566830, -12963868, -28974889, -12240689, -7602672, -2830569, -8514358,
|
||||
-10431137, 2207753, -3209784}},
|
||||
{{-25154831, -4185821, 29681144, 7868801, -6854661, -9423865, -12437364,
|
||||
-663000, -31111463, -16132436},
|
||||
{25576264, -2703214, 7349804, -11814844, 16472782, 9300885, 3844789,
|
||||
15725684, 171356, 6466918},
|
||||
{23103977, 13316479, 9739013, -16149481, 817875, -15038942, 8965339,
|
||||
-14088058, -30714912, 16193877}},
|
||||
{{-33521811, 3180713, -2394130, 14003687, -16903474, -16270840, 17238398,
|
||||
4729455, -18074513, 9256800},
|
||||
{-25182317, -4174131, 32336398, 5036987, -21236817, 11360617, 22616405,
|
||||
9761698, -19827198, 630305},
|
||||
{-13720693, 2639453, -24237460, -7406481, 9494427, -5774029, -6554551,
|
||||
-15960994, -2449256, -14291300}},
|
||||
{
|
||||
{-3151181, -5046075, 9282714, 6866145, -31907062,
|
||||
-863023, -18940575, 15033784, 25105118, -7894876},
|
||||
{-24326370, 15950226, -31801215, -14592823, -11662737,
|
||||
-5090925, 1573892, -2625887, 2198790, -15804619},
|
||||
{
|
||||
-3099351, 10324967, -2241613, 7453183, -5446979, -2735503, -13812022,
|
||||
-16236442, -32461234, -12290683
|
||||
}
|
||||
}
|
||||
|
@ -1,20 +1,18 @@
|
||||
/* 37095705934669439343138083508754565189542113879843219016388785533085940283555 */
|
||||
static const fe25519 d = {
|
||||
-10913610, 13857413, -15372611, 6949391, 114729, -8787816, -6275908, -3247719, -18696448, -12055116
|
||||
};
|
||||
/* 37095705934669439343138083508754565189542113879843219016388785533085940283555
|
||||
*/
|
||||
static const fe25519 d = {-10913610, 13857413, -15372611, 6949391, 114729,
|
||||
-8787816, -6275908, -3247719, -18696448, -12055116};
|
||||
|
||||
/* 2 * d =
|
||||
* 16295367250680780974490674513165176452449235426866156013048779062215315747161
|
||||
*/
|
||||
static const fe25519 d2 = {
|
||||
-21827239, -5839606, -30745221, 13898782, 229458, 15978800, -12551817, -6495438, 29715968, 9444199 };
|
||||
static const fe25519 d2 = {-21827239, -5839606, -30745221, 13898782, 229458,
|
||||
15978800, -12551817, -6495438, 29715968, 9444199};
|
||||
|
||||
/* sqrt(-1) */
|
||||
static const fe25519 sqrtm1 = {
|
||||
-32595792, -7943725, 9377950, 3500415, 12389472, -272473, -25146209, -2005654, 326686, 11406482
|
||||
};
|
||||
static const fe25519 sqrtm1 = {-32595792, -7943725, 9377950, 3500415,
|
||||
12389472, -272473, -25146209, -2005654,
|
||||
326686, 11406482};
|
||||
|
||||
/* A = 486662 */
|
||||
static const fe25519 curve25519_A = {
|
||||
486662, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
static const fe25519 curve25519_A = {486662, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
|
@ -1,18 +1,17 @@
|
||||
#ifndef sign_ed25519_ref10_H
|
||||
#define sign_ed25519_ref10_H
|
||||
|
||||
void _crypto_sign_ed25519_ref10_hinit(crypto_hash_sha512_state *hs,
|
||||
int prehashed);
|
||||
void
|
||||
_crypto_sign_ed25519_ref10_hinit(crypto_hash_sha512_state *hs, int prehashed);
|
||||
|
||||
int _crypto_sign_ed25519_detached(unsigned char *sig,
|
||||
unsigned long long *siglen_p,
|
||||
const unsigned char *m,
|
||||
unsigned long long mlen,
|
||||
const unsigned char *sk, int prehashed);
|
||||
int
|
||||
_crypto_sign_ed25519_detached(unsigned char *sig, unsigned long long *siglen_p,
|
||||
const unsigned char *m, unsigned long long mlen,
|
||||
const unsigned char *sk, int prehashed);
|
||||
|
||||
int _crypto_sign_ed25519_verify_detached(const unsigned char *sig,
|
||||
const unsigned char *m,
|
||||
unsigned long long mlen,
|
||||
const unsigned char *pk,
|
||||
int prehashed);
|
||||
int
|
||||
_crypto_sign_ed25519_verify_detached(const unsigned char *sig,
|
||||
const unsigned char *m,
|
||||
unsigned long long mlen,
|
||||
const unsigned char *pk, int prehashed);
|
||||
#endif
|
||||
|
@ -1,12 +1,22 @@
|
||||
|
||||
int crypto_kem_enc_ref(unsigned char *cstr, unsigned char *k, const unsigned char *pk);
|
||||
|
||||
int crypto_kem_dec_ref(unsigned char *k, const unsigned char *cstr, const unsigned char *sk);
|
||||
int
|
||||
crypto_kem_enc_ref(unsigned char *cstr, unsigned char *k,
|
||||
const unsigned char *pk);
|
||||
|
||||
int crypto_kem_keypair_ref(unsigned char *pk, unsigned char * sk);
|
||||
int
|
||||
crypto_kem_dec_ref(unsigned char *k, const unsigned char *cstr,
|
||||
const unsigned char *sk);
|
||||
|
||||
int crypto_kem_enc_avx2(unsigned char *cstr, unsigned char *k, const unsigned char *pk);
|
||||
|
||||
int crypto_kem_dec_avx2(unsigned char *k, const unsigned char *cstr, const unsigned char *sk);
|
||||
int
|
||||
crypto_kem_keypair_ref(unsigned char *pk, unsigned char *sk);
|
||||
|
||||
int crypto_kem_keypair_avx2(unsigned char *pk, unsigned char * sk);
|
||||
int
|
||||
crypto_kem_enc_avx2(unsigned char *cstr, unsigned char *k,
|
||||
const unsigned char *pk);
|
||||
|
||||
int
|
||||
crypto_kem_dec_avx2(unsigned char *k, const unsigned char *cstr,
|
||||
const unsigned char *sk);
|
||||
|
||||
int
|
||||
crypto_kem_keypair_avx2(unsigned char *pk, unsigned char *sk);
|
||||
|
@ -1,11 +1,17 @@
|
||||
#ifndef implementations_H
|
||||
#define implementations_H
|
||||
|
||||
int _crypto_generichash_blake2b_pick_best_implementation(void);
|
||||
int _crypto_onetimeauth_poly1305_pick_best_implementation(void);
|
||||
int _crypto_pwhash_argon2_pick_best_implementation(void);
|
||||
int _crypto_scalarmult_curve25519_pick_best_implementation(void);
|
||||
int _crypto_stream_chacha20_pick_best_implementation(void);
|
||||
int _crypto_stream_salsa20_pick_best_implementation(void);
|
||||
int
|
||||
_crypto_generichash_blake2b_pick_best_implementation(void);
|
||||
int
|
||||
_crypto_onetimeauth_poly1305_pick_best_implementation(void);
|
||||
int
|
||||
_crypto_pwhash_argon2_pick_best_implementation(void);
|
||||
int
|
||||
_crypto_scalarmult_curve25519_pick_best_implementation(void);
|
||||
int
|
||||
_crypto_stream_chacha20_pick_best_implementation(void);
|
||||
int
|
||||
_crypto_stream_salsa20_pick_best_implementation(void);
|
||||
|
||||
#endif
|
||||
|
@ -1,7 +1,9 @@
|
||||
#ifndef mutex_H
|
||||
#define mutex_H 1
|
||||
|
||||
extern int sodium_crit_enter(void);
|
||||
extern int sodium_crit_leave(void);
|
||||
extern int
|
||||
sodium_crit_enter(void);
|
||||
extern int
|
||||
sodium_crit_leave(void);
|
||||
|
||||
#endif
|
||||
|
@ -1,30 +1,34 @@
|
||||
#include "params.h"
|
||||
#include "rq.h"
|
||||
|
||||
void rq_mult(modq *h,const modq *f,const small *g)
|
||||
void
|
||||
rq_mult(modq *h, const modq *f, const small *g)
|
||||
{
|
||||
modq fg[p + p - 1];
|
||||
modq result;
|
||||
int i, j;
|
||||
|
||||
for (i = 0;i < p;++i) {
|
||||
for(i = 0; i < p; ++i)
|
||||
{
|
||||
result = 0;
|
||||
for (j = 0;j <= i;++j)
|
||||
result = modq_plusproduct(result,f[j],g[i - j]);
|
||||
for(j = 0; j <= i; ++j)
|
||||
result = modq_plusproduct(result, f[j], g[i - j]);
|
||||
fg[i] = result;
|
||||
}
|
||||
for (i = p;i < p + p - 1;++i) {
|
||||
for(i = p; i < p + p - 1; ++i)
|
||||
{
|
||||
result = 0;
|
||||
for (j = i - p + 1;j < p;++j)
|
||||
result = modq_plusproduct(result,f[j],g[i - j]);
|
||||
for(j = i - p + 1; j < p; ++j)
|
||||
result = modq_plusproduct(result, f[j], g[i - j]);
|
||||
fg[i] = result;
|
||||
}
|
||||
|
||||
for (i = p + p - 2;i >= p;--i) {
|
||||
fg[i - p] = modq_sum(fg[i - p],fg[i]);
|
||||
fg[i - p + 1] = modq_sum(fg[i - p + 1],fg[i]);
|
||||
for(i = p + p - 2; i >= p; --i)
|
||||
{
|
||||
fg[i - p] = modq_sum(fg[i - p], fg[i]);
|
||||
fg[i - p + 1] = modq_sum(fg[i - p + 1], fg[i]);
|
||||
}
|
||||
|
||||
for (i = 0;i < p;++i)
|
||||
for(i = 0; i < p; ++i)
|
||||
h[i] = fg[i];
|
||||
}
|
||||
|
@ -1,10 +1,11 @@
|
||||
#include "params.h"
|
||||
#include "rq.h"
|
||||
|
||||
void rq_round3(modq *h,const modq *f)
|
||||
void
|
||||
rq_round3(modq *h, const modq *f)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0;i < p;++i)
|
||||
for(i = 0; i < p; ++i)
|
||||
h[i] = ((21846 * (f[i] + 2295) + 32768) >> 16) * 3 - 2295;
|
||||
}
|
||||
|
@ -1,19 +1,21 @@
|
||||
#include "swap.h"
|
||||
|
||||
void swap(void *x,void *y,int bytes,int mask)
|
||||
void
|
||||
swap(void *x, void *y, int bytes, int mask)
|
||||
{
|
||||
int i;
|
||||
char xi, yi, c, t;
|
||||
|
||||
c = mask;
|
||||
|
||||
for (i = 0;i < bytes;++i) {
|
||||
xi = i[(char *) x];
|
||||
yi = i[(char *) y];
|
||||
t = c & (xi ^ yi);
|
||||
|
||||
for(i = 0; i < bytes; ++i)
|
||||
{
|
||||
xi = i[(char *)x];
|
||||
yi = i[(char *)y];
|
||||
t = c & (xi ^ yi);
|
||||
xi ^= t;
|
||||
yi ^= t;
|
||||
i[(char *) x] = xi;
|
||||
i[(char *) y] = yi;
|
||||
i[(char *)x] = xi;
|
||||
i[(char *)y] = yi;
|
||||
}
|
||||
}
|
||||
|
@ -1,195 +1,199 @@
|
||||
if (bytes > 0) {
|
||||
__m128i diag0 = _mm_loadu_si128((__m128i *) (x + 0));
|
||||
__m128i diag1 = _mm_loadu_si128((__m128i *) (x + 4));
|
||||
__m128i diag2 = _mm_loadu_si128((__m128i *) (x + 8));
|
||||
__m128i diag3 = _mm_loadu_si128((__m128i *) (x + 12));
|
||||
__m128i a0, a1, a2, a3, a4, a5, a6, a7;
|
||||
__m128i b0, b1, b2, b3, b4, b5, b6, b7;
|
||||
uint8_t partialblock[64];
|
||||
|
||||
unsigned int i;
|
||||
|
||||
a0 = diag1;
|
||||
for (i = 0; i < ROUNDS; i += 4) {
|
||||
a0 = _mm_add_epi32(a0, diag0);
|
||||
a1 = diag0;
|
||||
b0 = a0;
|
||||
a0 = _mm_slli_epi32(a0, 7);
|
||||
b0 = _mm_srli_epi32(b0, 25);
|
||||
diag3 = _mm_xor_si128(diag3, a0);
|
||||
|
||||
diag3 = _mm_xor_si128(diag3, b0);
|
||||
|
||||
a1 = _mm_add_epi32(a1, diag3);
|
||||
a2 = diag3;
|
||||
b1 = a1;
|
||||
a1 = _mm_slli_epi32(a1, 9);
|
||||
b1 = _mm_srli_epi32(b1, 23);
|
||||
diag2 = _mm_xor_si128(diag2, a1);
|
||||
diag3 = _mm_shuffle_epi32(diag3, 0x93);
|
||||
diag2 = _mm_xor_si128(diag2, b1);
|
||||
|
||||
a2 = _mm_add_epi32(a2, diag2);
|
||||
a3 = diag2;
|
||||
b2 = a2;
|
||||
a2 = _mm_slli_epi32(a2, 13);
|
||||
b2 = _mm_srli_epi32(b2, 19);
|
||||
diag1 = _mm_xor_si128(diag1, a2);
|
||||
diag2 = _mm_shuffle_epi32(diag2, 0x4e);
|
||||
diag1 = _mm_xor_si128(diag1, b2);
|
||||
|
||||
a3 = _mm_add_epi32(a3, diag1);
|
||||
a4 = diag3;
|
||||
b3 = a3;
|
||||
a3 = _mm_slli_epi32(a3, 18);
|
||||
b3 = _mm_srli_epi32(b3, 14);
|
||||
diag0 = _mm_xor_si128(diag0, a3);
|
||||
diag1 = _mm_shuffle_epi32(diag1, 0x39);
|
||||
diag0 = _mm_xor_si128(diag0, b3);
|
||||
|
||||
a4 = _mm_add_epi32(a4, diag0);
|
||||
a5 = diag0;
|
||||
b4 = a4;
|
||||
a4 = _mm_slli_epi32(a4, 7);
|
||||
b4 = _mm_srli_epi32(b4, 25);
|
||||
diag1 = _mm_xor_si128(diag1, a4);
|
||||
|
||||
diag1 = _mm_xor_si128(diag1, b4);
|
||||
|
||||
a5 = _mm_add_epi32(a5, diag1);
|
||||
a6 = diag1;
|
||||
b5 = a5;
|
||||
a5 = _mm_slli_epi32(a5, 9);
|
||||
b5 = _mm_srli_epi32(b5, 23);
|
||||
diag2 = _mm_xor_si128(diag2, a5);
|
||||
diag1 = _mm_shuffle_epi32(diag1, 0x93);
|
||||
diag2 = _mm_xor_si128(diag2, b5);
|
||||
|
||||
a6 = _mm_add_epi32(a6, diag2);
|
||||
a7 = diag2;
|
||||
b6 = a6;
|
||||
a6 = _mm_slli_epi32(a6, 13);
|
||||
b6 = _mm_srli_epi32(b6, 19);
|
||||
diag3 = _mm_xor_si128(diag3, a6);
|
||||
diag2 = _mm_shuffle_epi32(diag2, 0x4e);
|
||||
diag3 = _mm_xor_si128(diag3, b6);
|
||||
|
||||
a7 = _mm_add_epi32(a7, diag3);
|
||||
a0 = diag1;
|
||||
b7 = a7;
|
||||
a7 = _mm_slli_epi32(a7, 18);
|
||||
b7 = _mm_srli_epi32(b7, 14);
|
||||
diag0 = _mm_xor_si128(diag0, a7);
|
||||
diag3 = _mm_shuffle_epi32(diag3, 0x39);
|
||||
diag0 = _mm_xor_si128(diag0, b7);
|
||||
|
||||
a0 = _mm_add_epi32(a0, diag0);
|
||||
a1 = diag0;
|
||||
b0 = a0;
|
||||
a0 = _mm_slli_epi32(a0, 7);
|
||||
b0 = _mm_srli_epi32(b0, 25);
|
||||
diag3 = _mm_xor_si128(diag3, a0);
|
||||
|
||||
diag3 = _mm_xor_si128(diag3, b0);
|
||||
|
||||
a1 = _mm_add_epi32(a1, diag3);
|
||||
a2 = diag3;
|
||||
b1 = a1;
|
||||
a1 = _mm_slli_epi32(a1, 9);
|
||||
b1 = _mm_srli_epi32(b1, 23);
|
||||
diag2 = _mm_xor_si128(diag2, a1);
|
||||
diag3 = _mm_shuffle_epi32(diag3, 0x93);
|
||||
diag2 = _mm_xor_si128(diag2, b1);
|
||||
|
||||
a2 = _mm_add_epi32(a2, diag2);
|
||||
a3 = diag2;
|
||||
b2 = a2;
|
||||
a2 = _mm_slli_epi32(a2, 13);
|
||||
b2 = _mm_srli_epi32(b2, 19);
|
||||
diag1 = _mm_xor_si128(diag1, a2);
|
||||
diag2 = _mm_shuffle_epi32(diag2, 0x4e);
|
||||
diag1 = _mm_xor_si128(diag1, b2);
|
||||
|
||||
a3 = _mm_add_epi32(a3, diag1);
|
||||
a4 = diag3;
|
||||
b3 = a3;
|
||||
a3 = _mm_slli_epi32(a3, 18);
|
||||
b3 = _mm_srli_epi32(b3, 14);
|
||||
diag0 = _mm_xor_si128(diag0, a3);
|
||||
diag1 = _mm_shuffle_epi32(diag1, 0x39);
|
||||
diag0 = _mm_xor_si128(diag0, b3);
|
||||
|
||||
a4 = _mm_add_epi32(a4, diag0);
|
||||
a5 = diag0;
|
||||
b4 = a4;
|
||||
a4 = _mm_slli_epi32(a4, 7);
|
||||
b4 = _mm_srli_epi32(b4, 25);
|
||||
diag1 = _mm_xor_si128(diag1, a4);
|
||||
|
||||
diag1 = _mm_xor_si128(diag1, b4);
|
||||
|
||||
a5 = _mm_add_epi32(a5, diag1);
|
||||
a6 = diag1;
|
||||
b5 = a5;
|
||||
a5 = _mm_slli_epi32(a5, 9);
|
||||
b5 = _mm_srli_epi32(b5, 23);
|
||||
diag2 = _mm_xor_si128(diag2, a5);
|
||||
diag1 = _mm_shuffle_epi32(diag1, 0x93);
|
||||
diag2 = _mm_xor_si128(diag2, b5);
|
||||
|
||||
a6 = _mm_add_epi32(a6, diag2);
|
||||
a7 = diag2;
|
||||
b6 = a6;
|
||||
a6 = _mm_slli_epi32(a6, 13);
|
||||
b6 = _mm_srli_epi32(b6, 19);
|
||||
diag3 = _mm_xor_si128(diag3, a6);
|
||||
diag2 = _mm_shuffle_epi32(diag2, 0x4e);
|
||||
diag3 = _mm_xor_si128(diag3, b6);
|
||||
|
||||
a7 = _mm_add_epi32(a7, diag3);
|
||||
a0 = diag1;
|
||||
b7 = a7;
|
||||
a7 = _mm_slli_epi32(a7, 18);
|
||||
b7 = _mm_srli_epi32(b7, 14);
|
||||
diag0 = _mm_xor_si128(diag0, a7);
|
||||
diag3 = _mm_shuffle_epi32(diag3, 0x39);
|
||||
diag0 = _mm_xor_si128(diag0, b7);
|
||||
}
|
||||
|
||||
diag0 = _mm_add_epi32(diag0, _mm_loadu_si128((__m128i *) (x + 0)));
|
||||
diag1 = _mm_add_epi32(diag1, _mm_loadu_si128((__m128i *) (x + 4)));
|
||||
diag2 = _mm_add_epi32(diag2, _mm_loadu_si128((__m128i *) (x + 8)));
|
||||
diag3 = _mm_add_epi32(diag3, _mm_loadu_si128((__m128i *) (x + 12)));
|
||||
|
||||
#define ONEQUAD_SHUFFLE(A, B, C, D) \
|
||||
do { \
|
||||
uint32_t in##A = _mm_cvtsi128_si32(diag0); \
|
||||
uint32_t in##B = _mm_cvtsi128_si32(diag1); \
|
||||
uint32_t in##C = _mm_cvtsi128_si32(diag2); \
|
||||
uint32_t in##D = _mm_cvtsi128_si32(diag3); \
|
||||
diag0 = _mm_shuffle_epi32(diag0, 0x39); \
|
||||
diag1 = _mm_shuffle_epi32(diag1, 0x39); \
|
||||
diag2 = _mm_shuffle_epi32(diag2, 0x39); \
|
||||
diag3 = _mm_shuffle_epi32(diag3, 0x39); \
|
||||
*(uint32_t *) (partialblock + (A * 4)) = in##A; \
|
||||
*(uint32_t *) (partialblock + (B * 4)) = in##B; \
|
||||
*(uint32_t *) (partialblock + (C * 4)) = in##C; \
|
||||
*(uint32_t *) (partialblock + (D * 4)) = in##D; \
|
||||
} while (0)
|
||||
if(bytes > 0)
|
||||
{
|
||||
__m128i diag0 = _mm_loadu_si128((__m128i *)(x + 0));
|
||||
__m128i diag1 = _mm_loadu_si128((__m128i *)(x + 4));
|
||||
__m128i diag2 = _mm_loadu_si128((__m128i *)(x + 8));
|
||||
__m128i diag3 = _mm_loadu_si128((__m128i *)(x + 12));
|
||||
__m128i a0, a1, a2, a3, a4, a5, a6, a7;
|
||||
__m128i b0, b1, b2, b3, b4, b5, b6, b7;
|
||||
uint8_t partialblock[64];
|
||||
|
||||
unsigned int i;
|
||||
|
||||
a0 = diag1;
|
||||
for(i = 0; i < ROUNDS; i += 4)
|
||||
{
|
||||
a0 = _mm_add_epi32(a0, diag0);
|
||||
a1 = diag0;
|
||||
b0 = a0;
|
||||
a0 = _mm_slli_epi32(a0, 7);
|
||||
b0 = _mm_srli_epi32(b0, 25);
|
||||
diag3 = _mm_xor_si128(diag3, a0);
|
||||
|
||||
diag3 = _mm_xor_si128(diag3, b0);
|
||||
|
||||
a1 = _mm_add_epi32(a1, diag3);
|
||||
a2 = diag3;
|
||||
b1 = a1;
|
||||
a1 = _mm_slli_epi32(a1, 9);
|
||||
b1 = _mm_srli_epi32(b1, 23);
|
||||
diag2 = _mm_xor_si128(diag2, a1);
|
||||
diag3 = _mm_shuffle_epi32(diag3, 0x93);
|
||||
diag2 = _mm_xor_si128(diag2, b1);
|
||||
|
||||
a2 = _mm_add_epi32(a2, diag2);
|
||||
a3 = diag2;
|
||||
b2 = a2;
|
||||
a2 = _mm_slli_epi32(a2, 13);
|
||||
b2 = _mm_srli_epi32(b2, 19);
|
||||
diag1 = _mm_xor_si128(diag1, a2);
|
||||
diag2 = _mm_shuffle_epi32(diag2, 0x4e);
|
||||
diag1 = _mm_xor_si128(diag1, b2);
|
||||
|
||||
a3 = _mm_add_epi32(a3, diag1);
|
||||
a4 = diag3;
|
||||
b3 = a3;
|
||||
a3 = _mm_slli_epi32(a3, 18);
|
||||
b3 = _mm_srli_epi32(b3, 14);
|
||||
diag0 = _mm_xor_si128(diag0, a3);
|
||||
diag1 = _mm_shuffle_epi32(diag1, 0x39);
|
||||
diag0 = _mm_xor_si128(diag0, b3);
|
||||
|
||||
a4 = _mm_add_epi32(a4, diag0);
|
||||
a5 = diag0;
|
||||
b4 = a4;
|
||||
a4 = _mm_slli_epi32(a4, 7);
|
||||
b4 = _mm_srli_epi32(b4, 25);
|
||||
diag1 = _mm_xor_si128(diag1, a4);
|
||||
|
||||
diag1 = _mm_xor_si128(diag1, b4);
|
||||
|
||||
a5 = _mm_add_epi32(a5, diag1);
|
||||
a6 = diag1;
|
||||
b5 = a5;
|
||||
a5 = _mm_slli_epi32(a5, 9);
|
||||
b5 = _mm_srli_epi32(b5, 23);
|
||||
diag2 = _mm_xor_si128(diag2, a5);
|
||||
diag1 = _mm_shuffle_epi32(diag1, 0x93);
|
||||
diag2 = _mm_xor_si128(diag2, b5);
|
||||
|
||||
a6 = _mm_add_epi32(a6, diag2);
|
||||
a7 = diag2;
|
||||
b6 = a6;
|
||||
a6 = _mm_slli_epi32(a6, 13);
|
||||
b6 = _mm_srli_epi32(b6, 19);
|
||||
diag3 = _mm_xor_si128(diag3, a6);
|
||||
diag2 = _mm_shuffle_epi32(diag2, 0x4e);
|
||||
diag3 = _mm_xor_si128(diag3, b6);
|
||||
|
||||
a7 = _mm_add_epi32(a7, diag3);
|
||||
a0 = diag1;
|
||||
b7 = a7;
|
||||
a7 = _mm_slli_epi32(a7, 18);
|
||||
b7 = _mm_srli_epi32(b7, 14);
|
||||
diag0 = _mm_xor_si128(diag0, a7);
|
||||
diag3 = _mm_shuffle_epi32(diag3, 0x39);
|
||||
diag0 = _mm_xor_si128(diag0, b7);
|
||||
|
||||
a0 = _mm_add_epi32(a0, diag0);
|
||||
a1 = diag0;
|
||||
b0 = a0;
|
||||
a0 = _mm_slli_epi32(a0, 7);
|
||||
b0 = _mm_srli_epi32(b0, 25);
|
||||
diag3 = _mm_xor_si128(diag3, a0);
|
||||
|
||||
diag3 = _mm_xor_si128(diag3, b0);
|
||||
|
||||
a1 = _mm_add_epi32(a1, diag3);
|
||||
a2 = diag3;
|
||||
b1 = a1;
|
||||
a1 = _mm_slli_epi32(a1, 9);
|
||||
b1 = _mm_srli_epi32(b1, 23);
|
||||
diag2 = _mm_xor_si128(diag2, a1);
|
||||
diag3 = _mm_shuffle_epi32(diag3, 0x93);
|
||||
diag2 = _mm_xor_si128(diag2, b1);
|
||||
|
||||
a2 = _mm_add_epi32(a2, diag2);
|
||||
a3 = diag2;
|
||||
b2 = a2;
|
||||
a2 = _mm_slli_epi32(a2, 13);
|
||||
b2 = _mm_srli_epi32(b2, 19);
|
||||
diag1 = _mm_xor_si128(diag1, a2);
|
||||
diag2 = _mm_shuffle_epi32(diag2, 0x4e);
|
||||
diag1 = _mm_xor_si128(diag1, b2);
|
||||
|
||||
a3 = _mm_add_epi32(a3, diag1);
|
||||
a4 = diag3;
|
||||
b3 = a3;
|
||||
a3 = _mm_slli_epi32(a3, 18);
|
||||
b3 = _mm_srli_epi32(b3, 14);
|
||||
diag0 = _mm_xor_si128(diag0, a3);
|
||||
diag1 = _mm_shuffle_epi32(diag1, 0x39);
|
||||
diag0 = _mm_xor_si128(diag0, b3);
|
||||
|
||||
a4 = _mm_add_epi32(a4, diag0);
|
||||
a5 = diag0;
|
||||
b4 = a4;
|
||||
a4 = _mm_slli_epi32(a4, 7);
|
||||
b4 = _mm_srli_epi32(b4, 25);
|
||||
diag1 = _mm_xor_si128(diag1, a4);
|
||||
|
||||
diag1 = _mm_xor_si128(diag1, b4);
|
||||
|
||||
a5 = _mm_add_epi32(a5, diag1);
|
||||
a6 = diag1;
|
||||
b5 = a5;
|
||||
a5 = _mm_slli_epi32(a5, 9);
|
||||
b5 = _mm_srli_epi32(b5, 23);
|
||||
diag2 = _mm_xor_si128(diag2, a5);
|
||||
diag1 = _mm_shuffle_epi32(diag1, 0x93);
|
||||
diag2 = _mm_xor_si128(diag2, b5);
|
||||
|
||||
a6 = _mm_add_epi32(a6, diag2);
|
||||
a7 = diag2;
|
||||
b6 = a6;
|
||||
a6 = _mm_slli_epi32(a6, 13);
|
||||
b6 = _mm_srli_epi32(b6, 19);
|
||||
diag3 = _mm_xor_si128(diag3, a6);
|
||||
diag2 = _mm_shuffle_epi32(diag2, 0x4e);
|
||||
diag3 = _mm_xor_si128(diag3, b6);
|
||||
|
||||
a7 = _mm_add_epi32(a7, diag3);
|
||||
a0 = diag1;
|
||||
b7 = a7;
|
||||
a7 = _mm_slli_epi32(a7, 18);
|
||||
b7 = _mm_srli_epi32(b7, 14);
|
||||
diag0 = _mm_xor_si128(diag0, a7);
|
||||
diag3 = _mm_shuffle_epi32(diag3, 0x39);
|
||||
diag0 = _mm_xor_si128(diag0, b7);
|
||||
}
|
||||
|
||||
diag0 = _mm_add_epi32(diag0, _mm_loadu_si128((__m128i *)(x + 0)));
|
||||
diag1 = _mm_add_epi32(diag1, _mm_loadu_si128((__m128i *)(x + 4)));
|
||||
diag2 = _mm_add_epi32(diag2, _mm_loadu_si128((__m128i *)(x + 8)));
|
||||
diag3 = _mm_add_epi32(diag3, _mm_loadu_si128((__m128i *)(x + 12)));
|
||||
|
||||
#define ONEQUAD_SHUFFLE(A, B, C, D) \
|
||||
do \
|
||||
{ \
|
||||
uint32_t in##A = _mm_cvtsi128_si32(diag0); \
|
||||
uint32_t in##B = _mm_cvtsi128_si32(diag1); \
|
||||
uint32_t in##C = _mm_cvtsi128_si32(diag2); \
|
||||
uint32_t in##D = _mm_cvtsi128_si32(diag3); \
|
||||
diag0 = _mm_shuffle_epi32(diag0, 0x39); \
|
||||
diag1 = _mm_shuffle_epi32(diag1, 0x39); \
|
||||
diag2 = _mm_shuffle_epi32(diag2, 0x39); \
|
||||
diag3 = _mm_shuffle_epi32(diag3, 0x39); \
|
||||
*(uint32_t *)(partialblock + (A * 4)) = in##A; \
|
||||
*(uint32_t *)(partialblock + (B * 4)) = in##B; \
|
||||
*(uint32_t *)(partialblock + (C * 4)) = in##C; \
|
||||
*(uint32_t *)(partialblock + (D * 4)) = in##D; \
|
||||
} while(0)
|
||||
|
||||
#define ONEQUAD(A, B, C, D) ONEQUAD_SHUFFLE(A, B, C, D)
|
||||
|
||||
ONEQUAD(0, 12, 8, 4);
|
||||
ONEQUAD(5, 1, 13, 9);
|
||||
ONEQUAD(10, 6, 2, 14);
|
||||
ONEQUAD(15, 11, 7, 3);
|
||||
ONEQUAD(0, 12, 8, 4);
|
||||
ONEQUAD(5, 1, 13, 9);
|
||||
ONEQUAD(10, 6, 2, 14);
|
||||
ONEQUAD(15, 11, 7, 3);
|
||||
|
||||
#undef ONEQUAD
|
||||
#undef ONEQUAD_SHUFFLE
|
||||
|
||||
for (i = 0; i < bytes; i++) {
|
||||
c[i] = m[i] ^ partialblock[i];
|
||||
}
|
||||
for(i = 0; i < bytes; i++)
|
||||
{
|
||||
c[i] = m[i] ^ partialblock[i];
|
||||
}
|
||||
|
||||
sodium_memzero(partialblock, sizeof partialblock);
|
||||
sodium_memzero(partialblock, sizeof partialblock);
|
||||
}
|
||||
|
@ -1,207 +1,211 @@
|
||||
while (bytes >= 64) {
|
||||
__m128i diag0 = _mm_loadu_si128((__m128i *) (x + 0));
|
||||
__m128i diag1 = _mm_loadu_si128((__m128i *) (x + 4));
|
||||
__m128i diag2 = _mm_loadu_si128((__m128i *) (x + 8));
|
||||
__m128i diag3 = _mm_loadu_si128((__m128i *) (x + 12));
|
||||
__m128i a0, a1, a2, a3, a4, a5, a6, a7;
|
||||
__m128i b0, b1, b2, b3, b4, b5, b6, b7;
|
||||
|
||||
uint32_t in8;
|
||||
uint32_t in9;
|
||||
int i;
|
||||
|
||||
a0 = diag1;
|
||||
for (i = 0; i < ROUNDS; i += 4) {
|
||||
a0 = _mm_add_epi32(a0, diag0);
|
||||
a1 = diag0;
|
||||
b0 = a0;
|
||||
a0 = _mm_slli_epi32(a0, 7);
|
||||
b0 = _mm_srli_epi32(b0, 25);
|
||||
diag3 = _mm_xor_si128(diag3, a0);
|
||||
|
||||
diag3 = _mm_xor_si128(diag3, b0);
|
||||
|
||||
a1 = _mm_add_epi32(a1, diag3);
|
||||
a2 = diag3;
|
||||
b1 = a1;
|
||||
a1 = _mm_slli_epi32(a1, 9);
|
||||
b1 = _mm_srli_epi32(b1, 23);
|
||||
diag2 = _mm_xor_si128(diag2, a1);
|
||||
diag3 = _mm_shuffle_epi32(diag3, 0x93);
|
||||
diag2 = _mm_xor_si128(diag2, b1);
|
||||
|
||||
a2 = _mm_add_epi32(a2, diag2);
|
||||
a3 = diag2;
|
||||
b2 = a2;
|
||||
a2 = _mm_slli_epi32(a2, 13);
|
||||
b2 = _mm_srli_epi32(b2, 19);
|
||||
diag1 = _mm_xor_si128(diag1, a2);
|
||||
diag2 = _mm_shuffle_epi32(diag2, 0x4e);
|
||||
diag1 = _mm_xor_si128(diag1, b2);
|
||||
|
||||
a3 = _mm_add_epi32(a3, diag1);
|
||||
a4 = diag3;
|
||||
b3 = a3;
|
||||
a3 = _mm_slli_epi32(a3, 18);
|
||||
b3 = _mm_srli_epi32(b3, 14);
|
||||
diag0 = _mm_xor_si128(diag0, a3);
|
||||
diag1 = _mm_shuffle_epi32(diag1, 0x39);
|
||||
diag0 = _mm_xor_si128(diag0, b3);
|
||||
|
||||
a4 = _mm_add_epi32(a4, diag0);
|
||||
a5 = diag0;
|
||||
b4 = a4;
|
||||
a4 = _mm_slli_epi32(a4, 7);
|
||||
b4 = _mm_srli_epi32(b4, 25);
|
||||
diag1 = _mm_xor_si128(diag1, a4);
|
||||
|
||||
diag1 = _mm_xor_si128(diag1, b4);
|
||||
|
||||
a5 = _mm_add_epi32(a5, diag1);
|
||||
a6 = diag1;
|
||||
b5 = a5;
|
||||
a5 = _mm_slli_epi32(a5, 9);
|
||||
b5 = _mm_srli_epi32(b5, 23);
|
||||
diag2 = _mm_xor_si128(diag2, a5);
|
||||
diag1 = _mm_shuffle_epi32(diag1, 0x93);
|
||||
diag2 = _mm_xor_si128(diag2, b5);
|
||||
|
||||
a6 = _mm_add_epi32(a6, diag2);
|
||||
a7 = diag2;
|
||||
b6 = a6;
|
||||
a6 = _mm_slli_epi32(a6, 13);
|
||||
b6 = _mm_srli_epi32(b6, 19);
|
||||
diag3 = _mm_xor_si128(diag3, a6);
|
||||
diag2 = _mm_shuffle_epi32(diag2, 0x4e);
|
||||
diag3 = _mm_xor_si128(diag3, b6);
|
||||
|
||||
a7 = _mm_add_epi32(a7, diag3);
|
||||
a0 = diag1;
|
||||
b7 = a7;
|
||||
a7 = _mm_slli_epi32(a7, 18);
|
||||
b7 = _mm_srli_epi32(b7, 14);
|
||||
diag0 = _mm_xor_si128(diag0, a7);
|
||||
diag3 = _mm_shuffle_epi32(diag3, 0x39);
|
||||
diag0 = _mm_xor_si128(diag0, b7);
|
||||
|
||||
a0 = _mm_add_epi32(a0, diag0);
|
||||
a1 = diag0;
|
||||
b0 = a0;
|
||||
a0 = _mm_slli_epi32(a0, 7);
|
||||
b0 = _mm_srli_epi32(b0, 25);
|
||||
diag3 = _mm_xor_si128(diag3, a0);
|
||||
|
||||
diag3 = _mm_xor_si128(diag3, b0);
|
||||
|
||||
a1 = _mm_add_epi32(a1, diag3);
|
||||
a2 = diag3;
|
||||
b1 = a1;
|
||||
a1 = _mm_slli_epi32(a1, 9);
|
||||
b1 = _mm_srli_epi32(b1, 23);
|
||||
diag2 = _mm_xor_si128(diag2, a1);
|
||||
diag3 = _mm_shuffle_epi32(diag3, 0x93);
|
||||
diag2 = _mm_xor_si128(diag2, b1);
|
||||
|
||||
a2 = _mm_add_epi32(a2, diag2);
|
||||
a3 = diag2;
|
||||
b2 = a2;
|
||||
a2 = _mm_slli_epi32(a2, 13);
|
||||
b2 = _mm_srli_epi32(b2, 19);
|
||||
diag1 = _mm_xor_si128(diag1, a2);
|
||||
diag2 = _mm_shuffle_epi32(diag2, 0x4e);
|
||||
diag1 = _mm_xor_si128(diag1, b2);
|
||||
|
||||
a3 = _mm_add_epi32(a3, diag1);
|
||||
a4 = diag3;
|
||||
b3 = a3;
|
||||
a3 = _mm_slli_epi32(a3, 18);
|
||||
b3 = _mm_srli_epi32(b3, 14);
|
||||
diag0 = _mm_xor_si128(diag0, a3);
|
||||
diag1 = _mm_shuffle_epi32(diag1, 0x39);
|
||||
diag0 = _mm_xor_si128(diag0, b3);
|
||||
|
||||
a4 = _mm_add_epi32(a4, diag0);
|
||||
a5 = diag0;
|
||||
b4 = a4;
|
||||
a4 = _mm_slli_epi32(a4, 7);
|
||||
b4 = _mm_srli_epi32(b4, 25);
|
||||
diag1 = _mm_xor_si128(diag1, a4);
|
||||
|
||||
diag1 = _mm_xor_si128(diag1, b4);
|
||||
|
||||
a5 = _mm_add_epi32(a5, diag1);
|
||||
a6 = diag1;
|
||||
b5 = a5;
|
||||
a5 = _mm_slli_epi32(a5, 9);
|
||||
b5 = _mm_srli_epi32(b5, 23);
|
||||
diag2 = _mm_xor_si128(diag2, a5);
|
||||
diag1 = _mm_shuffle_epi32(diag1, 0x93);
|
||||
diag2 = _mm_xor_si128(diag2, b5);
|
||||
|
||||
a6 = _mm_add_epi32(a6, diag2);
|
||||
a7 = diag2;
|
||||
b6 = a6;
|
||||
a6 = _mm_slli_epi32(a6, 13);
|
||||
b6 = _mm_srli_epi32(b6, 19);
|
||||
diag3 = _mm_xor_si128(diag3, a6);
|
||||
diag2 = _mm_shuffle_epi32(diag2, 0x4e);
|
||||
diag3 = _mm_xor_si128(diag3, b6);
|
||||
|
||||
a7 = _mm_add_epi32(a7, diag3);
|
||||
a0 = diag1;
|
||||
b7 = a7;
|
||||
a7 = _mm_slli_epi32(a7, 18);
|
||||
b7 = _mm_srli_epi32(b7, 14);
|
||||
diag0 = _mm_xor_si128(diag0, a7);
|
||||
diag3 = _mm_shuffle_epi32(diag3, 0x39);
|
||||
diag0 = _mm_xor_si128(diag0, b7);
|
||||
}
|
||||
|
||||
diag0 = _mm_add_epi32(diag0, _mm_loadu_si128((__m128i *) (x + 0)));
|
||||
diag1 = _mm_add_epi32(diag1, _mm_loadu_si128((__m128i *) (x + 4)));
|
||||
diag2 = _mm_add_epi32(diag2, _mm_loadu_si128((__m128i *) (x + 8)));
|
||||
diag3 = _mm_add_epi32(diag3, _mm_loadu_si128((__m128i *) (x + 12)));
|
||||
|
||||
#define ONEQUAD_SHUFFLE(A, B, C, D) \
|
||||
do { \
|
||||
uint32_t in##A = _mm_cvtsi128_si32(diag0); \
|
||||
uint32_t in##B = _mm_cvtsi128_si32(diag1); \
|
||||
uint32_t in##C = _mm_cvtsi128_si32(diag2); \
|
||||
uint32_t in##D = _mm_cvtsi128_si32(diag3); \
|
||||
diag0 = _mm_shuffle_epi32(diag0, 0x39); \
|
||||
diag1 = _mm_shuffle_epi32(diag1, 0x39); \
|
||||
diag2 = _mm_shuffle_epi32(diag2, 0x39); \
|
||||
diag3 = _mm_shuffle_epi32(diag3, 0x39); \
|
||||
in##A ^= *(uint32_t *) (m + (A * 4)); \
|
||||
in##B ^= *(uint32_t *) (m + (B * 4)); \
|
||||
in##C ^= *(uint32_t *) (m + (C * 4)); \
|
||||
in##D ^= *(uint32_t *) (m + (D * 4)); \
|
||||
*(uint32_t *) (c + (A * 4)) = in##A; \
|
||||
*(uint32_t *) (c + (B * 4)) = in##B; \
|
||||
*(uint32_t *) (c + (C * 4)) = in##C; \
|
||||
*(uint32_t *) (c + (D * 4)) = in##D; \
|
||||
} while (0)
|
||||
while(bytes >= 64)
|
||||
{
|
||||
__m128i diag0 = _mm_loadu_si128((__m128i *)(x + 0));
|
||||
__m128i diag1 = _mm_loadu_si128((__m128i *)(x + 4));
|
||||
__m128i diag2 = _mm_loadu_si128((__m128i *)(x + 8));
|
||||
__m128i diag3 = _mm_loadu_si128((__m128i *)(x + 12));
|
||||
__m128i a0, a1, a2, a3, a4, a5, a6, a7;
|
||||
__m128i b0, b1, b2, b3, b4, b5, b6, b7;
|
||||
|
||||
uint32_t in8;
|
||||
uint32_t in9;
|
||||
int i;
|
||||
|
||||
a0 = diag1;
|
||||
for(i = 0; i < ROUNDS; i += 4)
|
||||
{
|
||||
a0 = _mm_add_epi32(a0, diag0);
|
||||
a1 = diag0;
|
||||
b0 = a0;
|
||||
a0 = _mm_slli_epi32(a0, 7);
|
||||
b0 = _mm_srli_epi32(b0, 25);
|
||||
diag3 = _mm_xor_si128(diag3, a0);
|
||||
|
||||
diag3 = _mm_xor_si128(diag3, b0);
|
||||
|
||||
a1 = _mm_add_epi32(a1, diag3);
|
||||
a2 = diag3;
|
||||
b1 = a1;
|
||||
a1 = _mm_slli_epi32(a1, 9);
|
||||
b1 = _mm_srli_epi32(b1, 23);
|
||||
diag2 = _mm_xor_si128(diag2, a1);
|
||||
diag3 = _mm_shuffle_epi32(diag3, 0x93);
|
||||
diag2 = _mm_xor_si128(diag2, b1);
|
||||
|
||||
a2 = _mm_add_epi32(a2, diag2);
|
||||
a3 = diag2;
|
||||
b2 = a2;
|
||||
a2 = _mm_slli_epi32(a2, 13);
|
||||
b2 = _mm_srli_epi32(b2, 19);
|
||||
diag1 = _mm_xor_si128(diag1, a2);
|
||||
diag2 = _mm_shuffle_epi32(diag2, 0x4e);
|
||||
diag1 = _mm_xor_si128(diag1, b2);
|
||||
|
||||
a3 = _mm_add_epi32(a3, diag1);
|
||||
a4 = diag3;
|
||||
b3 = a3;
|
||||
a3 = _mm_slli_epi32(a3, 18);
|
||||
b3 = _mm_srli_epi32(b3, 14);
|
||||
diag0 = _mm_xor_si128(diag0, a3);
|
||||
diag1 = _mm_shuffle_epi32(diag1, 0x39);
|
||||
diag0 = _mm_xor_si128(diag0, b3);
|
||||
|
||||
a4 = _mm_add_epi32(a4, diag0);
|
||||
a5 = diag0;
|
||||
b4 = a4;
|
||||
a4 = _mm_slli_epi32(a4, 7);
|
||||
b4 = _mm_srli_epi32(b4, 25);
|
||||
diag1 = _mm_xor_si128(diag1, a4);
|
||||
|
||||
diag1 = _mm_xor_si128(diag1, b4);
|
||||
|
||||
a5 = _mm_add_epi32(a5, diag1);
|
||||
a6 = diag1;
|
||||
b5 = a5;
|
||||
a5 = _mm_slli_epi32(a5, 9);
|
||||
b5 = _mm_srli_epi32(b5, 23);
|
||||
diag2 = _mm_xor_si128(diag2, a5);
|
||||
diag1 = _mm_shuffle_epi32(diag1, 0x93);
|
||||
diag2 = _mm_xor_si128(diag2, b5);
|
||||
|
||||
a6 = _mm_add_epi32(a6, diag2);
|
||||
a7 = diag2;
|
||||
b6 = a6;
|
||||
a6 = _mm_slli_epi32(a6, 13);
|
||||
b6 = _mm_srli_epi32(b6, 19);
|
||||
diag3 = _mm_xor_si128(diag3, a6);
|
||||
diag2 = _mm_shuffle_epi32(diag2, 0x4e);
|
||||
diag3 = _mm_xor_si128(diag3, b6);
|
||||
|
||||
a7 = _mm_add_epi32(a7, diag3);
|
||||
a0 = diag1;
|
||||
b7 = a7;
|
||||
a7 = _mm_slli_epi32(a7, 18);
|
||||
b7 = _mm_srli_epi32(b7, 14);
|
||||
diag0 = _mm_xor_si128(diag0, a7);
|
||||
diag3 = _mm_shuffle_epi32(diag3, 0x39);
|
||||
diag0 = _mm_xor_si128(diag0, b7);
|
||||
|
||||
a0 = _mm_add_epi32(a0, diag0);
|
||||
a1 = diag0;
|
||||
b0 = a0;
|
||||
a0 = _mm_slli_epi32(a0, 7);
|
||||
b0 = _mm_srli_epi32(b0, 25);
|
||||
diag3 = _mm_xor_si128(diag3, a0);
|
||||
|
||||
diag3 = _mm_xor_si128(diag3, b0);
|
||||
|
||||
a1 = _mm_add_epi32(a1, diag3);
|
||||
a2 = diag3;
|
||||
b1 = a1;
|
||||
a1 = _mm_slli_epi32(a1, 9);
|
||||
b1 = _mm_srli_epi32(b1, 23);
|
||||
diag2 = _mm_xor_si128(diag2, a1);
|
||||
diag3 = _mm_shuffle_epi32(diag3, 0x93);
|
||||
diag2 = _mm_xor_si128(diag2, b1);
|
||||
|
||||
a2 = _mm_add_epi32(a2, diag2);
|
||||
a3 = diag2;
|
||||
b2 = a2;
|
||||
a2 = _mm_slli_epi32(a2, 13);
|
||||
b2 = _mm_srli_epi32(b2, 19);
|
||||
diag1 = _mm_xor_si128(diag1, a2);
|
||||
diag2 = _mm_shuffle_epi32(diag2, 0x4e);
|
||||
diag1 = _mm_xor_si128(diag1, b2);
|
||||
|
||||
a3 = _mm_add_epi32(a3, diag1);
|
||||
a4 = diag3;
|
||||
b3 = a3;
|
||||
a3 = _mm_slli_epi32(a3, 18);
|
||||
b3 = _mm_srli_epi32(b3, 14);
|
||||
diag0 = _mm_xor_si128(diag0, a3);
|
||||
diag1 = _mm_shuffle_epi32(diag1, 0x39);
|
||||
diag0 = _mm_xor_si128(diag0, b3);
|
||||
|
||||
a4 = _mm_add_epi32(a4, diag0);
|
||||
a5 = diag0;
|
||||
b4 = a4;
|
||||
a4 = _mm_slli_epi32(a4, 7);
|
||||
b4 = _mm_srli_epi32(b4, 25);
|
||||
diag1 = _mm_xor_si128(diag1, a4);
|
||||
|
||||
diag1 = _mm_xor_si128(diag1, b4);
|
||||
|
||||
a5 = _mm_add_epi32(a5, diag1);
|
||||
a6 = diag1;
|
||||
b5 = a5;
|
||||
a5 = _mm_slli_epi32(a5, 9);
|
||||
b5 = _mm_srli_epi32(b5, 23);
|
||||
diag2 = _mm_xor_si128(diag2, a5);
|
||||
diag1 = _mm_shuffle_epi32(diag1, 0x93);
|
||||
diag2 = _mm_xor_si128(diag2, b5);
|
||||
|
||||
a6 = _mm_add_epi32(a6, diag2);
|
||||
a7 = diag2;
|
||||
b6 = a6;
|
||||
a6 = _mm_slli_epi32(a6, 13);
|
||||
b6 = _mm_srli_epi32(b6, 19);
|
||||
diag3 = _mm_xor_si128(diag3, a6);
|
||||
diag2 = _mm_shuffle_epi32(diag2, 0x4e);
|
||||
diag3 = _mm_xor_si128(diag3, b6);
|
||||
|
||||
a7 = _mm_add_epi32(a7, diag3);
|
||||
a0 = diag1;
|
||||
b7 = a7;
|
||||
a7 = _mm_slli_epi32(a7, 18);
|
||||
b7 = _mm_srli_epi32(b7, 14);
|
||||
diag0 = _mm_xor_si128(diag0, a7);
|
||||
diag3 = _mm_shuffle_epi32(diag3, 0x39);
|
||||
diag0 = _mm_xor_si128(diag0, b7);
|
||||
}
|
||||
|
||||
diag0 = _mm_add_epi32(diag0, _mm_loadu_si128((__m128i *)(x + 0)));
|
||||
diag1 = _mm_add_epi32(diag1, _mm_loadu_si128((__m128i *)(x + 4)));
|
||||
diag2 = _mm_add_epi32(diag2, _mm_loadu_si128((__m128i *)(x + 8)));
|
||||
diag3 = _mm_add_epi32(diag3, _mm_loadu_si128((__m128i *)(x + 12)));
|
||||
|
||||
#define ONEQUAD_SHUFFLE(A, B, C, D) \
|
||||
do \
|
||||
{ \
|
||||
uint32_t in##A = _mm_cvtsi128_si32(diag0); \
|
||||
uint32_t in##B = _mm_cvtsi128_si32(diag1); \
|
||||
uint32_t in##C = _mm_cvtsi128_si32(diag2); \
|
||||
uint32_t in##D = _mm_cvtsi128_si32(diag3); \
|
||||
diag0 = _mm_shuffle_epi32(diag0, 0x39); \
|
||||
diag1 = _mm_shuffle_epi32(diag1, 0x39); \
|
||||
diag2 = _mm_shuffle_epi32(diag2, 0x39); \
|
||||
diag3 = _mm_shuffle_epi32(diag3, 0x39); \
|
||||
in##A ^= *(uint32_t *)(m + (A * 4)); \
|
||||
in##B ^= *(uint32_t *)(m + (B * 4)); \
|
||||
in##C ^= *(uint32_t *)(m + (C * 4)); \
|
||||
in##D ^= *(uint32_t *)(m + (D * 4)); \
|
||||
*(uint32_t *)(c + (A * 4)) = in##A; \
|
||||
*(uint32_t *)(c + (B * 4)) = in##B; \
|
||||
*(uint32_t *)(c + (C * 4)) = in##C; \
|
||||
*(uint32_t *)(c + (D * 4)) = in##D; \
|
||||
} while(0)
|
||||
|
||||
#define ONEQUAD(A, B, C, D) ONEQUAD_SHUFFLE(A, B, C, D)
|
||||
|
||||
ONEQUAD(0, 12, 8, 4);
|
||||
ONEQUAD(5, 1, 13, 9);
|
||||
ONEQUAD(10, 6, 2, 14);
|
||||
ONEQUAD(15, 11, 7, 3);
|
||||
ONEQUAD(0, 12, 8, 4);
|
||||
ONEQUAD(5, 1, 13, 9);
|
||||
ONEQUAD(10, 6, 2, 14);
|
||||
ONEQUAD(15, 11, 7, 3);
|
||||
|
||||
#undef ONEQUAD
|
||||
#undef ONEQUAD_SHUFFLE
|
||||
|
||||
in8 = x[8];
|
||||
in9 = x[13];
|
||||
in8++;
|
||||
if (in8 == 0) {
|
||||
in9++;
|
||||
}
|
||||
x[8] = in8;
|
||||
x[13] = in9;
|
||||
|
||||
c += 64;
|
||||
m += 64;
|
||||
bytes -= 64;
|
||||
in8 = x[8];
|
||||
in9 = x[13];
|
||||
in8++;
|
||||
if(in8 == 0)
|
||||
{
|
||||
in9++;
|
||||
}
|
||||
x[8] = in8;
|
||||
x[13] = in9;
|
||||
|
||||
c += 64;
|
||||
m += 64;
|
||||
bytes -= 64;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,476 +1,471 @@
|
||||
if (bytes >= 512) {
|
||||
__m256i y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12, y13, y14,
|
||||
y15;
|
||||
|
||||
/* the naive way seems as fast (if not a bit faster) than the vector way */
|
||||
__m256i z0 = _mm256_set1_epi32(x[0]);
|
||||
__m256i z5 = _mm256_set1_epi32(x[1]);
|
||||
__m256i z10 = _mm256_set1_epi32(x[2]);
|
||||
__m256i z15 = _mm256_set1_epi32(x[3]);
|
||||
__m256i z12 = _mm256_set1_epi32(x[4]);
|
||||
__m256i z1 = _mm256_set1_epi32(x[5]);
|
||||
__m256i z6 = _mm256_set1_epi32(x[6]);
|
||||
__m256i z11 = _mm256_set1_epi32(x[7]);
|
||||
__m256i z8; /* useless */
|
||||
__m256i z13 = _mm256_set1_epi32(x[9]);
|
||||
__m256i z2 = _mm256_set1_epi32(x[10]);
|
||||
__m256i z7 = _mm256_set1_epi32(x[11]);
|
||||
__m256i z4 = _mm256_set1_epi32(x[12]);
|
||||
__m256i z9; /* useless */
|
||||
__m256i z14 = _mm256_set1_epi32(x[14]);
|
||||
__m256i z3 = _mm256_set1_epi32(x[15]);
|
||||
|
||||
__m256i orig0 = z0;
|
||||
__m256i orig1 = z1;
|
||||
__m256i orig2 = z2;
|
||||
__m256i orig3 = z3;
|
||||
__m256i orig4 = z4;
|
||||
__m256i orig5 = z5;
|
||||
__m256i orig6 = z6;
|
||||
__m256i orig7 = z7;
|
||||
__m256i orig8;
|
||||
__m256i orig9;
|
||||
__m256i orig10 = z10;
|
||||
__m256i orig11 = z11;
|
||||
__m256i orig12 = z12;
|
||||
__m256i orig13 = z13;
|
||||
__m256i orig14 = z14;
|
||||
__m256i orig15 = z15;
|
||||
|
||||
uint32_t in8;
|
||||
uint32_t in9;
|
||||
int i;
|
||||
|
||||
while (bytes >= 512) {
|
||||
/* vector implementation for z8 and z9 */
|
||||
/* faster than the naive version for 8 blocks */
|
||||
const __m256i addv8 = _mm256_set_epi64x(3, 2, 1, 0);
|
||||
const __m256i addv9 = _mm256_set_epi64x(7, 6, 5, 4);
|
||||
const __m256i permute = _mm256_set_epi32(7, 6, 3, 2, 5, 4, 1, 0);
|
||||
|
||||
__m256i t8, t9;
|
||||
uint64_t in89;
|
||||
|
||||
in8 = x[8];
|
||||
in9 = x[13]; /* see arrays above for the address translation */
|
||||
in89 = ((uint64_t) in8) | (((uint64_t) in9) << 32);
|
||||
|
||||
z8 = z9 = _mm256_broadcastq_epi64(_mm_cvtsi64_si128(in89));
|
||||
|
||||
t8 = _mm256_add_epi64(addv8, z8);
|
||||
t9 = _mm256_add_epi64(addv9, z9);
|
||||
|
||||
z8 = _mm256_unpacklo_epi32(t8, t9);
|
||||
z9 = _mm256_unpackhi_epi32(t8, t9);
|
||||
|
||||
t8 = _mm256_unpacklo_epi32(z8, z9);
|
||||
t9 = _mm256_unpackhi_epi32(z8, z9);
|
||||
|
||||
/* required because unpack* are intra-lane */
|
||||
z8 = _mm256_permutevar8x32_epi32(t8, permute);
|
||||
z9 = _mm256_permutevar8x32_epi32(t9, permute);
|
||||
|
||||
orig8 = z8;
|
||||
orig9 = z9;
|
||||
|
||||
in89 += 8;
|
||||
|
||||
x[8] = in89 & 0xFFFFFFFF;
|
||||
x[13] = (in89 >> 32) & 0xFFFFFFFF;
|
||||
|
||||
z5 = orig5;
|
||||
z10 = orig10;
|
||||
z15 = orig15;
|
||||
z14 = orig14;
|
||||
z3 = orig3;
|
||||
z6 = orig6;
|
||||
z11 = orig11;
|
||||
z1 = orig1;
|
||||
|
||||
z7 = orig7;
|
||||
z13 = orig13;
|
||||
z2 = orig2;
|
||||
z9 = orig9;
|
||||
z0 = orig0;
|
||||
z12 = orig12;
|
||||
z4 = orig4;
|
||||
z8 = orig8;
|
||||
|
||||
for (i = 0; i < ROUNDS; i += 2) {
|
||||
/* the inner loop is a direct translation (regexp search/replace)
|
||||
* from the amd64-xmm6 ASM */
|
||||
__m256i r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13,
|
||||
r14, r15;
|
||||
|
||||
y4 = z12;
|
||||
y4 = _mm256_add_epi32(y4, z0);
|
||||
r4 = y4;
|
||||
y4 = _mm256_slli_epi32(y4, 7);
|
||||
z4 = _mm256_xor_si256(z4, y4);
|
||||
r4 = _mm256_srli_epi32(r4, 25);
|
||||
z4 = _mm256_xor_si256(z4, r4);
|
||||
|
||||
y9 = z1;
|
||||
y9 = _mm256_add_epi32(y9, z5);
|
||||
r9 = y9;
|
||||
y9 = _mm256_slli_epi32(y9, 7);
|
||||
z9 = _mm256_xor_si256(z9, y9);
|
||||
r9 = _mm256_srli_epi32(r9, 25);
|
||||
z9 = _mm256_xor_si256(z9, r9);
|
||||
|
||||
y8 = z0;
|
||||
y8 = _mm256_add_epi32(y8, z4);
|
||||
r8 = y8;
|
||||
y8 = _mm256_slli_epi32(y8, 9);
|
||||
z8 = _mm256_xor_si256(z8, y8);
|
||||
r8 = _mm256_srli_epi32(r8, 23);
|
||||
z8 = _mm256_xor_si256(z8, r8);
|
||||
|
||||
y13 = z5;
|
||||
y13 = _mm256_add_epi32(y13, z9);
|
||||
r13 = y13;
|
||||
y13 = _mm256_slli_epi32(y13, 9);
|
||||
z13 = _mm256_xor_si256(z13, y13);
|
||||
r13 = _mm256_srli_epi32(r13, 23);
|
||||
z13 = _mm256_xor_si256(z13, r13);
|
||||
|
||||
y12 = z4;
|
||||
y12 = _mm256_add_epi32(y12, z8);
|
||||
r12 = y12;
|
||||
y12 = _mm256_slli_epi32(y12, 13);
|
||||
z12 = _mm256_xor_si256(z12, y12);
|
||||
r12 = _mm256_srli_epi32(r12, 19);
|
||||
z12 = _mm256_xor_si256(z12, r12);
|
||||
|
||||
y1 = z9;
|
||||
y1 = _mm256_add_epi32(y1, z13);
|
||||
r1 = y1;
|
||||
y1 = _mm256_slli_epi32(y1, 13);
|
||||
z1 = _mm256_xor_si256(z1, y1);
|
||||
r1 = _mm256_srli_epi32(r1, 19);
|
||||
z1 = _mm256_xor_si256(z1, r1);
|
||||
|
||||
y0 = z8;
|
||||
y0 = _mm256_add_epi32(y0, z12);
|
||||
r0 = y0;
|
||||
y0 = _mm256_slli_epi32(y0, 18);
|
||||
z0 = _mm256_xor_si256(z0, y0);
|
||||
r0 = _mm256_srli_epi32(r0, 14);
|
||||
z0 = _mm256_xor_si256(z0, r0);
|
||||
|
||||
y5 = z13;
|
||||
y5 = _mm256_add_epi32(y5, z1);
|
||||
r5 = y5;
|
||||
y5 = _mm256_slli_epi32(y5, 18);
|
||||
z5 = _mm256_xor_si256(z5, y5);
|
||||
r5 = _mm256_srli_epi32(r5, 14);
|
||||
z5 = _mm256_xor_si256(z5, r5);
|
||||
|
||||
y14 = z6;
|
||||
y14 = _mm256_add_epi32(y14, z10);
|
||||
r14 = y14;
|
||||
y14 = _mm256_slli_epi32(y14, 7);
|
||||
z14 = _mm256_xor_si256(z14, y14);
|
||||
r14 = _mm256_srli_epi32(r14, 25);
|
||||
z14 = _mm256_xor_si256(z14, r14);
|
||||
|
||||
y3 = z11;
|
||||
y3 = _mm256_add_epi32(y3, z15);
|
||||
r3 = y3;
|
||||
y3 = _mm256_slli_epi32(y3, 7);
|
||||
z3 = _mm256_xor_si256(z3, y3);
|
||||
r3 = _mm256_srli_epi32(r3, 25);
|
||||
z3 = _mm256_xor_si256(z3, r3);
|
||||
|
||||
y2 = z10;
|
||||
y2 = _mm256_add_epi32(y2, z14);
|
||||
r2 = y2;
|
||||
y2 = _mm256_slli_epi32(y2, 9);
|
||||
z2 = _mm256_xor_si256(z2, y2);
|
||||
r2 = _mm256_srli_epi32(r2, 23);
|
||||
z2 = _mm256_xor_si256(z2, r2);
|
||||
|
||||
y7 = z15;
|
||||
y7 = _mm256_add_epi32(y7, z3);
|
||||
r7 = y7;
|
||||
y7 = _mm256_slli_epi32(y7, 9);
|
||||
z7 = _mm256_xor_si256(z7, y7);
|
||||
r7 = _mm256_srli_epi32(r7, 23);
|
||||
z7 = _mm256_xor_si256(z7, r7);
|
||||
|
||||
y6 = z14;
|
||||
y6 = _mm256_add_epi32(y6, z2);
|
||||
r6 = y6;
|
||||
y6 = _mm256_slli_epi32(y6, 13);
|
||||
z6 = _mm256_xor_si256(z6, y6);
|
||||
r6 = _mm256_srli_epi32(r6, 19);
|
||||
z6 = _mm256_xor_si256(z6, r6);
|
||||
|
||||
y11 = z3;
|
||||
y11 = _mm256_add_epi32(y11, z7);
|
||||
r11 = y11;
|
||||
y11 = _mm256_slli_epi32(y11, 13);
|
||||
z11 = _mm256_xor_si256(z11, y11);
|
||||
r11 = _mm256_srli_epi32(r11, 19);
|
||||
z11 = _mm256_xor_si256(z11, r11);
|
||||
|
||||
y10 = z2;
|
||||
y10 = _mm256_add_epi32(y10, z6);
|
||||
r10 = y10;
|
||||
y10 = _mm256_slli_epi32(y10, 18);
|
||||
z10 = _mm256_xor_si256(z10, y10);
|
||||
r10 = _mm256_srli_epi32(r10, 14);
|
||||
z10 = _mm256_xor_si256(z10, r10);
|
||||
|
||||
y1 = z3;
|
||||
y1 = _mm256_add_epi32(y1, z0);
|
||||
r1 = y1;
|
||||
y1 = _mm256_slli_epi32(y1, 7);
|
||||
z1 = _mm256_xor_si256(z1, y1);
|
||||
r1 = _mm256_srli_epi32(r1, 25);
|
||||
z1 = _mm256_xor_si256(z1, r1);
|
||||
|
||||
y15 = z7;
|
||||
y15 = _mm256_add_epi32(y15, z11);
|
||||
r15 = y15;
|
||||
y15 = _mm256_slli_epi32(y15, 18);
|
||||
z15 = _mm256_xor_si256(z15, y15);
|
||||
r15 = _mm256_srli_epi32(r15, 14);
|
||||
z15 = _mm256_xor_si256(z15, r15);
|
||||
|
||||
y6 = z4;
|
||||
y6 = _mm256_add_epi32(y6, z5);
|
||||
r6 = y6;
|
||||
y6 = _mm256_slli_epi32(y6, 7);
|
||||
z6 = _mm256_xor_si256(z6, y6);
|
||||
r6 = _mm256_srli_epi32(r6, 25);
|
||||
z6 = _mm256_xor_si256(z6, r6);
|
||||
|
||||
y2 = z0;
|
||||
y2 = _mm256_add_epi32(y2, z1);
|
||||
r2 = y2;
|
||||
y2 = _mm256_slli_epi32(y2, 9);
|
||||
z2 = _mm256_xor_si256(z2, y2);
|
||||
r2 = _mm256_srli_epi32(r2, 23);
|
||||
z2 = _mm256_xor_si256(z2, r2);
|
||||
|
||||
y7 = z5;
|
||||
y7 = _mm256_add_epi32(y7, z6);
|
||||
r7 = y7;
|
||||
y7 = _mm256_slli_epi32(y7, 9);
|
||||
z7 = _mm256_xor_si256(z7, y7);
|
||||
r7 = _mm256_srli_epi32(r7, 23);
|
||||
z7 = _mm256_xor_si256(z7, r7);
|
||||
|
||||
y3 = z1;
|
||||
y3 = _mm256_add_epi32(y3, z2);
|
||||
r3 = y3;
|
||||
y3 = _mm256_slli_epi32(y3, 13);
|
||||
z3 = _mm256_xor_si256(z3, y3);
|
||||
r3 = _mm256_srli_epi32(r3, 19);
|
||||
z3 = _mm256_xor_si256(z3, r3);
|
||||
|
||||
y4 = z6;
|
||||
y4 = _mm256_add_epi32(y4, z7);
|
||||
r4 = y4;
|
||||
y4 = _mm256_slli_epi32(y4, 13);
|
||||
z4 = _mm256_xor_si256(z4, y4);
|
||||
r4 = _mm256_srli_epi32(r4, 19);
|
||||
z4 = _mm256_xor_si256(z4, r4);
|
||||
|
||||
y0 = z2;
|
||||
y0 = _mm256_add_epi32(y0, z3);
|
||||
r0 = y0;
|
||||
y0 = _mm256_slli_epi32(y0, 18);
|
||||
z0 = _mm256_xor_si256(z0, y0);
|
||||
r0 = _mm256_srli_epi32(r0, 14);
|
||||
z0 = _mm256_xor_si256(z0, r0);
|
||||
|
||||
y5 = z7;
|
||||
y5 = _mm256_add_epi32(y5, z4);
|
||||
r5 = y5;
|
||||
y5 = _mm256_slli_epi32(y5, 18);
|
||||
z5 = _mm256_xor_si256(z5, y5);
|
||||
r5 = _mm256_srli_epi32(r5, 14);
|
||||
z5 = _mm256_xor_si256(z5, r5);
|
||||
|
||||
y11 = z9;
|
||||
y11 = _mm256_add_epi32(y11, z10);
|
||||
r11 = y11;
|
||||
y11 = _mm256_slli_epi32(y11, 7);
|
||||
z11 = _mm256_xor_si256(z11, y11);
|
||||
r11 = _mm256_srli_epi32(r11, 25);
|
||||
z11 = _mm256_xor_si256(z11, r11);
|
||||
|
||||
y12 = z14;
|
||||
y12 = _mm256_add_epi32(y12, z15);
|
||||
r12 = y12;
|
||||
y12 = _mm256_slli_epi32(y12, 7);
|
||||
z12 = _mm256_xor_si256(z12, y12);
|
||||
r12 = _mm256_srli_epi32(r12, 25);
|
||||
z12 = _mm256_xor_si256(z12, r12);
|
||||
|
||||
y8 = z10;
|
||||
y8 = _mm256_add_epi32(y8, z11);
|
||||
r8 = y8;
|
||||
y8 = _mm256_slli_epi32(y8, 9);
|
||||
z8 = _mm256_xor_si256(z8, y8);
|
||||
r8 = _mm256_srli_epi32(r8, 23);
|
||||
z8 = _mm256_xor_si256(z8, r8);
|
||||
|
||||
y13 = z15;
|
||||
y13 = _mm256_add_epi32(y13, z12);
|
||||
r13 = y13;
|
||||
y13 = _mm256_slli_epi32(y13, 9);
|
||||
z13 = _mm256_xor_si256(z13, y13);
|
||||
r13 = _mm256_srli_epi32(r13, 23);
|
||||
z13 = _mm256_xor_si256(z13, r13);
|
||||
|
||||
y9 = z11;
|
||||
y9 = _mm256_add_epi32(y9, z8);
|
||||
r9 = y9;
|
||||
y9 = _mm256_slli_epi32(y9, 13);
|
||||
z9 = _mm256_xor_si256(z9, y9);
|
||||
r9 = _mm256_srli_epi32(r9, 19);
|
||||
z9 = _mm256_xor_si256(z9, r9);
|
||||
|
||||
y14 = z12;
|
||||
y14 = _mm256_add_epi32(y14, z13);
|
||||
r14 = y14;
|
||||
y14 = _mm256_slli_epi32(y14, 13);
|
||||
z14 = _mm256_xor_si256(z14, y14);
|
||||
r14 = _mm256_srli_epi32(r14, 19);
|
||||
z14 = _mm256_xor_si256(z14, r14);
|
||||
|
||||
y10 = z8;
|
||||
y10 = _mm256_add_epi32(y10, z9);
|
||||
r10 = y10;
|
||||
y10 = _mm256_slli_epi32(y10, 18);
|
||||
z10 = _mm256_xor_si256(z10, y10);
|
||||
r10 = _mm256_srli_epi32(r10, 14);
|
||||
z10 = _mm256_xor_si256(z10, r10);
|
||||
|
||||
y15 = z13;
|
||||
y15 = _mm256_add_epi32(y15, z14);
|
||||
r15 = y15;
|
||||
y15 = _mm256_slli_epi32(y15, 18);
|
||||
z15 = _mm256_xor_si256(z15, y15);
|
||||
r15 = _mm256_srli_epi32(r15, 14);
|
||||
z15 = _mm256_xor_si256(z15, r15);
|
||||
}
|
||||
if(bytes >= 512)
|
||||
{
|
||||
__m256i y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12, y13, y14, y15;
|
||||
|
||||
/* the naive way seems as fast (if not a bit faster) than the vector way */
|
||||
__m256i z0 = _mm256_set1_epi32(x[0]);
|
||||
__m256i z5 = _mm256_set1_epi32(x[1]);
|
||||
__m256i z10 = _mm256_set1_epi32(x[2]);
|
||||
__m256i z15 = _mm256_set1_epi32(x[3]);
|
||||
__m256i z12 = _mm256_set1_epi32(x[4]);
|
||||
__m256i z1 = _mm256_set1_epi32(x[5]);
|
||||
__m256i z6 = _mm256_set1_epi32(x[6]);
|
||||
__m256i z11 = _mm256_set1_epi32(x[7]);
|
||||
__m256i z8; /* useless */
|
||||
__m256i z13 = _mm256_set1_epi32(x[9]);
|
||||
__m256i z2 = _mm256_set1_epi32(x[10]);
|
||||
__m256i z7 = _mm256_set1_epi32(x[11]);
|
||||
__m256i z4 = _mm256_set1_epi32(x[12]);
|
||||
__m256i z9; /* useless */
|
||||
__m256i z14 = _mm256_set1_epi32(x[14]);
|
||||
__m256i z3 = _mm256_set1_epi32(x[15]);
|
||||
|
||||
__m256i orig0 = z0;
|
||||
__m256i orig1 = z1;
|
||||
__m256i orig2 = z2;
|
||||
__m256i orig3 = z3;
|
||||
__m256i orig4 = z4;
|
||||
__m256i orig5 = z5;
|
||||
__m256i orig6 = z6;
|
||||
__m256i orig7 = z7;
|
||||
__m256i orig8;
|
||||
__m256i orig9;
|
||||
__m256i orig10 = z10;
|
||||
__m256i orig11 = z11;
|
||||
__m256i orig12 = z12;
|
||||
__m256i orig13 = z13;
|
||||
__m256i orig14 = z14;
|
||||
__m256i orig15 = z15;
|
||||
|
||||
uint32_t in8;
|
||||
uint32_t in9;
|
||||
int i;
|
||||
|
||||
while(bytes >= 512)
|
||||
{
|
||||
/* vector implementation for z8 and z9 */
|
||||
/* faster than the naive version for 8 blocks */
|
||||
const __m256i addv8 = _mm256_set_epi64x(3, 2, 1, 0);
|
||||
const __m256i addv9 = _mm256_set_epi64x(7, 6, 5, 4);
|
||||
const __m256i permute = _mm256_set_epi32(7, 6, 3, 2, 5, 4, 1, 0);
|
||||
|
||||
__m256i t8, t9;
|
||||
uint64_t in89;
|
||||
|
||||
in8 = x[8];
|
||||
in9 = x[13]; /* see arrays above for the address translation */
|
||||
in89 = ((uint64_t)in8) | (((uint64_t)in9) << 32);
|
||||
|
||||
z8 = z9 = _mm256_broadcastq_epi64(_mm_cvtsi64_si128(in89));
|
||||
|
||||
t8 = _mm256_add_epi64(addv8, z8);
|
||||
t9 = _mm256_add_epi64(addv9, z9);
|
||||
|
||||
z8 = _mm256_unpacklo_epi32(t8, t9);
|
||||
z9 = _mm256_unpackhi_epi32(t8, t9);
|
||||
|
||||
t8 = _mm256_unpacklo_epi32(z8, z9);
|
||||
t9 = _mm256_unpackhi_epi32(z8, z9);
|
||||
|
||||
/* required because unpack* are intra-lane */
|
||||
z8 = _mm256_permutevar8x32_epi32(t8, permute);
|
||||
z9 = _mm256_permutevar8x32_epi32(t9, permute);
|
||||
|
||||
orig8 = z8;
|
||||
orig9 = z9;
|
||||
|
||||
in89 += 8;
|
||||
|
||||
x[8] = in89 & 0xFFFFFFFF;
|
||||
x[13] = (in89 >> 32) & 0xFFFFFFFF;
|
||||
|
||||
z5 = orig5;
|
||||
z10 = orig10;
|
||||
z15 = orig15;
|
||||
z14 = orig14;
|
||||
z3 = orig3;
|
||||
z6 = orig6;
|
||||
z11 = orig11;
|
||||
z1 = orig1;
|
||||
|
||||
z7 = orig7;
|
||||
z13 = orig13;
|
||||
z2 = orig2;
|
||||
z9 = orig9;
|
||||
z0 = orig0;
|
||||
z12 = orig12;
|
||||
z4 = orig4;
|
||||
z8 = orig8;
|
||||
|
||||
for(i = 0; i < ROUNDS; i += 2)
|
||||
{
|
||||
/* the inner loop is a direct translation (regexp search/replace)
|
||||
* from the amd64-xmm6 ASM */
|
||||
__m256i r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14,
|
||||
r15;
|
||||
|
||||
y4 = z12;
|
||||
y4 = _mm256_add_epi32(y4, z0);
|
||||
r4 = y4;
|
||||
y4 = _mm256_slli_epi32(y4, 7);
|
||||
z4 = _mm256_xor_si256(z4, y4);
|
||||
r4 = _mm256_srli_epi32(r4, 25);
|
||||
z4 = _mm256_xor_si256(z4, r4);
|
||||
|
||||
y9 = z1;
|
||||
y9 = _mm256_add_epi32(y9, z5);
|
||||
r9 = y9;
|
||||
y9 = _mm256_slli_epi32(y9, 7);
|
||||
z9 = _mm256_xor_si256(z9, y9);
|
||||
r9 = _mm256_srli_epi32(r9, 25);
|
||||
z9 = _mm256_xor_si256(z9, r9);
|
||||
|
||||
y8 = z0;
|
||||
y8 = _mm256_add_epi32(y8, z4);
|
||||
r8 = y8;
|
||||
y8 = _mm256_slli_epi32(y8, 9);
|
||||
z8 = _mm256_xor_si256(z8, y8);
|
||||
r8 = _mm256_srli_epi32(r8, 23);
|
||||
z8 = _mm256_xor_si256(z8, r8);
|
||||
|
||||
y13 = z5;
|
||||
y13 = _mm256_add_epi32(y13, z9);
|
||||
r13 = y13;
|
||||
y13 = _mm256_slli_epi32(y13, 9);
|
||||
z13 = _mm256_xor_si256(z13, y13);
|
||||
r13 = _mm256_srli_epi32(r13, 23);
|
||||
z13 = _mm256_xor_si256(z13, r13);
|
||||
|
||||
y12 = z4;
|
||||
y12 = _mm256_add_epi32(y12, z8);
|
||||
r12 = y12;
|
||||
y12 = _mm256_slli_epi32(y12, 13);
|
||||
z12 = _mm256_xor_si256(z12, y12);
|
||||
r12 = _mm256_srli_epi32(r12, 19);
|
||||
z12 = _mm256_xor_si256(z12, r12);
|
||||
|
||||
y1 = z9;
|
||||
y1 = _mm256_add_epi32(y1, z13);
|
||||
r1 = y1;
|
||||
y1 = _mm256_slli_epi32(y1, 13);
|
||||
z1 = _mm256_xor_si256(z1, y1);
|
||||
r1 = _mm256_srli_epi32(r1, 19);
|
||||
z1 = _mm256_xor_si256(z1, r1);
|
||||
|
||||
y0 = z8;
|
||||
y0 = _mm256_add_epi32(y0, z12);
|
||||
r0 = y0;
|
||||
y0 = _mm256_slli_epi32(y0, 18);
|
||||
z0 = _mm256_xor_si256(z0, y0);
|
||||
r0 = _mm256_srli_epi32(r0, 14);
|
||||
z0 = _mm256_xor_si256(z0, r0);
|
||||
|
||||
y5 = z13;
|
||||
y5 = _mm256_add_epi32(y5, z1);
|
||||
r5 = y5;
|
||||
y5 = _mm256_slli_epi32(y5, 18);
|
||||
z5 = _mm256_xor_si256(z5, y5);
|
||||
r5 = _mm256_srli_epi32(r5, 14);
|
||||
z5 = _mm256_xor_si256(z5, r5);
|
||||
|
||||
y14 = z6;
|
||||
y14 = _mm256_add_epi32(y14, z10);
|
||||
r14 = y14;
|
||||
y14 = _mm256_slli_epi32(y14, 7);
|
||||
z14 = _mm256_xor_si256(z14, y14);
|
||||
r14 = _mm256_srli_epi32(r14, 25);
|
||||
z14 = _mm256_xor_si256(z14, r14);
|
||||
|
||||
y3 = z11;
|
||||
y3 = _mm256_add_epi32(y3, z15);
|
||||
r3 = y3;
|
||||
y3 = _mm256_slli_epi32(y3, 7);
|
||||
z3 = _mm256_xor_si256(z3, y3);
|
||||
r3 = _mm256_srli_epi32(r3, 25);
|
||||
z3 = _mm256_xor_si256(z3, r3);
|
||||
|
||||
y2 = z10;
|
||||
y2 = _mm256_add_epi32(y2, z14);
|
||||
r2 = y2;
|
||||
y2 = _mm256_slli_epi32(y2, 9);
|
||||
z2 = _mm256_xor_si256(z2, y2);
|
||||
r2 = _mm256_srli_epi32(r2, 23);
|
||||
z2 = _mm256_xor_si256(z2, r2);
|
||||
|
||||
y7 = z15;
|
||||
y7 = _mm256_add_epi32(y7, z3);
|
||||
r7 = y7;
|
||||
y7 = _mm256_slli_epi32(y7, 9);
|
||||
z7 = _mm256_xor_si256(z7, y7);
|
||||
r7 = _mm256_srli_epi32(r7, 23);
|
||||
z7 = _mm256_xor_si256(z7, r7);
|
||||
|
||||
y6 = z14;
|
||||
y6 = _mm256_add_epi32(y6, z2);
|
||||
r6 = y6;
|
||||
y6 = _mm256_slli_epi32(y6, 13);
|
||||
z6 = _mm256_xor_si256(z6, y6);
|
||||
r6 = _mm256_srli_epi32(r6, 19);
|
||||
z6 = _mm256_xor_si256(z6, r6);
|
||||
|
||||
y11 = z3;
|
||||
y11 = _mm256_add_epi32(y11, z7);
|
||||
r11 = y11;
|
||||
y11 = _mm256_slli_epi32(y11, 13);
|
||||
z11 = _mm256_xor_si256(z11, y11);
|
||||
r11 = _mm256_srli_epi32(r11, 19);
|
||||
z11 = _mm256_xor_si256(z11, r11);
|
||||
|
||||
y10 = z2;
|
||||
y10 = _mm256_add_epi32(y10, z6);
|
||||
r10 = y10;
|
||||
y10 = _mm256_slli_epi32(y10, 18);
|
||||
z10 = _mm256_xor_si256(z10, y10);
|
||||
r10 = _mm256_srli_epi32(r10, 14);
|
||||
z10 = _mm256_xor_si256(z10, r10);
|
||||
|
||||
y1 = z3;
|
||||
y1 = _mm256_add_epi32(y1, z0);
|
||||
r1 = y1;
|
||||
y1 = _mm256_slli_epi32(y1, 7);
|
||||
z1 = _mm256_xor_si256(z1, y1);
|
||||
r1 = _mm256_srli_epi32(r1, 25);
|
||||
z1 = _mm256_xor_si256(z1, r1);
|
||||
|
||||
y15 = z7;
|
||||
y15 = _mm256_add_epi32(y15, z11);
|
||||
r15 = y15;
|
||||
y15 = _mm256_slli_epi32(y15, 18);
|
||||
z15 = _mm256_xor_si256(z15, y15);
|
||||
r15 = _mm256_srli_epi32(r15, 14);
|
||||
z15 = _mm256_xor_si256(z15, r15);
|
||||
|
||||
y6 = z4;
|
||||
y6 = _mm256_add_epi32(y6, z5);
|
||||
r6 = y6;
|
||||
y6 = _mm256_slli_epi32(y6, 7);
|
||||
z6 = _mm256_xor_si256(z6, y6);
|
||||
r6 = _mm256_srli_epi32(r6, 25);
|
||||
z6 = _mm256_xor_si256(z6, r6);
|
||||
|
||||
y2 = z0;
|
||||
y2 = _mm256_add_epi32(y2, z1);
|
||||
r2 = y2;
|
||||
y2 = _mm256_slli_epi32(y2, 9);
|
||||
z2 = _mm256_xor_si256(z2, y2);
|
||||
r2 = _mm256_srli_epi32(r2, 23);
|
||||
z2 = _mm256_xor_si256(z2, r2);
|
||||
|
||||
y7 = z5;
|
||||
y7 = _mm256_add_epi32(y7, z6);
|
||||
r7 = y7;
|
||||
y7 = _mm256_slli_epi32(y7, 9);
|
||||
z7 = _mm256_xor_si256(z7, y7);
|
||||
r7 = _mm256_srli_epi32(r7, 23);
|
||||
z7 = _mm256_xor_si256(z7, r7);
|
||||
|
||||
y3 = z1;
|
||||
y3 = _mm256_add_epi32(y3, z2);
|
||||
r3 = y3;
|
||||
y3 = _mm256_slli_epi32(y3, 13);
|
||||
z3 = _mm256_xor_si256(z3, y3);
|
||||
r3 = _mm256_srli_epi32(r3, 19);
|
||||
z3 = _mm256_xor_si256(z3, r3);
|
||||
|
||||
y4 = z6;
|
||||
y4 = _mm256_add_epi32(y4, z7);
|
||||
r4 = y4;
|
||||
y4 = _mm256_slli_epi32(y4, 13);
|
||||
z4 = _mm256_xor_si256(z4, y4);
|
||||
r4 = _mm256_srli_epi32(r4, 19);
|
||||
z4 = _mm256_xor_si256(z4, r4);
|
||||
|
||||
y0 = z2;
|
||||
y0 = _mm256_add_epi32(y0, z3);
|
||||
r0 = y0;
|
||||
y0 = _mm256_slli_epi32(y0, 18);
|
||||
z0 = _mm256_xor_si256(z0, y0);
|
||||
r0 = _mm256_srli_epi32(r0, 14);
|
||||
z0 = _mm256_xor_si256(z0, r0);
|
||||
|
||||
y5 = z7;
|
||||
y5 = _mm256_add_epi32(y5, z4);
|
||||
r5 = y5;
|
||||
y5 = _mm256_slli_epi32(y5, 18);
|
||||
z5 = _mm256_xor_si256(z5, y5);
|
||||
r5 = _mm256_srli_epi32(r5, 14);
|
||||
z5 = _mm256_xor_si256(z5, r5);
|
||||
|
||||
y11 = z9;
|
||||
y11 = _mm256_add_epi32(y11, z10);
|
||||
r11 = y11;
|
||||
y11 = _mm256_slli_epi32(y11, 7);
|
||||
z11 = _mm256_xor_si256(z11, y11);
|
||||
r11 = _mm256_srli_epi32(r11, 25);
|
||||
z11 = _mm256_xor_si256(z11, r11);
|
||||
|
||||
y12 = z14;
|
||||
y12 = _mm256_add_epi32(y12, z15);
|
||||
r12 = y12;
|
||||
y12 = _mm256_slli_epi32(y12, 7);
|
||||
z12 = _mm256_xor_si256(z12, y12);
|
||||
r12 = _mm256_srli_epi32(r12, 25);
|
||||
z12 = _mm256_xor_si256(z12, r12);
|
||||
|
||||
y8 = z10;
|
||||
y8 = _mm256_add_epi32(y8, z11);
|
||||
r8 = y8;
|
||||
y8 = _mm256_slli_epi32(y8, 9);
|
||||
z8 = _mm256_xor_si256(z8, y8);
|
||||
r8 = _mm256_srli_epi32(r8, 23);
|
||||
z8 = _mm256_xor_si256(z8, r8);
|
||||
|
||||
y13 = z15;
|
||||
y13 = _mm256_add_epi32(y13, z12);
|
||||
r13 = y13;
|
||||
y13 = _mm256_slli_epi32(y13, 9);
|
||||
z13 = _mm256_xor_si256(z13, y13);
|
||||
r13 = _mm256_srli_epi32(r13, 23);
|
||||
z13 = _mm256_xor_si256(z13, r13);
|
||||
|
||||
y9 = z11;
|
||||
y9 = _mm256_add_epi32(y9, z8);
|
||||
r9 = y9;
|
||||
y9 = _mm256_slli_epi32(y9, 13);
|
||||
z9 = _mm256_xor_si256(z9, y9);
|
||||
r9 = _mm256_srli_epi32(r9, 19);
|
||||
z9 = _mm256_xor_si256(z9, r9);
|
||||
|
||||
y14 = z12;
|
||||
y14 = _mm256_add_epi32(y14, z13);
|
||||
r14 = y14;
|
||||
y14 = _mm256_slli_epi32(y14, 13);
|
||||
z14 = _mm256_xor_si256(z14, y14);
|
||||
r14 = _mm256_srli_epi32(r14, 19);
|
||||
z14 = _mm256_xor_si256(z14, r14);
|
||||
|
||||
y10 = z8;
|
||||
y10 = _mm256_add_epi32(y10, z9);
|
||||
r10 = y10;
|
||||
y10 = _mm256_slli_epi32(y10, 18);
|
||||
z10 = _mm256_xor_si256(z10, y10);
|
||||
r10 = _mm256_srli_epi32(r10, 14);
|
||||
z10 = _mm256_xor_si256(z10, r10);
|
||||
|
||||
y15 = z13;
|
||||
y15 = _mm256_add_epi32(y15, z14);
|
||||
r15 = y15;
|
||||
y15 = _mm256_slli_epi32(y15, 18);
|
||||
z15 = _mm256_xor_si256(z15, y15);
|
||||
r15 = _mm256_srli_epi32(r15, 14);
|
||||
z15 = _mm256_xor_si256(z15, r15);
|
||||
}
|
||||
|
||||
/* store data ; this macro first transpose data in-registers, and then store
|
||||
* them in memory. much faster with icc. */
|
||||
#define ONEQUAD_TRANSPOSE(A, B, C, D) \
|
||||
{ \
|
||||
__m128i t0, t1, t2, t3; \
|
||||
z##A = _mm256_add_epi32(z##A, orig##A); \
|
||||
z##B = _mm256_add_epi32(z##B, orig##B); \
|
||||
z##C = _mm256_add_epi32(z##C, orig##C); \
|
||||
z##D = _mm256_add_epi32(z##D, orig##D); \
|
||||
y##A = _mm256_unpacklo_epi32(z##A, z##B); \
|
||||
y##B = _mm256_unpacklo_epi32(z##C, z##D); \
|
||||
y##C = _mm256_unpackhi_epi32(z##A, z##B); \
|
||||
y##D = _mm256_unpackhi_epi32(z##C, z##D); \
|
||||
z##A = _mm256_unpacklo_epi64(y##A, y##B); \
|
||||
z##B = _mm256_unpackhi_epi64(y##A, y##B); \
|
||||
z##C = _mm256_unpacklo_epi64(y##C, y##D); \
|
||||
z##D = _mm256_unpackhi_epi64(y##C, y##D); \
|
||||
t0 = _mm_xor_si128(_mm256_extracti128_si256(z##A, 0), \
|
||||
_mm_loadu_si128((__m128i*) (m + 0))); \
|
||||
_mm_storeu_si128((__m128i*) (c + 0), t0); \
|
||||
t1 = _mm_xor_si128(_mm256_extracti128_si256(z##B, 0), \
|
||||
_mm_loadu_si128((__m128i*) (m + 64))); \
|
||||
_mm_storeu_si128((__m128i*) (c + 64), t1); \
|
||||
t2 = _mm_xor_si128(_mm256_extracti128_si256(z##C, 0), \
|
||||
_mm_loadu_si128((__m128i*) (m + 128))); \
|
||||
_mm_storeu_si128((__m128i*) (c + 128), t2); \
|
||||
t3 = _mm_xor_si128(_mm256_extracti128_si256(z##D, 0), \
|
||||
_mm_loadu_si128((__m128i*) (m + 192))); \
|
||||
_mm_storeu_si128((__m128i*) (c + 192), t3); \
|
||||
t0 = _mm_xor_si128(_mm256_extracti128_si256(z##A, 1), \
|
||||
_mm_loadu_si128((__m128i*) (m + 256))); \
|
||||
_mm_storeu_si128((__m128i*) (c + 256), t0); \
|
||||
t1 = _mm_xor_si128(_mm256_extracti128_si256(z##B, 1), \
|
||||
_mm_loadu_si128((__m128i*) (m + 320))); \
|
||||
_mm_storeu_si128((__m128i*) (c + 320), t1); \
|
||||
t2 = _mm_xor_si128(_mm256_extracti128_si256(z##C, 1), \
|
||||
_mm_loadu_si128((__m128i*) (m + 384))); \
|
||||
_mm_storeu_si128((__m128i*) (c + 384), t2); \
|
||||
t3 = _mm_xor_si128(_mm256_extracti128_si256(z##D, 1), \
|
||||
_mm_loadu_si128((__m128i*) (m + 448))); \
|
||||
_mm_storeu_si128((__m128i*) (c + 448), t3); \
|
||||
}
|
||||
#define ONEQUAD_TRANSPOSE(A, B, C, D) \
|
||||
{ \
|
||||
__m128i t0, t1, t2, t3; \
|
||||
z##A = _mm256_add_epi32(z##A, orig##A); \
|
||||
z##B = _mm256_add_epi32(z##B, orig##B); \
|
||||
z##C = _mm256_add_epi32(z##C, orig##C); \
|
||||
z##D = _mm256_add_epi32(z##D, orig##D); \
|
||||
y##A = _mm256_unpacklo_epi32(z##A, z##B); \
|
||||
y##B = _mm256_unpacklo_epi32(z##C, z##D); \
|
||||
y##C = _mm256_unpackhi_epi32(z##A, z##B); \
|
||||
y##D = _mm256_unpackhi_epi32(z##C, z##D); \
|
||||
z##A = _mm256_unpacklo_epi64(y##A, y##B); \
|
||||
z##B = _mm256_unpackhi_epi64(y##A, y##B); \
|
||||
z##C = _mm256_unpacklo_epi64(y##C, y##D); \
|
||||
z##D = _mm256_unpackhi_epi64(y##C, y##D); \
|
||||
t0 = _mm_xor_si128(_mm256_extracti128_si256(z##A, 0), \
|
||||
_mm_loadu_si128((__m128i*)(m + 0))); \
|
||||
_mm_storeu_si128((__m128i*)(c + 0), t0); \
|
||||
t1 = _mm_xor_si128(_mm256_extracti128_si256(z##B, 0), \
|
||||
_mm_loadu_si128((__m128i*)(m + 64))); \
|
||||
_mm_storeu_si128((__m128i*)(c + 64), t1); \
|
||||
t2 = _mm_xor_si128(_mm256_extracti128_si256(z##C, 0), \
|
||||
_mm_loadu_si128((__m128i*)(m + 128))); \
|
||||
_mm_storeu_si128((__m128i*)(c + 128), t2); \
|
||||
t3 = _mm_xor_si128(_mm256_extracti128_si256(z##D, 0), \
|
||||
_mm_loadu_si128((__m128i*)(m + 192))); \
|
||||
_mm_storeu_si128((__m128i*)(c + 192), t3); \
|
||||
t0 = _mm_xor_si128(_mm256_extracti128_si256(z##A, 1), \
|
||||
_mm_loadu_si128((__m128i*)(m + 256))); \
|
||||
_mm_storeu_si128((__m128i*)(c + 256), t0); \
|
||||
t1 = _mm_xor_si128(_mm256_extracti128_si256(z##B, 1), \
|
||||
_mm_loadu_si128((__m128i*)(m + 320))); \
|
||||
_mm_storeu_si128((__m128i*)(c + 320), t1); \
|
||||
t2 = _mm_xor_si128(_mm256_extracti128_si256(z##C, 1), \
|
||||
_mm_loadu_si128((__m128i*)(m + 384))); \
|
||||
_mm_storeu_si128((__m128i*)(c + 384), t2); \
|
||||
t3 = _mm_xor_si128(_mm256_extracti128_si256(z##D, 1), \
|
||||
_mm_loadu_si128((__m128i*)(m + 448))); \
|
||||
_mm_storeu_si128((__m128i*)(c + 448), t3); \
|
||||
}
|
||||
|
||||
#define ONEQUAD(A, B, C, D) ONEQUAD_TRANSPOSE(A, B, C, D)
|
||||
|
||||
#define ONEQUAD_UNPCK(A, B, C, D) \
|
||||
{ \
|
||||
z##A = _mm256_add_epi32(z##A, orig##A); \
|
||||
z##B = _mm256_add_epi32(z##B, orig##B); \
|
||||
z##C = _mm256_add_epi32(z##C, orig##C); \
|
||||
z##D = _mm256_add_epi32(z##D, orig##D); \
|
||||
y##A = _mm256_unpacklo_epi32(z##A, z##B); \
|
||||
y##B = _mm256_unpacklo_epi32(z##C, z##D); \
|
||||
y##C = _mm256_unpackhi_epi32(z##A, z##B); \
|
||||
y##D = _mm256_unpackhi_epi32(z##C, z##D); \
|
||||
z##A = _mm256_unpacklo_epi64(y##A, y##B); \
|
||||
z##B = _mm256_unpackhi_epi64(y##A, y##B); \
|
||||
z##C = _mm256_unpacklo_epi64(y##C, y##D); \
|
||||
z##D = _mm256_unpackhi_epi64(y##C, y##D); \
|
||||
}
|
||||
|
||||
#define ONEOCTO(A, B, C, D, A2, B2, C2, D2) \
|
||||
{ \
|
||||
ONEQUAD_UNPCK(A, B, C, D); \
|
||||
ONEQUAD_UNPCK(A2, B2, C2, D2); \
|
||||
y##A = _mm256_permute2x128_si256(z##A, z##A2, 0x20); \
|
||||
y##A2 = _mm256_permute2x128_si256(z##A, z##A2, 0x31); \
|
||||
y##B = _mm256_permute2x128_si256(z##B, z##B2, 0x20); \
|
||||
y##B2 = _mm256_permute2x128_si256(z##B, z##B2, 0x31); \
|
||||
y##C = _mm256_permute2x128_si256(z##C, z##C2, 0x20); \
|
||||
y##C2 = _mm256_permute2x128_si256(z##C, z##C2, 0x31); \
|
||||
y##D = _mm256_permute2x128_si256(z##D, z##D2, 0x20); \
|
||||
y##D2 = _mm256_permute2x128_si256(z##D, z##D2, 0x31); \
|
||||
y##A = _mm256_xor_si256(y##A, _mm256_loadu_si256((__m256i*) (m + 0))); \
|
||||
y##B = \
|
||||
_mm256_xor_si256(y##B, _mm256_loadu_si256((__m256i*) (m + 64))); \
|
||||
y##C = \
|
||||
_mm256_xor_si256(y##C, _mm256_loadu_si256((__m256i*) (m + 128))); \
|
||||
y##D = \
|
||||
_mm256_xor_si256(y##D, _mm256_loadu_si256((__m256i*) (m + 192))); \
|
||||
y##A2 = \
|
||||
_mm256_xor_si256(y##A2, _mm256_loadu_si256((__m256i*) (m + 256))); \
|
||||
y##B2 = \
|
||||
_mm256_xor_si256(y##B2, _mm256_loadu_si256((__m256i*) (m + 320))); \
|
||||
y##C2 = \
|
||||
_mm256_xor_si256(y##C2, _mm256_loadu_si256((__m256i*) (m + 384))); \
|
||||
y##D2 = \
|
||||
_mm256_xor_si256(y##D2, _mm256_loadu_si256((__m256i*) (m + 448))); \
|
||||
_mm256_storeu_si256((__m256i*) (c + 0), y##A); \
|
||||
_mm256_storeu_si256((__m256i*) (c + 64), y##B); \
|
||||
_mm256_storeu_si256((__m256i*) (c + 128), y##C); \
|
||||
_mm256_storeu_si256((__m256i*) (c + 192), y##D); \
|
||||
_mm256_storeu_si256((__m256i*) (c + 256), y##A2); \
|
||||
_mm256_storeu_si256((__m256i*) (c + 320), y##B2); \
|
||||
_mm256_storeu_si256((__m256i*) (c + 384), y##C2); \
|
||||
_mm256_storeu_si256((__m256i*) (c + 448), y##D2); \
|
||||
}
|
||||
|
||||
ONEOCTO(0, 1, 2, 3, 4, 5, 6, 7);
|
||||
m += 32;
|
||||
c += 32;
|
||||
ONEOCTO(8, 9, 10, 11, 12, 13, 14, 15);
|
||||
m -= 32;
|
||||
c -= 32;
|
||||
#define ONEQUAD_UNPCK(A, B, C, D) \
|
||||
{ \
|
||||
z##A = _mm256_add_epi32(z##A, orig##A); \
|
||||
z##B = _mm256_add_epi32(z##B, orig##B); \
|
||||
z##C = _mm256_add_epi32(z##C, orig##C); \
|
||||
z##D = _mm256_add_epi32(z##D, orig##D); \
|
||||
y##A = _mm256_unpacklo_epi32(z##A, z##B); \
|
||||
y##B = _mm256_unpacklo_epi32(z##C, z##D); \
|
||||
y##C = _mm256_unpackhi_epi32(z##A, z##B); \
|
||||
y##D = _mm256_unpackhi_epi32(z##C, z##D); \
|
||||
z##A = _mm256_unpacklo_epi64(y##A, y##B); \
|
||||
z##B = _mm256_unpackhi_epi64(y##A, y##B); \
|
||||
z##C = _mm256_unpacklo_epi64(y##C, y##D); \
|
||||
z##D = _mm256_unpackhi_epi64(y##C, y##D); \
|
||||
}
|
||||
|
||||
#define ONEOCTO(A, B, C, D, A2, B2, C2, D2) \
|
||||
{ \
|
||||
ONEQUAD_UNPCK(A, B, C, D); \
|
||||
ONEQUAD_UNPCK(A2, B2, C2, D2); \
|
||||
y##A = _mm256_permute2x128_si256(z##A, z##A2, 0x20); \
|
||||
y##A2 = _mm256_permute2x128_si256(z##A, z##A2, 0x31); \
|
||||
y##B = _mm256_permute2x128_si256(z##B, z##B2, 0x20); \
|
||||
y##B2 = _mm256_permute2x128_si256(z##B, z##B2, 0x31); \
|
||||
y##C = _mm256_permute2x128_si256(z##C, z##C2, 0x20); \
|
||||
y##C2 = _mm256_permute2x128_si256(z##C, z##C2, 0x31); \
|
||||
y##D = _mm256_permute2x128_si256(z##D, z##D2, 0x20); \
|
||||
y##D2 = _mm256_permute2x128_si256(z##D, z##D2, 0x31); \
|
||||
y##A = _mm256_xor_si256(y##A, _mm256_loadu_si256((__m256i*)(m + 0))); \
|
||||
y##B = _mm256_xor_si256(y##B, _mm256_loadu_si256((__m256i*)(m + 64))); \
|
||||
y##C = _mm256_xor_si256(y##C, _mm256_loadu_si256((__m256i*)(m + 128))); \
|
||||
y##D = _mm256_xor_si256(y##D, _mm256_loadu_si256((__m256i*)(m + 192))); \
|
||||
y##A2 = _mm256_xor_si256(y##A2, _mm256_loadu_si256((__m256i*)(m + 256))); \
|
||||
y##B2 = _mm256_xor_si256(y##B2, _mm256_loadu_si256((__m256i*)(m + 320))); \
|
||||
y##C2 = _mm256_xor_si256(y##C2, _mm256_loadu_si256((__m256i*)(m + 384))); \
|
||||
y##D2 = _mm256_xor_si256(y##D2, _mm256_loadu_si256((__m256i*)(m + 448))); \
|
||||
_mm256_storeu_si256((__m256i*)(c + 0), y##A); \
|
||||
_mm256_storeu_si256((__m256i*)(c + 64), y##B); \
|
||||
_mm256_storeu_si256((__m256i*)(c + 128), y##C); \
|
||||
_mm256_storeu_si256((__m256i*)(c + 192), y##D); \
|
||||
_mm256_storeu_si256((__m256i*)(c + 256), y##A2); \
|
||||
_mm256_storeu_si256((__m256i*)(c + 320), y##B2); \
|
||||
_mm256_storeu_si256((__m256i*)(c + 384), y##C2); \
|
||||
_mm256_storeu_si256((__m256i*)(c + 448), y##D2); \
|
||||
}
|
||||
|
||||
ONEOCTO(0, 1, 2, 3, 4, 5, 6, 7);
|
||||
m += 32;
|
||||
c += 32;
|
||||
ONEOCTO(8, 9, 10, 11, 12, 13, 14, 15);
|
||||
m -= 32;
|
||||
c -= 32;
|
||||
|
||||
#undef ONEQUAD
|
||||
#undef ONEQUAD_TRANSPOSE
|
||||
#undef ONEQUAD_UNPCK
|
||||
#undef ONEOCTO
|
||||
|
||||
bytes -= 512;
|
||||
c += 512;
|
||||
m += 512;
|
||||
}
|
||||
bytes -= 512;
|
||||
c += 512;
|
||||
m += 512;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue