2 * Copyright 2004-2022 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * https://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 * Portions Copyright (c) 2022 Tino Reichardt <milky-zfs@mcmilk.de>
19 * - modified assembly to fit into OpenZFS
22 #if defined(__aarch64__)
29 .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
30 .long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5
31 .long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3
32 .long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174
33 .long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc
34 .long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da
35 .long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7
36 .long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967
37 .long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13
38 .long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85
39 .long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3
40 .long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070
41 .long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5
42 .long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3
43 .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
44 .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
48 .globl zfs_sha256_block_armv7
49 .type zfs_sha256_block_armv7,%function
51 zfs_sha256_block_armv7:
53 stp x29,x30,[sp,#-128]!
63 ldp w20,w21,[x0] // load context
66 add x2,x1,x2,lsl#6 // end of input
73 ldr w19,[x30],#4 // *K++
74 eor w28,w21,w22 // magic seed
80 add w27,w27,w19 // h+=K[i]
84 add w27,w27,w3 // h+=X[i]
85 orr w17,w17,w19 // Ch(e,f,g)
86 eor w19,w20,w21 // a^b, b^c in next round
87 eor w16,w16,w6,ror#11 // Sigma1(e)
89 add w27,w27,w17 // h+=Ch(e,f,g)
91 add w27,w27,w16 // h+=Sigma1(e)
92 and w28,w28,w19 // (b^c)&=(a^b)
93 add w23,w23,w27 // d+=h
94 eor w28,w28,w21 // Maj(a,b,c)
95 eor w17,w6,w17,ror#13 // Sigma0(a)
96 add w27,w27,w28 // h+=Maj(a,b,c)
97 ldr w28,[x30],#4 // *K++, w19 in next round
98 //add w27,w27,w17 // h+=Sigma0(a)
103 add w27,w27,w17 // h+=Sigma0(a)
105 add w26,w26,w28 // h+=K[i]
106 eor w7,w23,w23,ror#14
109 add w26,w26,w4 // h+=X[i]
110 orr w17,w17,w28 // Ch(e,f,g)
111 eor w28,w27,w20 // a^b, b^c in next round
112 eor w16,w16,w7,ror#11 // Sigma1(e)
114 add w26,w26,w17 // h+=Ch(e,f,g)
115 eor w17,w27,w27,ror#9
116 add w26,w26,w16 // h+=Sigma1(e)
117 and w19,w19,w28 // (b^c)&=(a^b)
118 add w22,w22,w26 // d+=h
119 eor w19,w19,w20 // Maj(a,b,c)
120 eor w17,w7,w17,ror#13 // Sigma0(a)
121 add w26,w26,w19 // h+=Maj(a,b,c)
122 ldr w19,[x30],#4 // *K++, w28 in next round
123 //add w26,w26,w17 // h+=Sigma0(a)
124 #ifndef __AARCH64EB__
127 add w26,w26,w17 // h+=Sigma0(a)
129 add w25,w25,w19 // h+=K[i]
130 eor w8,w22,w22,ror#14
133 add w25,w25,w5 // h+=X[i]
134 orr w17,w17,w19 // Ch(e,f,g)
135 eor w19,w26,w27 // a^b, b^c in next round
136 eor w16,w16,w8,ror#11 // Sigma1(e)
138 add w25,w25,w17 // h+=Ch(e,f,g)
139 eor w17,w26,w26,ror#9
140 add w25,w25,w16 // h+=Sigma1(e)
141 and w28,w28,w19 // (b^c)&=(a^b)
142 add w21,w21,w25 // d+=h
143 eor w28,w28,w27 // Maj(a,b,c)
144 eor w17,w8,w17,ror#13 // Sigma0(a)
145 add w25,w25,w28 // h+=Maj(a,b,c)
146 ldr w28,[x30],#4 // *K++, w19 in next round
147 //add w25,w25,w17 // h+=Sigma0(a)
148 #ifndef __AARCH64EB__
152 add w25,w25,w17 // h+=Sigma0(a)
154 add w24,w24,w28 // h+=K[i]
155 eor w9,w21,w21,ror#14
158 add w24,w24,w6 // h+=X[i]
159 orr w17,w17,w28 // Ch(e,f,g)
160 eor w28,w25,w26 // a^b, b^c in next round
161 eor w16,w16,w9,ror#11 // Sigma1(e)
163 add w24,w24,w17 // h+=Ch(e,f,g)
164 eor w17,w25,w25,ror#9
165 add w24,w24,w16 // h+=Sigma1(e)
166 and w19,w19,w28 // (b^c)&=(a^b)
167 add w20,w20,w24 // d+=h
168 eor w19,w19,w26 // Maj(a,b,c)
169 eor w17,w9,w17,ror#13 // Sigma0(a)
170 add w24,w24,w19 // h+=Maj(a,b,c)
171 ldr w19,[x30],#4 // *K++, w28 in next round
172 //add w24,w24,w17 // h+=Sigma0(a)
173 #ifndef __AARCH64EB__
176 add w24,w24,w17 // h+=Sigma0(a)
178 add w23,w23,w19 // h+=K[i]
179 eor w10,w20,w20,ror#14
182 add w23,w23,w7 // h+=X[i]
183 orr w17,w17,w19 // Ch(e,f,g)
184 eor w19,w24,w25 // a^b, b^c in next round
185 eor w16,w16,w10,ror#11 // Sigma1(e)
187 add w23,w23,w17 // h+=Ch(e,f,g)
188 eor w17,w24,w24,ror#9
189 add w23,w23,w16 // h+=Sigma1(e)
190 and w28,w28,w19 // (b^c)&=(a^b)
191 add w27,w27,w23 // d+=h
192 eor w28,w28,w25 // Maj(a,b,c)
193 eor w17,w10,w17,ror#13 // Sigma0(a)
194 add w23,w23,w28 // h+=Maj(a,b,c)
195 ldr w28,[x30],#4 // *K++, w19 in next round
196 //add w23,w23,w17 // h+=Sigma0(a)
197 #ifndef __AARCH64EB__
201 add w23,w23,w17 // h+=Sigma0(a)
203 add w22,w22,w28 // h+=K[i]
204 eor w11,w27,w27,ror#14
207 add w22,w22,w8 // h+=X[i]
208 orr w17,w17,w28 // Ch(e,f,g)
209 eor w28,w23,w24 // a^b, b^c in next round
210 eor w16,w16,w11,ror#11 // Sigma1(e)
212 add w22,w22,w17 // h+=Ch(e,f,g)
213 eor w17,w23,w23,ror#9
214 add w22,w22,w16 // h+=Sigma1(e)
215 and w19,w19,w28 // (b^c)&=(a^b)
216 add w26,w26,w22 // d+=h
217 eor w19,w19,w24 // Maj(a,b,c)
218 eor w17,w11,w17,ror#13 // Sigma0(a)
219 add w22,w22,w19 // h+=Maj(a,b,c)
220 ldr w19,[x30],#4 // *K++, w28 in next round
221 //add w22,w22,w17 // h+=Sigma0(a)
222 #ifndef __AARCH64EB__
225 add w22,w22,w17 // h+=Sigma0(a)
227 add w21,w21,w19 // h+=K[i]
228 eor w12,w26,w26,ror#14
231 add w21,w21,w9 // h+=X[i]
232 orr w17,w17,w19 // Ch(e,f,g)
233 eor w19,w22,w23 // a^b, b^c in next round
234 eor w16,w16,w12,ror#11 // Sigma1(e)
236 add w21,w21,w17 // h+=Ch(e,f,g)
237 eor w17,w22,w22,ror#9
238 add w21,w21,w16 // h+=Sigma1(e)
239 and w28,w28,w19 // (b^c)&=(a^b)
240 add w25,w25,w21 // d+=h
241 eor w28,w28,w23 // Maj(a,b,c)
242 eor w17,w12,w17,ror#13 // Sigma0(a)
243 add w21,w21,w28 // h+=Maj(a,b,c)
244 ldr w28,[x30],#4 // *K++, w19 in next round
245 //add w21,w21,w17 // h+=Sigma0(a)
246 #ifndef __AARCH64EB__
249 ldp w11,w12,[x1],#2*4
250 add w21,w21,w17 // h+=Sigma0(a)
252 add w20,w20,w28 // h+=K[i]
253 eor w13,w25,w25,ror#14
256 add w20,w20,w10 // h+=X[i]
257 orr w17,w17,w28 // Ch(e,f,g)
258 eor w28,w21,w22 // a^b, b^c in next round
259 eor w16,w16,w13,ror#11 // Sigma1(e)
261 add w20,w20,w17 // h+=Ch(e,f,g)
262 eor w17,w21,w21,ror#9
263 add w20,w20,w16 // h+=Sigma1(e)
264 and w19,w19,w28 // (b^c)&=(a^b)
265 add w24,w24,w20 // d+=h
266 eor w19,w19,w22 // Maj(a,b,c)
267 eor w17,w13,w17,ror#13 // Sigma0(a)
268 add w20,w20,w19 // h+=Maj(a,b,c)
269 ldr w19,[x30],#4 // *K++, w28 in next round
270 //add w20,w20,w17 // h+=Sigma0(a)
271 #ifndef __AARCH64EB__
274 add w20,w20,w17 // h+=Sigma0(a)
276 add w27,w27,w19 // h+=K[i]
277 eor w14,w24,w24,ror#14
280 add w27,w27,w11 // h+=X[i]
281 orr w17,w17,w19 // Ch(e,f,g)
282 eor w19,w20,w21 // a^b, b^c in next round
283 eor w16,w16,w14,ror#11 // Sigma1(e)
285 add w27,w27,w17 // h+=Ch(e,f,g)
286 eor w17,w20,w20,ror#9
287 add w27,w27,w16 // h+=Sigma1(e)
288 and w28,w28,w19 // (b^c)&=(a^b)
289 add w23,w23,w27 // d+=h
290 eor w28,w28,w21 // Maj(a,b,c)
291 eor w17,w14,w17,ror#13 // Sigma0(a)
292 add w27,w27,w28 // h+=Maj(a,b,c)
293 ldr w28,[x30],#4 // *K++, w19 in next round
294 //add w27,w27,w17 // h+=Sigma0(a)
295 #ifndef __AARCH64EB__
298 ldp w13,w14,[x1],#2*4
299 add w27,w27,w17 // h+=Sigma0(a)
301 add w26,w26,w28 // h+=K[i]
302 eor w15,w23,w23,ror#14
305 add w26,w26,w12 // h+=X[i]
306 orr w17,w17,w28 // Ch(e,f,g)
307 eor w28,w27,w20 // a^b, b^c in next round
308 eor w16,w16,w15,ror#11 // Sigma1(e)
310 add w26,w26,w17 // h+=Ch(e,f,g)
311 eor w17,w27,w27,ror#9
312 add w26,w26,w16 // h+=Sigma1(e)
313 and w19,w19,w28 // (b^c)&=(a^b)
314 add w22,w22,w26 // d+=h
315 eor w19,w19,w20 // Maj(a,b,c)
316 eor w17,w15,w17,ror#13 // Sigma0(a)
317 add w26,w26,w19 // h+=Maj(a,b,c)
318 ldr w19,[x30],#4 // *K++, w28 in next round
319 //add w26,w26,w17 // h+=Sigma0(a)
320 #ifndef __AARCH64EB__
323 add w26,w26,w17 // h+=Sigma0(a)
325 add w25,w25,w19 // h+=K[i]
326 eor w0,w22,w22,ror#14
329 add w25,w25,w13 // h+=X[i]
330 orr w17,w17,w19 // Ch(e,f,g)
331 eor w19,w26,w27 // a^b, b^c in next round
332 eor w16,w16,w0,ror#11 // Sigma1(e)
334 add w25,w25,w17 // h+=Ch(e,f,g)
335 eor w17,w26,w26,ror#9
336 add w25,w25,w16 // h+=Sigma1(e)
337 and w28,w28,w19 // (b^c)&=(a^b)
338 add w21,w21,w25 // d+=h
339 eor w28,w28,w27 // Maj(a,b,c)
340 eor w17,w0,w17,ror#13 // Sigma0(a)
341 add w25,w25,w28 // h+=Maj(a,b,c)
342 ldr w28,[x30],#4 // *K++, w19 in next round
343 //add w25,w25,w17 // h+=Sigma0(a)
344 #ifndef __AARCH64EB__
348 add w25,w25,w17 // h+=Sigma0(a)
351 add w24,w24,w28 // h+=K[i]
352 eor w6,w21,w21,ror#14
355 add w24,w24,w14 // h+=X[i]
356 orr w17,w17,w28 // Ch(e,f,g)
357 eor w28,w25,w26 // a^b, b^c in next round
358 eor w16,w16,w6,ror#11 // Sigma1(e)
360 add w24,w24,w17 // h+=Ch(e,f,g)
361 eor w17,w25,w25,ror#9
362 add w24,w24,w16 // h+=Sigma1(e)
363 and w19,w19,w28 // (b^c)&=(a^b)
364 add w20,w20,w24 // d+=h
365 eor w19,w19,w26 // Maj(a,b,c)
366 eor w17,w6,w17,ror#13 // Sigma0(a)
367 add w24,w24,w19 // h+=Maj(a,b,c)
368 ldr w19,[x30],#4 // *K++, w28 in next round
369 //add w24,w24,w17 // h+=Sigma0(a)
370 #ifndef __AARCH64EB__
373 add w24,w24,w17 // h+=Sigma0(a)
376 add w23,w23,w19 // h+=K[i]
377 eor w7,w20,w20,ror#14
380 add w23,w23,w15 // h+=X[i]
381 orr w17,w17,w19 // Ch(e,f,g)
382 eor w19,w24,w25 // a^b, b^c in next round
383 eor w16,w16,w7,ror#11 // Sigma1(e)
385 add w23,w23,w17 // h+=Ch(e,f,g)
386 eor w17,w24,w24,ror#9
387 add w23,w23,w16 // h+=Sigma1(e)
388 and w28,w28,w19 // (b^c)&=(a^b)
389 add w27,w27,w23 // d+=h
390 eor w28,w28,w25 // Maj(a,b,c)
391 eor w17,w7,w17,ror#13 // Sigma0(a)
392 add w23,w23,w28 // h+=Maj(a,b,c)
393 ldr w28,[x30],#4 // *K++, w19 in next round
394 //add w23,w23,w17 // h+=Sigma0(a)
395 #ifndef __AARCH64EB__
399 add w23,w23,w17 // h+=Sigma0(a)
402 add w22,w22,w28 // h+=K[i]
403 eor w8,w27,w27,ror#14
406 add w22,w22,w0 // h+=X[i]
407 orr w17,w17,w28 // Ch(e,f,g)
408 eor w28,w23,w24 // a^b, b^c in next round
409 eor w16,w16,w8,ror#11 // Sigma1(e)
411 add w22,w22,w17 // h+=Ch(e,f,g)
412 eor w17,w23,w23,ror#9
413 add w22,w22,w16 // h+=Sigma1(e)
414 and w19,w19,w28 // (b^c)&=(a^b)
415 add w26,w26,w22 // d+=h
416 eor w19,w19,w24 // Maj(a,b,c)
417 eor w17,w8,w17,ror#13 // Sigma0(a)
418 add w22,w22,w19 // h+=Maj(a,b,c)
419 ldr w19,[x30],#4 // *K++, w28 in next round
420 //add w22,w22,w17 // h+=Sigma0(a)
421 #ifndef __AARCH64EB__
425 add w22,w22,w17 // h+=Sigma0(a)
428 add w21,w21,w19 // h+=K[i]
429 eor w9,w26,w26,ror#14
432 add w21,w21,w1 // h+=X[i]
433 orr w17,w17,w19 // Ch(e,f,g)
434 eor w19,w22,w23 // a^b, b^c in next round
435 eor w16,w16,w9,ror#11 // Sigma1(e)
437 add w21,w21,w17 // h+=Ch(e,f,g)
438 eor w17,w22,w22,ror#9
439 add w21,w21,w16 // h+=Sigma1(e)
440 and w28,w28,w19 // (b^c)&=(a^b)
441 add w25,w25,w21 // d+=h
442 eor w28,w28,w23 // Maj(a,b,c)
443 eor w17,w9,w17,ror#13 // Sigma0(a)
444 add w21,w21,w28 // h+=Maj(a,b,c)
445 ldr w28,[x30],#4 // *K++, w19 in next round
446 //add w21,w21,w17 // h+=Sigma0(a)
447 #ifndef __AARCH64EB__
451 add w21,w21,w17 // h+=Sigma0(a)
454 add w20,w20,w28 // h+=K[i]
460 add w20,w20,w2 // h+=X[i]
461 eor w16,w16,w25,ror#11
463 orr w17,w17,w28 // Ch(e,f,g)
464 eor w28,w21,w22 // a^b, b^c in next round
465 eor w16,w16,w25,ror#25 // Sigma1(e)
466 eor w10,w10,w21,ror#13
467 add w20,w20,w17 // h+=Ch(e,f,g)
468 and w19,w19,w28 // (b^c)&=(a^b)
470 eor w9,w9,w4,lsr#3 // sigma0(X[i+1])
471 add w20,w20,w16 // h+=Sigma1(e)
472 eor w19,w19,w22 // Maj(a,b,c)
473 eor w17,w10,w21,ror#22 // Sigma0(a)
474 eor w8,w8,w1,lsr#10 // sigma1(X[i+14])
476 add w24,w24,w20 // d+=h
477 add w20,w20,w19 // h+=Maj(a,b,c)
478 ldr w19,[x30],#4 // *K++, w28 in next round
480 add w20,w20,w17 // h+=Sigma0(a)
486 add w27,w27,w19 // h+=K[i]
492 add w27,w27,w3 // h+=X[i]
493 eor w16,w16,w24,ror#11
494 eor w10,w10,w5,ror#18
495 orr w17,w17,w19 // Ch(e,f,g)
496 eor w19,w20,w21 // a^b, b^c in next round
497 eor w16,w16,w24,ror#25 // Sigma1(e)
498 eor w11,w11,w20,ror#13
499 add w27,w27,w17 // h+=Ch(e,f,g)
500 and w28,w28,w19 // (b^c)&=(a^b)
502 eor w10,w10,w5,lsr#3 // sigma0(X[i+1])
503 add w27,w27,w16 // h+=Sigma1(e)
504 eor w28,w28,w21 // Maj(a,b,c)
505 eor w17,w11,w20,ror#22 // Sigma0(a)
506 eor w9,w9,w2,lsr#10 // sigma1(X[i+14])
508 add w23,w23,w27 // d+=h
509 add w27,w27,w28 // h+=Maj(a,b,c)
510 ldr w28,[x30],#4 // *K++, w19 in next round
512 add w27,w27,w17 // h+=Sigma0(a)
517 add w26,w26,w28 // h+=K[i]
523 add w26,w26,w4 // h+=X[i]
524 eor w16,w16,w23,ror#11
525 eor w11,w11,w6,ror#18
526 orr w17,w17,w28 // Ch(e,f,g)
527 eor w28,w27,w20 // a^b, b^c in next round
528 eor w16,w16,w23,ror#25 // Sigma1(e)
529 eor w12,w12,w27,ror#13
530 add w26,w26,w17 // h+=Ch(e,f,g)
531 and w19,w19,w28 // (b^c)&=(a^b)
532 eor w10,w10,w3,ror#19
533 eor w11,w11,w6,lsr#3 // sigma0(X[i+1])
534 add w26,w26,w16 // h+=Sigma1(e)
535 eor w19,w19,w20 // Maj(a,b,c)
536 eor w17,w12,w27,ror#22 // Sigma0(a)
537 eor w10,w10,w3,lsr#10 // sigma1(X[i+14])
539 add w22,w22,w26 // d+=h
540 add w26,w26,w19 // h+=Maj(a,b,c)
541 ldr w19,[x30],#4 // *K++, w28 in next round
543 add w26,w26,w17 // h+=Sigma0(a)
548 add w25,w25,w19 // h+=K[i]
554 add w25,w25,w5 // h+=X[i]
555 eor w16,w16,w22,ror#11
556 eor w12,w12,w7,ror#18
557 orr w17,w17,w19 // Ch(e,f,g)
558 eor w19,w26,w27 // a^b, b^c in next round
559 eor w16,w16,w22,ror#25 // Sigma1(e)
560 eor w13,w13,w26,ror#13
561 add w25,w25,w17 // h+=Ch(e,f,g)
562 and w28,w28,w19 // (b^c)&=(a^b)
563 eor w11,w11,w4,ror#19
564 eor w12,w12,w7,lsr#3 // sigma0(X[i+1])
565 add w25,w25,w16 // h+=Sigma1(e)
566 eor w28,w28,w27 // Maj(a,b,c)
567 eor w17,w13,w26,ror#22 // Sigma0(a)
568 eor w11,w11,w4,lsr#10 // sigma1(X[i+14])
570 add w21,w21,w25 // d+=h
571 add w25,w25,w28 // h+=Maj(a,b,c)
572 ldr w28,[x30],#4 // *K++, w19 in next round
574 add w25,w25,w17 // h+=Sigma0(a)
579 add w24,w24,w28 // h+=K[i]
585 add w24,w24,w6 // h+=X[i]
586 eor w16,w16,w21,ror#11
587 eor w13,w13,w8,ror#18
588 orr w17,w17,w28 // Ch(e,f,g)
589 eor w28,w25,w26 // a^b, b^c in next round
590 eor w16,w16,w21,ror#25 // Sigma1(e)
591 eor w14,w14,w25,ror#13
592 add w24,w24,w17 // h+=Ch(e,f,g)
593 and w19,w19,w28 // (b^c)&=(a^b)
594 eor w12,w12,w5,ror#19
595 eor w13,w13,w8,lsr#3 // sigma0(X[i+1])
596 add w24,w24,w16 // h+=Sigma1(e)
597 eor w19,w19,w26 // Maj(a,b,c)
598 eor w17,w14,w25,ror#22 // Sigma0(a)
599 eor w12,w12,w5,lsr#10 // sigma1(X[i+14])
601 add w20,w20,w24 // d+=h
602 add w24,w24,w19 // h+=Maj(a,b,c)
603 ldr w19,[x30],#4 // *K++, w28 in next round
605 add w24,w24,w17 // h+=Sigma0(a)
610 add w23,w23,w19 // h+=K[i]
616 add w23,w23,w7 // h+=X[i]
617 eor w16,w16,w20,ror#11
618 eor w14,w14,w9,ror#18
619 orr w17,w17,w19 // Ch(e,f,g)
620 eor w19,w24,w25 // a^b, b^c in next round
621 eor w16,w16,w20,ror#25 // Sigma1(e)
622 eor w15,w15,w24,ror#13
623 add w23,w23,w17 // h+=Ch(e,f,g)
624 and w28,w28,w19 // (b^c)&=(a^b)
625 eor w13,w13,w6,ror#19
626 eor w14,w14,w9,lsr#3 // sigma0(X[i+1])
627 add w23,w23,w16 // h+=Sigma1(e)
628 eor w28,w28,w25 // Maj(a,b,c)
629 eor w17,w15,w24,ror#22 // Sigma0(a)
630 eor w13,w13,w6,lsr#10 // sigma1(X[i+14])
632 add w27,w27,w23 // d+=h
633 add w23,w23,w28 // h+=Maj(a,b,c)
634 ldr w28,[x30],#4 // *K++, w19 in next round
636 add w23,w23,w17 // h+=Sigma0(a)
641 add w22,w22,w28 // h+=K[i]
647 add w22,w22,w8 // h+=X[i]
648 eor w16,w16,w27,ror#11
649 eor w15,w15,w10,ror#18
650 orr w17,w17,w28 // Ch(e,f,g)
651 eor w28,w23,w24 // a^b, b^c in next round
652 eor w16,w16,w27,ror#25 // Sigma1(e)
654 add w22,w22,w17 // h+=Ch(e,f,g)
655 and w19,w19,w28 // (b^c)&=(a^b)
656 eor w14,w14,w7,ror#19
657 eor w15,w15,w10,lsr#3 // sigma0(X[i+1])
658 add w22,w22,w16 // h+=Sigma1(e)
659 eor w19,w19,w24 // Maj(a,b,c)
660 eor w17,w0,w23,ror#22 // Sigma0(a)
661 eor w14,w14,w7,lsr#10 // sigma1(X[i+14])
663 add w26,w26,w22 // d+=h
664 add w22,w22,w19 // h+=Maj(a,b,c)
665 ldr w19,[x30],#4 // *K++, w28 in next round
667 add w22,w22,w17 // h+=Sigma0(a)
672 add w21,w21,w19 // h+=K[i]
678 add w21,w21,w9 // h+=X[i]
679 eor w16,w16,w26,ror#11
681 orr w17,w17,w19 // Ch(e,f,g)
682 eor w19,w22,w23 // a^b, b^c in next round
683 eor w16,w16,w26,ror#25 // Sigma1(e)
685 add w21,w21,w17 // h+=Ch(e,f,g)
686 and w28,w28,w19 // (b^c)&=(a^b)
687 eor w15,w15,w8,ror#19
688 eor w0,w0,w11,lsr#3 // sigma0(X[i+1])
689 add w21,w21,w16 // h+=Sigma1(e)
690 eor w28,w28,w23 // Maj(a,b,c)
691 eor w17,w1,w22,ror#22 // Sigma0(a)
692 eor w15,w15,w8,lsr#10 // sigma1(X[i+14])
694 add w25,w25,w21 // d+=h
695 add w21,w21,w28 // h+=Maj(a,b,c)
696 ldr w28,[x30],#4 // *K++, w19 in next round
698 add w21,w21,w17 // h+=Sigma0(a)
703 add w20,w20,w28 // h+=K[i]
709 add w20,w20,w10 // h+=X[i]
710 eor w16,w16,w25,ror#11
712 orr w17,w17,w28 // Ch(e,f,g)
713 eor w28,w21,w22 // a^b, b^c in next round
714 eor w16,w16,w25,ror#25 // Sigma1(e)
716 add w20,w20,w17 // h+=Ch(e,f,g)
717 and w19,w19,w28 // (b^c)&=(a^b)
719 eor w1,w1,w12,lsr#3 // sigma0(X[i+1])
720 add w20,w20,w16 // h+=Sigma1(e)
721 eor w19,w19,w22 // Maj(a,b,c)
722 eor w17,w2,w21,ror#22 // Sigma0(a)
723 eor w0,w0,w9,lsr#10 // sigma1(X[i+14])
725 add w24,w24,w20 // d+=h
726 add w20,w20,w19 // h+=Maj(a,b,c)
727 ldr w19,[x30],#4 // *K++, w28 in next round
729 add w20,w20,w17 // h+=Sigma0(a)
734 add w27,w27,w19 // h+=K[i]
740 add w27,w27,w11 // h+=X[i]
741 eor w16,w16,w24,ror#11
743 orr w17,w17,w19 // Ch(e,f,g)
744 eor w19,w20,w21 // a^b, b^c in next round
745 eor w16,w16,w24,ror#25 // Sigma1(e)
747 add w27,w27,w17 // h+=Ch(e,f,g)
748 and w28,w28,w19 // (b^c)&=(a^b)
750 eor w2,w2,w13,lsr#3 // sigma0(X[i+1])
751 add w27,w27,w16 // h+=Sigma1(e)
752 eor w28,w28,w21 // Maj(a,b,c)
753 eor w17,w3,w20,ror#22 // Sigma0(a)
754 eor w1,w1,w10,lsr#10 // sigma1(X[i+14])
756 add w23,w23,w27 // d+=h
757 add w27,w27,w28 // h+=Maj(a,b,c)
758 ldr w28,[x30],#4 // *K++, w19 in next round
760 add w27,w27,w17 // h+=Sigma0(a)
765 add w26,w26,w28 // h+=K[i]
771 add w26,w26,w12 // h+=X[i]
772 eor w16,w16,w23,ror#11
774 orr w17,w17,w28 // Ch(e,f,g)
775 eor w28,w27,w20 // a^b, b^c in next round
776 eor w16,w16,w23,ror#25 // Sigma1(e)
778 add w26,w26,w17 // h+=Ch(e,f,g)
779 and w19,w19,w28 // (b^c)&=(a^b)
781 eor w3,w3,w14,lsr#3 // sigma0(X[i+1])
782 add w26,w26,w16 // h+=Sigma1(e)
783 eor w19,w19,w20 // Maj(a,b,c)
784 eor w17,w4,w27,ror#22 // Sigma0(a)
785 eor w2,w2,w11,lsr#10 // sigma1(X[i+14])
787 add w22,w22,w26 // d+=h
788 add w26,w26,w19 // h+=Maj(a,b,c)
789 ldr w19,[x30],#4 // *K++, w28 in next round
791 add w26,w26,w17 // h+=Sigma0(a)
796 add w25,w25,w19 // h+=K[i]
802 add w25,w25,w13 // h+=X[i]
803 eor w16,w16,w22,ror#11
805 orr w17,w17,w19 // Ch(e,f,g)
806 eor w19,w26,w27 // a^b, b^c in next round
807 eor w16,w16,w22,ror#25 // Sigma1(e)
809 add w25,w25,w17 // h+=Ch(e,f,g)
810 and w28,w28,w19 // (b^c)&=(a^b)
812 eor w4,w4,w15,lsr#3 // sigma0(X[i+1])
813 add w25,w25,w16 // h+=Sigma1(e)
814 eor w28,w28,w27 // Maj(a,b,c)
815 eor w17,w5,w26,ror#22 // Sigma0(a)
816 eor w3,w3,w12,lsr#10 // sigma1(X[i+14])
818 add w21,w21,w25 // d+=h
819 add w25,w25,w28 // h+=Maj(a,b,c)
820 ldr w28,[x30],#4 // *K++, w19 in next round
822 add w25,w25,w17 // h+=Sigma0(a)
827 add w24,w24,w28 // h+=K[i]
833 add w24,w24,w14 // h+=X[i]
834 eor w16,w16,w21,ror#11
836 orr w17,w17,w28 // Ch(e,f,g)
837 eor w28,w25,w26 // a^b, b^c in next round
838 eor w16,w16,w21,ror#25 // Sigma1(e)
840 add w24,w24,w17 // h+=Ch(e,f,g)
841 and w19,w19,w28 // (b^c)&=(a^b)
843 eor w5,w5,w0,lsr#3 // sigma0(X[i+1])
844 add w24,w24,w16 // h+=Sigma1(e)
845 eor w19,w19,w26 // Maj(a,b,c)
846 eor w17,w6,w25,ror#22 // Sigma0(a)
847 eor w4,w4,w13,lsr#10 // sigma1(X[i+14])
849 add w20,w20,w24 // d+=h
850 add w24,w24,w19 // h+=Maj(a,b,c)
851 ldr w19,[x30],#4 // *K++, w28 in next round
853 add w24,w24,w17 // h+=Sigma0(a)
858 add w23,w23,w19 // h+=K[i]
864 add w23,w23,w15 // h+=X[i]
865 eor w16,w16,w20,ror#11
867 orr w17,w17,w19 // Ch(e,f,g)
868 eor w19,w24,w25 // a^b, b^c in next round
869 eor w16,w16,w20,ror#25 // Sigma1(e)
871 add w23,w23,w17 // h+=Ch(e,f,g)
872 and w28,w28,w19 // (b^c)&=(a^b)
874 eor w6,w6,w1,lsr#3 // sigma0(X[i+1])
875 add w23,w23,w16 // h+=Sigma1(e)
876 eor w28,w28,w25 // Maj(a,b,c)
877 eor w17,w7,w24,ror#22 // Sigma0(a)
878 eor w5,w5,w14,lsr#10 // sigma1(X[i+14])
880 add w27,w27,w23 // d+=h
881 add w23,w23,w28 // h+=Maj(a,b,c)
882 ldr w28,[x30],#4 // *K++, w19 in next round
884 add w23,w23,w17 // h+=Sigma0(a)
889 add w22,w22,w28 // h+=K[i]
895 add w22,w22,w0 // h+=X[i]
896 eor w16,w16,w27,ror#11
898 orr w17,w17,w28 // Ch(e,f,g)
899 eor w28,w23,w24 // a^b, b^c in next round
900 eor w16,w16,w27,ror#25 // Sigma1(e)
902 add w22,w22,w17 // h+=Ch(e,f,g)
903 and w19,w19,w28 // (b^c)&=(a^b)
905 eor w7,w7,w2,lsr#3 // sigma0(X[i+1])
906 add w22,w22,w16 // h+=Sigma1(e)
907 eor w19,w19,w24 // Maj(a,b,c)
908 eor w17,w8,w23,ror#22 // Sigma0(a)
909 eor w6,w6,w15,lsr#10 // sigma1(X[i+14])
911 add w26,w26,w22 // d+=h
912 add w22,w22,w19 // h+=Maj(a,b,c)
913 ldr w19,[x30],#4 // *K++, w28 in next round
915 add w22,w22,w17 // h+=Sigma0(a)
920 add w21,w21,w19 // h+=K[i]
926 add w21,w21,w1 // h+=X[i]
927 eor w16,w16,w26,ror#11
929 orr w17,w17,w19 // Ch(e,f,g)
930 eor w19,w22,w23 // a^b, b^c in next round
931 eor w16,w16,w26,ror#25 // Sigma1(e)
933 add w21,w21,w17 // h+=Ch(e,f,g)
934 and w28,w28,w19 // (b^c)&=(a^b)
936 eor w8,w8,w3,lsr#3 // sigma0(X[i+1])
937 add w21,w21,w16 // h+=Sigma1(e)
938 eor w28,w28,w23 // Maj(a,b,c)
939 eor w17,w9,w22,ror#22 // Sigma0(a)
940 eor w7,w7,w0,lsr#10 // sigma1(X[i+14])
942 add w25,w25,w21 // d+=h
943 add w21,w21,w28 // h+=Maj(a,b,c)
944 ldr w28,[x30],#4 // *K++, w19 in next round
946 add w21,w21,w17 // h+=Sigma0(a)
951 add w20,w20,w28 // h+=K[i]
957 add w20,w20,w2 // h+=X[i]
958 eor w16,w16,w25,ror#11
960 orr w17,w17,w28 // Ch(e,f,g)
961 eor w28,w21,w22 // a^b, b^c in next round
962 eor w16,w16,w25,ror#25 // Sigma1(e)
963 eor w10,w10,w21,ror#13
964 add w20,w20,w17 // h+=Ch(e,f,g)
965 and w19,w19,w28 // (b^c)&=(a^b)
967 eor w9,w9,w4,lsr#3 // sigma0(X[i+1])
968 add w20,w20,w16 // h+=Sigma1(e)
969 eor w19,w19,w22 // Maj(a,b,c)
970 eor w17,w10,w21,ror#22 // Sigma0(a)
971 eor w8,w8,w1,lsr#10 // sigma1(X[i+14])
973 add w24,w24,w20 // d+=h
974 add w20,w20,w19 // h+=Maj(a,b,c)
975 ldr w19,[x30],#4 // *K++, w28 in next round
977 add w20,w20,w17 // h+=Sigma0(a)
983 sub x30,x30,#260 // rewind
987 add x1,x1,#14*4 // advance input pointer
997 stp w22,w23,[x0,#2*4]
1001 stp w24,w25,[x0,#4*4]
1002 stp w26,w27,[x0,#6*4]
1005 ldp x19,x20,[x29,#16]
1007 ldp x21,x22,[x29,#32]
1008 ldp x23,x24,[x29,#48]
1009 ldp x25,x26,[x29,#64]
1010 ldp x27,x28,[x29,#80]
1011 ldp x29,x30,[sp],#128
1013 .size zfs_sha256_block_armv7,.-zfs_sha256_block_armv7
1015 .globl zfs_sha256_block_armv8
1016 .type zfs_sha256_block_armv8,%function
1018 zfs_sha256_block_armv8:
1021 stp x29,x30,[sp,#-16]!
1024 ld1 {v0.4s,v1.4s},[x0]
1028 ld1 {v4.16b-v7.16b},[x1],#64
1030 ld1 {v16.4s},[x3],#16
1035 orr v18.16b,v0.16b,v0.16b // offload
1036 orr v19.16b,v1.16b,v1.16b
1037 ld1 {v17.4s},[x3],#16
1038 add v16.4s,v16.4s,v4.4s
1039 .inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b
1040 orr v2.16b,v0.16b,v0.16b
1041 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1042 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1043 .inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
1044 ld1 {v16.4s},[x3],#16
1045 add v17.4s,v17.4s,v5.4s
1046 .inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b
1047 orr v2.16b,v0.16b,v0.16b
1048 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1049 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1050 .inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
1051 ld1 {v17.4s},[x3],#16
1052 add v16.4s,v16.4s,v6.4s
1053 .inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b
1054 orr v2.16b,v0.16b,v0.16b
1055 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1056 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1057 .inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
1058 ld1 {v16.4s},[x3],#16
1059 add v17.4s,v17.4s,v7.4s
1060 .inst 0x5e282887 //sha256su0 v7.16b,v4.16b
1061 orr v2.16b,v0.16b,v0.16b
1062 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1063 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1064 .inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
1065 ld1 {v17.4s},[x3],#16
1066 add v16.4s,v16.4s,v4.4s
1067 .inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b
1068 orr v2.16b,v0.16b,v0.16b
1069 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1070 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1071 .inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
1072 ld1 {v16.4s},[x3],#16
1073 add v17.4s,v17.4s,v5.4s
1074 .inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b
1075 orr v2.16b,v0.16b,v0.16b
1076 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1077 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1078 .inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
1079 ld1 {v17.4s},[x3],#16
1080 add v16.4s,v16.4s,v6.4s
1081 .inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b
1082 orr v2.16b,v0.16b,v0.16b
1083 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1084 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1085 .inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
1086 ld1 {v16.4s},[x3],#16
1087 add v17.4s,v17.4s,v7.4s
1088 .inst 0x5e282887 //sha256su0 v7.16b,v4.16b
1089 orr v2.16b,v0.16b,v0.16b
1090 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1091 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1092 .inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
1093 ld1 {v17.4s},[x3],#16
1094 add v16.4s,v16.4s,v4.4s
1095 .inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b
1096 orr v2.16b,v0.16b,v0.16b
1097 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1098 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1099 .inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
1100 ld1 {v16.4s},[x3],#16
1101 add v17.4s,v17.4s,v5.4s
1102 .inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b
1103 orr v2.16b,v0.16b,v0.16b
1104 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1105 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1106 .inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
1107 ld1 {v17.4s},[x3],#16
1108 add v16.4s,v16.4s,v6.4s
1109 .inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b
1110 orr v2.16b,v0.16b,v0.16b
1111 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1112 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1113 .inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
1114 ld1 {v16.4s},[x3],#16
1115 add v17.4s,v17.4s,v7.4s
1116 .inst 0x5e282887 //sha256su0 v7.16b,v4.16b
1117 orr v2.16b,v0.16b,v0.16b
1118 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1119 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1120 .inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
1121 ld1 {v17.4s},[x3],#16
1122 add v16.4s,v16.4s,v4.4s
1123 orr v2.16b,v0.16b,v0.16b
1124 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1125 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1127 ld1 {v16.4s},[x3],#16
1128 add v17.4s,v17.4s,v5.4s
1129 orr v2.16b,v0.16b,v0.16b
1130 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1131 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1134 add v16.4s,v16.4s,v6.4s
1135 sub x3,x3,#64*4-16 // rewind
1136 orr v2.16b,v0.16b,v0.16b
1137 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1138 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1140 add v17.4s,v17.4s,v7.4s
1141 orr v2.16b,v0.16b,v0.16b
1142 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1143 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1145 add v0.4s,v0.4s,v18.4s
1146 add v1.4s,v1.4s,v19.4s
1150 st1 {v0.4s,v1.4s},[x0]
1154 .size zfs_sha256_block_armv8,.-zfs_sha256_block_armv8
1156 .globl zfs_sha256_block_neon
1157 .type zfs_sha256_block_neon,%function
1159 zfs_sha256_block_neon:
1162 stp x29, x30, [sp, #-16]!
1167 add x2,x1,x2,lsl#6 // len to point at the end of inp
1169 ld1 {v0.16b},[x1], #16
1170 ld1 {v1.16b},[x1], #16
1171 ld1 {v2.16b},[x1], #16
1172 ld1 {v3.16b},[x1], #16
1173 ld1 {v4.4s},[x16], #16
1174 ld1 {v5.4s},[x16], #16
1175 ld1 {v6.4s},[x16], #16
1176 ld1 {v7.4s},[x16], #16
1177 rev32 v0.16b,v0.16b // yes, even on
1178 rev32 v1.16b,v1.16b // big-endian
1182 add v4.4s,v4.4s,v0.4s
1183 add v5.4s,v5.4s,v1.4s
1184 add v6.4s,v6.4s,v2.4s
1185 st1 {v4.4s-v5.4s},[x17], #32
1186 add v7.4s,v7.4s,v3.4s
1187 st1 {v6.4s-v7.4s},[x17]
1202 ext v4.16b,v0.16b,v1.16b,#4
1207 ext v7.16b,v2.16b,v3.16b,#4
1212 eor w11,w11,w7,ror#19
1214 eor w15,w3,w3,ror#11
1217 add v0.4s,v0.4s,v7.4s
1221 eor w15,w15,w3,ror#20
1222 ushr v7.4s,v4.4s,#18
1226 eor v5.16b,v5.16b,v6.16b
1231 ushr v16.4s,v19.4s,#17
1235 eor v5.16b,v5.16b,v7.16b
1238 sli v16.4s,v19.4s,#15
1241 ushr v17.4s,v19.4s,#10
1242 eor w11,w11,w6,ror#19
1243 eor w15,w10,w10,ror#11
1244 ushr v7.4s,v19.4s,#19
1247 add v0.4s,v0.4s,v5.4s
1249 eor w15,w15,w10,ror#20
1250 sli v7.4s,v19.4s,#13
1254 eor v17.16b,v17.16b,v16.16b
1258 eor v17.16b,v17.16b,v7.16b
1262 add v0.4s,v0.4s,v17.4s
1266 ushr v18.4s,v0.4s,#17
1268 ushr v19.4s,v0.4s,#10
1269 eor w11,w11,w5,ror#19
1270 eor w15,w9,w9,ror#11
1271 sli v18.4s,v0.4s,#15
1273 ushr v17.4s,v0.4s,#19
1276 eor v19.16b,v19.16b,v18.16b
1277 eor w15,w15,w9,ror#20
1279 sli v17.4s,v0.4s,#13
1283 ld1 {v4.4s},[x16], #16
1285 eor v19.16b,v19.16b,v17.16b
1287 eor v17.16b,v17.16b,v17.16b
1291 mov v17.d[1],v19.d[0]
1295 add v0.4s,v0.4s,v17.4s
1297 eor w11,w11,w4,ror#19
1298 eor w15,w8,w8,ror#11
1299 add v4.4s,v4.4s,v0.4s
1303 eor w15,w15,w8,ror#20
1310 st1 {v4.4s},[x17], #16
1311 ext v4.16b,v1.16b,v2.16b,#4
1316 ext v7.16b,v3.16b,v0.16b,#4
1321 eor w11,w11,w3,ror#19
1323 eor w15,w7,w7,ror#11
1326 add v1.4s,v1.4s,v7.4s
1330 eor w15,w15,w7,ror#20
1331 ushr v7.4s,v4.4s,#18
1335 eor v5.16b,v5.16b,v6.16b
1340 ushr v16.4s,v19.4s,#17
1344 eor v5.16b,v5.16b,v7.16b
1346 eor w11,w10,w10,ror#5
1347 sli v16.4s,v19.4s,#15
1350 ushr v17.4s,v19.4s,#10
1351 eor w11,w11,w10,ror#19
1352 eor w15,w6,w6,ror#11
1353 ushr v7.4s,v19.4s,#19
1356 add v1.4s,v1.4s,v5.4s
1358 eor w15,w15,w6,ror#20
1359 sli v7.4s,v19.4s,#13
1363 eor v17.16b,v17.16b,v16.16b
1367 eor v17.16b,v17.16b,v7.16b
1371 add v1.4s,v1.4s,v17.4s
1375 ushr v18.4s,v1.4s,#17
1377 ushr v19.4s,v1.4s,#10
1378 eor w11,w11,w9,ror#19
1379 eor w15,w5,w5,ror#11
1380 sli v18.4s,v1.4s,#15
1382 ushr v17.4s,v1.4s,#19
1385 eor v19.16b,v19.16b,v18.16b
1386 eor w15,w15,w5,ror#20
1388 sli v17.4s,v1.4s,#13
1392 ld1 {v4.4s},[x16], #16
1394 eor v19.16b,v19.16b,v17.16b
1396 eor v17.16b,v17.16b,v17.16b
1400 mov v17.d[1],v19.d[0]
1404 add v1.4s,v1.4s,v17.4s
1406 eor w11,w11,w8,ror#19
1407 eor w15,w4,w4,ror#11
1408 add v4.4s,v4.4s,v1.4s
1412 eor w15,w15,w4,ror#20
1419 st1 {v4.4s},[x17], #16
1420 ext v4.16b,v2.16b,v3.16b,#4
1425 ext v7.16b,v0.16b,v1.16b,#4
1430 eor w11,w11,w7,ror#19
1432 eor w15,w3,w3,ror#11
1435 add v2.4s,v2.4s,v7.4s
1439 eor w15,w15,w3,ror#20
1440 ushr v7.4s,v4.4s,#18
1444 eor v5.16b,v5.16b,v6.16b
1449 ushr v16.4s,v19.4s,#17
1453 eor v5.16b,v5.16b,v7.16b
1456 sli v16.4s,v19.4s,#15
1459 ushr v17.4s,v19.4s,#10
1460 eor w11,w11,w6,ror#19
1461 eor w15,w10,w10,ror#11
1462 ushr v7.4s,v19.4s,#19
1465 add v2.4s,v2.4s,v5.4s
1467 eor w15,w15,w10,ror#20
1468 sli v7.4s,v19.4s,#13
1472 eor v17.16b,v17.16b,v16.16b
1476 eor v17.16b,v17.16b,v7.16b
1480 add v2.4s,v2.4s,v17.4s
1484 ushr v18.4s,v2.4s,#17
1486 ushr v19.4s,v2.4s,#10
1487 eor w11,w11,w5,ror#19
1488 eor w15,w9,w9,ror#11
1489 sli v18.4s,v2.4s,#15
1491 ushr v17.4s,v2.4s,#19
1494 eor v19.16b,v19.16b,v18.16b
1495 eor w15,w15,w9,ror#20
1497 sli v17.4s,v2.4s,#13
1501 ld1 {v4.4s},[x16], #16
1503 eor v19.16b,v19.16b,v17.16b
1505 eor v17.16b,v17.16b,v17.16b
1509 mov v17.d[1],v19.d[0]
1513 add v2.4s,v2.4s,v17.4s
1515 eor w11,w11,w4,ror#19
1516 eor w15,w8,w8,ror#11
1517 add v4.4s,v4.4s,v2.4s
1521 eor w15,w15,w8,ror#20
1528 st1 {v4.4s},[x17], #16
1529 ext v4.16b,v3.16b,v0.16b,#4
1534 ext v7.16b,v1.16b,v2.16b,#4
1539 eor w11,w11,w3,ror#19
1541 eor w15,w7,w7,ror#11
1544 add v3.4s,v3.4s,v7.4s
1548 eor w15,w15,w7,ror#20
1549 ushr v7.4s,v4.4s,#18
1553 eor v5.16b,v5.16b,v6.16b
1558 ushr v16.4s,v19.4s,#17
1562 eor v5.16b,v5.16b,v7.16b
1564 eor w11,w10,w10,ror#5
1565 sli v16.4s,v19.4s,#15
1568 ushr v17.4s,v19.4s,#10
1569 eor w11,w11,w10,ror#19
1570 eor w15,w6,w6,ror#11
1571 ushr v7.4s,v19.4s,#19
1574 add v3.4s,v3.4s,v5.4s
1576 eor w15,w15,w6,ror#20
1577 sli v7.4s,v19.4s,#13
1581 eor v17.16b,v17.16b,v16.16b
1585 eor v17.16b,v17.16b,v7.16b
1589 add v3.4s,v3.4s,v17.4s
1593 ushr v18.4s,v3.4s,#17
1595 ushr v19.4s,v3.4s,#10
1596 eor w11,w11,w9,ror#19
1597 eor w15,w5,w5,ror#11
1598 sli v18.4s,v3.4s,#15
1600 ushr v17.4s,v3.4s,#19
1603 eor v19.16b,v19.16b,v18.16b
1604 eor w15,w15,w5,ror#20
1606 sli v17.4s,v3.4s,#13
1610 ld1 {v4.4s},[x16], #16
1612 eor v19.16b,v19.16b,v17.16b
1614 eor v17.16b,v17.16b,v17.16b
1618 mov v17.d[1],v19.d[0]
1622 add v3.4s,v3.4s,v17.4s
1624 eor w11,w11,w8,ror#19
1625 eor w15,w4,w4,ror#11
1626 add v4.4s,v4.4s,v3.4s
1630 eor w15,w15,w4,ror#20
1637 st1 {v4.4s},[x17], #16
1638 cmp w12,#0 // check for K256 terminator
1643 sub x16,x16,#256 // rewind x16
1646 csel x17, x17, xzr, eq
1647 sub x1,x1,x17 // avoid SEGV
1652 ld1 {v0.16b},[x1],#16
1655 ld1 {v4.4s},[x16],#16
1658 eor w11,w11,w7,ror#19
1659 eor w15,w3,w3,ror#11
1664 eor w15,w15,w3,ror#20
1665 add v4.4s,v4.4s,v0.4s
1679 eor w11,w11,w6,ror#19
1680 eor w15,w10,w10,ror#11
1684 eor w15,w15,w10,ror#20
1698 eor w11,w11,w5,ror#19
1699 eor w15,w9,w9,ror#11
1703 eor w15,w15,w9,ror#20
1717 eor w11,w11,w4,ror#19
1718 eor w15,w8,w8,ror#11
1722 eor w15,w15,w8,ror#20
1729 st1 {v4.4s},[x17], #16
1733 ld1 {v1.16b},[x1],#16
1736 ld1 {v4.4s},[x16],#16
1739 eor w11,w11,w3,ror#19
1740 eor w15,w7,w7,ror#11
1745 eor w15,w15,w7,ror#20
1746 add v4.4s,v4.4s,v1.4s
1757 eor w11,w10,w10,ror#5
1760 eor w11,w11,w10,ror#19
1761 eor w15,w6,w6,ror#11
1765 eor w15,w15,w6,ror#20
1779 eor w11,w11,w9,ror#19
1780 eor w15,w5,w5,ror#11
1784 eor w15,w15,w5,ror#20
1798 eor w11,w11,w8,ror#19
1799 eor w15,w4,w4,ror#11
1803 eor w15,w15,w4,ror#20
1810 st1 {v4.4s},[x17], #16
1814 ld1 {v2.16b},[x1],#16
1817 ld1 {v4.4s},[x16],#16
1820 eor w11,w11,w7,ror#19
1821 eor w15,w3,w3,ror#11
1826 eor w15,w15,w3,ror#20
1827 add v4.4s,v4.4s,v2.4s
1841 eor w11,w11,w6,ror#19
1842 eor w15,w10,w10,ror#11
1846 eor w15,w15,w10,ror#20
1860 eor w11,w11,w5,ror#19
1861 eor w15,w9,w9,ror#11
1865 eor w15,w15,w9,ror#20
1879 eor w11,w11,w4,ror#19
1880 eor w15,w8,w8,ror#11
1884 eor w15,w15,w8,ror#20
1891 st1 {v4.4s},[x17], #16
1895 ld1 {v3.16b},[x1],#16
1898 ld1 {v4.4s},[x16],#16
1901 eor w11,w11,w3,ror#19
1902 eor w15,w7,w7,ror#11
1907 eor w15,w15,w7,ror#20
1908 add v4.4s,v4.4s,v3.4s
1919 eor w11,w10,w10,ror#5
1922 eor w11,w11,w10,ror#19
1923 eor w15,w6,w6,ror#11
1927 eor w15,w15,w6,ror#20
1941 eor w11,w11,w9,ror#19
1942 eor w15,w5,w5,ror#11
1946 eor w15,w15,w5,ror#20
1960 eor w11,w11,w8,ror#19
1961 eor w15,w4,w4,ror#11
1965 eor w15,w15,w4,ror#20
1971 st1 {v4.4s},[x17], #16
1972 add w3,w3,w15 // h+=Sigma0(a) from the past
1974 add w3,w3,w13 // h+=Maj(a,b,c) from the past
1976 add w3,w3,w11 // accumulate
1978 ldp w11,w12,[x0,#16]
1981 ldp w13,w14,[x0,#24]
2000 .size zfs_sha256_block_neon,.-zfs_sha256_block_neon