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