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