Add SSSE3 imnplementation ofg block copy function, gives us ~30% kernel scanning...
[novacoin.git] / src / crypto / sha2 / asm / sha2-x86.S
1 /*
2  * Copyright 2012 pooler@litecoinpool.org
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms of the GNU General Public License as published by the Free
6  * Software Foundation; either version 2 of the License, or (at your option)
7  * any later version.  See COPYING for more details.
8  */
9
10 #if defined(__linux__) && defined(__ELF__)
11     .section .note.GNU-stack,"",%progbits
12 #endif
13
14 #if defined(__i386__)
15
16     .data
17     .p2align 7
18 sha256_4h:
19     .long 0x6a09e667, 0x6a09e667, 0x6a09e667, 0x6a09e667
20     .long 0xbb67ae85, 0xbb67ae85, 0xbb67ae85, 0xbb67ae85
21     .long 0x3c6ef372, 0x3c6ef372, 0x3c6ef372, 0x3c6ef372
22     .long 0xa54ff53a, 0xa54ff53a, 0xa54ff53a, 0xa54ff53a
23     .long 0x510e527f, 0x510e527f, 0x510e527f, 0x510e527f
24     .long 0x9b05688c, 0x9b05688c, 0x9b05688c, 0x9b05688c
25     .long 0x1f83d9ab, 0x1f83d9ab, 0x1f83d9ab, 0x1f83d9ab
26     .long 0x5be0cd19, 0x5be0cd19, 0x5be0cd19, 0x5be0cd19
27
28     .data
29     .p2align 7
30 sha256_4k:
31     .long 0x428a2f98, 0x428a2f98, 0x428a2f98, 0x428a2f98
32     .long 0x71374491, 0x71374491, 0x71374491, 0x71374491
33     .long 0xb5c0fbcf, 0xb5c0fbcf, 0xb5c0fbcf, 0xb5c0fbcf
34     .long 0xe9b5dba5, 0xe9b5dba5, 0xe9b5dba5, 0xe9b5dba5
35     .long 0x3956c25b, 0x3956c25b, 0x3956c25b, 0x3956c25b
36     .long 0x59f111f1, 0x59f111f1, 0x59f111f1, 0x59f111f1
37     .long 0x923f82a4, 0x923f82a4, 0x923f82a4, 0x923f82a4
38     .long 0xab1c5ed5, 0xab1c5ed5, 0xab1c5ed5, 0xab1c5ed5
39     .long 0xd807aa98, 0xd807aa98, 0xd807aa98, 0xd807aa98
40     .long 0x12835b01, 0x12835b01, 0x12835b01, 0x12835b01
41     .long 0x243185be, 0x243185be, 0x243185be, 0x243185be
42     .long 0x550c7dc3, 0x550c7dc3, 0x550c7dc3, 0x550c7dc3
43     .long 0x72be5d74, 0x72be5d74, 0x72be5d74, 0x72be5d74
44     .long 0x80deb1fe, 0x80deb1fe, 0x80deb1fe, 0x80deb1fe
45     .long 0x9bdc06a7, 0x9bdc06a7, 0x9bdc06a7, 0x9bdc06a7
46     .long 0xc19bf174, 0xc19bf174, 0xc19bf174, 0xc19bf174
47     .long 0xe49b69c1, 0xe49b69c1, 0xe49b69c1, 0xe49b69c1
48     .long 0xefbe4786, 0xefbe4786, 0xefbe4786, 0xefbe4786
49     .long 0x0fc19dc6, 0x0fc19dc6, 0x0fc19dc6, 0x0fc19dc6
50     .long 0x240ca1cc, 0x240ca1cc, 0x240ca1cc, 0x240ca1cc
51     .long 0x2de92c6f, 0x2de92c6f, 0x2de92c6f, 0x2de92c6f
52     .long 0x4a7484aa, 0x4a7484aa, 0x4a7484aa, 0x4a7484aa
53     .long 0x5cb0a9dc, 0x5cb0a9dc, 0x5cb0a9dc, 0x5cb0a9dc
54     .long 0x76f988da, 0x76f988da, 0x76f988da, 0x76f988da
55     .long 0x983e5152, 0x983e5152, 0x983e5152, 0x983e5152
56     .long 0xa831c66d, 0xa831c66d, 0xa831c66d, 0xa831c66d
57     .long 0xb00327c8, 0xb00327c8, 0xb00327c8, 0xb00327c8
58     .long 0xbf597fc7, 0xbf597fc7, 0xbf597fc7, 0xbf597fc7
59     .long 0xc6e00bf3, 0xc6e00bf3, 0xc6e00bf3, 0xc6e00bf3
60     .long 0xd5a79147, 0xd5a79147, 0xd5a79147, 0xd5a79147
61     .long 0x06ca6351, 0x06ca6351, 0x06ca6351, 0x06ca6351
62     .long 0x14292967, 0x14292967, 0x14292967, 0x14292967
63     .long 0x27b70a85, 0x27b70a85, 0x27b70a85, 0x27b70a85
64     .long 0x2e1b2138, 0x2e1b2138, 0x2e1b2138, 0x2e1b2138
65     .long 0x4d2c6dfc, 0x4d2c6dfc, 0x4d2c6dfc, 0x4d2c6dfc
66     .long 0x53380d13, 0x53380d13, 0x53380d13, 0x53380d13
67     .long 0x650a7354, 0x650a7354, 0x650a7354, 0x650a7354
68     .long 0x766a0abb, 0x766a0abb, 0x766a0abb, 0x766a0abb
69     .long 0x81c2c92e, 0x81c2c92e, 0x81c2c92e, 0x81c2c92e
70     .long 0x92722c85, 0x92722c85, 0x92722c85, 0x92722c85
71     .long 0xa2bfe8a1, 0xa2bfe8a1, 0xa2bfe8a1, 0xa2bfe8a1
72     .long 0xa81a664b, 0xa81a664b, 0xa81a664b, 0xa81a664b
73     .long 0xc24b8b70, 0xc24b8b70, 0xc24b8b70, 0xc24b8b70
74     .long 0xc76c51a3, 0xc76c51a3, 0xc76c51a3, 0xc76c51a3
75     .long 0xd192e819, 0xd192e819, 0xd192e819, 0xd192e819
76     .long 0xd6990624, 0xd6990624, 0xd6990624, 0xd6990624
77     .long 0xf40e3585, 0xf40e3585, 0xf40e3585, 0xf40e3585
78     .long 0x106aa070, 0x106aa070, 0x106aa070, 0x106aa070
79     .long 0x19a4c116, 0x19a4c116, 0x19a4c116, 0x19a4c116
80     .long 0x1e376c08, 0x1e376c08, 0x1e376c08, 0x1e376c08
81     .long 0x2748774c, 0x2748774c, 0x2748774c, 0x2748774c
82     .long 0x34b0bcb5, 0x34b0bcb5, 0x34b0bcb5, 0x34b0bcb5
83     .long 0x391c0cb3, 0x391c0cb3, 0x391c0cb3, 0x391c0cb3
84     .long 0x4ed8aa4a, 0x4ed8aa4a, 0x4ed8aa4a, 0x4ed8aa4a
85     .long 0x5b9cca4f, 0x5b9cca4f, 0x5b9cca4f, 0x5b9cca4f
86     .long 0x682e6ff3, 0x682e6ff3, 0x682e6ff3, 0x682e6ff3
87     .long 0x748f82ee, 0x748f82ee, 0x748f82ee, 0x748f82ee
88     .long 0x78a5636f, 0x78a5636f, 0x78a5636f, 0x78a5636f
89     .long 0x84c87814, 0x84c87814, 0x84c87814, 0x84c87814
90     .long 0x8cc70208, 0x8cc70208, 0x8cc70208, 0x8cc70208
91     .long 0x90befffa, 0x90befffa, 0x90befffa, 0x90befffa
92     .long 0xa4506ceb, 0xa4506ceb, 0xa4506ceb, 0xa4506ceb
93     .long 0xbef9a3f7, 0xbef9a3f7, 0xbef9a3f7, 0xbef9a3f7
94     .long 0xc67178f2, 0xc67178f2, 0xc67178f2, 0xc67178f2
95
96     .data
97     .p2align 6
98 sha256d_4preext2_15:
99     .long 0x00000100, 0x00000100, 0x00000100, 0x00000100
100 sha256d_4preext2_17:
101     .long 0x00a00000, 0x00a00000, 0x00a00000, 0x00a00000
102 sha256d_4preext2_23:
103     .long 0x11002000, 0x11002000, 0x11002000, 0x11002000
104 sha256d_4preext2_24:
105     .long 0x80000000, 0x80000000, 0x80000000, 0x80000000
106 sha256d_4preext2_30:
107     .long 0x00400022, 0x00400022, 0x00400022, 0x00400022
108
109
110     .text
111     .p2align 5
112     .globl sha256_init_4way
113     .globl _sha256_init_4way
114 sha256_init_4way:
115 _sha256_init_4way:
116     movl    4(%esp), %edx
117     movdqa    sha256_4h+0, %xmm0
118     movdqa    sha256_4h+16, %xmm1
119     movdqa    sha256_4h+32, %xmm2
120     movdqa    sha256_4h+48, %xmm3
121     movdqu    %xmm0, 0(%edx)
122     movdqu    %xmm1, 16(%edx)
123     movdqu    %xmm2, 32(%edx)
124     movdqu    %xmm3, 48(%edx)
125     movdqa    sha256_4h+64, %xmm0
126     movdqa    sha256_4h+80, %xmm1
127     movdqa    sha256_4h+96, %xmm2
128     movdqa    sha256_4h+112, %xmm3
129     movdqu    %xmm0, 64(%edx)
130     movdqu    %xmm1, 80(%edx)
131     movdqu    %xmm2, 96(%edx)
132     movdqu    %xmm3, 112(%edx)
133     ret
134
135
136 .macro sha256_sse2_extend_round i
137     movdqa    (\i-15)*16(%eax), %xmm0
138     movdqa    %xmm0, %xmm2
139     psrld    $3, %xmm0
140     movdqa    %xmm0, %xmm1
141     pslld    $14, %xmm2
142     psrld    $4, %xmm1
143     pxor    %xmm1, %xmm0
144     pxor    %xmm2, %xmm0
145     psrld    $11, %xmm1
146     pslld    $11, %xmm2
147     pxor    %xmm1, %xmm0
148     pxor    %xmm2, %xmm0
149     paddd    (\i-16)*16(%eax), %xmm0
150     paddd    (\i-7)*16(%eax), %xmm0
151
152     movdqa    %xmm3, %xmm2
153     psrld    $10, %xmm3
154     pslld    $13, %xmm2
155     movdqa    %xmm3, %xmm1
156     psrld    $7, %xmm1
157     pxor    %xmm1, %xmm3
158     pxor    %xmm2, %xmm3
159     psrld    $2, %xmm1
160     pslld    $2, %xmm2
161     pxor    %xmm1, %xmm3
162     pxor    %xmm2, %xmm3
163     paddd    %xmm0, %xmm3
164     movdqa    %xmm3, \i*16(%eax)
165 .endm
166
167 .macro sha256_sse2_extend_doubleround i
168     movdqa    (\i-15)*16(%eax), %xmm0
169     movdqa    (\i-14)*16(%eax), %xmm4
170     movdqa    %xmm0, %xmm2
171     movdqa    %xmm4, %xmm6
172     psrld    $3, %xmm0
173     psrld    $3, %xmm4
174     movdqa    %xmm0, %xmm1
175     movdqa    %xmm4, %xmm5
176     pslld    $14, %xmm2
177     pslld    $14, %xmm6
178     psrld    $4, %xmm1
179     psrld    $4, %xmm5
180     pxor    %xmm1, %xmm0
181     pxor    %xmm5, %xmm4
182     psrld    $11, %xmm1
183     psrld    $11, %xmm5
184     pxor    %xmm2, %xmm0
185     pxor    %xmm6, %xmm4
186     pslld    $11, %xmm2
187     pslld    $11, %xmm6
188     pxor    %xmm1, %xmm0
189     pxor    %xmm5, %xmm4
190     pxor    %xmm2, %xmm0
191     pxor    %xmm6, %xmm4
192
193     paddd    (\i-16)*16(%eax), %xmm0
194     paddd    (\i-15)*16(%eax), %xmm4
195
196     movdqa    %xmm3, %xmm2
197     movdqa    %xmm7, %xmm6
198     psrld    $10, %xmm3
199     psrld    $10, %xmm7
200     movdqa    %xmm3, %xmm1
201     movdqa    %xmm7, %xmm5
202     pslld    $13, %xmm2
203     pslld    $13, %xmm6
204     psrld    $7, %xmm1
205     psrld    $7, %xmm5
206
207     paddd    (\i-7)*16(%eax), %xmm0
208     paddd    (\i-6)*16(%eax), %xmm4
209
210     pxor    %xmm1, %xmm3
211     pxor    %xmm5, %xmm7
212     psrld    $2, %xmm1
213     psrld    $2, %xmm5
214     pxor    %xmm2, %xmm3
215     pxor    %xmm6, %xmm7
216     pslld    $2, %xmm2
217     pslld    $2, %xmm6
218     pxor    %xmm1, %xmm3
219     pxor    %xmm5, %xmm7
220     pxor    %xmm2, %xmm3
221     pxor    %xmm6, %xmm7
222
223     paddd    %xmm0, %xmm3
224     paddd    %xmm4, %xmm7
225     movdqa    %xmm3, \i*16(%eax)
226     movdqa    %xmm7, (\i+1)*16(%eax)
227 .endm
228
229 .macro sha256_sse2_main_round i
230     movdqa    16*(\i)(%eax), %xmm6
231
232     movdqa    %xmm0, %xmm1
233     movdqa    16(%esp), %xmm2
234     pandn    %xmm2, %xmm1
235     paddd    32(%esp), %xmm6
236
237     movdqa    %xmm2, 32(%esp)
238     movdqa    0(%esp), %xmm2
239     movdqa    %xmm2, 16(%esp)
240
241     pand    %xmm0, %xmm2
242     pxor    %xmm2, %xmm1
243     movdqa    %xmm0, 0(%esp)
244
245     paddd    %xmm1, %xmm6
246
247     movdqa    %xmm0, %xmm1
248     psrld    $6, %xmm0
249     paddd    16*(\i)+sha256_4k, %xmm6
250     movdqa    %xmm0, %xmm2
251     pslld    $7, %xmm1
252     psrld    $5, %xmm2
253     pxor    %xmm1, %xmm0
254     pxor    %xmm2, %xmm0
255     pslld    $14, %xmm1
256     psrld    $14, %xmm2
257     pxor    %xmm1, %xmm0
258     pslld    $5, %xmm1
259     pxor    %xmm2, %xmm0
260     pxor    %xmm1, %xmm0
261     movdqa    %xmm5, %xmm1
262     paddd    %xmm0, %xmm6
263
264     movdqa    %xmm3, %xmm0
265     movdqa    %xmm4, %xmm3
266     movdqa    %xmm4, %xmm2
267     paddd    %xmm6, %xmm0
268     pand    %xmm5, %xmm2
269     pand    %xmm7, %xmm1
270     pand    %xmm7, %xmm4
271     pxor    %xmm4, %xmm1
272     movdqa    %xmm5, %xmm4
273     movdqa    %xmm7, %xmm5
274     pxor    %xmm2, %xmm1
275     paddd    %xmm1, %xmm6
276
277     movdqa    %xmm7, %xmm2
278     psrld    $2, %xmm7
279     movdqa    %xmm7, %xmm1
280     pslld    $10, %xmm2
281     psrld    $11, %xmm1
282     pxor    %xmm2, %xmm7
283     pslld    $9, %xmm2
284     pxor    %xmm1, %xmm7
285     psrld    $9, %xmm1
286     pxor    %xmm2, %xmm7
287     pslld    $11, %xmm2
288     pxor    %xmm1, %xmm7
289     pxor    %xmm2, %xmm7
290     paddd    %xmm6, %xmm7
291 .endm
292
293 .macro sha256_sse2_main_quadround i
294     sha256_sse2_main_round \i+0
295     sha256_sse2_main_round \i+1
296     sha256_sse2_main_round \i+2
297     sha256_sse2_main_round \i+3
298 .endm
299
300
301 .macro p2bswap_esi_esp i
302     movdqu    \i*16(%esi), %xmm0
303     movdqu    (\i+1)*16(%esi), %xmm2
304     pshuflw    $0xb1, %xmm0, %xmm0
305     pshuflw    $0xb1, %xmm2, %xmm2
306     pshufhw    $0xb1, %xmm0, %xmm0
307     pshufhw    $0xb1, %xmm2, %xmm2
308     movdqa    %xmm0, %xmm1
309     movdqa    %xmm2, %xmm3
310     psrlw    $8, %xmm1
311     psrlw    $8, %xmm3
312     psllw    $8, %xmm0
313     psllw    $8, %xmm2
314     pxor    %xmm1, %xmm0
315     pxor    %xmm3, %xmm2
316     movdqa    %xmm0, (\i+3)*16(%esp)
317     movdqa    %xmm2, (\i+4)*16(%esp)
318 .endm
319
320     .text
321     .p2align 5
322     .globl sha256_transform_4way
323     .globl _sha256_transform_4way
324 sha256_transform_4way:
325 _sha256_transform_4way:
326     pushl    %edi
327     pushl    %esi
328     movl    12(%esp), %edi
329     movl    16(%esp), %esi
330     movl    20(%esp), %ecx
331     movl    %esp, %edx
332     subl    $67*16, %esp
333     andl    $-128, %esp
334     
335     testl    %ecx, %ecx
336     jnz sha256_transform_4way_swap
337     
338     movdqu    0*16(%esi), %xmm0
339     movdqu    1*16(%esi), %xmm1
340     movdqu    2*16(%esi), %xmm2
341     movdqu    3*16(%esi), %xmm3
342     movdqu    4*16(%esi), %xmm4
343     movdqu    5*16(%esi), %xmm5
344     movdqu    6*16(%esi), %xmm6
345     movdqu    7*16(%esi), %xmm7
346     movdqa    %xmm0, 3*16(%esp)
347     movdqa    %xmm1, 4*16(%esp)
348     movdqa    %xmm2, 5*16(%esp)
349     movdqa    %xmm3, 6*16(%esp)
350     movdqa    %xmm4, 7*16(%esp)
351     movdqa    %xmm5, 8*16(%esp)
352     movdqa    %xmm6, 9*16(%esp)
353     movdqa    %xmm7, 10*16(%esp)
354     movdqu    8*16(%esi), %xmm0
355     movdqu    9*16(%esi), %xmm1
356     movdqu    10*16(%esi), %xmm2
357     movdqu    11*16(%esi), %xmm3
358     movdqu    12*16(%esi), %xmm4
359     movdqu    13*16(%esi), %xmm5
360     movdqu    14*16(%esi), %xmm6
361     movdqu    15*16(%esi), %xmm7
362     movdqa    %xmm0, 11*16(%esp)
363     movdqa    %xmm1, 12*16(%esp)
364     movdqa    %xmm2, 13*16(%esp)
365     movdqa    %xmm3, 14*16(%esp)
366     movdqa    %xmm4, 15*16(%esp)
367     movdqa    %xmm5, 16*16(%esp)
368     movdqa    %xmm6, 17*16(%esp)
369     movdqa    %xmm7, 18*16(%esp)
370     jmp sha256_transform_4way_extend
371     
372     .p2align 5
373 sha256_transform_4way_swap:
374     p2bswap_esi_esp 0
375     p2bswap_esi_esp 2
376     p2bswap_esi_esp 4
377     p2bswap_esi_esp 6
378     p2bswap_esi_esp 8
379     p2bswap_esi_esp 10
380     p2bswap_esi_esp 12
381     p2bswap_esi_esp 14
382     
383 sha256_transform_4way_extend:
384     leal    19*16(%esp), %ecx
385     leal    48*16(%ecx), %eax
386     movdqa    -2*16(%ecx), %xmm3
387     movdqa    -1*16(%ecx), %xmm7
388 sha256_transform_4way_extend_loop:
389     movdqa    -15*16(%ecx), %xmm0
390     movdqa    -14*16(%ecx), %xmm4
391     movdqa    %xmm0, %xmm2
392     movdqa    %xmm4, %xmm6
393     psrld    $3, %xmm0
394     psrld    $3, %xmm4
395     movdqa    %xmm0, %xmm1
396     movdqa    %xmm4, %xmm5
397     pslld    $14, %xmm2
398     pslld    $14, %xmm6
399     psrld    $4, %xmm1
400     psrld    $4, %xmm5
401     pxor    %xmm1, %xmm0
402     pxor    %xmm5, %xmm4
403     psrld    $11, %xmm1
404     psrld    $11, %xmm5
405     pxor    %xmm2, %xmm0
406     pxor    %xmm6, %xmm4
407     pslld    $11, %xmm2
408     pslld    $11, %xmm6
409     pxor    %xmm1, %xmm0
410     pxor    %xmm5, %xmm4
411     pxor    %xmm2, %xmm0
412     pxor    %xmm6, %xmm4
413
414     paddd    -16*16(%ecx), %xmm0
415     paddd    -15*16(%ecx), %xmm4
416
417     movdqa    %xmm3, %xmm2
418     movdqa    %xmm7, %xmm6
419     psrld    $10, %xmm3
420     psrld    $10, %xmm7
421     movdqa    %xmm3, %xmm1
422     movdqa    %xmm7, %xmm5
423     pslld    $13, %xmm2
424     pslld    $13, %xmm6
425     psrld    $7, %xmm1
426     psrld    $7, %xmm5
427
428     paddd    -7*16(%ecx), %xmm0
429     paddd    -6*16(%ecx), %xmm4
430
431     pxor    %xmm1, %xmm3
432     pxor    %xmm5, %xmm7
433     psrld    $2, %xmm1
434     psrld    $2, %xmm5
435     pxor    %xmm2, %xmm3
436     pxor    %xmm6, %xmm7
437     pslld    $2, %xmm2
438     pslld    $2, %xmm6
439     pxor    %xmm1, %xmm3
440     pxor    %xmm5, %xmm7
441     pxor    %xmm2, %xmm3
442     pxor    %xmm6, %xmm7
443
444     paddd    %xmm0, %xmm3
445     paddd    %xmm4, %xmm7
446     movdqa    %xmm3, (%ecx)
447     movdqa    %xmm7, 16(%ecx)
448     addl    $2*16, %ecx
449     cmpl    %ecx, %eax
450     jne sha256_transform_4way_extend_loop
451     
452     movdqu    0(%edi), %xmm7
453     movdqu    16(%edi), %xmm5
454     movdqu    32(%edi), %xmm4
455     movdqu    48(%edi), %xmm3
456     movdqu    64(%edi), %xmm0
457     movdqu    80(%edi), %xmm1
458     movdqu    96(%edi), %xmm2
459     movdqu    112(%edi), %xmm6
460     movdqa    %xmm1, 0(%esp)
461     movdqa    %xmm2, 16(%esp)
462     movdqa    %xmm6, 32(%esp)
463     
464     xorl    %eax, %eax
465 sha256_transform_4way_main_loop:
466     movdqa    3*16(%esp, %eax), %xmm6
467     paddd    sha256_4k(%eax), %xmm6
468     paddd    32(%esp), %xmm6
469
470     movdqa    %xmm0, %xmm1
471     movdqa    16(%esp), %xmm2
472     pandn    %xmm2, %xmm1
473
474     movdqa    %xmm2, 32(%esp)
475     movdqa    0(%esp), %xmm2
476     movdqa    %xmm2, 16(%esp)
477
478     pand    %xmm0, %xmm2
479     pxor    %xmm2, %xmm1
480     movdqa    %xmm0, 0(%esp)
481
482     paddd    %xmm1, %xmm6
483
484     movdqa    %xmm0, %xmm1
485     psrld    $6, %xmm0
486     movdqa    %xmm0, %xmm2
487     pslld    $7, %xmm1
488     psrld    $5, %xmm2
489     pxor    %xmm1, %xmm0
490     pxor    %xmm2, %xmm0
491     pslld    $14, %xmm1
492     psrld    $14, %xmm2
493     pxor    %xmm1, %xmm0
494     pxor    %xmm2, %xmm0
495     pslld    $5, %xmm1
496     pxor    %xmm1, %xmm0
497     paddd    %xmm0, %xmm6
498
499     movdqa    %xmm3, %xmm0
500     paddd    %xmm6, %xmm0
501
502     movdqa    %xmm5, %xmm1
503     movdqa    %xmm4, %xmm3
504     movdqa    %xmm4, %xmm2
505     pand    %xmm5, %xmm2
506     pand    %xmm7, %xmm4
507     pand    %xmm7, %xmm1
508     pxor    %xmm4, %xmm1
509     movdqa    %xmm5, %xmm4
510     movdqa    %xmm7, %xmm5
511     pxor    %xmm2, %xmm1
512     paddd    %xmm1, %xmm6
513
514     movdqa    %xmm7, %xmm2
515     psrld    $2, %xmm7
516     movdqa    %xmm7, %xmm1
517     pslld    $10, %xmm2
518     psrld    $11, %xmm1
519     pxor    %xmm2, %xmm7
520     pxor    %xmm1, %xmm7
521     pslld    $9, %xmm2
522     psrld    $9, %xmm1
523     pxor    %xmm2, %xmm7
524     pxor    %xmm1, %xmm7
525     pslld    $11, %xmm2
526     pxor    %xmm2, %xmm7
527     paddd    %xmm6, %xmm7
528     
529     addl    $16, %eax
530     cmpl    $16*64, %eax
531     jne sha256_transform_4way_main_loop
532     
533     movdqu    0(%edi), %xmm1
534     movdqu    16(%edi), %xmm2
535     paddd    %xmm1, %xmm7
536     paddd    %xmm2, %xmm5
537     movdqu    32(%edi), %xmm1
538     movdqu    48(%edi), %xmm2
539     paddd    %xmm1, %xmm4
540     paddd    %xmm2, %xmm3
541     
542     movdqu    %xmm7, 0(%edi)
543     movdqu    %xmm5, 16(%edi)
544     movdqu    %xmm4, 32(%edi)
545     movdqu    %xmm3, 48(%edi)
546     
547     movdqu    64(%edi), %xmm1
548     movdqu    80(%edi), %xmm2
549     movdqu    96(%edi), %xmm6
550     movdqu    112(%edi), %xmm7
551     paddd    %xmm1, %xmm0
552     paddd    0(%esp), %xmm2
553     paddd    16(%esp), %xmm6
554     paddd    32(%esp), %xmm7
555     
556     movdqu    %xmm0, 64(%edi)
557     movdqu    %xmm2, 80(%edi)
558     movdqu    %xmm6, 96(%edi)
559     movdqu    %xmm7, 112(%edi)
560     
561     movl    %edx, %esp
562     popl    %esi
563     popl    %edi
564     ret
565
566
567     .text
568     .p2align 5
569     .globl sha256d_ms_4way
570     .globl _sha256d_ms_4way
571 sha256d_ms_4way:
572 _sha256d_ms_4way:
573     pushl    %edi
574     pushl    %esi
575     pushl    %ebp
576     movl    16(%esp), %edi
577     movl    20(%esp), %esi
578     movl    24(%esp), %edx
579     movl    28(%esp), %ecx
580     movl    %esp, %ebp
581     subl    $67*16, %esp
582     andl    $-128, %esp
583     
584     leal    256(%esi), %eax
585     
586 sha256d_ms_4way_extend_loop1:
587     movdqa    3*16(%esi), %xmm0
588     movdqa    2*16(%eax), %xmm3
589     movdqa    3*16(%eax), %xmm7
590     movdqa    %xmm3, 5*16(%esp)
591     movdqa    %xmm7, 6*16(%esp)
592     movdqa    %xmm0, %xmm2
593     paddd    %xmm0, %xmm7
594     psrld    $3, %xmm0
595     movdqa    %xmm0, %xmm1
596     pslld    $14, %xmm2
597     psrld    $4, %xmm1
598     pxor    %xmm1, %xmm0
599     pxor    %xmm2, %xmm0
600     psrld    $11, %xmm1
601     pslld    $11, %xmm2
602     pxor    %xmm1, %xmm0
603     pxor    %xmm2, %xmm0
604     paddd    %xmm0, %xmm3
605     movdqa    %xmm3, 2*16(%eax)
606     movdqa    %xmm7, 3*16(%eax)
607     
608     movdqa    4*16(%eax), %xmm0
609     movdqa    %xmm0, 7*16(%esp)
610     movdqa    %xmm3, %xmm2
611     movdqa    %xmm7, %xmm6
612     psrld    $10, %xmm3
613     psrld    $10, %xmm7
614     movdqa    %xmm3, %xmm1
615     movdqa    %xmm7, %xmm5
616     pslld    $13, %xmm2
617     pslld    $13, %xmm6
618     psrld    $7, %xmm1
619     psrld    $7, %xmm5
620     pxor    %xmm1, %xmm3
621     pxor    %xmm5, %xmm7
622     psrld    $2, %xmm1
623     psrld    $2, %xmm5
624     pxor    %xmm2, %xmm3
625     pxor    %xmm6, %xmm7
626     pslld    $2, %xmm2
627     pslld    $2, %xmm6
628     pxor    %xmm1, %xmm3
629     pxor    %xmm5, %xmm7
630     pxor    %xmm2, %xmm3
631     pxor    %xmm6, %xmm7
632     paddd    %xmm0, %xmm3
633     movdqa    %xmm3, 4*16(%eax)
634     movdqa    %xmm7, 5*16(%eax)
635     
636     movdqa    6*16(%eax), %xmm0
637     movdqa    7*16(%eax), %xmm4
638     movdqa    %xmm0, 9*16(%esp)
639     movdqa    %xmm4, 10*16(%esp)
640     movdqa    %xmm3, %xmm2
641     movdqa    %xmm7, %xmm6
642     psrld    $10, %xmm3
643     psrld    $10, %xmm7
644     movdqa    %xmm3, %xmm1
645     movdqa    %xmm7, %xmm5
646     pslld    $13, %xmm2
647     pslld    $13, %xmm6
648     psrld    $7, %xmm1
649     psrld    $7, %xmm5
650     pxor    %xmm1, %xmm3
651     pxor    %xmm5, %xmm7
652     psrld    $2, %xmm1
653     psrld    $2, %xmm5
654     pxor    %xmm2, %xmm3
655     pxor    %xmm6, %xmm7
656     pslld    $2, %xmm2
657     pslld    $2, %xmm6
658     pxor    %xmm1, %xmm3
659     pxor    %xmm5, %xmm7
660     pxor    %xmm2, %xmm3
661     pxor    %xmm6, %xmm7
662     paddd    %xmm0, %xmm3
663     paddd    %xmm4, %xmm7
664     movdqa    %xmm3, 6*16(%eax)
665     movdqa    %xmm7, 7*16(%eax)
666     
667     movdqa    8*16(%eax), %xmm0
668     movdqa    2*16(%eax), %xmm4
669     movdqa    %xmm0, 11*16(%esp)
670     movdqa    %xmm3, %xmm2
671     movdqa    %xmm7, %xmm6
672     psrld    $10, %xmm3
673     psrld    $10, %xmm7
674     movdqa    %xmm3, %xmm1
675     movdqa    %xmm7, %xmm5
676     pslld    $13, %xmm2
677     pslld    $13, %xmm6
678     psrld    $7, %xmm1
679     psrld    $7, %xmm5
680     pxor    %xmm1, %xmm3
681     pxor    %xmm5, %xmm7
682     psrld    $2, %xmm1
683     psrld    $2, %xmm5
684     pxor    %xmm2, %xmm3
685     pxor    %xmm6, %xmm7
686     pslld    $2, %xmm2
687     pslld    $2, %xmm6
688     pxor    %xmm1, %xmm3
689     pxor    %xmm5, %xmm7
690     pxor    %xmm2, %xmm3
691     pxor    %xmm6, %xmm7
692     paddd    %xmm0, %xmm3
693     paddd    %xmm4, %xmm7
694     movdqa    %xmm3, 8*16(%eax)
695     movdqa    %xmm7, 9*16(%eax)
696     
697     movdqa    %xmm3, %xmm2
698     movdqa    %xmm7, %xmm6
699     psrld    $10, %xmm3
700     psrld    $10, %xmm7
701     movdqa    %xmm3, %xmm1
702     movdqa    %xmm7, %xmm5
703     pslld    $13, %xmm2
704     pslld    $13, %xmm6
705     psrld    $7, %xmm1
706     psrld    $7, %xmm5
707     pxor    %xmm1, %xmm3
708     pxor    %xmm5, %xmm7
709     psrld    $2, %xmm1
710     psrld    $2, %xmm5
711     pxor    %xmm2, %xmm3
712     pxor    %xmm6, %xmm7
713     pslld    $2, %xmm2
714     pslld    $2, %xmm6
715     pxor    %xmm1, %xmm3
716     pxor    %xmm5, %xmm7
717     pxor    %xmm2, %xmm3
718     pxor    %xmm6, %xmm7
719     paddd    3*16(%eax), %xmm3
720     paddd    4*16(%eax), %xmm7
721     movdqa    %xmm3, 10*16(%eax)
722     movdqa    %xmm7, 11*16(%eax)
723     
724     movdqa    %xmm3, %xmm2
725     movdqa    %xmm7, %xmm6
726     psrld    $10, %xmm3
727     psrld    $10, %xmm7
728     movdqa    %xmm3, %xmm1
729     movdqa    %xmm7, %xmm5
730     pslld    $13, %xmm2
731     pslld    $13, %xmm6
732     psrld    $7, %xmm1
733     psrld    $7, %xmm5
734     pxor    %xmm1, %xmm3
735     pxor    %xmm5, %xmm7
736     psrld    $2, %xmm1
737     psrld    $2, %xmm5
738     pxor    %xmm2, %xmm3
739     pxor    %xmm6, %xmm7
740     pslld    $2, %xmm2
741     pslld    $2, %xmm6
742     pxor    %xmm1, %xmm3
743     pxor    %xmm5, %xmm7
744     pxor    %xmm2, %xmm3
745     pxor    %xmm6, %xmm7
746     paddd    5*16(%eax), %xmm3
747     paddd    6*16(%eax), %xmm7
748     movdqa    %xmm3, 12*16(%eax)
749     movdqa    %xmm7, 13*16(%eax)
750     
751     movdqa    14*16(%eax), %xmm0
752     movdqa    15*16(%eax), %xmm4
753     movdqa    %xmm0, 17*16(%esp)
754     movdqa    %xmm4, 18*16(%esp)
755     movdqa    %xmm3, %xmm2
756     movdqa    %xmm7, %xmm6
757     psrld    $10, %xmm3
758     psrld    $10, %xmm7
759     movdqa    %xmm3, %xmm1
760     movdqa    %xmm7, %xmm5
761     paddd    7*16(%eax), %xmm0
762     paddd    8*16(%eax), %xmm4
763     pslld    $13, %xmm2
764     pslld    $13, %xmm6
765     psrld    $7, %xmm1
766     psrld    $7, %xmm5
767     pxor    %xmm1, %xmm3
768     pxor    %xmm5, %xmm7
769     psrld    $2, %xmm1
770     psrld    $2, %xmm5
771     pxor    %xmm2, %xmm3
772     pxor    %xmm6, %xmm7
773     pslld    $2, %xmm2
774     pslld    $2, %xmm6
775     pxor    %xmm1, %xmm3
776     pxor    %xmm5, %xmm7
777     pxor    %xmm2, %xmm3
778     pxor    %xmm6, %xmm7
779     paddd    %xmm0, %xmm3
780     paddd    %xmm4, %xmm7
781     movdqa    %xmm3, 14*16(%eax)
782     movdqa    %xmm7, 15*16(%eax)
783     
784 sha256d_ms_4way_extend_loop2:
785     sha256_sse2_extend_doubleround 16
786     sha256_sse2_extend_doubleround 18
787     sha256_sse2_extend_doubleround 20
788     sha256_sse2_extend_doubleround 22
789     sha256_sse2_extend_doubleround 24
790     sha256_sse2_extend_doubleround 26
791     sha256_sse2_extend_doubleround 28
792     sha256_sse2_extend_doubleround 30
793     sha256_sse2_extend_doubleround 32
794     sha256_sse2_extend_doubleround 34
795     sha256_sse2_extend_doubleround 36
796     sha256_sse2_extend_doubleround 38
797     sha256_sse2_extend_doubleround 40
798     sha256_sse2_extend_doubleround 42
799     jz sha256d_ms_4way_extend_coda2
800     sha256_sse2_extend_doubleround 44
801     sha256_sse2_extend_doubleround 46
802     
803     movdqa    0(%ecx), %xmm3
804     movdqa    16(%ecx), %xmm0
805     movdqa    32(%ecx), %xmm1
806     movdqa    48(%ecx), %xmm2
807     movdqa    64(%ecx), %xmm6
808     movdqa    80(%ecx), %xmm7
809     movdqa    96(%ecx), %xmm5
810     movdqa    112(%ecx), %xmm4
811     movdqa    %xmm1, 0(%esp)
812     movdqa    %xmm2, 16(%esp)
813     movdqa    %xmm6, 32(%esp)
814     
815     movl    %esi, %eax
816     jmp sha256d_ms_4way_main_loop1
817     
818 sha256d_ms_4way_main_loop2:
819     sha256_sse2_main_round 0
820     sha256_sse2_main_round 1
821     sha256_sse2_main_round 2
822 sha256d_ms_4way_main_loop1:
823     sha256_sse2_main_round 3
824     sha256_sse2_main_quadround 4
825     sha256_sse2_main_quadround 8
826     sha256_sse2_main_quadround 12
827     sha256_sse2_main_quadround 16
828     sha256_sse2_main_quadround 20
829     sha256_sse2_main_quadround 24
830     sha256_sse2_main_quadround 28
831     sha256_sse2_main_quadround 32
832     sha256_sse2_main_quadround 36
833     sha256_sse2_main_quadround 40
834     sha256_sse2_main_quadround 44
835     sha256_sse2_main_quadround 48
836     sha256_sse2_main_quadround 52
837     sha256_sse2_main_round 56
838     jz sha256d_ms_4way_finish
839     sha256_sse2_main_round 57
840     sha256_sse2_main_round 58
841     sha256_sse2_main_round 59
842     sha256_sse2_main_quadround 60
843     
844     movdqa    5*16(%esp), %xmm1
845     movdqa    6*16(%esp), %xmm2
846     movdqa    7*16(%esp), %xmm6
847     movdqa    %xmm1, 18*16(%esi)
848     movdqa    %xmm2, 19*16(%esi)
849     movdqa    %xmm6, 20*16(%esi)
850     movdqa    9*16(%esp), %xmm1
851     movdqa    10*16(%esp), %xmm2
852     movdqa    11*16(%esp), %xmm6
853     movdqa    %xmm1, 22*16(%esi)
854     movdqa    %xmm2, 23*16(%esi)
855     movdqa    %xmm6, 24*16(%esi)
856     movdqa    17*16(%esp), %xmm1
857     movdqa    18*16(%esp), %xmm2
858     movdqa    %xmm1, 30*16(%esi)
859     movdqa    %xmm2, 31*16(%esi)
860     
861     movdqa    0(%esp), %xmm1
862     movdqa    16(%esp), %xmm2
863     movdqa    32(%esp), %xmm6
864     paddd    0(%edx), %xmm7
865     paddd    16(%edx), %xmm5
866     paddd    32(%edx), %xmm4
867     paddd    48(%edx), %xmm3
868     paddd    64(%edx), %xmm0
869     paddd    80(%edx), %xmm1
870     paddd    96(%edx), %xmm2
871     paddd    112(%edx), %xmm6
872     
873     movdqa    %xmm7, 48+0(%esp)
874     movdqa    %xmm5, 48+16(%esp)
875     movdqa    %xmm4, 48+32(%esp)
876     movdqa    %xmm3, 48+48(%esp)
877     movdqa    %xmm0, 48+64(%esp)
878     movdqa    %xmm1, 48+80(%esp)
879     movdqa    %xmm2, 48+96(%esp)
880     movdqa    %xmm6, 48+112(%esp)
881     
882     movdqa    sha256d_4preext2_15, %xmm1
883     movdqa    sha256d_4preext2_24, %xmm2
884     pxor    %xmm0, %xmm0
885     movdqa    %xmm2, 48+128(%esp)
886     movdqa    %xmm0, 48+144(%esp)
887     movdqa    %xmm0, 48+160(%esp)
888     movdqa    %xmm0, 48+176(%esp)
889     movdqa    %xmm0, 48+192(%esp)
890     movdqa    %xmm0, 48+208(%esp)
891     movdqa    %xmm0, 48+224(%esp)
892     movdqa    %xmm1, 48+240(%esp)
893     
894     leal    19*16(%esp), %eax
895     cmpl    %eax, %eax
896     
897     movdqa    -15*16(%eax), %xmm0
898     movdqa    -14*16(%eax), %xmm4
899     movdqa    %xmm0, %xmm2
900     movdqa    %xmm4, %xmm6
901     psrld    $3, %xmm0
902     psrld    $3, %xmm4
903     movdqa    %xmm0, %xmm1
904     movdqa    %xmm4, %xmm5
905     pslld    $14, %xmm2
906     pslld    $14, %xmm6
907     psrld    $4, %xmm1
908     psrld    $4, %xmm5
909     pxor    %xmm1, %xmm0
910     pxor    %xmm5, %xmm4
911     psrld    $11, %xmm1
912     psrld    $11, %xmm5
913     pxor    %xmm2, %xmm0
914     pxor    %xmm6, %xmm4
915     pslld    $11, %xmm2
916     pslld    $11, %xmm6
917     pxor    %xmm1, %xmm0
918     pxor    %xmm5, %xmm4
919     pxor    %xmm2, %xmm0
920     pxor    %xmm6, %xmm4
921     paddd    -16*16(%eax), %xmm0
922     paddd    -15*16(%eax), %xmm4
923     paddd    sha256d_4preext2_17, %xmm4
924     movdqa    %xmm0, %xmm3
925     movdqa    %xmm4, %xmm7
926     movdqa    %xmm3, 0*16(%eax)
927     movdqa    %xmm7, 1*16(%eax)
928     
929     sha256_sse2_extend_doubleround 2
930     sha256_sse2_extend_doubleround 4
931     
932     movdqa    -9*16(%eax), %xmm0
933     movdqa    sha256d_4preext2_23, %xmm4
934     movdqa    %xmm0, %xmm2
935     psrld    $3, %xmm0
936     movdqa    %xmm0, %xmm1
937     pslld    $14, %xmm2
938     psrld    $4, %xmm1
939     pxor    %xmm1, %xmm0
940     pxor    %xmm2, %xmm0
941     psrld    $11, %xmm1
942     pslld    $11, %xmm2
943     pxor    %xmm1, %xmm0
944     pxor    %xmm2, %xmm0
945     paddd    -10*16(%eax), %xmm0
946     paddd    -9*16(%eax), %xmm4
947     movdqa    %xmm3, %xmm2
948     movdqa    %xmm7, %xmm6
949     psrld    $10, %xmm3
950     psrld    $10, %xmm7
951     movdqa    %xmm3, %xmm1
952     movdqa    %xmm7, %xmm5
953     paddd    -1*16(%eax), %xmm0
954     pslld    $13, %xmm2
955     pslld    $13, %xmm6
956     psrld    $7, %xmm1
957     psrld    $7, %xmm5
958     paddd    0*16(%eax), %xmm4
959     pxor    %xmm1, %xmm3
960     pxor    %xmm5, %xmm7
961     psrld    $2, %xmm1
962     psrld    $2, %xmm5
963     pxor    %xmm2, %xmm3
964     pxor    %xmm6, %xmm7
965     pslld    $2, %xmm2
966     pslld    $2, %xmm6
967     pxor    %xmm1, %xmm3
968     pxor    %xmm5, %xmm7
969     pxor    %xmm2, %xmm3
970     pxor    %xmm6, %xmm7
971     paddd    %xmm0, %xmm3
972     paddd    %xmm4, %xmm7
973     movdqa    %xmm3, 6*16(%eax)
974     movdqa    %xmm7, 7*16(%eax)
975     
976     movdqa    sha256d_4preext2_24, %xmm0
977     movdqa    %xmm3, %xmm2
978     movdqa    %xmm7, %xmm6
979     psrld    $10, %xmm3
980     psrld    $10, %xmm7
981     movdqa    %xmm3, %xmm1
982     movdqa    %xmm7, %xmm5
983     paddd    1*16(%eax), %xmm0
984     pslld    $13, %xmm2
985     pslld    $13, %xmm6
986     psrld    $7, %xmm1
987     psrld    $7, %xmm5
988     pxor    %xmm1, %xmm3
989     pxor    %xmm5, %xmm7
990     psrld    $2, %xmm1
991     psrld    $2, %xmm5
992     pxor    %xmm2, %xmm3
993     pxor    %xmm6, %xmm7
994     pslld    $2, %xmm2
995     pslld    $2, %xmm6
996     pxor    %xmm1, %xmm3
997     pxor    %xmm5, %xmm7
998     pxor    %xmm2, %xmm3
999     pxor    %xmm6, %xmm7
1000     paddd    %xmm0, %xmm3
1001     paddd    2*16(%eax), %xmm7
1002     movdqa    %xmm3, 8*16(%eax)
1003     movdqa    %xmm7, 9*16(%eax)
1004     
1005     movdqa    %xmm3, %xmm2
1006     movdqa    %xmm7, %xmm6
1007     psrld    $10, %xmm3
1008     psrld    $10, %xmm7
1009     movdqa    %xmm3, %xmm1
1010     movdqa    %xmm7, %xmm5
1011     pslld    $13, %xmm2
1012     pslld    $13, %xmm6
1013     psrld    $7, %xmm1
1014     psrld    $7, %xmm5
1015     pxor    %xmm1, %xmm3
1016     pxor    %xmm5, %xmm7
1017     psrld    $2, %xmm1
1018     psrld    $2, %xmm5
1019     pxor    %xmm2, %xmm3
1020     pxor    %xmm6, %xmm7
1021     pslld    $2, %xmm2
1022     pslld    $2, %xmm6
1023     pxor    %xmm1, %xmm3
1024     pxor    %xmm5, %xmm7
1025     pxor    %xmm2, %xmm3
1026     pxor    %xmm6, %xmm7
1027     paddd    3*16(%eax), %xmm3
1028     paddd    4*16(%eax), %xmm7
1029     movdqa    %xmm3, 10*16(%eax)
1030     movdqa    %xmm7, 11*16(%eax)
1031     
1032     movdqa    %xmm3, %xmm2
1033     movdqa    %xmm7, %xmm6
1034     psrld    $10, %xmm3
1035     psrld    $10, %xmm7
1036     movdqa    %xmm3, %xmm1
1037     movdqa    %xmm7, %xmm5
1038     pslld    $13, %xmm2
1039     pslld    $13, %xmm6
1040     psrld    $7, %xmm1
1041     psrld    $7, %xmm5
1042     pxor    %xmm1, %xmm3
1043     pxor    %xmm5, %xmm7
1044     psrld    $2, %xmm1
1045     psrld    $2, %xmm5
1046     pxor    %xmm2, %xmm3
1047     pxor    %xmm6, %xmm7
1048     pslld    $2, %xmm2
1049     pslld    $2, %xmm6
1050     pxor    %xmm1, %xmm3
1051     pxor    %xmm5, %xmm7
1052     pxor    %xmm2, %xmm3
1053     pxor    %xmm6, %xmm7
1054     paddd    5*16(%eax), %xmm3
1055     paddd    6*16(%eax), %xmm7
1056     movdqa    %xmm3, 12*16(%eax)
1057     movdqa    %xmm7, 13*16(%eax)
1058     
1059     movdqa    sha256d_4preext2_30, %xmm0
1060     movdqa    0*16(%eax), %xmm4
1061     movdqa    %xmm4, %xmm6
1062     psrld    $3, %xmm4
1063     movdqa    %xmm4, %xmm5
1064     pslld    $14, %xmm6
1065     psrld    $4, %xmm5
1066     pxor    %xmm5, %xmm4
1067     pxor    %xmm6, %xmm4
1068     psrld    $11, %xmm5
1069     pslld    $11, %xmm6
1070     pxor    %xmm5, %xmm4
1071     pxor    %xmm6, %xmm4
1072     paddd    -1*16(%eax), %xmm4
1073     movdqa    %xmm3, %xmm2
1074     movdqa    %xmm7, %xmm6
1075     psrld    $10, %xmm3
1076     psrld    $10, %xmm7
1077     movdqa    %xmm3, %xmm1
1078     movdqa    %xmm7, %xmm5
1079     paddd    7*16(%eax), %xmm0
1080     pslld    $13, %xmm2
1081     pslld    $13, %xmm6
1082     psrld    $7, %xmm1
1083     psrld    $7, %xmm5
1084     paddd    8*16(%eax), %xmm4
1085     pxor    %xmm1, %xmm3
1086     pxor    %xmm5, %xmm7
1087     psrld    $2, %xmm1
1088     psrld    $2, %xmm5
1089     pxor    %xmm2, %xmm3
1090     pxor    %xmm6, %xmm7
1091     pslld    $2, %xmm2
1092     pslld    $2, %xmm6
1093     pxor    %xmm1, %xmm3
1094     pxor    %xmm5, %xmm7
1095     pxor    %xmm2, %xmm3
1096     pxor    %xmm6, %xmm7
1097     paddd    %xmm0, %xmm3
1098     paddd    %xmm4, %xmm7
1099     movdqa    %xmm3, 14*16(%eax)
1100     movdqa    %xmm7, 15*16(%eax)
1101     
1102     jmp sha256d_ms_4way_extend_loop2
1103     
1104 sha256d_ms_4way_extend_coda2:
1105     sha256_sse2_extend_round 44
1106     
1107     movdqa    sha256_4h+0, %xmm7
1108     movdqa    sha256_4h+16, %xmm5
1109     movdqa    sha256_4h+32, %xmm4
1110     movdqa    sha256_4h+48, %xmm3
1111     movdqa    sha256_4h+64, %xmm0
1112     movdqa    sha256_4h+80, %xmm1
1113     movdqa    sha256_4h+96, %xmm2
1114     movdqa    sha256_4h+112, %xmm6
1115     movdqa    %xmm1, 0(%esp)
1116     movdqa    %xmm2, 16(%esp)
1117     movdqa    %xmm6, 32(%esp)
1118     
1119     leal    48(%esp), %eax
1120     jmp sha256d_ms_4way_main_loop2
1121
1122 .macro sha256_sse2_main_round_red i, r7
1123     movdqa    16*(\i)(%eax), %xmm6
1124     paddd    16*(\i)+sha256_4k, %xmm6
1125     paddd    32(%esp), %xmm6
1126     movdqa    %xmm0, %xmm1
1127     movdqa    16(%esp), %xmm2
1128     paddd    \r7, %xmm6
1129     pandn    %xmm2, %xmm1
1130     movdqa    %xmm2, 32(%esp)
1131     movdqa    0(%esp), %xmm2
1132     movdqa    %xmm2, 16(%esp)
1133     pand    %xmm0, %xmm2
1134     pxor    %xmm2, %xmm1
1135     movdqa    %xmm0, 0(%esp)
1136     paddd    %xmm1, %xmm6
1137     movdqa    %xmm0, %xmm1
1138     psrld    $6, %xmm0
1139     movdqa    %xmm0, %xmm2
1140     pslld    $7, %xmm1
1141     psrld    $5, %xmm2
1142     pxor    %xmm1, %xmm0
1143     pxor    %xmm2, %xmm0
1144     pslld    $14, %xmm1
1145     psrld    $14, %xmm2
1146     pxor    %xmm1, %xmm0
1147     pxor    %xmm2, %xmm0
1148     pslld    $5, %xmm1
1149     pxor    %xmm1, %xmm0
1150     paddd    %xmm6, %xmm0
1151 .endm
1152
1153 sha256d_ms_4way_finish:
1154     sha256_sse2_main_round_red 57, %xmm3
1155     sha256_sse2_main_round_red 58, %xmm4
1156     sha256_sse2_main_round_red 59, %xmm5
1157     sha256_sse2_main_round_red 60, %xmm7
1158     
1159     paddd    sha256_4h+112, %xmm0
1160     movdqa    %xmm0, 112(%edi)
1161     
1162     movl    %ebp, %esp
1163     popl    %ebp
1164     popl    %esi
1165     popl    %edi
1166     ret
1167
1168
1169     .text
1170     .p2align 5
1171     .globl sha256_use_4way
1172     .globl _sha256_use_4way
1173 sha256_use_4way:
1174 _sha256_use_4way:
1175     pushl    %ebx
1176     
1177     /* Check for SSE2 availability */
1178     movl    $1, %eax
1179     cpuid
1180     andl    $0x04000000, %edx
1181     jnz sha256_use_4way_sse2
1182     xorl    %eax, %eax
1183     popl    %ebx
1184     ret
1185     
1186 sha256_use_4way_sse2:
1187     movl    $1, %eax
1188     popl    %ebx
1189     ret
1190
1191 #if defined(USE_SSSE3)
1192     .text
1193     .p2align 5
1194     .globl sha256_use_ssse3
1195     .globl _sha256_use_ssse3
1196 sha256_use_ssse3:
1197 _sha256_use_ssse3:
1198     pushl    %ebx
1199     
1200     movl    $1, %eax
1201     cpuid
1202     andl    $0x00000200, %ecx
1203     jnz sha256_use_ssse3
1204     xorl    %eax, %eax
1205     popl    %ebx
1206     ret
1207     
1208 sha256_use_ssse3:
1209     movl    $1, %eax
1210     popl    %ebx
1211     ret
1212 #endif
1213
1214
1215 #endif