OLD | NEW |
| (Empty) |
1 #if defined(__arm__) | |
2 | |
3 @ ==================================================================== | |
4 @ Written by Andy Polyakov <appro@openssl.org> for the OpenSSL | |
5 @ project. The module is, however, dual licensed under OpenSSL and | |
6 @ CRYPTOGAMS licenses depending on where you obtain it. For further | |
7 @ details see http://www.openssl.org/~appro/cryptogams/. | |
8 @ | |
9 @ Permission to use under GPL terms is granted. | |
10 @ ==================================================================== | |
11 | |
12 @ SHA512 block procedure for ARMv4. September 2007. | |
13 | |
14 @ This code is ~4.5 (four and a half) times faster than code generated | |
15 @ by gcc 3.4 and it spends ~72 clock cycles per byte [on single-issue | |
16 @ Xscale PXA250 core]. | |
17 @ | |
18 @ July 2010. | |
19 @ | |
20 @ Rescheduling for dual-issue pipeline resulted in 6% improvement on | |
21 @ Cortex A8 core and ~40 cycles per processed byte. | |
22 | |
23 @ February 2011. | |
24 @ | |
25 @ Profiler-assisted and platform-specific optimization resulted in 7% | |
26 @ improvement on Coxtex A8 core and ~38 cycles per byte. | |
27 | |
28 @ March 2011. | |
29 @ | |
30 @ Add NEON implementation. On Cortex A8 it was measured to process | |
31 @ one byte in 23.3 cycles or ~60% faster than integer-only code. | |
32 | |
33 @ August 2012. | |
34 @ | |
35 @ Improve NEON performance by 12% on Snapdragon S4. In absolute | |
36 @ terms it's 22.6 cycles per byte, which is disappointing result. | |
37 @ Technical writers asserted that 3-way S4 pipeline can sustain | |
38 @ multiple NEON instructions per cycle, but dual NEON issue could | |
39 @ not be observed, see http://www.openssl.org/~appro/Snapdragon-S4.html | |
40 @ for further details. On side note Cortex-A15 processes one byte in | |
41 @ 16 cycles. | |
42 | |
43 @ Byte order [in]dependence. ========================================= | |
44 @ | |
45 @ Originally caller was expected to maintain specific *dword* order in | |
46 @ h[0-7], namely with most significant dword at *lower* address, which | |
47 @ was reflected in below two parameters as 0 and 4. Now caller is | |
48 @ expected to maintain native byte order for whole 64-bit values. | |
49 #ifndef __KERNEL__ | |
50 # include <openssl/arm_arch.h> | |
51 # define VFP_ABI_PUSH vstmdb sp!,{d8-d15} | |
52 # define VFP_ABI_POP vldmia sp!,{d8-d15} | |
53 #else | |
54 # define __ARM_ARCH__ __LINUX_ARM_ARCH__ | |
55 # define __ARM_MAX_ARCH__ 7 | |
56 # define VFP_ABI_PUSH | |
57 # define VFP_ABI_POP | |
58 #endif | |
59 | |
60 #ifdef __ARMEL__ | |
61 # define LO 0 | |
62 # define HI 4 | |
63 # define WORD64(hi0,lo0,hi1,lo1) .word lo0,hi0, lo1,hi1 | |
64 #else | |
65 # define HI 0 | |
66 # define LO 4 | |
67 # define WORD64(hi0,lo0,hi1,lo1) .word hi0,lo0, hi1,lo1 | |
68 #endif | |
69 | |
70 .text | |
71 #if __ARM_ARCH__<7 || defined(__APPLE__) | |
72 .code 32 | |
73 #else | |
74 .syntax unified | |
75 # ifdef __thumb2__ | |
76 # define adrl adr | |
77 .thumb | |
78 # else | |
79 .code 32 | |
80 # endif | |
81 #endif | |
82 | |
83 .type K512,%object | |
84 .align 5 | |
85 K512: | |
86 WORD64(0x428a2f98,0xd728ae22, 0x71374491,0x23ef65cd) | |
87 WORD64(0xb5c0fbcf,0xec4d3b2f, 0xe9b5dba5,0x8189dbbc) | |
88 WORD64(0x3956c25b,0xf348b538, 0x59f111f1,0xb605d019) | |
89 WORD64(0x923f82a4,0xaf194f9b, 0xab1c5ed5,0xda6d8118) | |
90 WORD64(0xd807aa98,0xa3030242, 0x12835b01,0x45706fbe) | |
91 WORD64(0x243185be,0x4ee4b28c, 0x550c7dc3,0xd5ffb4e2) | |
92 WORD64(0x72be5d74,0xf27b896f, 0x80deb1fe,0x3b1696b1) | |
93 WORD64(0x9bdc06a7,0x25c71235, 0xc19bf174,0xcf692694) | |
94 WORD64(0xe49b69c1,0x9ef14ad2, 0xefbe4786,0x384f25e3) | |
95 WORD64(0x0fc19dc6,0x8b8cd5b5, 0x240ca1cc,0x77ac9c65) | |
96 WORD64(0x2de92c6f,0x592b0275, 0x4a7484aa,0x6ea6e483) | |
97 WORD64(0x5cb0a9dc,0xbd41fbd4, 0x76f988da,0x831153b5) | |
98 WORD64(0x983e5152,0xee66dfab, 0xa831c66d,0x2db43210) | |
99 WORD64(0xb00327c8,0x98fb213f, 0xbf597fc7,0xbeef0ee4) | |
100 WORD64(0xc6e00bf3,0x3da88fc2, 0xd5a79147,0x930aa725) | |
101 WORD64(0x06ca6351,0xe003826f, 0x14292967,0x0a0e6e70) | |
102 WORD64(0x27b70a85,0x46d22ffc, 0x2e1b2138,0x5c26c926) | |
103 WORD64(0x4d2c6dfc,0x5ac42aed, 0x53380d13,0x9d95b3df) | |
104 WORD64(0x650a7354,0x8baf63de, 0x766a0abb,0x3c77b2a8) | |
105 WORD64(0x81c2c92e,0x47edaee6, 0x92722c85,0x1482353b) | |
106 WORD64(0xa2bfe8a1,0x4cf10364, 0xa81a664b,0xbc423001) | |
107 WORD64(0xc24b8b70,0xd0f89791, 0xc76c51a3,0x0654be30) | |
108 WORD64(0xd192e819,0xd6ef5218, 0xd6990624,0x5565a910) | |
109 WORD64(0xf40e3585,0x5771202a, 0x106aa070,0x32bbd1b8) | |
110 WORD64(0x19a4c116,0xb8d2d0c8, 0x1e376c08,0x5141ab53) | |
111 WORD64(0x2748774c,0xdf8eeb99, 0x34b0bcb5,0xe19b48a8) | |
112 WORD64(0x391c0cb3,0xc5c95a63, 0x4ed8aa4a,0xe3418acb) | |
113 WORD64(0x5b9cca4f,0x7763e373, 0x682e6ff3,0xd6b2b8a3) | |
114 WORD64(0x748f82ee,0x5defb2fc, 0x78a5636f,0x43172f60) | |
115 WORD64(0x84c87814,0xa1f0ab72, 0x8cc70208,0x1a6439ec) | |
116 WORD64(0x90befffa,0x23631e28, 0xa4506ceb,0xde82bde9) | |
117 WORD64(0xbef9a3f7,0xb2c67915, 0xc67178f2,0xe372532b) | |
118 WORD64(0xca273ece,0xea26619c, 0xd186b8c7,0x21c0c207) | |
119 WORD64(0xeada7dd6,0xcde0eb1e, 0xf57d4f7f,0xee6ed178) | |
120 WORD64(0x06f067aa,0x72176fba, 0x0a637dc5,0xa2c898a6) | |
121 WORD64(0x113f9804,0xbef90dae, 0x1b710b35,0x131c471b) | |
122 WORD64(0x28db77f5,0x23047d84, 0x32caab7b,0x40c72493) | |
123 WORD64(0x3c9ebe0a,0x15c9bebc, 0x431d67c4,0x9c100d4c) | |
124 WORD64(0x4cc5d4be,0xcb3e42b6, 0x597f299c,0xfc657e2a) | |
125 WORD64(0x5fcb6fab,0x3ad6faec, 0x6c44198c,0x4a475817) | |
126 .size K512,.-K512 | |
127 #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) | |
128 .LOPENSSL_armcap: | |
129 .word OPENSSL_armcap_P-.Lsha512_block_data_order | |
130 .skip 32-4 | |
131 #else | |
132 .skip 32 | |
133 #endif | |
134 | |
135 .globl sha512_block_data_order | |
136 .hidden sha512_block_data_order | |
137 .type sha512_block_data_order,%function | |
138 sha512_block_data_order: | |
139 .Lsha512_block_data_order: | |
140 #if __ARM_ARCH__<7 | |
141 sub r3,pc,#8 @ sha512_block_data_order | |
142 #else | |
143 adr r3,sha512_block_data_order | |
144 #endif | |
145 #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) | |
146 ldr r12,.LOPENSSL_armcap | |
147 ldr r12,[r3,r12] @ OPENSSL_armcap_P | |
148 #ifdef __APPLE__ | |
149 ldr r12,[r12] | |
150 #endif | |
151 tst r12,#ARMV7_NEON | |
152 bne .LNEON | |
153 #endif | |
154 add r2,r1,r2,lsl#7 @ len to point at the end of inp | |
155 stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} | |
156 sub r14,r3,#672 @ K512 | |
157 sub sp,sp,#9*8 | |
158 | |
159 ldr r7,[r0,#32+LO] | |
160 ldr r8,[r0,#32+HI] | |
161 ldr r9, [r0,#48+LO] | |
162 ldr r10, [r0,#48+HI] | |
163 ldr r11, [r0,#56+LO] | |
164 ldr r12, [r0,#56+HI] | |
165 .Loop: | |
166 str r9, [sp,#48+0] | |
167 str r10, [sp,#48+4] | |
168 str r11, [sp,#56+0] | |
169 str r12, [sp,#56+4] | |
170 ldr r5,[r0,#0+LO] | |
171 ldr r6,[r0,#0+HI] | |
172 ldr r3,[r0,#8+LO] | |
173 ldr r4,[r0,#8+HI] | |
174 ldr r9, [r0,#16+LO] | |
175 ldr r10, [r0,#16+HI] | |
176 ldr r11, [r0,#24+LO] | |
177 ldr r12, [r0,#24+HI] | |
178 str r3,[sp,#8+0] | |
179 str r4,[sp,#8+4] | |
180 str r9, [sp,#16+0] | |
181 str r10, [sp,#16+4] | |
182 str r11, [sp,#24+0] | |
183 str r12, [sp,#24+4] | |
184 ldr r3,[r0,#40+LO] | |
185 ldr r4,[r0,#40+HI] | |
186 str r3,[sp,#40+0] | |
187 str r4,[sp,#40+4] | |
188 | |
189 .L00_15: | |
190 #if __ARM_ARCH__<7 | |
191 ldrb r3,[r1,#7] | |
192 ldrb r9, [r1,#6] | |
193 ldrb r10, [r1,#5] | |
194 ldrb r11, [r1,#4] | |
195 ldrb r4,[r1,#3] | |
196 ldrb r12, [r1,#2] | |
197 orr r3,r3,r9,lsl#8 | |
198 ldrb r9, [r1,#1] | |
199 orr r3,r3,r10,lsl#16 | |
200 ldrb r10, [r1],#8 | |
201 orr r3,r3,r11,lsl#24 | |
202 orr r4,r4,r12,lsl#8 | |
203 orr r4,r4,r9,lsl#16 | |
204 orr r4,r4,r10,lsl#24 | |
205 #else | |
206 ldr r3,[r1,#4] | |
207 ldr r4,[r1],#8 | |
208 #ifdef __ARMEL__ | |
209 rev r3,r3 | |
210 rev r4,r4 | |
211 #endif | |
212 #endif | |
213 @ Sigma1(x) (ROTR((x),14) ^ ROTR((x),18) ^ ROTR((x),41)) | |
214 @ LO lo>>14^hi<<18 ^ lo>>18^hi<<14 ^ hi>>9^lo<<23 | |
215 @ HI hi>>14^lo<<18 ^ hi>>18^lo<<14 ^ lo>>9^hi<<23 | |
216 mov r9,r7,lsr#14 | |
217 str r3,[sp,#64+0] | |
218 mov r10,r8,lsr#14 | |
219 str r4,[sp,#64+4] | |
220 eor r9,r9,r8,lsl#18 | |
221 ldr r11,[sp,#56+0] @ h.lo | |
222 eor r10,r10,r7,lsl#18 | |
223 ldr r12,[sp,#56+4] @ h.hi | |
224 eor r9,r9,r7,lsr#18 | |
225 eor r10,r10,r8,lsr#18 | |
226 eor r9,r9,r8,lsl#14 | |
227 eor r10,r10,r7,lsl#14 | |
228 eor r9,r9,r8,lsr#9 | |
229 eor r10,r10,r7,lsr#9 | |
230 eor r9,r9,r7,lsl#23 | |
231 eor r10,r10,r8,lsl#23 @ Sigma1(e) | |
232 adds r3,r3,r9 | |
233 ldr r9,[sp,#40+0] @ f.lo | |
234 adc r4,r4,r10 @ T += Sigma1(e) | |
235 ldr r10,[sp,#40+4] @ f.hi | |
236 adds r3,r3,r11 | |
237 ldr r11,[sp,#48+0] @ g.lo | |
238 adc r4,r4,r12 @ T += h | |
239 ldr r12,[sp,#48+4] @ g.hi | |
240 | |
241 eor r9,r9,r11 | |
242 str r7,[sp,#32+0] | |
243 eor r10,r10,r12 | |
244 str r8,[sp,#32+4] | |
245 and r9,r9,r7 | |
246 str r5,[sp,#0+0] | |
247 and r10,r10,r8 | |
248 str r6,[sp,#0+4] | |
249 eor r9,r9,r11 | |
250 ldr r11,[r14,#LO] @ K[i].lo | |
251 eor r10,r10,r12 @ Ch(e,f,g) | |
252 ldr r12,[r14,#HI] @ K[i].hi | |
253 | |
254 adds r3,r3,r9 | |
255 ldr r7,[sp,#24+0] @ d.lo | |
256 adc r4,r4,r10 @ T += Ch(e,f,g) | |
257 ldr r8,[sp,#24+4] @ d.hi | |
258 adds r3,r3,r11 | |
259 and r9,r11,#0xff | |
260 adc r4,r4,r12 @ T += K[i] | |
261 adds r7,r7,r3 | |
262 ldr r11,[sp,#8+0] @ b.lo | |
263 adc r8,r8,r4 @ d += T | |
264 teq r9,#148 | |
265 | |
266 ldr r12,[sp,#16+0] @ c.lo | |
267 #if __ARM_ARCH__>=7 | |
268 it eq @ Thumb2 thing, sanity check in ARM | |
269 #endif | |
270 orreq r14,r14,#1 | |
271 @ Sigma0(x) (ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39)) | |
272 @ LO lo>>28^hi<<4 ^ hi>>2^lo<<30 ^ hi>>7^lo<<25 | |
273 @ HI hi>>28^lo<<4 ^ lo>>2^hi<<30 ^ lo>>7^hi<<25 | |
274 mov r9,r5,lsr#28 | |
275 mov r10,r6,lsr#28 | |
276 eor r9,r9,r6,lsl#4 | |
277 eor r10,r10,r5,lsl#4 | |
278 eor r9,r9,r6,lsr#2 | |
279 eor r10,r10,r5,lsr#2 | |
280 eor r9,r9,r5,lsl#30 | |
281 eor r10,r10,r6,lsl#30 | |
282 eor r9,r9,r6,lsr#7 | |
283 eor r10,r10,r5,lsr#7 | |
284 eor r9,r9,r5,lsl#25 | |
285 eor r10,r10,r6,lsl#25 @ Sigma0(a) | |
286 adds r3,r3,r9 | |
287 and r9,r5,r11 | |
288 adc r4,r4,r10 @ T += Sigma0(a) | |
289 | |
290 ldr r10,[sp,#8+4] @ b.hi | |
291 orr r5,r5,r11 | |
292 ldr r11,[sp,#16+4] @ c.hi | |
293 and r5,r5,r12 | |
294 and r12,r6,r10 | |
295 orr r6,r6,r10 | |
296 orr r5,r5,r9 @ Maj(a,b,c).lo | |
297 and r6,r6,r11 | |
298 adds r5,r5,r3 | |
299 orr r6,r6,r12 @ Maj(a,b,c).hi | |
300 sub sp,sp,#8 | |
301 adc r6,r6,r4 @ h += T | |
302 tst r14,#1 | |
303 add r14,r14,#8 | |
304 tst r14,#1 | |
305 beq .L00_15 | |
306 ldr r9,[sp,#184+0] | |
307 ldr r10,[sp,#184+4] | |
308 bic r14,r14,#1 | |
309 .L16_79: | |
310 @ sigma0(x) (ROTR((x),1) ^ ROTR((x),8) ^ ((x)>>7)) | |
311 @ LO lo>>1^hi<<31 ^ lo>>8^hi<<24 ^ lo>>7^hi<<25 | |
312 @ HI hi>>1^lo<<31 ^ hi>>8^lo<<24 ^ hi>>7 | |
313 mov r3,r9,lsr#1 | |
314 ldr r11,[sp,#80+0] | |
315 mov r4,r10,lsr#1 | |
316 ldr r12,[sp,#80+4] | |
317 eor r3,r3,r10,lsl#31 | |
318 eor r4,r4,r9,lsl#31 | |
319 eor r3,r3,r9,lsr#8 | |
320 eor r4,r4,r10,lsr#8 | |
321 eor r3,r3,r10,lsl#24 | |
322 eor r4,r4,r9,lsl#24 | |
323 eor r3,r3,r9,lsr#7 | |
324 eor r4,r4,r10,lsr#7 | |
325 eor r3,r3,r10,lsl#25 | |
326 | |
327 @ sigma1(x) (ROTR((x),19) ^ ROTR((x),61) ^ ((x)>>6)) | |
328 @ LO lo>>19^hi<<13 ^ hi>>29^lo<<3 ^ lo>>6^hi<<26 | |
329 @ HI hi>>19^lo<<13 ^ lo>>29^hi<<3 ^ hi>>6 | |
330 mov r9,r11,lsr#19 | |
331 mov r10,r12,lsr#19 | |
332 eor r9,r9,r12,lsl#13 | |
333 eor r10,r10,r11,lsl#13 | |
334 eor r9,r9,r12,lsr#29 | |
335 eor r10,r10,r11,lsr#29 | |
336 eor r9,r9,r11,lsl#3 | |
337 eor r10,r10,r12,lsl#3 | |
338 eor r9,r9,r11,lsr#6 | |
339 eor r10,r10,r12,lsr#6 | |
340 ldr r11,[sp,#120+0] | |
341 eor r9,r9,r12,lsl#26 | |
342 | |
343 ldr r12,[sp,#120+4] | |
344 adds r3,r3,r9 | |
345 ldr r9,[sp,#192+0] | |
346 adc r4,r4,r10 | |
347 | |
348 ldr r10,[sp,#192+4] | |
349 adds r3,r3,r11 | |
350 adc r4,r4,r12 | |
351 adds r3,r3,r9 | |
352 adc r4,r4,r10 | |
353 @ Sigma1(x) (ROTR((x),14) ^ ROTR((x),18) ^ ROTR((x),41)) | |
354 @ LO lo>>14^hi<<18 ^ lo>>18^hi<<14 ^ hi>>9^lo<<23 | |
355 @ HI hi>>14^lo<<18 ^ hi>>18^lo<<14 ^ lo>>9^hi<<23 | |
356 mov r9,r7,lsr#14 | |
357 str r3,[sp,#64+0] | |
358 mov r10,r8,lsr#14 | |
359 str r4,[sp,#64+4] | |
360 eor r9,r9,r8,lsl#18 | |
361 ldr r11,[sp,#56+0] @ h.lo | |
362 eor r10,r10,r7,lsl#18 | |
363 ldr r12,[sp,#56+4] @ h.hi | |
364 eor r9,r9,r7,lsr#18 | |
365 eor r10,r10,r8,lsr#18 | |
366 eor r9,r9,r8,lsl#14 | |
367 eor r10,r10,r7,lsl#14 | |
368 eor r9,r9,r8,lsr#9 | |
369 eor r10,r10,r7,lsr#9 | |
370 eor r9,r9,r7,lsl#23 | |
371 eor r10,r10,r8,lsl#23 @ Sigma1(e) | |
372 adds r3,r3,r9 | |
373 ldr r9,[sp,#40+0] @ f.lo | |
374 adc r4,r4,r10 @ T += Sigma1(e) | |
375 ldr r10,[sp,#40+4] @ f.hi | |
376 adds r3,r3,r11 | |
377 ldr r11,[sp,#48+0] @ g.lo | |
378 adc r4,r4,r12 @ T += h | |
379 ldr r12,[sp,#48+4] @ g.hi | |
380 | |
381 eor r9,r9,r11 | |
382 str r7,[sp,#32+0] | |
383 eor r10,r10,r12 | |
384 str r8,[sp,#32+4] | |
385 and r9,r9,r7 | |
386 str r5,[sp,#0+0] | |
387 and r10,r10,r8 | |
388 str r6,[sp,#0+4] | |
389 eor r9,r9,r11 | |
390 ldr r11,[r14,#LO] @ K[i].lo | |
391 eor r10,r10,r12 @ Ch(e,f,g) | |
392 ldr r12,[r14,#HI] @ K[i].hi | |
393 | |
394 adds r3,r3,r9 | |
395 ldr r7,[sp,#24+0] @ d.lo | |
396 adc r4,r4,r10 @ T += Ch(e,f,g) | |
397 ldr r8,[sp,#24+4] @ d.hi | |
398 adds r3,r3,r11 | |
399 and r9,r11,#0xff | |
400 adc r4,r4,r12 @ T += K[i] | |
401 adds r7,r7,r3 | |
402 ldr r11,[sp,#8+0] @ b.lo | |
403 adc r8,r8,r4 @ d += T | |
404 teq r9,#23 | |
405 | |
406 ldr r12,[sp,#16+0] @ c.lo | |
407 #if __ARM_ARCH__>=7 | |
408 it eq @ Thumb2 thing, sanity check in ARM | |
409 #endif | |
410 orreq r14,r14,#1 | |
411 @ Sigma0(x) (ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39)) | |
412 @ LO lo>>28^hi<<4 ^ hi>>2^lo<<30 ^ hi>>7^lo<<25 | |
413 @ HI hi>>28^lo<<4 ^ lo>>2^hi<<30 ^ lo>>7^hi<<25 | |
414 mov r9,r5,lsr#28 | |
415 mov r10,r6,lsr#28 | |
416 eor r9,r9,r6,lsl#4 | |
417 eor r10,r10,r5,lsl#4 | |
418 eor r9,r9,r6,lsr#2 | |
419 eor r10,r10,r5,lsr#2 | |
420 eor r9,r9,r5,lsl#30 | |
421 eor r10,r10,r6,lsl#30 | |
422 eor r9,r9,r6,lsr#7 | |
423 eor r10,r10,r5,lsr#7 | |
424 eor r9,r9,r5,lsl#25 | |
425 eor r10,r10,r6,lsl#25 @ Sigma0(a) | |
426 adds r3,r3,r9 | |
427 and r9,r5,r11 | |
428 adc r4,r4,r10 @ T += Sigma0(a) | |
429 | |
430 ldr r10,[sp,#8+4] @ b.hi | |
431 orr r5,r5,r11 | |
432 ldr r11,[sp,#16+4] @ c.hi | |
433 and r5,r5,r12 | |
434 and r12,r6,r10 | |
435 orr r6,r6,r10 | |
436 orr r5,r5,r9 @ Maj(a,b,c).lo | |
437 and r6,r6,r11 | |
438 adds r5,r5,r3 | |
439 orr r6,r6,r12 @ Maj(a,b,c).hi | |
440 sub sp,sp,#8 | |
441 adc r6,r6,r4 @ h += T | |
442 tst r14,#1 | |
443 add r14,r14,#8 | |
444 #if __ARM_ARCH__>=7 | |
445 ittt eq @ Thumb2 thing, sanity check in ARM | |
446 #endif | |
447 ldreq r9,[sp,#184+0] | |
448 ldreq r10,[sp,#184+4] | |
449 beq .L16_79 | |
450 bic r14,r14,#1 | |
451 | |
452 ldr r3,[sp,#8+0] | |
453 ldr r4,[sp,#8+4] | |
454 ldr r9, [r0,#0+LO] | |
455 ldr r10, [r0,#0+HI] | |
456 ldr r11, [r0,#8+LO] | |
457 ldr r12, [r0,#8+HI] | |
458 adds r9,r5,r9 | |
459 str r9, [r0,#0+LO] | |
460 adc r10,r6,r10 | |
461 str r10, [r0,#0+HI] | |
462 adds r11,r3,r11 | |
463 str r11, [r0,#8+LO] | |
464 adc r12,r4,r12 | |
465 str r12, [r0,#8+HI] | |
466 | |
467 ldr r5,[sp,#16+0] | |
468 ldr r6,[sp,#16+4] | |
469 ldr r3,[sp,#24+0] | |
470 ldr r4,[sp,#24+4] | |
471 ldr r9, [r0,#16+LO] | |
472 ldr r10, [r0,#16+HI] | |
473 ldr r11, [r0,#24+LO] | |
474 ldr r12, [r0,#24+HI] | |
475 adds r9,r5,r9 | |
476 str r9, [r0,#16+LO] | |
477 adc r10,r6,r10 | |
478 str r10, [r0,#16+HI] | |
479 adds r11,r3,r11 | |
480 str r11, [r0,#24+LO] | |
481 adc r12,r4,r12 | |
482 str r12, [r0,#24+HI] | |
483 | |
484 ldr r3,[sp,#40+0] | |
485 ldr r4,[sp,#40+4] | |
486 ldr r9, [r0,#32+LO] | |
487 ldr r10, [r0,#32+HI] | |
488 ldr r11, [r0,#40+LO] | |
489 ldr r12, [r0,#40+HI] | |
490 adds r7,r7,r9 | |
491 str r7,[r0,#32+LO] | |
492 adc r8,r8,r10 | |
493 str r8,[r0,#32+HI] | |
494 adds r11,r3,r11 | |
495 str r11, [r0,#40+LO] | |
496 adc r12,r4,r12 | |
497 str r12, [r0,#40+HI] | |
498 | |
499 ldr r5,[sp,#48+0] | |
500 ldr r6,[sp,#48+4] | |
501 ldr r3,[sp,#56+0] | |
502 ldr r4,[sp,#56+4] | |
503 ldr r9, [r0,#48+LO] | |
504 ldr r10, [r0,#48+HI] | |
505 ldr r11, [r0,#56+LO] | |
506 ldr r12, [r0,#56+HI] | |
507 adds r9,r5,r9 | |
508 str r9, [r0,#48+LO] | |
509 adc r10,r6,r10 | |
510 str r10, [r0,#48+HI] | |
511 adds r11,r3,r11 | |
512 str r11, [r0,#56+LO] | |
513 adc r12,r4,r12 | |
514 str r12, [r0,#56+HI] | |
515 | |
516 add sp,sp,#640 | |
517 sub r14,r14,#640 | |
518 | |
519 teq r1,r2 | |
520 bne .Loop | |
521 | |
522 add sp,sp,#8*9 @ destroy frame | |
523 #if __ARM_ARCH__>=5 | |
524 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc} | |
525 #else | |
526 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} | |
527 tst lr,#1 | |
528 moveq pc,lr @ be binary compatible with V4, yet | |
529 .word 0xe12fff1e @ interoperable with Thumb ISA:-) | |
530 #endif | |
531 .size sha512_block_data_order,.-sha512_block_data_order | |
532 #if __ARM_MAX_ARCH__>=7 | |
533 .arch armv7-a | |
534 .fpu neon | |
535 | |
536 .globl sha512_block_data_order_neon | |
537 .hidden sha512_block_data_order_neon | |
538 .type sha512_block_data_order_neon,%function | |
539 .align 4 | |
540 sha512_block_data_order_neon: | |
541 .LNEON: | |
542 dmb @ errata #451034 on early Cortex A8 | |
543 add r2,r1,r2,lsl#7 @ len to point at the end of inp | |
544 adr r3,K512 | |
545 VFP_ABI_PUSH | |
546 vldmia r0,{d16,d17,d18,d19,d20,d21,d22,d23} @ load context | |
547 .Loop_neon: | |
548 vshr.u64 d24,d20,#14 @ 0 | |
549 #if 0<16 | |
550 vld1.64 {d0},[r1]! @ handles unaligned | |
551 #endif | |
552 vshr.u64 d25,d20,#18 | |
553 #if 0>0 | |
554 vadd.i64 d16,d30 @ h+=Maj from the past | |
555 #endif | |
556 vshr.u64 d26,d20,#41 | |
557 vld1.64 {d28},[r3,:64]! @ K[i++] | |
558 vsli.64 d24,d20,#50 | |
559 vsli.64 d25,d20,#46 | |
560 vmov d29,d20 | |
561 vsli.64 d26,d20,#23 | |
562 #if 0<16 && defined(__ARMEL__) | |
563 vrev64.8 d0,d0 | |
564 #endif | |
565 veor d25,d24 | |
566 vbsl d29,d21,d22 @ Ch(e,f,g) | |
567 vshr.u64 d24,d16,#28 | |
568 veor d26,d25 @ Sigma1(e) | |
569 vadd.i64 d27,d29,d23 | |
570 vshr.u64 d25,d16,#34 | |
571 vsli.64 d24,d16,#36 | |
572 vadd.i64 d27,d26 | |
573 vshr.u64 d26,d16,#39 | |
574 vadd.i64 d28,d0 | |
575 vsli.64 d25,d16,#30 | |
576 veor d30,d16,d17 | |
577 vsli.64 d26,d16,#25 | |
578 veor d23,d24,d25 | |
579 vadd.i64 d27,d28 | |
580 vbsl d30,d18,d17 @ Maj(a,b,c) | |
581 veor d23,d26 @ Sigma0(a) | |
582 vadd.i64 d19,d27 | |
583 vadd.i64 d30,d27 | |
584 @ vadd.i64 d23,d30 | |
585 vshr.u64 d24,d19,#14 @ 1 | |
586 #if 1<16 | |
587 vld1.64 {d1},[r1]! @ handles unaligned | |
588 #endif | |
589 vshr.u64 d25,d19,#18 | |
590 #if 1>0 | |
591 vadd.i64 d23,d30 @ h+=Maj from the past | |
592 #endif | |
593 vshr.u64 d26,d19,#41 | |
594 vld1.64 {d28},[r3,:64]! @ K[i++] | |
595 vsli.64 d24,d19,#50 | |
596 vsli.64 d25,d19,#46 | |
597 vmov d29,d19 | |
598 vsli.64 d26,d19,#23 | |
599 #if 1<16 && defined(__ARMEL__) | |
600 vrev64.8 d1,d1 | |
601 #endif | |
602 veor d25,d24 | |
603 vbsl d29,d20,d21 @ Ch(e,f,g) | |
604 vshr.u64 d24,d23,#28 | |
605 veor d26,d25 @ Sigma1(e) | |
606 vadd.i64 d27,d29,d22 | |
607 vshr.u64 d25,d23,#34 | |
608 vsli.64 d24,d23,#36 | |
609 vadd.i64 d27,d26 | |
610 vshr.u64 d26,d23,#39 | |
611 vadd.i64 d28,d1 | |
612 vsli.64 d25,d23,#30 | |
613 veor d30,d23,d16 | |
614 vsli.64 d26,d23,#25 | |
615 veor d22,d24,d25 | |
616 vadd.i64 d27,d28 | |
617 vbsl d30,d17,d16 @ Maj(a,b,c) | |
618 veor d22,d26 @ Sigma0(a) | |
619 vadd.i64 d18,d27 | |
620 vadd.i64 d30,d27 | |
621 @ vadd.i64 d22,d30 | |
622 vshr.u64 d24,d18,#14 @ 2 | |
623 #if 2<16 | |
624 vld1.64 {d2},[r1]! @ handles unaligned | |
625 #endif | |
626 vshr.u64 d25,d18,#18 | |
627 #if 2>0 | |
628 vadd.i64 d22,d30 @ h+=Maj from the past | |
629 #endif | |
630 vshr.u64 d26,d18,#41 | |
631 vld1.64 {d28},[r3,:64]! @ K[i++] | |
632 vsli.64 d24,d18,#50 | |
633 vsli.64 d25,d18,#46 | |
634 vmov d29,d18 | |
635 vsli.64 d26,d18,#23 | |
636 #if 2<16 && defined(__ARMEL__) | |
637 vrev64.8 d2,d2 | |
638 #endif | |
639 veor d25,d24 | |
640 vbsl d29,d19,d20 @ Ch(e,f,g) | |
641 vshr.u64 d24,d22,#28 | |
642 veor d26,d25 @ Sigma1(e) | |
643 vadd.i64 d27,d29,d21 | |
644 vshr.u64 d25,d22,#34 | |
645 vsli.64 d24,d22,#36 | |
646 vadd.i64 d27,d26 | |
647 vshr.u64 d26,d22,#39 | |
648 vadd.i64 d28,d2 | |
649 vsli.64 d25,d22,#30 | |
650 veor d30,d22,d23 | |
651 vsli.64 d26,d22,#25 | |
652 veor d21,d24,d25 | |
653 vadd.i64 d27,d28 | |
654 vbsl d30,d16,d23 @ Maj(a,b,c) | |
655 veor d21,d26 @ Sigma0(a) | |
656 vadd.i64 d17,d27 | |
657 vadd.i64 d30,d27 | |
658 @ vadd.i64 d21,d30 | |
659 vshr.u64 d24,d17,#14 @ 3 | |
660 #if 3<16 | |
661 vld1.64 {d3},[r1]! @ handles unaligned | |
662 #endif | |
663 vshr.u64 d25,d17,#18 | |
664 #if 3>0 | |
665 vadd.i64 d21,d30 @ h+=Maj from the past | |
666 #endif | |
667 vshr.u64 d26,d17,#41 | |
668 vld1.64 {d28},[r3,:64]! @ K[i++] | |
669 vsli.64 d24,d17,#50 | |
670 vsli.64 d25,d17,#46 | |
671 vmov d29,d17 | |
672 vsli.64 d26,d17,#23 | |
673 #if 3<16 && defined(__ARMEL__) | |
674 vrev64.8 d3,d3 | |
675 #endif | |
676 veor d25,d24 | |
677 vbsl d29,d18,d19 @ Ch(e,f,g) | |
678 vshr.u64 d24,d21,#28 | |
679 veor d26,d25 @ Sigma1(e) | |
680 vadd.i64 d27,d29,d20 | |
681 vshr.u64 d25,d21,#34 | |
682 vsli.64 d24,d21,#36 | |
683 vadd.i64 d27,d26 | |
684 vshr.u64 d26,d21,#39 | |
685 vadd.i64 d28,d3 | |
686 vsli.64 d25,d21,#30 | |
687 veor d30,d21,d22 | |
688 vsli.64 d26,d21,#25 | |
689 veor d20,d24,d25 | |
690 vadd.i64 d27,d28 | |
691 vbsl d30,d23,d22 @ Maj(a,b,c) | |
692 veor d20,d26 @ Sigma0(a) | |
693 vadd.i64 d16,d27 | |
694 vadd.i64 d30,d27 | |
695 @ vadd.i64 d20,d30 | |
696 vshr.u64 d24,d16,#14 @ 4 | |
697 #if 4<16 | |
698 vld1.64 {d4},[r1]! @ handles unaligned | |
699 #endif | |
700 vshr.u64 d25,d16,#18 | |
701 #if 4>0 | |
702 vadd.i64 d20,d30 @ h+=Maj from the past | |
703 #endif | |
704 vshr.u64 d26,d16,#41 | |
705 vld1.64 {d28},[r3,:64]! @ K[i++] | |
706 vsli.64 d24,d16,#50 | |
707 vsli.64 d25,d16,#46 | |
708 vmov d29,d16 | |
709 vsli.64 d26,d16,#23 | |
710 #if 4<16 && defined(__ARMEL__) | |
711 vrev64.8 d4,d4 | |
712 #endif | |
713 veor d25,d24 | |
714 vbsl d29,d17,d18 @ Ch(e,f,g) | |
715 vshr.u64 d24,d20,#28 | |
716 veor d26,d25 @ Sigma1(e) | |
717 vadd.i64 d27,d29,d19 | |
718 vshr.u64 d25,d20,#34 | |
719 vsli.64 d24,d20,#36 | |
720 vadd.i64 d27,d26 | |
721 vshr.u64 d26,d20,#39 | |
722 vadd.i64 d28,d4 | |
723 vsli.64 d25,d20,#30 | |
724 veor d30,d20,d21 | |
725 vsli.64 d26,d20,#25 | |
726 veor d19,d24,d25 | |
727 vadd.i64 d27,d28 | |
728 vbsl d30,d22,d21 @ Maj(a,b,c) | |
729 veor d19,d26 @ Sigma0(a) | |
730 vadd.i64 d23,d27 | |
731 vadd.i64 d30,d27 | |
732 @ vadd.i64 d19,d30 | |
733 vshr.u64 d24,d23,#14 @ 5 | |
734 #if 5<16 | |
735 vld1.64 {d5},[r1]! @ handles unaligned | |
736 #endif | |
737 vshr.u64 d25,d23,#18 | |
738 #if 5>0 | |
739 vadd.i64 d19,d30 @ h+=Maj from the past | |
740 #endif | |
741 vshr.u64 d26,d23,#41 | |
742 vld1.64 {d28},[r3,:64]! @ K[i++] | |
743 vsli.64 d24,d23,#50 | |
744 vsli.64 d25,d23,#46 | |
745 vmov d29,d23 | |
746 vsli.64 d26,d23,#23 | |
747 #if 5<16 && defined(__ARMEL__) | |
748 vrev64.8 d5,d5 | |
749 #endif | |
750 veor d25,d24 | |
751 vbsl d29,d16,d17 @ Ch(e,f,g) | |
752 vshr.u64 d24,d19,#28 | |
753 veor d26,d25 @ Sigma1(e) | |
754 vadd.i64 d27,d29,d18 | |
755 vshr.u64 d25,d19,#34 | |
756 vsli.64 d24,d19,#36 | |
757 vadd.i64 d27,d26 | |
758 vshr.u64 d26,d19,#39 | |
759 vadd.i64 d28,d5 | |
760 vsli.64 d25,d19,#30 | |
761 veor d30,d19,d20 | |
762 vsli.64 d26,d19,#25 | |
763 veor d18,d24,d25 | |
764 vadd.i64 d27,d28 | |
765 vbsl d30,d21,d20 @ Maj(a,b,c) | |
766 veor d18,d26 @ Sigma0(a) | |
767 vadd.i64 d22,d27 | |
768 vadd.i64 d30,d27 | |
769 @ vadd.i64 d18,d30 | |
770 vshr.u64 d24,d22,#14 @ 6 | |
771 #if 6<16 | |
772 vld1.64 {d6},[r1]! @ handles unaligned | |
773 #endif | |
774 vshr.u64 d25,d22,#18 | |
775 #if 6>0 | |
776 vadd.i64 d18,d30 @ h+=Maj from the past | |
777 #endif | |
778 vshr.u64 d26,d22,#41 | |
779 vld1.64 {d28},[r3,:64]! @ K[i++] | |
780 vsli.64 d24,d22,#50 | |
781 vsli.64 d25,d22,#46 | |
782 vmov d29,d22 | |
783 vsli.64 d26,d22,#23 | |
784 #if 6<16 && defined(__ARMEL__) | |
785 vrev64.8 d6,d6 | |
786 #endif | |
787 veor d25,d24 | |
788 vbsl d29,d23,d16 @ Ch(e,f,g) | |
789 vshr.u64 d24,d18,#28 | |
790 veor d26,d25 @ Sigma1(e) | |
791 vadd.i64 d27,d29,d17 | |
792 vshr.u64 d25,d18,#34 | |
793 vsli.64 d24,d18,#36 | |
794 vadd.i64 d27,d26 | |
795 vshr.u64 d26,d18,#39 | |
796 vadd.i64 d28,d6 | |
797 vsli.64 d25,d18,#30 | |
798 veor d30,d18,d19 | |
799 vsli.64 d26,d18,#25 | |
800 veor d17,d24,d25 | |
801 vadd.i64 d27,d28 | |
802 vbsl d30,d20,d19 @ Maj(a,b,c) | |
803 veor d17,d26 @ Sigma0(a) | |
804 vadd.i64 d21,d27 | |
805 vadd.i64 d30,d27 | |
806 @ vadd.i64 d17,d30 | |
807 vshr.u64 d24,d21,#14 @ 7 | |
808 #if 7<16 | |
809 vld1.64 {d7},[r1]! @ handles unaligned | |
810 #endif | |
811 vshr.u64 d25,d21,#18 | |
812 #if 7>0 | |
813 vadd.i64 d17,d30 @ h+=Maj from the past | |
814 #endif | |
815 vshr.u64 d26,d21,#41 | |
816 vld1.64 {d28},[r3,:64]! @ K[i++] | |
817 vsli.64 d24,d21,#50 | |
818 vsli.64 d25,d21,#46 | |
819 vmov d29,d21 | |
820 vsli.64 d26,d21,#23 | |
821 #if 7<16 && defined(__ARMEL__) | |
822 vrev64.8 d7,d7 | |
823 #endif | |
824 veor d25,d24 | |
825 vbsl d29,d22,d23 @ Ch(e,f,g) | |
826 vshr.u64 d24,d17,#28 | |
827 veor d26,d25 @ Sigma1(e) | |
828 vadd.i64 d27,d29,d16 | |
829 vshr.u64 d25,d17,#34 | |
830 vsli.64 d24,d17,#36 | |
831 vadd.i64 d27,d26 | |
832 vshr.u64 d26,d17,#39 | |
833 vadd.i64 d28,d7 | |
834 vsli.64 d25,d17,#30 | |
835 veor d30,d17,d18 | |
836 vsli.64 d26,d17,#25 | |
837 veor d16,d24,d25 | |
838 vadd.i64 d27,d28 | |
839 vbsl d30,d19,d18 @ Maj(a,b,c) | |
840 veor d16,d26 @ Sigma0(a) | |
841 vadd.i64 d20,d27 | |
842 vadd.i64 d30,d27 | |
843 @ vadd.i64 d16,d30 | |
844 vshr.u64 d24,d20,#14 @ 8 | |
845 #if 8<16 | |
846 vld1.64 {d8},[r1]! @ handles unaligned | |
847 #endif | |
848 vshr.u64 d25,d20,#18 | |
849 #if 8>0 | |
850 vadd.i64 d16,d30 @ h+=Maj from the past | |
851 #endif | |
852 vshr.u64 d26,d20,#41 | |
853 vld1.64 {d28},[r3,:64]! @ K[i++] | |
854 vsli.64 d24,d20,#50 | |
855 vsli.64 d25,d20,#46 | |
856 vmov d29,d20 | |
857 vsli.64 d26,d20,#23 | |
858 #if 8<16 && defined(__ARMEL__) | |
859 vrev64.8 d8,d8 | |
860 #endif | |
861 veor d25,d24 | |
862 vbsl d29,d21,d22 @ Ch(e,f,g) | |
863 vshr.u64 d24,d16,#28 | |
864 veor d26,d25 @ Sigma1(e) | |
865 vadd.i64 d27,d29,d23 | |
866 vshr.u64 d25,d16,#34 | |
867 vsli.64 d24,d16,#36 | |
868 vadd.i64 d27,d26 | |
869 vshr.u64 d26,d16,#39 | |
870 vadd.i64 d28,d8 | |
871 vsli.64 d25,d16,#30 | |
872 veor d30,d16,d17 | |
873 vsli.64 d26,d16,#25 | |
874 veor d23,d24,d25 | |
875 vadd.i64 d27,d28 | |
876 vbsl d30,d18,d17 @ Maj(a,b,c) | |
877 veor d23,d26 @ Sigma0(a) | |
878 vadd.i64 d19,d27 | |
879 vadd.i64 d30,d27 | |
880 @ vadd.i64 d23,d30 | |
881 vshr.u64 d24,d19,#14 @ 9 | |
882 #if 9<16 | |
883 vld1.64 {d9},[r1]! @ handles unaligned | |
884 #endif | |
885 vshr.u64 d25,d19,#18 | |
886 #if 9>0 | |
887 vadd.i64 d23,d30 @ h+=Maj from the past | |
888 #endif | |
889 vshr.u64 d26,d19,#41 | |
890 vld1.64 {d28},[r3,:64]! @ K[i++] | |
891 vsli.64 d24,d19,#50 | |
892 vsli.64 d25,d19,#46 | |
893 vmov d29,d19 | |
894 vsli.64 d26,d19,#23 | |
895 #if 9<16 && defined(__ARMEL__) | |
896 vrev64.8 d9,d9 | |
897 #endif | |
898 veor d25,d24 | |
899 vbsl d29,d20,d21 @ Ch(e,f,g) | |
900 vshr.u64 d24,d23,#28 | |
901 veor d26,d25 @ Sigma1(e) | |
902 vadd.i64 d27,d29,d22 | |
903 vshr.u64 d25,d23,#34 | |
904 vsli.64 d24,d23,#36 | |
905 vadd.i64 d27,d26 | |
906 vshr.u64 d26,d23,#39 | |
907 vadd.i64 d28,d9 | |
908 vsli.64 d25,d23,#30 | |
909 veor d30,d23,d16 | |
910 vsli.64 d26,d23,#25 | |
911 veor d22,d24,d25 | |
912 vadd.i64 d27,d28 | |
913 vbsl d30,d17,d16 @ Maj(a,b,c) | |
914 veor d22,d26 @ Sigma0(a) | |
915 vadd.i64 d18,d27 | |
916 vadd.i64 d30,d27 | |
917 @ vadd.i64 d22,d30 | |
918 vshr.u64 d24,d18,#14 @ 10 | |
919 #if 10<16 | |
920 vld1.64 {d10},[r1]! @ handles unaligned | |
921 #endif | |
922 vshr.u64 d25,d18,#18 | |
923 #if 10>0 | |
924 vadd.i64 d22,d30 @ h+=Maj from the past | |
925 #endif | |
926 vshr.u64 d26,d18,#41 | |
927 vld1.64 {d28},[r3,:64]! @ K[i++] | |
928 vsli.64 d24,d18,#50 | |
929 vsli.64 d25,d18,#46 | |
930 vmov d29,d18 | |
931 vsli.64 d26,d18,#23 | |
932 #if 10<16 && defined(__ARMEL__) | |
933 vrev64.8 d10,d10 | |
934 #endif | |
935 veor d25,d24 | |
936 vbsl d29,d19,d20 @ Ch(e,f,g) | |
937 vshr.u64 d24,d22,#28 | |
938 veor d26,d25 @ Sigma1(e) | |
939 vadd.i64 d27,d29,d21 | |
940 vshr.u64 d25,d22,#34 | |
941 vsli.64 d24,d22,#36 | |
942 vadd.i64 d27,d26 | |
943 vshr.u64 d26,d22,#39 | |
944 vadd.i64 d28,d10 | |
945 vsli.64 d25,d22,#30 | |
946 veor d30,d22,d23 | |
947 vsli.64 d26,d22,#25 | |
948 veor d21,d24,d25 | |
949 vadd.i64 d27,d28 | |
950 vbsl d30,d16,d23 @ Maj(a,b,c) | |
951 veor d21,d26 @ Sigma0(a) | |
952 vadd.i64 d17,d27 | |
953 vadd.i64 d30,d27 | |
954 @ vadd.i64 d21,d30 | |
955 vshr.u64 d24,d17,#14 @ 11 | |
956 #if 11<16 | |
957 vld1.64 {d11},[r1]! @ handles unaligned | |
958 #endif | |
959 vshr.u64 d25,d17,#18 | |
960 #if 11>0 | |
961 vadd.i64 d21,d30 @ h+=Maj from the past | |
962 #endif | |
963 vshr.u64 d26,d17,#41 | |
964 vld1.64 {d28},[r3,:64]! @ K[i++] | |
965 vsli.64 d24,d17,#50 | |
966 vsli.64 d25,d17,#46 | |
967 vmov d29,d17 | |
968 vsli.64 d26,d17,#23 | |
969 #if 11<16 && defined(__ARMEL__) | |
970 vrev64.8 d11,d11 | |
971 #endif | |
972 veor d25,d24 | |
973 vbsl d29,d18,d19 @ Ch(e,f,g) | |
974 vshr.u64 d24,d21,#28 | |
975 veor d26,d25 @ Sigma1(e) | |
976 vadd.i64 d27,d29,d20 | |
977 vshr.u64 d25,d21,#34 | |
978 vsli.64 d24,d21,#36 | |
979 vadd.i64 d27,d26 | |
980 vshr.u64 d26,d21,#39 | |
981 vadd.i64 d28,d11 | |
982 vsli.64 d25,d21,#30 | |
983 veor d30,d21,d22 | |
984 vsli.64 d26,d21,#25 | |
985 veor d20,d24,d25 | |
986 vadd.i64 d27,d28 | |
987 vbsl d30,d23,d22 @ Maj(a,b,c) | |
988 veor d20,d26 @ Sigma0(a) | |
989 vadd.i64 d16,d27 | |
990 vadd.i64 d30,d27 | |
991 @ vadd.i64 d20,d30 | |
992 vshr.u64 d24,d16,#14 @ 12 | |
993 #if 12<16 | |
994 vld1.64 {d12},[r1]! @ handles unaligned | |
995 #endif | |
996 vshr.u64 d25,d16,#18 | |
997 #if 12>0 | |
998 vadd.i64 d20,d30 @ h+=Maj from the past | |
999 #endif | |
1000 vshr.u64 d26,d16,#41 | |
1001 vld1.64 {d28},[r3,:64]! @ K[i++] | |
1002 vsli.64 d24,d16,#50 | |
1003 vsli.64 d25,d16,#46 | |
1004 vmov d29,d16 | |
1005 vsli.64 d26,d16,#23 | |
1006 #if 12<16 && defined(__ARMEL__) | |
1007 vrev64.8 d12,d12 | |
1008 #endif | |
1009 veor d25,d24 | |
1010 vbsl d29,d17,d18 @ Ch(e,f,g) | |
1011 vshr.u64 d24,d20,#28 | |
1012 veor d26,d25 @ Sigma1(e) | |
1013 vadd.i64 d27,d29,d19 | |
1014 vshr.u64 d25,d20,#34 | |
1015 vsli.64 d24,d20,#36 | |
1016 vadd.i64 d27,d26 | |
1017 vshr.u64 d26,d20,#39 | |
1018 vadd.i64 d28,d12 | |
1019 vsli.64 d25,d20,#30 | |
1020 veor d30,d20,d21 | |
1021 vsli.64 d26,d20,#25 | |
1022 veor d19,d24,d25 | |
1023 vadd.i64 d27,d28 | |
1024 vbsl d30,d22,d21 @ Maj(a,b,c) | |
1025 veor d19,d26 @ Sigma0(a) | |
1026 vadd.i64 d23,d27 | |
1027 vadd.i64 d30,d27 | |
1028 @ vadd.i64 d19,d30 | |
1029 vshr.u64 d24,d23,#14 @ 13 | |
1030 #if 13<16 | |
1031 vld1.64 {d13},[r1]! @ handles unaligned | |
1032 #endif | |
1033 vshr.u64 d25,d23,#18 | |
1034 #if 13>0 | |
1035 vadd.i64 d19,d30 @ h+=Maj from the past | |
1036 #endif | |
1037 vshr.u64 d26,d23,#41 | |
1038 vld1.64 {d28},[r3,:64]! @ K[i++] | |
1039 vsli.64 d24,d23,#50 | |
1040 vsli.64 d25,d23,#46 | |
1041 vmov d29,d23 | |
1042 vsli.64 d26,d23,#23 | |
1043 #if 13<16 && defined(__ARMEL__) | |
1044 vrev64.8 d13,d13 | |
1045 #endif | |
1046 veor d25,d24 | |
1047 vbsl d29,d16,d17 @ Ch(e,f,g) | |
1048 vshr.u64 d24,d19,#28 | |
1049 veor d26,d25 @ Sigma1(e) | |
1050 vadd.i64 d27,d29,d18 | |
1051 vshr.u64 d25,d19,#34 | |
1052 vsli.64 d24,d19,#36 | |
1053 vadd.i64 d27,d26 | |
1054 vshr.u64 d26,d19,#39 | |
1055 vadd.i64 d28,d13 | |
1056 vsli.64 d25,d19,#30 | |
1057 veor d30,d19,d20 | |
1058 vsli.64 d26,d19,#25 | |
1059 veor d18,d24,d25 | |
1060 vadd.i64 d27,d28 | |
1061 vbsl d30,d21,d20 @ Maj(a,b,c) | |
1062 veor d18,d26 @ Sigma0(a) | |
1063 vadd.i64 d22,d27 | |
1064 vadd.i64 d30,d27 | |
1065 @ vadd.i64 d18,d30 | |
1066 vshr.u64 d24,d22,#14 @ 14 | |
1067 #if 14<16 | |
1068 vld1.64 {d14},[r1]! @ handles unaligned | |
1069 #endif | |
1070 vshr.u64 d25,d22,#18 | |
1071 #if 14>0 | |
1072 vadd.i64 d18,d30 @ h+=Maj from the past | |
1073 #endif | |
1074 vshr.u64 d26,d22,#41 | |
1075 vld1.64 {d28},[r3,:64]! @ K[i++] | |
1076 vsli.64 d24,d22,#50 | |
1077 vsli.64 d25,d22,#46 | |
1078 vmov d29,d22 | |
1079 vsli.64 d26,d22,#23 | |
1080 #if 14<16 && defined(__ARMEL__) | |
1081 vrev64.8 d14,d14 | |
1082 #endif | |
1083 veor d25,d24 | |
1084 vbsl d29,d23,d16 @ Ch(e,f,g) | |
1085 vshr.u64 d24,d18,#28 | |
1086 veor d26,d25 @ Sigma1(e) | |
1087 vadd.i64 d27,d29,d17 | |
1088 vshr.u64 d25,d18,#34 | |
1089 vsli.64 d24,d18,#36 | |
1090 vadd.i64 d27,d26 | |
1091 vshr.u64 d26,d18,#39 | |
1092 vadd.i64 d28,d14 | |
1093 vsli.64 d25,d18,#30 | |
1094 veor d30,d18,d19 | |
1095 vsli.64 d26,d18,#25 | |
1096 veor d17,d24,d25 | |
1097 vadd.i64 d27,d28 | |
1098 vbsl d30,d20,d19 @ Maj(a,b,c) | |
1099 veor d17,d26 @ Sigma0(a) | |
1100 vadd.i64 d21,d27 | |
1101 vadd.i64 d30,d27 | |
1102 @ vadd.i64 d17,d30 | |
1103 vshr.u64 d24,d21,#14 @ 15 | |
1104 #if 15<16 | |
1105 vld1.64 {d15},[r1]! @ handles unaligned | |
1106 #endif | |
1107 vshr.u64 d25,d21,#18 | |
1108 #if 15>0 | |
1109 vadd.i64 d17,d30 @ h+=Maj from the past | |
1110 #endif | |
1111 vshr.u64 d26,d21,#41 | |
1112 vld1.64 {d28},[r3,:64]! @ K[i++] | |
1113 vsli.64 d24,d21,#50 | |
1114 vsli.64 d25,d21,#46 | |
1115 vmov d29,d21 | |
1116 vsli.64 d26,d21,#23 | |
1117 #if 15<16 && defined(__ARMEL__) | |
1118 vrev64.8 d15,d15 | |
1119 #endif | |
1120 veor d25,d24 | |
1121 vbsl d29,d22,d23 @ Ch(e,f,g) | |
1122 vshr.u64 d24,d17,#28 | |
1123 veor d26,d25 @ Sigma1(e) | |
1124 vadd.i64 d27,d29,d16 | |
1125 vshr.u64 d25,d17,#34 | |
1126 vsli.64 d24,d17,#36 | |
1127 vadd.i64 d27,d26 | |
1128 vshr.u64 d26,d17,#39 | |
1129 vadd.i64 d28,d15 | |
1130 vsli.64 d25,d17,#30 | |
1131 veor d30,d17,d18 | |
1132 vsli.64 d26,d17,#25 | |
1133 veor d16,d24,d25 | |
1134 vadd.i64 d27,d28 | |
1135 vbsl d30,d19,d18 @ Maj(a,b,c) | |
1136 veor d16,d26 @ Sigma0(a) | |
1137 vadd.i64 d20,d27 | |
1138 vadd.i64 d30,d27 | |
1139 @ vadd.i64 d16,d30 | |
1140 mov r12,#4 | |
1141 .L16_79_neon: | |
1142 subs r12,#1 | |
1143 vshr.u64 q12,q7,#19 | |
1144 vshr.u64 q13,q7,#61 | |
1145 vadd.i64 d16,d30 @ h+=Maj from the past | |
1146 vshr.u64 q15,q7,#6 | |
1147 vsli.64 q12,q7,#45 | |
1148 vext.8 q14,q0,q1,#8 @ X[i+1] | |
1149 vsli.64 q13,q7,#3 | |
1150 veor q15,q12 | |
1151 vshr.u64 q12,q14,#1 | |
1152 veor q15,q13 @ sigma1(X[i+14]) | |
1153 vshr.u64 q13,q14,#8 | |
1154 vadd.i64 q0,q15 | |
1155 vshr.u64 q15,q14,#7 | |
1156 vsli.64 q12,q14,#63 | |
1157 vsli.64 q13,q14,#56 | |
1158 vext.8 q14,q4,q5,#8 @ X[i+9] | |
1159 veor q15,q12 | |
1160 vshr.u64 d24,d20,#14 @ from NEON_00_15 | |
1161 vadd.i64 q0,q14 | |
1162 vshr.u64 d25,d20,#18 @ from NEON_00_15 | |
1163 veor q15,q13 @ sigma0(X[i+1]) | |
1164 vshr.u64 d26,d20,#41 @ from NEON_00_15 | |
1165 vadd.i64 q0,q15 | |
1166 vld1.64 {d28},[r3,:64]! @ K[i++] | |
1167 vsli.64 d24,d20,#50 | |
1168 vsli.64 d25,d20,#46 | |
1169 vmov d29,d20 | |
1170 vsli.64 d26,d20,#23 | |
1171 #if 16<16 && defined(__ARMEL__) | |
1172 vrev64.8 , | |
1173 #endif | |
1174 veor d25,d24 | |
1175 vbsl d29,d21,d22 @ Ch(e,f,g) | |
1176 vshr.u64 d24,d16,#28 | |
1177 veor d26,d25 @ Sigma1(e) | |
1178 vadd.i64 d27,d29,d23 | |
1179 vshr.u64 d25,d16,#34 | |
1180 vsli.64 d24,d16,#36 | |
1181 vadd.i64 d27,d26 | |
1182 vshr.u64 d26,d16,#39 | |
1183 vadd.i64 d28,d0 | |
1184 vsli.64 d25,d16,#30 | |
1185 veor d30,d16,d17 | |
1186 vsli.64 d26,d16,#25 | |
1187 veor d23,d24,d25 | |
1188 vadd.i64 d27,d28 | |
1189 vbsl d30,d18,d17 @ Maj(a,b,c) | |
1190 veor d23,d26 @ Sigma0(a) | |
1191 vadd.i64 d19,d27 | |
1192 vadd.i64 d30,d27 | |
1193 @ vadd.i64 d23,d30 | |
1194 vshr.u64 d24,d19,#14 @ 17 | |
1195 #if 17<16 | |
1196 vld1.64 {d1},[r1]! @ handles unaligned | |
1197 #endif | |
1198 vshr.u64 d25,d19,#18 | |
1199 #if 17>0 | |
1200 vadd.i64 d23,d30 @ h+=Maj from the past | |
1201 #endif | |
1202 vshr.u64 d26,d19,#41 | |
1203 vld1.64 {d28},[r3,:64]! @ K[i++] | |
1204 vsli.64 d24,d19,#50 | |
1205 vsli.64 d25,d19,#46 | |
1206 vmov d29,d19 | |
1207 vsli.64 d26,d19,#23 | |
1208 #if 17<16 && defined(__ARMEL__) | |
1209 vrev64.8 , | |
1210 #endif | |
1211 veor d25,d24 | |
1212 vbsl d29,d20,d21 @ Ch(e,f,g) | |
1213 vshr.u64 d24,d23,#28 | |
1214 veor d26,d25 @ Sigma1(e) | |
1215 vadd.i64 d27,d29,d22 | |
1216 vshr.u64 d25,d23,#34 | |
1217 vsli.64 d24,d23,#36 | |
1218 vadd.i64 d27,d26 | |
1219 vshr.u64 d26,d23,#39 | |
1220 vadd.i64 d28,d1 | |
1221 vsli.64 d25,d23,#30 | |
1222 veor d30,d23,d16 | |
1223 vsli.64 d26,d23,#25 | |
1224 veor d22,d24,d25 | |
1225 vadd.i64 d27,d28 | |
1226 vbsl d30,d17,d16 @ Maj(a,b,c) | |
1227 veor d22,d26 @ Sigma0(a) | |
1228 vadd.i64 d18,d27 | |
1229 vadd.i64 d30,d27 | |
1230 @ vadd.i64 d22,d30 | |
1231 vshr.u64 q12,q0,#19 | |
1232 vshr.u64 q13,q0,#61 | |
1233 vadd.i64 d22,d30 @ h+=Maj from the past | |
1234 vshr.u64 q15,q0,#6 | |
1235 vsli.64 q12,q0,#45 | |
1236 vext.8 q14,q1,q2,#8 @ X[i+1] | |
1237 vsli.64 q13,q0,#3 | |
1238 veor q15,q12 | |
1239 vshr.u64 q12,q14,#1 | |
1240 veor q15,q13 @ sigma1(X[i+14]) | |
1241 vshr.u64 q13,q14,#8 | |
1242 vadd.i64 q1,q15 | |
1243 vshr.u64 q15,q14,#7 | |
1244 vsli.64 q12,q14,#63 | |
1245 vsli.64 q13,q14,#56 | |
1246 vext.8 q14,q5,q6,#8 @ X[i+9] | |
1247 veor q15,q12 | |
1248 vshr.u64 d24,d18,#14 @ from NEON_00_15 | |
1249 vadd.i64 q1,q14 | |
1250 vshr.u64 d25,d18,#18 @ from NEON_00_15 | |
1251 veor q15,q13 @ sigma0(X[i+1]) | |
1252 vshr.u64 d26,d18,#41 @ from NEON_00_15 | |
1253 vadd.i64 q1,q15 | |
1254 vld1.64 {d28},[r3,:64]! @ K[i++] | |
1255 vsli.64 d24,d18,#50 | |
1256 vsli.64 d25,d18,#46 | |
1257 vmov d29,d18 | |
1258 vsli.64 d26,d18,#23 | |
1259 #if 18<16 && defined(__ARMEL__) | |
1260 vrev64.8 , | |
1261 #endif | |
1262 veor d25,d24 | |
1263 vbsl d29,d19,d20 @ Ch(e,f,g) | |
1264 vshr.u64 d24,d22,#28 | |
1265 veor d26,d25 @ Sigma1(e) | |
1266 vadd.i64 d27,d29,d21 | |
1267 vshr.u64 d25,d22,#34 | |
1268 vsli.64 d24,d22,#36 | |
1269 vadd.i64 d27,d26 | |
1270 vshr.u64 d26,d22,#39 | |
1271 vadd.i64 d28,d2 | |
1272 vsli.64 d25,d22,#30 | |
1273 veor d30,d22,d23 | |
1274 vsli.64 d26,d22,#25 | |
1275 veor d21,d24,d25 | |
1276 vadd.i64 d27,d28 | |
1277 vbsl d30,d16,d23 @ Maj(a,b,c) | |
1278 veor d21,d26 @ Sigma0(a) | |
1279 vadd.i64 d17,d27 | |
1280 vadd.i64 d30,d27 | |
1281 @ vadd.i64 d21,d30 | |
1282 vshr.u64 d24,d17,#14 @ 19 | |
1283 #if 19<16 | |
1284 vld1.64 {d3},[r1]! @ handles unaligned | |
1285 #endif | |
1286 vshr.u64 d25,d17,#18 | |
1287 #if 19>0 | |
1288 vadd.i64 d21,d30 @ h+=Maj from the past | |
1289 #endif | |
1290 vshr.u64 d26,d17,#41 | |
1291 vld1.64 {d28},[r3,:64]! @ K[i++] | |
1292 vsli.64 d24,d17,#50 | |
1293 vsli.64 d25,d17,#46 | |
1294 vmov d29,d17 | |
1295 vsli.64 d26,d17,#23 | |
1296 #if 19<16 && defined(__ARMEL__) | |
1297 vrev64.8 , | |
1298 #endif | |
1299 veor d25,d24 | |
1300 vbsl d29,d18,d19 @ Ch(e,f,g) | |
1301 vshr.u64 d24,d21,#28 | |
1302 veor d26,d25 @ Sigma1(e) | |
1303 vadd.i64 d27,d29,d20 | |
1304 vshr.u64 d25,d21,#34 | |
1305 vsli.64 d24,d21,#36 | |
1306 vadd.i64 d27,d26 | |
1307 vshr.u64 d26,d21,#39 | |
1308 vadd.i64 d28,d3 | |
1309 vsli.64 d25,d21,#30 | |
1310 veor d30,d21,d22 | |
1311 vsli.64 d26,d21,#25 | |
1312 veor d20,d24,d25 | |
1313 vadd.i64 d27,d28 | |
1314 vbsl d30,d23,d22 @ Maj(a,b,c) | |
1315 veor d20,d26 @ Sigma0(a) | |
1316 vadd.i64 d16,d27 | |
1317 vadd.i64 d30,d27 | |
1318 @ vadd.i64 d20,d30 | |
1319 vshr.u64 q12,q1,#19 | |
1320 vshr.u64 q13,q1,#61 | |
1321 vadd.i64 d20,d30 @ h+=Maj from the past | |
1322 vshr.u64 q15,q1,#6 | |
1323 vsli.64 q12,q1,#45 | |
1324 vext.8 q14,q2,q3,#8 @ X[i+1] | |
1325 vsli.64 q13,q1,#3 | |
1326 veor q15,q12 | |
1327 vshr.u64 q12,q14,#1 | |
1328 veor q15,q13 @ sigma1(X[i+14]) | |
1329 vshr.u64 q13,q14,#8 | |
1330 vadd.i64 q2,q15 | |
1331 vshr.u64 q15,q14,#7 | |
1332 vsli.64 q12,q14,#63 | |
1333 vsli.64 q13,q14,#56 | |
1334 vext.8 q14,q6,q7,#8 @ X[i+9] | |
1335 veor q15,q12 | |
1336 vshr.u64 d24,d16,#14 @ from NEON_00_15 | |
1337 vadd.i64 q2,q14 | |
1338 vshr.u64 d25,d16,#18 @ from NEON_00_15 | |
1339 veor q15,q13 @ sigma0(X[i+1]) | |
1340 vshr.u64 d26,d16,#41 @ from NEON_00_15 | |
1341 vadd.i64 q2,q15 | |
1342 vld1.64 {d28},[r3,:64]! @ K[i++] | |
1343 vsli.64 d24,d16,#50 | |
1344 vsli.64 d25,d16,#46 | |
1345 vmov d29,d16 | |
1346 vsli.64 d26,d16,#23 | |
1347 #if 20<16 && defined(__ARMEL__) | |
1348 vrev64.8 , | |
1349 #endif | |
1350 veor d25,d24 | |
1351 vbsl d29,d17,d18 @ Ch(e,f,g) | |
1352 vshr.u64 d24,d20,#28 | |
1353 veor d26,d25 @ Sigma1(e) | |
1354 vadd.i64 d27,d29,d19 | |
1355 vshr.u64 d25,d20,#34 | |
1356 vsli.64 d24,d20,#36 | |
1357 vadd.i64 d27,d26 | |
1358 vshr.u64 d26,d20,#39 | |
1359 vadd.i64 d28,d4 | |
1360 vsli.64 d25,d20,#30 | |
1361 veor d30,d20,d21 | |
1362 vsli.64 d26,d20,#25 | |
1363 veor d19,d24,d25 | |
1364 vadd.i64 d27,d28 | |
1365 vbsl d30,d22,d21 @ Maj(a,b,c) | |
1366 veor d19,d26 @ Sigma0(a) | |
1367 vadd.i64 d23,d27 | |
1368 vadd.i64 d30,d27 | |
1369 @ vadd.i64 d19,d30 | |
1370 vshr.u64 d24,d23,#14 @ 21 | |
1371 #if 21<16 | |
1372 vld1.64 {d5},[r1]! @ handles unaligned | |
1373 #endif | |
1374 vshr.u64 d25,d23,#18 | |
1375 #if 21>0 | |
1376 vadd.i64 d19,d30 @ h+=Maj from the past | |
1377 #endif | |
1378 vshr.u64 d26,d23,#41 | |
1379 vld1.64 {d28},[r3,:64]! @ K[i++] | |
1380 vsli.64 d24,d23,#50 | |
1381 vsli.64 d25,d23,#46 | |
1382 vmov d29,d23 | |
1383 vsli.64 d26,d23,#23 | |
1384 #if 21<16 && defined(__ARMEL__) | |
1385 vrev64.8 , | |
1386 #endif | |
1387 veor d25,d24 | |
1388 vbsl d29,d16,d17 @ Ch(e,f,g) | |
1389 vshr.u64 d24,d19,#28 | |
1390 veor d26,d25 @ Sigma1(e) | |
1391 vadd.i64 d27,d29,d18 | |
1392 vshr.u64 d25,d19,#34 | |
1393 vsli.64 d24,d19,#36 | |
1394 vadd.i64 d27,d26 | |
1395 vshr.u64 d26,d19,#39 | |
1396 vadd.i64 d28,d5 | |
1397 vsli.64 d25,d19,#30 | |
1398 veor d30,d19,d20 | |
1399 vsli.64 d26,d19,#25 | |
1400 veor d18,d24,d25 | |
1401 vadd.i64 d27,d28 | |
1402 vbsl d30,d21,d20 @ Maj(a,b,c) | |
1403 veor d18,d26 @ Sigma0(a) | |
1404 vadd.i64 d22,d27 | |
1405 vadd.i64 d30,d27 | |
1406 @ vadd.i64 d18,d30 | |
1407 vshr.u64 q12,q2,#19 | |
1408 vshr.u64 q13,q2,#61 | |
1409 vadd.i64 d18,d30 @ h+=Maj from the past | |
1410 vshr.u64 q15,q2,#6 | |
1411 vsli.64 q12,q2,#45 | |
1412 vext.8 q14,q3,q4,#8 @ X[i+1] | |
1413 vsli.64 q13,q2,#3 | |
1414 veor q15,q12 | |
1415 vshr.u64 q12,q14,#1 | |
1416 veor q15,q13 @ sigma1(X[i+14]) | |
1417 vshr.u64 q13,q14,#8 | |
1418 vadd.i64 q3,q15 | |
1419 vshr.u64 q15,q14,#7 | |
1420 vsli.64 q12,q14,#63 | |
1421 vsli.64 q13,q14,#56 | |
1422 vext.8 q14,q7,q0,#8 @ X[i+9] | |
1423 veor q15,q12 | |
1424 vshr.u64 d24,d22,#14 @ from NEON_00_15 | |
1425 vadd.i64 q3,q14 | |
1426 vshr.u64 d25,d22,#18 @ from NEON_00_15 | |
1427 veor q15,q13 @ sigma0(X[i+1]) | |
1428 vshr.u64 d26,d22,#41 @ from NEON_00_15 | |
1429 vadd.i64 q3,q15 | |
1430 vld1.64 {d28},[r3,:64]! @ K[i++] | |
1431 vsli.64 d24,d22,#50 | |
1432 vsli.64 d25,d22,#46 | |
1433 vmov d29,d22 | |
1434 vsli.64 d26,d22,#23 | |
1435 #if 22<16 && defined(__ARMEL__) | |
1436 vrev64.8 , | |
1437 #endif | |
1438 veor d25,d24 | |
1439 vbsl d29,d23,d16 @ Ch(e,f,g) | |
1440 vshr.u64 d24,d18,#28 | |
1441 veor d26,d25 @ Sigma1(e) | |
1442 vadd.i64 d27,d29,d17 | |
1443 vshr.u64 d25,d18,#34 | |
1444 vsli.64 d24,d18,#36 | |
1445 vadd.i64 d27,d26 | |
1446 vshr.u64 d26,d18,#39 | |
1447 vadd.i64 d28,d6 | |
1448 vsli.64 d25,d18,#30 | |
1449 veor d30,d18,d19 | |
1450 vsli.64 d26,d18,#25 | |
1451 veor d17,d24,d25 | |
1452 vadd.i64 d27,d28 | |
1453 vbsl d30,d20,d19 @ Maj(a,b,c) | |
1454 veor d17,d26 @ Sigma0(a) | |
1455 vadd.i64 d21,d27 | |
1456 vadd.i64 d30,d27 | |
1457 @ vadd.i64 d17,d30 | |
1458 vshr.u64 d24,d21,#14 @ 23 | |
1459 #if 23<16 | |
1460 vld1.64 {d7},[r1]! @ handles unaligned | |
1461 #endif | |
1462 vshr.u64 d25,d21,#18 | |
1463 #if 23>0 | |
1464 vadd.i64 d17,d30 @ h+=Maj from the past | |
1465 #endif | |
1466 vshr.u64 d26,d21,#41 | |
1467 vld1.64 {d28},[r3,:64]! @ K[i++] | |
1468 vsli.64 d24,d21,#50 | |
1469 vsli.64 d25,d21,#46 | |
1470 vmov d29,d21 | |
1471 vsli.64 d26,d21,#23 | |
1472 #if 23<16 && defined(__ARMEL__) | |
1473 vrev64.8 , | |
1474 #endif | |
1475 veor d25,d24 | |
1476 vbsl d29,d22,d23 @ Ch(e,f,g) | |
1477 vshr.u64 d24,d17,#28 | |
1478 veor d26,d25 @ Sigma1(e) | |
1479 vadd.i64 d27,d29,d16 | |
1480 vshr.u64 d25,d17,#34 | |
1481 vsli.64 d24,d17,#36 | |
1482 vadd.i64 d27,d26 | |
1483 vshr.u64 d26,d17,#39 | |
1484 vadd.i64 d28,d7 | |
1485 vsli.64 d25,d17,#30 | |
1486 veor d30,d17,d18 | |
1487 vsli.64 d26,d17,#25 | |
1488 veor d16,d24,d25 | |
1489 vadd.i64 d27,d28 | |
1490 vbsl d30,d19,d18 @ Maj(a,b,c) | |
1491 veor d16,d26 @ Sigma0(a) | |
1492 vadd.i64 d20,d27 | |
1493 vadd.i64 d30,d27 | |
1494 @ vadd.i64 d16,d30 | |
1495 vshr.u64 q12,q3,#19 | |
1496 vshr.u64 q13,q3,#61 | |
1497 vadd.i64 d16,d30 @ h+=Maj from the past | |
1498 vshr.u64 q15,q3,#6 | |
1499 vsli.64 q12,q3,#45 | |
1500 vext.8 q14,q4,q5,#8 @ X[i+1] | |
1501 vsli.64 q13,q3,#3 | |
1502 veor q15,q12 | |
1503 vshr.u64 q12,q14,#1 | |
1504 veor q15,q13 @ sigma1(X[i+14]) | |
1505 vshr.u64 q13,q14,#8 | |
1506 vadd.i64 q4,q15 | |
1507 vshr.u64 q15,q14,#7 | |
1508 vsli.64 q12,q14,#63 | |
1509 vsli.64 q13,q14,#56 | |
1510 vext.8 q14,q0,q1,#8 @ X[i+9] | |
1511 veor q15,q12 | |
1512 vshr.u64 d24,d20,#14 @ from NEON_00_15 | |
1513 vadd.i64 q4,q14 | |
1514 vshr.u64 d25,d20,#18 @ from NEON_00_15 | |
1515 veor q15,q13 @ sigma0(X[i+1]) | |
1516 vshr.u64 d26,d20,#41 @ from NEON_00_15 | |
1517 vadd.i64 q4,q15 | |
1518 vld1.64 {d28},[r3,:64]! @ K[i++] | |
1519 vsli.64 d24,d20,#50 | |
1520 vsli.64 d25,d20,#46 | |
1521 vmov d29,d20 | |
1522 vsli.64 d26,d20,#23 | |
1523 #if 24<16 && defined(__ARMEL__) | |
1524 vrev64.8 , | |
1525 #endif | |
1526 veor d25,d24 | |
1527 vbsl d29,d21,d22 @ Ch(e,f,g) | |
1528 vshr.u64 d24,d16,#28 | |
1529 veor d26,d25 @ Sigma1(e) | |
1530 vadd.i64 d27,d29,d23 | |
1531 vshr.u64 d25,d16,#34 | |
1532 vsli.64 d24,d16,#36 | |
1533 vadd.i64 d27,d26 | |
1534 vshr.u64 d26,d16,#39 | |
1535 vadd.i64 d28,d8 | |
1536 vsli.64 d25,d16,#30 | |
1537 veor d30,d16,d17 | |
1538 vsli.64 d26,d16,#25 | |
1539 veor d23,d24,d25 | |
1540 vadd.i64 d27,d28 | |
1541 vbsl d30,d18,d17 @ Maj(a,b,c) | |
1542 veor d23,d26 @ Sigma0(a) | |
1543 vadd.i64 d19,d27 | |
1544 vadd.i64 d30,d27 | |
1545 @ vadd.i64 d23,d30 | |
1546 vshr.u64 d24,d19,#14 @ 25 | |
1547 #if 25<16 | |
1548 vld1.64 {d9},[r1]! @ handles unaligned | |
1549 #endif | |
1550 vshr.u64 d25,d19,#18 | |
1551 #if 25>0 | |
1552 vadd.i64 d23,d30 @ h+=Maj from the past | |
1553 #endif | |
1554 vshr.u64 d26,d19,#41 | |
1555 vld1.64 {d28},[r3,:64]! @ K[i++] | |
1556 vsli.64 d24,d19,#50 | |
1557 vsli.64 d25,d19,#46 | |
1558 vmov d29,d19 | |
1559 vsli.64 d26,d19,#23 | |
1560 #if 25<16 && defined(__ARMEL__) | |
1561 vrev64.8 , | |
1562 #endif | |
1563 veor d25,d24 | |
1564 vbsl d29,d20,d21 @ Ch(e,f,g) | |
1565 vshr.u64 d24,d23,#28 | |
1566 veor d26,d25 @ Sigma1(e) | |
1567 vadd.i64 d27,d29,d22 | |
1568 vshr.u64 d25,d23,#34 | |
1569 vsli.64 d24,d23,#36 | |
1570 vadd.i64 d27,d26 | |
1571 vshr.u64 d26,d23,#39 | |
1572 vadd.i64 d28,d9 | |
1573 vsli.64 d25,d23,#30 | |
1574 veor d30,d23,d16 | |
1575 vsli.64 d26,d23,#25 | |
1576 veor d22,d24,d25 | |
1577 vadd.i64 d27,d28 | |
1578 vbsl d30,d17,d16 @ Maj(a,b,c) | |
1579 veor d22,d26 @ Sigma0(a) | |
1580 vadd.i64 d18,d27 | |
1581 vadd.i64 d30,d27 | |
1582 @ vadd.i64 d22,d30 | |
1583 vshr.u64 q12,q4,#19 | |
1584 vshr.u64 q13,q4,#61 | |
1585 vadd.i64 d22,d30 @ h+=Maj from the past | |
1586 vshr.u64 q15,q4,#6 | |
1587 vsli.64 q12,q4,#45 | |
1588 vext.8 q14,q5,q6,#8 @ X[i+1] | |
1589 vsli.64 q13,q4,#3 | |
1590 veor q15,q12 | |
1591 vshr.u64 q12,q14,#1 | |
1592 veor q15,q13 @ sigma1(X[i+14]) | |
1593 vshr.u64 q13,q14,#8 | |
1594 vadd.i64 q5,q15 | |
1595 vshr.u64 q15,q14,#7 | |
1596 vsli.64 q12,q14,#63 | |
1597 vsli.64 q13,q14,#56 | |
1598 vext.8 q14,q1,q2,#8 @ X[i+9] | |
1599 veor q15,q12 | |
1600 vshr.u64 d24,d18,#14 @ from NEON_00_15 | |
1601 vadd.i64 q5,q14 | |
1602 vshr.u64 d25,d18,#18 @ from NEON_00_15 | |
1603 veor q15,q13 @ sigma0(X[i+1]) | |
1604 vshr.u64 d26,d18,#41 @ from NEON_00_15 | |
1605 vadd.i64 q5,q15 | |
1606 vld1.64 {d28},[r3,:64]! @ K[i++] | |
1607 vsli.64 d24,d18,#50 | |
1608 vsli.64 d25,d18,#46 | |
1609 vmov d29,d18 | |
1610 vsli.64 d26,d18,#23 | |
1611 #if 26<16 && defined(__ARMEL__) | |
1612 vrev64.8 , | |
1613 #endif | |
1614 veor d25,d24 | |
1615 vbsl d29,d19,d20 @ Ch(e,f,g) | |
1616 vshr.u64 d24,d22,#28 | |
1617 veor d26,d25 @ Sigma1(e) | |
1618 vadd.i64 d27,d29,d21 | |
1619 vshr.u64 d25,d22,#34 | |
1620 vsli.64 d24,d22,#36 | |
1621 vadd.i64 d27,d26 | |
1622 vshr.u64 d26,d22,#39 | |
1623 vadd.i64 d28,d10 | |
1624 vsli.64 d25,d22,#30 | |
1625 veor d30,d22,d23 | |
1626 vsli.64 d26,d22,#25 | |
1627 veor d21,d24,d25 | |
1628 vadd.i64 d27,d28 | |
1629 vbsl d30,d16,d23 @ Maj(a,b,c) | |
1630 veor d21,d26 @ Sigma0(a) | |
1631 vadd.i64 d17,d27 | |
1632 vadd.i64 d30,d27 | |
1633 @ vadd.i64 d21,d30 | |
1634 vshr.u64 d24,d17,#14 @ 27 | |
1635 #if 27<16 | |
1636 vld1.64 {d11},[r1]! @ handles unaligned | |
1637 #endif | |
1638 vshr.u64 d25,d17,#18 | |
1639 #if 27>0 | |
1640 vadd.i64 d21,d30 @ h+=Maj from the past | |
1641 #endif | |
1642 vshr.u64 d26,d17,#41 | |
1643 vld1.64 {d28},[r3,:64]! @ K[i++] | |
1644 vsli.64 d24,d17,#50 | |
1645 vsli.64 d25,d17,#46 | |
1646 vmov d29,d17 | |
1647 vsli.64 d26,d17,#23 | |
1648 #if 27<16 && defined(__ARMEL__) | |
1649 vrev64.8 , | |
1650 #endif | |
1651 veor d25,d24 | |
1652 vbsl d29,d18,d19 @ Ch(e,f,g) | |
1653 vshr.u64 d24,d21,#28 | |
1654 veor d26,d25 @ Sigma1(e) | |
1655 vadd.i64 d27,d29,d20 | |
1656 vshr.u64 d25,d21,#34 | |
1657 vsli.64 d24,d21,#36 | |
1658 vadd.i64 d27,d26 | |
1659 vshr.u64 d26,d21,#39 | |
1660 vadd.i64 d28,d11 | |
1661 vsli.64 d25,d21,#30 | |
1662 veor d30,d21,d22 | |
1663 vsli.64 d26,d21,#25 | |
1664 veor d20,d24,d25 | |
1665 vadd.i64 d27,d28 | |
1666 vbsl d30,d23,d22 @ Maj(a,b,c) | |
1667 veor d20,d26 @ Sigma0(a) | |
1668 vadd.i64 d16,d27 | |
1669 vadd.i64 d30,d27 | |
1670 @ vadd.i64 d20,d30 | |
1671 vshr.u64 q12,q5,#19 | |
1672 vshr.u64 q13,q5,#61 | |
1673 vadd.i64 d20,d30 @ h+=Maj from the past | |
1674 vshr.u64 q15,q5,#6 | |
1675 vsli.64 q12,q5,#45 | |
1676 vext.8 q14,q6,q7,#8 @ X[i+1] | |
1677 vsli.64 q13,q5,#3 | |
1678 veor q15,q12 | |
1679 vshr.u64 q12,q14,#1 | |
1680 veor q15,q13 @ sigma1(X[i+14]) | |
1681 vshr.u64 q13,q14,#8 | |
1682 vadd.i64 q6,q15 | |
1683 vshr.u64 q15,q14,#7 | |
1684 vsli.64 q12,q14,#63 | |
1685 vsli.64 q13,q14,#56 | |
1686 vext.8 q14,q2,q3,#8 @ X[i+9] | |
1687 veor q15,q12 | |
1688 vshr.u64 d24,d16,#14 @ from NEON_00_15 | |
1689 vadd.i64 q6,q14 | |
1690 vshr.u64 d25,d16,#18 @ from NEON_00_15 | |
1691 veor q15,q13 @ sigma0(X[i+1]) | |
1692 vshr.u64 d26,d16,#41 @ from NEON_00_15 | |
1693 vadd.i64 q6,q15 | |
1694 vld1.64 {d28},[r3,:64]! @ K[i++] | |
1695 vsli.64 d24,d16,#50 | |
1696 vsli.64 d25,d16,#46 | |
1697 vmov d29,d16 | |
1698 vsli.64 d26,d16,#23 | |
1699 #if 28<16 && defined(__ARMEL__) | |
1700 vrev64.8 , | |
1701 #endif | |
1702 veor d25,d24 | |
1703 vbsl d29,d17,d18 @ Ch(e,f,g) | |
1704 vshr.u64 d24,d20,#28 | |
1705 veor d26,d25 @ Sigma1(e) | |
1706 vadd.i64 d27,d29,d19 | |
1707 vshr.u64 d25,d20,#34 | |
1708 vsli.64 d24,d20,#36 | |
1709 vadd.i64 d27,d26 | |
1710 vshr.u64 d26,d20,#39 | |
1711 vadd.i64 d28,d12 | |
1712 vsli.64 d25,d20,#30 | |
1713 veor d30,d20,d21 | |
1714 vsli.64 d26,d20,#25 | |
1715 veor d19,d24,d25 | |
1716 vadd.i64 d27,d28 | |
1717 vbsl d30,d22,d21 @ Maj(a,b,c) | |
1718 veor d19,d26 @ Sigma0(a) | |
1719 vadd.i64 d23,d27 | |
1720 vadd.i64 d30,d27 | |
1721 @ vadd.i64 d19,d30 | |
1722 vshr.u64 d24,d23,#14 @ 29 | |
1723 #if 29<16 | |
1724 vld1.64 {d13},[r1]! @ handles unaligned | |
1725 #endif | |
1726 vshr.u64 d25,d23,#18 | |
1727 #if 29>0 | |
1728 vadd.i64 d19,d30 @ h+=Maj from the past | |
1729 #endif | |
1730 vshr.u64 d26,d23,#41 | |
1731 vld1.64 {d28},[r3,:64]! @ K[i++] | |
1732 vsli.64 d24,d23,#50 | |
1733 vsli.64 d25,d23,#46 | |
1734 vmov d29,d23 | |
1735 vsli.64 d26,d23,#23 | |
1736 #if 29<16 && defined(__ARMEL__) | |
1737 vrev64.8 , | |
1738 #endif | |
1739 veor d25,d24 | |
1740 vbsl d29,d16,d17 @ Ch(e,f,g) | |
1741 vshr.u64 d24,d19,#28 | |
1742 veor d26,d25 @ Sigma1(e) | |
1743 vadd.i64 d27,d29,d18 | |
1744 vshr.u64 d25,d19,#34 | |
1745 vsli.64 d24,d19,#36 | |
1746 vadd.i64 d27,d26 | |
1747 vshr.u64 d26,d19,#39 | |
1748 vadd.i64 d28,d13 | |
1749 vsli.64 d25,d19,#30 | |
1750 veor d30,d19,d20 | |
1751 vsli.64 d26,d19,#25 | |
1752 veor d18,d24,d25 | |
1753 vadd.i64 d27,d28 | |
1754 vbsl d30,d21,d20 @ Maj(a,b,c) | |
1755 veor d18,d26 @ Sigma0(a) | |
1756 vadd.i64 d22,d27 | |
1757 vadd.i64 d30,d27 | |
1758 @ vadd.i64 d18,d30 | |
1759 vshr.u64 q12,q6,#19 | |
1760 vshr.u64 q13,q6,#61 | |
1761 vadd.i64 d18,d30 @ h+=Maj from the past | |
1762 vshr.u64 q15,q6,#6 | |
1763 vsli.64 q12,q6,#45 | |
1764 vext.8 q14,q7,q0,#8 @ X[i+1] | |
1765 vsli.64 q13,q6,#3 | |
1766 veor q15,q12 | |
1767 vshr.u64 q12,q14,#1 | |
1768 veor q15,q13 @ sigma1(X[i+14]) | |
1769 vshr.u64 q13,q14,#8 | |
1770 vadd.i64 q7,q15 | |
1771 vshr.u64 q15,q14,#7 | |
1772 vsli.64 q12,q14,#63 | |
1773 vsli.64 q13,q14,#56 | |
1774 vext.8 q14,q3,q4,#8 @ X[i+9] | |
1775 veor q15,q12 | |
1776 vshr.u64 d24,d22,#14 @ from NEON_00_15 | |
1777 vadd.i64 q7,q14 | |
1778 vshr.u64 d25,d22,#18 @ from NEON_00_15 | |
1779 veor q15,q13 @ sigma0(X[i+1]) | |
1780 vshr.u64 d26,d22,#41 @ from NEON_00_15 | |
1781 vadd.i64 q7,q15 | |
1782 vld1.64 {d28},[r3,:64]! @ K[i++] | |
1783 vsli.64 d24,d22,#50 | |
1784 vsli.64 d25,d22,#46 | |
1785 vmov d29,d22 | |
1786 vsli.64 d26,d22,#23 | |
1787 #if 30<16 && defined(__ARMEL__) | |
1788 vrev64.8 , | |
1789 #endif | |
1790 veor d25,d24 | |
1791 vbsl d29,d23,d16 @ Ch(e,f,g) | |
1792 vshr.u64 d24,d18,#28 | |
1793 veor d26,d25 @ Sigma1(e) | |
1794 vadd.i64 d27,d29,d17 | |
1795 vshr.u64 d25,d18,#34 | |
1796 vsli.64 d24,d18,#36 | |
1797 vadd.i64 d27,d26 | |
1798 vshr.u64 d26,d18,#39 | |
1799 vadd.i64 d28,d14 | |
1800 vsli.64 d25,d18,#30 | |
1801 veor d30,d18,d19 | |
1802 vsli.64 d26,d18,#25 | |
1803 veor d17,d24,d25 | |
1804 vadd.i64 d27,d28 | |
1805 vbsl d30,d20,d19 @ Maj(a,b,c) | |
1806 veor d17,d26 @ Sigma0(a) | |
1807 vadd.i64 d21,d27 | |
1808 vadd.i64 d30,d27 | |
1809 @ vadd.i64 d17,d30 | |
1810 vshr.u64 d24,d21,#14 @ 31 | |
1811 #if 31<16 | |
1812 vld1.64 {d15},[r1]! @ handles unaligned | |
1813 #endif | |
1814 vshr.u64 d25,d21,#18 | |
1815 #if 31>0 | |
1816 vadd.i64 d17,d30 @ h+=Maj from the past | |
1817 #endif | |
1818 vshr.u64 d26,d21,#41 | |
1819 vld1.64 {d28},[r3,:64]! @ K[i++] | |
1820 vsli.64 d24,d21,#50 | |
1821 vsli.64 d25,d21,#46 | |
1822 vmov d29,d21 | |
1823 vsli.64 d26,d21,#23 | |
1824 #if 31<16 && defined(__ARMEL__) | |
1825 vrev64.8 , | |
1826 #endif | |
1827 veor d25,d24 | |
1828 vbsl d29,d22,d23 @ Ch(e,f,g) | |
1829 vshr.u64 d24,d17,#28 | |
1830 veor d26,d25 @ Sigma1(e) | |
1831 vadd.i64 d27,d29,d16 | |
1832 vshr.u64 d25,d17,#34 | |
1833 vsli.64 d24,d17,#36 | |
1834 vadd.i64 d27,d26 | |
1835 vshr.u64 d26,d17,#39 | |
1836 vadd.i64 d28,d15 | |
1837 vsli.64 d25,d17,#30 | |
1838 veor d30,d17,d18 | |
1839 vsli.64 d26,d17,#25 | |
1840 veor d16,d24,d25 | |
1841 vadd.i64 d27,d28 | |
1842 vbsl d30,d19,d18 @ Maj(a,b,c) | |
1843 veor d16,d26 @ Sigma0(a) | |
1844 vadd.i64 d20,d27 | |
1845 vadd.i64 d30,d27 | |
1846 @ vadd.i64 d16,d30 | |
1847 bne .L16_79_neon | |
1848 | |
1849 vadd.i64 d16,d30 @ h+=Maj from the past | |
1850 vldmia r0,{d24,d25,d26,d27,d28,d29,d30,d31} @ load context to temp | |
1851 vadd.i64 q8,q12 @ vectorized accumulate | |
1852 vadd.i64 q9,q13 | |
1853 vadd.i64 q10,q14 | |
1854 vadd.i64 q11,q15 | |
1855 vstmia r0,{d16,d17,d18,d19,d20,d21,d22,d23} @ save context | |
1856 teq r1,r2 | |
1857 sub r3,#640 @ rewind K512 | |
1858 bne .Loop_neon | |
1859 | |
1860 VFP_ABI_POP | |
1861 bx lr @ .word 0xe12fff1e | |
1862 .size sha512_block_data_order_neon,.-sha512_block_data_order_neon | |
1863 #endif | |
1864 .byte 83,72,65,53,49,50,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114
,109,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,44,32,67,82,89,80,84,79,71
,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,1
11,114,103,62,0 | |
1865 .align 2 | |
1866 .align 2 | |
1867 #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__) | |
1868 .comm OPENSSL_armcap_P,4,4 | |
1869 .hidden OPENSSL_armcap_P | |
1870 #endif | |
1871 #endif | |
OLD | NEW |