2929} while(0)
3030
3131static void secp256k1_sha256_initialize (secp256k1_sha256 * hash ) {
32- #ifdef __AVX2__
33- const __m256i vec = _mm256_setr_epi32 (
32+ #if defined( __AVX2__ )
33+ const __m256i vec = _mm256_setr_epi32 ( /* TODO: precompute */
3434 0x6a09e667 , 0xbb67ae85 , 0x3c6ef372 , 0xa54ff53a ,
3535 0x510e527f , 0x9b05688c , 0x1f83d9ab , 0x5be0cd19
3636 );
3737 _mm256_storeu_si256 ((__m256i * )hash -> s , vec );
38+ #elif defined(__SSE2__ )
39+ const __m128i vec1 = _mm_setr_epi32 (0x6a09e667 , 0xbb67ae85 , 0x3c6ef372 , 0xa54ff53a ); /* TODO: precompute */
40+ const __m128i vec2 = _mm_setr_epi32 (0x510e527f , 0x9b05688c , 0x1f83d9ab , 0x5be0cd19 ); /* TODO: precompute */
41+ _mm_storeu_si128 ((__m128i * )hash -> s , vec1 );
42+ _mm_storeu_si128 ((__m128i * )(hash -> s + 4 ), vec2 );
3843#else
3944 hash -> s [0 ] = 0x6a09e667ul ;
4045 hash -> s [1 ] = 0xbb67ae85ul ;
@@ -53,6 +58,8 @@ static void secp256k1_sha256_transform(uint32_t* s, const unsigned char* buf) {
5358 uint32_t a = s [0 ], b = s [1 ], c = s [2 ], d = s [3 ], e = s [4 ], f = s [5 ], g = s [6 ], h = s [7 ];
5459 uint32_t w0 , w1 , w2 , w3 , w4 , w5 , w6 , w7 , w8 , w9 , w10 , w11 , w12 , w13 , w14 , w15 ;
5560
61+ /* TODO: load wX in parallel */
62+
5663 Round (a , b , c , d , e , f , g , h , 0x428a2f98 , w0 = secp256k1_read_be32 (& buf [0 ]));
5764 Round (h , a , b , c , d , e , f , g , 0x71374491 , w1 = secp256k1_read_be32 (& buf [4 ]));
5865 Round (g , h , a , b , c , d , e , f , 0xb5c0fbcf , w2 = secp256k1_read_be32 (& buf [8 ]));
@@ -70,50 +77,56 @@ static void secp256k1_sha256_transform(uint32_t* s, const unsigned char* buf) {
7077 Round (c , d , e , f , g , h , a , b , 0x9bdc06a7 , w14 = secp256k1_read_be32 (& buf [56 ]));
7178 Round (b , c , d , e , f , g , h , a , 0xc19bf174 , w15 = secp256k1_read_be32 (& buf [60 ]));
7279
73- Round (a , b , c , d , e , f , g , h , 0xe49b69c1 , w0 += sigma1 (w14 ) + w9 + sigma0 (w1 ));
74- Round (h , a , b , c , d , e , f , g , 0xefbe4786 , w1 += sigma1 (w15 ) + w10 + sigma0 (w2 ));
75- Round (g , h , a , b , c , d , e , f , 0x0fc19dc6 , w2 += sigma1 (w0 ) + w11 + sigma0 (w3 ));
76- Round (f , g , h , a , b , c , d , e , 0x240ca1cc , w3 += sigma1 (w1 ) + w12 + sigma0 (w4 ));
77- Round (e , f , g , h , a , b , c , d , 0x2de92c6f , w4 += sigma1 (w2 ) + w13 + sigma0 (w5 ));
78- Round (d , e , f , g , h , a , b , c , 0x4a7484aa , w5 += sigma1 (w3 ) + w14 + sigma0 (w6 ));
79- Round (c , d , e , f , g , h , a , b , 0x5cb0a9dc , w6 += sigma1 (w4 ) + w15 + sigma0 (w7 ));
80- Round (b , c , d , e , f , g , h , a , 0x76f988da , w7 += sigma1 (w5 ) + w0 + sigma0 (w8 ));
81- Round (a , b , c , d , e , f , g , h , 0x983e5152 , w8 += sigma1 (w6 ) + w1 + sigma0 (w9 ));
82- Round (h , a , b , c , d , e , f , g , 0xa831c66d , w9 += sigma1 (w7 ) + w2 + sigma0 (w10 ));
80+ /* TODO: sum wX in parallel */
81+
82+ Round (a , b , c , d , e , f , g , h , 0xe49b69c1 , w0 += sigma1 (w14 ) + w9 + sigma0 (w1 ));
83+ Round (h , a , b , c , d , e , f , g , 0xefbe4786 , w1 += sigma1 (w15 ) + w10 + sigma0 (w2 ));
84+ Round (g , h , a , b , c , d , e , f , 0x0fc19dc6 , w2 += sigma1 (w0 ) + w11 + sigma0 (w3 ));
85+ Round (f , g , h , a , b , c , d , e , 0x240ca1cc , w3 += sigma1 (w1 ) + w12 + sigma0 (w4 ));
86+ Round (e , f , g , h , a , b , c , d , 0x2de92c6f , w4 += sigma1 (w2 ) + w13 + sigma0 (w5 ));
87+ Round (d , e , f , g , h , a , b , c , 0x4a7484aa , w5 += sigma1 (w3 ) + w14 + sigma0 (w6 ));
88+ Round (c , d , e , f , g , h , a , b , 0x5cb0a9dc , w6 += sigma1 (w4 ) + w15 + sigma0 (w7 ));
89+ Round (b , c , d , e , f , g , h , a , 0x76f988da , w7 += sigma1 (w5 ) + w0 + sigma0 (w8 ));
90+ Round (a , b , c , d , e , f , g , h , 0x983e5152 , w8 += sigma1 (w6 ) + w1 + sigma0 (w9 ));
91+ Round (h , a , b , c , d , e , f , g , 0xa831c66d , w9 += sigma1 (w7 ) + w2 + sigma0 (w10 ));
8392 Round (g , h , a , b , c , d , e , f , 0xb00327c8 , w10 += sigma1 (w8 ) + w3 + sigma0 (w11 ));
8493 Round (f , g , h , a , b , c , d , e , 0xbf597fc7 , w11 += sigma1 (w9 ) + w4 + sigma0 (w12 ));
8594 Round (e , f , g , h , a , b , c , d , 0xc6e00bf3 , w12 += sigma1 (w10 ) + w5 + sigma0 (w13 ));
8695 Round (d , e , f , g , h , a , b , c , 0xd5a79147 , w13 += sigma1 (w11 ) + w6 + sigma0 (w14 ));
8796 Round (c , d , e , f , g , h , a , b , 0x06ca6351 , w14 += sigma1 (w12 ) + w7 + sigma0 (w15 ));
8897 Round (b , c , d , e , f , g , h , a , 0x14292967 , w15 += sigma1 (w13 ) + w8 + sigma0 (w0 ));
8998
90- Round (a , b , c , d , e , f , g , h , 0x27b70a85 , w0 += sigma1 (w14 ) + w9 + sigma0 (w1 ));
91- Round (h , a , b , c , d , e , f , g , 0x2e1b2138 , w1 += sigma1 (w15 ) + w10 + sigma0 (w2 ));
92- Round (g , h , a , b , c , d , e , f , 0x4d2c6dfc , w2 += sigma1 (w0 ) + w11 + sigma0 (w3 ));
93- Round (f , g , h , a , b , c , d , e , 0x53380d13 , w3 += sigma1 (w1 ) + w12 + sigma0 (w4 ));
94- Round (e , f , g , h , a , b , c , d , 0x650a7354 , w4 += sigma1 (w2 ) + w13 + sigma0 (w5 ));
95- Round (d , e , f , g , h , a , b , c , 0x766a0abb , w5 += sigma1 (w3 ) + w14 + sigma0 (w6 ));
96- Round (c , d , e , f , g , h , a , b , 0x81c2c92e , w6 += sigma1 (w4 ) + w15 + sigma0 (w7 ));
97- Round (b , c , d , e , f , g , h , a , 0x92722c85 , w7 += sigma1 (w5 ) + w0 + sigma0 (w8 ));
98- Round (a , b , c , d , e , f , g , h , 0xa2bfe8a1 , w8 += sigma1 (w6 ) + w1 + sigma0 (w9 ));
99- Round (h , a , b , c , d , e , f , g , 0xa81a664b , w9 += sigma1 (w7 ) + w2 + sigma0 (w10 ));
99+ /* TODO: sum wX in parallel */
100+
101+ Round (a , b , c , d , e , f , g , h , 0x27b70a85 , w0 += sigma1 (w14 ) + w9 + sigma0 (w1 ));
102+ Round (h , a , b , c , d , e , f , g , 0x2e1b2138 , w1 += sigma1 (w15 ) + w10 + sigma0 (w2 ));
103+ Round (g , h , a , b , c , d , e , f , 0x4d2c6dfc , w2 += sigma1 (w0 ) + w11 + sigma0 (w3 ));
104+ Round (f , g , h , a , b , c , d , e , 0x53380d13 , w3 += sigma1 (w1 ) + w12 + sigma0 (w4 ));
105+ Round (e , f , g , h , a , b , c , d , 0x650a7354 , w4 += sigma1 (w2 ) + w13 + sigma0 (w5 ));
106+ Round (d , e , f , g , h , a , b , c , 0x766a0abb , w5 += sigma1 (w3 ) + w14 + sigma0 (w6 ));
107+ Round (c , d , e , f , g , h , a , b , 0x81c2c92e , w6 += sigma1 (w4 ) + w15 + sigma0 (w7 ));
108+ Round (b , c , d , e , f , g , h , a , 0x92722c85 , w7 += sigma1 (w5 ) + w0 + sigma0 (w8 ));
109+ Round (a , b , c , d , e , f , g , h , 0xa2bfe8a1 , w8 += sigma1 (w6 ) + w1 + sigma0 (w9 ));
110+ Round (h , a , b , c , d , e , f , g , 0xa81a664b , w9 += sigma1 (w7 ) + w2 + sigma0 (w10 ));
100111 Round (g , h , a , b , c , d , e , f , 0xc24b8b70 , w10 += sigma1 (w8 ) + w3 + sigma0 (w11 ));
101112 Round (f , g , h , a , b , c , d , e , 0xc76c51a3 , w11 += sigma1 (w9 ) + w4 + sigma0 (w12 ));
102113 Round (e , f , g , h , a , b , c , d , 0xd192e819 , w12 += sigma1 (w10 ) + w5 + sigma0 (w13 ));
103114 Round (d , e , f , g , h , a , b , c , 0xd6990624 , w13 += sigma1 (w11 ) + w6 + sigma0 (w14 ));
104115 Round (c , d , e , f , g , h , a , b , 0xf40e3585 , w14 += sigma1 (w12 ) + w7 + sigma0 (w15 ));
105116 Round (b , c , d , e , f , g , h , a , 0x106aa070 , w15 += sigma1 (w13 ) + w8 + sigma0 (w0 ));
106117
107- Round (a , b , c , d , e , f , g , h , 0x19a4c116 , w0 += sigma1 (w14 ) + w9 + sigma0 (w1 ));
108- Round (h , a , b , c , d , e , f , g , 0x1e376c08 , w1 += sigma1 (w15 ) + w10 + sigma0 (w2 ));
109- Round (g , h , a , b , c , d , e , f , 0x2748774c , w2 += sigma1 (w0 ) + w11 + sigma0 (w3 ));
110- Round (f , g , h , a , b , c , d , e , 0x34b0bcb5 , w3 += sigma1 (w1 ) + w12 + sigma0 (w4 ));
111- Round (e , f , g , h , a , b , c , d , 0x391c0cb3 , w4 += sigma1 (w2 ) + w13 + sigma0 (w5 ));
112- Round (d , e , f , g , h , a , b , c , 0x4ed8aa4a , w5 += sigma1 (w3 ) + w14 + sigma0 (w6 ));
113- Round (c , d , e , f , g , h , a , b , 0x5b9cca4f , w6 += sigma1 (w4 ) + w15 + sigma0 (w7 ));
114- Round (b , c , d , e , f , g , h , a , 0x682e6ff3 , w7 += sigma1 (w5 ) + w0 + sigma0 (w8 ));
115- Round (a , b , c , d , e , f , g , h , 0x748f82ee , w8 += sigma1 (w6 ) + w1 + sigma0 (w9 ));
116- Round (h , a , b , c , d , e , f , g , 0x78a5636f , w9 += sigma1 (w7 ) + w2 + sigma0 (w10 ));
118+ /* TODO: sum wX in parallel */
119+
120+ Round (a , b , c , d , e , f , g , h , 0x19a4c116 , w0 += sigma1 (w14 ) + w9 + sigma0 (w1 ));
121+ Round (h , a , b , c , d , e , f , g , 0x1e376c08 , w1 += sigma1 (w15 ) + w10 + sigma0 (w2 ));
122+ Round (g , h , a , b , c , d , e , f , 0x2748774c , w2 += sigma1 (w0 ) + w11 + sigma0 (w3 ));
123+ Round (f , g , h , a , b , c , d , e , 0x34b0bcb5 , w3 += sigma1 (w1 ) + w12 + sigma0 (w4 ));
124+ Round (e , f , g , h , a , b , c , d , 0x391c0cb3 , w4 += sigma1 (w2 ) + w13 + sigma0 (w5 ));
125+ Round (d , e , f , g , h , a , b , c , 0x4ed8aa4a , w5 += sigma1 (w3 ) + w14 + sigma0 (w6 ));
126+ Round (c , d , e , f , g , h , a , b , 0x5b9cca4f , w6 += sigma1 (w4 ) + w15 + sigma0 (w7 ));
127+ Round (b , c , d , e , f , g , h , a , 0x682e6ff3 , w7 += sigma1 (w5 ) + w0 + sigma0 (w8 ));
128+ Round (a , b , c , d , e , f , g , h , 0x748f82ee , w8 += sigma1 (w6 ) + w1 + sigma0 (w9 ));
129+ Round (h , a , b , c , d , e , f , g , 0x78a5636f , w9 += sigma1 (w7 ) + w2 + sigma0 (w10 ));
117130 Round (g , h , a , b , c , d , e , f , 0x84c87814 , w10 += sigma1 (w8 ) + w3 + sigma0 (w11 ));
118131 Round (f , g , h , a , b , c , d , e , 0x8cc70208 , w11 += sigma1 (w9 ) + w4 + sigma0 (w12 ));
119132 Round (e , f , g , h , a , b , c , d , 0x90befffa , w12 += sigma1 (w10 ) + w5 + sigma0 (w13 ));
0 commit comments