182a36c838afc4d4630b6c6ac2af088d72e5c6d1
[novacoin.git] / src / crypto / sha2 / asm / sha2-arm.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(__arm__) && defined(__APCS_32__)
11
12 .macro sha256_k
13         .align 2
14         .long 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5
15         .long 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5
16         .long 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3
17         .long 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174
18         .long 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc
19         .long 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da
20         .long 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7
21         .long 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967
22         .long 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13
23         .long 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85
24         .long 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3
25         .long 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070
26         .long 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5
27         .long 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3
28         .long 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208
29         .long 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
30 .endm
31
32 .macro sha256_extend_doubleround_core i, rw, ra, rb, ry, rz
33         mov     r12, \ry, ror #17
34         add     r11, r11, \ra
35         eor     r12, r12, \ry, ror #19
36         mov     \ra, lr, ror #7
37         eor     r12, r12, \ry, lsr #10
38         eor     \ra, \ra, lr, ror #18
39         add     r12, r12, r11
40         ldr     r11, [\rw, #(\i+2)*4]
41         eor     \ra, \ra, lr, lsr #3
42         add     \ra, \ra, r12
43
44         mov     r12, \rz, ror #17
45         str     \ra, [\rw, #(\i+16)*4]
46         add     lr, lr, \rb
47         eor     r12, r12, \rz, ror #19
48         mov     \rb, r11, ror #7
49         eor     r12, r12, \rz, lsr #10
50         eor     \rb, \rb, r11, ror #18
51         add     lr, lr, r12
52         eor     \rb, \rb, r11, lsr #3
53         add     \rb, \rb, lr
54 .endm
55
56 .macro sha256_extend_doubleround_head i, rw, ra, rb, ry, rz
57         ldr     lr, [\rw, #(\i+1)*4]
58         sha256_extend_doubleround_core \i, \rw, \ra, \rb, \ry, \rz
59         ldr     lr, [\rw, #(\i+3)*4]
60 .endm
61
62 .macro sha256_extend_doubleround_body i, rw, ra, rb, ry, rz
63         str     \rz, [\rw, #(\i+15)*4]
64         sha256_extend_doubleround_core \i, \rw, \ra, \rb, \ry, \rz
65         ldr     lr, [\rw, #(\i+3)*4]
66 .endm
67
68 .macro sha256_extend_doubleround_foot i, rw, ra, rb, ry, rz
69         str     \rz, [\rw, #(\i+15)*4]
70         sha256_extend_doubleround_core \i, \rw, \ra, \rb, \ry, \rz
71         str     \rb, [\rw, #(\i+17)*4]
72 .endm
73
74 .macro sha256_main_round i, ka, rw, ra, rb, rc, rd, re, rf, rg, rh
75         ldr     r12, [\rw, #(\i)*4]
76         and     r3, \rf, \re
77         bic     lr, \rg, \re
78         orr     lr, lr, r3
79         ldr     r3, \ka + (\i)*4
80         add     \rh, \rh, lr
81         eor     lr, \re, \re, ror #5
82         add     \rh, \rh, r12
83         eor     lr, lr, \re, ror #19
84         add     \rh, \rh, r3
85         eor     r3, \ra, \rb
86         add     \rh, \rh, lr, ror #6
87
88         and     r3, r3, \rc
89         eor     r12, \ra, \ra, ror #11
90         and     lr, \ra, \rb
91         eor     r12, r12, \ra, ror #20
92         eor     lr, lr, r3
93         add     r3, \rh, lr
94         add     \rh, \rh, \rd
95         add     \rd, r3, r12, ror #2
96 .endm
97
98 .macro sha256_main_quadround i, ka, rw
99         sha256_main_round \i+0, \ka, \rw, r4, r5, r6, r7, r8, r9, r10, r11
100         sha256_main_round \i+1, \ka, \rw, r7, r4, r5, r6, r11, r8, r9, r10
101         sha256_main_round \i+2, \ka, \rw, r6, r7, r4, r5, r10, r11, r8, r9
102         sha256_main_round \i+3, \ka, \rw, r5, r6, r7, r4, r9, r10, r11, r8
103 .endm
104
105
106         .text
107         .code 32
108         .align 2
109         .globl sha256_transform
110         .globl _sha256_transform
111 #ifdef __ELF__
112         .type sha256_transform, %function
113 #endif
114 sha256_transform:
115 _sha256_transform:
116         stmfd   sp!, {r4-r11, lr}
117         cmp     r2, #0
118         sub     sp, sp, #64*4
119         bne     sha256_transform_swap
120         
121         ldmia   r1!, {r4-r11}
122         stmia   sp, {r4-r11}
123         add     r3, sp, #8*4
124         ldmia   r1, {r4-r11}
125         stmia   r3, {r4-r11}
126         b       sha256_transform_extend
127
128 .macro bswap rd, rn
129         eor     r12, \rn, \rn, ror #16
130         bic     r12, r12, #0x00ff0000
131         mov     \rd, \rn, ror #8
132         eor     \rd, \rd, r12, lsr #8
133 .endm
134
135 sha256_transform_swap:
136         ldmia   r1!, {r4-r11}
137         bswap   r4, r4
138         bswap   r5, r5
139         bswap   r6, r6
140         bswap   r7, r7
141         bswap   r8, r8
142         bswap   r9, r9
143         bswap   r10, r10
144         bswap   r11, r11
145         stmia   sp, {r4-r11}
146         add     r3, sp, #8*4
147         ldmia   r1, {r4-r11}
148         bswap   r4, r4
149         bswap   r5, r5
150         bswap   r6, r6
151         bswap   r7, r7
152         bswap   r8, r8
153         bswap   r9, r9
154         bswap   r10, r10
155         bswap   r11, r11
156         stmia   r3, {r4-r11}
157         
158 sha256_transform_extend:
159         add     r12, sp, #9*4
160         ldr     r11, [sp, #0*4]
161         ldmia   r12, {r4-r10}
162         sha256_extend_doubleround_head  0, sp, r4, r5, r9, r10
163         sha256_extend_doubleround_body  2, sp, r6, r7, r4, r5
164         sha256_extend_doubleround_body  4, sp, r8, r9, r6, r7
165         sha256_extend_doubleround_body  6, sp, r10, r4, r8, r9
166         sha256_extend_doubleround_body  8, sp, r5, r6, r10, r4
167         sha256_extend_doubleround_body 10, sp, r7, r8, r5, r6
168         sha256_extend_doubleround_body 12, sp, r9, r10, r7, r8
169         sha256_extend_doubleround_body 14, sp, r4, r5, r9, r10
170         sha256_extend_doubleround_body 16, sp, r6, r7, r4, r5
171         sha256_extend_doubleround_body 18, sp, r8, r9, r6, r7
172         sha256_extend_doubleround_body 20, sp, r10, r4, r8, r9
173         sha256_extend_doubleround_body 22, sp, r5, r6, r10, r4
174         sha256_extend_doubleround_body 24, sp, r7, r8, r5, r6
175         sha256_extend_doubleround_body 26, sp, r9, r10, r7, r8
176         sha256_extend_doubleround_body 28, sp, r4, r5, r9, r10
177         sha256_extend_doubleround_body 30, sp, r6, r7, r4, r5
178         sha256_extend_doubleround_body 32, sp, r8, r9, r6, r7
179         sha256_extend_doubleround_body 34, sp, r10, r4, r8, r9
180         sha256_extend_doubleround_body 36, sp, r5, r6, r10, r4
181         sha256_extend_doubleround_body 38, sp, r7, r8, r5, r6
182         sha256_extend_doubleround_body 40, sp, r9, r10, r7, r8
183         sha256_extend_doubleround_body 42, sp, r4, r5, r9, r10
184         sha256_extend_doubleround_body 44, sp, r6, r7, r4, r5
185         sha256_extend_doubleround_foot 46, sp, r8, r9, r6, r7
186         
187         ldmia   r0, {r4-r11}
188         sha256_main_quadround  0, sha256_transform_k, sp
189         sha256_main_quadround  4, sha256_transform_k, sp
190         sha256_main_quadround  8, sha256_transform_k, sp
191         sha256_main_quadround 12, sha256_transform_k, sp
192         sha256_main_quadround 16, sha256_transform_k, sp
193         sha256_main_quadround 20, sha256_transform_k, sp
194         sha256_main_quadround 24, sha256_transform_k, sp
195         sha256_main_quadround 28, sha256_transform_k, sp
196         b       sha256_transform_k_over
197 sha256_transform_k:
198         sha256_k
199 sha256_transform_k_over:
200         sha256_main_quadround 32, sha256_transform_k, sp
201         sha256_main_quadround 36, sha256_transform_k, sp
202         sha256_main_quadround 40, sha256_transform_k, sp
203         sha256_main_quadround 44, sha256_transform_k, sp
204         sha256_main_quadround 48, sha256_transform_k, sp
205         sha256_main_quadround 52, sha256_transform_k, sp
206         sha256_main_quadround 56, sha256_transform_k, sp
207         sha256_main_quadround 60, sha256_transform_k, sp
208         
209         ldmia   r0, {r1, r2, r3, r12}
210         add     r4, r4, r1
211         add     r5, r5, r2
212         add     r6, r6, r3
213         add     r7, r7, r12
214         stmia   r0!, {r4-r7}
215         ldmia   r0, {r1, r2, r3, r12}
216         add     r8, r8, r1
217         add     r9, r9, r2
218         add     r10, r10, r3
219         add     r11, r11, r12
220         stmia   r0, {r8-r11}
221         
222         add     sp, sp, #64*4
223 #ifdef __thumb__
224         ldmfd   sp!, {r4-r11, lr}
225         bx      lr
226 #else
227         ldmfd   sp!, {r4-r11, pc}
228 #endif
229
230
231         .text
232         .code 32
233         .align 2
234         .globl sha256d_ms
235         .globl _sha256d_ms
236 #ifdef __ELF__
237         .type sha256d_ms, %function
238 #endif
239 sha256d_ms:
240 _sha256d_ms:
241         stmfd   sp!, {r4-r11, lr}
242         sub     sp, sp, #64*4
243         
244         cmp     r0, r0
245         
246         ldr     lr, [r1, #3*4]
247         ldr     r6, [r1, #18*4]
248         ldr     r7, [r1, #19*4]
249         
250         mov     r12, lr, ror #7
251         str     r6, [sp, #18*4]
252         eor     r12, r12, lr, ror #18
253         str     r7, [sp, #19*4]
254         eor     r12, r12, lr, lsr #3
255         ldr     r8, [r1, #20*4]
256         add     r6, r6, r12
257         ldr     r10, [r1, #22*4]
258         add     r7, r7, lr
259         str     r6, [r1, #18*4]
260         
261         mov     r12, r6, ror #17
262         str     r7, [r1, #19*4]
263         eor     r12, r12, r6, ror #19
264         str     r8, [sp, #20*4]
265         eor     r12, r12, r6, lsr #10
266         ldr     r4, [r1, #23*4]
267         add     r8, r8, r12
268         ldr     r5, [r1, #24*4]
269         
270         mov     r9, r7, ror #17
271         str     r8, [r1, #20*4]
272         eor     r9, r9, r7, ror #19
273         str     r10, [sp, #21*4]
274         eor     r9, r9, r7, lsr #10
275         str     r4, [sp, #22*4]
276         
277         mov     r12, r8, ror #17
278         str     r9, [r1, #21*4]
279         eor     r12, r12, r8, ror #19
280         str     r5, [sp, #23*4]
281         eor     r12, r12, r8, lsr #10
282         mov     lr, r9, ror #17
283         add     r10, r10, r12
284         ldr     r11, [r1, #30*4]
285         
286         eor     lr, lr, r9, ror #19
287         str     r10, [r1, #22*4]
288         eor     lr, lr, r9, lsr #10
289         str     r11, [sp, #24*4]
290         add     r4, r4, lr
291         
292         mov     r12, r10, ror #17
293         str     r4, [r1, #23*4]
294         eor     r12, r12, r10, ror #19
295         mov     lr, r4, ror #17
296         eor     r12, r12, r10, lsr #10
297         eor     lr, lr, r4, ror #19
298         add     r5, r5, r12
299         eor     lr, lr, r4, lsr #10
300         str     r5, [r1, #24*4]
301         add     r6, r6, lr
302         
303         mov     r12, r5, ror #17
304         str     r6, [r1, #25*4]
305         eor     r12, r12, r5, ror #19
306         mov     lr, r6, ror #17
307         eor     r12, r12, r5, lsr #10
308         eor     lr, lr, r6, ror #19
309         add     r7, r7, r12
310         eor     lr, lr, r6, lsr #10
311         str     r7, [r1, #26*4]
312         add     r8, r8, lr
313         
314         mov     r12, r7, ror #17
315         str     r8, [r1, #27*4]
316         eor     r12, r12, r7, ror #19
317         mov     lr, r8, ror #17
318         eor     r12, r12, r7, lsr #10
319         eor     lr, lr, r8, ror #19
320         add     r9, r9, r12
321         eor     lr, lr, r8, lsr #10
322         str     r9, [r1, #28*4]
323         add     r10, r10, lr
324         
325         ldr     lr, [r1, #31*4]
326         mov     r12, r9, ror #17
327         str     r10, [r1, #29*4]
328         eor     r12, r12, r9, ror #19
329         str     lr, [sp, #25*4]
330         eor     r12, r12, r9, lsr #10
331         add     r11, r11, r12
332         add     r5, r5, lr
333         mov     r12, r10, ror #17
334         add     r4, r4, r11
335         
336         ldr     r11, [r1, #16*4]
337         eor     r12, r12, r10, ror #19
338         str     r4, [r1, #30*4]
339         eor     r12, r12, r10, lsr #10
340         add     r5, r5, r12
341         ldr     lr, [r1, #17*4]
342         
343 sha256d_ms_extend_loop2:
344         sha256_extend_doubleround_body 16, r1, r6, r7, r4, r5
345         sha256_extend_doubleround_body 18, r1, r8, r9, r6, r7
346         sha256_extend_doubleround_body 20, r1, r10, r4, r8, r9
347         sha256_extend_doubleround_body 22, r1, r5, r6, r10, r4
348         sha256_extend_doubleround_body 24, r1, r7, r8, r5, r6
349         sha256_extend_doubleround_body 26, r1, r9, r10, r7, r8
350         sha256_extend_doubleround_body 28, r1, r4, r5, r9, r10
351         sha256_extend_doubleround_body 30, r1, r6, r7, r4, r5
352         sha256_extend_doubleround_body 32, r1, r8, r9, r6, r7
353         sha256_extend_doubleround_body 34, r1, r10, r4, r8, r9
354         sha256_extend_doubleround_body 36, r1, r5, r6, r10, r4
355         sha256_extend_doubleround_body 38, r1, r7, r8, r5, r6
356         sha256_extend_doubleround_body 40, r1, r9, r10, r7, r8
357         sha256_extend_doubleround_body 42, r1, r4, r5, r9, r10
358         bne     sha256d_ms_extend_coda2
359         sha256_extend_doubleround_body 44, r1, r6, r7, r4, r5
360         sha256_extend_doubleround_foot 46, r1, r8, r9, r6, r7
361         
362         ldr     r4,  [r3, #0*4]
363         ldr     r9,  [r3, #1*4]
364         ldr     r10, [r3, #2*4]
365         ldr     r11, [r3, #3*4]
366         ldr     r8,  [r3, #4*4]
367         ldr     r5,  [r3, #5*4]
368         ldr     r6,  [r3, #6*4]
369         ldr     r7,  [r3, #7*4]
370         b       sha256d_ms_main_loop1
371         
372 sha256d_ms_main_loop2:
373         sha256_main_round  0, sha256d_ms_k, r1, r4, r5, r6, r7, r8, r9, r10, r11
374         sha256_main_round  1, sha256d_ms_k, r1, r7, r4, r5, r6, r11, r8, r9, r10
375         sha256_main_round  2, sha256d_ms_k, r1, r6, r7, r4, r5, r10, r11, r8, r9
376 sha256d_ms_main_loop1:
377         sha256_main_round  3, sha256d_ms_k, r1, r5, r6, r7, r4, r9, r10, r11, r8
378         sha256_main_quadround  4, sha256d_ms_k, r1
379         sha256_main_quadround  8, sha256d_ms_k, r1
380         sha256_main_quadround 12, sha256d_ms_k, r1
381         sha256_main_quadround 16, sha256d_ms_k, r1
382         sha256_main_quadround 20, sha256d_ms_k, r1
383         sha256_main_quadround 24, sha256d_ms_k, r1
384         sha256_main_quadround 28, sha256d_ms_k, r1
385         b       sha256d_ms_k_over
386 sha256d_ms_k:
387         sha256_k
388 sha256d_ms_k_over:
389         sha256_main_quadround 32, sha256d_ms_k, r1
390         sha256_main_quadround 36, sha256d_ms_k, r1
391         sha256_main_quadround 40, sha256d_ms_k, r1
392         sha256_main_quadround 44, sha256d_ms_k, r1
393         sha256_main_quadround 48, sha256d_ms_k, r1
394         sha256_main_quadround 52, sha256d_ms_k, r1
395         sha256_main_round 56, sha256d_ms_k, r1, r4, r5, r6, r7, r8, r9, r10, r11
396         bne     sha256d_ms_finish
397         sha256_main_round 57, sha256d_ms_k, r1, r7, r4, r5, r6, r11, r8, r9, r10
398         sha256_main_round 58, sha256d_ms_k, r1, r6, r7, r4, r5, r10, r11, r8, r9
399         sha256_main_round 59, sha256d_ms_k, r1, r5, r6, r7, r4, r9, r10, r11, r8
400         sha256_main_quadround 60, sha256d_ms_k, r1
401         
402         ldmia   r2!, {r3, r12, lr}
403         add     r4, r4, r3
404         add     r5, r5, r12
405         add     r6, r6, lr
406         stmia   sp, {r4-r6}
407         ldmia   r2, {r3, r4, r5, r6, r12}
408         add     lr, sp, #3*4
409         add     r7, r7, r3
410         add     r8, r8, r4
411         add     r9, r9, r5
412         add     r10, r10, r6
413         add     r11, r11, r12
414         add     r12, sp, #18*4
415         stmia   lr!, {r7-r11}
416         
417         ldmia   r12, {r4-r11}
418         str     r4,  [r1, #18*4]
419         str     r5,  [r1, #19*4]
420         str     r6,  [r1, #20*4]
421         str     r7,  [r1, #22*4]
422         str     r8,  [r1, #23*4]
423         str     r9,  [r1, #24*4]
424         str     r10, [r1, #30*4]
425         str     r11, [r1, #31*4]
426         
427         mov     r3,  #0x80000000
428         mov     r4,  #0
429         mov     r5,  #0
430         mov     r6,  #0
431         mov     r7,  #0
432         mov     r8,  #0
433         mov     r9,  #0
434         mov     r10, #0x00000100
435         stmia   lr, {r3-r10}
436         
437         ldr     lr, [sp, #1*4]
438         movs    r1, sp
439         ldr     r4, [sp, #0*4]
440         
441         ldr     r11, [sp, #2*4]
442         mov     r12, lr, ror #7
443         eor     r12, r12, lr, ror #18
444         add     r5, lr, #0x00a00000
445         eor     r12, r12, lr, lsr #3
446         mov     lr, r11, ror #7
447         add     r4, r4, r12
448         eor     lr, lr, r11, ror #18
449         str     r4, [sp, #16*4]
450         eor     lr, lr, r11, lsr #3
451         mov     r12, r4, ror #17
452         add     r5, r5, lr
453         ldr     lr, [sp, #3*4]
454         
455         str     r5, [sp, #17*4]
456         eor     r12, r12, r4, ror #19
457         mov     r6, lr, ror #7
458         eor     r12, r12, r4, lsr #10
459         eor     r6, r6, lr, ror #18
460         add     r11, r11, r12
461         eor     r6, r6, lr, lsr #3
462         mov     r12, r5, ror #17
463         add     r6, r6, r11
464         ldr     r11, [sp, #4*4]
465         
466         str     r6, [sp, #18*4]
467         eor     r12, r12, r5, ror #19
468         mov     r7, r11, ror #7
469         eor     r12, r12, r5, lsr #10
470         eor     r7, r7, r11, ror #18
471         add     lr, lr, r12
472         eor     r7, r7, r11, lsr #3
473         mov     r12, r6, ror #17
474         add     r7, r7, lr
475         ldr     lr, [sp, #5*4]
476         
477         str     r7, [sp, #19*4]
478         eor     r12, r12, r6, ror #19
479         mov     r8, lr, ror #7
480         eor     r12, r12, r6, lsr #10
481         eor     r8, r8, lr, ror #18
482         add     r11, r11, r12
483         eor     r8, r8, lr, lsr #3
484         mov     r12, r7, ror #17
485         add     r8, r8, r11
486         ldr     r11, [sp, #6*4]
487         
488         str     r8, [sp, #20*4]
489         eor     r12, r12, r7, ror #19
490         mov     r9, r11, ror #7
491         eor     r12, r12, r7, lsr #10
492         eor     r9, r9, r11, ror #18
493         add     lr, lr, r12
494         eor     r9, r9, r11, lsr #3
495         mov     r12, r8, ror #17
496         add     r9, r9, lr
497         ldr     lr, [sp, #7*4]
498         
499         str     r9, [sp, #21*4]
500         eor     r12, r12, r8, ror #19
501         mov     r10, lr, ror #7
502         eor     r12, r12, r8, lsr #10
503         eor     r10, r10, lr, ror #18
504         add     r11, r11, r12
505         eor     r10, r10, lr, lsr #3
506         mov     r12, r9, ror #17
507         add     r11, r11, #0x00000100
508         add     lr, lr, r4
509         add     r10, r10, r11
510         
511         eor     r12, r12, r9, ror #19
512         str     r10, [sp, #22*4]
513         add     lr, lr, #0x11000000
514         eor     r12, r12, r9, lsr #10
515         add     lr, lr, r12
516         mov     r12, r10, ror #17
517         add     r4, lr, #0x00002000
518         eor     r12, r12, r10, ror #19
519         str     r4, [sp, #23*4]
520         add     r5, r5, #0x80000000
521         eor     r12, r12, r10, lsr #10
522         add     r5, r5, r12
523
524         mov     r12, r4, ror #17
525         str     r5, [sp, #24*4]
526         eor     r12, r12, r4, ror #19
527         mov     r11, r5, ror #17
528         eor     r12, r12, r4, lsr #10
529         eor     r11, r11, r5, ror #19
530         add     r6, r6, r12
531         eor     r11, r11, r5, lsr #10
532         str     r6, [sp, #25*4]
533         add     r7, r7, r11
534         
535         mov     r12, r6, ror #17
536         str     r7, [sp, #26*4]
537         eor     r12, r12, r6, ror #19
538         mov     r11, r7, ror #17
539         eor     r12, r12, r6, lsr #10
540         eor     r11, r11, r7, ror #19
541         add     r8, r8, r12
542         eor     r11, r11, r7, lsr #10
543         str     r8, [sp, #27*4]
544         add     r9, r9, r11
545         
546         mov     lr, r8, ror #17
547         mov     r12, r9, ror #17
548         str     r9, [sp, #28*4]
549         add     r4, r4, #0x00400000
550         eor     lr, lr, r8, ror #19
551         eor     r12, r12, r9, ror #19
552         eor     lr, lr, r8, lsr #10
553         eor     r12, r12, r9, lsr #10
554         add     r4, r4, #0x00000022
555         add     r10, r10, lr
556         add     r4, r4, r12
557         ldr     r11, [sp, #16*4]
558         
559         add     r5, r5, #0x00000100
560         str     r4, [sp, #30*4]
561         mov     lr, r11, ror #7
562         str     r10, [sp, #29*4]
563         mov     r12, r10, ror #17
564         eor     lr, lr, r11, ror #18
565         eor     r12, r12, r10, ror #19
566         eor     lr, lr, r11, lsr #3
567         eor     r12, r12, r10, lsr #10
568         add     r5, r5, lr
569         ldr     lr, [r1, #17*4]
570         add     r5, r5, r12
571         
572         b       sha256d_ms_extend_loop2
573         
574 sha256d_ms_extend_coda2:
575         str     r5, [r1, #(44+15)*4]
576         mov     r12, r4, ror #17
577         add     r11, r11, r6
578         mov     r6, lr, ror #7
579         eor     r12, r12, r4, ror #19
580         eor     r6, r6, lr, ror #18
581         eor     r12, r12, r4, lsr #10
582         eor     r6, r6, lr, lsr #3
583         add     r12, r12, r11
584         add     r6, r6, r12
585         str     r6, [r1, #(44+16)*4]
586         
587         adr     r2, sha256d_ms_h
588         ldmia   r2, {r4-r11}
589         b       sha256d_ms_main_loop2
590
591 sha256d_ms_h:
592         .long 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a
593         .long 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
594
595 .macro sha256_main_round_red i, ka, rw, rd, re, rf, rg, rh
596         ldr     r12, [\rw, #(\i)*4]
597         and     r3, \rf, \re
598         bic     lr, \rg, \re
599         add     \rh, \rh, \rd
600         orr     lr, lr, r3
601         ldr     r3, \ka + (\i)*4
602         add     \rh, \rh, lr
603         eor     lr, \re, \re, ror #5
604         add     \rh, \rh, r12
605         eor     lr, lr, \re, ror #19
606         add     \rh, \rh, r3
607         add     \rh, \rh, lr, ror #6
608 .endm
609         
610 sha256d_ms_finish:
611         sha256_main_round_red 57, sha256d_ms_k, r1, r6, r11, r8, r9, r10
612         sha256_main_round_red 58, sha256d_ms_k, r1, r5, r10, r11, r8, r9
613         sha256_main_round_red 59, sha256d_ms_k, r1, r4, r9, r10, r11, r8
614         ldr     r5, [r2, #7*4]
615         sha256_main_round_red 60, sha256d_ms_k, r1, r7, r8, r9, r10, r11
616         
617         add     r11, r11, r5
618         str     r11, [r0, #7*4]
619         
620         add     sp, sp, #64*4
621 #ifdef __thumb__
622         ldmfd   sp!, {r4-r11, lr}
623         bx      lr
624 #else
625         ldmfd   sp!, {r4-r11, pc}
626 #endif
627
628
629 #ifdef __ARM_NEON__
630
631         .text
632         .code 32
633         .align 2
634         .globl sha256_init_4way
635         .globl _sha256_init_4way
636 #ifdef __ELF__
637         .type sha256_init_4way, %function
638 #endif
639 sha256_init_4way:
640 _sha256_init_4way:
641         adr     r12, sha256_4h
642         vldmia  r12, {q8-q15}
643         vstmia  r0, {q8-q15}
644         bx      lr
645         .align 4
646 sha256_4h:
647         .long 0x6a09e667, 0x6a09e667, 0x6a09e667, 0x6a09e667
648         .long 0xbb67ae85, 0xbb67ae85, 0xbb67ae85, 0xbb67ae85
649         .long 0x3c6ef372, 0x3c6ef372, 0x3c6ef372, 0x3c6ef372
650         .long 0xa54ff53a, 0xa54ff53a, 0xa54ff53a, 0xa54ff53a
651         .long 0x510e527f, 0x510e527f, 0x510e527f, 0x510e527f
652         .long 0x9b05688c, 0x9b05688c, 0x9b05688c, 0x9b05688c
653         .long 0x1f83d9ab, 0x1f83d9ab, 0x1f83d9ab, 0x1f83d9ab
654         .long 0x5be0cd19, 0x5be0cd19, 0x5be0cd19, 0x5be0cd19
655
656 .macro sha256_4k
657         .long 0x428a2f98, 0x428a2f98, 0x428a2f98, 0x428a2f98
658         .long 0x71374491, 0x71374491, 0x71374491, 0x71374491
659         .long 0xb5c0fbcf, 0xb5c0fbcf, 0xb5c0fbcf, 0xb5c0fbcf
660         .long 0xe9b5dba5, 0xe9b5dba5, 0xe9b5dba5, 0xe9b5dba5
661         .long 0x3956c25b, 0x3956c25b, 0x3956c25b, 0x3956c25b
662         .long 0x59f111f1, 0x59f111f1, 0x59f111f1, 0x59f111f1
663         .long 0x923f82a4, 0x923f82a4, 0x923f82a4, 0x923f82a4
664         .long 0xab1c5ed5, 0xab1c5ed5, 0xab1c5ed5, 0xab1c5ed5
665         .long 0xd807aa98, 0xd807aa98, 0xd807aa98, 0xd807aa98
666         .long 0x12835b01, 0x12835b01, 0x12835b01, 0x12835b01
667         .long 0x243185be, 0x243185be, 0x243185be, 0x243185be
668         .long 0x550c7dc3, 0x550c7dc3, 0x550c7dc3, 0x550c7dc3
669         .long 0x72be5d74, 0x72be5d74, 0x72be5d74, 0x72be5d74
670         .long 0x80deb1fe, 0x80deb1fe, 0x80deb1fe, 0x80deb1fe
671         .long 0x9bdc06a7, 0x9bdc06a7, 0x9bdc06a7, 0x9bdc06a7
672         .long 0xc19bf174, 0xc19bf174, 0xc19bf174, 0xc19bf174
673         .long 0xe49b69c1, 0xe49b69c1, 0xe49b69c1, 0xe49b69c1
674         .long 0xefbe4786, 0xefbe4786, 0xefbe4786, 0xefbe4786
675         .long 0x0fc19dc6, 0x0fc19dc6, 0x0fc19dc6, 0x0fc19dc6
676         .long 0x240ca1cc, 0x240ca1cc, 0x240ca1cc, 0x240ca1cc
677         .long 0x2de92c6f, 0x2de92c6f, 0x2de92c6f, 0x2de92c6f
678         .long 0x4a7484aa, 0x4a7484aa, 0x4a7484aa, 0x4a7484aa
679         .long 0x5cb0a9dc, 0x5cb0a9dc, 0x5cb0a9dc, 0x5cb0a9dc
680         .long 0x76f988da, 0x76f988da, 0x76f988da, 0x76f988da
681         .long 0x983e5152, 0x983e5152, 0x983e5152, 0x983e5152
682         .long 0xa831c66d, 0xa831c66d, 0xa831c66d, 0xa831c66d
683         .long 0xb00327c8, 0xb00327c8, 0xb00327c8, 0xb00327c8
684         .long 0xbf597fc7, 0xbf597fc7, 0xbf597fc7, 0xbf597fc7
685         .long 0xc6e00bf3, 0xc6e00bf3, 0xc6e00bf3, 0xc6e00bf3
686         .long 0xd5a79147, 0xd5a79147, 0xd5a79147, 0xd5a79147
687         .long 0x06ca6351, 0x06ca6351, 0x06ca6351, 0x06ca6351
688         .long 0x14292967, 0x14292967, 0x14292967, 0x14292967
689         .long 0x27b70a85, 0x27b70a85, 0x27b70a85, 0x27b70a85
690         .long 0x2e1b2138, 0x2e1b2138, 0x2e1b2138, 0x2e1b2138
691         .long 0x4d2c6dfc, 0x4d2c6dfc, 0x4d2c6dfc, 0x4d2c6dfc
692         .long 0x53380d13, 0x53380d13, 0x53380d13, 0x53380d13
693         .long 0x650a7354, 0x650a7354, 0x650a7354, 0x650a7354
694         .long 0x766a0abb, 0x766a0abb, 0x766a0abb, 0x766a0abb
695         .long 0x81c2c92e, 0x81c2c92e, 0x81c2c92e, 0x81c2c92e
696         .long 0x92722c85, 0x92722c85, 0x92722c85, 0x92722c85
697         .long 0xa2bfe8a1, 0xa2bfe8a1, 0xa2bfe8a1, 0xa2bfe8a1
698         .long 0xa81a664b, 0xa81a664b, 0xa81a664b, 0xa81a664b
699         .long 0xc24b8b70, 0xc24b8b70, 0xc24b8b70, 0xc24b8b70
700         .long 0xc76c51a3, 0xc76c51a3, 0xc76c51a3, 0xc76c51a3
701         .long 0xd192e819, 0xd192e819, 0xd192e819, 0xd192e819
702         .long 0xd6990624, 0xd6990624, 0xd6990624, 0xd6990624
703         .long 0xf40e3585, 0xf40e3585, 0xf40e3585, 0xf40e3585
704         .long 0x106aa070, 0x106aa070, 0x106aa070, 0x106aa070
705         .long 0x19a4c116, 0x19a4c116, 0x19a4c116, 0x19a4c116
706         .long 0x1e376c08, 0x1e376c08, 0x1e376c08, 0x1e376c08
707         .long 0x2748774c, 0x2748774c, 0x2748774c, 0x2748774c
708         .long 0x34b0bcb5, 0x34b0bcb5, 0x34b0bcb5, 0x34b0bcb5
709         .long 0x391c0cb3, 0x391c0cb3, 0x391c0cb3, 0x391c0cb3
710         .long 0x4ed8aa4a, 0x4ed8aa4a, 0x4ed8aa4a, 0x4ed8aa4a
711         .long 0x5b9cca4f, 0x5b9cca4f, 0x5b9cca4f, 0x5b9cca4f
712         .long 0x682e6ff3, 0x682e6ff3, 0x682e6ff3, 0x682e6ff3
713         .long 0x748f82ee, 0x748f82ee, 0x748f82ee, 0x748f82ee
714         .long 0x78a5636f, 0x78a5636f, 0x78a5636f, 0x78a5636f
715         .long 0x84c87814, 0x84c87814, 0x84c87814, 0x84c87814
716         .long 0x8cc70208, 0x8cc70208, 0x8cc70208, 0x8cc70208
717         .long 0x90befffa, 0x90befffa, 0x90befffa, 0x90befffa
718         .long 0xa4506ceb, 0xa4506ceb, 0xa4506ceb, 0xa4506ceb
719         .long 0xbef9a3f7, 0xbef9a3f7, 0xbef9a3f7, 0xbef9a3f7
720         .long 0xc67178f2, 0xc67178f2, 0xc67178f2, 0xc67178f2
721 .endm
722
723 .macro sha256_4way_extend_doubleround_core i, rr, rw, ra, rb, ry, rz
724         vadd.u32        q5, q5, \ra
725         veor.u32        q4, q4, q0
726         vshr.u32        q0, \ry, #19
727         vshl.u32        q1, \ry, #32-19
728         veor.u32        q4, q4, q0
729         vshr.u32        \ra, q6, #7
730         vshl.u32        q0, q6, #32-7
731         veor.u32        q4, q4, q1
732         veor.u32        \ra, \ra, q0
733         vshr.u32        q1, \ry, #10
734         vshr.u32        q0, q6, #18
735         veor.u32        q4, q4, q1
736         veor.u32        \ra, \ra, q0
737         vshl.u32        q1, q6, #32-18
738         vshr.u32        q0, q6, #3
739         veor.u32        \ra, \ra, q1
740         vadd.u32        q4, q4, q5
741         veor.u32        \ra, \ra, q0
742         vld1.u32        {q5}, [\rr]!
743         vadd.u32        \ra, \ra, q4
744
745         vshr.u32        q4, \rz, #17
746         vshl.u32        q0, \rz, #32-17
747         vadd.u32        q6, q6, \rb
748         vst1.u32        {\ra}, [\rw]!
749         veor.u32        q4, q4, q0
750         vshr.u32        q0, \rz, #19
751         vshl.u32        q1, \rz, #32-19
752         veor.u32        q4, q4, q0
753         vshr.u32        \rb, q5, #7
754         veor.u32        q4, q4, q1
755         vshl.u32        q0, q5, #32-7
756         vshr.u32        q1, \rz, #10
757         veor.u32        \rb, \rb, q0
758         vshr.u32        q0, q5, #18
759         veor.u32        q4, q4, q1
760         veor.u32        \rb, \rb, q0
761         vshl.u32        q1, q5, #32-18
762         vshr.u32        q0, q5, #3
763         veor.u32        \rb, \rb, q1
764         vadd.u32        q1, q6, q4
765         veor.u32        \rb, \rb, q0
766 .endm
767
768 .macro sha256_4way_extend_doubleround_head i, rr, rw, ra, rb, ry, rz
769         vld1.u32        {q6}, [\rr]!
770         vshr.u32        q4, \ry, #17
771         vshl.u32        q0, \ry, #32-17
772         sha256_4way_extend_doubleround_core \i, \rr, \rw, \ra, \rb, \ry, \rz
773         vld1.u32        {q6}, [\rr]!
774         vadd.u32        \rb, \rb, q1
775 .endm
776
777 .macro sha256_4way_extend_doubleround_body i, rr, rw, ra, rb, ry, rz
778         vshr.u32        q4, \ry, #17
779         vshl.u32        q0, \ry, #32-17
780         vst1.u32        {\rz}, [\rw]!
781         sha256_4way_extend_doubleround_core \i, \rr, \rw, \ra, \rb, \ry, \rz
782         vld1.u32        {q6}, [\rr]!
783         vadd.u32        \rb, \rb, q1
784 .endm
785
786 .macro sha256_4way_extend_doubleround_foot i, rr, rw, ra, rb, ry, rz
787         vshr.u32        q4, \ry, #17
788         vshl.u32        q0, \ry, #32-17
789         vst1.u32        {\rz}, [\rw]!
790         sha256_4way_extend_doubleround_core \i, \rr, \rw, \ra, \rb, \ry, \rz
791         vadd.u32        \rb, \rb, q1
792         vst1.u32        {\rb}, [\rw]!
793 .endm
794
795 .macro sha256_4way_main_round i, rk, rw, ra, rb, rc, rd, re, rf, rg, rh
796         vld1.u32        {q8}, [\rw]!
797         vand.u32        q9, \rf, \re
798         vbic.u32        q10, \rg, \re
799         vshr.u32        q11, \re, #5
800         vorr.u32        q10, q10, q9
801         vld1.u32        {q9}, [\rk]!
802         vadd.u32        \rh, \rh, q10
803         vshl.u32        q12, \re, #32-5
804         veor.u32        q10, \re, q11
805         vshr.u32        q11, \re, #19
806         veor.u32        q10, q10, q12
807         vshl.u32        q12, \re, #32-19
808         veor.u32        q10, q10, q11
809         vadd.u32        \rh, \rh, q8
810         veor.u32        q10, q10, q12
811         vadd.u32        \rh, \rh, q9
812         veor.u32        q9, \ra, \rb
813         vshr.u32        q11, q10, #6
814         vshl.u32        q13, q10, #32-6
815         vadd.u32        \rh, \rh, q11
816
817         vshr.u32        q11, \ra, #11
818         vshl.u32        q12, \ra, #32-11
819         veor.u32        q8, \ra, q11
820         vand.u32        q10, \ra, \rb
821         veor.u32        q8, q8, q12
822         vshr.u32        q11, \ra, #20
823         vshl.u32        q12, \ra, #32-20
824         veor.u32        q8, q8, q11
825         vand.u32        q9, q9, \rc
826         veor.u32        q8, q8, q12
827         vadd.u32        \rh, \rh, q13
828         veor.u32        q10, q10, q9
829         vshr.u32        q11, q8, #2
830         vshl.u32        q12, q8, #32-2
831         vadd.u32        q9, \rh, q10
832         vadd.u32        q12, q12, q11
833         vadd.u32        \rh, \rh, \rd
834         vadd.u32        \rd, q9, q12
835 .endm
836
837 .macro sha256_4way_main_quadround i, rk, rw
838         sha256_4way_main_round \i+0, \rk, \rw, q0, q1, q2, q3, q4, q5, q6, q7
839         sha256_4way_main_round \i+1, \rk, \rw, q3, q0, q1, q2, q7, q4, q5, q6
840         sha256_4way_main_round \i+2, \rk, \rw, q2, q3, q0, q1, q6, q7, q4, q5
841         sha256_4way_main_round \i+3, \rk, \rw, q1, q2, q3, q0, q5, q6, q7, q4
842 .endm
843
844
845         .text
846         .code 32
847         .align 2
848         .globl sha256_transform_4way
849         .globl _sha256_transform_4way
850 #ifdef __ELF__
851         .type sha256_transform_4way, %function
852 #endif
853 sha256_transform_4way:
854 _sha256_transform_4way:
855         stmfd   sp!, {r4, lr}
856         vpush   {q4-q7}
857         mov     r12, sp
858         sub     sp, sp, #64*16
859         bic     sp, sp, #63
860         cmp     r2, #0
861         bne     sha256_transform_4way_swap
862         
863         vldmia  r1!, {q0-q7}
864         vstmia  sp, {q0-q7}
865         add     r3, sp, #8*16
866         vldmia  r1, {q8-q15}
867         vstmia  r3, {q8-q15}
868         b       sha256_transform_4way_extend
869
870 sha256_transform_4way_swap:
871         vldmia  r1!, {q0-q7}
872         vrev32.8        q0, q0
873         vrev32.8        q1, q1
874         vrev32.8        q2, q2
875         vrev32.8        q3, q3
876         vldmia  r1, {q8-q15}
877         vrev32.8        q4, q4
878         vrev32.8        q5, q5
879         vrev32.8        q6, q6
880         vrev32.8        q7, q7
881         vstmia  sp, {q0-q7}
882         vrev32.8        q8, q8
883         vrev32.8        q9, q9
884         vrev32.8        q10, q10
885         vrev32.8        q11, q11
886         vrev32.8        q12, q12
887         vrev32.8        q13, q13
888         vrev32.8        q14, q14
889         vrev32.8        q15, q15
890         add     r3, sp, #8*16
891         vstmia  r3, {q8-q15}
892         
893 sha256_transform_4way_extend:
894         add     r1, sp, #1*16
895         add     r2, sp, #16*16
896         vmov.u32        q5, q0
897         sha256_4way_extend_doubleround_head  0, r1, r2,  q9, q10, q14, q15
898         sha256_4way_extend_doubleround_body  2, r1, r2, q11, q12,  q9, q10
899         sha256_4way_extend_doubleround_body  4, r1, r2, q13, q14, q11, q12
900         sha256_4way_extend_doubleround_body  6, r1, r2, q15,  q9, q13, q14
901         sha256_4way_extend_doubleround_body  8, r1, r2, q10, q11, q15,  q9
902         sha256_4way_extend_doubleround_body 10, r1, r2, q12, q13, q10, q11
903         sha256_4way_extend_doubleround_body 12, r1, r2, q14, q15, q12, q13
904         sha256_4way_extend_doubleround_body 14, r1, r2,  q9, q10, q14, q15
905         sha256_4way_extend_doubleround_body 16, r1, r2, q11, q12,  q9, q10
906         sha256_4way_extend_doubleround_body 18, r1, r2, q13, q14, q11, q12
907         sha256_4way_extend_doubleround_body 20, r1, r2, q15,  q9, q13, q14
908         sha256_4way_extend_doubleround_body 22, r1, r2, q10, q11, q15,  q9
909         sha256_4way_extend_doubleround_body 24, r1, r2, q12, q13, q10, q11
910         sha256_4way_extend_doubleround_body 26, r1, r2, q14, q15, q12, q13
911         sha256_4way_extend_doubleround_body 28, r1, r2,  q9, q10, q14, q15
912         sha256_4way_extend_doubleround_body 30, r1, r2, q11, q12,  q9, q10
913         sha256_4way_extend_doubleround_body 32, r1, r2, q13, q14, q11, q12
914         sha256_4way_extend_doubleround_body 34, r1, r2, q15,  q9, q13, q14
915         sha256_4way_extend_doubleround_body 36, r1, r2, q10, q11, q15,  q9
916         sha256_4way_extend_doubleround_body 38, r1, r2, q12, q13, q10, q11
917         sha256_4way_extend_doubleround_body 40, r1, r2, q14, q15, q12, q13
918         sha256_4way_extend_doubleround_body 42, r1, r2,  q9, q10, q14, q15
919         sha256_4way_extend_doubleround_body 44, r1, r2, q11, q12,  q9, q10
920         sha256_4way_extend_doubleround_foot 46, r1, r2, q13, q14, q11, q12
921         
922         vldmia  r0, {q0-q7}
923         adr     r4, sha256_transform_4way_4k
924         b       sha256_transform_4way_4k_over
925         .align 4
926 sha256_transform_4way_4k:
927         sha256_4k
928 sha256_transform_4way_4k_over:
929         sha256_4way_main_quadround  0, r4, sp
930         sha256_4way_main_quadround  4, r4, sp
931         sha256_4way_main_quadround  8, r4, sp
932         sha256_4way_main_quadround 12, r4, sp
933         sha256_4way_main_quadround 16, r4, sp
934         sha256_4way_main_quadround 20, r4, sp
935         sha256_4way_main_quadround 24, r4, sp
936         sha256_4way_main_quadround 28, r4, sp
937         sha256_4way_main_quadround 32, r4, sp
938         sha256_4way_main_quadround 36, r4, sp
939         sha256_4way_main_quadround 40, r4, sp
940         sha256_4way_main_quadround 44, r4, sp
941         sha256_4way_main_quadround 48, r4, sp
942         sha256_4way_main_quadround 52, r4, sp
943         sha256_4way_main_quadround 56, r4, sp
944         sha256_4way_main_quadround 60, r4, sp
945         
946         vldmia  r0, {q8-q15}
947         vadd.u32        q0, q0, q8
948         vadd.u32        q1, q1, q9
949         vadd.u32        q2, q2, q10
950         vadd.u32        q3, q3, q11
951         vadd.u32        q4, q4, q12
952         vadd.u32        q5, q5, q13
953         vadd.u32        q6, q6, q14
954         vadd.u32        q7, q7, q15
955         vstmia  r0, {q0-q7}
956         
957         mov     sp, r12
958         vpop    {q4-q7}
959         ldmfd   sp!, {r4, pc}
960         
961
962         .text
963         .code 32
964         .align 2
965         .globl sha256d_ms_4way
966         .globl _sha256d_ms_4way
967 #ifdef __ELF__
968         .type sha256d_ms_4way, %function
969 #endif
970 sha256d_ms_4way:
971 _sha256d_ms_4way:
972         stmfd   sp!, {r4, lr}
973         vpush   {q4-q7}
974         mov     r12, sp
975         sub     sp, sp, #64*16
976         bic     sp, sp, #63
977         
978         add     r4, r1, #3*16
979         vld1.u32        {q6}, [r4]!
980         add     r1, r1, #18*16
981         vldmia  r1, {q11-q13}
982         cmp     r0, r0
983         
984         vshr.u32        q10, q6, #7
985         vshl.u32        q0, q6, #32-7
986         vshr.u32        q1, q6, #18
987         veor.u32        q10, q10, q0
988         vshl.u32        q0, q6, #32-18
989         veor.u32        q10, q10, q1
990         vshr.u32        q1, q6, #3
991         veor.u32        q10, q10, q0
992         vstmia  sp!, {q11-q13}
993         veor.u32        q4, q10, q1
994         vadd.u32        q12, q12, q6
995         vadd.u32        q11, q11, q4
996         
997         vshr.u32        q14, q12, #17
998         vshr.u32        q4, q11, #17
999         vshl.u32        q0, q11, #32-17
1000         vst1.u32        {q11}, [r1]!
1001         veor.u32        q4, q4, q0
1002         vshr.u32        q0, q11, #19
1003         vshl.u32        q1, q11, #32-19
1004         veor.u32        q4, q4, q0
1005         vst1.u32        {q12}, [r1]!
1006         veor.u32        q4, q4, q1
1007         vshr.u32        q1, q11, #10
1008         vshl.u32        q0, q12, #32-17
1009         veor.u32        q4, q4, q1
1010         veor.u32        q14, q14, q0
1011         vadd.u32        q13, q13, q4
1012         vshr.u32        q0, q12, #19
1013         vshl.u32        q1, q12, #32-19
1014         veor.u32        q14, q14, q0
1015         vst1.u32        {q13}, [r1]!
1016         veor.u32        q14, q14, q1
1017         vshr.u32        q1, q12, #10
1018         
1019         vshr.u32        q4, q13, #17
1020         vshl.u32        q0, q13, #32-17
1021         veor.u32        q14, q14, q1
1022         veor.u32        q4, q4, q0
1023         vshr.u32        q0, q13, #19
1024         vshl.u32        q1, q13, #32-19
1025         veor.u32        q4, q4, q0
1026         vst1.u32        {q14}, [r1]!
1027         veor.u32        q4, q4, q1
1028         vshr.u32        q1, q13, #10
1029         vld1.u32        {q15}, [r1]
1030         veor.u32        q4, q4, q1
1031         vst1.u32        {q15}, [sp]!
1032         vadd.u32        q15, q15, q4
1033         vshr.u32        q4, q14, #17
1034         vshl.u32        q0, q14, #32-17
1035         vshl.u32        q1, q14, #32-19
1036         veor.u32        q4, q4, q0
1037         vshr.u32        q0, q14, #19
1038         vst1.u32        {q15}, [r1]!
1039         veor.u32        q4, q4, q0
1040         vld1.u32        {q9}, [r1]
1041         veor.u32        q4, q4, q1
1042         vshr.u32        q1, q14, #10
1043         vst1.u32        {q9}, [sp]!
1044         veor.u32        q5, q4, q1
1045         
1046         vshr.u32        q4, q15, #17
1047         vadd.u32        q9, q9, q5
1048         vshl.u32        q0, q15, #32-17
1049         vshl.u32        q1, q15, #32-19
1050         veor.u32        q4, q4, q0
1051         vshr.u32        q0, q15, #19
1052         vst1.u32        {q9}, [r1]!
1053         veor.u32        q4, q4, q0
1054         vld1.u32        {q10}, [r1]
1055         veor.u32        q4, q4, q1
1056         vshr.u32        q1, q15, #10
1057         vst1.u32        {q10}, [sp]!
1058         veor.u32        q4, q4, q1
1059         vshl.u32        q0, q9, #32-17
1060         vadd.u32        q10, q10, q4
1061         vshr.u32        q4, q9, #17
1062         vshl.u32        q1, q9, #32-19
1063         veor.u32        q4, q4, q0
1064         vshr.u32        q0, q9, #19
1065         veor.u32        q4, q4, q1
1066         vshr.u32        q1, q9, #10
1067         veor.u32        q4, q4, q0
1068         vst1.u32        {q10}, [r1]!
1069         veor.u32        q5, q4, q1
1070         
1071         vshr.u32        q4, q10, #17
1072         vshl.u32        q0, q10, #32-17
1073         vadd.u32        q11, q11, q5
1074         veor.u32        q4, q4, q0
1075         vshr.u32        q0, q10, #19
1076         vshl.u32        q1, q10, #32-19
1077         veor.u32        q4, q4, q0
1078         vst1.u32        {q11}, [r1]!
1079         veor.u32        q4, q4, q1
1080         vshr.u32        q1, q10, #10
1081         vshl.u32        q0, q11, #32-17
1082         veor.u32        q2, q4, q1
1083         vshr.u32        q4, q11, #17
1084         vadd.u32        q12, q12, q2
1085         vshl.u32        q1, q11, #32-19
1086         veor.u32        q4, q4, q0
1087         vshr.u32        q0, q11, #19
1088         veor.u32        q4, q4, q1
1089         vshr.u32        q1, q11, #10
1090         veor.u32        q4, q4, q0
1091         vst1.u32        {q12}, [r1]!
1092         veor.u32        q5, q4, q1
1093         
1094         vshr.u32        q4, q12, #17
1095         vshl.u32        q0, q12, #32-17
1096         vadd.u32        q13, q13, q5
1097         veor.u32        q4, q4, q0
1098         vshr.u32        q0, q12, #19
1099         vshl.u32        q1, q12, #32-19
1100         veor.u32        q4, q4, q0
1101         vst1.u32        {q13}, [r1]!
1102         veor.u32        q4, q4, q1
1103         vshr.u32        q1, q12, #10
1104         vshl.u32        q0, q13, #32-17
1105         veor.u32        q2, q4, q1
1106         vshr.u32        q4, q13, #17
1107         vadd.u32        q14, q14, q2
1108         vshl.u32        q1, q13, #32-19
1109         veor.u32        q4, q4, q0
1110         vshr.u32        q0, q13, #19
1111         veor.u32        q4, q4, q1
1112         vshr.u32        q1, q13, #10
1113         veor.u32        q4, q4, q0
1114         vst1.u32        {q14}, [r1]!
1115         veor.u32        q5, q4, q1
1116         add     r4, r4, #12*16
1117         
1118         vshr.u32        q4, q14, #17
1119         vshl.u32        q0, q14, #32-17
1120         vadd.u32        q15, q15, q5
1121         veor.u32        q4, q4, q0
1122         vshr.u32        q0, q14, #19
1123         vshl.u32        q1, q14, #32-19
1124         veor.u32        q4, q4, q0
1125         vst1.u32        {q15}, [r1]!
1126         veor.u32        q4, q4, q1
1127         vshr.u32        q1, q14, #10
1128         vld1.u32        {q2}, [r1]
1129         veor.u32        q4, q4, q1
1130         vshl.u32        q0, q15, #32-17
1131         vadd.u32        q9, q9, q4
1132         vst1.u32        {q2}, [sp]!
1133         vadd.u32        q9, q9, q2
1134         vshr.u32        q4, q15, #17
1135         vshr.u32        q2, q15, #19
1136         veor.u32        q4, q4, q0
1137         vst1.u32        {q9}, [r1]!
1138         vshl.u32        q1, q15, #32-19
1139         veor.u32        q4, q4, q2
1140         vshr.u32        q0, q15, #10
1141         veor.u32        q4, q4, q1
1142         vld1.u32        {q5-q6}, [r4]!
1143         veor.u32        q4, q4, q0
1144         vld1.u32        {q2}, [r1]
1145         vadd.u32        q10, q10, q4
1146         vst1.u32        {q2}, [sp]!
1147         vadd.u32        q10, q10, q2
1148         
1149         sub     sp, sp, #8*16
1150         
1151 sha256d_ms_4way_extend_loop2:
1152         sha256_4way_extend_doubleround_body 16, r4, r1, q11, q12,  q9, q10
1153         sha256_4way_extend_doubleround_body 18, r4, r1, q13, q14, q11, q12
1154         sha256_4way_extend_doubleround_body 20, r4, r1, q15,  q9, q13, q14
1155         sha256_4way_extend_doubleround_body 22, r4, r1, q10, q11, q15,  q9
1156         sha256_4way_extend_doubleround_body 24, r4, r1, q12, q13, q10, q11
1157         sha256_4way_extend_doubleround_body 26, r4, r1, q14, q15, q12, q13
1158         sha256_4way_extend_doubleround_body 28, r4, r1,  q9, q10, q14, q15
1159         sha256_4way_extend_doubleround_body 30, r4, r1, q11, q12,  q9, q10
1160         sha256_4way_extend_doubleround_body 32, r4, r1, q13, q14, q11, q12
1161         sha256_4way_extend_doubleround_body 34, r4, r1, q15,  q9, q13, q14
1162         sha256_4way_extend_doubleround_body 36, r4, r1, q10, q11, q15,  q9
1163         sha256_4way_extend_doubleround_body 38, r4, r1, q12, q13, q10, q11
1164         sha256_4way_extend_doubleround_body 40, r4, r1, q14, q15, q12, q13
1165         sha256_4way_extend_doubleround_body 42, r4, r1,  q9, q10, q14, q15
1166         sha256_4way_extend_doubleround_body 44, r4, r1, q11, q12,  q9, q10
1167         sha256_4way_extend_doubleround_foot 46, r4, r1, q13, q14, q11, q12
1168         bne     sha256d_ms_4way_extend_coda2
1169         
1170         vldmia  r3!, {q4-q7}
1171         vldmia  r3, {q0-q3}
1172         vswp    q0, q4
1173         adr     r3, sha256d_ms_4way_4k+3*16
1174         sub r1, r1, #(64-3)*16
1175         b       sha256d_ms_4way_main_loop1
1176         
1177         .align 4
1178 sha256d_ms_4way_4k:
1179         sha256_4k
1180         
1181 sha256d_ms_4way_main_loop2:
1182         sha256_4way_main_round  0, r3, r1, q0, q1, q2, q3, q4, q5, q6, q7
1183         sha256_4way_main_round  1, r3, r1, q3, q0, q1, q2, q7, q4, q5, q6
1184         sha256_4way_main_round  2, r3, r1, q2, q3, q0, q1, q6, q7, q4, q5
1185 sha256d_ms_4way_main_loop1:
1186         sha256_4way_main_round  3, r3, r1, q1, q2, q3, q0, q5, q6, q7, q4
1187         sha256_4way_main_quadround  4, r3, r1
1188         sha256_4way_main_quadround  8, r3, r1
1189         sha256_4way_main_quadround 12, r3, r1
1190         sha256_4way_main_quadround 16, r3, r1
1191         sha256_4way_main_quadround 20, r3, r1
1192         sha256_4way_main_quadround 24, r3, r1
1193         sha256_4way_main_quadround 28, r3, r1
1194         sha256_4way_main_quadround 32, r3, r1
1195         sha256_4way_main_quadround 36, r3, r1
1196         sha256_4way_main_quadround 40, r3, r1
1197         sha256_4way_main_quadround 44, r3, r1
1198         sha256_4way_main_quadround 48, r3, r1
1199         sha256_4way_main_quadround 52, r3, r1
1200         sha256_4way_main_round 56, r3, r1, q0, q1, q2, q3, q4, q5, q6, q7
1201         bne     sha256d_ms_4way_finish
1202         sha256_4way_main_round 57, r3, r1, q3, q0, q1, q2, q7, q4, q5, q6
1203         sha256_4way_main_round 58, r3, r1, q2, q3, q0, q1, q6, q7, q4, q5
1204         sha256_4way_main_round 59, r3, r1, q1, q2, q3, q0, q5, q6, q7, q4
1205         sha256_4way_main_quadround 60, r3, r1
1206         
1207         vldmia  r2, {q8-q15}
1208         vadd.u32        q0, q0, q8
1209         vadd.u32        q1, q1, q9
1210         vadd.u32        q2, q2, q10
1211         vadd.u32        q3, q3, q11
1212         vadd.u32        q4, q4, q12
1213         vadd.u32        q5, q5, q13
1214         vadd.u32        q6, q6, q14
1215         vadd.u32        q7, q7, q15
1216         
1217         vldmia  sp, {q8-q15}
1218         sub     r1, r1, #(64-18)*16
1219         vstmia  r1, {q8-q10}
1220         add     r1, r1, #4*16
1221         vstmia  r1, {q11-q13}
1222         add     r1, r1, #8*16
1223         vstmia  r1, {q14-q15}
1224         
1225         vstmia  sp, {q0-q7}
1226         vmov.u32        q8,  #0x80000000
1227         vmov.u32        q9,  #0
1228         vmov.u32        q10, #0
1229         vmov.u32        q11, #0
1230         vmov.u32        q12, #0
1231         vmov.u32        q13, #0
1232         vmov.u32        q14, #0
1233         vmov.u32        q15, #0x00000100
1234         add     r1, sp, #8*16
1235         vstmia  r1!, {q8-q15}
1236         adds    r4, sp, #2*16
1237         
1238         vshr.u32        q9, q1, #7
1239         vshl.u32        q2, q1, #32-7
1240         vshr.u32        q4, q1, #18
1241         veor.u32        q9, q9, q2
1242         vshl.u32        q3, q1, #32-18
1243         veor.u32        q9, q9, q4
1244         vshr.u32        q2, q1, #3
1245         veor.u32        q9, q9, q3
1246         vld1.u32        {q5}, [r4]!
1247         veor.u32        q9, q9, q2
1248         vmov.u32        q7, #0x00a00000
1249         vadd.u32        q9, q9, q0
1250         vshr.u32        q10, q5, #7
1251         vshl.u32        q0, q5, #32-7
1252         vshl.u32        q3, q5, #32-18
1253         veor.u32        q10, q10, q0
1254         vshr.u32        q0, q5, #18
1255         veor.u32        q10, q10, q3
1256         vst1.u32        {q9}, [r1]!
1257         vadd.u32        q3, q1, q7
1258         veor.u32        q10, q10, q0
1259         vshr.u32        q0, q5, #3
1260         vld1.u32        {q6}, [r4]!
1261         veor.u32        q10, q10, q0
1262         
1263         vshr.u32        q4, q9, #17
1264         vshl.u32        q0, q9, #32-17
1265         vadd.u32        q10, q10, q3
1266         veor.u32        q4, q4, q0
1267         vshr.u32        q0, q9, #19
1268         vshl.u32        q1, q9, #32-19
1269         veor.u32        q4, q4, q0
1270         vshr.u32        q11, q6, #7
1271         vshl.u32        q0, q6, #32-7
1272         veor.u32        q4, q4, q1
1273         veor.u32        q11, q11, q0
1274         vshr.u32        q1, q9, #10
1275         vshr.u32        q0, q6, #18
1276         veor.u32        q4, q4, q1
1277         veor.u32        q11, q11, q0
1278         vshl.u32        q1, q6, #32-18
1279         vshr.u32        q0, q6, #3
1280         veor.u32        q11, q11, q1
1281         vadd.u32        q4, q4, q5
1282         veor.u32        q11, q11, q0
1283         vld1.u32        {q5}, [r4]!
1284         vadd.u32        q11, q11, q4
1285         vshr.u32        q4, q10, #17
1286         vshl.u32        q0, q10, #32-17
1287         vst1.u32        {q10}, [r1]!
1288         veor.u32        q4, q4, q0
1289         vshr.u32        q0, q10, #19
1290         vshl.u32        q1, q10, #32-19
1291         veor.u32        q4, q4, q0
1292         vshr.u32        q12, q5, #7
1293         veor.u32        q4, q4, q1
1294         vshl.u32        q0, q5, #32-7
1295         vshr.u32        q1, q10, #10
1296         veor.u32        q12, q12, q0
1297         vshr.u32        q0, q5, #18
1298         veor.u32        q4, q4, q1
1299         veor.u32        q12, q12, q0
1300         vshl.u32        q1, q5, #32-18
1301         vst1.u32        {q11}, [r1]!
1302         veor.u32        q12, q12, q1
1303         vshr.u32        q0, q5, #3
1304         vadd.u32        q1, q6, q4
1305         veor.u32        q12, q12, q0
1306         
1307         vshr.u32        q4, q11, #17
1308         vshl.u32        q0, q11, #32-17
1309         vadd.u32        q12, q12, q1
1310         vld1.u32        {q6}, [r4]!
1311         veor.u32        q4, q4, q0
1312         vshr.u32        q0, q11, #19
1313         vshl.u32        q1, q11, #32-19
1314         veor.u32        q4, q4, q0
1315         vshr.u32        q13, q6, #7
1316         vshl.u32        q0, q6, #32-7
1317         veor.u32        q4, q4, q1
1318         veor.u32        q13, q13, q0
1319         vshr.u32        q1, q11, #10
1320         vshr.u32        q0, q6, #18
1321         veor.u32        q4, q4, q1
1322         veor.u32        q13, q13, q0
1323         vshl.u32        q1, q6, #32-18
1324         vshr.u32        q0, q6, #3
1325         veor.u32        q13, q13, q1
1326         vadd.u32        q4, q4, q5
1327         veor.u32        q13, q13, q0
1328         vld1.u32        {q5}, [r4]!
1329         vadd.u32        q13, q13, q4
1330         vshr.u32        q4, q12, #17
1331         vshl.u32        q0, q12, #32-17
1332         vst1.u32        {q12}, [r1]!
1333         veor.u32        q4, q4, q0
1334         vshr.u32        q0, q12, #19
1335         vshl.u32        q1, q12, #32-19
1336         veor.u32        q4, q4, q0
1337         vshr.u32        q14, q5, #7
1338         veor.u32        q4, q4, q1
1339         vshl.u32        q0, q5, #32-7
1340         vshr.u32        q1, q12, #10
1341         veor.u32        q14, q14, q0
1342         vshr.u32        q0, q5, #18
1343         veor.u32        q4, q4, q1
1344         veor.u32        q14, q14, q0
1345         vshl.u32        q1, q5, #32-18
1346         vst1.u32        {q13}, [r1]!
1347         veor.u32        q14, q14, q1
1348         vshr.u32        q0, q5, #3
1349         vadd.u32        q1, q6, q4
1350         veor.u32        q14, q14, q0
1351         
1352         vshr.u32        q4, q13, #17
1353         vshl.u32        q0, q13, #32-17
1354         vadd.u32        q14, q14, q1
1355         vld1.u32        {q6}, [r4]!
1356         vadd.u32        q5, q5, q15
1357         veor.u32        q4, q4, q0
1358         vshr.u32        q0, q13, #19
1359         vshl.u32        q1, q13, #32-19
1360         veor.u32        q4, q4, q0
1361         vshr.u32        q15, q6, #7
1362         vshl.u32        q0, q6, #32-7
1363         veor.u32        q4, q4, q1
1364         veor.u32        q15, q15, q0
1365         vshr.u32        q1, q13, #10
1366         vshr.u32        q0, q6, #18
1367         veor.u32        q4, q4, q1
1368         veor.u32        q15, q15, q0
1369         vshl.u32        q1, q6, #32-18
1370         vshr.u32        q0, q6, #3
1371         veor.u32        q15, q15, q1
1372         vadd.u32        q4, q4, q5
1373         veor.u32        q15, q15, q0
1374         vmov.u32        q5, #0x80000000
1375         vadd.u32        q15, q15, q4
1376         vshr.u32        q4, q14, #17
1377         vshl.u32        q0, q14, #32-17
1378         vadd.u32        q6, q6, q9
1379         vst1.u32        {q14}, [r1]!
1380         vmov.u32        q7, #0x11000000
1381         veor.u32        q4, q4, q0
1382         vshr.u32        q0, q14, #19
1383         vshl.u32        q1, q14, #32-19
1384         vadd.u32        q6, q6, q7
1385         vmov.u32        q2, #0x00002000
1386         veor.u32        q4, q4, q0
1387         vst1.u32        {q15}, [r1]!
1388         veor.u32        q4, q4, q1
1389         vshr.u32        q1, q14, #10
1390         vadd.u32        q6, q6, q2
1391         veor.u32        q1, q4, q1
1392         add     r4, r4, #8*16
1393         
1394         vshr.u32        q4, q15, #17
1395         vshl.u32        q0, q15, #32-17
1396         vadd.u32        q9, q6, q1
1397         veor.u32        q4, q4, q0
1398         vshr.u32        q0, q15, #19
1399         vshl.u32        q1, q15, #32-19
1400         veor.u32        q4, q4, q0
1401         vst1.u32        {q9}, [r1]!
1402         vadd.u32        q5, q5, q10
1403         veor.u32        q4, q4, q1
1404         vshr.u32        q1, q15, #10
1405         vshl.u32        q0, q9, #32-17
1406         veor.u32        q10, q4, q1
1407         vshr.u32        q4, q9, #17
1408         vadd.u32        q10, q10, q5
1409         veor.u32        q4, q4, q0
1410         vshr.u32        q0, q9, #19
1411         vshl.u32        q1, q9, #32-19
1412         veor.u32        q4, q4, q0
1413         vshr.u32        q0, q9, #10
1414         veor.u32        q4, q4, q1
1415         vst1.u32        {q10}, [r1]!
1416         veor.u32        q1, q4, q0
1417         
1418         vshr.u32        q4, q10, #17
1419         vshl.u32        q0, q10, #32-17
1420         vadd.u32        q11, q11, q1
1421         veor.u32        q4, q4, q0
1422         vshr.u32        q0, q10, #19
1423         vshl.u32        q1, q10, #32-19
1424         veor.u32        q4, q4, q0
1425         vst1.u32        {q11}, [r1]!
1426         veor.u32        q4, q4, q1
1427         vshr.u32        q1, q10, #10
1428         vshl.u32        q0, q11, #32-17
1429         veor.u32        q1, q4, q1
1430         vshr.u32        q4, q11, #17
1431         vadd.u32        q12, q12, q1
1432         veor.u32        q4, q4, q0
1433         vshr.u32        q0, q11, #19
1434         vshl.u32        q1, q11, #32-19
1435         veor.u32        q4, q4, q0
1436         vshr.u32        q0, q11, #10
1437         veor.u32        q4, q4, q1
1438         vst1.u32        {q12}, [r1]!
1439         veor.u32        q1, q4, q0
1440         
1441         vshr.u32        q4, q12, #17
1442         vshl.u32        q0, q12, #32-17
1443         vadd.u32        q13, q13, q1
1444         veor.u32        q4, q4, q0
1445         vshr.u32        q0, q12, #19
1446         vshl.u32        q1, q12, #32-19
1447         veor.u32        q4, q4, q0
1448         vst1.u32        {q13}, [r1]!
1449         veor.u32        q4, q4, q1
1450         vshr.u32        q1, q12, #10
1451         vshl.u32        q0, q13, #32-17
1452         veor.u32        q1, q4, q1
1453         vshr.u32        q4, q13, #17
1454         vadd.u32        q14, q14, q1
1455         veor.u32        q4, q4, q0
1456         vshr.u32        q0, q13, #19
1457         vshl.u32        q1, q13, #32-19
1458         veor.u32        q4, q4, q0
1459         vshr.u32        q0, q13, #10
1460         veor.u32        q4, q4, q1
1461         vst1.u32        {q14}, [r1]!
1462         veor.u32        q4, q4, q0
1463         vmov.u32        q6, #0x00000100
1464         vadd.u32        q15, q15, q4
1465         
1466         vshr.u32        q4, q14, #17
1467         vshl.u32        q0, q14, #32-17
1468         vmov.u32        q7, #0x00400000
1469         vst1.u32        {q15}, [r1]!
1470         veor.u32        q4, q4, q0
1471         vshr.u32        q0, q14, #19
1472         vshl.u32        q1, q14, #32-19
1473         veor.u32        q4, q4, q0
1474         vadd.u32        q9, q9, q7
1475         veor.u32        q4, q4, q1
1476         vshr.u32        q1, q14, #10
1477         vmov.u32        q2, #0x00000022
1478         veor.u32        q4, q4, q1
1479         vadd.u32        q9, q9, q2
1480         vld1.u32        {q5}, [r4]!
1481         vadd.u32        q9, q9, q4
1482         vshr.u32        q4, q15, #17
1483         vshl.u32        q0, q15, #32-17
1484         vadd.u32        q6, q6, q10
1485         vst1.u32        {q9}, [r1]!
1486         veor.u32        q4, q4, q0
1487         vshr.u32        q0, q15, #19
1488         vshl.u32        q1, q15, #32-19
1489         veor.u32        q4, q4, q0
1490         vshr.u32        q10, q5, #7
1491         veor.u32        q4, q4, q1
1492         vshl.u32        q0, q5, #32-7
1493         vshr.u32        q1, q15, #10
1494         veor.u32        q10, q10, q0
1495         vshr.u32        q0, q5, #18
1496         veor.u32        q4, q4, q1
1497         veor.u32        q10, q10, q0
1498         vshl.u32        q1, q5, #32-18
1499         vshr.u32        q0, q5, #3
1500         veor.u32        q10, q10, q1
1501         vadd.u32        q1, q6, q4
1502         veor.u32        q10, q10, q0
1503         vld1.u32        {q6}, [r4]!
1504         vadd.u32        q10, q10, q1
1505         
1506         b       sha256d_ms_4way_extend_loop2
1507         
1508         .align 4
1509 sha256d_ms_4way_4h:
1510         .long 0x6a09e667, 0x6a09e667, 0x6a09e667, 0x6a09e667
1511         .long 0xbb67ae85, 0xbb67ae85, 0xbb67ae85, 0xbb67ae85
1512         .long 0x3c6ef372, 0x3c6ef372, 0x3c6ef372, 0x3c6ef372
1513         .long 0xa54ff53a, 0xa54ff53a, 0xa54ff53a, 0xa54ff53a
1514         .long 0x510e527f, 0x510e527f, 0x510e527f, 0x510e527f
1515         .long 0x9b05688c, 0x9b05688c, 0x9b05688c, 0x9b05688c
1516         .long 0x1f83d9ab, 0x1f83d9ab, 0x1f83d9ab, 0x1f83d9ab
1517         .long 0x5be0cd19, 0x5be0cd19, 0x5be0cd19, 0x5be0cd19
1518         
1519 sha256d_ms_4way_extend_coda2:
1520         adr     r4, sha256d_ms_4way_4h
1521         mov     r1, sp
1522         vldmia  r4, {q0-q7}
1523         vmov.u32        q15, q7
1524         sub     r3, r3, #64*16
1525         b       sha256d_ms_4way_main_loop2
1526
1527 .macro sha256_4way_main_round_red i, rk, rw, rd, re, rf, rg, rh
1528         vld1.u32        {q8}, [\rw]!
1529         vand.u32        q9, \rf, \re
1530         vbic.u32        q10, \rg, \re
1531         vshr.u32        q11, \re, #5
1532         vorr.u32        q10, q10, q9
1533         vshl.u32        q12, \re, #32-5
1534         vadd.u32        \rh, \rh, q10
1535         veor.u32        q10, \re, q11
1536         vshr.u32        q11, \re, #19
1537         veor.u32        q10, q10, q12
1538         vshl.u32        q12, \re, #32-19
1539         veor.u32        q10, q10, q11
1540         vadd.u32        \rh, \rh, q8
1541         veor.u32        q10, q10, q12
1542         vld1.u32        {q9}, [\rk]!
1543         vadd.u32        \rh, \rh, \rd
1544         vshr.u32        q11, q10, #6
1545         vadd.u32        \rh, \rh, q9
1546         vshl.u32        q13, q10, #32-6
1547         vadd.u32        \rh, \rh, q11
1548         vadd.u32        \rh, \rh, q13
1549 .endm
1550
1551 sha256d_ms_4way_finish:
1552         sha256_4way_main_round_red 57, r3, r1, q2, q7, q4, q5, q6
1553         sha256_4way_main_round_red 58, r3, r1, q1, q6, q7, q4, q5
1554         sha256_4way_main_round_red 59, r3, r1, q0, q5, q6, q7, q4
1555         sha256_4way_main_round_red 60, r3, r1, q3, q4, q5, q6, q7
1556         
1557         vadd.u32        q7, q7, q15
1558         add     r0, r0, #7*16
1559         vst1.u32        {q7}, [r0]
1560         
1561         mov     sp, r12
1562         vpop    {q4-q7}
1563         ldmfd   sp!, {r4, pc}
1564
1565
1566         .text
1567         .code 32
1568         .align 2
1569         .globl sha256_use_4way
1570         .globl _sha256_use_4way
1571 #ifdef __ELF__
1572         .type sha256_use_4way, %function
1573 #endif
1574 sha256_use_4way:
1575 _sha256_use_4way:
1576         mov     r0, #1
1577         bx      lr
1578
1579 #endif /* __ARM_NEON__ */
1580
1581 #endif