Arm module: Always compile NEON support
[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         .text
630         .code 32
631         .align 2
632         .globl sha256_init_4way
633         .globl _sha256_init_4way
634 #ifdef __ELF__
635         .type sha256_init_4way, %function
636 #endif
637 sha256_init_4way:
638 _sha256_init_4way:
639         adr     r12, sha256_4h
640         vldmia  r12, {q8-q15}
641         vstmia  r0, {q8-q15}
642         bx      lr
643         .align 4
644 sha256_4h:
645         .long 0x6a09e667, 0x6a09e667, 0x6a09e667, 0x6a09e667
646         .long 0xbb67ae85, 0xbb67ae85, 0xbb67ae85, 0xbb67ae85
647         .long 0x3c6ef372, 0x3c6ef372, 0x3c6ef372, 0x3c6ef372
648         .long 0xa54ff53a, 0xa54ff53a, 0xa54ff53a, 0xa54ff53a
649         .long 0x510e527f, 0x510e527f, 0x510e527f, 0x510e527f
650         .long 0x9b05688c, 0x9b05688c, 0x9b05688c, 0x9b05688c
651         .long 0x1f83d9ab, 0x1f83d9ab, 0x1f83d9ab, 0x1f83d9ab
652         .long 0x5be0cd19, 0x5be0cd19, 0x5be0cd19, 0x5be0cd19
653
654 .macro sha256_4k
655         .long 0x428a2f98, 0x428a2f98, 0x428a2f98, 0x428a2f98
656         .long 0x71374491, 0x71374491, 0x71374491, 0x71374491
657         .long 0xb5c0fbcf, 0xb5c0fbcf, 0xb5c0fbcf, 0xb5c0fbcf
658         .long 0xe9b5dba5, 0xe9b5dba5, 0xe9b5dba5, 0xe9b5dba5
659         .long 0x3956c25b, 0x3956c25b, 0x3956c25b, 0x3956c25b
660         .long 0x59f111f1, 0x59f111f1, 0x59f111f1, 0x59f111f1
661         .long 0x923f82a4, 0x923f82a4, 0x923f82a4, 0x923f82a4
662         .long 0xab1c5ed5, 0xab1c5ed5, 0xab1c5ed5, 0xab1c5ed5
663         .long 0xd807aa98, 0xd807aa98, 0xd807aa98, 0xd807aa98
664         .long 0x12835b01, 0x12835b01, 0x12835b01, 0x12835b01
665         .long 0x243185be, 0x243185be, 0x243185be, 0x243185be
666         .long 0x550c7dc3, 0x550c7dc3, 0x550c7dc3, 0x550c7dc3
667         .long 0x72be5d74, 0x72be5d74, 0x72be5d74, 0x72be5d74
668         .long 0x80deb1fe, 0x80deb1fe, 0x80deb1fe, 0x80deb1fe
669         .long 0x9bdc06a7, 0x9bdc06a7, 0x9bdc06a7, 0x9bdc06a7
670         .long 0xc19bf174, 0xc19bf174, 0xc19bf174, 0xc19bf174
671         .long 0xe49b69c1, 0xe49b69c1, 0xe49b69c1, 0xe49b69c1
672         .long 0xefbe4786, 0xefbe4786, 0xefbe4786, 0xefbe4786
673         .long 0x0fc19dc6, 0x0fc19dc6, 0x0fc19dc6, 0x0fc19dc6
674         .long 0x240ca1cc, 0x240ca1cc, 0x240ca1cc, 0x240ca1cc
675         .long 0x2de92c6f, 0x2de92c6f, 0x2de92c6f, 0x2de92c6f
676         .long 0x4a7484aa, 0x4a7484aa, 0x4a7484aa, 0x4a7484aa
677         .long 0x5cb0a9dc, 0x5cb0a9dc, 0x5cb0a9dc, 0x5cb0a9dc
678         .long 0x76f988da, 0x76f988da, 0x76f988da, 0x76f988da
679         .long 0x983e5152, 0x983e5152, 0x983e5152, 0x983e5152
680         .long 0xa831c66d, 0xa831c66d, 0xa831c66d, 0xa831c66d
681         .long 0xb00327c8, 0xb00327c8, 0xb00327c8, 0xb00327c8
682         .long 0xbf597fc7, 0xbf597fc7, 0xbf597fc7, 0xbf597fc7
683         .long 0xc6e00bf3, 0xc6e00bf3, 0xc6e00bf3, 0xc6e00bf3
684         .long 0xd5a79147, 0xd5a79147, 0xd5a79147, 0xd5a79147
685         .long 0x06ca6351, 0x06ca6351, 0x06ca6351, 0x06ca6351
686         .long 0x14292967, 0x14292967, 0x14292967, 0x14292967
687         .long 0x27b70a85, 0x27b70a85, 0x27b70a85, 0x27b70a85
688         .long 0x2e1b2138, 0x2e1b2138, 0x2e1b2138, 0x2e1b2138
689         .long 0x4d2c6dfc, 0x4d2c6dfc, 0x4d2c6dfc, 0x4d2c6dfc
690         .long 0x53380d13, 0x53380d13, 0x53380d13, 0x53380d13
691         .long 0x650a7354, 0x650a7354, 0x650a7354, 0x650a7354
692         .long 0x766a0abb, 0x766a0abb, 0x766a0abb, 0x766a0abb
693         .long 0x81c2c92e, 0x81c2c92e, 0x81c2c92e, 0x81c2c92e
694         .long 0x92722c85, 0x92722c85, 0x92722c85, 0x92722c85
695         .long 0xa2bfe8a1, 0xa2bfe8a1, 0xa2bfe8a1, 0xa2bfe8a1
696         .long 0xa81a664b, 0xa81a664b, 0xa81a664b, 0xa81a664b
697         .long 0xc24b8b70, 0xc24b8b70, 0xc24b8b70, 0xc24b8b70
698         .long 0xc76c51a3, 0xc76c51a3, 0xc76c51a3, 0xc76c51a3
699         .long 0xd192e819, 0xd192e819, 0xd192e819, 0xd192e819
700         .long 0xd6990624, 0xd6990624, 0xd6990624, 0xd6990624
701         .long 0xf40e3585, 0xf40e3585, 0xf40e3585, 0xf40e3585
702         .long 0x106aa070, 0x106aa070, 0x106aa070, 0x106aa070
703         .long 0x19a4c116, 0x19a4c116, 0x19a4c116, 0x19a4c116
704         .long 0x1e376c08, 0x1e376c08, 0x1e376c08, 0x1e376c08
705         .long 0x2748774c, 0x2748774c, 0x2748774c, 0x2748774c
706         .long 0x34b0bcb5, 0x34b0bcb5, 0x34b0bcb5, 0x34b0bcb5
707         .long 0x391c0cb3, 0x391c0cb3, 0x391c0cb3, 0x391c0cb3
708         .long 0x4ed8aa4a, 0x4ed8aa4a, 0x4ed8aa4a, 0x4ed8aa4a
709         .long 0x5b9cca4f, 0x5b9cca4f, 0x5b9cca4f, 0x5b9cca4f
710         .long 0x682e6ff3, 0x682e6ff3, 0x682e6ff3, 0x682e6ff3
711         .long 0x748f82ee, 0x748f82ee, 0x748f82ee, 0x748f82ee
712         .long 0x78a5636f, 0x78a5636f, 0x78a5636f, 0x78a5636f
713         .long 0x84c87814, 0x84c87814, 0x84c87814, 0x84c87814
714         .long 0x8cc70208, 0x8cc70208, 0x8cc70208, 0x8cc70208
715         .long 0x90befffa, 0x90befffa, 0x90befffa, 0x90befffa
716         .long 0xa4506ceb, 0xa4506ceb, 0xa4506ceb, 0xa4506ceb
717         .long 0xbef9a3f7, 0xbef9a3f7, 0xbef9a3f7, 0xbef9a3f7
718         .long 0xc67178f2, 0xc67178f2, 0xc67178f2, 0xc67178f2
719 .endm
720
721 .macro sha256_4way_extend_doubleround_core i, rr, rw, ra, rb, ry, rz
722         vadd.u32        q5, q5, \ra
723         veor.u32        q4, q4, q0
724         vshr.u32        q0, \ry, #19
725         vshl.u32        q1, \ry, #32-19
726         veor.u32        q4, q4, q0
727         vshr.u32        \ra, q6, #7
728         vshl.u32        q0, q6, #32-7
729         veor.u32        q4, q4, q1
730         veor.u32        \ra, \ra, q0
731         vshr.u32        q1, \ry, #10
732         vshr.u32        q0, q6, #18
733         veor.u32        q4, q4, q1
734         veor.u32        \ra, \ra, q0
735         vshl.u32        q1, q6, #32-18
736         vshr.u32        q0, q6, #3
737         veor.u32        \ra, \ra, q1
738         vadd.u32        q4, q4, q5
739         veor.u32        \ra, \ra, q0
740         vld1.u32        {q5}, [\rr]!
741         vadd.u32        \ra, \ra, q4
742
743         vshr.u32        q4, \rz, #17
744         vshl.u32        q0, \rz, #32-17
745         vadd.u32        q6, q6, \rb
746         vst1.u32        {\ra}, [\rw]!
747         veor.u32        q4, q4, q0
748         vshr.u32        q0, \rz, #19
749         vshl.u32        q1, \rz, #32-19
750         veor.u32        q4, q4, q0
751         vshr.u32        \rb, q5, #7
752         veor.u32        q4, q4, q1
753         vshl.u32        q0, q5, #32-7
754         vshr.u32        q1, \rz, #10
755         veor.u32        \rb, \rb, q0
756         vshr.u32        q0, q5, #18
757         veor.u32        q4, q4, q1
758         veor.u32        \rb, \rb, q0
759         vshl.u32        q1, q5, #32-18
760         vshr.u32        q0, q5, #3
761         veor.u32        \rb, \rb, q1
762         vadd.u32        q1, q6, q4
763         veor.u32        \rb, \rb, q0
764 .endm
765
766 .macro sha256_4way_extend_doubleround_head i, rr, rw, ra, rb, ry, rz
767         vld1.u32        {q6}, [\rr]!
768         vshr.u32        q4, \ry, #17
769         vshl.u32        q0, \ry, #32-17
770         sha256_4way_extend_doubleround_core \i, \rr, \rw, \ra, \rb, \ry, \rz
771         vld1.u32        {q6}, [\rr]!
772         vadd.u32        \rb, \rb, q1
773 .endm
774
775 .macro sha256_4way_extend_doubleround_body i, rr, rw, ra, rb, ry, rz
776         vshr.u32        q4, \ry, #17
777         vshl.u32        q0, \ry, #32-17
778         vst1.u32        {\rz}, [\rw]!
779         sha256_4way_extend_doubleround_core \i, \rr, \rw, \ra, \rb, \ry, \rz
780         vld1.u32        {q6}, [\rr]!
781         vadd.u32        \rb, \rb, q1
782 .endm
783
784 .macro sha256_4way_extend_doubleround_foot i, rr, rw, ra, rb, ry, rz
785         vshr.u32        q4, \ry, #17
786         vshl.u32        q0, \ry, #32-17
787         vst1.u32        {\rz}, [\rw]!
788         sha256_4way_extend_doubleround_core \i, \rr, \rw, \ra, \rb, \ry, \rz
789         vadd.u32        \rb, \rb, q1
790         vst1.u32        {\rb}, [\rw]!
791 .endm
792
793 .macro sha256_4way_main_round i, rk, rw, ra, rb, rc, rd, re, rf, rg, rh
794         vld1.u32        {q8}, [\rw]!
795         vand.u32        q9, \rf, \re
796         vbic.u32        q10, \rg, \re
797         vshr.u32        q11, \re, #5
798         vorr.u32        q10, q10, q9
799         vld1.u32        {q9}, [\rk]!
800         vadd.u32        \rh, \rh, q10
801         vshl.u32        q12, \re, #32-5
802         veor.u32        q10, \re, q11
803         vshr.u32        q11, \re, #19
804         veor.u32        q10, q10, q12
805         vshl.u32        q12, \re, #32-19
806         veor.u32        q10, q10, q11
807         vadd.u32        \rh, \rh, q8
808         veor.u32        q10, q10, q12
809         vadd.u32        \rh, \rh, q9
810         veor.u32        q9, \ra, \rb
811         vshr.u32        q11, q10, #6
812         vshl.u32        q13, q10, #32-6
813         vadd.u32        \rh, \rh, q11
814
815         vshr.u32        q11, \ra, #11
816         vshl.u32        q12, \ra, #32-11
817         veor.u32        q8, \ra, q11
818         vand.u32        q10, \ra, \rb
819         veor.u32        q8, q8, q12
820         vshr.u32        q11, \ra, #20
821         vshl.u32        q12, \ra, #32-20
822         veor.u32        q8, q8, q11
823         vand.u32        q9, q9, \rc
824         veor.u32        q8, q8, q12
825         vadd.u32        \rh, \rh, q13
826         veor.u32        q10, q10, q9
827         vshr.u32        q11, q8, #2
828         vshl.u32        q12, q8, #32-2
829         vadd.u32        q9, \rh, q10
830         vadd.u32        q12, q12, q11
831         vadd.u32        \rh, \rh, \rd
832         vadd.u32        \rd, q9, q12
833 .endm
834
835 .macro sha256_4way_main_quadround i, rk, rw
836         sha256_4way_main_round \i+0, \rk, \rw, q0, q1, q2, q3, q4, q5, q6, q7
837         sha256_4way_main_round \i+1, \rk, \rw, q3, q0, q1, q2, q7, q4, q5, q6
838         sha256_4way_main_round \i+2, \rk, \rw, q2, q3, q0, q1, q6, q7, q4, q5
839         sha256_4way_main_round \i+3, \rk, \rw, q1, q2, q3, q0, q5, q6, q7, q4
840 .endm
841
842
843         .text
844         .code 32
845         .align 2
846         .globl sha256_transform_4way
847         .globl _sha256_transform_4way
848 #ifdef __ELF__
849         .type sha256_transform_4way, %function
850 #endif
851 sha256_transform_4way:
852 _sha256_transform_4way:
853         stmfd   sp!, {r4, lr}
854         vpush   {q4-q7}
855         mov     r12, sp
856         sub     sp, sp, #64*16
857         bic     sp, sp, #63
858         cmp     r2, #0
859         bne     sha256_transform_4way_swap
860         
861         vldmia  r1!, {q0-q7}
862         vstmia  sp, {q0-q7}
863         add     r3, sp, #8*16
864         vldmia  r1, {q8-q15}
865         vstmia  r3, {q8-q15}
866         b       sha256_transform_4way_extend
867
868 sha256_transform_4way_swap:
869         vldmia  r1!, {q0-q7}
870         vrev32.8        q0, q0
871         vrev32.8        q1, q1
872         vrev32.8        q2, q2
873         vrev32.8        q3, q3
874         vldmia  r1, {q8-q15}
875         vrev32.8        q4, q4
876         vrev32.8        q5, q5
877         vrev32.8        q6, q6
878         vrev32.8        q7, q7
879         vstmia  sp, {q0-q7}
880         vrev32.8        q8, q8
881         vrev32.8        q9, q9
882         vrev32.8        q10, q10
883         vrev32.8        q11, q11
884         vrev32.8        q12, q12
885         vrev32.8        q13, q13
886         vrev32.8        q14, q14
887         vrev32.8        q15, q15
888         add     r3, sp, #8*16
889         vstmia  r3, {q8-q15}
890         
891 sha256_transform_4way_extend:
892         add     r1, sp, #1*16
893         add     r2, sp, #16*16
894         vmov.u32        q5, q0
895         sha256_4way_extend_doubleround_head  0, r1, r2,  q9, q10, q14, q15
896         sha256_4way_extend_doubleround_body  2, r1, r2, q11, q12,  q9, q10
897         sha256_4way_extend_doubleround_body  4, r1, r2, q13, q14, q11, q12
898         sha256_4way_extend_doubleround_body  6, r1, r2, q15,  q9, q13, q14
899         sha256_4way_extend_doubleround_body  8, r1, r2, q10, q11, q15,  q9
900         sha256_4way_extend_doubleround_body 10, r1, r2, q12, q13, q10, q11
901         sha256_4way_extend_doubleround_body 12, r1, r2, q14, q15, q12, q13
902         sha256_4way_extend_doubleround_body 14, r1, r2,  q9, q10, q14, q15
903         sha256_4way_extend_doubleround_body 16, r1, r2, q11, q12,  q9, q10
904         sha256_4way_extend_doubleround_body 18, r1, r2, q13, q14, q11, q12
905         sha256_4way_extend_doubleround_body 20, r1, r2, q15,  q9, q13, q14
906         sha256_4way_extend_doubleround_body 22, r1, r2, q10, q11, q15,  q9
907         sha256_4way_extend_doubleround_body 24, r1, r2, q12, q13, q10, q11
908         sha256_4way_extend_doubleround_body 26, r1, r2, q14, q15, q12, q13
909         sha256_4way_extend_doubleround_body 28, r1, r2,  q9, q10, q14, q15
910         sha256_4way_extend_doubleround_body 30, r1, r2, q11, q12,  q9, q10
911         sha256_4way_extend_doubleround_body 32, r1, r2, q13, q14, q11, q12
912         sha256_4way_extend_doubleround_body 34, r1, r2, q15,  q9, q13, q14
913         sha256_4way_extend_doubleround_body 36, r1, r2, q10, q11, q15,  q9
914         sha256_4way_extend_doubleround_body 38, r1, r2, q12, q13, q10, q11
915         sha256_4way_extend_doubleround_body 40, r1, r2, q14, q15, q12, q13
916         sha256_4way_extend_doubleround_body 42, r1, r2,  q9, q10, q14, q15
917         sha256_4way_extend_doubleround_body 44, r1, r2, q11, q12,  q9, q10
918         sha256_4way_extend_doubleround_foot 46, r1, r2, q13, q14, q11, q12
919         
920         vldmia  r0, {q0-q7}
921         adr     r4, sha256_transform_4way_4k
922         b       sha256_transform_4way_4k_over
923         .align 4
924 sha256_transform_4way_4k:
925         sha256_4k
926 sha256_transform_4way_4k_over:
927         sha256_4way_main_quadround  0, r4, sp
928         sha256_4way_main_quadround  4, r4, sp
929         sha256_4way_main_quadround  8, r4, sp
930         sha256_4way_main_quadround 12, r4, sp
931         sha256_4way_main_quadround 16, r4, sp
932         sha256_4way_main_quadround 20, r4, sp
933         sha256_4way_main_quadround 24, r4, sp
934         sha256_4way_main_quadround 28, r4, sp
935         sha256_4way_main_quadround 32, r4, sp
936         sha256_4way_main_quadround 36, r4, sp
937         sha256_4way_main_quadround 40, r4, sp
938         sha256_4way_main_quadround 44, r4, sp
939         sha256_4way_main_quadround 48, r4, sp
940         sha256_4way_main_quadround 52, r4, sp
941         sha256_4way_main_quadround 56, r4, sp
942         sha256_4way_main_quadround 60, r4, sp
943         
944         vldmia  r0, {q8-q15}
945         vadd.u32        q0, q0, q8
946         vadd.u32        q1, q1, q9
947         vadd.u32        q2, q2, q10
948         vadd.u32        q3, q3, q11
949         vadd.u32        q4, q4, q12
950         vadd.u32        q5, q5, q13
951         vadd.u32        q6, q6, q14
952         vadd.u32        q7, q7, q15
953         vstmia  r0, {q0-q7}
954         
955         mov     sp, r12
956         vpop    {q4-q7}
957         ldmfd   sp!, {r4, pc}
958         
959
960         .text
961         .code 32
962         .align 2
963         .globl sha256d_ms_4way
964         .globl _sha256d_ms_4way
965 #ifdef __ELF__
966         .type sha256d_ms_4way, %function
967 #endif
968 sha256d_ms_4way:
969 _sha256d_ms_4way:
970         stmfd   sp!, {r4, lr}
971         vpush   {q4-q7}
972         mov     r12, sp
973         sub     sp, sp, #64*16
974         bic     sp, sp, #63
975         
976         add     r4, r1, #3*16
977         vld1.u32        {q6}, [r4]!
978         add     r1, r1, #18*16
979         vldmia  r1, {q11-q13}
980         cmp     r0, r0
981         
982         vshr.u32        q10, q6, #7
983         vshl.u32        q0, q6, #32-7
984         vshr.u32        q1, q6, #18
985         veor.u32        q10, q10, q0
986         vshl.u32        q0, q6, #32-18
987         veor.u32        q10, q10, q1
988         vshr.u32        q1, q6, #3
989         veor.u32        q10, q10, q0
990         vstmia  sp!, {q11-q13}
991         veor.u32        q4, q10, q1
992         vadd.u32        q12, q12, q6
993         vadd.u32        q11, q11, q4
994         
995         vshr.u32        q14, q12, #17
996         vshr.u32        q4, q11, #17
997         vshl.u32        q0, q11, #32-17
998         vst1.u32        {q11}, [r1]!
999         veor.u32        q4, q4, q0
1000         vshr.u32        q0, q11, #19
1001         vshl.u32        q1, q11, #32-19
1002         veor.u32        q4, q4, q0
1003         vst1.u32        {q12}, [r1]!
1004         veor.u32        q4, q4, q1
1005         vshr.u32        q1, q11, #10
1006         vshl.u32        q0, q12, #32-17
1007         veor.u32        q4, q4, q1
1008         veor.u32        q14, q14, q0
1009         vadd.u32        q13, q13, q4
1010         vshr.u32        q0, q12, #19
1011         vshl.u32        q1, q12, #32-19
1012         veor.u32        q14, q14, q0
1013         vst1.u32        {q13}, [r1]!
1014         veor.u32        q14, q14, q1
1015         vshr.u32        q1, q12, #10
1016         
1017         vshr.u32        q4, q13, #17
1018         vshl.u32        q0, q13, #32-17
1019         veor.u32        q14, q14, q1
1020         veor.u32        q4, q4, q0
1021         vshr.u32        q0, q13, #19
1022         vshl.u32        q1, q13, #32-19
1023         veor.u32        q4, q4, q0
1024         vst1.u32        {q14}, [r1]!
1025         veor.u32        q4, q4, q1
1026         vshr.u32        q1, q13, #10
1027         vld1.u32        {q15}, [r1]
1028         veor.u32        q4, q4, q1
1029         vst1.u32        {q15}, [sp]!
1030         vadd.u32        q15, q15, q4
1031         vshr.u32        q4, q14, #17
1032         vshl.u32        q0, q14, #32-17
1033         vshl.u32        q1, q14, #32-19
1034         veor.u32        q4, q4, q0
1035         vshr.u32        q0, q14, #19
1036         vst1.u32        {q15}, [r1]!
1037         veor.u32        q4, q4, q0
1038         vld1.u32        {q9}, [r1]
1039         veor.u32        q4, q4, q1
1040         vshr.u32        q1, q14, #10
1041         vst1.u32        {q9}, [sp]!
1042         veor.u32        q5, q4, q1
1043         
1044         vshr.u32        q4, q15, #17
1045         vadd.u32        q9, q9, q5
1046         vshl.u32        q0, q15, #32-17
1047         vshl.u32        q1, q15, #32-19
1048         veor.u32        q4, q4, q0
1049         vshr.u32        q0, q15, #19
1050         vst1.u32        {q9}, [r1]!
1051         veor.u32        q4, q4, q0
1052         vld1.u32        {q10}, [r1]
1053         veor.u32        q4, q4, q1
1054         vshr.u32        q1, q15, #10
1055         vst1.u32        {q10}, [sp]!
1056         veor.u32        q4, q4, q1
1057         vshl.u32        q0, q9, #32-17
1058         vadd.u32        q10, q10, q4
1059         vshr.u32        q4, q9, #17
1060         vshl.u32        q1, q9, #32-19
1061         veor.u32        q4, q4, q0
1062         vshr.u32        q0, q9, #19
1063         veor.u32        q4, q4, q1
1064         vshr.u32        q1, q9, #10
1065         veor.u32        q4, q4, q0
1066         vst1.u32        {q10}, [r1]!
1067         veor.u32        q5, q4, q1
1068         
1069         vshr.u32        q4, q10, #17
1070         vshl.u32        q0, q10, #32-17
1071         vadd.u32        q11, q11, q5
1072         veor.u32        q4, q4, q0
1073         vshr.u32        q0, q10, #19
1074         vshl.u32        q1, q10, #32-19
1075         veor.u32        q4, q4, q0
1076         vst1.u32        {q11}, [r1]!
1077         veor.u32        q4, q4, q1
1078         vshr.u32        q1, q10, #10
1079         vshl.u32        q0, q11, #32-17
1080         veor.u32        q2, q4, q1
1081         vshr.u32        q4, q11, #17
1082         vadd.u32        q12, q12, q2
1083         vshl.u32        q1, q11, #32-19
1084         veor.u32        q4, q4, q0
1085         vshr.u32        q0, q11, #19
1086         veor.u32        q4, q4, q1
1087         vshr.u32        q1, q11, #10
1088         veor.u32        q4, q4, q0
1089         vst1.u32        {q12}, [r1]!
1090         veor.u32        q5, q4, q1
1091         
1092         vshr.u32        q4, q12, #17
1093         vshl.u32        q0, q12, #32-17
1094         vadd.u32        q13, q13, q5
1095         veor.u32        q4, q4, q0
1096         vshr.u32        q0, q12, #19
1097         vshl.u32        q1, q12, #32-19
1098         veor.u32        q4, q4, q0
1099         vst1.u32        {q13}, [r1]!
1100         veor.u32        q4, q4, q1
1101         vshr.u32        q1, q12, #10
1102         vshl.u32        q0, q13, #32-17
1103         veor.u32        q2, q4, q1
1104         vshr.u32        q4, q13, #17
1105         vadd.u32        q14, q14, q2
1106         vshl.u32        q1, q13, #32-19
1107         veor.u32        q4, q4, q0
1108         vshr.u32        q0, q13, #19
1109         veor.u32        q4, q4, q1
1110         vshr.u32        q1, q13, #10
1111         veor.u32        q4, q4, q0
1112         vst1.u32        {q14}, [r1]!
1113         veor.u32        q5, q4, q1
1114         add     r4, r4, #12*16
1115         
1116         vshr.u32        q4, q14, #17
1117         vshl.u32        q0, q14, #32-17
1118         vadd.u32        q15, q15, q5
1119         veor.u32        q4, q4, q0
1120         vshr.u32        q0, q14, #19
1121         vshl.u32        q1, q14, #32-19
1122         veor.u32        q4, q4, q0
1123         vst1.u32        {q15}, [r1]!
1124         veor.u32        q4, q4, q1
1125         vshr.u32        q1, q14, #10
1126         vld1.u32        {q2}, [r1]
1127         veor.u32        q4, q4, q1
1128         vshl.u32        q0, q15, #32-17
1129         vadd.u32        q9, q9, q4
1130         vst1.u32        {q2}, [sp]!
1131         vadd.u32        q9, q9, q2
1132         vshr.u32        q4, q15, #17
1133         vshr.u32        q2, q15, #19
1134         veor.u32        q4, q4, q0
1135         vst1.u32        {q9}, [r1]!
1136         vshl.u32        q1, q15, #32-19
1137         veor.u32        q4, q4, q2
1138         vshr.u32        q0, q15, #10
1139         veor.u32        q4, q4, q1
1140         vld1.u32        {q5-q6}, [r4]!
1141         veor.u32        q4, q4, q0
1142         vld1.u32        {q2}, [r1]
1143         vadd.u32        q10, q10, q4
1144         vst1.u32        {q2}, [sp]!
1145         vadd.u32        q10, q10, q2
1146         
1147         sub     sp, sp, #8*16
1148         
1149 sha256d_ms_4way_extend_loop2:
1150         sha256_4way_extend_doubleround_body 16, r4, r1, q11, q12,  q9, q10
1151         sha256_4way_extend_doubleround_body 18, r4, r1, q13, q14, q11, q12
1152         sha256_4way_extend_doubleround_body 20, r4, r1, q15,  q9, q13, q14
1153         sha256_4way_extend_doubleround_body 22, r4, r1, q10, q11, q15,  q9
1154         sha256_4way_extend_doubleround_body 24, r4, r1, q12, q13, q10, q11
1155         sha256_4way_extend_doubleround_body 26, r4, r1, q14, q15, q12, q13
1156         sha256_4way_extend_doubleround_body 28, r4, r1,  q9, q10, q14, q15
1157         sha256_4way_extend_doubleround_body 30, r4, r1, q11, q12,  q9, q10
1158         sha256_4way_extend_doubleround_body 32, r4, r1, q13, q14, q11, q12
1159         sha256_4way_extend_doubleround_body 34, r4, r1, q15,  q9, q13, q14
1160         sha256_4way_extend_doubleround_body 36, r4, r1, q10, q11, q15,  q9
1161         sha256_4way_extend_doubleround_body 38, r4, r1, q12, q13, q10, q11
1162         sha256_4way_extend_doubleround_body 40, r4, r1, q14, q15, q12, q13
1163         sha256_4way_extend_doubleround_body 42, r4, r1,  q9, q10, q14, q15
1164         sha256_4way_extend_doubleround_body 44, r4, r1, q11, q12,  q9, q10
1165         sha256_4way_extend_doubleround_foot 46, r4, r1, q13, q14, q11, q12
1166         bne     sha256d_ms_4way_extend_coda2
1167         
1168         vldmia  r3!, {q4-q7}
1169         vldmia  r3, {q0-q3}
1170         vswp    q0, q4
1171         adr     r3, sha256d_ms_4way_4k+3*16
1172         sub r1, r1, #(64-3)*16
1173         b       sha256d_ms_4way_main_loop1
1174         
1175         .align 4
1176 sha256d_ms_4way_4k:
1177         sha256_4k
1178         
1179 sha256d_ms_4way_main_loop2:
1180         sha256_4way_main_round  0, r3, r1, q0, q1, q2, q3, q4, q5, q6, q7
1181         sha256_4way_main_round  1, r3, r1, q3, q0, q1, q2, q7, q4, q5, q6
1182         sha256_4way_main_round  2, r3, r1, q2, q3, q0, q1, q6, q7, q4, q5
1183 sha256d_ms_4way_main_loop1:
1184         sha256_4way_main_round  3, r3, r1, q1, q2, q3, q0, q5, q6, q7, q4
1185         sha256_4way_main_quadround  4, r3, r1
1186         sha256_4way_main_quadround  8, r3, r1
1187         sha256_4way_main_quadround 12, r3, r1
1188         sha256_4way_main_quadround 16, r3, r1
1189         sha256_4way_main_quadround 20, r3, r1
1190         sha256_4way_main_quadround 24, r3, r1
1191         sha256_4way_main_quadround 28, r3, r1
1192         sha256_4way_main_quadround 32, r3, r1
1193         sha256_4way_main_quadround 36, r3, r1
1194         sha256_4way_main_quadround 40, r3, r1
1195         sha256_4way_main_quadround 44, r3, r1
1196         sha256_4way_main_quadround 48, r3, r1
1197         sha256_4way_main_quadround 52, r3, r1
1198         sha256_4way_main_round 56, r3, r1, q0, q1, q2, q3, q4, q5, q6, q7
1199         bne     sha256d_ms_4way_finish
1200         sha256_4way_main_round 57, r3, r1, q3, q0, q1, q2, q7, q4, q5, q6
1201         sha256_4way_main_round 58, r3, r1, q2, q3, q0, q1, q6, q7, q4, q5
1202         sha256_4way_main_round 59, r3, r1, q1, q2, q3, q0, q5, q6, q7, q4
1203         sha256_4way_main_quadround 60, r3, r1
1204         
1205         vldmia  r2, {q8-q15}
1206         vadd.u32        q0, q0, q8
1207         vadd.u32        q1, q1, q9
1208         vadd.u32        q2, q2, q10
1209         vadd.u32        q3, q3, q11
1210         vadd.u32        q4, q4, q12
1211         vadd.u32        q5, q5, q13
1212         vadd.u32        q6, q6, q14
1213         vadd.u32        q7, q7, q15
1214         
1215         vldmia  sp, {q8-q15}
1216         sub     r1, r1, #(64-18)*16
1217         vstmia  r1, {q8-q10}
1218         add     r1, r1, #4*16
1219         vstmia  r1, {q11-q13}
1220         add     r1, r1, #8*16
1221         vstmia  r1, {q14-q15}
1222         
1223         vstmia  sp, {q0-q7}
1224         vmov.u32        q8,  #0x80000000
1225         vmov.u32        q9,  #0
1226         vmov.u32        q10, #0
1227         vmov.u32        q11, #0
1228         vmov.u32        q12, #0
1229         vmov.u32        q13, #0
1230         vmov.u32        q14, #0
1231         vmov.u32        q15, #0x00000100
1232         add     r1, sp, #8*16
1233         vstmia  r1!, {q8-q15}
1234         adds    r4, sp, #2*16
1235         
1236         vshr.u32        q9, q1, #7
1237         vshl.u32        q2, q1, #32-7
1238         vshr.u32        q4, q1, #18
1239         veor.u32        q9, q9, q2
1240         vshl.u32        q3, q1, #32-18
1241         veor.u32        q9, q9, q4
1242         vshr.u32        q2, q1, #3
1243         veor.u32        q9, q9, q3
1244         vld1.u32        {q5}, [r4]!
1245         veor.u32        q9, q9, q2
1246         vmov.u32        q7, #0x00a00000
1247         vadd.u32        q9, q9, q0
1248         vshr.u32        q10, q5, #7
1249         vshl.u32        q0, q5, #32-7
1250         vshl.u32        q3, q5, #32-18
1251         veor.u32        q10, q10, q0
1252         vshr.u32        q0, q5, #18
1253         veor.u32        q10, q10, q3
1254         vst1.u32        {q9}, [r1]!
1255         vadd.u32        q3, q1, q7
1256         veor.u32        q10, q10, q0
1257         vshr.u32        q0, q5, #3
1258         vld1.u32        {q6}, [r4]!
1259         veor.u32        q10, q10, q0
1260         
1261         vshr.u32        q4, q9, #17
1262         vshl.u32        q0, q9, #32-17
1263         vadd.u32        q10, q10, q3
1264         veor.u32        q4, q4, q0
1265         vshr.u32        q0, q9, #19
1266         vshl.u32        q1, q9, #32-19
1267         veor.u32        q4, q4, q0
1268         vshr.u32        q11, q6, #7
1269         vshl.u32        q0, q6, #32-7
1270         veor.u32        q4, q4, q1
1271         veor.u32        q11, q11, q0
1272         vshr.u32        q1, q9, #10
1273         vshr.u32        q0, q6, #18
1274         veor.u32        q4, q4, q1
1275         veor.u32        q11, q11, q0
1276         vshl.u32        q1, q6, #32-18
1277         vshr.u32        q0, q6, #3
1278         veor.u32        q11, q11, q1
1279         vadd.u32        q4, q4, q5
1280         veor.u32        q11, q11, q0
1281         vld1.u32        {q5}, [r4]!
1282         vadd.u32        q11, q11, q4
1283         vshr.u32        q4, q10, #17
1284         vshl.u32        q0, q10, #32-17
1285         vst1.u32        {q10}, [r1]!
1286         veor.u32        q4, q4, q0
1287         vshr.u32        q0, q10, #19
1288         vshl.u32        q1, q10, #32-19
1289         veor.u32        q4, q4, q0
1290         vshr.u32        q12, q5, #7
1291         veor.u32        q4, q4, q1
1292         vshl.u32        q0, q5, #32-7
1293         vshr.u32        q1, q10, #10
1294         veor.u32        q12, q12, q0
1295         vshr.u32        q0, q5, #18
1296         veor.u32        q4, q4, q1
1297         veor.u32        q12, q12, q0
1298         vshl.u32        q1, q5, #32-18
1299         vst1.u32        {q11}, [r1]!
1300         veor.u32        q12, q12, q1
1301         vshr.u32        q0, q5, #3
1302         vadd.u32        q1, q6, q4
1303         veor.u32        q12, q12, q0
1304         
1305         vshr.u32        q4, q11, #17
1306         vshl.u32        q0, q11, #32-17
1307         vadd.u32        q12, q12, q1
1308         vld1.u32        {q6}, [r4]!
1309         veor.u32        q4, q4, q0
1310         vshr.u32        q0, q11, #19
1311         vshl.u32        q1, q11, #32-19
1312         veor.u32        q4, q4, q0
1313         vshr.u32        q13, q6, #7
1314         vshl.u32        q0, q6, #32-7
1315         veor.u32        q4, q4, q1
1316         veor.u32        q13, q13, q0
1317         vshr.u32        q1, q11, #10
1318         vshr.u32        q0, q6, #18
1319         veor.u32        q4, q4, q1
1320         veor.u32        q13, q13, q0
1321         vshl.u32        q1, q6, #32-18
1322         vshr.u32        q0, q6, #3
1323         veor.u32        q13, q13, q1
1324         vadd.u32        q4, q4, q5
1325         veor.u32        q13, q13, q0
1326         vld1.u32        {q5}, [r4]!
1327         vadd.u32        q13, q13, q4
1328         vshr.u32        q4, q12, #17
1329         vshl.u32        q0, q12, #32-17
1330         vst1.u32        {q12}, [r1]!
1331         veor.u32        q4, q4, q0
1332         vshr.u32        q0, q12, #19
1333         vshl.u32        q1, q12, #32-19
1334         veor.u32        q4, q4, q0
1335         vshr.u32        q14, q5, #7
1336         veor.u32        q4, q4, q1
1337         vshl.u32        q0, q5, #32-7
1338         vshr.u32        q1, q12, #10
1339         veor.u32        q14, q14, q0
1340         vshr.u32        q0, q5, #18
1341         veor.u32        q4, q4, q1
1342         veor.u32        q14, q14, q0
1343         vshl.u32        q1, q5, #32-18
1344         vst1.u32        {q13}, [r1]!
1345         veor.u32        q14, q14, q1
1346         vshr.u32        q0, q5, #3
1347         vadd.u32        q1, q6, q4
1348         veor.u32        q14, q14, q0
1349         
1350         vshr.u32        q4, q13, #17
1351         vshl.u32        q0, q13, #32-17
1352         vadd.u32        q14, q14, q1
1353         vld1.u32        {q6}, [r4]!
1354         vadd.u32        q5, q5, q15
1355         veor.u32        q4, q4, q0
1356         vshr.u32        q0, q13, #19
1357         vshl.u32        q1, q13, #32-19
1358         veor.u32        q4, q4, q0
1359         vshr.u32        q15, q6, #7
1360         vshl.u32        q0, q6, #32-7
1361         veor.u32        q4, q4, q1
1362         veor.u32        q15, q15, q0
1363         vshr.u32        q1, q13, #10
1364         vshr.u32        q0, q6, #18
1365         veor.u32        q4, q4, q1
1366         veor.u32        q15, q15, q0
1367         vshl.u32        q1, q6, #32-18
1368         vshr.u32        q0, q6, #3
1369         veor.u32        q15, q15, q1
1370         vadd.u32        q4, q4, q5
1371         veor.u32        q15, q15, q0
1372         vmov.u32        q5, #0x80000000
1373         vadd.u32        q15, q15, q4
1374         vshr.u32        q4, q14, #17
1375         vshl.u32        q0, q14, #32-17
1376         vadd.u32        q6, q6, q9
1377         vst1.u32        {q14}, [r1]!
1378         vmov.u32        q7, #0x11000000
1379         veor.u32        q4, q4, q0
1380         vshr.u32        q0, q14, #19
1381         vshl.u32        q1, q14, #32-19
1382         vadd.u32        q6, q6, q7
1383         vmov.u32        q2, #0x00002000
1384         veor.u32        q4, q4, q0
1385         vst1.u32        {q15}, [r1]!
1386         veor.u32        q4, q4, q1
1387         vshr.u32        q1, q14, #10
1388         vadd.u32        q6, q6, q2
1389         veor.u32        q1, q4, q1
1390         add     r4, r4, #8*16
1391         
1392         vshr.u32        q4, q15, #17
1393         vshl.u32        q0, q15, #32-17
1394         vadd.u32        q9, q6, q1
1395         veor.u32        q4, q4, q0
1396         vshr.u32        q0, q15, #19
1397         vshl.u32        q1, q15, #32-19
1398         veor.u32        q4, q4, q0
1399         vst1.u32        {q9}, [r1]!
1400         vadd.u32        q5, q5, q10
1401         veor.u32        q4, q4, q1
1402         vshr.u32        q1, q15, #10
1403         vshl.u32        q0, q9, #32-17
1404         veor.u32        q10, q4, q1
1405         vshr.u32        q4, q9, #17
1406         vadd.u32        q10, q10, q5
1407         veor.u32        q4, q4, q0
1408         vshr.u32        q0, q9, #19
1409         vshl.u32        q1, q9, #32-19
1410         veor.u32        q4, q4, q0
1411         vshr.u32        q0, q9, #10
1412         veor.u32        q4, q4, q1
1413         vst1.u32        {q10}, [r1]!
1414         veor.u32        q1, q4, q0
1415         
1416         vshr.u32        q4, q10, #17
1417         vshl.u32        q0, q10, #32-17
1418         vadd.u32        q11, q11, q1
1419         veor.u32        q4, q4, q0
1420         vshr.u32        q0, q10, #19
1421         vshl.u32        q1, q10, #32-19
1422         veor.u32        q4, q4, q0
1423         vst1.u32        {q11}, [r1]!
1424         veor.u32        q4, q4, q1
1425         vshr.u32        q1, q10, #10
1426         vshl.u32        q0, q11, #32-17
1427         veor.u32        q1, q4, q1
1428         vshr.u32        q4, q11, #17
1429         vadd.u32        q12, q12, q1
1430         veor.u32        q4, q4, q0
1431         vshr.u32        q0, q11, #19
1432         vshl.u32        q1, q11, #32-19
1433         veor.u32        q4, q4, q0
1434         vshr.u32        q0, q11, #10
1435         veor.u32        q4, q4, q1
1436         vst1.u32        {q12}, [r1]!
1437         veor.u32        q1, q4, q0
1438         
1439         vshr.u32        q4, q12, #17
1440         vshl.u32        q0, q12, #32-17
1441         vadd.u32        q13, q13, q1
1442         veor.u32        q4, q4, q0
1443         vshr.u32        q0, q12, #19
1444         vshl.u32        q1, q12, #32-19
1445         veor.u32        q4, q4, q0
1446         vst1.u32        {q13}, [r1]!
1447         veor.u32        q4, q4, q1
1448         vshr.u32        q1, q12, #10
1449         vshl.u32        q0, q13, #32-17
1450         veor.u32        q1, q4, q1
1451         vshr.u32        q4, q13, #17
1452         vadd.u32        q14, q14, q1
1453         veor.u32        q4, q4, q0
1454         vshr.u32        q0, q13, #19
1455         vshl.u32        q1, q13, #32-19
1456         veor.u32        q4, q4, q0
1457         vshr.u32        q0, q13, #10
1458         veor.u32        q4, q4, q1
1459         vst1.u32        {q14}, [r1]!
1460         veor.u32        q4, q4, q0
1461         vmov.u32        q6, #0x00000100
1462         vadd.u32        q15, q15, q4
1463         
1464         vshr.u32        q4, q14, #17
1465         vshl.u32        q0, q14, #32-17
1466         vmov.u32        q7, #0x00400000
1467         vst1.u32        {q15}, [r1]!
1468         veor.u32        q4, q4, q0
1469         vshr.u32        q0, q14, #19
1470         vshl.u32        q1, q14, #32-19
1471         veor.u32        q4, q4, q0
1472         vadd.u32        q9, q9, q7
1473         veor.u32        q4, q4, q1
1474         vshr.u32        q1, q14, #10
1475         vmov.u32        q2, #0x00000022
1476         veor.u32        q4, q4, q1
1477         vadd.u32        q9, q9, q2
1478         vld1.u32        {q5}, [r4]!
1479         vadd.u32        q9, q9, q4
1480         vshr.u32        q4, q15, #17
1481         vshl.u32        q0, q15, #32-17
1482         vadd.u32        q6, q6, q10
1483         vst1.u32        {q9}, [r1]!
1484         veor.u32        q4, q4, q0
1485         vshr.u32        q0, q15, #19
1486         vshl.u32        q1, q15, #32-19
1487         veor.u32        q4, q4, q0
1488         vshr.u32        q10, q5, #7
1489         veor.u32        q4, q4, q1
1490         vshl.u32        q0, q5, #32-7
1491         vshr.u32        q1, q15, #10
1492         veor.u32        q10, q10, q0
1493         vshr.u32        q0, q5, #18
1494         veor.u32        q4, q4, q1
1495         veor.u32        q10, q10, q0
1496         vshl.u32        q1, q5, #32-18
1497         vshr.u32        q0, q5, #3
1498         veor.u32        q10, q10, q1
1499         vadd.u32        q1, q6, q4
1500         veor.u32        q10, q10, q0
1501         vld1.u32        {q6}, [r4]!
1502         vadd.u32        q10, q10, q1
1503         
1504         b       sha256d_ms_4way_extend_loop2
1505         
1506         .align 4
1507 sha256d_ms_4way_4h:
1508         .long 0x6a09e667, 0x6a09e667, 0x6a09e667, 0x6a09e667
1509         .long 0xbb67ae85, 0xbb67ae85, 0xbb67ae85, 0xbb67ae85
1510         .long 0x3c6ef372, 0x3c6ef372, 0x3c6ef372, 0x3c6ef372
1511         .long 0xa54ff53a, 0xa54ff53a, 0xa54ff53a, 0xa54ff53a
1512         .long 0x510e527f, 0x510e527f, 0x510e527f, 0x510e527f
1513         .long 0x9b05688c, 0x9b05688c, 0x9b05688c, 0x9b05688c
1514         .long 0x1f83d9ab, 0x1f83d9ab, 0x1f83d9ab, 0x1f83d9ab
1515         .long 0x5be0cd19, 0x5be0cd19, 0x5be0cd19, 0x5be0cd19
1516         
1517 sha256d_ms_4way_extend_coda2:
1518         adr     r4, sha256d_ms_4way_4h
1519         mov     r1, sp
1520         vldmia  r4, {q0-q7}
1521         vmov.u32        q15, q7
1522         sub     r3, r3, #64*16
1523         b       sha256d_ms_4way_main_loop2
1524
1525 .macro sha256_4way_main_round_red i, rk, rw, rd, re, rf, rg, rh
1526         vld1.u32        {q8}, [\rw]!
1527         vand.u32        q9, \rf, \re
1528         vbic.u32        q10, \rg, \re
1529         vshr.u32        q11, \re, #5
1530         vorr.u32        q10, q10, q9
1531         vshl.u32        q12, \re, #32-5
1532         vadd.u32        \rh, \rh, q10
1533         veor.u32        q10, \re, q11
1534         vshr.u32        q11, \re, #19
1535         veor.u32        q10, q10, q12
1536         vshl.u32        q12, \re, #32-19
1537         veor.u32        q10, q10, q11
1538         vadd.u32        \rh, \rh, q8
1539         veor.u32        q10, q10, q12
1540         vld1.u32        {q9}, [\rk]!
1541         vadd.u32        \rh, \rh, \rd
1542         vshr.u32        q11, q10, #6
1543         vadd.u32        \rh, \rh, q9
1544         vshl.u32        q13, q10, #32-6
1545         vadd.u32        \rh, \rh, q11
1546         vadd.u32        \rh, \rh, q13
1547 .endm
1548
1549 sha256d_ms_4way_finish:
1550         sha256_4way_main_round_red 57, r3, r1, q2, q7, q4, q5, q6
1551         sha256_4way_main_round_red 58, r3, r1, q1, q6, q7, q4, q5
1552         sha256_4way_main_round_red 59, r3, r1, q0, q5, q6, q7, q4
1553         sha256_4way_main_round_red 60, r3, r1, q3, q4, q5, q6, q7
1554         
1555         vadd.u32        q7, q7, q15
1556         add     r0, r0, #7*16
1557         vst1.u32        {q7}, [r0]
1558         
1559         mov     sp, r12
1560         vpop    {q4-q7}
1561         ldmfd   sp!, {r4, pc}
1562
1563
1564         .text
1565         .code 32
1566         .align 2
1567         .globl sha256_use_4way
1568         .globl _sha256_use_4way
1569 #ifdef __ELF__
1570         .type sha256_use_4way, %function
1571 #endif
1572 sha256_use_4way:
1573 _sha256_use_4way:
1574         mov     r0, #1
1575         bx      lr
1576
1577 #endif