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