Bump version to 0.5.5
[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     .text
97     .p2align 5
98     .globl sha256_init_4way
99     .globl _sha256_init_4way
100 sha256_init_4way:
101 _sha256_init_4way:
102     movl    4(%esp), %edx
103     movdqa    sha256_4h+0, %xmm0
104     movdqa    sha256_4h+16, %xmm1
105     movdqa    sha256_4h+32, %xmm2
106     movdqa    sha256_4h+48, %xmm3
107     movdqu    %xmm0, 0(%edx)
108     movdqu    %xmm1, 16(%edx)
109     movdqu    %xmm2, 32(%edx)
110     movdqu    %xmm3, 48(%edx)
111     movdqa    sha256_4h+64, %xmm0
112     movdqa    sha256_4h+80, %xmm1
113     movdqa    sha256_4h+96, %xmm2
114     movdqa    sha256_4h+112, %xmm3
115     movdqu    %xmm0, 64(%edx)
116     movdqu    %xmm1, 80(%edx)
117     movdqu    %xmm2, 96(%edx)
118     movdqu    %xmm3, 112(%edx)
119     ret
120
121
122 .macro sha256_sse2_extend_round i
123     movdqa    (\i-15)*16(%eax), %xmm0
124     movdqa    %xmm0, %xmm2
125     psrld    $3, %xmm0
126     movdqa    %xmm0, %xmm1
127     pslld    $14, %xmm2
128     psrld    $4, %xmm1
129     pxor    %xmm1, %xmm0
130     pxor    %xmm2, %xmm0
131     psrld    $11, %xmm1
132     pslld    $11, %xmm2
133     pxor    %xmm1, %xmm0
134     pxor    %xmm2, %xmm0
135     paddd    (\i-16)*16(%eax), %xmm0
136     paddd    (\i-7)*16(%eax), %xmm0
137
138     movdqa    %xmm3, %xmm2
139     psrld    $10, %xmm3
140     pslld    $13, %xmm2
141     movdqa    %xmm3, %xmm1
142     psrld    $7, %xmm1
143     pxor    %xmm1, %xmm3
144     pxor    %xmm2, %xmm3
145     psrld    $2, %xmm1
146     pslld    $2, %xmm2
147     pxor    %xmm1, %xmm3
148     pxor    %xmm2, %xmm3
149     paddd    %xmm0, %xmm3
150     movdqa    %xmm3, \i*16(%eax)
151 .endm
152
153 .macro sha256_sse2_extend_doubleround i
154     movdqa    (\i-15)*16(%eax), %xmm0
155     movdqa    (\i-14)*16(%eax), %xmm4
156     movdqa    %xmm0, %xmm2
157     movdqa    %xmm4, %xmm6
158     psrld    $3, %xmm0
159     psrld    $3, %xmm4
160     movdqa    %xmm0, %xmm1
161     movdqa    %xmm4, %xmm5
162     pslld    $14, %xmm2
163     pslld    $14, %xmm6
164     psrld    $4, %xmm1
165     psrld    $4, %xmm5
166     pxor    %xmm1, %xmm0
167     pxor    %xmm5, %xmm4
168     psrld    $11, %xmm1
169     psrld    $11, %xmm5
170     pxor    %xmm2, %xmm0
171     pxor    %xmm6, %xmm4
172     pslld    $11, %xmm2
173     pslld    $11, %xmm6
174     pxor    %xmm1, %xmm0
175     pxor    %xmm5, %xmm4
176     pxor    %xmm2, %xmm0
177     pxor    %xmm6, %xmm4
178
179     paddd    (\i-16)*16(%eax), %xmm0
180     paddd    (\i-15)*16(%eax), %xmm4
181
182     movdqa    %xmm3, %xmm2
183     movdqa    %xmm7, %xmm6
184     psrld    $10, %xmm3
185     psrld    $10, %xmm7
186     movdqa    %xmm3, %xmm1
187     movdqa    %xmm7, %xmm5
188     pslld    $13, %xmm2
189     pslld    $13, %xmm6
190     psrld    $7, %xmm1
191     psrld    $7, %xmm5
192
193     paddd    (\i-7)*16(%eax), %xmm0
194     paddd    (\i-6)*16(%eax), %xmm4
195
196     pxor    %xmm1, %xmm3
197     pxor    %xmm5, %xmm7
198     psrld    $2, %xmm1
199     psrld    $2, %xmm5
200     pxor    %xmm2, %xmm3
201     pxor    %xmm6, %xmm7
202     pslld    $2, %xmm2
203     pslld    $2, %xmm6
204     pxor    %xmm1, %xmm3
205     pxor    %xmm5, %xmm7
206     pxor    %xmm2, %xmm3
207     pxor    %xmm6, %xmm7
208
209     paddd    %xmm0, %xmm3
210     paddd    %xmm4, %xmm7
211     movdqa    %xmm3, \i*16(%eax)
212     movdqa    %xmm7, (\i+1)*16(%eax)
213 .endm
214
215 .macro sha256_sse2_main_round i
216     movdqa    16*(\i)(%eax), %xmm6
217
218     movdqa    %xmm0, %xmm1
219     movdqa    16(%esp), %xmm2
220     pandn    %xmm2, %xmm1
221     paddd    32(%esp), %xmm6
222
223     movdqa    %xmm2, 32(%esp)
224     movdqa    0(%esp), %xmm2
225     movdqa    %xmm2, 16(%esp)
226
227     pand    %xmm0, %xmm2
228     pxor    %xmm2, %xmm1
229     movdqa    %xmm0, 0(%esp)
230
231     paddd    %xmm1, %xmm6
232
233     movdqa    %xmm0, %xmm1
234     psrld    $6, %xmm0
235     paddd    16*(\i)+sha256_4k, %xmm6
236     movdqa    %xmm0, %xmm2
237     pslld    $7, %xmm1
238     psrld    $5, %xmm2
239     pxor    %xmm1, %xmm0
240     pxor    %xmm2, %xmm0
241     pslld    $14, %xmm1
242     psrld    $14, %xmm2
243     pxor    %xmm1, %xmm0
244     pslld    $5, %xmm1
245     pxor    %xmm2, %xmm0
246     pxor    %xmm1, %xmm0
247     movdqa    %xmm5, %xmm1
248     paddd    %xmm0, %xmm6
249
250     movdqa    %xmm3, %xmm0
251     movdqa    %xmm4, %xmm3
252     movdqa    %xmm4, %xmm2
253     paddd    %xmm6, %xmm0
254     pand    %xmm5, %xmm2
255     pand    %xmm7, %xmm1
256     pand    %xmm7, %xmm4
257     pxor    %xmm4, %xmm1
258     movdqa    %xmm5, %xmm4
259     movdqa    %xmm7, %xmm5
260     pxor    %xmm2, %xmm1
261     paddd    %xmm1, %xmm6
262
263     movdqa    %xmm7, %xmm2
264     psrld    $2, %xmm7
265     movdqa    %xmm7, %xmm1
266     pslld    $10, %xmm2
267     psrld    $11, %xmm1
268     pxor    %xmm2, %xmm7
269     pslld    $9, %xmm2
270     pxor    %xmm1, %xmm7
271     psrld    $9, %xmm1
272     pxor    %xmm2, %xmm7
273     pslld    $11, %xmm2
274     pxor    %xmm1, %xmm7
275     pxor    %xmm2, %xmm7
276     paddd    %xmm6, %xmm7
277 .endm
278
279 .macro sha256_sse2_main_quadround i
280     sha256_sse2_main_round \i+0
281     sha256_sse2_main_round \i+1
282     sha256_sse2_main_round \i+2
283     sha256_sse2_main_round \i+3
284 .endm
285
286
287 .macro p2bswap_esi_esp i
288     movdqu    \i*16(%esi), %xmm0
289     movdqu    (\i+1)*16(%esi), %xmm2
290     pshuflw    $0xb1, %xmm0, %xmm0
291     pshuflw    $0xb1, %xmm2, %xmm2
292     pshufhw    $0xb1, %xmm0, %xmm0
293     pshufhw    $0xb1, %xmm2, %xmm2
294     movdqa    %xmm0, %xmm1
295     movdqa    %xmm2, %xmm3
296     psrlw    $8, %xmm1
297     psrlw    $8, %xmm3
298     psllw    $8, %xmm0
299     psllw    $8, %xmm2
300     pxor    %xmm1, %xmm0
301     pxor    %xmm3, %xmm2
302     movdqa    %xmm0, (\i+3)*16(%esp)
303     movdqa    %xmm2, (\i+4)*16(%esp)
304 .endm
305
306     .text
307     .p2align 5
308     .globl sha256_transform_4way
309     .globl _sha256_transform_4way
310 sha256_transform_4way:
311 _sha256_transform_4way:
312     pushl    %edi
313     pushl    %esi
314     movl    12(%esp), %edi
315     movl    16(%esp), %esi
316     movl    20(%esp), %ecx
317     movl    %esp, %edx
318     subl    $67*16, %esp
319     andl    $-128, %esp
320     
321     testl    %ecx, %ecx
322     jnz sha256_transform_4way_swap
323     
324     movdqu    0*16(%esi), %xmm0
325     movdqu    1*16(%esi), %xmm1
326     movdqu    2*16(%esi), %xmm2
327     movdqu    3*16(%esi), %xmm3
328     movdqu    4*16(%esi), %xmm4
329     movdqu    5*16(%esi), %xmm5
330     movdqu    6*16(%esi), %xmm6
331     movdqu    7*16(%esi), %xmm7
332     movdqa    %xmm0, 3*16(%esp)
333     movdqa    %xmm1, 4*16(%esp)
334     movdqa    %xmm2, 5*16(%esp)
335     movdqa    %xmm3, 6*16(%esp)
336     movdqa    %xmm4, 7*16(%esp)
337     movdqa    %xmm5, 8*16(%esp)
338     movdqa    %xmm6, 9*16(%esp)
339     movdqa    %xmm7, 10*16(%esp)
340     movdqu    8*16(%esi), %xmm0
341     movdqu    9*16(%esi), %xmm1
342     movdqu    10*16(%esi), %xmm2
343     movdqu    11*16(%esi), %xmm3
344     movdqu    12*16(%esi), %xmm4
345     movdqu    13*16(%esi), %xmm5
346     movdqu    14*16(%esi), %xmm6
347     movdqu    15*16(%esi), %xmm7
348     movdqa    %xmm0, 11*16(%esp)
349     movdqa    %xmm1, 12*16(%esp)
350     movdqa    %xmm2, 13*16(%esp)
351     movdqa    %xmm3, 14*16(%esp)
352     movdqa    %xmm4, 15*16(%esp)
353     movdqa    %xmm5, 16*16(%esp)
354     movdqa    %xmm6, 17*16(%esp)
355     movdqa    %xmm7, 18*16(%esp)
356     jmp sha256_transform_4way_extend
357     
358     .p2align 5
359 sha256_transform_4way_swap:
360     p2bswap_esi_esp 0
361     p2bswap_esi_esp 2
362     p2bswap_esi_esp 4
363     p2bswap_esi_esp 6
364     p2bswap_esi_esp 8
365     p2bswap_esi_esp 10
366     p2bswap_esi_esp 12
367     p2bswap_esi_esp 14
368     
369 sha256_transform_4way_extend:
370     leal    19*16(%esp), %ecx
371     leal    48*16(%ecx), %eax
372     movdqa    -2*16(%ecx), %xmm3
373     movdqa    -1*16(%ecx), %xmm7
374 sha256_transform_4way_extend_loop:
375     movdqa    -15*16(%ecx), %xmm0
376     movdqa    -14*16(%ecx), %xmm4
377     movdqa    %xmm0, %xmm2
378     movdqa    %xmm4, %xmm6
379     psrld    $3, %xmm0
380     psrld    $3, %xmm4
381     movdqa    %xmm0, %xmm1
382     movdqa    %xmm4, %xmm5
383     pslld    $14, %xmm2
384     pslld    $14, %xmm6
385     psrld    $4, %xmm1
386     psrld    $4, %xmm5
387     pxor    %xmm1, %xmm0
388     pxor    %xmm5, %xmm4
389     psrld    $11, %xmm1
390     psrld    $11, %xmm5
391     pxor    %xmm2, %xmm0
392     pxor    %xmm6, %xmm4
393     pslld    $11, %xmm2
394     pslld    $11, %xmm6
395     pxor    %xmm1, %xmm0
396     pxor    %xmm5, %xmm4
397     pxor    %xmm2, %xmm0
398     pxor    %xmm6, %xmm4
399
400     paddd    -16*16(%ecx), %xmm0
401     paddd    -15*16(%ecx), %xmm4
402
403     movdqa    %xmm3, %xmm2
404     movdqa    %xmm7, %xmm6
405     psrld    $10, %xmm3
406     psrld    $10, %xmm7
407     movdqa    %xmm3, %xmm1
408     movdqa    %xmm7, %xmm5
409     pslld    $13, %xmm2
410     pslld    $13, %xmm6
411     psrld    $7, %xmm1
412     psrld    $7, %xmm5
413
414     paddd    -7*16(%ecx), %xmm0
415     paddd    -6*16(%ecx), %xmm4
416
417     pxor    %xmm1, %xmm3
418     pxor    %xmm5, %xmm7
419     psrld    $2, %xmm1
420     psrld    $2, %xmm5
421     pxor    %xmm2, %xmm3
422     pxor    %xmm6, %xmm7
423     pslld    $2, %xmm2
424     pslld    $2, %xmm6
425     pxor    %xmm1, %xmm3
426     pxor    %xmm5, %xmm7
427     pxor    %xmm2, %xmm3
428     pxor    %xmm6, %xmm7
429
430     paddd    %xmm0, %xmm3
431     paddd    %xmm4, %xmm7
432     movdqa    %xmm3, (%ecx)
433     movdqa    %xmm7, 16(%ecx)
434     addl    $2*16, %ecx
435     cmpl    %ecx, %eax
436     jne sha256_transform_4way_extend_loop
437     
438     movdqu    0(%edi), %xmm7
439     movdqu    16(%edi), %xmm5
440     movdqu    32(%edi), %xmm4
441     movdqu    48(%edi), %xmm3
442     movdqu    64(%edi), %xmm0
443     movdqu    80(%edi), %xmm1
444     movdqu    96(%edi), %xmm2
445     movdqu    112(%edi), %xmm6
446     movdqa    %xmm1, 0(%esp)
447     movdqa    %xmm2, 16(%esp)
448     movdqa    %xmm6, 32(%esp)
449     
450     xorl    %eax, %eax
451 sha256_transform_4way_main_loop:
452     movdqa    3*16(%esp, %eax), %xmm6
453     paddd    sha256_4k(%eax), %xmm6
454     paddd    32(%esp), %xmm6
455
456     movdqa    %xmm0, %xmm1
457     movdqa    16(%esp), %xmm2
458     pandn    %xmm2, %xmm1
459
460     movdqa    %xmm2, 32(%esp)
461     movdqa    0(%esp), %xmm2
462     movdqa    %xmm2, 16(%esp)
463
464     pand    %xmm0, %xmm2
465     pxor    %xmm2, %xmm1
466     movdqa    %xmm0, 0(%esp)
467
468     paddd    %xmm1, %xmm6
469
470     movdqa    %xmm0, %xmm1
471     psrld    $6, %xmm0
472     movdqa    %xmm0, %xmm2
473     pslld    $7, %xmm1
474     psrld    $5, %xmm2
475     pxor    %xmm1, %xmm0
476     pxor    %xmm2, %xmm0
477     pslld    $14, %xmm1
478     psrld    $14, %xmm2
479     pxor    %xmm1, %xmm0
480     pxor    %xmm2, %xmm0
481     pslld    $5, %xmm1
482     pxor    %xmm1, %xmm0
483     paddd    %xmm0, %xmm6
484
485     movdqa    %xmm3, %xmm0
486     paddd    %xmm6, %xmm0
487
488     movdqa    %xmm5, %xmm1
489     movdqa    %xmm4, %xmm3
490     movdqa    %xmm4, %xmm2
491     pand    %xmm5, %xmm2
492     pand    %xmm7, %xmm4
493     pand    %xmm7, %xmm1
494     pxor    %xmm4, %xmm1
495     movdqa    %xmm5, %xmm4
496     movdqa    %xmm7, %xmm5
497     pxor    %xmm2, %xmm1
498     paddd    %xmm1, %xmm6
499
500     movdqa    %xmm7, %xmm2
501     psrld    $2, %xmm7
502     movdqa    %xmm7, %xmm1
503     pslld    $10, %xmm2
504     psrld    $11, %xmm1
505     pxor    %xmm2, %xmm7
506     pxor    %xmm1, %xmm7
507     pslld    $9, %xmm2
508     psrld    $9, %xmm1
509     pxor    %xmm2, %xmm7
510     pxor    %xmm1, %xmm7
511     pslld    $11, %xmm2
512     pxor    %xmm2, %xmm7
513     paddd    %xmm6, %xmm7
514     
515     addl    $16, %eax
516     cmpl    $16*64, %eax
517     jne sha256_transform_4way_main_loop
518     
519     movdqu    0(%edi), %xmm1
520     movdqu    16(%edi), %xmm2
521     paddd    %xmm1, %xmm7
522     paddd    %xmm2, %xmm5
523     movdqu    32(%edi), %xmm1
524     movdqu    48(%edi), %xmm2
525     paddd    %xmm1, %xmm4
526     paddd    %xmm2, %xmm3
527     
528     movdqu    %xmm7, 0(%edi)
529     movdqu    %xmm5, 16(%edi)
530     movdqu    %xmm4, 32(%edi)
531     movdqu    %xmm3, 48(%edi)
532     
533     movdqu    64(%edi), %xmm1
534     movdqu    80(%edi), %xmm2
535     movdqu    96(%edi), %xmm6
536     movdqu    112(%edi), %xmm7
537     paddd    %xmm1, %xmm0
538     paddd    0(%esp), %xmm2
539     paddd    16(%esp), %xmm6
540     paddd    32(%esp), %xmm7
541     
542     movdqu    %xmm0, 64(%edi)
543     movdqu    %xmm2, 80(%edi)
544     movdqu    %xmm6, 96(%edi)
545     movdqu    %xmm7, 112(%edi)
546     
547     movl    %edx, %esp
548     popl    %esi
549     popl    %edi
550     ret
551
552 .macro sha256_sse2_main_round_red i, r7
553     movdqa    16*(\i)(%eax), %xmm6
554     paddd    16*(\i)+sha256_4k, %xmm6
555     paddd    32(%esp), %xmm6
556     movdqa    %xmm0, %xmm1
557     movdqa    16(%esp), %xmm2
558     paddd    \r7, %xmm6
559     pandn    %xmm2, %xmm1
560     movdqa    %xmm2, 32(%esp)
561     movdqa    0(%esp), %xmm2
562     movdqa    %xmm2, 16(%esp)
563     pand    %xmm0, %xmm2
564     pxor    %xmm2, %xmm1
565     movdqa    %xmm0, 0(%esp)
566     paddd    %xmm1, %xmm6
567     movdqa    %xmm0, %xmm1
568     psrld    $6, %xmm0
569     movdqa    %xmm0, %xmm2
570     pslld    $7, %xmm1
571     psrld    $5, %xmm2
572     pxor    %xmm1, %xmm0
573     pxor    %xmm2, %xmm0
574     pslld    $14, %xmm1
575     psrld    $14, %xmm2
576     pxor    %xmm1, %xmm0
577     pxor    %xmm2, %xmm0
578     pslld    $5, %xmm1
579     pxor    %xmm1, %xmm0
580     paddd    %xmm6, %xmm0
581 .endm
582
583     .text
584     .p2align 5
585     .globl sha256_use_4way
586     .globl _sha256_use_4way
587 sha256_use_4way:
588 _sha256_use_4way:
589     pushl    %ebx
590     
591     /* Check for SSE2 availability */
592     movl    $1, %eax
593     cpuid
594     andl    $0x04000000, %edx
595     jnz sha256_use_4way_sse2
596     xorl    %eax, %eax
597     popl    %ebx
598     ret
599     
600 sha256_use_4way_sse2:
601     movl    $1, %eax
602     popl    %ebx
603     ret
604
605     .text
606     .p2align 5
607     .globl sha256_use_ssse3
608     .globl _sha256_use_ssse3
609 sha256_use_ssse3:
610 _sha256_use_ssse3:
611     pushl    %ebx
612     
613     movl    $1, %eax
614     cpuid
615     andl    $0x00000200, %ecx
616     jnz sha256_use_ssse3_done
617     xorl    %eax, %eax
618     popl    %ebx
619     ret
620     
621 sha256_use_ssse3_done:
622     movl    $1, %eax
623     popl    %ebx
624     ret
625
626 #endif