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