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__)
24 .section .note.gnu.property,"a",@note
39 .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
40 .long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5
41 .long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3
42 .long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174
43 .long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc
44 .long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da
45 .long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7
46 .long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967
47 .long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13
48 .long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85
49 .long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3
50 .long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070
51 .long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5
52 .long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3
53 .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
54 .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
58 .globl zfs_sha256_block_armv7
59 .type zfs_sha256_block_armv7,%function
61 zfs_sha256_block_armv7:
63 stp x29,x30,[sp,#-128]!
73 ldp w20,w21,[x0] // load context
76 add x2,x1,x2,lsl#6 // end of input
83 ldr w19,[x30],#4 // *K++
84 eor w28,w21,w22 // magic seed
90 add w27,w27,w19 // h+=K[i]
94 add w27,w27,w3 // h+=X[i]
95 orr w17,w17,w19 // Ch(e,f,g)
96 eor w19,w20,w21 // a^b, b^c in next round
97 eor w16,w16,w6,ror#11 // Sigma1(e)
99 add w27,w27,w17 // h+=Ch(e,f,g)
100 eor w17,w20,w20,ror#9
101 add w27,w27,w16 // h+=Sigma1(e)
102 and w28,w28,w19 // (b^c)&=(a^b)
103 add w23,w23,w27 // d+=h
104 eor w28,w28,w21 // Maj(a,b,c)
105 eor w17,w6,w17,ror#13 // Sigma0(a)
106 add w27,w27,w28 // h+=Maj(a,b,c)
107 ldr w28,[x30],#4 // *K++, w19 in next round
108 //add w27,w27,w17 // h+=Sigma0(a)
109 #ifndef __AARCH64EB__
113 add w27,w27,w17 // h+=Sigma0(a)
115 add w26,w26,w28 // h+=K[i]
116 eor w7,w23,w23,ror#14
119 add w26,w26,w4 // h+=X[i]
120 orr w17,w17,w28 // Ch(e,f,g)
121 eor w28,w27,w20 // a^b, b^c in next round
122 eor w16,w16,w7,ror#11 // Sigma1(e)
124 add w26,w26,w17 // h+=Ch(e,f,g)
125 eor w17,w27,w27,ror#9
126 add w26,w26,w16 // h+=Sigma1(e)
127 and w19,w19,w28 // (b^c)&=(a^b)
128 add w22,w22,w26 // d+=h
129 eor w19,w19,w20 // Maj(a,b,c)
130 eor w17,w7,w17,ror#13 // Sigma0(a)
131 add w26,w26,w19 // h+=Maj(a,b,c)
132 ldr w19,[x30],#4 // *K++, w28 in next round
133 //add w26,w26,w17 // h+=Sigma0(a)
134 #ifndef __AARCH64EB__
137 add w26,w26,w17 // h+=Sigma0(a)
139 add w25,w25,w19 // h+=K[i]
140 eor w8,w22,w22,ror#14
143 add w25,w25,w5 // h+=X[i]
144 orr w17,w17,w19 // Ch(e,f,g)
145 eor w19,w26,w27 // a^b, b^c in next round
146 eor w16,w16,w8,ror#11 // Sigma1(e)
148 add w25,w25,w17 // h+=Ch(e,f,g)
149 eor w17,w26,w26,ror#9
150 add w25,w25,w16 // h+=Sigma1(e)
151 and w28,w28,w19 // (b^c)&=(a^b)
152 add w21,w21,w25 // d+=h
153 eor w28,w28,w27 // Maj(a,b,c)
154 eor w17,w8,w17,ror#13 // Sigma0(a)
155 add w25,w25,w28 // h+=Maj(a,b,c)
156 ldr w28,[x30],#4 // *K++, w19 in next round
157 //add w25,w25,w17 // h+=Sigma0(a)
158 #ifndef __AARCH64EB__
162 add w25,w25,w17 // h+=Sigma0(a)
164 add w24,w24,w28 // h+=K[i]
165 eor w9,w21,w21,ror#14
168 add w24,w24,w6 // h+=X[i]
169 orr w17,w17,w28 // Ch(e,f,g)
170 eor w28,w25,w26 // a^b, b^c in next round
171 eor w16,w16,w9,ror#11 // Sigma1(e)
173 add w24,w24,w17 // h+=Ch(e,f,g)
174 eor w17,w25,w25,ror#9
175 add w24,w24,w16 // h+=Sigma1(e)
176 and w19,w19,w28 // (b^c)&=(a^b)
177 add w20,w20,w24 // d+=h
178 eor w19,w19,w26 // Maj(a,b,c)
179 eor w17,w9,w17,ror#13 // Sigma0(a)
180 add w24,w24,w19 // h+=Maj(a,b,c)
181 ldr w19,[x30],#4 // *K++, w28 in next round
182 //add w24,w24,w17 // h+=Sigma0(a)
183 #ifndef __AARCH64EB__
186 add w24,w24,w17 // h+=Sigma0(a)
188 add w23,w23,w19 // h+=K[i]
189 eor w10,w20,w20,ror#14
192 add w23,w23,w7 // h+=X[i]
193 orr w17,w17,w19 // Ch(e,f,g)
194 eor w19,w24,w25 // a^b, b^c in next round
195 eor w16,w16,w10,ror#11 // Sigma1(e)
197 add w23,w23,w17 // h+=Ch(e,f,g)
198 eor w17,w24,w24,ror#9
199 add w23,w23,w16 // h+=Sigma1(e)
200 and w28,w28,w19 // (b^c)&=(a^b)
201 add w27,w27,w23 // d+=h
202 eor w28,w28,w25 // Maj(a,b,c)
203 eor w17,w10,w17,ror#13 // Sigma0(a)
204 add w23,w23,w28 // h+=Maj(a,b,c)
205 ldr w28,[x30],#4 // *K++, w19 in next round
206 //add w23,w23,w17 // h+=Sigma0(a)
207 #ifndef __AARCH64EB__
211 add w23,w23,w17 // h+=Sigma0(a)
213 add w22,w22,w28 // h+=K[i]
214 eor w11,w27,w27,ror#14
217 add w22,w22,w8 // h+=X[i]
218 orr w17,w17,w28 // Ch(e,f,g)
219 eor w28,w23,w24 // a^b, b^c in next round
220 eor w16,w16,w11,ror#11 // Sigma1(e)
222 add w22,w22,w17 // h+=Ch(e,f,g)
223 eor w17,w23,w23,ror#9
224 add w22,w22,w16 // h+=Sigma1(e)
225 and w19,w19,w28 // (b^c)&=(a^b)
226 add w26,w26,w22 // d+=h
227 eor w19,w19,w24 // Maj(a,b,c)
228 eor w17,w11,w17,ror#13 // Sigma0(a)
229 add w22,w22,w19 // h+=Maj(a,b,c)
230 ldr w19,[x30],#4 // *K++, w28 in next round
231 //add w22,w22,w17 // h+=Sigma0(a)
232 #ifndef __AARCH64EB__
235 add w22,w22,w17 // h+=Sigma0(a)
237 add w21,w21,w19 // h+=K[i]
238 eor w12,w26,w26,ror#14
241 add w21,w21,w9 // h+=X[i]
242 orr w17,w17,w19 // Ch(e,f,g)
243 eor w19,w22,w23 // a^b, b^c in next round
244 eor w16,w16,w12,ror#11 // Sigma1(e)
246 add w21,w21,w17 // h+=Ch(e,f,g)
247 eor w17,w22,w22,ror#9
248 add w21,w21,w16 // h+=Sigma1(e)
249 and w28,w28,w19 // (b^c)&=(a^b)
250 add w25,w25,w21 // d+=h
251 eor w28,w28,w23 // Maj(a,b,c)
252 eor w17,w12,w17,ror#13 // Sigma0(a)
253 add w21,w21,w28 // h+=Maj(a,b,c)
254 ldr w28,[x30],#4 // *K++, w19 in next round
255 //add w21,w21,w17 // h+=Sigma0(a)
256 #ifndef __AARCH64EB__
259 ldp w11,w12,[x1],#2*4
260 add w21,w21,w17 // h+=Sigma0(a)
262 add w20,w20,w28 // h+=K[i]
263 eor w13,w25,w25,ror#14
266 add w20,w20,w10 // h+=X[i]
267 orr w17,w17,w28 // Ch(e,f,g)
268 eor w28,w21,w22 // a^b, b^c in next round
269 eor w16,w16,w13,ror#11 // Sigma1(e)
271 add w20,w20,w17 // h+=Ch(e,f,g)
272 eor w17,w21,w21,ror#9
273 add w20,w20,w16 // h+=Sigma1(e)
274 and w19,w19,w28 // (b^c)&=(a^b)
275 add w24,w24,w20 // d+=h
276 eor w19,w19,w22 // Maj(a,b,c)
277 eor w17,w13,w17,ror#13 // Sigma0(a)
278 add w20,w20,w19 // h+=Maj(a,b,c)
279 ldr w19,[x30],#4 // *K++, w28 in next round
280 //add w20,w20,w17 // h+=Sigma0(a)
281 #ifndef __AARCH64EB__
284 add w20,w20,w17 // h+=Sigma0(a)
286 add w27,w27,w19 // h+=K[i]
287 eor w14,w24,w24,ror#14
290 add w27,w27,w11 // h+=X[i]
291 orr w17,w17,w19 // Ch(e,f,g)
292 eor w19,w20,w21 // a^b, b^c in next round
293 eor w16,w16,w14,ror#11 // Sigma1(e)
295 add w27,w27,w17 // h+=Ch(e,f,g)
296 eor w17,w20,w20,ror#9
297 add w27,w27,w16 // h+=Sigma1(e)
298 and w28,w28,w19 // (b^c)&=(a^b)
299 add w23,w23,w27 // d+=h
300 eor w28,w28,w21 // Maj(a,b,c)
301 eor w17,w14,w17,ror#13 // Sigma0(a)
302 add w27,w27,w28 // h+=Maj(a,b,c)
303 ldr w28,[x30],#4 // *K++, w19 in next round
304 //add w27,w27,w17 // h+=Sigma0(a)
305 #ifndef __AARCH64EB__
308 ldp w13,w14,[x1],#2*4
309 add w27,w27,w17 // h+=Sigma0(a)
311 add w26,w26,w28 // h+=K[i]
312 eor w15,w23,w23,ror#14
315 add w26,w26,w12 // h+=X[i]
316 orr w17,w17,w28 // Ch(e,f,g)
317 eor w28,w27,w20 // a^b, b^c in next round
318 eor w16,w16,w15,ror#11 // Sigma1(e)
320 add w26,w26,w17 // h+=Ch(e,f,g)
321 eor w17,w27,w27,ror#9
322 add w26,w26,w16 // h+=Sigma1(e)
323 and w19,w19,w28 // (b^c)&=(a^b)
324 add w22,w22,w26 // d+=h
325 eor w19,w19,w20 // Maj(a,b,c)
326 eor w17,w15,w17,ror#13 // Sigma0(a)
327 add w26,w26,w19 // h+=Maj(a,b,c)
328 ldr w19,[x30],#4 // *K++, w28 in next round
329 //add w26,w26,w17 // h+=Sigma0(a)
330 #ifndef __AARCH64EB__
333 add w26,w26,w17 // h+=Sigma0(a)
335 add w25,w25,w19 // h+=K[i]
336 eor w0,w22,w22,ror#14
339 add w25,w25,w13 // h+=X[i]
340 orr w17,w17,w19 // Ch(e,f,g)
341 eor w19,w26,w27 // a^b, b^c in next round
342 eor w16,w16,w0,ror#11 // Sigma1(e)
344 add w25,w25,w17 // h+=Ch(e,f,g)
345 eor w17,w26,w26,ror#9
346 add w25,w25,w16 // h+=Sigma1(e)
347 and w28,w28,w19 // (b^c)&=(a^b)
348 add w21,w21,w25 // d+=h
349 eor w28,w28,w27 // Maj(a,b,c)
350 eor w17,w0,w17,ror#13 // Sigma0(a)
351 add w25,w25,w28 // h+=Maj(a,b,c)
352 ldr w28,[x30],#4 // *K++, w19 in next round
353 //add w25,w25,w17 // h+=Sigma0(a)
354 #ifndef __AARCH64EB__
358 add w25,w25,w17 // h+=Sigma0(a)
361 add w24,w24,w28 // h+=K[i]
362 eor w6,w21,w21,ror#14
365 add w24,w24,w14 // h+=X[i]
366 orr w17,w17,w28 // Ch(e,f,g)
367 eor w28,w25,w26 // a^b, b^c in next round
368 eor w16,w16,w6,ror#11 // Sigma1(e)
370 add w24,w24,w17 // h+=Ch(e,f,g)
371 eor w17,w25,w25,ror#9
372 add w24,w24,w16 // h+=Sigma1(e)
373 and w19,w19,w28 // (b^c)&=(a^b)
374 add w20,w20,w24 // d+=h
375 eor w19,w19,w26 // Maj(a,b,c)
376 eor w17,w6,w17,ror#13 // Sigma0(a)
377 add w24,w24,w19 // h+=Maj(a,b,c)
378 ldr w19,[x30],#4 // *K++, w28 in next round
379 //add w24,w24,w17 // h+=Sigma0(a)
380 #ifndef __AARCH64EB__
383 add w24,w24,w17 // h+=Sigma0(a)
386 add w23,w23,w19 // h+=K[i]
387 eor w7,w20,w20,ror#14
390 add w23,w23,w15 // h+=X[i]
391 orr w17,w17,w19 // Ch(e,f,g)
392 eor w19,w24,w25 // a^b, b^c in next round
393 eor w16,w16,w7,ror#11 // Sigma1(e)
395 add w23,w23,w17 // h+=Ch(e,f,g)
396 eor w17,w24,w24,ror#9
397 add w23,w23,w16 // h+=Sigma1(e)
398 and w28,w28,w19 // (b^c)&=(a^b)
399 add w27,w27,w23 // d+=h
400 eor w28,w28,w25 // Maj(a,b,c)
401 eor w17,w7,w17,ror#13 // Sigma0(a)
402 add w23,w23,w28 // h+=Maj(a,b,c)
403 ldr w28,[x30],#4 // *K++, w19 in next round
404 //add w23,w23,w17 // h+=Sigma0(a)
405 #ifndef __AARCH64EB__
409 add w23,w23,w17 // h+=Sigma0(a)
412 add w22,w22,w28 // h+=K[i]
413 eor w8,w27,w27,ror#14
416 add w22,w22,w0 // h+=X[i]
417 orr w17,w17,w28 // Ch(e,f,g)
418 eor w28,w23,w24 // a^b, b^c in next round
419 eor w16,w16,w8,ror#11 // Sigma1(e)
421 add w22,w22,w17 // h+=Ch(e,f,g)
422 eor w17,w23,w23,ror#9
423 add w22,w22,w16 // h+=Sigma1(e)
424 and w19,w19,w28 // (b^c)&=(a^b)
425 add w26,w26,w22 // d+=h
426 eor w19,w19,w24 // Maj(a,b,c)
427 eor w17,w8,w17,ror#13 // Sigma0(a)
428 add w22,w22,w19 // h+=Maj(a,b,c)
429 ldr w19,[x30],#4 // *K++, w28 in next round
430 //add w22,w22,w17 // h+=Sigma0(a)
431 #ifndef __AARCH64EB__
435 add w22,w22,w17 // h+=Sigma0(a)
438 add w21,w21,w19 // h+=K[i]
439 eor w9,w26,w26,ror#14
442 add w21,w21,w1 // h+=X[i]
443 orr w17,w17,w19 // Ch(e,f,g)
444 eor w19,w22,w23 // a^b, b^c in next round
445 eor w16,w16,w9,ror#11 // Sigma1(e)
447 add w21,w21,w17 // h+=Ch(e,f,g)
448 eor w17,w22,w22,ror#9
449 add w21,w21,w16 // h+=Sigma1(e)
450 and w28,w28,w19 // (b^c)&=(a^b)
451 add w25,w25,w21 // d+=h
452 eor w28,w28,w23 // Maj(a,b,c)
453 eor w17,w9,w17,ror#13 // Sigma0(a)
454 add w21,w21,w28 // h+=Maj(a,b,c)
455 ldr w28,[x30],#4 // *K++, w19 in next round
456 //add w21,w21,w17 // h+=Sigma0(a)
457 #ifndef __AARCH64EB__
461 add w21,w21,w17 // h+=Sigma0(a)
464 add w20,w20,w28 // h+=K[i]
470 add w20,w20,w2 // h+=X[i]
471 eor w16,w16,w25,ror#11
473 orr w17,w17,w28 // Ch(e,f,g)
474 eor w28,w21,w22 // a^b, b^c in next round
475 eor w16,w16,w25,ror#25 // Sigma1(e)
476 eor w10,w10,w21,ror#13
477 add w20,w20,w17 // h+=Ch(e,f,g)
478 and w19,w19,w28 // (b^c)&=(a^b)
480 eor w9,w9,w4,lsr#3 // sigma0(X[i+1])
481 add w20,w20,w16 // h+=Sigma1(e)
482 eor w19,w19,w22 // Maj(a,b,c)
483 eor w17,w10,w21,ror#22 // Sigma0(a)
484 eor w8,w8,w1,lsr#10 // sigma1(X[i+14])
486 add w24,w24,w20 // d+=h
487 add w20,w20,w19 // h+=Maj(a,b,c)
488 ldr w19,[x30],#4 // *K++, w28 in next round
490 add w20,w20,w17 // h+=Sigma0(a)
496 add w27,w27,w19 // h+=K[i]
502 add w27,w27,w3 // h+=X[i]
503 eor w16,w16,w24,ror#11
504 eor w10,w10,w5,ror#18
505 orr w17,w17,w19 // Ch(e,f,g)
506 eor w19,w20,w21 // a^b, b^c in next round
507 eor w16,w16,w24,ror#25 // Sigma1(e)
508 eor w11,w11,w20,ror#13
509 add w27,w27,w17 // h+=Ch(e,f,g)
510 and w28,w28,w19 // (b^c)&=(a^b)
512 eor w10,w10,w5,lsr#3 // sigma0(X[i+1])
513 add w27,w27,w16 // h+=Sigma1(e)
514 eor w28,w28,w21 // Maj(a,b,c)
515 eor w17,w11,w20,ror#22 // Sigma0(a)
516 eor w9,w9,w2,lsr#10 // sigma1(X[i+14])
518 add w23,w23,w27 // d+=h
519 add w27,w27,w28 // h+=Maj(a,b,c)
520 ldr w28,[x30],#4 // *K++, w19 in next round
522 add w27,w27,w17 // h+=Sigma0(a)
527 add w26,w26,w28 // h+=K[i]
533 add w26,w26,w4 // h+=X[i]
534 eor w16,w16,w23,ror#11
535 eor w11,w11,w6,ror#18
536 orr w17,w17,w28 // Ch(e,f,g)
537 eor w28,w27,w20 // a^b, b^c in next round
538 eor w16,w16,w23,ror#25 // Sigma1(e)
539 eor w12,w12,w27,ror#13
540 add w26,w26,w17 // h+=Ch(e,f,g)
541 and w19,w19,w28 // (b^c)&=(a^b)
542 eor w10,w10,w3,ror#19
543 eor w11,w11,w6,lsr#3 // sigma0(X[i+1])
544 add w26,w26,w16 // h+=Sigma1(e)
545 eor w19,w19,w20 // Maj(a,b,c)
546 eor w17,w12,w27,ror#22 // Sigma0(a)
547 eor w10,w10,w3,lsr#10 // sigma1(X[i+14])
549 add w22,w22,w26 // d+=h
550 add w26,w26,w19 // h+=Maj(a,b,c)
551 ldr w19,[x30],#4 // *K++, w28 in next round
553 add w26,w26,w17 // h+=Sigma0(a)
558 add w25,w25,w19 // h+=K[i]
564 add w25,w25,w5 // h+=X[i]
565 eor w16,w16,w22,ror#11
566 eor w12,w12,w7,ror#18
567 orr w17,w17,w19 // Ch(e,f,g)
568 eor w19,w26,w27 // a^b, b^c in next round
569 eor w16,w16,w22,ror#25 // Sigma1(e)
570 eor w13,w13,w26,ror#13
571 add w25,w25,w17 // h+=Ch(e,f,g)
572 and w28,w28,w19 // (b^c)&=(a^b)
573 eor w11,w11,w4,ror#19
574 eor w12,w12,w7,lsr#3 // sigma0(X[i+1])
575 add w25,w25,w16 // h+=Sigma1(e)
576 eor w28,w28,w27 // Maj(a,b,c)
577 eor w17,w13,w26,ror#22 // Sigma0(a)
578 eor w11,w11,w4,lsr#10 // sigma1(X[i+14])
580 add w21,w21,w25 // d+=h
581 add w25,w25,w28 // h+=Maj(a,b,c)
582 ldr w28,[x30],#4 // *K++, w19 in next round
584 add w25,w25,w17 // h+=Sigma0(a)
589 add w24,w24,w28 // h+=K[i]
595 add w24,w24,w6 // h+=X[i]
596 eor w16,w16,w21,ror#11
597 eor w13,w13,w8,ror#18
598 orr w17,w17,w28 // Ch(e,f,g)
599 eor w28,w25,w26 // a^b, b^c in next round
600 eor w16,w16,w21,ror#25 // Sigma1(e)
601 eor w14,w14,w25,ror#13
602 add w24,w24,w17 // h+=Ch(e,f,g)
603 and w19,w19,w28 // (b^c)&=(a^b)
604 eor w12,w12,w5,ror#19
605 eor w13,w13,w8,lsr#3 // sigma0(X[i+1])
606 add w24,w24,w16 // h+=Sigma1(e)
607 eor w19,w19,w26 // Maj(a,b,c)
608 eor w17,w14,w25,ror#22 // Sigma0(a)
609 eor w12,w12,w5,lsr#10 // sigma1(X[i+14])
611 add w20,w20,w24 // d+=h
612 add w24,w24,w19 // h+=Maj(a,b,c)
613 ldr w19,[x30],#4 // *K++, w28 in next round
615 add w24,w24,w17 // h+=Sigma0(a)
620 add w23,w23,w19 // h+=K[i]
626 add w23,w23,w7 // h+=X[i]
627 eor w16,w16,w20,ror#11
628 eor w14,w14,w9,ror#18
629 orr w17,w17,w19 // Ch(e,f,g)
630 eor w19,w24,w25 // a^b, b^c in next round
631 eor w16,w16,w20,ror#25 // Sigma1(e)
632 eor w15,w15,w24,ror#13
633 add w23,w23,w17 // h+=Ch(e,f,g)
634 and w28,w28,w19 // (b^c)&=(a^b)
635 eor w13,w13,w6,ror#19
636 eor w14,w14,w9,lsr#3 // sigma0(X[i+1])
637 add w23,w23,w16 // h+=Sigma1(e)
638 eor w28,w28,w25 // Maj(a,b,c)
639 eor w17,w15,w24,ror#22 // Sigma0(a)
640 eor w13,w13,w6,lsr#10 // sigma1(X[i+14])
642 add w27,w27,w23 // d+=h
643 add w23,w23,w28 // h+=Maj(a,b,c)
644 ldr w28,[x30],#4 // *K++, w19 in next round
646 add w23,w23,w17 // h+=Sigma0(a)
651 add w22,w22,w28 // h+=K[i]
657 add w22,w22,w8 // h+=X[i]
658 eor w16,w16,w27,ror#11
659 eor w15,w15,w10,ror#18
660 orr w17,w17,w28 // Ch(e,f,g)
661 eor w28,w23,w24 // a^b, b^c in next round
662 eor w16,w16,w27,ror#25 // Sigma1(e)
664 add w22,w22,w17 // h+=Ch(e,f,g)
665 and w19,w19,w28 // (b^c)&=(a^b)
666 eor w14,w14,w7,ror#19
667 eor w15,w15,w10,lsr#3 // sigma0(X[i+1])
668 add w22,w22,w16 // h+=Sigma1(e)
669 eor w19,w19,w24 // Maj(a,b,c)
670 eor w17,w0,w23,ror#22 // Sigma0(a)
671 eor w14,w14,w7,lsr#10 // sigma1(X[i+14])
673 add w26,w26,w22 // d+=h
674 add w22,w22,w19 // h+=Maj(a,b,c)
675 ldr w19,[x30],#4 // *K++, w28 in next round
677 add w22,w22,w17 // h+=Sigma0(a)
682 add w21,w21,w19 // h+=K[i]
688 add w21,w21,w9 // h+=X[i]
689 eor w16,w16,w26,ror#11
691 orr w17,w17,w19 // Ch(e,f,g)
692 eor w19,w22,w23 // a^b, b^c in next round
693 eor w16,w16,w26,ror#25 // Sigma1(e)
695 add w21,w21,w17 // h+=Ch(e,f,g)
696 and w28,w28,w19 // (b^c)&=(a^b)
697 eor w15,w15,w8,ror#19
698 eor w0,w0,w11,lsr#3 // sigma0(X[i+1])
699 add w21,w21,w16 // h+=Sigma1(e)
700 eor w28,w28,w23 // Maj(a,b,c)
701 eor w17,w1,w22,ror#22 // Sigma0(a)
702 eor w15,w15,w8,lsr#10 // sigma1(X[i+14])
704 add w25,w25,w21 // d+=h
705 add w21,w21,w28 // h+=Maj(a,b,c)
706 ldr w28,[x30],#4 // *K++, w19 in next round
708 add w21,w21,w17 // h+=Sigma0(a)
713 add w20,w20,w28 // h+=K[i]
719 add w20,w20,w10 // h+=X[i]
720 eor w16,w16,w25,ror#11
722 orr w17,w17,w28 // Ch(e,f,g)
723 eor w28,w21,w22 // a^b, b^c in next round
724 eor w16,w16,w25,ror#25 // Sigma1(e)
726 add w20,w20,w17 // h+=Ch(e,f,g)
727 and w19,w19,w28 // (b^c)&=(a^b)
729 eor w1,w1,w12,lsr#3 // sigma0(X[i+1])
730 add w20,w20,w16 // h+=Sigma1(e)
731 eor w19,w19,w22 // Maj(a,b,c)
732 eor w17,w2,w21,ror#22 // Sigma0(a)
733 eor w0,w0,w9,lsr#10 // sigma1(X[i+14])
735 add w24,w24,w20 // d+=h
736 add w20,w20,w19 // h+=Maj(a,b,c)
737 ldr w19,[x30],#4 // *K++, w28 in next round
739 add w20,w20,w17 // h+=Sigma0(a)
744 add w27,w27,w19 // h+=K[i]
750 add w27,w27,w11 // h+=X[i]
751 eor w16,w16,w24,ror#11
753 orr w17,w17,w19 // Ch(e,f,g)
754 eor w19,w20,w21 // a^b, b^c in next round
755 eor w16,w16,w24,ror#25 // Sigma1(e)
757 add w27,w27,w17 // h+=Ch(e,f,g)
758 and w28,w28,w19 // (b^c)&=(a^b)
760 eor w2,w2,w13,lsr#3 // sigma0(X[i+1])
761 add w27,w27,w16 // h+=Sigma1(e)
762 eor w28,w28,w21 // Maj(a,b,c)
763 eor w17,w3,w20,ror#22 // Sigma0(a)
764 eor w1,w1,w10,lsr#10 // sigma1(X[i+14])
766 add w23,w23,w27 // d+=h
767 add w27,w27,w28 // h+=Maj(a,b,c)
768 ldr w28,[x30],#4 // *K++, w19 in next round
770 add w27,w27,w17 // h+=Sigma0(a)
775 add w26,w26,w28 // h+=K[i]
781 add w26,w26,w12 // h+=X[i]
782 eor w16,w16,w23,ror#11
784 orr w17,w17,w28 // Ch(e,f,g)
785 eor w28,w27,w20 // a^b, b^c in next round
786 eor w16,w16,w23,ror#25 // Sigma1(e)
788 add w26,w26,w17 // h+=Ch(e,f,g)
789 and w19,w19,w28 // (b^c)&=(a^b)
791 eor w3,w3,w14,lsr#3 // sigma0(X[i+1])
792 add w26,w26,w16 // h+=Sigma1(e)
793 eor w19,w19,w20 // Maj(a,b,c)
794 eor w17,w4,w27,ror#22 // Sigma0(a)
795 eor w2,w2,w11,lsr#10 // sigma1(X[i+14])
797 add w22,w22,w26 // d+=h
798 add w26,w26,w19 // h+=Maj(a,b,c)
799 ldr w19,[x30],#4 // *K++, w28 in next round
801 add w26,w26,w17 // h+=Sigma0(a)
806 add w25,w25,w19 // h+=K[i]
812 add w25,w25,w13 // h+=X[i]
813 eor w16,w16,w22,ror#11
815 orr w17,w17,w19 // Ch(e,f,g)
816 eor w19,w26,w27 // a^b, b^c in next round
817 eor w16,w16,w22,ror#25 // Sigma1(e)
819 add w25,w25,w17 // h+=Ch(e,f,g)
820 and w28,w28,w19 // (b^c)&=(a^b)
822 eor w4,w4,w15,lsr#3 // sigma0(X[i+1])
823 add w25,w25,w16 // h+=Sigma1(e)
824 eor w28,w28,w27 // Maj(a,b,c)
825 eor w17,w5,w26,ror#22 // Sigma0(a)
826 eor w3,w3,w12,lsr#10 // sigma1(X[i+14])
828 add w21,w21,w25 // d+=h
829 add w25,w25,w28 // h+=Maj(a,b,c)
830 ldr w28,[x30],#4 // *K++, w19 in next round
832 add w25,w25,w17 // h+=Sigma0(a)
837 add w24,w24,w28 // h+=K[i]
843 add w24,w24,w14 // h+=X[i]
844 eor w16,w16,w21,ror#11
846 orr w17,w17,w28 // Ch(e,f,g)
847 eor w28,w25,w26 // a^b, b^c in next round
848 eor w16,w16,w21,ror#25 // Sigma1(e)
850 add w24,w24,w17 // h+=Ch(e,f,g)
851 and w19,w19,w28 // (b^c)&=(a^b)
853 eor w5,w5,w0,lsr#3 // sigma0(X[i+1])
854 add w24,w24,w16 // h+=Sigma1(e)
855 eor w19,w19,w26 // Maj(a,b,c)
856 eor w17,w6,w25,ror#22 // Sigma0(a)
857 eor w4,w4,w13,lsr#10 // sigma1(X[i+14])
859 add w20,w20,w24 // d+=h
860 add w24,w24,w19 // h+=Maj(a,b,c)
861 ldr w19,[x30],#4 // *K++, w28 in next round
863 add w24,w24,w17 // h+=Sigma0(a)
868 add w23,w23,w19 // h+=K[i]
874 add w23,w23,w15 // h+=X[i]
875 eor w16,w16,w20,ror#11
877 orr w17,w17,w19 // Ch(e,f,g)
878 eor w19,w24,w25 // a^b, b^c in next round
879 eor w16,w16,w20,ror#25 // Sigma1(e)
881 add w23,w23,w17 // h+=Ch(e,f,g)
882 and w28,w28,w19 // (b^c)&=(a^b)
884 eor w6,w6,w1,lsr#3 // sigma0(X[i+1])
885 add w23,w23,w16 // h+=Sigma1(e)
886 eor w28,w28,w25 // Maj(a,b,c)
887 eor w17,w7,w24,ror#22 // Sigma0(a)
888 eor w5,w5,w14,lsr#10 // sigma1(X[i+14])
890 add w27,w27,w23 // d+=h
891 add w23,w23,w28 // h+=Maj(a,b,c)
892 ldr w28,[x30],#4 // *K++, w19 in next round
894 add w23,w23,w17 // h+=Sigma0(a)
899 add w22,w22,w28 // h+=K[i]
905 add w22,w22,w0 // h+=X[i]
906 eor w16,w16,w27,ror#11
908 orr w17,w17,w28 // Ch(e,f,g)
909 eor w28,w23,w24 // a^b, b^c in next round
910 eor w16,w16,w27,ror#25 // Sigma1(e)
912 add w22,w22,w17 // h+=Ch(e,f,g)
913 and w19,w19,w28 // (b^c)&=(a^b)
915 eor w7,w7,w2,lsr#3 // sigma0(X[i+1])
916 add w22,w22,w16 // h+=Sigma1(e)
917 eor w19,w19,w24 // Maj(a,b,c)
918 eor w17,w8,w23,ror#22 // Sigma0(a)
919 eor w6,w6,w15,lsr#10 // sigma1(X[i+14])
921 add w26,w26,w22 // d+=h
922 add w22,w22,w19 // h+=Maj(a,b,c)
923 ldr w19,[x30],#4 // *K++, w28 in next round
925 add w22,w22,w17 // h+=Sigma0(a)
930 add w21,w21,w19 // h+=K[i]
936 add w21,w21,w1 // h+=X[i]
937 eor w16,w16,w26,ror#11
939 orr w17,w17,w19 // Ch(e,f,g)
940 eor w19,w22,w23 // a^b, b^c in next round
941 eor w16,w16,w26,ror#25 // Sigma1(e)
943 add w21,w21,w17 // h+=Ch(e,f,g)
944 and w28,w28,w19 // (b^c)&=(a^b)
946 eor w8,w8,w3,lsr#3 // sigma0(X[i+1])
947 add w21,w21,w16 // h+=Sigma1(e)
948 eor w28,w28,w23 // Maj(a,b,c)
949 eor w17,w9,w22,ror#22 // Sigma0(a)
950 eor w7,w7,w0,lsr#10 // sigma1(X[i+14])
952 add w25,w25,w21 // d+=h
953 add w21,w21,w28 // h+=Maj(a,b,c)
954 ldr w28,[x30],#4 // *K++, w19 in next round
956 add w21,w21,w17 // h+=Sigma0(a)
961 add w20,w20,w28 // h+=K[i]
967 add w20,w20,w2 // h+=X[i]
968 eor w16,w16,w25,ror#11
970 orr w17,w17,w28 // Ch(e,f,g)
971 eor w28,w21,w22 // a^b, b^c in next round
972 eor w16,w16,w25,ror#25 // Sigma1(e)
973 eor w10,w10,w21,ror#13
974 add w20,w20,w17 // h+=Ch(e,f,g)
975 and w19,w19,w28 // (b^c)&=(a^b)
977 eor w9,w9,w4,lsr#3 // sigma0(X[i+1])
978 add w20,w20,w16 // h+=Sigma1(e)
979 eor w19,w19,w22 // Maj(a,b,c)
980 eor w17,w10,w21,ror#22 // Sigma0(a)
981 eor w8,w8,w1,lsr#10 // sigma1(X[i+14])
983 add w24,w24,w20 // d+=h
984 add w20,w20,w19 // h+=Maj(a,b,c)
985 ldr w19,[x30],#4 // *K++, w28 in next round
987 add w20,w20,w17 // h+=Sigma0(a)
993 sub x30,x30,#260 // rewind
997 add x1,x1,#14*4 // advance input pointer
1000 ldp w9,w10,[x0,#6*4]
1007 stp w22,w23,[x0,#2*4]
1011 stp w24,w25,[x0,#4*4]
1012 stp w26,w27,[x0,#6*4]
1015 ldp x19,x20,[x29,#16]
1017 ldp x21,x22,[x29,#32]
1018 ldp x23,x24,[x29,#48]
1019 ldp x25,x26,[x29,#64]
1020 ldp x27,x28,[x29,#80]
1021 ldp x29,x30,[sp],#128
1023 .size zfs_sha256_block_armv7,.-zfs_sha256_block_armv7
1025 .globl zfs_sha256_block_armv8
1026 .type zfs_sha256_block_armv8,%function
1028 zfs_sha256_block_armv8:
1031 stp x29,x30,[sp,#-16]!
1034 ld1 {v0.4s,v1.4s},[x0]
1038 ld1 {v4.16b-v7.16b},[x1],#64
1040 ld1 {v16.4s},[x3],#16
1045 orr v18.16b,v0.16b,v0.16b // offload
1046 orr v19.16b,v1.16b,v1.16b
1047 ld1 {v17.4s},[x3],#16
1048 add v16.4s,v16.4s,v4.4s
1049 .inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b
1050 orr v2.16b,v0.16b,v0.16b
1051 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1052 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1053 .inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
1054 ld1 {v16.4s},[x3],#16
1055 add v17.4s,v17.4s,v5.4s
1056 .inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b
1057 orr v2.16b,v0.16b,v0.16b
1058 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1059 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1060 .inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
1061 ld1 {v17.4s},[x3],#16
1062 add v16.4s,v16.4s,v6.4s
1063 .inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b
1064 orr v2.16b,v0.16b,v0.16b
1065 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1066 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1067 .inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
1068 ld1 {v16.4s},[x3],#16
1069 add v17.4s,v17.4s,v7.4s
1070 .inst 0x5e282887 //sha256su0 v7.16b,v4.16b
1071 orr v2.16b,v0.16b,v0.16b
1072 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1073 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1074 .inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
1075 ld1 {v17.4s},[x3],#16
1076 add v16.4s,v16.4s,v4.4s
1077 .inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b
1078 orr v2.16b,v0.16b,v0.16b
1079 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1080 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1081 .inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
1082 ld1 {v16.4s},[x3],#16
1083 add v17.4s,v17.4s,v5.4s
1084 .inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b
1085 orr v2.16b,v0.16b,v0.16b
1086 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1087 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1088 .inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
1089 ld1 {v17.4s},[x3],#16
1090 add v16.4s,v16.4s,v6.4s
1091 .inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b
1092 orr v2.16b,v0.16b,v0.16b
1093 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1094 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1095 .inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
1096 ld1 {v16.4s},[x3],#16
1097 add v17.4s,v17.4s,v7.4s
1098 .inst 0x5e282887 //sha256su0 v7.16b,v4.16b
1099 orr v2.16b,v0.16b,v0.16b
1100 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1101 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1102 .inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
1103 ld1 {v17.4s},[x3],#16
1104 add v16.4s,v16.4s,v4.4s
1105 .inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b
1106 orr v2.16b,v0.16b,v0.16b
1107 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1108 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1109 .inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
1110 ld1 {v16.4s},[x3],#16
1111 add v17.4s,v17.4s,v5.4s
1112 .inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b
1113 orr v2.16b,v0.16b,v0.16b
1114 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1115 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1116 .inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
1117 ld1 {v17.4s},[x3],#16
1118 add v16.4s,v16.4s,v6.4s
1119 .inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b
1120 orr v2.16b,v0.16b,v0.16b
1121 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1122 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1123 .inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
1124 ld1 {v16.4s},[x3],#16
1125 add v17.4s,v17.4s,v7.4s
1126 .inst 0x5e282887 //sha256su0 v7.16b,v4.16b
1127 orr v2.16b,v0.16b,v0.16b
1128 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1129 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1130 .inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
1131 ld1 {v17.4s},[x3],#16
1132 add v16.4s,v16.4s,v4.4s
1133 orr v2.16b,v0.16b,v0.16b
1134 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1135 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1137 ld1 {v16.4s},[x3],#16
1138 add v17.4s,v17.4s,v5.4s
1139 orr v2.16b,v0.16b,v0.16b
1140 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1141 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1144 add v16.4s,v16.4s,v6.4s
1145 sub x3,x3,#64*4-16 // rewind
1146 orr v2.16b,v0.16b,v0.16b
1147 .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1148 .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1150 add v17.4s,v17.4s,v7.4s
1151 orr v2.16b,v0.16b,v0.16b
1152 .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1153 .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1155 add v0.4s,v0.4s,v18.4s
1156 add v1.4s,v1.4s,v19.4s
1160 st1 {v0.4s,v1.4s},[x0]
1164 .size zfs_sha256_block_armv8,.-zfs_sha256_block_armv8
1166 .globl zfs_sha256_block_neon
1167 .type zfs_sha256_block_neon,%function
1169 zfs_sha256_block_neon:
1172 stp x29, x30, [sp, #-16]!
1177 add x2,x1,x2,lsl#6 // len to point at the end of inp
1179 ld1 {v0.16b},[x1], #16
1180 ld1 {v1.16b},[x1], #16
1181 ld1 {v2.16b},[x1], #16
1182 ld1 {v3.16b},[x1], #16
1183 ld1 {v4.4s},[x16], #16
1184 ld1 {v5.4s},[x16], #16
1185 ld1 {v6.4s},[x16], #16
1186 ld1 {v7.4s},[x16], #16
1187 rev32 v0.16b,v0.16b // yes, even on
1188 rev32 v1.16b,v1.16b // big-endian
1192 add v4.4s,v4.4s,v0.4s
1193 add v5.4s,v5.4s,v1.4s
1194 add v6.4s,v6.4s,v2.4s
1195 st1 {v4.4s-v5.4s},[x17], #32
1196 add v7.4s,v7.4s,v3.4s
1197 st1 {v6.4s-v7.4s},[x17]
1212 ext v4.16b,v0.16b,v1.16b,#4
1217 ext v7.16b,v2.16b,v3.16b,#4
1222 eor w11,w11,w7,ror#19
1224 eor w15,w3,w3,ror#11
1227 add v0.4s,v0.4s,v7.4s
1231 eor w15,w15,w3,ror#20
1232 ushr v7.4s,v4.4s,#18
1236 eor v5.16b,v5.16b,v6.16b
1241 ushr v16.4s,v19.4s,#17
1245 eor v5.16b,v5.16b,v7.16b
1248 sli v16.4s,v19.4s,#15
1251 ushr v17.4s,v19.4s,#10
1252 eor w11,w11,w6,ror#19
1253 eor w15,w10,w10,ror#11
1254 ushr v7.4s,v19.4s,#19
1257 add v0.4s,v0.4s,v5.4s
1259 eor w15,w15,w10,ror#20
1260 sli v7.4s,v19.4s,#13
1264 eor v17.16b,v17.16b,v16.16b
1268 eor v17.16b,v17.16b,v7.16b
1272 add v0.4s,v0.4s,v17.4s
1276 ushr v18.4s,v0.4s,#17
1278 ushr v19.4s,v0.4s,#10
1279 eor w11,w11,w5,ror#19
1280 eor w15,w9,w9,ror#11
1281 sli v18.4s,v0.4s,#15
1283 ushr v17.4s,v0.4s,#19
1286 eor v19.16b,v19.16b,v18.16b
1287 eor w15,w15,w9,ror#20
1289 sli v17.4s,v0.4s,#13
1293 ld1 {v4.4s},[x16], #16
1295 eor v19.16b,v19.16b,v17.16b
1297 eor v17.16b,v17.16b,v17.16b
1301 mov v17.d[1],v19.d[0]
1305 add v0.4s,v0.4s,v17.4s
1307 eor w11,w11,w4,ror#19
1308 eor w15,w8,w8,ror#11
1309 add v4.4s,v4.4s,v0.4s
1313 eor w15,w15,w8,ror#20
1320 st1 {v4.4s},[x17], #16
1321 ext v4.16b,v1.16b,v2.16b,#4
1326 ext v7.16b,v3.16b,v0.16b,#4
1331 eor w11,w11,w3,ror#19
1333 eor w15,w7,w7,ror#11
1336 add v1.4s,v1.4s,v7.4s
1340 eor w15,w15,w7,ror#20
1341 ushr v7.4s,v4.4s,#18
1345 eor v5.16b,v5.16b,v6.16b
1350 ushr v16.4s,v19.4s,#17
1354 eor v5.16b,v5.16b,v7.16b
1356 eor w11,w10,w10,ror#5
1357 sli v16.4s,v19.4s,#15
1360 ushr v17.4s,v19.4s,#10
1361 eor w11,w11,w10,ror#19
1362 eor w15,w6,w6,ror#11
1363 ushr v7.4s,v19.4s,#19
1366 add v1.4s,v1.4s,v5.4s
1368 eor w15,w15,w6,ror#20
1369 sli v7.4s,v19.4s,#13
1373 eor v17.16b,v17.16b,v16.16b
1377 eor v17.16b,v17.16b,v7.16b
1381 add v1.4s,v1.4s,v17.4s
1385 ushr v18.4s,v1.4s,#17
1387 ushr v19.4s,v1.4s,#10
1388 eor w11,w11,w9,ror#19
1389 eor w15,w5,w5,ror#11
1390 sli v18.4s,v1.4s,#15
1392 ushr v17.4s,v1.4s,#19
1395 eor v19.16b,v19.16b,v18.16b
1396 eor w15,w15,w5,ror#20
1398 sli v17.4s,v1.4s,#13
1402 ld1 {v4.4s},[x16], #16
1404 eor v19.16b,v19.16b,v17.16b
1406 eor v17.16b,v17.16b,v17.16b
1410 mov v17.d[1],v19.d[0]
1414 add v1.4s,v1.4s,v17.4s
1416 eor w11,w11,w8,ror#19
1417 eor w15,w4,w4,ror#11
1418 add v4.4s,v4.4s,v1.4s
1422 eor w15,w15,w4,ror#20
1429 st1 {v4.4s},[x17], #16
1430 ext v4.16b,v2.16b,v3.16b,#4
1435 ext v7.16b,v0.16b,v1.16b,#4
1440 eor w11,w11,w7,ror#19
1442 eor w15,w3,w3,ror#11
1445 add v2.4s,v2.4s,v7.4s
1449 eor w15,w15,w3,ror#20
1450 ushr v7.4s,v4.4s,#18
1454 eor v5.16b,v5.16b,v6.16b
1459 ushr v16.4s,v19.4s,#17
1463 eor v5.16b,v5.16b,v7.16b
1466 sli v16.4s,v19.4s,#15
1469 ushr v17.4s,v19.4s,#10
1470 eor w11,w11,w6,ror#19
1471 eor w15,w10,w10,ror#11
1472 ushr v7.4s,v19.4s,#19
1475 add v2.4s,v2.4s,v5.4s
1477 eor w15,w15,w10,ror#20
1478 sli v7.4s,v19.4s,#13
1482 eor v17.16b,v17.16b,v16.16b
1486 eor v17.16b,v17.16b,v7.16b
1490 add v2.4s,v2.4s,v17.4s
1494 ushr v18.4s,v2.4s,#17
1496 ushr v19.4s,v2.4s,#10
1497 eor w11,w11,w5,ror#19
1498 eor w15,w9,w9,ror#11
1499 sli v18.4s,v2.4s,#15
1501 ushr v17.4s,v2.4s,#19
1504 eor v19.16b,v19.16b,v18.16b
1505 eor w15,w15,w9,ror#20
1507 sli v17.4s,v2.4s,#13
1511 ld1 {v4.4s},[x16], #16
1513 eor v19.16b,v19.16b,v17.16b
1515 eor v17.16b,v17.16b,v17.16b
1519 mov v17.d[1],v19.d[0]
1523 add v2.4s,v2.4s,v17.4s
1525 eor w11,w11,w4,ror#19
1526 eor w15,w8,w8,ror#11
1527 add v4.4s,v4.4s,v2.4s
1531 eor w15,w15,w8,ror#20
1538 st1 {v4.4s},[x17], #16
1539 ext v4.16b,v3.16b,v0.16b,#4
1544 ext v7.16b,v1.16b,v2.16b,#4
1549 eor w11,w11,w3,ror#19
1551 eor w15,w7,w7,ror#11
1554 add v3.4s,v3.4s,v7.4s
1558 eor w15,w15,w7,ror#20
1559 ushr v7.4s,v4.4s,#18
1563 eor v5.16b,v5.16b,v6.16b
1568 ushr v16.4s,v19.4s,#17
1572 eor v5.16b,v5.16b,v7.16b
1574 eor w11,w10,w10,ror#5
1575 sli v16.4s,v19.4s,#15
1578 ushr v17.4s,v19.4s,#10
1579 eor w11,w11,w10,ror#19
1580 eor w15,w6,w6,ror#11
1581 ushr v7.4s,v19.4s,#19
1584 add v3.4s,v3.4s,v5.4s
1586 eor w15,w15,w6,ror#20
1587 sli v7.4s,v19.4s,#13
1591 eor v17.16b,v17.16b,v16.16b
1595 eor v17.16b,v17.16b,v7.16b
1599 add v3.4s,v3.4s,v17.4s
1603 ushr v18.4s,v3.4s,#17
1605 ushr v19.4s,v3.4s,#10
1606 eor w11,w11,w9,ror#19
1607 eor w15,w5,w5,ror#11
1608 sli v18.4s,v3.4s,#15
1610 ushr v17.4s,v3.4s,#19
1613 eor v19.16b,v19.16b,v18.16b
1614 eor w15,w15,w5,ror#20
1616 sli v17.4s,v3.4s,#13
1620 ld1 {v4.4s},[x16], #16
1622 eor v19.16b,v19.16b,v17.16b
1624 eor v17.16b,v17.16b,v17.16b
1628 mov v17.d[1],v19.d[0]
1632 add v3.4s,v3.4s,v17.4s
1634 eor w11,w11,w8,ror#19
1635 eor w15,w4,w4,ror#11
1636 add v4.4s,v4.4s,v3.4s
1640 eor w15,w15,w4,ror#20
1647 st1 {v4.4s},[x17], #16
1648 cmp w12,#0 // check for K256 terminator
1653 sub x16,x16,#256 // rewind x16
1656 csel x17, x17, xzr, eq
1657 sub x1,x1,x17 // avoid SEGV
1662 ld1 {v0.16b},[x1],#16
1665 ld1 {v4.4s},[x16],#16
1668 eor w11,w11,w7,ror#19
1669 eor w15,w3,w3,ror#11
1674 eor w15,w15,w3,ror#20
1675 add v4.4s,v4.4s,v0.4s
1689 eor w11,w11,w6,ror#19
1690 eor w15,w10,w10,ror#11
1694 eor w15,w15,w10,ror#20
1708 eor w11,w11,w5,ror#19
1709 eor w15,w9,w9,ror#11
1713 eor w15,w15,w9,ror#20
1727 eor w11,w11,w4,ror#19
1728 eor w15,w8,w8,ror#11
1732 eor w15,w15,w8,ror#20
1739 st1 {v4.4s},[x17], #16
1743 ld1 {v1.16b},[x1],#16
1746 ld1 {v4.4s},[x16],#16
1749 eor w11,w11,w3,ror#19
1750 eor w15,w7,w7,ror#11
1755 eor w15,w15,w7,ror#20
1756 add v4.4s,v4.4s,v1.4s
1767 eor w11,w10,w10,ror#5
1770 eor w11,w11,w10,ror#19
1771 eor w15,w6,w6,ror#11
1775 eor w15,w15,w6,ror#20
1789 eor w11,w11,w9,ror#19
1790 eor w15,w5,w5,ror#11
1794 eor w15,w15,w5,ror#20
1808 eor w11,w11,w8,ror#19
1809 eor w15,w4,w4,ror#11
1813 eor w15,w15,w4,ror#20
1820 st1 {v4.4s},[x17], #16
1824 ld1 {v2.16b},[x1],#16
1827 ld1 {v4.4s},[x16],#16
1830 eor w11,w11,w7,ror#19
1831 eor w15,w3,w3,ror#11
1836 eor w15,w15,w3,ror#20
1837 add v4.4s,v4.4s,v2.4s
1851 eor w11,w11,w6,ror#19
1852 eor w15,w10,w10,ror#11
1856 eor w15,w15,w10,ror#20
1870 eor w11,w11,w5,ror#19
1871 eor w15,w9,w9,ror#11
1875 eor w15,w15,w9,ror#20
1889 eor w11,w11,w4,ror#19
1890 eor w15,w8,w8,ror#11
1894 eor w15,w15,w8,ror#20
1901 st1 {v4.4s},[x17], #16
1905 ld1 {v3.16b},[x1],#16
1908 ld1 {v4.4s},[x16],#16
1911 eor w11,w11,w3,ror#19
1912 eor w15,w7,w7,ror#11
1917 eor w15,w15,w7,ror#20
1918 add v4.4s,v4.4s,v3.4s
1929 eor w11,w10,w10,ror#5
1932 eor w11,w11,w10,ror#19
1933 eor w15,w6,w6,ror#11
1937 eor w15,w15,w6,ror#20
1951 eor w11,w11,w9,ror#19
1952 eor w15,w5,w5,ror#11
1956 eor w15,w15,w5,ror#20
1970 eor w11,w11,w8,ror#19
1971 eor w15,w4,w4,ror#11
1975 eor w15,w15,w4,ror#20
1981 st1 {v4.4s},[x17], #16
1982 add w3,w3,w15 // h+=Sigma0(a) from the past
1984 add w3,w3,w13 // h+=Maj(a,b,c) from the past
1986 add w3,w3,w11 // accumulate
1988 ldp w11,w12,[x0,#16]
1991 ldp w13,w14,[x0,#24]
2010 .size zfs_sha256_block_neon,.-zfs_sha256_block_neon