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