Bump version to 0.5.5
[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 .macro sha256_main_round_red i, ka, rw, rd, re, rf, rg, rh
231         ldr     r12, [\rw, #(\i)*4]
232         and     r3, \rf, \re
233         bic     lr, \rg, \re
234         add     \rh, \rh, \rd
235         orr     lr, lr, r3
236         ldr     r3, \ka + (\i)*4
237         add     \rh, \rh, lr
238         eor     lr, \re, \re, ror #5
239         add     \rh, \rh, r12
240         eor     lr, lr, \re, ror #19
241         add     \rh, \rh, r3
242         add     \rh, \rh, lr, ror #6
243 .endm
244         
245         .text
246         .code 32
247         .align 2
248         .globl sha256_init_4way
249         .globl _sha256_init_4way
250 #ifdef __ELF__
251         .type sha256_init_4way, %function
252 #endif
253 sha256_init_4way:
254 _sha256_init_4way:
255         adr     r12, sha256_4h
256         vldmia  r12, {q8-q15}
257         vstmia  r0, {q8-q15}
258         bx      lr
259         .align 4
260 sha256_4h:
261         .long 0x6a09e667, 0x6a09e667, 0x6a09e667, 0x6a09e667
262         .long 0xbb67ae85, 0xbb67ae85, 0xbb67ae85, 0xbb67ae85
263         .long 0x3c6ef372, 0x3c6ef372, 0x3c6ef372, 0x3c6ef372
264         .long 0xa54ff53a, 0xa54ff53a, 0xa54ff53a, 0xa54ff53a
265         .long 0x510e527f, 0x510e527f, 0x510e527f, 0x510e527f
266         .long 0x9b05688c, 0x9b05688c, 0x9b05688c, 0x9b05688c
267         .long 0x1f83d9ab, 0x1f83d9ab, 0x1f83d9ab, 0x1f83d9ab
268         .long 0x5be0cd19, 0x5be0cd19, 0x5be0cd19, 0x5be0cd19
269
270 .macro sha256_4k
271         .long 0x428a2f98, 0x428a2f98, 0x428a2f98, 0x428a2f98
272         .long 0x71374491, 0x71374491, 0x71374491, 0x71374491
273         .long 0xb5c0fbcf, 0xb5c0fbcf, 0xb5c0fbcf, 0xb5c0fbcf
274         .long 0xe9b5dba5, 0xe9b5dba5, 0xe9b5dba5, 0xe9b5dba5
275         .long 0x3956c25b, 0x3956c25b, 0x3956c25b, 0x3956c25b
276         .long 0x59f111f1, 0x59f111f1, 0x59f111f1, 0x59f111f1
277         .long 0x923f82a4, 0x923f82a4, 0x923f82a4, 0x923f82a4
278         .long 0xab1c5ed5, 0xab1c5ed5, 0xab1c5ed5, 0xab1c5ed5
279         .long 0xd807aa98, 0xd807aa98, 0xd807aa98, 0xd807aa98
280         .long 0x12835b01, 0x12835b01, 0x12835b01, 0x12835b01
281         .long 0x243185be, 0x243185be, 0x243185be, 0x243185be
282         .long 0x550c7dc3, 0x550c7dc3, 0x550c7dc3, 0x550c7dc3
283         .long 0x72be5d74, 0x72be5d74, 0x72be5d74, 0x72be5d74
284         .long 0x80deb1fe, 0x80deb1fe, 0x80deb1fe, 0x80deb1fe
285         .long 0x9bdc06a7, 0x9bdc06a7, 0x9bdc06a7, 0x9bdc06a7
286         .long 0xc19bf174, 0xc19bf174, 0xc19bf174, 0xc19bf174
287         .long 0xe49b69c1, 0xe49b69c1, 0xe49b69c1, 0xe49b69c1
288         .long 0xefbe4786, 0xefbe4786, 0xefbe4786, 0xefbe4786
289         .long 0x0fc19dc6, 0x0fc19dc6, 0x0fc19dc6, 0x0fc19dc6
290         .long 0x240ca1cc, 0x240ca1cc, 0x240ca1cc, 0x240ca1cc
291         .long 0x2de92c6f, 0x2de92c6f, 0x2de92c6f, 0x2de92c6f
292         .long 0x4a7484aa, 0x4a7484aa, 0x4a7484aa, 0x4a7484aa
293         .long 0x5cb0a9dc, 0x5cb0a9dc, 0x5cb0a9dc, 0x5cb0a9dc
294         .long 0x76f988da, 0x76f988da, 0x76f988da, 0x76f988da
295         .long 0x983e5152, 0x983e5152, 0x983e5152, 0x983e5152
296         .long 0xa831c66d, 0xa831c66d, 0xa831c66d, 0xa831c66d
297         .long 0xb00327c8, 0xb00327c8, 0xb00327c8, 0xb00327c8
298         .long 0xbf597fc7, 0xbf597fc7, 0xbf597fc7, 0xbf597fc7
299         .long 0xc6e00bf3, 0xc6e00bf3, 0xc6e00bf3, 0xc6e00bf3
300         .long 0xd5a79147, 0xd5a79147, 0xd5a79147, 0xd5a79147
301         .long 0x06ca6351, 0x06ca6351, 0x06ca6351, 0x06ca6351
302         .long 0x14292967, 0x14292967, 0x14292967, 0x14292967
303         .long 0x27b70a85, 0x27b70a85, 0x27b70a85, 0x27b70a85
304         .long 0x2e1b2138, 0x2e1b2138, 0x2e1b2138, 0x2e1b2138
305         .long 0x4d2c6dfc, 0x4d2c6dfc, 0x4d2c6dfc, 0x4d2c6dfc
306         .long 0x53380d13, 0x53380d13, 0x53380d13, 0x53380d13
307         .long 0x650a7354, 0x650a7354, 0x650a7354, 0x650a7354
308         .long 0x766a0abb, 0x766a0abb, 0x766a0abb, 0x766a0abb
309         .long 0x81c2c92e, 0x81c2c92e, 0x81c2c92e, 0x81c2c92e
310         .long 0x92722c85, 0x92722c85, 0x92722c85, 0x92722c85
311         .long 0xa2bfe8a1, 0xa2bfe8a1, 0xa2bfe8a1, 0xa2bfe8a1
312         .long 0xa81a664b, 0xa81a664b, 0xa81a664b, 0xa81a664b
313         .long 0xc24b8b70, 0xc24b8b70, 0xc24b8b70, 0xc24b8b70
314         .long 0xc76c51a3, 0xc76c51a3, 0xc76c51a3, 0xc76c51a3
315         .long 0xd192e819, 0xd192e819, 0xd192e819, 0xd192e819
316         .long 0xd6990624, 0xd6990624, 0xd6990624, 0xd6990624
317         .long 0xf40e3585, 0xf40e3585, 0xf40e3585, 0xf40e3585
318         .long 0x106aa070, 0x106aa070, 0x106aa070, 0x106aa070
319         .long 0x19a4c116, 0x19a4c116, 0x19a4c116, 0x19a4c116
320         .long 0x1e376c08, 0x1e376c08, 0x1e376c08, 0x1e376c08
321         .long 0x2748774c, 0x2748774c, 0x2748774c, 0x2748774c
322         .long 0x34b0bcb5, 0x34b0bcb5, 0x34b0bcb5, 0x34b0bcb5
323         .long 0x391c0cb3, 0x391c0cb3, 0x391c0cb3, 0x391c0cb3
324         .long 0x4ed8aa4a, 0x4ed8aa4a, 0x4ed8aa4a, 0x4ed8aa4a
325         .long 0x5b9cca4f, 0x5b9cca4f, 0x5b9cca4f, 0x5b9cca4f
326         .long 0x682e6ff3, 0x682e6ff3, 0x682e6ff3, 0x682e6ff3
327         .long 0x748f82ee, 0x748f82ee, 0x748f82ee, 0x748f82ee
328         .long 0x78a5636f, 0x78a5636f, 0x78a5636f, 0x78a5636f
329         .long 0x84c87814, 0x84c87814, 0x84c87814, 0x84c87814
330         .long 0x8cc70208, 0x8cc70208, 0x8cc70208, 0x8cc70208
331         .long 0x90befffa, 0x90befffa, 0x90befffa, 0x90befffa
332         .long 0xa4506ceb, 0xa4506ceb, 0xa4506ceb, 0xa4506ceb
333         .long 0xbef9a3f7, 0xbef9a3f7, 0xbef9a3f7, 0xbef9a3f7
334         .long 0xc67178f2, 0xc67178f2, 0xc67178f2, 0xc67178f2
335 .endm
336
337 .macro sha256_4way_extend_doubleround_core i, rr, rw, ra, rb, ry, rz
338         vadd.u32        q5, q5, \ra
339         veor.u32        q4, q4, q0
340         vshr.u32        q0, \ry, #19
341         vshl.u32        q1, \ry, #32-19
342         veor.u32        q4, q4, q0
343         vshr.u32        \ra, q6, #7
344         vshl.u32        q0, q6, #32-7
345         veor.u32        q4, q4, q1
346         veor.u32        \ra, \ra, q0
347         vshr.u32        q1, \ry, #10
348         vshr.u32        q0, q6, #18
349         veor.u32        q4, q4, q1
350         veor.u32        \ra, \ra, q0
351         vshl.u32        q1, q6, #32-18
352         vshr.u32        q0, q6, #3
353         veor.u32        \ra, \ra, q1
354         vadd.u32        q4, q4, q5
355         veor.u32        \ra, \ra, q0
356         vld1.u32        {q5}, [\rr]!
357         vadd.u32        \ra, \ra, q4
358
359         vshr.u32        q4, \rz, #17
360         vshl.u32        q0, \rz, #32-17
361         vadd.u32        q6, q6, \rb
362         vst1.u32        {\ra}, [\rw]!
363         veor.u32        q4, q4, q0
364         vshr.u32        q0, \rz, #19
365         vshl.u32        q1, \rz, #32-19
366         veor.u32        q4, q4, q0
367         vshr.u32        \rb, q5, #7
368         veor.u32        q4, q4, q1
369         vshl.u32        q0, q5, #32-7
370         vshr.u32        q1, \rz, #10
371         veor.u32        \rb, \rb, q0
372         vshr.u32        q0, q5, #18
373         veor.u32        q4, q4, q1
374         veor.u32        \rb, \rb, q0
375         vshl.u32        q1, q5, #32-18
376         vshr.u32        q0, q5, #3
377         veor.u32        \rb, \rb, q1
378         vadd.u32        q1, q6, q4
379         veor.u32        \rb, \rb, q0
380 .endm
381
382 .macro sha256_4way_extend_doubleround_head i, rr, rw, ra, rb, ry, rz
383         vld1.u32        {q6}, [\rr]!
384         vshr.u32        q4, \ry, #17
385         vshl.u32        q0, \ry, #32-17
386         sha256_4way_extend_doubleround_core \i, \rr, \rw, \ra, \rb, \ry, \rz
387         vld1.u32        {q6}, [\rr]!
388         vadd.u32        \rb, \rb, q1
389 .endm
390
391 .macro sha256_4way_extend_doubleround_body i, rr, rw, ra, rb, ry, rz
392         vshr.u32        q4, \ry, #17
393         vshl.u32        q0, \ry, #32-17
394         vst1.u32        {\rz}, [\rw]!
395         sha256_4way_extend_doubleround_core \i, \rr, \rw, \ra, \rb, \ry, \rz
396         vld1.u32        {q6}, [\rr]!
397         vadd.u32        \rb, \rb, q1
398 .endm
399
400 .macro sha256_4way_extend_doubleround_foot i, rr, rw, ra, rb, ry, rz
401         vshr.u32        q4, \ry, #17
402         vshl.u32        q0, \ry, #32-17
403         vst1.u32        {\rz}, [\rw]!
404         sha256_4way_extend_doubleround_core \i, \rr, \rw, \ra, \rb, \ry, \rz
405         vadd.u32        \rb, \rb, q1
406         vst1.u32        {\rb}, [\rw]!
407 .endm
408
409 .macro sha256_4way_main_round i, rk, rw, ra, rb, rc, rd, re, rf, rg, rh
410         vld1.u32        {q8}, [\rw]!
411         vand.u32        q9, \rf, \re
412         vbic.u32        q10, \rg, \re
413         vshr.u32        q11, \re, #5
414         vorr.u32        q10, q10, q9
415         vld1.u32        {q9}, [\rk]!
416         vadd.u32        \rh, \rh, q10
417         vshl.u32        q12, \re, #32-5
418         veor.u32        q10, \re, q11
419         vshr.u32        q11, \re, #19
420         veor.u32        q10, q10, q12
421         vshl.u32        q12, \re, #32-19
422         veor.u32        q10, q10, q11
423         vadd.u32        \rh, \rh, q8
424         veor.u32        q10, q10, q12
425         vadd.u32        \rh, \rh, q9
426         veor.u32        q9, \ra, \rb
427         vshr.u32        q11, q10, #6
428         vshl.u32        q13, q10, #32-6
429         vadd.u32        \rh, \rh, q11
430
431         vshr.u32        q11, \ra, #11
432         vshl.u32        q12, \ra, #32-11
433         veor.u32        q8, \ra, q11
434         vand.u32        q10, \ra, \rb
435         veor.u32        q8, q8, q12
436         vshr.u32        q11, \ra, #20
437         vshl.u32        q12, \ra, #32-20
438         veor.u32        q8, q8, q11
439         vand.u32        q9, q9, \rc
440         veor.u32        q8, q8, q12
441         vadd.u32        \rh, \rh, q13
442         veor.u32        q10, q10, q9
443         vshr.u32        q11, q8, #2
444         vshl.u32        q12, q8, #32-2
445         vadd.u32        q9, \rh, q10
446         vadd.u32        q12, q12, q11
447         vadd.u32        \rh, \rh, \rd
448         vadd.u32        \rd, q9, q12
449 .endm
450
451 .macro sha256_4way_main_quadround i, rk, rw
452         sha256_4way_main_round \i+0, \rk, \rw, q0, q1, q2, q3, q4, q5, q6, q7
453         sha256_4way_main_round \i+1, \rk, \rw, q3, q0, q1, q2, q7, q4, q5, q6
454         sha256_4way_main_round \i+2, \rk, \rw, q2, q3, q0, q1, q6, q7, q4, q5
455         sha256_4way_main_round \i+3, \rk, \rw, q1, q2, q3, q0, q5, q6, q7, q4
456 .endm
457
458
459         .text
460         .code 32
461         .align 2
462         .globl sha256_transform_4way
463         .globl _sha256_transform_4way
464 #ifdef __ELF__
465         .type sha256_transform_4way, %function
466 #endif
467 sha256_transform_4way:
468 _sha256_transform_4way:
469         stmfd   sp!, {r4, lr}
470         vpush   {q4-q7}
471         mov     r12, sp
472         sub     sp, sp, #64*16
473         bic     sp, sp, #63
474         cmp     r2, #0
475         bne     sha256_transform_4way_swap
476         
477         vldmia  r1!, {q0-q7}
478         vstmia  sp, {q0-q7}
479         add     r3, sp, #8*16
480         vldmia  r1, {q8-q15}
481         vstmia  r3, {q8-q15}
482         b       sha256_transform_4way_extend
483
484 sha256_transform_4way_swap:
485         vldmia  r1!, {q0-q7}
486         vrev32.8        q0, q0
487         vrev32.8        q1, q1
488         vrev32.8        q2, q2
489         vrev32.8        q3, q3
490         vldmia  r1, {q8-q15}
491         vrev32.8        q4, q4
492         vrev32.8        q5, q5
493         vrev32.8        q6, q6
494         vrev32.8        q7, q7
495         vstmia  sp, {q0-q7}
496         vrev32.8        q8, q8
497         vrev32.8        q9, q9
498         vrev32.8        q10, q10
499         vrev32.8        q11, q11
500         vrev32.8        q12, q12
501         vrev32.8        q13, q13
502         vrev32.8        q14, q14
503         vrev32.8        q15, q15
504         add     r3, sp, #8*16
505         vstmia  r3, {q8-q15}
506         
507 sha256_transform_4way_extend:
508         add     r1, sp, #1*16
509         add     r2, sp, #16*16
510         vmov.u32        q5, q0
511         sha256_4way_extend_doubleround_head  0, r1, r2,  q9, q10, q14, q15
512         sha256_4way_extend_doubleround_body  2, r1, r2, q11, q12,  q9, q10
513         sha256_4way_extend_doubleround_body  4, r1, r2, q13, q14, q11, q12
514         sha256_4way_extend_doubleround_body  6, r1, r2, q15,  q9, q13, q14
515         sha256_4way_extend_doubleround_body  8, r1, r2, q10, q11, q15,  q9
516         sha256_4way_extend_doubleround_body 10, r1, r2, q12, q13, q10, q11
517         sha256_4way_extend_doubleround_body 12, r1, r2, q14, q15, q12, q13
518         sha256_4way_extend_doubleround_body 14, r1, r2,  q9, q10, q14, q15
519         sha256_4way_extend_doubleround_body 16, r1, r2, q11, q12,  q9, q10
520         sha256_4way_extend_doubleround_body 18, r1, r2, q13, q14, q11, q12
521         sha256_4way_extend_doubleround_body 20, r1, r2, q15,  q9, q13, q14
522         sha256_4way_extend_doubleround_body 22, r1, r2, q10, q11, q15,  q9
523         sha256_4way_extend_doubleround_body 24, r1, r2, q12, q13, q10, q11
524         sha256_4way_extend_doubleround_body 26, r1, r2, q14, q15, q12, q13
525         sha256_4way_extend_doubleround_body 28, r1, r2,  q9, q10, q14, q15
526         sha256_4way_extend_doubleround_body 30, r1, r2, q11, q12,  q9, q10
527         sha256_4way_extend_doubleround_body 32, r1, r2, q13, q14, q11, q12
528         sha256_4way_extend_doubleround_body 34, r1, r2, q15,  q9, q13, q14
529         sha256_4way_extend_doubleround_body 36, r1, r2, q10, q11, q15,  q9
530         sha256_4way_extend_doubleround_body 38, r1, r2, q12, q13, q10, q11
531         sha256_4way_extend_doubleround_body 40, r1, r2, q14, q15, q12, q13
532         sha256_4way_extend_doubleround_body 42, r1, r2,  q9, q10, q14, q15
533         sha256_4way_extend_doubleround_body 44, r1, r2, q11, q12,  q9, q10
534         sha256_4way_extend_doubleround_foot 46, r1, r2, q13, q14, q11, q12
535         
536         vldmia  r0, {q0-q7}
537         adr     r4, sha256_transform_4way_4k
538         b       sha256_transform_4way_4k_over
539         .align 4
540 sha256_transform_4way_4k:
541         sha256_4k
542 sha256_transform_4way_4k_over:
543         sha256_4way_main_quadround  0, r4, sp
544         sha256_4way_main_quadround  4, r4, sp
545         sha256_4way_main_quadround  8, r4, sp
546         sha256_4way_main_quadround 12, r4, sp
547         sha256_4way_main_quadround 16, r4, sp
548         sha256_4way_main_quadround 20, r4, sp
549         sha256_4way_main_quadround 24, r4, sp
550         sha256_4way_main_quadround 28, r4, sp
551         sha256_4way_main_quadround 32, r4, sp
552         sha256_4way_main_quadround 36, r4, sp
553         sha256_4way_main_quadround 40, r4, sp
554         sha256_4way_main_quadround 44, r4, sp
555         sha256_4way_main_quadround 48, r4, sp
556         sha256_4way_main_quadround 52, r4, sp
557         sha256_4way_main_quadround 56, r4, sp
558         sha256_4way_main_quadround 60, r4, sp
559         
560         vldmia  r0, {q8-q15}
561         vadd.u32        q0, q0, q8
562         vadd.u32        q1, q1, q9
563         vadd.u32        q2, q2, q10
564         vadd.u32        q3, q3, q11
565         vadd.u32        q4, q4, q12
566         vadd.u32        q5, q5, q13
567         vadd.u32        q6, q6, q14
568         vadd.u32        q7, q7, q15
569         vstmia  r0, {q0-q7}
570         
571         mov     sp, r12
572         vpop    {q4-q7}
573         ldmfd   sp!, {r4, pc}
574         
575
576 .macro sha256_4way_main_round_red i, rk, rw, rd, re, rf, rg, rh
577         vld1.u32        {q8}, [\rw]!
578         vand.u32        q9, \rf, \re
579         vbic.u32        q10, \rg, \re
580         vshr.u32        q11, \re, #5
581         vorr.u32        q10, q10, q9
582         vshl.u32        q12, \re, #32-5
583         vadd.u32        \rh, \rh, q10
584         veor.u32        q10, \re, q11
585         vshr.u32        q11, \re, #19
586         veor.u32        q10, q10, q12
587         vshl.u32        q12, \re, #32-19
588         veor.u32        q10, q10, q11
589         vadd.u32        \rh, \rh, q8
590         veor.u32        q10, q10, q12
591         vld1.u32        {q9}, [\rk]!
592         vadd.u32        \rh, \rh, \rd
593         vshr.u32        q11, q10, #6
594         vadd.u32        \rh, \rh, q9
595         vshl.u32        q13, q10, #32-6
596         vadd.u32        \rh, \rh, q11
597         vadd.u32        \rh, \rh, q13
598 .endm
599
600         .text
601         .code 32
602         .align 2
603         .globl sha256_use_4way
604         .globl _sha256_use_4way
605 #ifdef __ELF__
606         .type sha256_use_4way, %function
607 #endif
608 sha256_use_4way:
609 _sha256_use_4way:
610         mov     r0, #1
611         bx      lr
612
613 #endif