xref: /netbsd-src/crypto/external/bsd/openssl/lib/libcrypto/arch/arm/sha512-armv8.S (revision bdc22b2e01993381dcefeff2bc9b56ca75a4235c)
1#include "arm_arch.h"
2
3.text
4
5
6.globl	sha256_block_data_order
7.type	sha256_block_data_order,%function
8.align	6
9sha256_block_data_order:
10#ifdef	__ILP32__
11	ldrsw	x16,.LOPENSSL_armcap_P
12#else
13	ldr	x16,.LOPENSSL_armcap_P
14#endif
15	adr	x17,.LOPENSSL_armcap_P
16	add	x16,x16,x17
17	ldr	w16,[x16]
18	tst	w16,#ARMV8_SHA256
19	b.ne	.Lv8_entry
20	stp	x29,x30,[sp,#-128]!
21	add	x29,sp,#0
22
23	stp	x19,x20,[sp,#16]
24	stp	x21,x22,[sp,#32]
25	stp	x23,x24,[sp,#48]
26	stp	x25,x26,[sp,#64]
27	stp	x27,x28,[sp,#80]
28	sub	sp,sp,#4*4
29
30	ldp	w20,w21,[x0]				// load context
31	ldp	w22,w23,[x0,#2*4]
32	ldp	w24,w25,[x0,#4*4]
33	add	x2,x1,x2,lsl#6	// end of input
34	ldp	w26,w27,[x0,#6*4]
35	adr	x30,.LK256
36	stp	x0,x2,[x29,#96]
37
38.Loop:
39	ldp	w3,w4,[x1],#2*4
40	ldr	w19,[x30],#4			// *K++
41	eor	w28,w21,w22				// magic seed
42	str	x1,[x29,#112]
43#ifndef	__ARMEB__
44	rev	w3,w3			// 0
45#endif
46	ror	w16,w24,#6
47	add	w27,w27,w19			// h+=K[i]
48	eor	w6,w24,w24,ror#14
49	and	w17,w25,w24
50	bic	w19,w26,w24
51	add	w27,w27,w3			// h+=X[i]
52	orr	w17,w17,w19			// Ch(e,f,g)
53	eor	w19,w20,w21			// a^b, b^c in next round
54	eor	w16,w16,w6,ror#11	// Sigma1(e)
55	ror	w6,w20,#2
56	add	w27,w27,w17			// h+=Ch(e,f,g)
57	eor	w17,w20,w20,ror#9
58	add	w27,w27,w16			// h+=Sigma1(e)
59	and	w28,w28,w19			// (b^c)&=(a^b)
60	add	w23,w23,w27			// d+=h
61	eor	w28,w28,w21			// Maj(a,b,c)
62	eor	w17,w6,w17,ror#13	// Sigma0(a)
63	add	w27,w27,w28			// h+=Maj(a,b,c)
64	ldr	w28,[x30],#4		// *K++, w19 in next round
65	//add	w27,w27,w17			// h+=Sigma0(a)
66#ifndef	__ARMEB__
67	rev	w4,w4			// 1
68#endif
69	ldp	w5,w6,[x1],#2*4
70	add	w27,w27,w17			// h+=Sigma0(a)
71	ror	w16,w23,#6
72	add	w26,w26,w28			// h+=K[i]
73	eor	w7,w23,w23,ror#14
74	and	w17,w24,w23
75	bic	w28,w25,w23
76	add	w26,w26,w4			// h+=X[i]
77	orr	w17,w17,w28			// Ch(e,f,g)
78	eor	w28,w27,w20			// a^b, b^c in next round
79	eor	w16,w16,w7,ror#11	// Sigma1(e)
80	ror	w7,w27,#2
81	add	w26,w26,w17			// h+=Ch(e,f,g)
82	eor	w17,w27,w27,ror#9
83	add	w26,w26,w16			// h+=Sigma1(e)
84	and	w19,w19,w28			// (b^c)&=(a^b)
85	add	w22,w22,w26			// d+=h
86	eor	w19,w19,w20			// Maj(a,b,c)
87	eor	w17,w7,w17,ror#13	// Sigma0(a)
88	add	w26,w26,w19			// h+=Maj(a,b,c)
89	ldr	w19,[x30],#4		// *K++, w28 in next round
90	//add	w26,w26,w17			// h+=Sigma0(a)
91#ifndef	__ARMEB__
92	rev	w5,w5			// 2
93#endif
94	add	w26,w26,w17			// h+=Sigma0(a)
95	ror	w16,w22,#6
96	add	w25,w25,w19			// h+=K[i]
97	eor	w8,w22,w22,ror#14
98	and	w17,w23,w22
99	bic	w19,w24,w22
100	add	w25,w25,w5			// h+=X[i]
101	orr	w17,w17,w19			// Ch(e,f,g)
102	eor	w19,w26,w27			// a^b, b^c in next round
103	eor	w16,w16,w8,ror#11	// Sigma1(e)
104	ror	w8,w26,#2
105	add	w25,w25,w17			// h+=Ch(e,f,g)
106	eor	w17,w26,w26,ror#9
107	add	w25,w25,w16			// h+=Sigma1(e)
108	and	w28,w28,w19			// (b^c)&=(a^b)
109	add	w21,w21,w25			// d+=h
110	eor	w28,w28,w27			// Maj(a,b,c)
111	eor	w17,w8,w17,ror#13	// Sigma0(a)
112	add	w25,w25,w28			// h+=Maj(a,b,c)
113	ldr	w28,[x30],#4		// *K++, w19 in next round
114	//add	w25,w25,w17			// h+=Sigma0(a)
115#ifndef	__ARMEB__
116	rev	w6,w6			// 3
117#endif
118	ldp	w7,w8,[x1],#2*4
119	add	w25,w25,w17			// h+=Sigma0(a)
120	ror	w16,w21,#6
121	add	w24,w24,w28			// h+=K[i]
122	eor	w9,w21,w21,ror#14
123	and	w17,w22,w21
124	bic	w28,w23,w21
125	add	w24,w24,w6			// h+=X[i]
126	orr	w17,w17,w28			// Ch(e,f,g)
127	eor	w28,w25,w26			// a^b, b^c in next round
128	eor	w16,w16,w9,ror#11	// Sigma1(e)
129	ror	w9,w25,#2
130	add	w24,w24,w17			// h+=Ch(e,f,g)
131	eor	w17,w25,w25,ror#9
132	add	w24,w24,w16			// h+=Sigma1(e)
133	and	w19,w19,w28			// (b^c)&=(a^b)
134	add	w20,w20,w24			// d+=h
135	eor	w19,w19,w26			// Maj(a,b,c)
136	eor	w17,w9,w17,ror#13	// Sigma0(a)
137	add	w24,w24,w19			// h+=Maj(a,b,c)
138	ldr	w19,[x30],#4		// *K++, w28 in next round
139	//add	w24,w24,w17			// h+=Sigma0(a)
140#ifndef	__ARMEB__
141	rev	w7,w7			// 4
142#endif
143	add	w24,w24,w17			// h+=Sigma0(a)
144	ror	w16,w20,#6
145	add	w23,w23,w19			// h+=K[i]
146	eor	w10,w20,w20,ror#14
147	and	w17,w21,w20
148	bic	w19,w22,w20
149	add	w23,w23,w7			// h+=X[i]
150	orr	w17,w17,w19			// Ch(e,f,g)
151	eor	w19,w24,w25			// a^b, b^c in next round
152	eor	w16,w16,w10,ror#11	// Sigma1(e)
153	ror	w10,w24,#2
154	add	w23,w23,w17			// h+=Ch(e,f,g)
155	eor	w17,w24,w24,ror#9
156	add	w23,w23,w16			// h+=Sigma1(e)
157	and	w28,w28,w19			// (b^c)&=(a^b)
158	add	w27,w27,w23			// d+=h
159	eor	w28,w28,w25			// Maj(a,b,c)
160	eor	w17,w10,w17,ror#13	// Sigma0(a)
161	add	w23,w23,w28			// h+=Maj(a,b,c)
162	ldr	w28,[x30],#4		// *K++, w19 in next round
163	//add	w23,w23,w17			// h+=Sigma0(a)
164#ifndef	__ARMEB__
165	rev	w8,w8			// 5
166#endif
167	ldp	w9,w10,[x1],#2*4
168	add	w23,w23,w17			// h+=Sigma0(a)
169	ror	w16,w27,#6
170	add	w22,w22,w28			// h+=K[i]
171	eor	w11,w27,w27,ror#14
172	and	w17,w20,w27
173	bic	w28,w21,w27
174	add	w22,w22,w8			// h+=X[i]
175	orr	w17,w17,w28			// Ch(e,f,g)
176	eor	w28,w23,w24			// a^b, b^c in next round
177	eor	w16,w16,w11,ror#11	// Sigma1(e)
178	ror	w11,w23,#2
179	add	w22,w22,w17			// h+=Ch(e,f,g)
180	eor	w17,w23,w23,ror#9
181	add	w22,w22,w16			// h+=Sigma1(e)
182	and	w19,w19,w28			// (b^c)&=(a^b)
183	add	w26,w26,w22			// d+=h
184	eor	w19,w19,w24			// Maj(a,b,c)
185	eor	w17,w11,w17,ror#13	// Sigma0(a)
186	add	w22,w22,w19			// h+=Maj(a,b,c)
187	ldr	w19,[x30],#4		// *K++, w28 in next round
188	//add	w22,w22,w17			// h+=Sigma0(a)
189#ifndef	__ARMEB__
190	rev	w9,w9			// 6
191#endif
192	add	w22,w22,w17			// h+=Sigma0(a)
193	ror	w16,w26,#6
194	add	w21,w21,w19			// h+=K[i]
195	eor	w12,w26,w26,ror#14
196	and	w17,w27,w26
197	bic	w19,w20,w26
198	add	w21,w21,w9			// h+=X[i]
199	orr	w17,w17,w19			// Ch(e,f,g)
200	eor	w19,w22,w23			// a^b, b^c in next round
201	eor	w16,w16,w12,ror#11	// Sigma1(e)
202	ror	w12,w22,#2
203	add	w21,w21,w17			// h+=Ch(e,f,g)
204	eor	w17,w22,w22,ror#9
205	add	w21,w21,w16			// h+=Sigma1(e)
206	and	w28,w28,w19			// (b^c)&=(a^b)
207	add	w25,w25,w21			// d+=h
208	eor	w28,w28,w23			// Maj(a,b,c)
209	eor	w17,w12,w17,ror#13	// Sigma0(a)
210	add	w21,w21,w28			// h+=Maj(a,b,c)
211	ldr	w28,[x30],#4		// *K++, w19 in next round
212	//add	w21,w21,w17			// h+=Sigma0(a)
213#ifndef	__ARMEB__
214	rev	w10,w10			// 7
215#endif
216	ldp	w11,w12,[x1],#2*4
217	add	w21,w21,w17			// h+=Sigma0(a)
218	ror	w16,w25,#6
219	add	w20,w20,w28			// h+=K[i]
220	eor	w13,w25,w25,ror#14
221	and	w17,w26,w25
222	bic	w28,w27,w25
223	add	w20,w20,w10			// h+=X[i]
224	orr	w17,w17,w28			// Ch(e,f,g)
225	eor	w28,w21,w22			// a^b, b^c in next round
226	eor	w16,w16,w13,ror#11	// Sigma1(e)
227	ror	w13,w21,#2
228	add	w20,w20,w17			// h+=Ch(e,f,g)
229	eor	w17,w21,w21,ror#9
230	add	w20,w20,w16			// h+=Sigma1(e)
231	and	w19,w19,w28			// (b^c)&=(a^b)
232	add	w24,w24,w20			// d+=h
233	eor	w19,w19,w22			// Maj(a,b,c)
234	eor	w17,w13,w17,ror#13	// Sigma0(a)
235	add	w20,w20,w19			// h+=Maj(a,b,c)
236	ldr	w19,[x30],#4		// *K++, w28 in next round
237	//add	w20,w20,w17			// h+=Sigma0(a)
238#ifndef	__ARMEB__
239	rev	w11,w11			// 8
240#endif
241	add	w20,w20,w17			// h+=Sigma0(a)
242	ror	w16,w24,#6
243	add	w27,w27,w19			// h+=K[i]
244	eor	w14,w24,w24,ror#14
245	and	w17,w25,w24
246	bic	w19,w26,w24
247	add	w27,w27,w11			// h+=X[i]
248	orr	w17,w17,w19			// Ch(e,f,g)
249	eor	w19,w20,w21			// a^b, b^c in next round
250	eor	w16,w16,w14,ror#11	// Sigma1(e)
251	ror	w14,w20,#2
252	add	w27,w27,w17			// h+=Ch(e,f,g)
253	eor	w17,w20,w20,ror#9
254	add	w27,w27,w16			// h+=Sigma1(e)
255	and	w28,w28,w19			// (b^c)&=(a^b)
256	add	w23,w23,w27			// d+=h
257	eor	w28,w28,w21			// Maj(a,b,c)
258	eor	w17,w14,w17,ror#13	// Sigma0(a)
259	add	w27,w27,w28			// h+=Maj(a,b,c)
260	ldr	w28,[x30],#4		// *K++, w19 in next round
261	//add	w27,w27,w17			// h+=Sigma0(a)
262#ifndef	__ARMEB__
263	rev	w12,w12			// 9
264#endif
265	ldp	w13,w14,[x1],#2*4
266	add	w27,w27,w17			// h+=Sigma0(a)
267	ror	w16,w23,#6
268	add	w26,w26,w28			// h+=K[i]
269	eor	w15,w23,w23,ror#14
270	and	w17,w24,w23
271	bic	w28,w25,w23
272	add	w26,w26,w12			// h+=X[i]
273	orr	w17,w17,w28			// Ch(e,f,g)
274	eor	w28,w27,w20			// a^b, b^c in next round
275	eor	w16,w16,w15,ror#11	// Sigma1(e)
276	ror	w15,w27,#2
277	add	w26,w26,w17			// h+=Ch(e,f,g)
278	eor	w17,w27,w27,ror#9
279	add	w26,w26,w16			// h+=Sigma1(e)
280	and	w19,w19,w28			// (b^c)&=(a^b)
281	add	w22,w22,w26			// d+=h
282	eor	w19,w19,w20			// Maj(a,b,c)
283	eor	w17,w15,w17,ror#13	// Sigma0(a)
284	add	w26,w26,w19			// h+=Maj(a,b,c)
285	ldr	w19,[x30],#4		// *K++, w28 in next round
286	//add	w26,w26,w17			// h+=Sigma0(a)
287#ifndef	__ARMEB__
288	rev	w13,w13			// 10
289#endif
290	add	w26,w26,w17			// h+=Sigma0(a)
291	ror	w16,w22,#6
292	add	w25,w25,w19			// h+=K[i]
293	eor	w0,w22,w22,ror#14
294	and	w17,w23,w22
295	bic	w19,w24,w22
296	add	w25,w25,w13			// h+=X[i]
297	orr	w17,w17,w19			// Ch(e,f,g)
298	eor	w19,w26,w27			// a^b, b^c in next round
299	eor	w16,w16,w0,ror#11	// Sigma1(e)
300	ror	w0,w26,#2
301	add	w25,w25,w17			// h+=Ch(e,f,g)
302	eor	w17,w26,w26,ror#9
303	add	w25,w25,w16			// h+=Sigma1(e)
304	and	w28,w28,w19			// (b^c)&=(a^b)
305	add	w21,w21,w25			// d+=h
306	eor	w28,w28,w27			// Maj(a,b,c)
307	eor	w17,w0,w17,ror#13	// Sigma0(a)
308	add	w25,w25,w28			// h+=Maj(a,b,c)
309	ldr	w28,[x30],#4		// *K++, w19 in next round
310	//add	w25,w25,w17			// h+=Sigma0(a)
311#ifndef	__ARMEB__
312	rev	w14,w14			// 11
313#endif
314	ldp	w15,w0,[x1],#2*4
315	add	w25,w25,w17			// h+=Sigma0(a)
316	str	w6,[sp,#12]
317	ror	w16,w21,#6
318	add	w24,w24,w28			// h+=K[i]
319	eor	w6,w21,w21,ror#14
320	and	w17,w22,w21
321	bic	w28,w23,w21
322	add	w24,w24,w14			// h+=X[i]
323	orr	w17,w17,w28			// Ch(e,f,g)
324	eor	w28,w25,w26			// a^b, b^c in next round
325	eor	w16,w16,w6,ror#11	// Sigma1(e)
326	ror	w6,w25,#2
327	add	w24,w24,w17			// h+=Ch(e,f,g)
328	eor	w17,w25,w25,ror#9
329	add	w24,w24,w16			// h+=Sigma1(e)
330	and	w19,w19,w28			// (b^c)&=(a^b)
331	add	w20,w20,w24			// d+=h
332	eor	w19,w19,w26			// Maj(a,b,c)
333	eor	w17,w6,w17,ror#13	// Sigma0(a)
334	add	w24,w24,w19			// h+=Maj(a,b,c)
335	ldr	w19,[x30],#4		// *K++, w28 in next round
336	//add	w24,w24,w17			// h+=Sigma0(a)
337#ifndef	__ARMEB__
338	rev	w15,w15			// 12
339#endif
340	add	w24,w24,w17			// h+=Sigma0(a)
341	str	w7,[sp,#0]
342	ror	w16,w20,#6
343	add	w23,w23,w19			// h+=K[i]
344	eor	w7,w20,w20,ror#14
345	and	w17,w21,w20
346	bic	w19,w22,w20
347	add	w23,w23,w15			// h+=X[i]
348	orr	w17,w17,w19			// Ch(e,f,g)
349	eor	w19,w24,w25			// a^b, b^c in next round
350	eor	w16,w16,w7,ror#11	// Sigma1(e)
351	ror	w7,w24,#2
352	add	w23,w23,w17			// h+=Ch(e,f,g)
353	eor	w17,w24,w24,ror#9
354	add	w23,w23,w16			// h+=Sigma1(e)
355	and	w28,w28,w19			// (b^c)&=(a^b)
356	add	w27,w27,w23			// d+=h
357	eor	w28,w28,w25			// Maj(a,b,c)
358	eor	w17,w7,w17,ror#13	// Sigma0(a)
359	add	w23,w23,w28			// h+=Maj(a,b,c)
360	ldr	w28,[x30],#4		// *K++, w19 in next round
361	//add	w23,w23,w17			// h+=Sigma0(a)
362#ifndef	__ARMEB__
363	rev	w0,w0			// 13
364#endif
365	ldp	w1,w2,[x1]
366	add	w23,w23,w17			// h+=Sigma0(a)
367	str	w8,[sp,#4]
368	ror	w16,w27,#6
369	add	w22,w22,w28			// h+=K[i]
370	eor	w8,w27,w27,ror#14
371	and	w17,w20,w27
372	bic	w28,w21,w27
373	add	w22,w22,w0			// h+=X[i]
374	orr	w17,w17,w28			// Ch(e,f,g)
375	eor	w28,w23,w24			// a^b, b^c in next round
376	eor	w16,w16,w8,ror#11	// Sigma1(e)
377	ror	w8,w23,#2
378	add	w22,w22,w17			// h+=Ch(e,f,g)
379	eor	w17,w23,w23,ror#9
380	add	w22,w22,w16			// h+=Sigma1(e)
381	and	w19,w19,w28			// (b^c)&=(a^b)
382	add	w26,w26,w22			// d+=h
383	eor	w19,w19,w24			// Maj(a,b,c)
384	eor	w17,w8,w17,ror#13	// Sigma0(a)
385	add	w22,w22,w19			// h+=Maj(a,b,c)
386	ldr	w19,[x30],#4		// *K++, w28 in next round
387	//add	w22,w22,w17			// h+=Sigma0(a)
388#ifndef	__ARMEB__
389	rev	w1,w1			// 14
390#endif
391	ldr	w6,[sp,#12]
392	add	w22,w22,w17			// h+=Sigma0(a)
393	str	w9,[sp,#8]
394	ror	w16,w26,#6
395	add	w21,w21,w19			// h+=K[i]
396	eor	w9,w26,w26,ror#14
397	and	w17,w27,w26
398	bic	w19,w20,w26
399	add	w21,w21,w1			// h+=X[i]
400	orr	w17,w17,w19			// Ch(e,f,g)
401	eor	w19,w22,w23			// a^b, b^c in next round
402	eor	w16,w16,w9,ror#11	// Sigma1(e)
403	ror	w9,w22,#2
404	add	w21,w21,w17			// h+=Ch(e,f,g)
405	eor	w17,w22,w22,ror#9
406	add	w21,w21,w16			// h+=Sigma1(e)
407	and	w28,w28,w19			// (b^c)&=(a^b)
408	add	w25,w25,w21			// d+=h
409	eor	w28,w28,w23			// Maj(a,b,c)
410	eor	w17,w9,w17,ror#13	// Sigma0(a)
411	add	w21,w21,w28			// h+=Maj(a,b,c)
412	ldr	w28,[x30],#4		// *K++, w19 in next round
413	//add	w21,w21,w17			// h+=Sigma0(a)
414#ifndef	__ARMEB__
415	rev	w2,w2			// 15
416#endif
417	ldr	w7,[sp,#0]
418	add	w21,w21,w17			// h+=Sigma0(a)
419	str	w10,[sp,#12]
420	ror	w16,w25,#6
421	add	w20,w20,w28			// h+=K[i]
422	ror	w9,w4,#7
423	and	w17,w26,w25
424	ror	w8,w1,#17
425	bic	w28,w27,w25
426	ror	w10,w21,#2
427	add	w20,w20,w2			// h+=X[i]
428	eor	w16,w16,w25,ror#11
429	eor	w9,w9,w4,ror#18
430	orr	w17,w17,w28			// Ch(e,f,g)
431	eor	w28,w21,w22			// a^b, b^c in next round
432	eor	w16,w16,w25,ror#25	// Sigma1(e)
433	eor	w10,w10,w21,ror#13
434	add	w20,w20,w17			// h+=Ch(e,f,g)
435	and	w19,w19,w28			// (b^c)&=(a^b)
436	eor	w8,w8,w1,ror#19
437	eor	w9,w9,w4,lsr#3	// sigma0(X[i+1])
438	add	w20,w20,w16			// h+=Sigma1(e)
439	eor	w19,w19,w22			// Maj(a,b,c)
440	eor	w17,w10,w21,ror#22	// Sigma0(a)
441	eor	w8,w8,w1,lsr#10	// sigma1(X[i+14])
442	add	w3,w3,w12
443	add	w24,w24,w20			// d+=h
444	add	w20,w20,w19			// h+=Maj(a,b,c)
445	ldr	w19,[x30],#4		// *K++, w28 in next round
446	add	w3,w3,w9
447	add	w20,w20,w17			// h+=Sigma0(a)
448	add	w3,w3,w8
449.Loop_16_xx:
450	ldr	w8,[sp,#4]
451	str	w11,[sp,#0]
452	ror	w16,w24,#6
453	add	w27,w27,w19			// h+=K[i]
454	ror	w10,w5,#7
455	and	w17,w25,w24
456	ror	w9,w2,#17
457	bic	w19,w26,w24
458	ror	w11,w20,#2
459	add	w27,w27,w3			// h+=X[i]
460	eor	w16,w16,w24,ror#11
461	eor	w10,w10,w5,ror#18
462	orr	w17,w17,w19			// Ch(e,f,g)
463	eor	w19,w20,w21			// a^b, b^c in next round
464	eor	w16,w16,w24,ror#25	// Sigma1(e)
465	eor	w11,w11,w20,ror#13
466	add	w27,w27,w17			// h+=Ch(e,f,g)
467	and	w28,w28,w19			// (b^c)&=(a^b)
468	eor	w9,w9,w2,ror#19
469	eor	w10,w10,w5,lsr#3	// sigma0(X[i+1])
470	add	w27,w27,w16			// h+=Sigma1(e)
471	eor	w28,w28,w21			// Maj(a,b,c)
472	eor	w17,w11,w20,ror#22	// Sigma0(a)
473	eor	w9,w9,w2,lsr#10	// sigma1(X[i+14])
474	add	w4,w4,w13
475	add	w23,w23,w27			// d+=h
476	add	w27,w27,w28			// h+=Maj(a,b,c)
477	ldr	w28,[x30],#4		// *K++, w19 in next round
478	add	w4,w4,w10
479	add	w27,w27,w17			// h+=Sigma0(a)
480	add	w4,w4,w9
481	ldr	w9,[sp,#8]
482	str	w12,[sp,#4]
483	ror	w16,w23,#6
484	add	w26,w26,w28			// h+=K[i]
485	ror	w11,w6,#7
486	and	w17,w24,w23
487	ror	w10,w3,#17
488	bic	w28,w25,w23
489	ror	w12,w27,#2
490	add	w26,w26,w4			// h+=X[i]
491	eor	w16,w16,w23,ror#11
492	eor	w11,w11,w6,ror#18
493	orr	w17,w17,w28			// Ch(e,f,g)
494	eor	w28,w27,w20			// a^b, b^c in next round
495	eor	w16,w16,w23,ror#25	// Sigma1(e)
496	eor	w12,w12,w27,ror#13
497	add	w26,w26,w17			// h+=Ch(e,f,g)
498	and	w19,w19,w28			// (b^c)&=(a^b)
499	eor	w10,w10,w3,ror#19
500	eor	w11,w11,w6,lsr#3	// sigma0(X[i+1])
501	add	w26,w26,w16			// h+=Sigma1(e)
502	eor	w19,w19,w20			// Maj(a,b,c)
503	eor	w17,w12,w27,ror#22	// Sigma0(a)
504	eor	w10,w10,w3,lsr#10	// sigma1(X[i+14])
505	add	w5,w5,w14
506	add	w22,w22,w26			// d+=h
507	add	w26,w26,w19			// h+=Maj(a,b,c)
508	ldr	w19,[x30],#4		// *K++, w28 in next round
509	add	w5,w5,w11
510	add	w26,w26,w17			// h+=Sigma0(a)
511	add	w5,w5,w10
512	ldr	w10,[sp,#12]
513	str	w13,[sp,#8]
514	ror	w16,w22,#6
515	add	w25,w25,w19			// h+=K[i]
516	ror	w12,w7,#7
517	and	w17,w23,w22
518	ror	w11,w4,#17
519	bic	w19,w24,w22
520	ror	w13,w26,#2
521	add	w25,w25,w5			// h+=X[i]
522	eor	w16,w16,w22,ror#11
523	eor	w12,w12,w7,ror#18
524	orr	w17,w17,w19			// Ch(e,f,g)
525	eor	w19,w26,w27			// a^b, b^c in next round
526	eor	w16,w16,w22,ror#25	// Sigma1(e)
527	eor	w13,w13,w26,ror#13
528	add	w25,w25,w17			// h+=Ch(e,f,g)
529	and	w28,w28,w19			// (b^c)&=(a^b)
530	eor	w11,w11,w4,ror#19
531	eor	w12,w12,w7,lsr#3	// sigma0(X[i+1])
532	add	w25,w25,w16			// h+=Sigma1(e)
533	eor	w28,w28,w27			// Maj(a,b,c)
534	eor	w17,w13,w26,ror#22	// Sigma0(a)
535	eor	w11,w11,w4,lsr#10	// sigma1(X[i+14])
536	add	w6,w6,w15
537	add	w21,w21,w25			// d+=h
538	add	w25,w25,w28			// h+=Maj(a,b,c)
539	ldr	w28,[x30],#4		// *K++, w19 in next round
540	add	w6,w6,w12
541	add	w25,w25,w17			// h+=Sigma0(a)
542	add	w6,w6,w11
543	ldr	w11,[sp,#0]
544	str	w14,[sp,#12]
545	ror	w16,w21,#6
546	add	w24,w24,w28			// h+=K[i]
547	ror	w13,w8,#7
548	and	w17,w22,w21
549	ror	w12,w5,#17
550	bic	w28,w23,w21
551	ror	w14,w25,#2
552	add	w24,w24,w6			// h+=X[i]
553	eor	w16,w16,w21,ror#11
554	eor	w13,w13,w8,ror#18
555	orr	w17,w17,w28			// Ch(e,f,g)
556	eor	w28,w25,w26			// a^b, b^c in next round
557	eor	w16,w16,w21,ror#25	// Sigma1(e)
558	eor	w14,w14,w25,ror#13
559	add	w24,w24,w17			// h+=Ch(e,f,g)
560	and	w19,w19,w28			// (b^c)&=(a^b)
561	eor	w12,w12,w5,ror#19
562	eor	w13,w13,w8,lsr#3	// sigma0(X[i+1])
563	add	w24,w24,w16			// h+=Sigma1(e)
564	eor	w19,w19,w26			// Maj(a,b,c)
565	eor	w17,w14,w25,ror#22	// Sigma0(a)
566	eor	w12,w12,w5,lsr#10	// sigma1(X[i+14])
567	add	w7,w7,w0
568	add	w20,w20,w24			// d+=h
569	add	w24,w24,w19			// h+=Maj(a,b,c)
570	ldr	w19,[x30],#4		// *K++, w28 in next round
571	add	w7,w7,w13
572	add	w24,w24,w17			// h+=Sigma0(a)
573	add	w7,w7,w12
574	ldr	w12,[sp,#4]
575	str	w15,[sp,#0]
576	ror	w16,w20,#6
577	add	w23,w23,w19			// h+=K[i]
578	ror	w14,w9,#7
579	and	w17,w21,w20
580	ror	w13,w6,#17
581	bic	w19,w22,w20
582	ror	w15,w24,#2
583	add	w23,w23,w7			// h+=X[i]
584	eor	w16,w16,w20,ror#11
585	eor	w14,w14,w9,ror#18
586	orr	w17,w17,w19			// Ch(e,f,g)
587	eor	w19,w24,w25			// a^b, b^c in next round
588	eor	w16,w16,w20,ror#25	// Sigma1(e)
589	eor	w15,w15,w24,ror#13
590	add	w23,w23,w17			// h+=Ch(e,f,g)
591	and	w28,w28,w19			// (b^c)&=(a^b)
592	eor	w13,w13,w6,ror#19
593	eor	w14,w14,w9,lsr#3	// sigma0(X[i+1])
594	add	w23,w23,w16			// h+=Sigma1(e)
595	eor	w28,w28,w25			// Maj(a,b,c)
596	eor	w17,w15,w24,ror#22	// Sigma0(a)
597	eor	w13,w13,w6,lsr#10	// sigma1(X[i+14])
598	add	w8,w8,w1
599	add	w27,w27,w23			// d+=h
600	add	w23,w23,w28			// h+=Maj(a,b,c)
601	ldr	w28,[x30],#4		// *K++, w19 in next round
602	add	w8,w8,w14
603	add	w23,w23,w17			// h+=Sigma0(a)
604	add	w8,w8,w13
605	ldr	w13,[sp,#8]
606	str	w0,[sp,#4]
607	ror	w16,w27,#6
608	add	w22,w22,w28			// h+=K[i]
609	ror	w15,w10,#7
610	and	w17,w20,w27
611	ror	w14,w7,#17
612	bic	w28,w21,w27
613	ror	w0,w23,#2
614	add	w22,w22,w8			// h+=X[i]
615	eor	w16,w16,w27,ror#11
616	eor	w15,w15,w10,ror#18
617	orr	w17,w17,w28			// Ch(e,f,g)
618	eor	w28,w23,w24			// a^b, b^c in next round
619	eor	w16,w16,w27,ror#25	// Sigma1(e)
620	eor	w0,w0,w23,ror#13
621	add	w22,w22,w17			// h+=Ch(e,f,g)
622	and	w19,w19,w28			// (b^c)&=(a^b)
623	eor	w14,w14,w7,ror#19
624	eor	w15,w15,w10,lsr#3	// sigma0(X[i+1])
625	add	w22,w22,w16			// h+=Sigma1(e)
626	eor	w19,w19,w24			// Maj(a,b,c)
627	eor	w17,w0,w23,ror#22	// Sigma0(a)
628	eor	w14,w14,w7,lsr#10	// sigma1(X[i+14])
629	add	w9,w9,w2
630	add	w26,w26,w22			// d+=h
631	add	w22,w22,w19			// h+=Maj(a,b,c)
632	ldr	w19,[x30],#4		// *K++, w28 in next round
633	add	w9,w9,w15
634	add	w22,w22,w17			// h+=Sigma0(a)
635	add	w9,w9,w14
636	ldr	w14,[sp,#12]
637	str	w1,[sp,#8]
638	ror	w16,w26,#6
639	add	w21,w21,w19			// h+=K[i]
640	ror	w0,w11,#7
641	and	w17,w27,w26
642	ror	w15,w8,#17
643	bic	w19,w20,w26
644	ror	w1,w22,#2
645	add	w21,w21,w9			// h+=X[i]
646	eor	w16,w16,w26,ror#11
647	eor	w0,w0,w11,ror#18
648	orr	w17,w17,w19			// Ch(e,f,g)
649	eor	w19,w22,w23			// a^b, b^c in next round
650	eor	w16,w16,w26,ror#25	// Sigma1(e)
651	eor	w1,w1,w22,ror#13
652	add	w21,w21,w17			// h+=Ch(e,f,g)
653	and	w28,w28,w19			// (b^c)&=(a^b)
654	eor	w15,w15,w8,ror#19
655	eor	w0,w0,w11,lsr#3	// sigma0(X[i+1])
656	add	w21,w21,w16			// h+=Sigma1(e)
657	eor	w28,w28,w23			// Maj(a,b,c)
658	eor	w17,w1,w22,ror#22	// Sigma0(a)
659	eor	w15,w15,w8,lsr#10	// sigma1(X[i+14])
660	add	w10,w10,w3
661	add	w25,w25,w21			// d+=h
662	add	w21,w21,w28			// h+=Maj(a,b,c)
663	ldr	w28,[x30],#4		// *K++, w19 in next round
664	add	w10,w10,w0
665	add	w21,w21,w17			// h+=Sigma0(a)
666	add	w10,w10,w15
667	ldr	w15,[sp,#0]
668	str	w2,[sp,#12]
669	ror	w16,w25,#6
670	add	w20,w20,w28			// h+=K[i]
671	ror	w1,w12,#7
672	and	w17,w26,w25
673	ror	w0,w9,#17
674	bic	w28,w27,w25
675	ror	w2,w21,#2
676	add	w20,w20,w10			// h+=X[i]
677	eor	w16,w16,w25,ror#11
678	eor	w1,w1,w12,ror#18
679	orr	w17,w17,w28			// Ch(e,f,g)
680	eor	w28,w21,w22			// a^b, b^c in next round
681	eor	w16,w16,w25,ror#25	// Sigma1(e)
682	eor	w2,w2,w21,ror#13
683	add	w20,w20,w17			// h+=Ch(e,f,g)
684	and	w19,w19,w28			// (b^c)&=(a^b)
685	eor	w0,w0,w9,ror#19
686	eor	w1,w1,w12,lsr#3	// sigma0(X[i+1])
687	add	w20,w20,w16			// h+=Sigma1(e)
688	eor	w19,w19,w22			// Maj(a,b,c)
689	eor	w17,w2,w21,ror#22	// Sigma0(a)
690	eor	w0,w0,w9,lsr#10	// sigma1(X[i+14])
691	add	w11,w11,w4
692	add	w24,w24,w20			// d+=h
693	add	w20,w20,w19			// h+=Maj(a,b,c)
694	ldr	w19,[x30],#4		// *K++, w28 in next round
695	add	w11,w11,w1
696	add	w20,w20,w17			// h+=Sigma0(a)
697	add	w11,w11,w0
698	ldr	w0,[sp,#4]
699	str	w3,[sp,#0]
700	ror	w16,w24,#6
701	add	w27,w27,w19			// h+=K[i]
702	ror	w2,w13,#7
703	and	w17,w25,w24
704	ror	w1,w10,#17
705	bic	w19,w26,w24
706	ror	w3,w20,#2
707	add	w27,w27,w11			// h+=X[i]
708	eor	w16,w16,w24,ror#11
709	eor	w2,w2,w13,ror#18
710	orr	w17,w17,w19			// Ch(e,f,g)
711	eor	w19,w20,w21			// a^b, b^c in next round
712	eor	w16,w16,w24,ror#25	// Sigma1(e)
713	eor	w3,w3,w20,ror#13
714	add	w27,w27,w17			// h+=Ch(e,f,g)
715	and	w28,w28,w19			// (b^c)&=(a^b)
716	eor	w1,w1,w10,ror#19
717	eor	w2,w2,w13,lsr#3	// sigma0(X[i+1])
718	add	w27,w27,w16			// h+=Sigma1(e)
719	eor	w28,w28,w21			// Maj(a,b,c)
720	eor	w17,w3,w20,ror#22	// Sigma0(a)
721	eor	w1,w1,w10,lsr#10	// sigma1(X[i+14])
722	add	w12,w12,w5
723	add	w23,w23,w27			// d+=h
724	add	w27,w27,w28			// h+=Maj(a,b,c)
725	ldr	w28,[x30],#4		// *K++, w19 in next round
726	add	w12,w12,w2
727	add	w27,w27,w17			// h+=Sigma0(a)
728	add	w12,w12,w1
729	ldr	w1,[sp,#8]
730	str	w4,[sp,#4]
731	ror	w16,w23,#6
732	add	w26,w26,w28			// h+=K[i]
733	ror	w3,w14,#7
734	and	w17,w24,w23
735	ror	w2,w11,#17
736	bic	w28,w25,w23
737	ror	w4,w27,#2
738	add	w26,w26,w12			// h+=X[i]
739	eor	w16,w16,w23,ror#11
740	eor	w3,w3,w14,ror#18
741	orr	w17,w17,w28			// Ch(e,f,g)
742	eor	w28,w27,w20			// a^b, b^c in next round
743	eor	w16,w16,w23,ror#25	// Sigma1(e)
744	eor	w4,w4,w27,ror#13
745	add	w26,w26,w17			// h+=Ch(e,f,g)
746	and	w19,w19,w28			// (b^c)&=(a^b)
747	eor	w2,w2,w11,ror#19
748	eor	w3,w3,w14,lsr#3	// sigma0(X[i+1])
749	add	w26,w26,w16			// h+=Sigma1(e)
750	eor	w19,w19,w20			// Maj(a,b,c)
751	eor	w17,w4,w27,ror#22	// Sigma0(a)
752	eor	w2,w2,w11,lsr#10	// sigma1(X[i+14])
753	add	w13,w13,w6
754	add	w22,w22,w26			// d+=h
755	add	w26,w26,w19			// h+=Maj(a,b,c)
756	ldr	w19,[x30],#4		// *K++, w28 in next round
757	add	w13,w13,w3
758	add	w26,w26,w17			// h+=Sigma0(a)
759	add	w13,w13,w2
760	ldr	w2,[sp,#12]
761	str	w5,[sp,#8]
762	ror	w16,w22,#6
763	add	w25,w25,w19			// h+=K[i]
764	ror	w4,w15,#7
765	and	w17,w23,w22
766	ror	w3,w12,#17
767	bic	w19,w24,w22
768	ror	w5,w26,#2
769	add	w25,w25,w13			// h+=X[i]
770	eor	w16,w16,w22,ror#11
771	eor	w4,w4,w15,ror#18
772	orr	w17,w17,w19			// Ch(e,f,g)
773	eor	w19,w26,w27			// a^b, b^c in next round
774	eor	w16,w16,w22,ror#25	// Sigma1(e)
775	eor	w5,w5,w26,ror#13
776	add	w25,w25,w17			// h+=Ch(e,f,g)
777	and	w28,w28,w19			// (b^c)&=(a^b)
778	eor	w3,w3,w12,ror#19
779	eor	w4,w4,w15,lsr#3	// sigma0(X[i+1])
780	add	w25,w25,w16			// h+=Sigma1(e)
781	eor	w28,w28,w27			// Maj(a,b,c)
782	eor	w17,w5,w26,ror#22	// Sigma0(a)
783	eor	w3,w3,w12,lsr#10	// sigma1(X[i+14])
784	add	w14,w14,w7
785	add	w21,w21,w25			// d+=h
786	add	w25,w25,w28			// h+=Maj(a,b,c)
787	ldr	w28,[x30],#4		// *K++, w19 in next round
788	add	w14,w14,w4
789	add	w25,w25,w17			// h+=Sigma0(a)
790	add	w14,w14,w3
791	ldr	w3,[sp,#0]
792	str	w6,[sp,#12]
793	ror	w16,w21,#6
794	add	w24,w24,w28			// h+=K[i]
795	ror	w5,w0,#7
796	and	w17,w22,w21
797	ror	w4,w13,#17
798	bic	w28,w23,w21
799	ror	w6,w25,#2
800	add	w24,w24,w14			// h+=X[i]
801	eor	w16,w16,w21,ror#11
802	eor	w5,w5,w0,ror#18
803	orr	w17,w17,w28			// Ch(e,f,g)
804	eor	w28,w25,w26			// a^b, b^c in next round
805	eor	w16,w16,w21,ror#25	// Sigma1(e)
806	eor	w6,w6,w25,ror#13
807	add	w24,w24,w17			// h+=Ch(e,f,g)
808	and	w19,w19,w28			// (b^c)&=(a^b)
809	eor	w4,w4,w13,ror#19
810	eor	w5,w5,w0,lsr#3	// sigma0(X[i+1])
811	add	w24,w24,w16			// h+=Sigma1(e)
812	eor	w19,w19,w26			// Maj(a,b,c)
813	eor	w17,w6,w25,ror#22	// Sigma0(a)
814	eor	w4,w4,w13,lsr#10	// sigma1(X[i+14])
815	add	w15,w15,w8
816	add	w20,w20,w24			// d+=h
817	add	w24,w24,w19			// h+=Maj(a,b,c)
818	ldr	w19,[x30],#4		// *K++, w28 in next round
819	add	w15,w15,w5
820	add	w24,w24,w17			// h+=Sigma0(a)
821	add	w15,w15,w4
822	ldr	w4,[sp,#4]
823	str	w7,[sp,#0]
824	ror	w16,w20,#6
825	add	w23,w23,w19			// h+=K[i]
826	ror	w6,w1,#7
827	and	w17,w21,w20
828	ror	w5,w14,#17
829	bic	w19,w22,w20
830	ror	w7,w24,#2
831	add	w23,w23,w15			// h+=X[i]
832	eor	w16,w16,w20,ror#11
833	eor	w6,w6,w1,ror#18
834	orr	w17,w17,w19			// Ch(e,f,g)
835	eor	w19,w24,w25			// a^b, b^c in next round
836	eor	w16,w16,w20,ror#25	// Sigma1(e)
837	eor	w7,w7,w24,ror#13
838	add	w23,w23,w17			// h+=Ch(e,f,g)
839	and	w28,w28,w19			// (b^c)&=(a^b)
840	eor	w5,w5,w14,ror#19
841	eor	w6,w6,w1,lsr#3	// sigma0(X[i+1])
842	add	w23,w23,w16			// h+=Sigma1(e)
843	eor	w28,w28,w25			// Maj(a,b,c)
844	eor	w17,w7,w24,ror#22	// Sigma0(a)
845	eor	w5,w5,w14,lsr#10	// sigma1(X[i+14])
846	add	w0,w0,w9
847	add	w27,w27,w23			// d+=h
848	add	w23,w23,w28			// h+=Maj(a,b,c)
849	ldr	w28,[x30],#4		// *K++, w19 in next round
850	add	w0,w0,w6
851	add	w23,w23,w17			// h+=Sigma0(a)
852	add	w0,w0,w5
853	ldr	w5,[sp,#8]
854	str	w8,[sp,#4]
855	ror	w16,w27,#6
856	add	w22,w22,w28			// h+=K[i]
857	ror	w7,w2,#7
858	and	w17,w20,w27
859	ror	w6,w15,#17
860	bic	w28,w21,w27
861	ror	w8,w23,#2
862	add	w22,w22,w0			// h+=X[i]
863	eor	w16,w16,w27,ror#11
864	eor	w7,w7,w2,ror#18
865	orr	w17,w17,w28			// Ch(e,f,g)
866	eor	w28,w23,w24			// a^b, b^c in next round
867	eor	w16,w16,w27,ror#25	// Sigma1(e)
868	eor	w8,w8,w23,ror#13
869	add	w22,w22,w17			// h+=Ch(e,f,g)
870	and	w19,w19,w28			// (b^c)&=(a^b)
871	eor	w6,w6,w15,ror#19
872	eor	w7,w7,w2,lsr#3	// sigma0(X[i+1])
873	add	w22,w22,w16			// h+=Sigma1(e)
874	eor	w19,w19,w24			// Maj(a,b,c)
875	eor	w17,w8,w23,ror#22	// Sigma0(a)
876	eor	w6,w6,w15,lsr#10	// sigma1(X[i+14])
877	add	w1,w1,w10
878	add	w26,w26,w22			// d+=h
879	add	w22,w22,w19			// h+=Maj(a,b,c)
880	ldr	w19,[x30],#4		// *K++, w28 in next round
881	add	w1,w1,w7
882	add	w22,w22,w17			// h+=Sigma0(a)
883	add	w1,w1,w6
884	ldr	w6,[sp,#12]
885	str	w9,[sp,#8]
886	ror	w16,w26,#6
887	add	w21,w21,w19			// h+=K[i]
888	ror	w8,w3,#7
889	and	w17,w27,w26
890	ror	w7,w0,#17
891	bic	w19,w20,w26
892	ror	w9,w22,#2
893	add	w21,w21,w1			// h+=X[i]
894	eor	w16,w16,w26,ror#11
895	eor	w8,w8,w3,ror#18
896	orr	w17,w17,w19			// Ch(e,f,g)
897	eor	w19,w22,w23			// a^b, b^c in next round
898	eor	w16,w16,w26,ror#25	// Sigma1(e)
899	eor	w9,w9,w22,ror#13
900	add	w21,w21,w17			// h+=Ch(e,f,g)
901	and	w28,w28,w19			// (b^c)&=(a^b)
902	eor	w7,w7,w0,ror#19
903	eor	w8,w8,w3,lsr#3	// sigma0(X[i+1])
904	add	w21,w21,w16			// h+=Sigma1(e)
905	eor	w28,w28,w23			// Maj(a,b,c)
906	eor	w17,w9,w22,ror#22	// Sigma0(a)
907	eor	w7,w7,w0,lsr#10	// sigma1(X[i+14])
908	add	w2,w2,w11
909	add	w25,w25,w21			// d+=h
910	add	w21,w21,w28			// h+=Maj(a,b,c)
911	ldr	w28,[x30],#4		// *K++, w19 in next round
912	add	w2,w2,w8
913	add	w21,w21,w17			// h+=Sigma0(a)
914	add	w2,w2,w7
915	ldr	w7,[sp,#0]
916	str	w10,[sp,#12]
917	ror	w16,w25,#6
918	add	w20,w20,w28			// h+=K[i]
919	ror	w9,w4,#7
920	and	w17,w26,w25
921	ror	w8,w1,#17
922	bic	w28,w27,w25
923	ror	w10,w21,#2
924	add	w20,w20,w2			// h+=X[i]
925	eor	w16,w16,w25,ror#11
926	eor	w9,w9,w4,ror#18
927	orr	w17,w17,w28			// Ch(e,f,g)
928	eor	w28,w21,w22			// a^b, b^c in next round
929	eor	w16,w16,w25,ror#25	// Sigma1(e)
930	eor	w10,w10,w21,ror#13
931	add	w20,w20,w17			// h+=Ch(e,f,g)
932	and	w19,w19,w28			// (b^c)&=(a^b)
933	eor	w8,w8,w1,ror#19
934	eor	w9,w9,w4,lsr#3	// sigma0(X[i+1])
935	add	w20,w20,w16			// h+=Sigma1(e)
936	eor	w19,w19,w22			// Maj(a,b,c)
937	eor	w17,w10,w21,ror#22	// Sigma0(a)
938	eor	w8,w8,w1,lsr#10	// sigma1(X[i+14])
939	add	w3,w3,w12
940	add	w24,w24,w20			// d+=h
941	add	w20,w20,w19			// h+=Maj(a,b,c)
942	ldr	w19,[x30],#4		// *K++, w28 in next round
943	add	w3,w3,w9
944	add	w20,w20,w17			// h+=Sigma0(a)
945	add	w3,w3,w8
946	cbnz	w19,.Loop_16_xx
947
948	ldp	x0,x2,[x29,#96]
949	ldr	x1,[x29,#112]
950	sub	x30,x30,#260		// rewind
951
952	ldp	w3,w4,[x0]
953	ldp	w5,w6,[x0,#2*4]
954	add	x1,x1,#14*4			// advance input pointer
955	ldp	w7,w8,[x0,#4*4]
956	add	w20,w20,w3
957	ldp	w9,w10,[x0,#6*4]
958	add	w21,w21,w4
959	add	w22,w22,w5
960	add	w23,w23,w6
961	stp	w20,w21,[x0]
962	add	w24,w24,w7
963	add	w25,w25,w8
964	stp	w22,w23,[x0,#2*4]
965	add	w26,w26,w9
966	add	w27,w27,w10
967	cmp	x1,x2
968	stp	w24,w25,[x0,#4*4]
969	stp	w26,w27,[x0,#6*4]
970	b.ne	.Loop
971
972	ldp	x19,x20,[x29,#16]
973	add	sp,sp,#4*4
974	ldp	x21,x22,[x29,#32]
975	ldp	x23,x24,[x29,#48]
976	ldp	x25,x26,[x29,#64]
977	ldp	x27,x28,[x29,#80]
978	ldp	x29,x30,[sp],#128
979	ret
980.size	sha256_block_data_order,.-sha256_block_data_order
981
982.align	6
983.type	.LK256,%object
984.LK256:
985.long	0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
986.long	0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5
987.long	0xd807aa98,0x12835b01,0x243185be,0x550c7dc3
988.long	0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174
989.long	0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc
990.long	0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da
991.long	0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7
992.long	0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967
993.long	0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13
994.long	0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85
995.long	0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3
996.long	0xd192e819,0xd6990624,0xf40e3585,0x106aa070
997.long	0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5
998.long	0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3
999.long	0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
1000.long	0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
1001.long	0	//terminator
1002.size	.LK256,.-.LK256
1003.align	3
1004.LOPENSSL_armcap_P:
1005#ifdef	__ILP32__
1006.long	OPENSSL_armcap_P-.
1007#else
1008.quad	OPENSSL_armcap_P-.
1009#endif
1010.byte	83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
1011.align	2
1012.align	2
1013.type	sha256_block_armv8,%function
1014.align	6
1015sha256_block_armv8:
1016.Lv8_entry:
1017	stp	x29,x30,[sp,#-16]!
1018	add	x29,sp,#0
1019
1020	ld1	{v0.4s,v1.4s},[x0]
1021	adr	x3,.LK256
1022
1023.Loop_hw:
1024	ld1	{v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64
1025	sub	x2,x2,#1
1026	ld1	{v16.4s},[x3],#16
1027	rev32	v4.16b,v4.16b
1028	rev32	v5.16b,v5.16b
1029	rev32	v6.16b,v6.16b
1030	rev32	v7.16b,v7.16b
1031	orr	v18.16b,v0.16b,v0.16b		// offload
1032	orr	v19.16b,v1.16b,v1.16b
1033	ld1	{v17.4s},[x3],#16
1034	add	v16.4s,v16.4s,v4.4s
1035.inst	0x5e2828a4	//sha256su0 v4.16b,v5.16b
1036	orr	v2.16b,v0.16b,v0.16b
1037.inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1038.inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1039.inst	0x5e0760c4	//sha256su1 v4.16b,v6.16b,v7.16b
1040	ld1	{v16.4s},[x3],#16
1041	add	v17.4s,v17.4s,v5.4s
1042.inst	0x5e2828c5	//sha256su0 v5.16b,v6.16b
1043	orr	v2.16b,v0.16b,v0.16b
1044.inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1045.inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1046.inst	0x5e0460e5	//sha256su1 v5.16b,v7.16b,v4.16b
1047	ld1	{v17.4s},[x3],#16
1048	add	v16.4s,v16.4s,v6.4s
1049.inst	0x5e2828e6	//sha256su0 v6.16b,v7.16b
1050	orr	v2.16b,v0.16b,v0.16b
1051.inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1052.inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1053.inst	0x5e056086	//sha256su1 v6.16b,v4.16b,v5.16b
1054	ld1	{v16.4s},[x3],#16
1055	add	v17.4s,v17.4s,v7.4s
1056.inst	0x5e282887	//sha256su0 v7.16b,v4.16b
1057	orr	v2.16b,v0.16b,v0.16b
1058.inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1059.inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1060.inst	0x5e0660a7	//sha256su1 v7.16b,v5.16b,v6.16b
1061	ld1	{v17.4s},[x3],#16
1062	add	v16.4s,v16.4s,v4.4s
1063.inst	0x5e2828a4	//sha256su0 v4.16b,v5.16b
1064	orr	v2.16b,v0.16b,v0.16b
1065.inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1066.inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1067.inst	0x5e0760c4	//sha256su1 v4.16b,v6.16b,v7.16b
1068	ld1	{v16.4s},[x3],#16
1069	add	v17.4s,v17.4s,v5.4s
1070.inst	0x5e2828c5	//sha256su0 v5.16b,v6.16b
1071	orr	v2.16b,v0.16b,v0.16b
1072.inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1073.inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1074.inst	0x5e0460e5	//sha256su1 v5.16b,v7.16b,v4.16b
1075	ld1	{v17.4s},[x3],#16
1076	add	v16.4s,v16.4s,v6.4s
1077.inst	0x5e2828e6	//sha256su0 v6.16b,v7.16b
1078	orr	v2.16b,v0.16b,v0.16b
1079.inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1080.inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1081.inst	0x5e056086	//sha256su1 v6.16b,v4.16b,v5.16b
1082	ld1	{v16.4s},[x3],#16
1083	add	v17.4s,v17.4s,v7.4s
1084.inst	0x5e282887	//sha256su0 v7.16b,v4.16b
1085	orr	v2.16b,v0.16b,v0.16b
1086.inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1087.inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1088.inst	0x5e0660a7	//sha256su1 v7.16b,v5.16b,v6.16b
1089	ld1	{v17.4s},[x3],#16
1090	add	v16.4s,v16.4s,v4.4s
1091.inst	0x5e2828a4	//sha256su0 v4.16b,v5.16b
1092	orr	v2.16b,v0.16b,v0.16b
1093.inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1094.inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1095.inst	0x5e0760c4	//sha256su1 v4.16b,v6.16b,v7.16b
1096	ld1	{v16.4s},[x3],#16
1097	add	v17.4s,v17.4s,v5.4s
1098.inst	0x5e2828c5	//sha256su0 v5.16b,v6.16b
1099	orr	v2.16b,v0.16b,v0.16b
1100.inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1101.inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1102.inst	0x5e0460e5	//sha256su1 v5.16b,v7.16b,v4.16b
1103	ld1	{v17.4s},[x3],#16
1104	add	v16.4s,v16.4s,v6.4s
1105.inst	0x5e2828e6	//sha256su0 v6.16b,v7.16b
1106	orr	v2.16b,v0.16b,v0.16b
1107.inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1108.inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1109.inst	0x5e056086	//sha256su1 v6.16b,v4.16b,v5.16b
1110	ld1	{v16.4s},[x3],#16
1111	add	v17.4s,v17.4s,v7.4s
1112.inst	0x5e282887	//sha256su0 v7.16b,v4.16b
1113	orr	v2.16b,v0.16b,v0.16b
1114.inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1115.inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1116.inst	0x5e0660a7	//sha256su1 v7.16b,v5.16b,v6.16b
1117	ld1	{v17.4s},[x3],#16
1118	add	v16.4s,v16.4s,v4.4s
1119	orr	v2.16b,v0.16b,v0.16b
1120.inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1121.inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1122
1123	ld1	{v16.4s},[x3],#16
1124	add	v17.4s,v17.4s,v5.4s
1125	orr	v2.16b,v0.16b,v0.16b
1126.inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1127.inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1128
1129	ld1	{v17.4s},[x3]
1130	add	v16.4s,v16.4s,v6.4s
1131	sub	x3,x3,#64*4-16	// rewind
1132	orr	v2.16b,v0.16b,v0.16b
1133.inst	0x5e104020	//sha256h v0.16b,v1.16b,v16.4s
1134.inst	0x5e105041	//sha256h2 v1.16b,v2.16b,v16.4s
1135
1136	add	v17.4s,v17.4s,v7.4s
1137	orr	v2.16b,v0.16b,v0.16b
1138.inst	0x5e114020	//sha256h v0.16b,v1.16b,v17.4s
1139.inst	0x5e115041	//sha256h2 v1.16b,v2.16b,v17.4s
1140
1141	add	v0.4s,v0.4s,v18.4s
1142	add	v1.4s,v1.4s,v19.4s
1143
1144	cbnz	x2,.Loop_hw
1145
1146	st1	{v0.4s,v1.4s},[x0]
1147
1148	ldr	x29,[sp],#16
1149	ret
1150.size	sha256_block_armv8,.-sha256_block_armv8
1151.comm	OPENSSL_armcap_P,4,4
1152