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