Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/crypto/openssl/aarch64/sha256-armv8.S
39536 views
1
/* Do not modify. This file is auto-generated from sha512-armv8.pl. */
2
// Copyright 2014-2025 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
// Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
11
// project. The module is, however, dual licensed under OpenSSL and
12
// CRYPTOGAMS licenses depending on where you obtain it. For further
13
// details see http://www.openssl.org/~appro/cryptogams/.
14
//
15
// Permission to use under GPLv2 terms is granted.
16
// ====================================================================
17
//
18
// SHA256/512 for ARMv8.
19
//
20
// Performance in cycles per processed byte and improvement coefficient
21
// over code generated with "default" compiler:
22
//
23
// SHA256-hw SHA256(*) SHA512
24
// Apple A7 1.97 10.5 (+33%) 6.73 (-1%(**))
25
// Cortex-A53 2.38 15.5 (+115%) 10.0 (+150%(***))
26
// Cortex-A57 2.31 11.6 (+86%) 7.51 (+260%(***))
27
// Denver 2.01 10.5 (+26%) 6.70 (+8%)
28
// X-Gene 20.0 (+100%) 12.8 (+300%(***))
29
// Mongoose 2.36 13.0 (+50%) 8.36 (+33%)
30
// Kryo 1.92 17.4 (+30%) 11.2 (+8%)
31
// ThunderX2 2.54 13.2 (+40%) 8.40 (+18%)
32
//
33
// (*) Software SHA256 results are of lesser relevance, presented
34
// mostly for informational purposes.
35
// (**) The result is a trade-off: it's possible to improve it by
36
// 10% (or by 1 cycle per round), but at the cost of 20% loss
37
// on Cortex-A53 (or by 4 cycles per round).
38
// (***) Super-impressive coefficients over gcc-generated code are
39
// indication of some compiler "pathology", most notably code
40
// generated with -mgeneral-regs-only is significantly faster
41
// and the gap is only 40-90%.
42
//
43
// October 2016.
44
//
45
// Originally it was reckoned that it makes no sense to implement NEON
46
// version of SHA256 for 64-bit processors. This is because performance
47
// improvement on most wide-spread Cortex-A5x processors was observed
48
// to be marginal, same on Cortex-A53 and ~10% on A57. But then it was
49
// observed that 32-bit NEON SHA256 performs significantly better than
50
// 64-bit scalar version on *some* of the more recent processors. As
51
// result 64-bit NEON version of SHA256 was added to provide best
52
// all-round performance. For example it executes ~30% faster on X-Gene
53
// and Mongoose. [For reference, NEON version of SHA512 is bound to
54
// deliver much less improvement, likely *negative* on Cortex-A5x.
55
// Which is why NEON support is limited to SHA256.]
56
57
// $output is the last argument if it looks like a file (it has an extension)
58
// $flavour is the first argument if it doesn't look like a file
59
#include "arm_arch.h"
60
#ifndef __KERNEL__
61
62
.hidden OPENSSL_armcap_P
63
#endif
64
65
.text
66
67
.globl sha256_block_data_order
68
.type sha256_block_data_order,%function
69
.align 6
70
sha256_block_data_order:
71
AARCH64_VALID_CALL_TARGET
72
#ifndef __KERNEL__
73
adrp x16,OPENSSL_armcap_P
74
ldr w16,[x16,#:lo12:OPENSSL_armcap_P]
75
tst w16,#ARMV8_SHA256
76
b.ne .Lv8_entry
77
tst w16,#ARMV7_NEON
78
b.ne .Lneon_entry
79
#endif
80
AARCH64_SIGN_LINK_REGISTER
81
stp x29,x30,[sp,#-128]!
82
add x29,sp,#0
83
84
stp x19,x20,[sp,#16]
85
stp x21,x22,[sp,#32]
86
stp x23,x24,[sp,#48]
87
stp x25,x26,[sp,#64]
88
stp x27,x28,[sp,#80]
89
sub sp,sp,#4*4
90
91
ldp w20,w21,[x0] // load context
92
ldp w22,w23,[x0,#2*4]
93
ldp w24,w25,[x0,#4*4]
94
add x2,x1,x2,lsl#6 // end of input
95
ldp w26,w27,[x0,#6*4]
96
adrp x30,.LK256
97
add x30,x30,#:lo12:.LK256
98
stp x0,x2,[x29,#96]
99
100
.Loop:
101
ldp w3,w4,[x1],#2*4
102
ldr w19,[x30],#4 // *K++
103
eor w28,w21,w22 // magic seed
104
str x1,[x29,#112]
105
#ifndef __AARCH64EB__
106
rev w3,w3 // 0
107
#endif
108
ror w16,w24,#6
109
add w27,w27,w19 // h+=K[i]
110
eor w6,w24,w24,ror#14
111
and w17,w25,w24
112
bic w19,w26,w24
113
add w27,w27,w3 // h+=X[i]
114
orr w17,w17,w19 // Ch(e,f,g)
115
eor w19,w20,w21 // a^b, b^c in next round
116
eor w16,w16,w6,ror#11 // Sigma1(e)
117
ror w6,w20,#2
118
add w27,w27,w17 // h+=Ch(e,f,g)
119
eor w17,w20,w20,ror#9
120
add w27,w27,w16 // h+=Sigma1(e)
121
and w28,w28,w19 // (b^c)&=(a^b)
122
add w23,w23,w27 // d+=h
123
eor w28,w28,w21 // Maj(a,b,c)
124
eor w17,w6,w17,ror#13 // Sigma0(a)
125
add w27,w27,w28 // h+=Maj(a,b,c)
126
ldr w28,[x30],#4 // *K++, w19 in next round
127
//add w27,w27,w17 // h+=Sigma0(a)
128
#ifndef __AARCH64EB__
129
rev w4,w4 // 1
130
#endif
131
ldp w5,w6,[x1],#2*4
132
add w27,w27,w17 // h+=Sigma0(a)
133
ror w16,w23,#6
134
add w26,w26,w28 // h+=K[i]
135
eor w7,w23,w23,ror#14
136
and w17,w24,w23
137
bic w28,w25,w23
138
add w26,w26,w4 // h+=X[i]
139
orr w17,w17,w28 // Ch(e,f,g)
140
eor w28,w27,w20 // a^b, b^c in next round
141
eor w16,w16,w7,ror#11 // Sigma1(e)
142
ror w7,w27,#2
143
add w26,w26,w17 // h+=Ch(e,f,g)
144
eor w17,w27,w27,ror#9
145
add w26,w26,w16 // h+=Sigma1(e)
146
and w19,w19,w28 // (b^c)&=(a^b)
147
add w22,w22,w26 // d+=h
148
eor w19,w19,w20 // Maj(a,b,c)
149
eor w17,w7,w17,ror#13 // Sigma0(a)
150
add w26,w26,w19 // h+=Maj(a,b,c)
151
ldr w19,[x30],#4 // *K++, w28 in next round
152
//add w26,w26,w17 // h+=Sigma0(a)
153
#ifndef __AARCH64EB__
154
rev w5,w5 // 2
155
#endif
156
add w26,w26,w17 // h+=Sigma0(a)
157
ror w16,w22,#6
158
add w25,w25,w19 // h+=K[i]
159
eor w8,w22,w22,ror#14
160
and w17,w23,w22
161
bic w19,w24,w22
162
add w25,w25,w5 // h+=X[i]
163
orr w17,w17,w19 // Ch(e,f,g)
164
eor w19,w26,w27 // a^b, b^c in next round
165
eor w16,w16,w8,ror#11 // Sigma1(e)
166
ror w8,w26,#2
167
add w25,w25,w17 // h+=Ch(e,f,g)
168
eor w17,w26,w26,ror#9
169
add w25,w25,w16 // h+=Sigma1(e)
170
and w28,w28,w19 // (b^c)&=(a^b)
171
add w21,w21,w25 // d+=h
172
eor w28,w28,w27 // Maj(a,b,c)
173
eor w17,w8,w17,ror#13 // Sigma0(a)
174
add w25,w25,w28 // h+=Maj(a,b,c)
175
ldr w28,[x30],#4 // *K++, w19 in next round
176
//add w25,w25,w17 // h+=Sigma0(a)
177
#ifndef __AARCH64EB__
178
rev w6,w6 // 3
179
#endif
180
ldp w7,w8,[x1],#2*4
181
add w25,w25,w17 // h+=Sigma0(a)
182
ror w16,w21,#6
183
add w24,w24,w28 // h+=K[i]
184
eor w9,w21,w21,ror#14
185
and w17,w22,w21
186
bic w28,w23,w21
187
add w24,w24,w6 // h+=X[i]
188
orr w17,w17,w28 // Ch(e,f,g)
189
eor w28,w25,w26 // a^b, b^c in next round
190
eor w16,w16,w9,ror#11 // Sigma1(e)
191
ror w9,w25,#2
192
add w24,w24,w17 // h+=Ch(e,f,g)
193
eor w17,w25,w25,ror#9
194
add w24,w24,w16 // h+=Sigma1(e)
195
and w19,w19,w28 // (b^c)&=(a^b)
196
add w20,w20,w24 // d+=h
197
eor w19,w19,w26 // Maj(a,b,c)
198
eor w17,w9,w17,ror#13 // Sigma0(a)
199
add w24,w24,w19 // h+=Maj(a,b,c)
200
ldr w19,[x30],#4 // *K++, w28 in next round
201
//add w24,w24,w17 // h+=Sigma0(a)
202
#ifndef __AARCH64EB__
203
rev w7,w7 // 4
204
#endif
205
add w24,w24,w17 // h+=Sigma0(a)
206
ror w16,w20,#6
207
add w23,w23,w19 // h+=K[i]
208
eor w10,w20,w20,ror#14
209
and w17,w21,w20
210
bic w19,w22,w20
211
add w23,w23,w7 // h+=X[i]
212
orr w17,w17,w19 // Ch(e,f,g)
213
eor w19,w24,w25 // a^b, b^c in next round
214
eor w16,w16,w10,ror#11 // Sigma1(e)
215
ror w10,w24,#2
216
add w23,w23,w17 // h+=Ch(e,f,g)
217
eor w17,w24,w24,ror#9
218
add w23,w23,w16 // h+=Sigma1(e)
219
and w28,w28,w19 // (b^c)&=(a^b)
220
add w27,w27,w23 // d+=h
221
eor w28,w28,w25 // Maj(a,b,c)
222
eor w17,w10,w17,ror#13 // Sigma0(a)
223
add w23,w23,w28 // h+=Maj(a,b,c)
224
ldr w28,[x30],#4 // *K++, w19 in next round
225
//add w23,w23,w17 // h+=Sigma0(a)
226
#ifndef __AARCH64EB__
227
rev w8,w8 // 5
228
#endif
229
ldp w9,w10,[x1],#2*4
230
add w23,w23,w17 // h+=Sigma0(a)
231
ror w16,w27,#6
232
add w22,w22,w28 // h+=K[i]
233
eor w11,w27,w27,ror#14
234
and w17,w20,w27
235
bic w28,w21,w27
236
add w22,w22,w8 // h+=X[i]
237
orr w17,w17,w28 // Ch(e,f,g)
238
eor w28,w23,w24 // a^b, b^c in next round
239
eor w16,w16,w11,ror#11 // Sigma1(e)
240
ror w11,w23,#2
241
add w22,w22,w17 // h+=Ch(e,f,g)
242
eor w17,w23,w23,ror#9
243
add w22,w22,w16 // h+=Sigma1(e)
244
and w19,w19,w28 // (b^c)&=(a^b)
245
add w26,w26,w22 // d+=h
246
eor w19,w19,w24 // Maj(a,b,c)
247
eor w17,w11,w17,ror#13 // Sigma0(a)
248
add w22,w22,w19 // h+=Maj(a,b,c)
249
ldr w19,[x30],#4 // *K++, w28 in next round
250
//add w22,w22,w17 // h+=Sigma0(a)
251
#ifndef __AARCH64EB__
252
rev w9,w9 // 6
253
#endif
254
add w22,w22,w17 // h+=Sigma0(a)
255
ror w16,w26,#6
256
add w21,w21,w19 // h+=K[i]
257
eor w12,w26,w26,ror#14
258
and w17,w27,w26
259
bic w19,w20,w26
260
add w21,w21,w9 // h+=X[i]
261
orr w17,w17,w19 // Ch(e,f,g)
262
eor w19,w22,w23 // a^b, b^c in next round
263
eor w16,w16,w12,ror#11 // Sigma1(e)
264
ror w12,w22,#2
265
add w21,w21,w17 // h+=Ch(e,f,g)
266
eor w17,w22,w22,ror#9
267
add w21,w21,w16 // h+=Sigma1(e)
268
and w28,w28,w19 // (b^c)&=(a^b)
269
add w25,w25,w21 // d+=h
270
eor w28,w28,w23 // Maj(a,b,c)
271
eor w17,w12,w17,ror#13 // Sigma0(a)
272
add w21,w21,w28 // h+=Maj(a,b,c)
273
ldr w28,[x30],#4 // *K++, w19 in next round
274
//add w21,w21,w17 // h+=Sigma0(a)
275
#ifndef __AARCH64EB__
276
rev w10,w10 // 7
277
#endif
278
ldp w11,w12,[x1],#2*4
279
add w21,w21,w17 // h+=Sigma0(a)
280
ror w16,w25,#6
281
add w20,w20,w28 // h+=K[i]
282
eor w13,w25,w25,ror#14
283
and w17,w26,w25
284
bic w28,w27,w25
285
add w20,w20,w10 // h+=X[i]
286
orr w17,w17,w28 // Ch(e,f,g)
287
eor w28,w21,w22 // a^b, b^c in next round
288
eor w16,w16,w13,ror#11 // Sigma1(e)
289
ror w13,w21,#2
290
add w20,w20,w17 // h+=Ch(e,f,g)
291
eor w17,w21,w21,ror#9
292
add w20,w20,w16 // h+=Sigma1(e)
293
and w19,w19,w28 // (b^c)&=(a^b)
294
add w24,w24,w20 // d+=h
295
eor w19,w19,w22 // Maj(a,b,c)
296
eor w17,w13,w17,ror#13 // Sigma0(a)
297
add w20,w20,w19 // h+=Maj(a,b,c)
298
ldr w19,[x30],#4 // *K++, w28 in next round
299
//add w20,w20,w17 // h+=Sigma0(a)
300
#ifndef __AARCH64EB__
301
rev w11,w11 // 8
302
#endif
303
add w20,w20,w17 // h+=Sigma0(a)
304
ror w16,w24,#6
305
add w27,w27,w19 // h+=K[i]
306
eor w14,w24,w24,ror#14
307
and w17,w25,w24
308
bic w19,w26,w24
309
add w27,w27,w11 // h+=X[i]
310
orr w17,w17,w19 // Ch(e,f,g)
311
eor w19,w20,w21 // a^b, b^c in next round
312
eor w16,w16,w14,ror#11 // Sigma1(e)
313
ror w14,w20,#2
314
add w27,w27,w17 // h+=Ch(e,f,g)
315
eor w17,w20,w20,ror#9
316
add w27,w27,w16 // h+=Sigma1(e)
317
and w28,w28,w19 // (b^c)&=(a^b)
318
add w23,w23,w27 // d+=h
319
eor w28,w28,w21 // Maj(a,b,c)
320
eor w17,w14,w17,ror#13 // Sigma0(a)
321
add w27,w27,w28 // h+=Maj(a,b,c)
322
ldr w28,[x30],#4 // *K++, w19 in next round
323
//add w27,w27,w17 // h+=Sigma0(a)
324
#ifndef __AARCH64EB__
325
rev w12,w12 // 9
326
#endif
327
ldp w13,w14,[x1],#2*4
328
add w27,w27,w17 // h+=Sigma0(a)
329
ror w16,w23,#6
330
add w26,w26,w28 // h+=K[i]
331
eor w15,w23,w23,ror#14
332
and w17,w24,w23
333
bic w28,w25,w23
334
add w26,w26,w12 // h+=X[i]
335
orr w17,w17,w28 // Ch(e,f,g)
336
eor w28,w27,w20 // a^b, b^c in next round
337
eor w16,w16,w15,ror#11 // Sigma1(e)
338
ror w15,w27,#2
339
add w26,w26,w17 // h+=Ch(e,f,g)
340
eor w17,w27,w27,ror#9
341
add w26,w26,w16 // h+=Sigma1(e)
342
and w19,w19,w28 // (b^c)&=(a^b)
343
add w22,w22,w26 // d+=h
344
eor w19,w19,w20 // Maj(a,b,c)
345
eor w17,w15,w17,ror#13 // Sigma0(a)
346
add w26,w26,w19 // h+=Maj(a,b,c)
347
ldr w19,[x30],#4 // *K++, w28 in next round
348
//add w26,w26,w17 // h+=Sigma0(a)
349
#ifndef __AARCH64EB__
350
rev w13,w13 // 10
351
#endif
352
add w26,w26,w17 // h+=Sigma0(a)
353
ror w16,w22,#6
354
add w25,w25,w19 // h+=K[i]
355
eor w0,w22,w22,ror#14
356
and w17,w23,w22
357
bic w19,w24,w22
358
add w25,w25,w13 // h+=X[i]
359
orr w17,w17,w19 // Ch(e,f,g)
360
eor w19,w26,w27 // a^b, b^c in next round
361
eor w16,w16,w0,ror#11 // Sigma1(e)
362
ror w0,w26,#2
363
add w25,w25,w17 // h+=Ch(e,f,g)
364
eor w17,w26,w26,ror#9
365
add w25,w25,w16 // h+=Sigma1(e)
366
and w28,w28,w19 // (b^c)&=(a^b)
367
add w21,w21,w25 // d+=h
368
eor w28,w28,w27 // Maj(a,b,c)
369
eor w17,w0,w17,ror#13 // Sigma0(a)
370
add w25,w25,w28 // h+=Maj(a,b,c)
371
ldr w28,[x30],#4 // *K++, w19 in next round
372
//add w25,w25,w17 // h+=Sigma0(a)
373
#ifndef __AARCH64EB__
374
rev w14,w14 // 11
375
#endif
376
ldp w15,w0,[x1],#2*4
377
add w25,w25,w17 // h+=Sigma0(a)
378
str w6,[sp,#12]
379
ror w16,w21,#6
380
add w24,w24,w28 // h+=K[i]
381
eor w6,w21,w21,ror#14
382
and w17,w22,w21
383
bic w28,w23,w21
384
add w24,w24,w14 // h+=X[i]
385
orr w17,w17,w28 // Ch(e,f,g)
386
eor w28,w25,w26 // a^b, b^c in next round
387
eor w16,w16,w6,ror#11 // Sigma1(e)
388
ror w6,w25,#2
389
add w24,w24,w17 // h+=Ch(e,f,g)
390
eor w17,w25,w25,ror#9
391
add w24,w24,w16 // h+=Sigma1(e)
392
and w19,w19,w28 // (b^c)&=(a^b)
393
add w20,w20,w24 // d+=h
394
eor w19,w19,w26 // Maj(a,b,c)
395
eor w17,w6,w17,ror#13 // Sigma0(a)
396
add w24,w24,w19 // h+=Maj(a,b,c)
397
ldr w19,[x30],#4 // *K++, w28 in next round
398
//add w24,w24,w17 // h+=Sigma0(a)
399
#ifndef __AARCH64EB__
400
rev w15,w15 // 12
401
#endif
402
add w24,w24,w17 // h+=Sigma0(a)
403
str w7,[sp,#0]
404
ror w16,w20,#6
405
add w23,w23,w19 // h+=K[i]
406
eor w7,w20,w20,ror#14
407
and w17,w21,w20
408
bic w19,w22,w20
409
add w23,w23,w15 // h+=X[i]
410
orr w17,w17,w19 // Ch(e,f,g)
411
eor w19,w24,w25 // a^b, b^c in next round
412
eor w16,w16,w7,ror#11 // Sigma1(e)
413
ror w7,w24,#2
414
add w23,w23,w17 // h+=Ch(e,f,g)
415
eor w17,w24,w24,ror#9
416
add w23,w23,w16 // h+=Sigma1(e)
417
and w28,w28,w19 // (b^c)&=(a^b)
418
add w27,w27,w23 // d+=h
419
eor w28,w28,w25 // Maj(a,b,c)
420
eor w17,w7,w17,ror#13 // Sigma0(a)
421
add w23,w23,w28 // h+=Maj(a,b,c)
422
ldr w28,[x30],#4 // *K++, w19 in next round
423
//add w23,w23,w17 // h+=Sigma0(a)
424
#ifndef __AARCH64EB__
425
rev w0,w0 // 13
426
#endif
427
ldp w1,w2,[x1]
428
add w23,w23,w17 // h+=Sigma0(a)
429
str w8,[sp,#4]
430
ror w16,w27,#6
431
add w22,w22,w28 // h+=K[i]
432
eor w8,w27,w27,ror#14
433
and w17,w20,w27
434
bic w28,w21,w27
435
add w22,w22,w0 // h+=X[i]
436
orr w17,w17,w28 // Ch(e,f,g)
437
eor w28,w23,w24 // a^b, b^c in next round
438
eor w16,w16,w8,ror#11 // Sigma1(e)
439
ror w8,w23,#2
440
add w22,w22,w17 // h+=Ch(e,f,g)
441
eor w17,w23,w23,ror#9
442
add w22,w22,w16 // h+=Sigma1(e)
443
and w19,w19,w28 // (b^c)&=(a^b)
444
add w26,w26,w22 // d+=h
445
eor w19,w19,w24 // Maj(a,b,c)
446
eor w17,w8,w17,ror#13 // Sigma0(a)
447
add w22,w22,w19 // h+=Maj(a,b,c)
448
ldr w19,[x30],#4 // *K++, w28 in next round
449
//add w22,w22,w17 // h+=Sigma0(a)
450
#ifndef __AARCH64EB__
451
rev w1,w1 // 14
452
#endif
453
ldr w6,[sp,#12]
454
add w22,w22,w17 // h+=Sigma0(a)
455
str w9,[sp,#8]
456
ror w16,w26,#6
457
add w21,w21,w19 // h+=K[i]
458
eor w9,w26,w26,ror#14
459
and w17,w27,w26
460
bic w19,w20,w26
461
add w21,w21,w1 // h+=X[i]
462
orr w17,w17,w19 // Ch(e,f,g)
463
eor w19,w22,w23 // a^b, b^c in next round
464
eor w16,w16,w9,ror#11 // Sigma1(e)
465
ror w9,w22,#2
466
add w21,w21,w17 // h+=Ch(e,f,g)
467
eor w17,w22,w22,ror#9
468
add w21,w21,w16 // h+=Sigma1(e)
469
and w28,w28,w19 // (b^c)&=(a^b)
470
add w25,w25,w21 // d+=h
471
eor w28,w28,w23 // Maj(a,b,c)
472
eor w17,w9,w17,ror#13 // Sigma0(a)
473
add w21,w21,w28 // h+=Maj(a,b,c)
474
ldr w28,[x30],#4 // *K++, w19 in next round
475
//add w21,w21,w17 // h+=Sigma0(a)
476
#ifndef __AARCH64EB__
477
rev w2,w2 // 15
478
#endif
479
ldr w7,[sp,#0]
480
add w21,w21,w17 // h+=Sigma0(a)
481
str w10,[sp,#12]
482
ror w16,w25,#6
483
add w20,w20,w28 // h+=K[i]
484
ror w9,w4,#7
485
and w17,w26,w25
486
ror w8,w1,#17
487
bic w28,w27,w25
488
ror w10,w21,#2
489
add w20,w20,w2 // h+=X[i]
490
eor w16,w16,w25,ror#11
491
eor w9,w9,w4,ror#18
492
orr w17,w17,w28 // Ch(e,f,g)
493
eor w28,w21,w22 // a^b, b^c in next round
494
eor w16,w16,w25,ror#25 // Sigma1(e)
495
eor w10,w10,w21,ror#13
496
add w20,w20,w17 // h+=Ch(e,f,g)
497
and w19,w19,w28 // (b^c)&=(a^b)
498
eor w8,w8,w1,ror#19
499
eor w9,w9,w4,lsr#3 // sigma0(X[i+1])
500
add w20,w20,w16 // h+=Sigma1(e)
501
eor w19,w19,w22 // Maj(a,b,c)
502
eor w17,w10,w21,ror#22 // Sigma0(a)
503
eor w8,w8,w1,lsr#10 // sigma1(X[i+14])
504
add w3,w3,w12
505
add w24,w24,w20 // d+=h
506
add w20,w20,w19 // h+=Maj(a,b,c)
507
ldr w19,[x30],#4 // *K++, w28 in next round
508
add w3,w3,w9
509
add w20,w20,w17 // h+=Sigma0(a)
510
add w3,w3,w8
511
.Loop_16_xx:
512
ldr w8,[sp,#4]
513
str w11,[sp,#0]
514
ror w16,w24,#6
515
add w27,w27,w19 // h+=K[i]
516
ror w10,w5,#7
517
and w17,w25,w24
518
ror w9,w2,#17
519
bic w19,w26,w24
520
ror w11,w20,#2
521
add w27,w27,w3 // h+=X[i]
522
eor w16,w16,w24,ror#11
523
eor w10,w10,w5,ror#18
524
orr w17,w17,w19 // Ch(e,f,g)
525
eor w19,w20,w21 // a^b, b^c in next round
526
eor w16,w16,w24,ror#25 // Sigma1(e)
527
eor w11,w11,w20,ror#13
528
add w27,w27,w17 // h+=Ch(e,f,g)
529
and w28,w28,w19 // (b^c)&=(a^b)
530
eor w9,w9,w2,ror#19
531
eor w10,w10,w5,lsr#3 // sigma0(X[i+1])
532
add w27,w27,w16 // h+=Sigma1(e)
533
eor w28,w28,w21 // Maj(a,b,c)
534
eor w17,w11,w20,ror#22 // Sigma0(a)
535
eor w9,w9,w2,lsr#10 // sigma1(X[i+14])
536
add w4,w4,w13
537
add w23,w23,w27 // d+=h
538
add w27,w27,w28 // h+=Maj(a,b,c)
539
ldr w28,[x30],#4 // *K++, w19 in next round
540
add w4,w4,w10
541
add w27,w27,w17 // h+=Sigma0(a)
542
add w4,w4,w9
543
ldr w9,[sp,#8]
544
str w12,[sp,#4]
545
ror w16,w23,#6
546
add w26,w26,w28 // h+=K[i]
547
ror w11,w6,#7
548
and w17,w24,w23
549
ror w10,w3,#17
550
bic w28,w25,w23
551
ror w12,w27,#2
552
add w26,w26,w4 // h+=X[i]
553
eor w16,w16,w23,ror#11
554
eor w11,w11,w6,ror#18
555
orr w17,w17,w28 // Ch(e,f,g)
556
eor w28,w27,w20 // a^b, b^c in next round
557
eor w16,w16,w23,ror#25 // Sigma1(e)
558
eor w12,w12,w27,ror#13
559
add w26,w26,w17 // h+=Ch(e,f,g)
560
and w19,w19,w28 // (b^c)&=(a^b)
561
eor w10,w10,w3,ror#19
562
eor w11,w11,w6,lsr#3 // sigma0(X[i+1])
563
add w26,w26,w16 // h+=Sigma1(e)
564
eor w19,w19,w20 // Maj(a,b,c)
565
eor w17,w12,w27,ror#22 // Sigma0(a)
566
eor w10,w10,w3,lsr#10 // sigma1(X[i+14])
567
add w5,w5,w14
568
add w22,w22,w26 // d+=h
569
add w26,w26,w19 // h+=Maj(a,b,c)
570
ldr w19,[x30],#4 // *K++, w28 in next round
571
add w5,w5,w11
572
add w26,w26,w17 // h+=Sigma0(a)
573
add w5,w5,w10
574
ldr w10,[sp,#12]
575
str w13,[sp,#8]
576
ror w16,w22,#6
577
add w25,w25,w19 // h+=K[i]
578
ror w12,w7,#7
579
and w17,w23,w22
580
ror w11,w4,#17
581
bic w19,w24,w22
582
ror w13,w26,#2
583
add w25,w25,w5 // h+=X[i]
584
eor w16,w16,w22,ror#11
585
eor w12,w12,w7,ror#18
586
orr w17,w17,w19 // Ch(e,f,g)
587
eor w19,w26,w27 // a^b, b^c in next round
588
eor w16,w16,w22,ror#25 // Sigma1(e)
589
eor w13,w13,w26,ror#13
590
add w25,w25,w17 // h+=Ch(e,f,g)
591
and w28,w28,w19 // (b^c)&=(a^b)
592
eor w11,w11,w4,ror#19
593
eor w12,w12,w7,lsr#3 // sigma0(X[i+1])
594
add w25,w25,w16 // h+=Sigma1(e)
595
eor w28,w28,w27 // Maj(a,b,c)
596
eor w17,w13,w26,ror#22 // Sigma0(a)
597
eor w11,w11,w4,lsr#10 // sigma1(X[i+14])
598
add w6,w6,w15
599
add w21,w21,w25 // d+=h
600
add w25,w25,w28 // h+=Maj(a,b,c)
601
ldr w28,[x30],#4 // *K++, w19 in next round
602
add w6,w6,w12
603
add w25,w25,w17 // h+=Sigma0(a)
604
add w6,w6,w11
605
ldr w11,[sp,#0]
606
str w14,[sp,#12]
607
ror w16,w21,#6
608
add w24,w24,w28 // h+=K[i]
609
ror w13,w8,#7
610
and w17,w22,w21
611
ror w12,w5,#17
612
bic w28,w23,w21
613
ror w14,w25,#2
614
add w24,w24,w6 // h+=X[i]
615
eor w16,w16,w21,ror#11
616
eor w13,w13,w8,ror#18
617
orr w17,w17,w28 // Ch(e,f,g)
618
eor w28,w25,w26 // a^b, b^c in next round
619
eor w16,w16,w21,ror#25 // Sigma1(e)
620
eor w14,w14,w25,ror#13
621
add w24,w24,w17 // h+=Ch(e,f,g)
622
and w19,w19,w28 // (b^c)&=(a^b)
623
eor w12,w12,w5,ror#19
624
eor w13,w13,w8,lsr#3 // sigma0(X[i+1])
625
add w24,w24,w16 // h+=Sigma1(e)
626
eor w19,w19,w26 // Maj(a,b,c)
627
eor w17,w14,w25,ror#22 // Sigma0(a)
628
eor w12,w12,w5,lsr#10 // sigma1(X[i+14])
629
add w7,w7,w0
630
add w20,w20,w24 // d+=h
631
add w24,w24,w19 // h+=Maj(a,b,c)
632
ldr w19,[x30],#4 // *K++, w28 in next round
633
add w7,w7,w13
634
add w24,w24,w17 // h+=Sigma0(a)
635
add w7,w7,w12
636
ldr w12,[sp,#4]
637
str w15,[sp,#0]
638
ror w16,w20,#6
639
add w23,w23,w19 // h+=K[i]
640
ror w14,w9,#7
641
and w17,w21,w20
642
ror w13,w6,#17
643
bic w19,w22,w20
644
ror w15,w24,#2
645
add w23,w23,w7 // h+=X[i]
646
eor w16,w16,w20,ror#11
647
eor w14,w14,w9,ror#18
648
orr w17,w17,w19 // Ch(e,f,g)
649
eor w19,w24,w25 // a^b, b^c in next round
650
eor w16,w16,w20,ror#25 // Sigma1(e)
651
eor w15,w15,w24,ror#13
652
add w23,w23,w17 // h+=Ch(e,f,g)
653
and w28,w28,w19 // (b^c)&=(a^b)
654
eor w13,w13,w6,ror#19
655
eor w14,w14,w9,lsr#3 // sigma0(X[i+1])
656
add w23,w23,w16 // h+=Sigma1(e)
657
eor w28,w28,w25 // Maj(a,b,c)
658
eor w17,w15,w24,ror#22 // Sigma0(a)
659
eor w13,w13,w6,lsr#10 // sigma1(X[i+14])
660
add w8,w8,w1
661
add w27,w27,w23 // d+=h
662
add w23,w23,w28 // h+=Maj(a,b,c)
663
ldr w28,[x30],#4 // *K++, w19 in next round
664
add w8,w8,w14
665
add w23,w23,w17 // h+=Sigma0(a)
666
add w8,w8,w13
667
ldr w13,[sp,#8]
668
str w0,[sp,#4]
669
ror w16,w27,#6
670
add w22,w22,w28 // h+=K[i]
671
ror w15,w10,#7
672
and w17,w20,w27
673
ror w14,w7,#17
674
bic w28,w21,w27
675
ror w0,w23,#2
676
add w22,w22,w8 // h+=X[i]
677
eor w16,w16,w27,ror#11
678
eor w15,w15,w10,ror#18
679
orr w17,w17,w28 // Ch(e,f,g)
680
eor w28,w23,w24 // a^b, b^c in next round
681
eor w16,w16,w27,ror#25 // Sigma1(e)
682
eor w0,w0,w23,ror#13
683
add w22,w22,w17 // h+=Ch(e,f,g)
684
and w19,w19,w28 // (b^c)&=(a^b)
685
eor w14,w14,w7,ror#19
686
eor w15,w15,w10,lsr#3 // sigma0(X[i+1])
687
add w22,w22,w16 // h+=Sigma1(e)
688
eor w19,w19,w24 // Maj(a,b,c)
689
eor w17,w0,w23,ror#22 // Sigma0(a)
690
eor w14,w14,w7,lsr#10 // sigma1(X[i+14])
691
add w9,w9,w2
692
add w26,w26,w22 // d+=h
693
add w22,w22,w19 // h+=Maj(a,b,c)
694
ldr w19,[x30],#4 // *K++, w28 in next round
695
add w9,w9,w15
696
add w22,w22,w17 // h+=Sigma0(a)
697
add w9,w9,w14
698
ldr w14,[sp,#12]
699
str w1,[sp,#8]
700
ror w16,w26,#6
701
add w21,w21,w19 // h+=K[i]
702
ror w0,w11,#7
703
and w17,w27,w26
704
ror w15,w8,#17
705
bic w19,w20,w26
706
ror w1,w22,#2
707
add w21,w21,w9 // h+=X[i]
708
eor w16,w16,w26,ror#11
709
eor w0,w0,w11,ror#18
710
orr w17,w17,w19 // Ch(e,f,g)
711
eor w19,w22,w23 // a^b, b^c in next round
712
eor w16,w16,w26,ror#25 // Sigma1(e)
713
eor w1,w1,w22,ror#13
714
add w21,w21,w17 // h+=Ch(e,f,g)
715
and w28,w28,w19 // (b^c)&=(a^b)
716
eor w15,w15,w8,ror#19
717
eor w0,w0,w11,lsr#3 // sigma0(X[i+1])
718
add w21,w21,w16 // h+=Sigma1(e)
719
eor w28,w28,w23 // Maj(a,b,c)
720
eor w17,w1,w22,ror#22 // Sigma0(a)
721
eor w15,w15,w8,lsr#10 // sigma1(X[i+14])
722
add w10,w10,w3
723
add w25,w25,w21 // d+=h
724
add w21,w21,w28 // h+=Maj(a,b,c)
725
ldr w28,[x30],#4 // *K++, w19 in next round
726
add w10,w10,w0
727
add w21,w21,w17 // h+=Sigma0(a)
728
add w10,w10,w15
729
ldr w15,[sp,#0]
730
str w2,[sp,#12]
731
ror w16,w25,#6
732
add w20,w20,w28 // h+=K[i]
733
ror w1,w12,#7
734
and w17,w26,w25
735
ror w0,w9,#17
736
bic w28,w27,w25
737
ror w2,w21,#2
738
add w20,w20,w10 // h+=X[i]
739
eor w16,w16,w25,ror#11
740
eor w1,w1,w12,ror#18
741
orr w17,w17,w28 // Ch(e,f,g)
742
eor w28,w21,w22 // a^b, b^c in next round
743
eor w16,w16,w25,ror#25 // Sigma1(e)
744
eor w2,w2,w21,ror#13
745
add w20,w20,w17 // h+=Ch(e,f,g)
746
and w19,w19,w28 // (b^c)&=(a^b)
747
eor w0,w0,w9,ror#19
748
eor w1,w1,w12,lsr#3 // sigma0(X[i+1])
749
add w20,w20,w16 // h+=Sigma1(e)
750
eor w19,w19,w22 // Maj(a,b,c)
751
eor w17,w2,w21,ror#22 // Sigma0(a)
752
eor w0,w0,w9,lsr#10 // sigma1(X[i+14])
753
add w11,w11,w4
754
add w24,w24,w20 // d+=h
755
add w20,w20,w19 // h+=Maj(a,b,c)
756
ldr w19,[x30],#4 // *K++, w28 in next round
757
add w11,w11,w1
758
add w20,w20,w17 // h+=Sigma0(a)
759
add w11,w11,w0
760
ldr w0,[sp,#4]
761
str w3,[sp,#0]
762
ror w16,w24,#6
763
add w27,w27,w19 // h+=K[i]
764
ror w2,w13,#7
765
and w17,w25,w24
766
ror w1,w10,#17
767
bic w19,w26,w24
768
ror w3,w20,#2
769
add w27,w27,w11 // h+=X[i]
770
eor w16,w16,w24,ror#11
771
eor w2,w2,w13,ror#18
772
orr w17,w17,w19 // Ch(e,f,g)
773
eor w19,w20,w21 // a^b, b^c in next round
774
eor w16,w16,w24,ror#25 // Sigma1(e)
775
eor w3,w3,w20,ror#13
776
add w27,w27,w17 // h+=Ch(e,f,g)
777
and w28,w28,w19 // (b^c)&=(a^b)
778
eor w1,w1,w10,ror#19
779
eor w2,w2,w13,lsr#3 // sigma0(X[i+1])
780
add w27,w27,w16 // h+=Sigma1(e)
781
eor w28,w28,w21 // Maj(a,b,c)
782
eor w17,w3,w20,ror#22 // Sigma0(a)
783
eor w1,w1,w10,lsr#10 // sigma1(X[i+14])
784
add w12,w12,w5
785
add w23,w23,w27 // d+=h
786
add w27,w27,w28 // h+=Maj(a,b,c)
787
ldr w28,[x30],#4 // *K++, w19 in next round
788
add w12,w12,w2
789
add w27,w27,w17 // h+=Sigma0(a)
790
add w12,w12,w1
791
ldr w1,[sp,#8]
792
str w4,[sp,#4]
793
ror w16,w23,#6
794
add w26,w26,w28 // h+=K[i]
795
ror w3,w14,#7
796
and w17,w24,w23
797
ror w2,w11,#17
798
bic w28,w25,w23
799
ror w4,w27,#2
800
add w26,w26,w12 // h+=X[i]
801
eor w16,w16,w23,ror#11
802
eor w3,w3,w14,ror#18
803
orr w17,w17,w28 // Ch(e,f,g)
804
eor w28,w27,w20 // a^b, b^c in next round
805
eor w16,w16,w23,ror#25 // Sigma1(e)
806
eor w4,w4,w27,ror#13
807
add w26,w26,w17 // h+=Ch(e,f,g)
808
and w19,w19,w28 // (b^c)&=(a^b)
809
eor w2,w2,w11,ror#19
810
eor w3,w3,w14,lsr#3 // sigma0(X[i+1])
811
add w26,w26,w16 // h+=Sigma1(e)
812
eor w19,w19,w20 // Maj(a,b,c)
813
eor w17,w4,w27,ror#22 // Sigma0(a)
814
eor w2,w2,w11,lsr#10 // sigma1(X[i+14])
815
add w13,w13,w6
816
add w22,w22,w26 // d+=h
817
add w26,w26,w19 // h+=Maj(a,b,c)
818
ldr w19,[x30],#4 // *K++, w28 in next round
819
add w13,w13,w3
820
add w26,w26,w17 // h+=Sigma0(a)
821
add w13,w13,w2
822
ldr w2,[sp,#12]
823
str w5,[sp,#8]
824
ror w16,w22,#6
825
add w25,w25,w19 // h+=K[i]
826
ror w4,w15,#7
827
and w17,w23,w22
828
ror w3,w12,#17
829
bic w19,w24,w22
830
ror w5,w26,#2
831
add w25,w25,w13 // h+=X[i]
832
eor w16,w16,w22,ror#11
833
eor w4,w4,w15,ror#18
834
orr w17,w17,w19 // Ch(e,f,g)
835
eor w19,w26,w27 // a^b, b^c in next round
836
eor w16,w16,w22,ror#25 // Sigma1(e)
837
eor w5,w5,w26,ror#13
838
add w25,w25,w17 // h+=Ch(e,f,g)
839
and w28,w28,w19 // (b^c)&=(a^b)
840
eor w3,w3,w12,ror#19
841
eor w4,w4,w15,lsr#3 // sigma0(X[i+1])
842
add w25,w25,w16 // h+=Sigma1(e)
843
eor w28,w28,w27 // Maj(a,b,c)
844
eor w17,w5,w26,ror#22 // Sigma0(a)
845
eor w3,w3,w12,lsr#10 // sigma1(X[i+14])
846
add w14,w14,w7
847
add w21,w21,w25 // d+=h
848
add w25,w25,w28 // h+=Maj(a,b,c)
849
ldr w28,[x30],#4 // *K++, w19 in next round
850
add w14,w14,w4
851
add w25,w25,w17 // h+=Sigma0(a)
852
add w14,w14,w3
853
ldr w3,[sp,#0]
854
str w6,[sp,#12]
855
ror w16,w21,#6
856
add w24,w24,w28 // h+=K[i]
857
ror w5,w0,#7
858
and w17,w22,w21
859
ror w4,w13,#17
860
bic w28,w23,w21
861
ror w6,w25,#2
862
add w24,w24,w14 // h+=X[i]
863
eor w16,w16,w21,ror#11
864
eor w5,w5,w0,ror#18
865
orr w17,w17,w28 // Ch(e,f,g)
866
eor w28,w25,w26 // a^b, b^c in next round
867
eor w16,w16,w21,ror#25 // Sigma1(e)
868
eor w6,w6,w25,ror#13
869
add w24,w24,w17 // h+=Ch(e,f,g)
870
and w19,w19,w28 // (b^c)&=(a^b)
871
eor w4,w4,w13,ror#19
872
eor w5,w5,w0,lsr#3 // sigma0(X[i+1])
873
add w24,w24,w16 // h+=Sigma1(e)
874
eor w19,w19,w26 // Maj(a,b,c)
875
eor w17,w6,w25,ror#22 // Sigma0(a)
876
eor w4,w4,w13,lsr#10 // sigma1(X[i+14])
877
add w15,w15,w8
878
add w20,w20,w24 // d+=h
879
add w24,w24,w19 // h+=Maj(a,b,c)
880
ldr w19,[x30],#4 // *K++, w28 in next round
881
add w15,w15,w5
882
add w24,w24,w17 // h+=Sigma0(a)
883
add w15,w15,w4
884
ldr w4,[sp,#4]
885
str w7,[sp,#0]
886
ror w16,w20,#6
887
add w23,w23,w19 // h+=K[i]
888
ror w6,w1,#7
889
and w17,w21,w20
890
ror w5,w14,#17
891
bic w19,w22,w20
892
ror w7,w24,#2
893
add w23,w23,w15 // h+=X[i]
894
eor w16,w16,w20,ror#11
895
eor w6,w6,w1,ror#18
896
orr w17,w17,w19 // Ch(e,f,g)
897
eor w19,w24,w25 // a^b, b^c in next round
898
eor w16,w16,w20,ror#25 // Sigma1(e)
899
eor w7,w7,w24,ror#13
900
add w23,w23,w17 // h+=Ch(e,f,g)
901
and w28,w28,w19 // (b^c)&=(a^b)
902
eor w5,w5,w14,ror#19
903
eor w6,w6,w1,lsr#3 // sigma0(X[i+1])
904
add w23,w23,w16 // h+=Sigma1(e)
905
eor w28,w28,w25 // Maj(a,b,c)
906
eor w17,w7,w24,ror#22 // Sigma0(a)
907
eor w5,w5,w14,lsr#10 // sigma1(X[i+14])
908
add w0,w0,w9
909
add w27,w27,w23 // d+=h
910
add w23,w23,w28 // h+=Maj(a,b,c)
911
ldr w28,[x30],#4 // *K++, w19 in next round
912
add w0,w0,w6
913
add w23,w23,w17 // h+=Sigma0(a)
914
add w0,w0,w5
915
ldr w5,[sp,#8]
916
str w8,[sp,#4]
917
ror w16,w27,#6
918
add w22,w22,w28 // h+=K[i]
919
ror w7,w2,#7
920
and w17,w20,w27
921
ror w6,w15,#17
922
bic w28,w21,w27
923
ror w8,w23,#2
924
add w22,w22,w0 // h+=X[i]
925
eor w16,w16,w27,ror#11
926
eor w7,w7,w2,ror#18
927
orr w17,w17,w28 // Ch(e,f,g)
928
eor w28,w23,w24 // a^b, b^c in next round
929
eor w16,w16,w27,ror#25 // Sigma1(e)
930
eor w8,w8,w23,ror#13
931
add w22,w22,w17 // h+=Ch(e,f,g)
932
and w19,w19,w28 // (b^c)&=(a^b)
933
eor w6,w6,w15,ror#19
934
eor w7,w7,w2,lsr#3 // sigma0(X[i+1])
935
add w22,w22,w16 // h+=Sigma1(e)
936
eor w19,w19,w24 // Maj(a,b,c)
937
eor w17,w8,w23,ror#22 // Sigma0(a)
938
eor w6,w6,w15,lsr#10 // sigma1(X[i+14])
939
add w1,w1,w10
940
add w26,w26,w22 // d+=h
941
add w22,w22,w19 // h+=Maj(a,b,c)
942
ldr w19,[x30],#4 // *K++, w28 in next round
943
add w1,w1,w7
944
add w22,w22,w17 // h+=Sigma0(a)
945
add w1,w1,w6
946
ldr w6,[sp,#12]
947
str w9,[sp,#8]
948
ror w16,w26,#6
949
add w21,w21,w19 // h+=K[i]
950
ror w8,w3,#7
951
and w17,w27,w26
952
ror w7,w0,#17
953
bic w19,w20,w26
954
ror w9,w22,#2
955
add w21,w21,w1 // h+=X[i]
956
eor w16,w16,w26,ror#11
957
eor w8,w8,w3,ror#18
958
orr w17,w17,w19 // Ch(e,f,g)
959
eor w19,w22,w23 // a^b, b^c in next round
960
eor w16,w16,w26,ror#25 // Sigma1(e)
961
eor w9,w9,w22,ror#13
962
add w21,w21,w17 // h+=Ch(e,f,g)
963
and w28,w28,w19 // (b^c)&=(a^b)
964
eor w7,w7,w0,ror#19
965
eor w8,w8,w3,lsr#3 // sigma0(X[i+1])
966
add w21,w21,w16 // h+=Sigma1(e)
967
eor w28,w28,w23 // Maj(a,b,c)
968
eor w17,w9,w22,ror#22 // Sigma0(a)
969
eor w7,w7,w0,lsr#10 // sigma1(X[i+14])
970
add w2,w2,w11
971
add w25,w25,w21 // d+=h
972
add w21,w21,w28 // h+=Maj(a,b,c)
973
ldr w28,[x30],#4 // *K++, w19 in next round
974
add w2,w2,w8
975
add w21,w21,w17 // h+=Sigma0(a)
976
add w2,w2,w7
977
ldr w7,[sp,#0]
978
str w10,[sp,#12]
979
ror w16,w25,#6
980
add w20,w20,w28 // h+=K[i]
981
ror w9,w4,#7
982
and w17,w26,w25
983
ror w8,w1,#17
984
bic w28,w27,w25
985
ror w10,w21,#2
986
add w20,w20,w2 // h+=X[i]
987
eor w16,w16,w25,ror#11
988
eor w9,w9,w4,ror#18
989
orr w17,w17,w28 // Ch(e,f,g)
990
eor w28,w21,w22 // a^b, b^c in next round
991
eor w16,w16,w25,ror#25 // Sigma1(e)
992
eor w10,w10,w21,ror#13
993
add w20,w20,w17 // h+=Ch(e,f,g)
994
and w19,w19,w28 // (b^c)&=(a^b)
995
eor w8,w8,w1,ror#19
996
eor w9,w9,w4,lsr#3 // sigma0(X[i+1])
997
add w20,w20,w16 // h+=Sigma1(e)
998
eor w19,w19,w22 // Maj(a,b,c)
999
eor w17,w10,w21,ror#22 // Sigma0(a)
1000
eor w8,w8,w1,lsr#10 // sigma1(X[i+14])
1001
add w3,w3,w12
1002
add w24,w24,w20 // d+=h
1003
add w20,w20,w19 // h+=Maj(a,b,c)
1004
ldr w19,[x30],#4 // *K++, w28 in next round
1005
add w3,w3,w9
1006
add w20,w20,w17 // h+=Sigma0(a)
1007
add w3,w3,w8
1008
cbnz w19,.Loop_16_xx
1009
1010
ldp x0,x2,[x29,#96]
1011
ldr x1,[x29,#112]
1012
sub x30,x30,#260 // rewind
1013
1014
ldp w3,w4,[x0]
1015
ldp w5,w6,[x0,#2*4]
1016
add x1,x1,#14*4 // advance input pointer
1017
ldp w7,w8,[x0,#4*4]
1018
add w20,w20,w3
1019
ldp w9,w10,[x0,#6*4]
1020
add w21,w21,w4
1021
add w22,w22,w5
1022
add w23,w23,w6
1023
stp w20,w21,[x0]
1024
add w24,w24,w7
1025
add w25,w25,w8
1026
stp w22,w23,[x0,#2*4]
1027
add w26,w26,w9
1028
add w27,w27,w10
1029
cmp x1,x2
1030
stp w24,w25,[x0,#4*4]
1031
stp w26,w27,[x0,#6*4]
1032
b.ne .Loop
1033
1034
ldp x19,x20,[x29,#16]
1035
add sp,sp,#4*4
1036
ldp x21,x22,[x29,#32]
1037
ldp x23,x24,[x29,#48]
1038
ldp x25,x26,[x29,#64]
1039
ldp x27,x28,[x29,#80]
1040
ldp x29,x30,[sp],#128
1041
AARCH64_VALIDATE_LINK_REGISTER
1042
ret
1043
.size sha256_block_data_order,.-sha256_block_data_order
1044
1045
.section .rodata
1046
1047
.align 6
1048
.type .LK256,%object
1049
.LK256:
1050
.long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
1051
.long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5
1052
.long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3
1053
.long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174
1054
.long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc
1055
.long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da
1056
.long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7
1057
.long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967
1058
.long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13
1059
.long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85
1060
.long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3
1061
.long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070
1062
.long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5
1063
.long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3
1064
.long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
1065
.long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
1066
.long 0 //terminator
1067
.size .LK256,.-.LK256
1068
.byte 83,72,65,50,53,54,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,56,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
1069
.align 2
1070
.align 2
1071
1072
.text
1073
#ifndef __KERNEL__
1074
.type sha256_block_armv8,%function
1075
.align 6
1076
sha256_block_armv8:
1077
.Lv8_entry:
1078
// Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later.
1079
stp x29,x30,[sp,#-16]!
1080
add x29,sp,#0
1081
1082
ld1 {v0.4s,v1.4s},[x0]
1083
adrp x3,.LK256
1084
add x3,x3,#:lo12:.LK256
1085
1086
.Loop_hw:
1087
ld1 {v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64
1088
sub x2,x2,#1
1089
ld1 {v16.4s},[x3],#16
1090
rev32 v4.16b,v4.16b
1091
rev32 v5.16b,v5.16b
1092
rev32 v6.16b,v6.16b
1093
rev32 v7.16b,v7.16b
1094
orr v18.16b,v0.16b,v0.16b // offload
1095
orr v19.16b,v1.16b,v1.16b
1096
ld1 {v17.4s},[x3],#16
1097
add v16.4s,v16.4s,v4.4s
1098
.inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b
1099
orr v2.16b,v0.16b,v0.16b
1100
.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1101
.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1102
.inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
1103
ld1 {v16.4s},[x3],#16
1104
add v17.4s,v17.4s,v5.4s
1105
.inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b
1106
orr v2.16b,v0.16b,v0.16b
1107
.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1108
.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1109
.inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
1110
ld1 {v17.4s},[x3],#16
1111
add v16.4s,v16.4s,v6.4s
1112
.inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b
1113
orr v2.16b,v0.16b,v0.16b
1114
.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1115
.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1116
.inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
1117
ld1 {v16.4s},[x3],#16
1118
add v17.4s,v17.4s,v7.4s
1119
.inst 0x5e282887 //sha256su0 v7.16b,v4.16b
1120
orr v2.16b,v0.16b,v0.16b
1121
.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1122
.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1123
.inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
1124
ld1 {v17.4s},[x3],#16
1125
add v16.4s,v16.4s,v4.4s
1126
.inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b
1127
orr v2.16b,v0.16b,v0.16b
1128
.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1129
.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1130
.inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
1131
ld1 {v16.4s},[x3],#16
1132
add v17.4s,v17.4s,v5.4s
1133
.inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b
1134
orr v2.16b,v0.16b,v0.16b
1135
.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1136
.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1137
.inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
1138
ld1 {v17.4s},[x3],#16
1139
add v16.4s,v16.4s,v6.4s
1140
.inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b
1141
orr v2.16b,v0.16b,v0.16b
1142
.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1143
.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1144
.inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
1145
ld1 {v16.4s},[x3],#16
1146
add v17.4s,v17.4s,v7.4s
1147
.inst 0x5e282887 //sha256su0 v7.16b,v4.16b
1148
orr v2.16b,v0.16b,v0.16b
1149
.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1150
.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1151
.inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
1152
ld1 {v17.4s},[x3],#16
1153
add v16.4s,v16.4s,v4.4s
1154
.inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b
1155
orr v2.16b,v0.16b,v0.16b
1156
.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1157
.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1158
.inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
1159
ld1 {v16.4s},[x3],#16
1160
add v17.4s,v17.4s,v5.4s
1161
.inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b
1162
orr v2.16b,v0.16b,v0.16b
1163
.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1164
.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1165
.inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
1166
ld1 {v17.4s},[x3],#16
1167
add v16.4s,v16.4s,v6.4s
1168
.inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b
1169
orr v2.16b,v0.16b,v0.16b
1170
.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1171
.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1172
.inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
1173
ld1 {v16.4s},[x3],#16
1174
add v17.4s,v17.4s,v7.4s
1175
.inst 0x5e282887 //sha256su0 v7.16b,v4.16b
1176
orr v2.16b,v0.16b,v0.16b
1177
.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1178
.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1179
.inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
1180
ld1 {v17.4s},[x3],#16
1181
add v16.4s,v16.4s,v4.4s
1182
orr v2.16b,v0.16b,v0.16b
1183
.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1184
.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1185
1186
ld1 {v16.4s},[x3],#16
1187
add v17.4s,v17.4s,v5.4s
1188
orr v2.16b,v0.16b,v0.16b
1189
.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1190
.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1191
1192
ld1 {v17.4s},[x3]
1193
add v16.4s,v16.4s,v6.4s
1194
sub x3,x3,#64*4-16 // rewind
1195
orr v2.16b,v0.16b,v0.16b
1196
.inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1197
.inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1198
1199
add v17.4s,v17.4s,v7.4s
1200
orr v2.16b,v0.16b,v0.16b
1201
.inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1202
.inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1203
1204
add v0.4s,v0.4s,v18.4s
1205
add v1.4s,v1.4s,v19.4s
1206
1207
cbnz x2,.Loop_hw
1208
1209
st1 {v0.4s,v1.4s},[x0]
1210
1211
ldr x29,[sp],#16
1212
ret
1213
.size sha256_block_armv8,.-sha256_block_armv8
1214
#endif
1215
#ifdef __KERNEL__
1216
.globl sha256_block_neon
1217
#endif
1218
.type sha256_block_neon,%function
1219
.align 4
1220
sha256_block_neon:
1221
AARCH64_VALID_CALL_TARGET
1222
.Lneon_entry:
1223
// Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later
1224
stp x29, x30, [sp, #-16]!
1225
mov x29, sp
1226
sub sp,sp,#16*4
1227
1228
adrp x16,.LK256
1229
add x16,x16,#:lo12:.LK256
1230
add x2,x1,x2,lsl#6 // len to point at the end of inp
1231
1232
ld1 {v0.16b},[x1], #16
1233
ld1 {v1.16b},[x1], #16
1234
ld1 {v2.16b},[x1], #16
1235
ld1 {v3.16b},[x1], #16
1236
ld1 {v4.4s},[x16], #16
1237
ld1 {v5.4s},[x16], #16
1238
ld1 {v6.4s},[x16], #16
1239
ld1 {v7.4s},[x16], #16
1240
rev32 v0.16b,v0.16b // yes, even on
1241
rev32 v1.16b,v1.16b // big-endian
1242
rev32 v2.16b,v2.16b
1243
rev32 v3.16b,v3.16b
1244
mov x17,sp
1245
add v4.4s,v4.4s,v0.4s
1246
add v5.4s,v5.4s,v1.4s
1247
add v6.4s,v6.4s,v2.4s
1248
st1 {v4.4s,v5.4s},[x17], #32
1249
add v7.4s,v7.4s,v3.4s
1250
st1 {v6.4s,v7.4s},[x17]
1251
sub x17,x17,#32
1252
1253
ldp w3,w4,[x0]
1254
ldp w5,w6,[x0,#8]
1255
ldp w7,w8,[x0,#16]
1256
ldp w9,w10,[x0,#24]
1257
ldr w12,[sp,#0]
1258
mov w13,wzr
1259
eor w14,w4,w5
1260
mov w15,wzr
1261
b .L_00_48
1262
1263
.align 4
1264
.L_00_48:
1265
ext v4.16b,v0.16b,v1.16b,#4
1266
add w10,w10,w12
1267
add w3,w3,w15
1268
and w12,w8,w7
1269
bic w15,w9,w7
1270
ext v7.16b,v2.16b,v3.16b,#4
1271
eor w11,w7,w7,ror#5
1272
add w3,w3,w13
1273
mov d19,v3.d[1]
1274
orr w12,w12,w15
1275
eor w11,w11,w7,ror#19
1276
ushr v6.4s,v4.4s,#7
1277
eor w15,w3,w3,ror#11
1278
ushr v5.4s,v4.4s,#3
1279
add w10,w10,w12
1280
add v0.4s,v0.4s,v7.4s
1281
ror w11,w11,#6
1282
sli v6.4s,v4.4s,#25
1283
eor w13,w3,w4
1284
eor w15,w15,w3,ror#20
1285
ushr v7.4s,v4.4s,#18
1286
add w10,w10,w11
1287
ldr w12,[sp,#4]
1288
and w14,w14,w13
1289
eor v5.16b,v5.16b,v6.16b
1290
ror w15,w15,#2
1291
add w6,w6,w10
1292
sli v7.4s,v4.4s,#14
1293
eor w14,w14,w4
1294
ushr v16.4s,v19.4s,#17
1295
add w9,w9,w12
1296
add w10,w10,w15
1297
and w12,w7,w6
1298
eor v5.16b,v5.16b,v7.16b
1299
bic w15,w8,w6
1300
eor w11,w6,w6,ror#5
1301
sli v16.4s,v19.4s,#15
1302
add w10,w10,w14
1303
orr w12,w12,w15
1304
ushr v17.4s,v19.4s,#10
1305
eor w11,w11,w6,ror#19
1306
eor w15,w10,w10,ror#11
1307
ushr v7.4s,v19.4s,#19
1308
add w9,w9,w12
1309
ror w11,w11,#6
1310
add v0.4s,v0.4s,v5.4s
1311
eor w14,w10,w3
1312
eor w15,w15,w10,ror#20
1313
sli v7.4s,v19.4s,#13
1314
add w9,w9,w11
1315
ldr w12,[sp,#8]
1316
and w13,w13,w14
1317
eor v17.16b,v17.16b,v16.16b
1318
ror w15,w15,#2
1319
add w5,w5,w9
1320
eor w13,w13,w3
1321
eor v17.16b,v17.16b,v7.16b
1322
add w8,w8,w12
1323
add w9,w9,w15
1324
and w12,w6,w5
1325
add v0.4s,v0.4s,v17.4s
1326
bic w15,w7,w5
1327
eor w11,w5,w5,ror#5
1328
add w9,w9,w13
1329
ushr v18.4s,v0.4s,#17
1330
orr w12,w12,w15
1331
ushr v19.4s,v0.4s,#10
1332
eor w11,w11,w5,ror#19
1333
eor w15,w9,w9,ror#11
1334
sli v18.4s,v0.4s,#15
1335
add w8,w8,w12
1336
ushr v17.4s,v0.4s,#19
1337
ror w11,w11,#6
1338
eor w13,w9,w10
1339
eor v19.16b,v19.16b,v18.16b
1340
eor w15,w15,w9,ror#20
1341
add w8,w8,w11
1342
sli v17.4s,v0.4s,#13
1343
ldr w12,[sp,#12]
1344
and w14,w14,w13
1345
ror w15,w15,#2
1346
ld1 {v4.4s},[x16], #16
1347
add w4,w4,w8
1348
eor v19.16b,v19.16b,v17.16b
1349
eor w14,w14,w10
1350
eor v17.16b,v17.16b,v17.16b
1351
add w7,w7,w12
1352
add w8,w8,w15
1353
and w12,w5,w4
1354
mov v17.d[1],v19.d[0]
1355
bic w15,w6,w4
1356
eor w11,w4,w4,ror#5
1357
add w8,w8,w14
1358
add v0.4s,v0.4s,v17.4s
1359
orr w12,w12,w15
1360
eor w11,w11,w4,ror#19
1361
eor w15,w8,w8,ror#11
1362
add v4.4s,v4.4s,v0.4s
1363
add w7,w7,w12
1364
ror w11,w11,#6
1365
eor w14,w8,w9
1366
eor w15,w15,w8,ror#20
1367
add w7,w7,w11
1368
ldr w12,[sp,#16]
1369
and w13,w13,w14
1370
ror w15,w15,#2
1371
add w3,w3,w7
1372
eor w13,w13,w9
1373
st1 {v4.4s},[x17], #16
1374
ext v4.16b,v1.16b,v2.16b,#4
1375
add w6,w6,w12
1376
add w7,w7,w15
1377
and w12,w4,w3
1378
bic w15,w5,w3
1379
ext v7.16b,v3.16b,v0.16b,#4
1380
eor w11,w3,w3,ror#5
1381
add w7,w7,w13
1382
mov d19,v0.d[1]
1383
orr w12,w12,w15
1384
eor w11,w11,w3,ror#19
1385
ushr v6.4s,v4.4s,#7
1386
eor w15,w7,w7,ror#11
1387
ushr v5.4s,v4.4s,#3
1388
add w6,w6,w12
1389
add v1.4s,v1.4s,v7.4s
1390
ror w11,w11,#6
1391
sli v6.4s,v4.4s,#25
1392
eor w13,w7,w8
1393
eor w15,w15,w7,ror#20
1394
ushr v7.4s,v4.4s,#18
1395
add w6,w6,w11
1396
ldr w12,[sp,#20]
1397
and w14,w14,w13
1398
eor v5.16b,v5.16b,v6.16b
1399
ror w15,w15,#2
1400
add w10,w10,w6
1401
sli v7.4s,v4.4s,#14
1402
eor w14,w14,w8
1403
ushr v16.4s,v19.4s,#17
1404
add w5,w5,w12
1405
add w6,w6,w15
1406
and w12,w3,w10
1407
eor v5.16b,v5.16b,v7.16b
1408
bic w15,w4,w10
1409
eor w11,w10,w10,ror#5
1410
sli v16.4s,v19.4s,#15
1411
add w6,w6,w14
1412
orr w12,w12,w15
1413
ushr v17.4s,v19.4s,#10
1414
eor w11,w11,w10,ror#19
1415
eor w15,w6,w6,ror#11
1416
ushr v7.4s,v19.4s,#19
1417
add w5,w5,w12
1418
ror w11,w11,#6
1419
add v1.4s,v1.4s,v5.4s
1420
eor w14,w6,w7
1421
eor w15,w15,w6,ror#20
1422
sli v7.4s,v19.4s,#13
1423
add w5,w5,w11
1424
ldr w12,[sp,#24]
1425
and w13,w13,w14
1426
eor v17.16b,v17.16b,v16.16b
1427
ror w15,w15,#2
1428
add w9,w9,w5
1429
eor w13,w13,w7
1430
eor v17.16b,v17.16b,v7.16b
1431
add w4,w4,w12
1432
add w5,w5,w15
1433
and w12,w10,w9
1434
add v1.4s,v1.4s,v17.4s
1435
bic w15,w3,w9
1436
eor w11,w9,w9,ror#5
1437
add w5,w5,w13
1438
ushr v18.4s,v1.4s,#17
1439
orr w12,w12,w15
1440
ushr v19.4s,v1.4s,#10
1441
eor w11,w11,w9,ror#19
1442
eor w15,w5,w5,ror#11
1443
sli v18.4s,v1.4s,#15
1444
add w4,w4,w12
1445
ushr v17.4s,v1.4s,#19
1446
ror w11,w11,#6
1447
eor w13,w5,w6
1448
eor v19.16b,v19.16b,v18.16b
1449
eor w15,w15,w5,ror#20
1450
add w4,w4,w11
1451
sli v17.4s,v1.4s,#13
1452
ldr w12,[sp,#28]
1453
and w14,w14,w13
1454
ror w15,w15,#2
1455
ld1 {v4.4s},[x16], #16
1456
add w8,w8,w4
1457
eor v19.16b,v19.16b,v17.16b
1458
eor w14,w14,w6
1459
eor v17.16b,v17.16b,v17.16b
1460
add w3,w3,w12
1461
add w4,w4,w15
1462
and w12,w9,w8
1463
mov v17.d[1],v19.d[0]
1464
bic w15,w10,w8
1465
eor w11,w8,w8,ror#5
1466
add w4,w4,w14
1467
add v1.4s,v1.4s,v17.4s
1468
orr w12,w12,w15
1469
eor w11,w11,w8,ror#19
1470
eor w15,w4,w4,ror#11
1471
add v4.4s,v4.4s,v1.4s
1472
add w3,w3,w12
1473
ror w11,w11,#6
1474
eor w14,w4,w5
1475
eor w15,w15,w4,ror#20
1476
add w3,w3,w11
1477
ldr w12,[sp,#32]
1478
and w13,w13,w14
1479
ror w15,w15,#2
1480
add w7,w7,w3
1481
eor w13,w13,w5
1482
st1 {v4.4s},[x17], #16
1483
ext v4.16b,v2.16b,v3.16b,#4
1484
add w10,w10,w12
1485
add w3,w3,w15
1486
and w12,w8,w7
1487
bic w15,w9,w7
1488
ext v7.16b,v0.16b,v1.16b,#4
1489
eor w11,w7,w7,ror#5
1490
add w3,w3,w13
1491
mov d19,v1.d[1]
1492
orr w12,w12,w15
1493
eor w11,w11,w7,ror#19
1494
ushr v6.4s,v4.4s,#7
1495
eor w15,w3,w3,ror#11
1496
ushr v5.4s,v4.4s,#3
1497
add w10,w10,w12
1498
add v2.4s,v2.4s,v7.4s
1499
ror w11,w11,#6
1500
sli v6.4s,v4.4s,#25
1501
eor w13,w3,w4
1502
eor w15,w15,w3,ror#20
1503
ushr v7.4s,v4.4s,#18
1504
add w10,w10,w11
1505
ldr w12,[sp,#36]
1506
and w14,w14,w13
1507
eor v5.16b,v5.16b,v6.16b
1508
ror w15,w15,#2
1509
add w6,w6,w10
1510
sli v7.4s,v4.4s,#14
1511
eor w14,w14,w4
1512
ushr v16.4s,v19.4s,#17
1513
add w9,w9,w12
1514
add w10,w10,w15
1515
and w12,w7,w6
1516
eor v5.16b,v5.16b,v7.16b
1517
bic w15,w8,w6
1518
eor w11,w6,w6,ror#5
1519
sli v16.4s,v19.4s,#15
1520
add w10,w10,w14
1521
orr w12,w12,w15
1522
ushr v17.4s,v19.4s,#10
1523
eor w11,w11,w6,ror#19
1524
eor w15,w10,w10,ror#11
1525
ushr v7.4s,v19.4s,#19
1526
add w9,w9,w12
1527
ror w11,w11,#6
1528
add v2.4s,v2.4s,v5.4s
1529
eor w14,w10,w3
1530
eor w15,w15,w10,ror#20
1531
sli v7.4s,v19.4s,#13
1532
add w9,w9,w11
1533
ldr w12,[sp,#40]
1534
and w13,w13,w14
1535
eor v17.16b,v17.16b,v16.16b
1536
ror w15,w15,#2
1537
add w5,w5,w9
1538
eor w13,w13,w3
1539
eor v17.16b,v17.16b,v7.16b
1540
add w8,w8,w12
1541
add w9,w9,w15
1542
and w12,w6,w5
1543
add v2.4s,v2.4s,v17.4s
1544
bic w15,w7,w5
1545
eor w11,w5,w5,ror#5
1546
add w9,w9,w13
1547
ushr v18.4s,v2.4s,#17
1548
orr w12,w12,w15
1549
ushr v19.4s,v2.4s,#10
1550
eor w11,w11,w5,ror#19
1551
eor w15,w9,w9,ror#11
1552
sli v18.4s,v2.4s,#15
1553
add w8,w8,w12
1554
ushr v17.4s,v2.4s,#19
1555
ror w11,w11,#6
1556
eor w13,w9,w10
1557
eor v19.16b,v19.16b,v18.16b
1558
eor w15,w15,w9,ror#20
1559
add w8,w8,w11
1560
sli v17.4s,v2.4s,#13
1561
ldr w12,[sp,#44]
1562
and w14,w14,w13
1563
ror w15,w15,#2
1564
ld1 {v4.4s},[x16], #16
1565
add w4,w4,w8
1566
eor v19.16b,v19.16b,v17.16b
1567
eor w14,w14,w10
1568
eor v17.16b,v17.16b,v17.16b
1569
add w7,w7,w12
1570
add w8,w8,w15
1571
and w12,w5,w4
1572
mov v17.d[1],v19.d[0]
1573
bic w15,w6,w4
1574
eor w11,w4,w4,ror#5
1575
add w8,w8,w14
1576
add v2.4s,v2.4s,v17.4s
1577
orr w12,w12,w15
1578
eor w11,w11,w4,ror#19
1579
eor w15,w8,w8,ror#11
1580
add v4.4s,v4.4s,v2.4s
1581
add w7,w7,w12
1582
ror w11,w11,#6
1583
eor w14,w8,w9
1584
eor w15,w15,w8,ror#20
1585
add w7,w7,w11
1586
ldr w12,[sp,#48]
1587
and w13,w13,w14
1588
ror w15,w15,#2
1589
add w3,w3,w7
1590
eor w13,w13,w9
1591
st1 {v4.4s},[x17], #16
1592
ext v4.16b,v3.16b,v0.16b,#4
1593
add w6,w6,w12
1594
add w7,w7,w15
1595
and w12,w4,w3
1596
bic w15,w5,w3
1597
ext v7.16b,v1.16b,v2.16b,#4
1598
eor w11,w3,w3,ror#5
1599
add w7,w7,w13
1600
mov d19,v2.d[1]
1601
orr w12,w12,w15
1602
eor w11,w11,w3,ror#19
1603
ushr v6.4s,v4.4s,#7
1604
eor w15,w7,w7,ror#11
1605
ushr v5.4s,v4.4s,#3
1606
add w6,w6,w12
1607
add v3.4s,v3.4s,v7.4s
1608
ror w11,w11,#6
1609
sli v6.4s,v4.4s,#25
1610
eor w13,w7,w8
1611
eor w15,w15,w7,ror#20
1612
ushr v7.4s,v4.4s,#18
1613
add w6,w6,w11
1614
ldr w12,[sp,#52]
1615
and w14,w14,w13
1616
eor v5.16b,v5.16b,v6.16b
1617
ror w15,w15,#2
1618
add w10,w10,w6
1619
sli v7.4s,v4.4s,#14
1620
eor w14,w14,w8
1621
ushr v16.4s,v19.4s,#17
1622
add w5,w5,w12
1623
add w6,w6,w15
1624
and w12,w3,w10
1625
eor v5.16b,v5.16b,v7.16b
1626
bic w15,w4,w10
1627
eor w11,w10,w10,ror#5
1628
sli v16.4s,v19.4s,#15
1629
add w6,w6,w14
1630
orr w12,w12,w15
1631
ushr v17.4s,v19.4s,#10
1632
eor w11,w11,w10,ror#19
1633
eor w15,w6,w6,ror#11
1634
ushr v7.4s,v19.4s,#19
1635
add w5,w5,w12
1636
ror w11,w11,#6
1637
add v3.4s,v3.4s,v5.4s
1638
eor w14,w6,w7
1639
eor w15,w15,w6,ror#20
1640
sli v7.4s,v19.4s,#13
1641
add w5,w5,w11
1642
ldr w12,[sp,#56]
1643
and w13,w13,w14
1644
eor v17.16b,v17.16b,v16.16b
1645
ror w15,w15,#2
1646
add w9,w9,w5
1647
eor w13,w13,w7
1648
eor v17.16b,v17.16b,v7.16b
1649
add w4,w4,w12
1650
add w5,w5,w15
1651
and w12,w10,w9
1652
add v3.4s,v3.4s,v17.4s
1653
bic w15,w3,w9
1654
eor w11,w9,w9,ror#5
1655
add w5,w5,w13
1656
ushr v18.4s,v3.4s,#17
1657
orr w12,w12,w15
1658
ushr v19.4s,v3.4s,#10
1659
eor w11,w11,w9,ror#19
1660
eor w15,w5,w5,ror#11
1661
sli v18.4s,v3.4s,#15
1662
add w4,w4,w12
1663
ushr v17.4s,v3.4s,#19
1664
ror w11,w11,#6
1665
eor w13,w5,w6
1666
eor v19.16b,v19.16b,v18.16b
1667
eor w15,w15,w5,ror#20
1668
add w4,w4,w11
1669
sli v17.4s,v3.4s,#13
1670
ldr w12,[sp,#60]
1671
and w14,w14,w13
1672
ror w15,w15,#2
1673
ld1 {v4.4s},[x16], #16
1674
add w8,w8,w4
1675
eor v19.16b,v19.16b,v17.16b
1676
eor w14,w14,w6
1677
eor v17.16b,v17.16b,v17.16b
1678
add w3,w3,w12
1679
add w4,w4,w15
1680
and w12,w9,w8
1681
mov v17.d[1],v19.d[0]
1682
bic w15,w10,w8
1683
eor w11,w8,w8,ror#5
1684
add w4,w4,w14
1685
add v3.4s,v3.4s,v17.4s
1686
orr w12,w12,w15
1687
eor w11,w11,w8,ror#19
1688
eor w15,w4,w4,ror#11
1689
add v4.4s,v4.4s,v3.4s
1690
add w3,w3,w12
1691
ror w11,w11,#6
1692
eor w14,w4,w5
1693
eor w15,w15,w4,ror#20
1694
add w3,w3,w11
1695
ldr w12,[x16]
1696
and w13,w13,w14
1697
ror w15,w15,#2
1698
add w7,w7,w3
1699
eor w13,w13,w5
1700
st1 {v4.4s},[x17], #16
1701
cmp w12,#0 // check for K256 terminator
1702
ldr w12,[sp,#0]
1703
sub x17,x17,#64
1704
bne .L_00_48
1705
1706
sub x16,x16,#256 // rewind x16
1707
cmp x1,x2
1708
mov x17, #64
1709
csel x17, x17, xzr, eq
1710
sub x1,x1,x17 // avoid SEGV
1711
mov x17,sp
1712
add w10,w10,w12
1713
add w3,w3,w15
1714
and w12,w8,w7
1715
ld1 {v0.16b},[x1],#16
1716
bic w15,w9,w7
1717
eor w11,w7,w7,ror#5
1718
ld1 {v4.4s},[x16],#16
1719
add w3,w3,w13
1720
orr w12,w12,w15
1721
eor w11,w11,w7,ror#19
1722
eor w15,w3,w3,ror#11
1723
rev32 v0.16b,v0.16b
1724
add w10,w10,w12
1725
ror w11,w11,#6
1726
eor w13,w3,w4
1727
eor w15,w15,w3,ror#20
1728
add v4.4s,v4.4s,v0.4s
1729
add w10,w10,w11
1730
ldr w12,[sp,#4]
1731
and w14,w14,w13
1732
ror w15,w15,#2
1733
add w6,w6,w10
1734
eor w14,w14,w4
1735
add w9,w9,w12
1736
add w10,w10,w15
1737
and w12,w7,w6
1738
bic w15,w8,w6
1739
eor w11,w6,w6,ror#5
1740
add w10,w10,w14
1741
orr w12,w12,w15
1742
eor w11,w11,w6,ror#19
1743
eor w15,w10,w10,ror#11
1744
add w9,w9,w12
1745
ror w11,w11,#6
1746
eor w14,w10,w3
1747
eor w15,w15,w10,ror#20
1748
add w9,w9,w11
1749
ldr w12,[sp,#8]
1750
and w13,w13,w14
1751
ror w15,w15,#2
1752
add w5,w5,w9
1753
eor w13,w13,w3
1754
add w8,w8,w12
1755
add w9,w9,w15
1756
and w12,w6,w5
1757
bic w15,w7,w5
1758
eor w11,w5,w5,ror#5
1759
add w9,w9,w13
1760
orr w12,w12,w15
1761
eor w11,w11,w5,ror#19
1762
eor w15,w9,w9,ror#11
1763
add w8,w8,w12
1764
ror w11,w11,#6
1765
eor w13,w9,w10
1766
eor w15,w15,w9,ror#20
1767
add w8,w8,w11
1768
ldr w12,[sp,#12]
1769
and w14,w14,w13
1770
ror w15,w15,#2
1771
add w4,w4,w8
1772
eor w14,w14,w10
1773
add w7,w7,w12
1774
add w8,w8,w15
1775
and w12,w5,w4
1776
bic w15,w6,w4
1777
eor w11,w4,w4,ror#5
1778
add w8,w8,w14
1779
orr w12,w12,w15
1780
eor w11,w11,w4,ror#19
1781
eor w15,w8,w8,ror#11
1782
add w7,w7,w12
1783
ror w11,w11,#6
1784
eor w14,w8,w9
1785
eor w15,w15,w8,ror#20
1786
add w7,w7,w11
1787
ldr w12,[sp,#16]
1788
and w13,w13,w14
1789
ror w15,w15,#2
1790
add w3,w3,w7
1791
eor w13,w13,w9
1792
st1 {v4.4s},[x17], #16
1793
add w6,w6,w12
1794
add w7,w7,w15
1795
and w12,w4,w3
1796
ld1 {v1.16b},[x1],#16
1797
bic w15,w5,w3
1798
eor w11,w3,w3,ror#5
1799
ld1 {v4.4s},[x16],#16
1800
add w7,w7,w13
1801
orr w12,w12,w15
1802
eor w11,w11,w3,ror#19
1803
eor w15,w7,w7,ror#11
1804
rev32 v1.16b,v1.16b
1805
add w6,w6,w12
1806
ror w11,w11,#6
1807
eor w13,w7,w8
1808
eor w15,w15,w7,ror#20
1809
add v4.4s,v4.4s,v1.4s
1810
add w6,w6,w11
1811
ldr w12,[sp,#20]
1812
and w14,w14,w13
1813
ror w15,w15,#2
1814
add w10,w10,w6
1815
eor w14,w14,w8
1816
add w5,w5,w12
1817
add w6,w6,w15
1818
and w12,w3,w10
1819
bic w15,w4,w10
1820
eor w11,w10,w10,ror#5
1821
add w6,w6,w14
1822
orr w12,w12,w15
1823
eor w11,w11,w10,ror#19
1824
eor w15,w6,w6,ror#11
1825
add w5,w5,w12
1826
ror w11,w11,#6
1827
eor w14,w6,w7
1828
eor w15,w15,w6,ror#20
1829
add w5,w5,w11
1830
ldr w12,[sp,#24]
1831
and w13,w13,w14
1832
ror w15,w15,#2
1833
add w9,w9,w5
1834
eor w13,w13,w7
1835
add w4,w4,w12
1836
add w5,w5,w15
1837
and w12,w10,w9
1838
bic w15,w3,w9
1839
eor w11,w9,w9,ror#5
1840
add w5,w5,w13
1841
orr w12,w12,w15
1842
eor w11,w11,w9,ror#19
1843
eor w15,w5,w5,ror#11
1844
add w4,w4,w12
1845
ror w11,w11,#6
1846
eor w13,w5,w6
1847
eor w15,w15,w5,ror#20
1848
add w4,w4,w11
1849
ldr w12,[sp,#28]
1850
and w14,w14,w13
1851
ror w15,w15,#2
1852
add w8,w8,w4
1853
eor w14,w14,w6
1854
add w3,w3,w12
1855
add w4,w4,w15
1856
and w12,w9,w8
1857
bic w15,w10,w8
1858
eor w11,w8,w8,ror#5
1859
add w4,w4,w14
1860
orr w12,w12,w15
1861
eor w11,w11,w8,ror#19
1862
eor w15,w4,w4,ror#11
1863
add w3,w3,w12
1864
ror w11,w11,#6
1865
eor w14,w4,w5
1866
eor w15,w15,w4,ror#20
1867
add w3,w3,w11
1868
ldr w12,[sp,#32]
1869
and w13,w13,w14
1870
ror w15,w15,#2
1871
add w7,w7,w3
1872
eor w13,w13,w5
1873
st1 {v4.4s},[x17], #16
1874
add w10,w10,w12
1875
add w3,w3,w15
1876
and w12,w8,w7
1877
ld1 {v2.16b},[x1],#16
1878
bic w15,w9,w7
1879
eor w11,w7,w7,ror#5
1880
ld1 {v4.4s},[x16],#16
1881
add w3,w3,w13
1882
orr w12,w12,w15
1883
eor w11,w11,w7,ror#19
1884
eor w15,w3,w3,ror#11
1885
rev32 v2.16b,v2.16b
1886
add w10,w10,w12
1887
ror w11,w11,#6
1888
eor w13,w3,w4
1889
eor w15,w15,w3,ror#20
1890
add v4.4s,v4.4s,v2.4s
1891
add w10,w10,w11
1892
ldr w12,[sp,#36]
1893
and w14,w14,w13
1894
ror w15,w15,#2
1895
add w6,w6,w10
1896
eor w14,w14,w4
1897
add w9,w9,w12
1898
add w10,w10,w15
1899
and w12,w7,w6
1900
bic w15,w8,w6
1901
eor w11,w6,w6,ror#5
1902
add w10,w10,w14
1903
orr w12,w12,w15
1904
eor w11,w11,w6,ror#19
1905
eor w15,w10,w10,ror#11
1906
add w9,w9,w12
1907
ror w11,w11,#6
1908
eor w14,w10,w3
1909
eor w15,w15,w10,ror#20
1910
add w9,w9,w11
1911
ldr w12,[sp,#40]
1912
and w13,w13,w14
1913
ror w15,w15,#2
1914
add w5,w5,w9
1915
eor w13,w13,w3
1916
add w8,w8,w12
1917
add w9,w9,w15
1918
and w12,w6,w5
1919
bic w15,w7,w5
1920
eor w11,w5,w5,ror#5
1921
add w9,w9,w13
1922
orr w12,w12,w15
1923
eor w11,w11,w5,ror#19
1924
eor w15,w9,w9,ror#11
1925
add w8,w8,w12
1926
ror w11,w11,#6
1927
eor w13,w9,w10
1928
eor w15,w15,w9,ror#20
1929
add w8,w8,w11
1930
ldr w12,[sp,#44]
1931
and w14,w14,w13
1932
ror w15,w15,#2
1933
add w4,w4,w8
1934
eor w14,w14,w10
1935
add w7,w7,w12
1936
add w8,w8,w15
1937
and w12,w5,w4
1938
bic w15,w6,w4
1939
eor w11,w4,w4,ror#5
1940
add w8,w8,w14
1941
orr w12,w12,w15
1942
eor w11,w11,w4,ror#19
1943
eor w15,w8,w8,ror#11
1944
add w7,w7,w12
1945
ror w11,w11,#6
1946
eor w14,w8,w9
1947
eor w15,w15,w8,ror#20
1948
add w7,w7,w11
1949
ldr w12,[sp,#48]
1950
and w13,w13,w14
1951
ror w15,w15,#2
1952
add w3,w3,w7
1953
eor w13,w13,w9
1954
st1 {v4.4s},[x17], #16
1955
add w6,w6,w12
1956
add w7,w7,w15
1957
and w12,w4,w3
1958
ld1 {v3.16b},[x1],#16
1959
bic w15,w5,w3
1960
eor w11,w3,w3,ror#5
1961
ld1 {v4.4s},[x16],#16
1962
add w7,w7,w13
1963
orr w12,w12,w15
1964
eor w11,w11,w3,ror#19
1965
eor w15,w7,w7,ror#11
1966
rev32 v3.16b,v3.16b
1967
add w6,w6,w12
1968
ror w11,w11,#6
1969
eor w13,w7,w8
1970
eor w15,w15,w7,ror#20
1971
add v4.4s,v4.4s,v3.4s
1972
add w6,w6,w11
1973
ldr w12,[sp,#52]
1974
and w14,w14,w13
1975
ror w15,w15,#2
1976
add w10,w10,w6
1977
eor w14,w14,w8
1978
add w5,w5,w12
1979
add w6,w6,w15
1980
and w12,w3,w10
1981
bic w15,w4,w10
1982
eor w11,w10,w10,ror#5
1983
add w6,w6,w14
1984
orr w12,w12,w15
1985
eor w11,w11,w10,ror#19
1986
eor w15,w6,w6,ror#11
1987
add w5,w5,w12
1988
ror w11,w11,#6
1989
eor w14,w6,w7
1990
eor w15,w15,w6,ror#20
1991
add w5,w5,w11
1992
ldr w12,[sp,#56]
1993
and w13,w13,w14
1994
ror w15,w15,#2
1995
add w9,w9,w5
1996
eor w13,w13,w7
1997
add w4,w4,w12
1998
add w5,w5,w15
1999
and w12,w10,w9
2000
bic w15,w3,w9
2001
eor w11,w9,w9,ror#5
2002
add w5,w5,w13
2003
orr w12,w12,w15
2004
eor w11,w11,w9,ror#19
2005
eor w15,w5,w5,ror#11
2006
add w4,w4,w12
2007
ror w11,w11,#6
2008
eor w13,w5,w6
2009
eor w15,w15,w5,ror#20
2010
add w4,w4,w11
2011
ldr w12,[sp,#60]
2012
and w14,w14,w13
2013
ror w15,w15,#2
2014
add w8,w8,w4
2015
eor w14,w14,w6
2016
add w3,w3,w12
2017
add w4,w4,w15
2018
and w12,w9,w8
2019
bic w15,w10,w8
2020
eor w11,w8,w8,ror#5
2021
add w4,w4,w14
2022
orr w12,w12,w15
2023
eor w11,w11,w8,ror#19
2024
eor w15,w4,w4,ror#11
2025
add w3,w3,w12
2026
ror w11,w11,#6
2027
eor w14,w4,w5
2028
eor w15,w15,w4,ror#20
2029
add w3,w3,w11
2030
and w13,w13,w14
2031
ror w15,w15,#2
2032
add w7,w7,w3
2033
eor w13,w13,w5
2034
st1 {v4.4s},[x17], #16
2035
add w3,w3,w15 // h+=Sigma0(a) from the past
2036
ldp w11,w12,[x0,#0]
2037
add w3,w3,w13 // h+=Maj(a,b,c) from the past
2038
ldp w13,w14,[x0,#8]
2039
add w3,w3,w11 // accumulate
2040
add w4,w4,w12
2041
ldp w11,w12,[x0,#16]
2042
add w5,w5,w13
2043
add w6,w6,w14
2044
ldp w13,w14,[x0,#24]
2045
add w7,w7,w11
2046
add w8,w8,w12
2047
ldr w12,[sp,#0]
2048
stp w3,w4,[x0,#0]
2049
add w9,w9,w13
2050
mov w13,wzr
2051
stp w5,w6,[x0,#8]
2052
add w10,w10,w14
2053
stp w7,w8,[x0,#16]
2054
eor w14,w4,w5
2055
stp w9,w10,[x0,#24]
2056
mov w15,wzr
2057
mov x17,sp
2058
b.ne .L_00_48
2059
2060
ldr x29,[x29]
2061
add sp,sp,#16*4+16
2062
ret
2063
.size sha256_block_neon,.-sha256_block_neon
2064
2065