zfs_main: fix alignment on props usage output
[zfs.git] / module / icp / asm-aarch64 / sha2 / sha256-armv8.S
blob4dcdd3b65d0bb61239ca8a43f69fd043a7b6716b
1 /*
2  * Copyright 2004-2022 The OpenSSL Project Authors. All Rights Reserved.
3  *
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
7  *
8  *     https://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
18  * Portions Copyright (c) 2022 Tino Reichardt <milky-zfs@mcmilk.de>
19  * - modified assembly to fit into OpenZFS
20  */
22 #if defined(__aarch64__)
24         .section        .note.gnu.property,"a",@note
25         .p2align        3
26         .word   4
27         .word   16
28         .word   5
29         .asciz  "GNU"
30         .word   3221225472
31         .word   4
32         .word   3
33         .word   0
34 .text
36 .align  6
37 .type   .LK256,%object
38 .LK256:
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
55         .long   0       //terminator
56 .size   .LK256,.-.LK256
58 .globl  zfs_sha256_block_armv7
59 .type   zfs_sha256_block_armv7,%function
60 .align  6
61 zfs_sha256_block_armv7:
62         hint    #34                                     // bti c
63         stp     x29,x30,[sp,#-128]!
64         add     x29,sp,#0
66         stp     x19,x20,[sp,#16]
67         stp     x21,x22,[sp,#32]
68         stp     x23,x24,[sp,#48]
69         stp     x25,x26,[sp,#64]
70         stp     x27,x28,[sp,#80]
71         sub     sp,sp,#4*4
73         ldp     w20,w21,[x0]                            // load context
74         ldp     w22,w23,[x0,#2*4]
75         ldp     w24,w25,[x0,#4*4]
76         add     x2,x1,x2,lsl#6  // end of input
77         ldp     w26,w27,[x0,#6*4]
78         adr     x30,.LK256
79         stp     x0,x2,[x29,#96]
81 .Loop:
82         ldp     w3,w4,[x1],#2*4
83         ldr     w19,[x30],#4                    // *K++
84         eor     w28,w21,w22                             // magic seed
85         str     x1,[x29,#112]
86 #ifndef __AARCH64EB__
87         rev     w3,w3                   // 0
88 #endif
89         ror     w16,w24,#6
90         add     w27,w27,w19                     // h+=K[i]
91         eor     w6,w24,w24,ror#14
92         and     w17,w25,w24
93         bic     w19,w26,w24
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)
98         ror     w6,w20,#2
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__
110         rev     w4,w4                   // 1
111 #endif
112         ldp     w5,w6,[x1],#2*4
113         add     w27,w27,w17                     // h+=Sigma0(a)
114         ror     w16,w23,#6
115         add     w26,w26,w28                     // h+=K[i]
116         eor     w7,w23,w23,ror#14
117         and     w17,w24,w23
118         bic     w28,w25,w23
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)
123         ror     w7,w27,#2
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__
135         rev     w5,w5                   // 2
136 #endif
137         add     w26,w26,w17                     // h+=Sigma0(a)
138         ror     w16,w22,#6
139         add     w25,w25,w19                     // h+=K[i]
140         eor     w8,w22,w22,ror#14
141         and     w17,w23,w22
142         bic     w19,w24,w22
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)
147         ror     w8,w26,#2
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__
159         rev     w6,w6                   // 3
160 #endif
161         ldp     w7,w8,[x1],#2*4
162         add     w25,w25,w17                     // h+=Sigma0(a)
163         ror     w16,w21,#6
164         add     w24,w24,w28                     // h+=K[i]
165         eor     w9,w21,w21,ror#14
166         and     w17,w22,w21
167         bic     w28,w23,w21
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)
172         ror     w9,w25,#2
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__
184         rev     w7,w7                   // 4
185 #endif
186         add     w24,w24,w17                     // h+=Sigma0(a)
187         ror     w16,w20,#6
188         add     w23,w23,w19                     // h+=K[i]
189         eor     w10,w20,w20,ror#14
190         and     w17,w21,w20
191         bic     w19,w22,w20
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)
196         ror     w10,w24,#2
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__
208         rev     w8,w8                   // 5
209 #endif
210         ldp     w9,w10,[x1],#2*4
211         add     w23,w23,w17                     // h+=Sigma0(a)
212         ror     w16,w27,#6
213         add     w22,w22,w28                     // h+=K[i]
214         eor     w11,w27,w27,ror#14
215         and     w17,w20,w27
216         bic     w28,w21,w27
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)
221         ror     w11,w23,#2
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__
233         rev     w9,w9                   // 6
234 #endif
235         add     w22,w22,w17                     // h+=Sigma0(a)
236         ror     w16,w26,#6
237         add     w21,w21,w19                     // h+=K[i]
238         eor     w12,w26,w26,ror#14
239         and     w17,w27,w26
240         bic     w19,w20,w26
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)
245         ror     w12,w22,#2
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__
257         rev     w10,w10                 // 7
258 #endif
259         ldp     w11,w12,[x1],#2*4
260         add     w21,w21,w17                     // h+=Sigma0(a)
261         ror     w16,w25,#6
262         add     w20,w20,w28                     // h+=K[i]
263         eor     w13,w25,w25,ror#14
264         and     w17,w26,w25
265         bic     w28,w27,w25
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)
270         ror     w13,w21,#2
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__
282         rev     w11,w11                 // 8
283 #endif
284         add     w20,w20,w17                     // h+=Sigma0(a)
285         ror     w16,w24,#6
286         add     w27,w27,w19                     // h+=K[i]
287         eor     w14,w24,w24,ror#14
288         and     w17,w25,w24
289         bic     w19,w26,w24
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)
294         ror     w14,w20,#2
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__
306         rev     w12,w12                 // 9
307 #endif
308         ldp     w13,w14,[x1],#2*4
309         add     w27,w27,w17                     // h+=Sigma0(a)
310         ror     w16,w23,#6
311         add     w26,w26,w28                     // h+=K[i]
312         eor     w15,w23,w23,ror#14
313         and     w17,w24,w23
314         bic     w28,w25,w23
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)
319         ror     w15,w27,#2
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__
331         rev     w13,w13                 // 10
332 #endif
333         add     w26,w26,w17                     // h+=Sigma0(a)
334         ror     w16,w22,#6
335         add     w25,w25,w19                     // h+=K[i]
336         eor     w0,w22,w22,ror#14
337         and     w17,w23,w22
338         bic     w19,w24,w22
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)
343         ror     w0,w26,#2
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__
355         rev     w14,w14                 // 11
356 #endif
357         ldp     w15,w0,[x1],#2*4
358         add     w25,w25,w17                     // h+=Sigma0(a)
359         str     w6,[sp,#12]
360         ror     w16,w21,#6
361         add     w24,w24,w28                     // h+=K[i]
362         eor     w6,w21,w21,ror#14
363         and     w17,w22,w21
364         bic     w28,w23,w21
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)
369         ror     w6,w25,#2
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__
381         rev     w15,w15                 // 12
382 #endif
383         add     w24,w24,w17                     // h+=Sigma0(a)
384         str     w7,[sp,#0]
385         ror     w16,w20,#6
386         add     w23,w23,w19                     // h+=K[i]
387         eor     w7,w20,w20,ror#14
388         and     w17,w21,w20
389         bic     w19,w22,w20
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)
394         ror     w7,w24,#2
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__
406         rev     w0,w0                   // 13
407 #endif
408         ldp     w1,w2,[x1]
409         add     w23,w23,w17                     // h+=Sigma0(a)
410         str     w8,[sp,#4]
411         ror     w16,w27,#6
412         add     w22,w22,w28                     // h+=K[i]
413         eor     w8,w27,w27,ror#14
414         and     w17,w20,w27
415         bic     w28,w21,w27
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)
420         ror     w8,w23,#2
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__
432         rev     w1,w1                   // 14
433 #endif
434         ldr     w6,[sp,#12]
435         add     w22,w22,w17                     // h+=Sigma0(a)
436         str     w9,[sp,#8]
437         ror     w16,w26,#6
438         add     w21,w21,w19                     // h+=K[i]
439         eor     w9,w26,w26,ror#14
440         and     w17,w27,w26
441         bic     w19,w20,w26
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)
446         ror     w9,w22,#2
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__
458         rev     w2,w2                   // 15
459 #endif
460         ldr     w7,[sp,#0]
461         add     w21,w21,w17                     // h+=Sigma0(a)
462         str     w10,[sp,#12]
463         ror     w16,w25,#6
464         add     w20,w20,w28                     // h+=K[i]
465         ror     w9,w4,#7
466         and     w17,w26,w25
467         ror     w8,w1,#17
468         bic     w28,w27,w25
469         ror     w10,w21,#2
470         add     w20,w20,w2                      // h+=X[i]
471         eor     w16,w16,w25,ror#11
472         eor     w9,w9,w4,ror#18
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)
479         eor     w8,w8,w1,ror#19
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])
485         add     w3,w3,w12
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
489         add     w3,w3,w9
490         add     w20,w20,w17                     // h+=Sigma0(a)
491         add     w3,w3,w8
492 .Loop_16_xx:
493         ldr     w8,[sp,#4]
494         str     w11,[sp,#0]
495         ror     w16,w24,#6
496         add     w27,w27,w19                     // h+=K[i]
497         ror     w10,w5,#7
498         and     w17,w25,w24
499         ror     w9,w2,#17
500         bic     w19,w26,w24
501         ror     w11,w20,#2
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)
511         eor     w9,w9,w2,ror#19
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])
517         add     w4,w4,w13
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
521         add     w4,w4,w10
522         add     w27,w27,w17                     // h+=Sigma0(a)
523         add     w4,w4,w9
524         ldr     w9,[sp,#8]
525         str     w12,[sp,#4]
526         ror     w16,w23,#6
527         add     w26,w26,w28                     // h+=K[i]
528         ror     w11,w6,#7
529         and     w17,w24,w23
530         ror     w10,w3,#17
531         bic     w28,w25,w23
532         ror     w12,w27,#2
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])
548         add     w5,w5,w14
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
552         add     w5,w5,w11
553         add     w26,w26,w17                     // h+=Sigma0(a)
554         add     w5,w5,w10
555         ldr     w10,[sp,#12]
556         str     w13,[sp,#8]
557         ror     w16,w22,#6
558         add     w25,w25,w19                     // h+=K[i]
559         ror     w12,w7,#7
560         and     w17,w23,w22
561         ror     w11,w4,#17
562         bic     w19,w24,w22
563         ror     w13,w26,#2
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])
579         add     w6,w6,w15
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
583         add     w6,w6,w12
584         add     w25,w25,w17                     // h+=Sigma0(a)
585         add     w6,w6,w11
586         ldr     w11,[sp,#0]
587         str     w14,[sp,#12]
588         ror     w16,w21,#6
589         add     w24,w24,w28                     // h+=K[i]
590         ror     w13,w8,#7
591         and     w17,w22,w21
592         ror     w12,w5,#17
593         bic     w28,w23,w21
594         ror     w14,w25,#2
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])
610         add     w7,w7,w0
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
614         add     w7,w7,w13
615         add     w24,w24,w17                     // h+=Sigma0(a)
616         add     w7,w7,w12
617         ldr     w12,[sp,#4]
618         str     w15,[sp,#0]
619         ror     w16,w20,#6
620         add     w23,w23,w19                     // h+=K[i]
621         ror     w14,w9,#7
622         and     w17,w21,w20
623         ror     w13,w6,#17
624         bic     w19,w22,w20
625         ror     w15,w24,#2
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])
641         add     w8,w8,w1
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
645         add     w8,w8,w14
646         add     w23,w23,w17                     // h+=Sigma0(a)
647         add     w8,w8,w13
648         ldr     w13,[sp,#8]
649         str     w0,[sp,#4]
650         ror     w16,w27,#6
651         add     w22,w22,w28                     // h+=K[i]
652         ror     w15,w10,#7
653         and     w17,w20,w27
654         ror     w14,w7,#17
655         bic     w28,w21,w27
656         ror     w0,w23,#2
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)
663         eor     w0,w0,w23,ror#13
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])
672         add     w9,w9,w2
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
676         add     w9,w9,w15
677         add     w22,w22,w17                     // h+=Sigma0(a)
678         add     w9,w9,w14
679         ldr     w14,[sp,#12]
680         str     w1,[sp,#8]
681         ror     w16,w26,#6
682         add     w21,w21,w19                     // h+=K[i]
683         ror     w0,w11,#7
684         and     w17,w27,w26
685         ror     w15,w8,#17
686         bic     w19,w20,w26
687         ror     w1,w22,#2
688         add     w21,w21,w9                      // h+=X[i]
689         eor     w16,w16,w26,ror#11
690         eor     w0,w0,w11,ror#18
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)
694         eor     w1,w1,w22,ror#13
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])
703         add     w10,w10,w3
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
707         add     w10,w10,w0
708         add     w21,w21,w17                     // h+=Sigma0(a)
709         add     w10,w10,w15
710         ldr     w15,[sp,#0]
711         str     w2,[sp,#12]
712         ror     w16,w25,#6
713         add     w20,w20,w28                     // h+=K[i]
714         ror     w1,w12,#7
715         and     w17,w26,w25
716         ror     w0,w9,#17
717         bic     w28,w27,w25
718         ror     w2,w21,#2
719         add     w20,w20,w10                     // h+=X[i]
720         eor     w16,w16,w25,ror#11
721         eor     w1,w1,w12,ror#18
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)
725         eor     w2,w2,w21,ror#13
726         add     w20,w20,w17                     // h+=Ch(e,f,g)
727         and     w19,w19,w28                     // (b^c)&=(a^b)
728         eor     w0,w0,w9,ror#19
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])
734         add     w11,w11,w4
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
738         add     w11,w11,w1
739         add     w20,w20,w17                     // h+=Sigma0(a)
740         add     w11,w11,w0
741         ldr     w0,[sp,#4]
742         str     w3,[sp,#0]
743         ror     w16,w24,#6
744         add     w27,w27,w19                     // h+=K[i]
745         ror     w2,w13,#7
746         and     w17,w25,w24
747         ror     w1,w10,#17
748         bic     w19,w26,w24
749         ror     w3,w20,#2
750         add     w27,w27,w11                     // h+=X[i]
751         eor     w16,w16,w24,ror#11
752         eor     w2,w2,w13,ror#18
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)
756         eor     w3,w3,w20,ror#13
757         add     w27,w27,w17                     // h+=Ch(e,f,g)
758         and     w28,w28,w19                     // (b^c)&=(a^b)
759         eor     w1,w1,w10,ror#19
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])
765         add     w12,w12,w5
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
769         add     w12,w12,w2
770         add     w27,w27,w17                     // h+=Sigma0(a)
771         add     w12,w12,w1
772         ldr     w1,[sp,#8]
773         str     w4,[sp,#4]
774         ror     w16,w23,#6
775         add     w26,w26,w28                     // h+=K[i]
776         ror     w3,w14,#7
777         and     w17,w24,w23
778         ror     w2,w11,#17
779         bic     w28,w25,w23
780         ror     w4,w27,#2
781         add     w26,w26,w12                     // h+=X[i]
782         eor     w16,w16,w23,ror#11
783         eor     w3,w3,w14,ror#18
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)
787         eor     w4,w4,w27,ror#13
788         add     w26,w26,w17                     // h+=Ch(e,f,g)
789         and     w19,w19,w28                     // (b^c)&=(a^b)
790         eor     w2,w2,w11,ror#19
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])
796         add     w13,w13,w6
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
800         add     w13,w13,w3
801         add     w26,w26,w17                     // h+=Sigma0(a)
802         add     w13,w13,w2
803         ldr     w2,[sp,#12]
804         str     w5,[sp,#8]
805         ror     w16,w22,#6
806         add     w25,w25,w19                     // h+=K[i]
807         ror     w4,w15,#7
808         and     w17,w23,w22
809         ror     w3,w12,#17
810         bic     w19,w24,w22
811         ror     w5,w26,#2
812         add     w25,w25,w13                     // h+=X[i]
813         eor     w16,w16,w22,ror#11
814         eor     w4,w4,w15,ror#18
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)
818         eor     w5,w5,w26,ror#13
819         add     w25,w25,w17                     // h+=Ch(e,f,g)
820         and     w28,w28,w19                     // (b^c)&=(a^b)
821         eor     w3,w3,w12,ror#19
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])
827         add     w14,w14,w7
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
831         add     w14,w14,w4
832         add     w25,w25,w17                     // h+=Sigma0(a)
833         add     w14,w14,w3
834         ldr     w3,[sp,#0]
835         str     w6,[sp,#12]
836         ror     w16,w21,#6
837         add     w24,w24,w28                     // h+=K[i]
838         ror     w5,w0,#7
839         and     w17,w22,w21
840         ror     w4,w13,#17
841         bic     w28,w23,w21
842         ror     w6,w25,#2
843         add     w24,w24,w14                     // h+=X[i]
844         eor     w16,w16,w21,ror#11
845         eor     w5,w5,w0,ror#18
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)
849         eor     w6,w6,w25,ror#13
850         add     w24,w24,w17                     // h+=Ch(e,f,g)
851         and     w19,w19,w28                     // (b^c)&=(a^b)
852         eor     w4,w4,w13,ror#19
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])
858         add     w15,w15,w8
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
862         add     w15,w15,w5
863         add     w24,w24,w17                     // h+=Sigma0(a)
864         add     w15,w15,w4
865         ldr     w4,[sp,#4]
866         str     w7,[sp,#0]
867         ror     w16,w20,#6
868         add     w23,w23,w19                     // h+=K[i]
869         ror     w6,w1,#7
870         and     w17,w21,w20
871         ror     w5,w14,#17
872         bic     w19,w22,w20
873         ror     w7,w24,#2
874         add     w23,w23,w15                     // h+=X[i]
875         eor     w16,w16,w20,ror#11
876         eor     w6,w6,w1,ror#18
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)
880         eor     w7,w7,w24,ror#13
881         add     w23,w23,w17                     // h+=Ch(e,f,g)
882         and     w28,w28,w19                     // (b^c)&=(a^b)
883         eor     w5,w5,w14,ror#19
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])
889         add     w0,w0,w9
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
893         add     w0,w0,w6
894         add     w23,w23,w17                     // h+=Sigma0(a)
895         add     w0,w0,w5
896         ldr     w5,[sp,#8]
897         str     w8,[sp,#4]
898         ror     w16,w27,#6
899         add     w22,w22,w28                     // h+=K[i]
900         ror     w7,w2,#7
901         and     w17,w20,w27
902         ror     w6,w15,#17
903         bic     w28,w21,w27
904         ror     w8,w23,#2
905         add     w22,w22,w0                      // h+=X[i]
906         eor     w16,w16,w27,ror#11
907         eor     w7,w7,w2,ror#18
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)
911         eor     w8,w8,w23,ror#13
912         add     w22,w22,w17                     // h+=Ch(e,f,g)
913         and     w19,w19,w28                     // (b^c)&=(a^b)
914         eor     w6,w6,w15,ror#19
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])
920         add     w1,w1,w10
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
924         add     w1,w1,w7
925         add     w22,w22,w17                     // h+=Sigma0(a)
926         add     w1,w1,w6
927         ldr     w6,[sp,#12]
928         str     w9,[sp,#8]
929         ror     w16,w26,#6
930         add     w21,w21,w19                     // h+=K[i]
931         ror     w8,w3,#7
932         and     w17,w27,w26
933         ror     w7,w0,#17
934         bic     w19,w20,w26
935         ror     w9,w22,#2
936         add     w21,w21,w1                      // h+=X[i]
937         eor     w16,w16,w26,ror#11
938         eor     w8,w8,w3,ror#18
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)
942         eor     w9,w9,w22,ror#13
943         add     w21,w21,w17                     // h+=Ch(e,f,g)
944         and     w28,w28,w19                     // (b^c)&=(a^b)
945         eor     w7,w7,w0,ror#19
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])
951         add     w2,w2,w11
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
955         add     w2,w2,w8
956         add     w21,w21,w17                     // h+=Sigma0(a)
957         add     w2,w2,w7
958         ldr     w7,[sp,#0]
959         str     w10,[sp,#12]
960         ror     w16,w25,#6
961         add     w20,w20,w28                     // h+=K[i]
962         ror     w9,w4,#7
963         and     w17,w26,w25
964         ror     w8,w1,#17
965         bic     w28,w27,w25
966         ror     w10,w21,#2
967         add     w20,w20,w2                      // h+=X[i]
968         eor     w16,w16,w25,ror#11
969         eor     w9,w9,w4,ror#18
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)
976         eor     w8,w8,w1,ror#19
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])
982         add     w3,w3,w12
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
986         add     w3,w3,w9
987         add     w20,w20,w17                     // h+=Sigma0(a)
988         add     w3,w3,w8
989         cbnz    w19,.Loop_16_xx
991         ldp     x0,x2,[x29,#96]
992         ldr     x1,[x29,#112]
993         sub     x30,x30,#260            // rewind
995         ldp     w3,w4,[x0]
996         ldp     w5,w6,[x0,#2*4]
997         add     x1,x1,#14*4                     // advance input pointer
998         ldp     w7,w8,[x0,#4*4]
999         add     w20,w20,w3
1000         ldp     w9,w10,[x0,#6*4]
1001         add     w21,w21,w4
1002         add     w22,w22,w5
1003         add     w23,w23,w6
1004         stp     w20,w21,[x0]
1005         add     w24,w24,w7
1006         add     w25,w25,w8
1007         stp     w22,w23,[x0,#2*4]
1008         add     w26,w26,w9
1009         add     w27,w27,w10
1010         cmp     x1,x2
1011         stp     w24,w25,[x0,#4*4]
1012         stp     w26,w27,[x0,#6*4]
1013         b.ne    .Loop
1015         ldp     x19,x20,[x29,#16]
1016         add     sp,sp,#4*4
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
1022         ret
1023 .size   zfs_sha256_block_armv7,.-zfs_sha256_block_armv7
1025 .globl  zfs_sha256_block_armv8
1026 .type   zfs_sha256_block_armv8,%function
1027 .align  6
1028 zfs_sha256_block_armv8:
1029         hint            #34                             // bti c
1030 .Lv8_entry:
1031         stp             x29,x30,[sp,#-16]!
1032         add             x29,sp,#0
1034         ld1             {v0.4s,v1.4s},[x0]
1035         adr             x3,.LK256
1037 .Loop_hw:
1038         ld1             {v4.16b-v7.16b},[x1],#64
1039         sub             x2,x2,#1
1040         ld1             {v16.4s},[x3],#16
1041         rev32           v4.16b,v4.16b
1042         rev32           v5.16b,v5.16b
1043         rev32           v6.16b,v6.16b
1044         rev32           v7.16b,v7.16b
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
1143         ld1             {v17.4s},[x3]
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
1158         cbnz            x2,.Loop_hw
1160         st1             {v0.4s,v1.4s},[x0]
1162         ldr             x29,[sp],#16
1163         ret
1164 .size   zfs_sha256_block_armv8,.-zfs_sha256_block_armv8
1166 .globl  zfs_sha256_block_neon
1167 .type   zfs_sha256_block_neon,%function
1168 .align  4
1169 zfs_sha256_block_neon:
1170         hint    #34                                     // bti c
1171 .Lneon_entry:
1172         stp     x29, x30, [sp, #-16]!
1173         mov     x29, sp
1174         sub     sp,sp,#16*4
1176         adr     x16,.LK256
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
1189         rev32   v2.16b,v2.16b
1190         rev32   v3.16b,v3.16b
1191         mov     x17,sp
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]
1198         sub     x17,x17,#32
1200         ldp     w3,w4,[x0]
1201         ldp     w5,w6,[x0,#8]
1202         ldp     w7,w8,[x0,#16]
1203         ldp     w9,w10,[x0,#24]
1204         ldr     w12,[sp,#0]
1205         mov     w13,wzr
1206         eor     w14,w4,w5
1207         mov     w15,wzr
1208         b       .L_00_48
1210 .align  4
1211 .L_00_48:
1212         ext     v4.16b,v0.16b,v1.16b,#4
1213         add     w10,w10,w12
1214         add     w3,w3,w15
1215         and     w12,w8,w7
1216         bic     w15,w9,w7
1217         ext     v7.16b,v2.16b,v3.16b,#4
1218         eor     w11,w7,w7,ror#5
1219         add     w3,w3,w13
1220         mov     d19,v3.d[1]
1221         orr     w12,w12,w15
1222         eor     w11,w11,w7,ror#19
1223         ushr    v6.4s,v4.4s,#7
1224         eor     w15,w3,w3,ror#11
1225         ushr    v5.4s,v4.4s,#3
1226         add     w10,w10,w12
1227         add     v0.4s,v0.4s,v7.4s
1228         ror     w11,w11,#6
1229         sli     v6.4s,v4.4s,#25
1230         eor     w13,w3,w4
1231         eor     w15,w15,w3,ror#20
1232         ushr    v7.4s,v4.4s,#18
1233         add     w10,w10,w11
1234         ldr     w12,[sp,#4]
1235         and     w14,w14,w13
1236         eor     v5.16b,v5.16b,v6.16b
1237         ror     w15,w15,#2
1238         add     w6,w6,w10
1239         sli     v7.4s,v4.4s,#14
1240         eor     w14,w14,w4
1241         ushr    v16.4s,v19.4s,#17
1242         add     w9,w9,w12
1243         add     w10,w10,w15
1244         and     w12,w7,w6
1245         eor     v5.16b,v5.16b,v7.16b
1246         bic     w15,w8,w6
1247         eor     w11,w6,w6,ror#5
1248         sli     v16.4s,v19.4s,#15
1249         add     w10,w10,w14
1250         orr     w12,w12,w15
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
1255         add     w9,w9,w12
1256         ror     w11,w11,#6
1257         add     v0.4s,v0.4s,v5.4s
1258         eor     w14,w10,w3
1259         eor     w15,w15,w10,ror#20
1260         sli     v7.4s,v19.4s,#13
1261         add     w9,w9,w11
1262         ldr     w12,[sp,#8]
1263         and     w13,w13,w14
1264         eor     v17.16b,v17.16b,v16.16b
1265         ror     w15,w15,#2
1266         add     w5,w5,w9
1267         eor     w13,w13,w3
1268         eor     v17.16b,v17.16b,v7.16b
1269         add     w8,w8,w12
1270         add     w9,w9,w15
1271         and     w12,w6,w5
1272         add     v0.4s,v0.4s,v17.4s
1273         bic     w15,w7,w5
1274         eor     w11,w5,w5,ror#5
1275         add     w9,w9,w13
1276         ushr    v18.4s,v0.4s,#17
1277         orr     w12,w12,w15
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
1282         add     w8,w8,w12
1283         ushr    v17.4s,v0.4s,#19
1284         ror     w11,w11,#6
1285         eor     w13,w9,w10
1286         eor     v19.16b,v19.16b,v18.16b
1287         eor     w15,w15,w9,ror#20
1288         add     w8,w8,w11
1289         sli     v17.4s,v0.4s,#13
1290         ldr     w12,[sp,#12]
1291         and     w14,w14,w13
1292         ror     w15,w15,#2
1293         ld1     {v4.4s},[x16], #16
1294         add     w4,w4,w8
1295         eor     v19.16b,v19.16b,v17.16b
1296         eor     w14,w14,w10
1297         eor     v17.16b,v17.16b,v17.16b
1298         add     w7,w7,w12
1299         add     w8,w8,w15
1300         and     w12,w5,w4
1301         mov     v17.d[1],v19.d[0]
1302         bic     w15,w6,w4
1303         eor     w11,w4,w4,ror#5
1304         add     w8,w8,w14
1305         add     v0.4s,v0.4s,v17.4s
1306         orr     w12,w12,w15
1307         eor     w11,w11,w4,ror#19
1308         eor     w15,w8,w8,ror#11
1309         add     v4.4s,v4.4s,v0.4s
1310         add     w7,w7,w12
1311         ror     w11,w11,#6
1312         eor     w14,w8,w9
1313         eor     w15,w15,w8,ror#20
1314         add     w7,w7,w11
1315         ldr     w12,[sp,#16]
1316         and     w13,w13,w14
1317         ror     w15,w15,#2
1318         add     w3,w3,w7
1319         eor     w13,w13,w9
1320         st1     {v4.4s},[x17], #16
1321         ext     v4.16b,v1.16b,v2.16b,#4
1322         add     w6,w6,w12
1323         add     w7,w7,w15
1324         and     w12,w4,w3
1325         bic     w15,w5,w3
1326         ext     v7.16b,v3.16b,v0.16b,#4
1327         eor     w11,w3,w3,ror#5
1328         add     w7,w7,w13
1329         mov     d19,v0.d[1]
1330         orr     w12,w12,w15
1331         eor     w11,w11,w3,ror#19
1332         ushr    v6.4s,v4.4s,#7
1333         eor     w15,w7,w7,ror#11
1334         ushr    v5.4s,v4.4s,#3
1335         add     w6,w6,w12
1336         add     v1.4s,v1.4s,v7.4s
1337         ror     w11,w11,#6
1338         sli     v6.4s,v4.4s,#25
1339         eor     w13,w7,w8
1340         eor     w15,w15,w7,ror#20
1341         ushr    v7.4s,v4.4s,#18
1342         add     w6,w6,w11
1343         ldr     w12,[sp,#20]
1344         and     w14,w14,w13
1345         eor     v5.16b,v5.16b,v6.16b
1346         ror     w15,w15,#2
1347         add     w10,w10,w6
1348         sli     v7.4s,v4.4s,#14
1349         eor     w14,w14,w8
1350         ushr    v16.4s,v19.4s,#17
1351         add     w5,w5,w12
1352         add     w6,w6,w15
1353         and     w12,w3,w10
1354         eor     v5.16b,v5.16b,v7.16b
1355         bic     w15,w4,w10
1356         eor     w11,w10,w10,ror#5
1357         sli     v16.4s,v19.4s,#15
1358         add     w6,w6,w14
1359         orr     w12,w12,w15
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
1364         add     w5,w5,w12
1365         ror     w11,w11,#6
1366         add     v1.4s,v1.4s,v5.4s
1367         eor     w14,w6,w7
1368         eor     w15,w15,w6,ror#20
1369         sli     v7.4s,v19.4s,#13
1370         add     w5,w5,w11
1371         ldr     w12,[sp,#24]
1372         and     w13,w13,w14
1373         eor     v17.16b,v17.16b,v16.16b
1374         ror     w15,w15,#2
1375         add     w9,w9,w5
1376         eor     w13,w13,w7
1377         eor     v17.16b,v17.16b,v7.16b
1378         add     w4,w4,w12
1379         add     w5,w5,w15
1380         and     w12,w10,w9
1381         add     v1.4s,v1.4s,v17.4s
1382         bic     w15,w3,w9
1383         eor     w11,w9,w9,ror#5
1384         add     w5,w5,w13
1385         ushr    v18.4s,v1.4s,#17
1386         orr     w12,w12,w15
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
1391         add     w4,w4,w12
1392         ushr    v17.4s,v1.4s,#19
1393         ror     w11,w11,#6
1394         eor     w13,w5,w6
1395         eor     v19.16b,v19.16b,v18.16b
1396         eor     w15,w15,w5,ror#20
1397         add     w4,w4,w11
1398         sli     v17.4s,v1.4s,#13
1399         ldr     w12,[sp,#28]
1400         and     w14,w14,w13
1401         ror     w15,w15,#2
1402         ld1     {v4.4s},[x16], #16
1403         add     w8,w8,w4
1404         eor     v19.16b,v19.16b,v17.16b
1405         eor     w14,w14,w6
1406         eor     v17.16b,v17.16b,v17.16b
1407         add     w3,w3,w12
1408         add     w4,w4,w15
1409         and     w12,w9,w8
1410         mov     v17.d[1],v19.d[0]
1411         bic     w15,w10,w8
1412         eor     w11,w8,w8,ror#5
1413         add     w4,w4,w14
1414         add     v1.4s,v1.4s,v17.4s
1415         orr     w12,w12,w15
1416         eor     w11,w11,w8,ror#19
1417         eor     w15,w4,w4,ror#11
1418         add     v4.4s,v4.4s,v1.4s
1419         add     w3,w3,w12
1420         ror     w11,w11,#6
1421         eor     w14,w4,w5
1422         eor     w15,w15,w4,ror#20
1423         add     w3,w3,w11
1424         ldr     w12,[sp,#32]
1425         and     w13,w13,w14
1426         ror     w15,w15,#2
1427         add     w7,w7,w3
1428         eor     w13,w13,w5
1429         st1     {v4.4s},[x17], #16
1430         ext     v4.16b,v2.16b,v3.16b,#4
1431         add     w10,w10,w12
1432         add     w3,w3,w15
1433         and     w12,w8,w7
1434         bic     w15,w9,w7
1435         ext     v7.16b,v0.16b,v1.16b,#4
1436         eor     w11,w7,w7,ror#5
1437         add     w3,w3,w13
1438         mov     d19,v1.d[1]
1439         orr     w12,w12,w15
1440         eor     w11,w11,w7,ror#19
1441         ushr    v6.4s,v4.4s,#7
1442         eor     w15,w3,w3,ror#11
1443         ushr    v5.4s,v4.4s,#3
1444         add     w10,w10,w12
1445         add     v2.4s,v2.4s,v7.4s
1446         ror     w11,w11,#6
1447         sli     v6.4s,v4.4s,#25
1448         eor     w13,w3,w4
1449         eor     w15,w15,w3,ror#20
1450         ushr    v7.4s,v4.4s,#18
1451         add     w10,w10,w11
1452         ldr     w12,[sp,#36]
1453         and     w14,w14,w13
1454         eor     v5.16b,v5.16b,v6.16b
1455         ror     w15,w15,#2
1456         add     w6,w6,w10
1457         sli     v7.4s,v4.4s,#14
1458         eor     w14,w14,w4
1459         ushr    v16.4s,v19.4s,#17
1460         add     w9,w9,w12
1461         add     w10,w10,w15
1462         and     w12,w7,w6
1463         eor     v5.16b,v5.16b,v7.16b
1464         bic     w15,w8,w6
1465         eor     w11,w6,w6,ror#5
1466         sli     v16.4s,v19.4s,#15
1467         add     w10,w10,w14
1468         orr     w12,w12,w15
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
1473         add     w9,w9,w12
1474         ror     w11,w11,#6
1475         add     v2.4s,v2.4s,v5.4s
1476         eor     w14,w10,w3
1477         eor     w15,w15,w10,ror#20
1478         sli     v7.4s,v19.4s,#13
1479         add     w9,w9,w11
1480         ldr     w12,[sp,#40]
1481         and     w13,w13,w14
1482         eor     v17.16b,v17.16b,v16.16b
1483         ror     w15,w15,#2
1484         add     w5,w5,w9
1485         eor     w13,w13,w3
1486         eor     v17.16b,v17.16b,v7.16b
1487         add     w8,w8,w12
1488         add     w9,w9,w15
1489         and     w12,w6,w5
1490         add     v2.4s,v2.4s,v17.4s
1491         bic     w15,w7,w5
1492         eor     w11,w5,w5,ror#5
1493         add     w9,w9,w13
1494         ushr    v18.4s,v2.4s,#17
1495         orr     w12,w12,w15
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
1500         add     w8,w8,w12
1501         ushr    v17.4s,v2.4s,#19
1502         ror     w11,w11,#6
1503         eor     w13,w9,w10
1504         eor     v19.16b,v19.16b,v18.16b
1505         eor     w15,w15,w9,ror#20
1506         add     w8,w8,w11
1507         sli     v17.4s,v2.4s,#13
1508         ldr     w12,[sp,#44]
1509         and     w14,w14,w13
1510         ror     w15,w15,#2
1511         ld1     {v4.4s},[x16], #16
1512         add     w4,w4,w8
1513         eor     v19.16b,v19.16b,v17.16b
1514         eor     w14,w14,w10
1515         eor     v17.16b,v17.16b,v17.16b
1516         add     w7,w7,w12
1517         add     w8,w8,w15
1518         and     w12,w5,w4
1519         mov     v17.d[1],v19.d[0]
1520         bic     w15,w6,w4
1521         eor     w11,w4,w4,ror#5
1522         add     w8,w8,w14
1523         add     v2.4s,v2.4s,v17.4s
1524         orr     w12,w12,w15
1525         eor     w11,w11,w4,ror#19
1526         eor     w15,w8,w8,ror#11
1527         add     v4.4s,v4.4s,v2.4s
1528         add     w7,w7,w12
1529         ror     w11,w11,#6
1530         eor     w14,w8,w9
1531         eor     w15,w15,w8,ror#20
1532         add     w7,w7,w11
1533         ldr     w12,[sp,#48]
1534         and     w13,w13,w14
1535         ror     w15,w15,#2
1536         add     w3,w3,w7
1537         eor     w13,w13,w9
1538         st1     {v4.4s},[x17], #16
1539         ext     v4.16b,v3.16b,v0.16b,#4
1540         add     w6,w6,w12
1541         add     w7,w7,w15
1542         and     w12,w4,w3
1543         bic     w15,w5,w3
1544         ext     v7.16b,v1.16b,v2.16b,#4
1545         eor     w11,w3,w3,ror#5
1546         add     w7,w7,w13
1547         mov     d19,v2.d[1]
1548         orr     w12,w12,w15
1549         eor     w11,w11,w3,ror#19
1550         ushr    v6.4s,v4.4s,#7
1551         eor     w15,w7,w7,ror#11
1552         ushr    v5.4s,v4.4s,#3
1553         add     w6,w6,w12
1554         add     v3.4s,v3.4s,v7.4s
1555         ror     w11,w11,#6
1556         sli     v6.4s,v4.4s,#25
1557         eor     w13,w7,w8
1558         eor     w15,w15,w7,ror#20
1559         ushr    v7.4s,v4.4s,#18
1560         add     w6,w6,w11
1561         ldr     w12,[sp,#52]
1562         and     w14,w14,w13
1563         eor     v5.16b,v5.16b,v6.16b
1564         ror     w15,w15,#2
1565         add     w10,w10,w6
1566         sli     v7.4s,v4.4s,#14
1567         eor     w14,w14,w8
1568         ushr    v16.4s,v19.4s,#17
1569         add     w5,w5,w12
1570         add     w6,w6,w15
1571         and     w12,w3,w10
1572         eor     v5.16b,v5.16b,v7.16b
1573         bic     w15,w4,w10
1574         eor     w11,w10,w10,ror#5
1575         sli     v16.4s,v19.4s,#15
1576         add     w6,w6,w14
1577         orr     w12,w12,w15
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
1582         add     w5,w5,w12
1583         ror     w11,w11,#6
1584         add     v3.4s,v3.4s,v5.4s
1585         eor     w14,w6,w7
1586         eor     w15,w15,w6,ror#20
1587         sli     v7.4s,v19.4s,#13
1588         add     w5,w5,w11
1589         ldr     w12,[sp,#56]
1590         and     w13,w13,w14
1591         eor     v17.16b,v17.16b,v16.16b
1592         ror     w15,w15,#2
1593         add     w9,w9,w5
1594         eor     w13,w13,w7
1595         eor     v17.16b,v17.16b,v7.16b
1596         add     w4,w4,w12
1597         add     w5,w5,w15
1598         and     w12,w10,w9
1599         add     v3.4s,v3.4s,v17.4s
1600         bic     w15,w3,w9
1601         eor     w11,w9,w9,ror#5
1602         add     w5,w5,w13
1603         ushr    v18.4s,v3.4s,#17
1604         orr     w12,w12,w15
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
1609         add     w4,w4,w12
1610         ushr    v17.4s,v3.4s,#19
1611         ror     w11,w11,#6
1612         eor     w13,w5,w6
1613         eor     v19.16b,v19.16b,v18.16b
1614         eor     w15,w15,w5,ror#20
1615         add     w4,w4,w11
1616         sli     v17.4s,v3.4s,#13
1617         ldr     w12,[sp,#60]
1618         and     w14,w14,w13
1619         ror     w15,w15,#2
1620         ld1     {v4.4s},[x16], #16
1621         add     w8,w8,w4
1622         eor     v19.16b,v19.16b,v17.16b
1623         eor     w14,w14,w6
1624         eor     v17.16b,v17.16b,v17.16b
1625         add     w3,w3,w12
1626         add     w4,w4,w15
1627         and     w12,w9,w8
1628         mov     v17.d[1],v19.d[0]
1629         bic     w15,w10,w8
1630         eor     w11,w8,w8,ror#5
1631         add     w4,w4,w14
1632         add     v3.4s,v3.4s,v17.4s
1633         orr     w12,w12,w15
1634         eor     w11,w11,w8,ror#19
1635         eor     w15,w4,w4,ror#11
1636         add     v4.4s,v4.4s,v3.4s
1637         add     w3,w3,w12
1638         ror     w11,w11,#6
1639         eor     w14,w4,w5
1640         eor     w15,w15,w4,ror#20
1641         add     w3,w3,w11
1642         ldr     w12,[x16]
1643         and     w13,w13,w14
1644         ror     w15,w15,#2
1645         add     w7,w7,w3
1646         eor     w13,w13,w5
1647         st1     {v4.4s},[x17], #16
1648         cmp     w12,#0                          // check for K256 terminator
1649         ldr     w12,[sp,#0]
1650         sub     x17,x17,#64
1651         bne     .L_00_48
1653         sub     x16,x16,#256            // rewind x16
1654         cmp     x1,x2
1655         mov     x17, #64
1656         csel    x17, x17, xzr, eq
1657         sub     x1,x1,x17                       // avoid SEGV
1658         mov     x17,sp
1659         add     w10,w10,w12
1660         add     w3,w3,w15
1661         and     w12,w8,w7
1662         ld1     {v0.16b},[x1],#16
1663         bic     w15,w9,w7
1664         eor     w11,w7,w7,ror#5
1665         ld1     {v4.4s},[x16],#16
1666         add     w3,w3,w13
1667         orr     w12,w12,w15
1668         eor     w11,w11,w7,ror#19
1669         eor     w15,w3,w3,ror#11
1670         rev32   v0.16b,v0.16b
1671         add     w10,w10,w12
1672         ror     w11,w11,#6
1673         eor     w13,w3,w4
1674         eor     w15,w15,w3,ror#20
1675         add     v4.4s,v4.4s,v0.4s
1676         add     w10,w10,w11
1677         ldr     w12,[sp,#4]
1678         and     w14,w14,w13
1679         ror     w15,w15,#2
1680         add     w6,w6,w10
1681         eor     w14,w14,w4
1682         add     w9,w9,w12
1683         add     w10,w10,w15
1684         and     w12,w7,w6
1685         bic     w15,w8,w6
1686         eor     w11,w6,w6,ror#5
1687         add     w10,w10,w14
1688         orr     w12,w12,w15
1689         eor     w11,w11,w6,ror#19
1690         eor     w15,w10,w10,ror#11
1691         add     w9,w9,w12
1692         ror     w11,w11,#6
1693         eor     w14,w10,w3
1694         eor     w15,w15,w10,ror#20
1695         add     w9,w9,w11
1696         ldr     w12,[sp,#8]
1697         and     w13,w13,w14
1698         ror     w15,w15,#2
1699         add     w5,w5,w9
1700         eor     w13,w13,w3
1701         add     w8,w8,w12
1702         add     w9,w9,w15
1703         and     w12,w6,w5
1704         bic     w15,w7,w5
1705         eor     w11,w5,w5,ror#5
1706         add     w9,w9,w13
1707         orr     w12,w12,w15
1708         eor     w11,w11,w5,ror#19
1709         eor     w15,w9,w9,ror#11
1710         add     w8,w8,w12
1711         ror     w11,w11,#6
1712         eor     w13,w9,w10
1713         eor     w15,w15,w9,ror#20
1714         add     w8,w8,w11
1715         ldr     w12,[sp,#12]
1716         and     w14,w14,w13
1717         ror     w15,w15,#2
1718         add     w4,w4,w8
1719         eor     w14,w14,w10
1720         add     w7,w7,w12
1721         add     w8,w8,w15
1722         and     w12,w5,w4
1723         bic     w15,w6,w4
1724         eor     w11,w4,w4,ror#5
1725         add     w8,w8,w14
1726         orr     w12,w12,w15
1727         eor     w11,w11,w4,ror#19
1728         eor     w15,w8,w8,ror#11
1729         add     w7,w7,w12
1730         ror     w11,w11,#6
1731         eor     w14,w8,w9
1732         eor     w15,w15,w8,ror#20
1733         add     w7,w7,w11
1734         ldr     w12,[sp,#16]
1735         and     w13,w13,w14
1736         ror     w15,w15,#2
1737         add     w3,w3,w7
1738         eor     w13,w13,w9
1739         st1     {v4.4s},[x17], #16
1740         add     w6,w6,w12
1741         add     w7,w7,w15
1742         and     w12,w4,w3
1743         ld1     {v1.16b},[x1],#16
1744         bic     w15,w5,w3
1745         eor     w11,w3,w3,ror#5
1746         ld1     {v4.4s},[x16],#16
1747         add     w7,w7,w13
1748         orr     w12,w12,w15
1749         eor     w11,w11,w3,ror#19
1750         eor     w15,w7,w7,ror#11
1751         rev32   v1.16b,v1.16b
1752         add     w6,w6,w12
1753         ror     w11,w11,#6
1754         eor     w13,w7,w8
1755         eor     w15,w15,w7,ror#20
1756         add     v4.4s,v4.4s,v1.4s
1757         add     w6,w6,w11
1758         ldr     w12,[sp,#20]
1759         and     w14,w14,w13
1760         ror     w15,w15,#2
1761         add     w10,w10,w6
1762         eor     w14,w14,w8
1763         add     w5,w5,w12
1764         add     w6,w6,w15
1765         and     w12,w3,w10
1766         bic     w15,w4,w10
1767         eor     w11,w10,w10,ror#5
1768         add     w6,w6,w14
1769         orr     w12,w12,w15
1770         eor     w11,w11,w10,ror#19
1771         eor     w15,w6,w6,ror#11
1772         add     w5,w5,w12
1773         ror     w11,w11,#6
1774         eor     w14,w6,w7
1775         eor     w15,w15,w6,ror#20
1776         add     w5,w5,w11
1777         ldr     w12,[sp,#24]
1778         and     w13,w13,w14
1779         ror     w15,w15,#2
1780         add     w9,w9,w5
1781         eor     w13,w13,w7
1782         add     w4,w4,w12
1783         add     w5,w5,w15
1784         and     w12,w10,w9
1785         bic     w15,w3,w9
1786         eor     w11,w9,w9,ror#5
1787         add     w5,w5,w13
1788         orr     w12,w12,w15
1789         eor     w11,w11,w9,ror#19
1790         eor     w15,w5,w5,ror#11
1791         add     w4,w4,w12
1792         ror     w11,w11,#6
1793         eor     w13,w5,w6
1794         eor     w15,w15,w5,ror#20
1795         add     w4,w4,w11
1796         ldr     w12,[sp,#28]
1797         and     w14,w14,w13
1798         ror     w15,w15,#2
1799         add     w8,w8,w4
1800         eor     w14,w14,w6
1801         add     w3,w3,w12
1802         add     w4,w4,w15
1803         and     w12,w9,w8
1804         bic     w15,w10,w8
1805         eor     w11,w8,w8,ror#5
1806         add     w4,w4,w14
1807         orr     w12,w12,w15
1808         eor     w11,w11,w8,ror#19
1809         eor     w15,w4,w4,ror#11
1810         add     w3,w3,w12
1811         ror     w11,w11,#6
1812         eor     w14,w4,w5
1813         eor     w15,w15,w4,ror#20
1814         add     w3,w3,w11
1815         ldr     w12,[sp,#32]
1816         and     w13,w13,w14
1817         ror     w15,w15,#2
1818         add     w7,w7,w3
1819         eor     w13,w13,w5
1820         st1     {v4.4s},[x17], #16
1821         add     w10,w10,w12
1822         add     w3,w3,w15
1823         and     w12,w8,w7
1824         ld1     {v2.16b},[x1],#16
1825         bic     w15,w9,w7
1826         eor     w11,w7,w7,ror#5
1827         ld1     {v4.4s},[x16],#16
1828         add     w3,w3,w13
1829         orr     w12,w12,w15
1830         eor     w11,w11,w7,ror#19
1831         eor     w15,w3,w3,ror#11
1832         rev32   v2.16b,v2.16b
1833         add     w10,w10,w12
1834         ror     w11,w11,#6
1835         eor     w13,w3,w4
1836         eor     w15,w15,w3,ror#20
1837         add     v4.4s,v4.4s,v2.4s
1838         add     w10,w10,w11
1839         ldr     w12,[sp,#36]
1840         and     w14,w14,w13
1841         ror     w15,w15,#2
1842         add     w6,w6,w10
1843         eor     w14,w14,w4
1844         add     w9,w9,w12
1845         add     w10,w10,w15
1846         and     w12,w7,w6
1847         bic     w15,w8,w6
1848         eor     w11,w6,w6,ror#5
1849         add     w10,w10,w14
1850         orr     w12,w12,w15
1851         eor     w11,w11,w6,ror#19
1852         eor     w15,w10,w10,ror#11
1853         add     w9,w9,w12
1854         ror     w11,w11,#6
1855         eor     w14,w10,w3
1856         eor     w15,w15,w10,ror#20
1857         add     w9,w9,w11
1858         ldr     w12,[sp,#40]
1859         and     w13,w13,w14
1860         ror     w15,w15,#2
1861         add     w5,w5,w9
1862         eor     w13,w13,w3
1863         add     w8,w8,w12
1864         add     w9,w9,w15
1865         and     w12,w6,w5
1866         bic     w15,w7,w5
1867         eor     w11,w5,w5,ror#5
1868         add     w9,w9,w13
1869         orr     w12,w12,w15
1870         eor     w11,w11,w5,ror#19
1871         eor     w15,w9,w9,ror#11
1872         add     w8,w8,w12
1873         ror     w11,w11,#6
1874         eor     w13,w9,w10
1875         eor     w15,w15,w9,ror#20
1876         add     w8,w8,w11
1877         ldr     w12,[sp,#44]
1878         and     w14,w14,w13
1879         ror     w15,w15,#2
1880         add     w4,w4,w8
1881         eor     w14,w14,w10
1882         add     w7,w7,w12
1883         add     w8,w8,w15
1884         and     w12,w5,w4
1885         bic     w15,w6,w4
1886         eor     w11,w4,w4,ror#5
1887         add     w8,w8,w14
1888         orr     w12,w12,w15
1889         eor     w11,w11,w4,ror#19
1890         eor     w15,w8,w8,ror#11
1891         add     w7,w7,w12
1892         ror     w11,w11,#6
1893         eor     w14,w8,w9
1894         eor     w15,w15,w8,ror#20
1895         add     w7,w7,w11
1896         ldr     w12,[sp,#48]
1897         and     w13,w13,w14
1898         ror     w15,w15,#2
1899         add     w3,w3,w7
1900         eor     w13,w13,w9
1901         st1     {v4.4s},[x17], #16
1902         add     w6,w6,w12
1903         add     w7,w7,w15
1904         and     w12,w4,w3
1905         ld1     {v3.16b},[x1],#16
1906         bic     w15,w5,w3
1907         eor     w11,w3,w3,ror#5
1908         ld1     {v4.4s},[x16],#16
1909         add     w7,w7,w13
1910         orr     w12,w12,w15
1911         eor     w11,w11,w3,ror#19
1912         eor     w15,w7,w7,ror#11
1913         rev32   v3.16b,v3.16b
1914         add     w6,w6,w12
1915         ror     w11,w11,#6
1916         eor     w13,w7,w8
1917         eor     w15,w15,w7,ror#20
1918         add     v4.4s,v4.4s,v3.4s
1919         add     w6,w6,w11
1920         ldr     w12,[sp,#52]
1921         and     w14,w14,w13
1922         ror     w15,w15,#2
1923         add     w10,w10,w6
1924         eor     w14,w14,w8
1925         add     w5,w5,w12
1926         add     w6,w6,w15
1927         and     w12,w3,w10
1928         bic     w15,w4,w10
1929         eor     w11,w10,w10,ror#5
1930         add     w6,w6,w14
1931         orr     w12,w12,w15
1932         eor     w11,w11,w10,ror#19
1933         eor     w15,w6,w6,ror#11
1934         add     w5,w5,w12
1935         ror     w11,w11,#6
1936         eor     w14,w6,w7
1937         eor     w15,w15,w6,ror#20
1938         add     w5,w5,w11
1939         ldr     w12,[sp,#56]
1940         and     w13,w13,w14
1941         ror     w15,w15,#2
1942         add     w9,w9,w5
1943         eor     w13,w13,w7
1944         add     w4,w4,w12
1945         add     w5,w5,w15
1946         and     w12,w10,w9
1947         bic     w15,w3,w9
1948         eor     w11,w9,w9,ror#5
1949         add     w5,w5,w13
1950         orr     w12,w12,w15
1951         eor     w11,w11,w9,ror#19
1952         eor     w15,w5,w5,ror#11
1953         add     w4,w4,w12
1954         ror     w11,w11,#6
1955         eor     w13,w5,w6
1956         eor     w15,w15,w5,ror#20
1957         add     w4,w4,w11
1958         ldr     w12,[sp,#60]
1959         and     w14,w14,w13
1960         ror     w15,w15,#2
1961         add     w8,w8,w4
1962         eor     w14,w14,w6
1963         add     w3,w3,w12
1964         add     w4,w4,w15
1965         and     w12,w9,w8
1966         bic     w15,w10,w8
1967         eor     w11,w8,w8,ror#5
1968         add     w4,w4,w14
1969         orr     w12,w12,w15
1970         eor     w11,w11,w8,ror#19
1971         eor     w15,w4,w4,ror#11
1972         add     w3,w3,w12
1973         ror     w11,w11,#6
1974         eor     w14,w4,w5
1975         eor     w15,w15,w4,ror#20
1976         add     w3,w3,w11
1977         and     w13,w13,w14
1978         ror     w15,w15,#2
1979         add     w7,w7,w3
1980         eor     w13,w13,w5
1981         st1     {v4.4s},[x17], #16
1982         add     w3,w3,w15                       // h+=Sigma0(a) from the past
1983         ldp     w11,w12,[x0,#0]
1984         add     w3,w3,w13                       // h+=Maj(a,b,c) from the past
1985         ldp     w13,w14,[x0,#8]
1986         add     w3,w3,w11                       // accumulate
1987         add     w4,w4,w12
1988         ldp     w11,w12,[x0,#16]
1989         add     w5,w5,w13
1990         add     w6,w6,w14
1991         ldp     w13,w14,[x0,#24]
1992         add     w7,w7,w11
1993         add     w8,w8,w12
1994          ldr    w12,[sp,#0]
1995         stp     w3,w4,[x0,#0]
1996         add     w9,w9,w13
1997          mov    w13,wzr
1998         stp     w5,w6,[x0,#8]
1999         add     w10,w10,w14
2000         stp     w7,w8,[x0,#16]
2001          eor    w14,w4,w5
2002         stp     w9,w10,[x0,#24]
2003          mov    w15,wzr
2004          mov    x17,sp
2005         b.ne    .L_00_48
2007         ldr     x29,[x29]
2008         add     sp,sp,#16*4+16
2009         ret
2010 .size   zfs_sha256_block_neon,.-zfs_sha256_block_neon
2012 #endif