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