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