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