sha256-armv4.S revision 9838b9f4b038825b061a6b323842f9d23729eac0
1a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "arm_arch.h"
2a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
3a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch.text
4a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch.code	32
5a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
6a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch.type	K256,%object
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	5
8116680a4aac90f2aa7413d9095a592090648e557Ben MurdochK256:
9a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch.word	0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
10a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch.word	0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.word	0xd807aa98,0x12835b01,0x243185be,0x550c7dc3
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.word	0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.word	0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.word	0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.word	0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.word	0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.word	0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13
18a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch.word	0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85
19a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch.word	0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3
20a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch.word	0xd192e819,0xd6990624,0xf40e3585,0x106aa070
211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles).word	0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5
22a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch.word	0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3
23a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch.word	0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
24a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch.word	0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles).size	K256,.-K256
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.global	sha256_block_data_order
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.type	sha256_block_data_order,%function
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdochsha256_block_data_order:
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub	r3,pc,#8		@ sha256_block_data_order
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add	r2,r1,r2,lsl#6	@ len to point at the end of inp
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	stmdb	sp!,{r0,r1,r2,r4-r11,lr}
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldmia	r0,{r4,r5,r6,r7,r8,r9,r10,r11}
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub	r14,r3,#256		@ K256
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)	sub	sp,sp,#16*4		@ alloca(X[16])
36a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch.Loop:
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if __ARM_ARCH__>=7
38a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch	ldr	r3,[r1],#4
39a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#else
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)	ldrb	r3,[r1,#3]			@ 0
41a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch	ldrb	r12,[r1,#2]
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldrb	r2,[r1,#1]
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldrb	r0,[r1],#4
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	orr	r3,r3,r12,lsl#8
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	orr	r3,r3,r2,lsl#16
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	orr	r3,r3,r0,lsl#24
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
48a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch	mov	r0,r8,ror#6
49a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch	ldr	r12,[r14],#4			@ *K256++
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	eor	r0,r0,r8,ror#11
51	eor	r2,r9,r10
52#if 0>=16
53	add	r3,r3,r1			@ from BODY_16_xx
54#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
55	rev	r3,r3
56#endif
57#if 0==15
58	str	r1,[sp,#17*4]			@ leave room for r1
59#endif
60	eor	r0,r0,r8,ror#25	@ Sigma1(e)
61	and	r2,r2,r8
62	str	r3,[sp,#0*4]
63	add	r3,r3,r0
64	eor	r2,r2,r10			@ Ch(e,f,g)
65	add	r3,r3,r11
66	mov	r11,r4,ror#2
67	add	r3,r3,r2
68	eor	r11,r11,r4,ror#13
69	add	r3,r3,r12
70	eor	r11,r11,r4,ror#22		@ Sigma0(a)
71#if 0>=15
72	ldr	r1,[sp,#2*4]		@ from BODY_16_xx
73#endif
74	orr	r0,r4,r5
75	and	r2,r4,r5
76	and	r0,r0,r6
77	add	r11,r11,r3
78	orr	r0,r0,r2			@ Maj(a,b,c)
79	add	r7,r7,r3
80	add	r11,r11,r0
81#if __ARM_ARCH__>=7
82	ldr	r3,[r1],#4
83#else
84	ldrb	r3,[r1,#3]			@ 1
85	ldrb	r12,[r1,#2]
86	ldrb	r2,[r1,#1]
87	ldrb	r0,[r1],#4
88	orr	r3,r3,r12,lsl#8
89	orr	r3,r3,r2,lsl#16
90	orr	r3,r3,r0,lsl#24
91#endif
92	mov	r0,r7,ror#6
93	ldr	r12,[r14],#4			@ *K256++
94	eor	r0,r0,r7,ror#11
95	eor	r2,r8,r9
96#if 1>=16
97	add	r3,r3,r1			@ from BODY_16_xx
98#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
99	rev	r3,r3
100#endif
101#if 1==15
102	str	r1,[sp,#17*4]			@ leave room for r1
103#endif
104	eor	r0,r0,r7,ror#25	@ Sigma1(e)
105	and	r2,r2,r7
106	str	r3,[sp,#1*4]
107	add	r3,r3,r0
108	eor	r2,r2,r9			@ Ch(e,f,g)
109	add	r3,r3,r10
110	mov	r10,r11,ror#2
111	add	r3,r3,r2
112	eor	r10,r10,r11,ror#13
113	add	r3,r3,r12
114	eor	r10,r10,r11,ror#22		@ Sigma0(a)
115#if 1>=15
116	ldr	r1,[sp,#3*4]		@ from BODY_16_xx
117#endif
118	orr	r0,r11,r4
119	and	r2,r11,r4
120	and	r0,r0,r5
121	add	r10,r10,r3
122	orr	r0,r0,r2			@ Maj(a,b,c)
123	add	r6,r6,r3
124	add	r10,r10,r0
125#if __ARM_ARCH__>=7
126	ldr	r3,[r1],#4
127#else
128	ldrb	r3,[r1,#3]			@ 2
129	ldrb	r12,[r1,#2]
130	ldrb	r2,[r1,#1]
131	ldrb	r0,[r1],#4
132	orr	r3,r3,r12,lsl#8
133	orr	r3,r3,r2,lsl#16
134	orr	r3,r3,r0,lsl#24
135#endif
136	mov	r0,r6,ror#6
137	ldr	r12,[r14],#4			@ *K256++
138	eor	r0,r0,r6,ror#11
139	eor	r2,r7,r8
140#if 2>=16
141	add	r3,r3,r1			@ from BODY_16_xx
142#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
143	rev	r3,r3
144#endif
145#if 2==15
146	str	r1,[sp,#17*4]			@ leave room for r1
147#endif
148	eor	r0,r0,r6,ror#25	@ Sigma1(e)
149	and	r2,r2,r6
150	str	r3,[sp,#2*4]
151	add	r3,r3,r0
152	eor	r2,r2,r8			@ Ch(e,f,g)
153	add	r3,r3,r9
154	mov	r9,r10,ror#2
155	add	r3,r3,r2
156	eor	r9,r9,r10,ror#13
157	add	r3,r3,r12
158	eor	r9,r9,r10,ror#22		@ Sigma0(a)
159#if 2>=15
160	ldr	r1,[sp,#4*4]		@ from BODY_16_xx
161#endif
162	orr	r0,r10,r11
163	and	r2,r10,r11
164	and	r0,r0,r4
165	add	r9,r9,r3
166	orr	r0,r0,r2			@ Maj(a,b,c)
167	add	r5,r5,r3
168	add	r9,r9,r0
169#if __ARM_ARCH__>=7
170	ldr	r3,[r1],#4
171#else
172	ldrb	r3,[r1,#3]			@ 3
173	ldrb	r12,[r1,#2]
174	ldrb	r2,[r1,#1]
175	ldrb	r0,[r1],#4
176	orr	r3,r3,r12,lsl#8
177	orr	r3,r3,r2,lsl#16
178	orr	r3,r3,r0,lsl#24
179#endif
180	mov	r0,r5,ror#6
181	ldr	r12,[r14],#4			@ *K256++
182	eor	r0,r0,r5,ror#11
183	eor	r2,r6,r7
184#if 3>=16
185	add	r3,r3,r1			@ from BODY_16_xx
186#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
187	rev	r3,r3
188#endif
189#if 3==15
190	str	r1,[sp,#17*4]			@ leave room for r1
191#endif
192	eor	r0,r0,r5,ror#25	@ Sigma1(e)
193	and	r2,r2,r5
194	str	r3,[sp,#3*4]
195	add	r3,r3,r0
196	eor	r2,r2,r7			@ Ch(e,f,g)
197	add	r3,r3,r8
198	mov	r8,r9,ror#2
199	add	r3,r3,r2
200	eor	r8,r8,r9,ror#13
201	add	r3,r3,r12
202	eor	r8,r8,r9,ror#22		@ Sigma0(a)
203#if 3>=15
204	ldr	r1,[sp,#5*4]		@ from BODY_16_xx
205#endif
206	orr	r0,r9,r10
207	and	r2,r9,r10
208	and	r0,r0,r11
209	add	r8,r8,r3
210	orr	r0,r0,r2			@ Maj(a,b,c)
211	add	r4,r4,r3
212	add	r8,r8,r0
213#if __ARM_ARCH__>=7
214	ldr	r3,[r1],#4
215#else
216	ldrb	r3,[r1,#3]			@ 4
217	ldrb	r12,[r1,#2]
218	ldrb	r2,[r1,#1]
219	ldrb	r0,[r1],#4
220	orr	r3,r3,r12,lsl#8
221	orr	r3,r3,r2,lsl#16
222	orr	r3,r3,r0,lsl#24
223#endif
224	mov	r0,r4,ror#6
225	ldr	r12,[r14],#4			@ *K256++
226	eor	r0,r0,r4,ror#11
227	eor	r2,r5,r6
228#if 4>=16
229	add	r3,r3,r1			@ from BODY_16_xx
230#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
231	rev	r3,r3
232#endif
233#if 4==15
234	str	r1,[sp,#17*4]			@ leave room for r1
235#endif
236	eor	r0,r0,r4,ror#25	@ Sigma1(e)
237	and	r2,r2,r4
238	str	r3,[sp,#4*4]
239	add	r3,r3,r0
240	eor	r2,r2,r6			@ Ch(e,f,g)
241	add	r3,r3,r7
242	mov	r7,r8,ror#2
243	add	r3,r3,r2
244	eor	r7,r7,r8,ror#13
245	add	r3,r3,r12
246	eor	r7,r7,r8,ror#22		@ Sigma0(a)
247#if 4>=15
248	ldr	r1,[sp,#6*4]		@ from BODY_16_xx
249#endif
250	orr	r0,r8,r9
251	and	r2,r8,r9
252	and	r0,r0,r10
253	add	r7,r7,r3
254	orr	r0,r0,r2			@ Maj(a,b,c)
255	add	r11,r11,r3
256	add	r7,r7,r0
257#if __ARM_ARCH__>=7
258	ldr	r3,[r1],#4
259#else
260	ldrb	r3,[r1,#3]			@ 5
261	ldrb	r12,[r1,#2]
262	ldrb	r2,[r1,#1]
263	ldrb	r0,[r1],#4
264	orr	r3,r3,r12,lsl#8
265	orr	r3,r3,r2,lsl#16
266	orr	r3,r3,r0,lsl#24
267#endif
268	mov	r0,r11,ror#6
269	ldr	r12,[r14],#4			@ *K256++
270	eor	r0,r0,r11,ror#11
271	eor	r2,r4,r5
272#if 5>=16
273	add	r3,r3,r1			@ from BODY_16_xx
274#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
275	rev	r3,r3
276#endif
277#if 5==15
278	str	r1,[sp,#17*4]			@ leave room for r1
279#endif
280	eor	r0,r0,r11,ror#25	@ Sigma1(e)
281	and	r2,r2,r11
282	str	r3,[sp,#5*4]
283	add	r3,r3,r0
284	eor	r2,r2,r5			@ Ch(e,f,g)
285	add	r3,r3,r6
286	mov	r6,r7,ror#2
287	add	r3,r3,r2
288	eor	r6,r6,r7,ror#13
289	add	r3,r3,r12
290	eor	r6,r6,r7,ror#22		@ Sigma0(a)
291#if 5>=15
292	ldr	r1,[sp,#7*4]		@ from BODY_16_xx
293#endif
294	orr	r0,r7,r8
295	and	r2,r7,r8
296	and	r0,r0,r9
297	add	r6,r6,r3
298	orr	r0,r0,r2			@ Maj(a,b,c)
299	add	r10,r10,r3
300	add	r6,r6,r0
301#if __ARM_ARCH__>=7
302	ldr	r3,[r1],#4
303#else
304	ldrb	r3,[r1,#3]			@ 6
305	ldrb	r12,[r1,#2]
306	ldrb	r2,[r1,#1]
307	ldrb	r0,[r1],#4
308	orr	r3,r3,r12,lsl#8
309	orr	r3,r3,r2,lsl#16
310	orr	r3,r3,r0,lsl#24
311#endif
312	mov	r0,r10,ror#6
313	ldr	r12,[r14],#4			@ *K256++
314	eor	r0,r0,r10,ror#11
315	eor	r2,r11,r4
316#if 6>=16
317	add	r3,r3,r1			@ from BODY_16_xx
318#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
319	rev	r3,r3
320#endif
321#if 6==15
322	str	r1,[sp,#17*4]			@ leave room for r1
323#endif
324	eor	r0,r0,r10,ror#25	@ Sigma1(e)
325	and	r2,r2,r10
326	str	r3,[sp,#6*4]
327	add	r3,r3,r0
328	eor	r2,r2,r4			@ Ch(e,f,g)
329	add	r3,r3,r5
330	mov	r5,r6,ror#2
331	add	r3,r3,r2
332	eor	r5,r5,r6,ror#13
333	add	r3,r3,r12
334	eor	r5,r5,r6,ror#22		@ Sigma0(a)
335#if 6>=15
336	ldr	r1,[sp,#8*4]		@ from BODY_16_xx
337#endif
338	orr	r0,r6,r7
339	and	r2,r6,r7
340	and	r0,r0,r8
341	add	r5,r5,r3
342	orr	r0,r0,r2			@ Maj(a,b,c)
343	add	r9,r9,r3
344	add	r5,r5,r0
345#if __ARM_ARCH__>=7
346	ldr	r3,[r1],#4
347#else
348	ldrb	r3,[r1,#3]			@ 7
349	ldrb	r12,[r1,#2]
350	ldrb	r2,[r1,#1]
351	ldrb	r0,[r1],#4
352	orr	r3,r3,r12,lsl#8
353	orr	r3,r3,r2,lsl#16
354	orr	r3,r3,r0,lsl#24
355#endif
356	mov	r0,r9,ror#6
357	ldr	r12,[r14],#4			@ *K256++
358	eor	r0,r0,r9,ror#11
359	eor	r2,r10,r11
360#if 7>=16
361	add	r3,r3,r1			@ from BODY_16_xx
362#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
363	rev	r3,r3
364#endif
365#if 7==15
366	str	r1,[sp,#17*4]			@ leave room for r1
367#endif
368	eor	r0,r0,r9,ror#25	@ Sigma1(e)
369	and	r2,r2,r9
370	str	r3,[sp,#7*4]
371	add	r3,r3,r0
372	eor	r2,r2,r11			@ Ch(e,f,g)
373	add	r3,r3,r4
374	mov	r4,r5,ror#2
375	add	r3,r3,r2
376	eor	r4,r4,r5,ror#13
377	add	r3,r3,r12
378	eor	r4,r4,r5,ror#22		@ Sigma0(a)
379#if 7>=15
380	ldr	r1,[sp,#9*4]		@ from BODY_16_xx
381#endif
382	orr	r0,r5,r6
383	and	r2,r5,r6
384	and	r0,r0,r7
385	add	r4,r4,r3
386	orr	r0,r0,r2			@ Maj(a,b,c)
387	add	r8,r8,r3
388	add	r4,r4,r0
389#if __ARM_ARCH__>=7
390	ldr	r3,[r1],#4
391#else
392	ldrb	r3,[r1,#3]			@ 8
393	ldrb	r12,[r1,#2]
394	ldrb	r2,[r1,#1]
395	ldrb	r0,[r1],#4
396	orr	r3,r3,r12,lsl#8
397	orr	r3,r3,r2,lsl#16
398	orr	r3,r3,r0,lsl#24
399#endif
400	mov	r0,r8,ror#6
401	ldr	r12,[r14],#4			@ *K256++
402	eor	r0,r0,r8,ror#11
403	eor	r2,r9,r10
404#if 8>=16
405	add	r3,r3,r1			@ from BODY_16_xx
406#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
407	rev	r3,r3
408#endif
409#if 8==15
410	str	r1,[sp,#17*4]			@ leave room for r1
411#endif
412	eor	r0,r0,r8,ror#25	@ Sigma1(e)
413	and	r2,r2,r8
414	str	r3,[sp,#8*4]
415	add	r3,r3,r0
416	eor	r2,r2,r10			@ Ch(e,f,g)
417	add	r3,r3,r11
418	mov	r11,r4,ror#2
419	add	r3,r3,r2
420	eor	r11,r11,r4,ror#13
421	add	r3,r3,r12
422	eor	r11,r11,r4,ror#22		@ Sigma0(a)
423#if 8>=15
424	ldr	r1,[sp,#10*4]		@ from BODY_16_xx
425#endif
426	orr	r0,r4,r5
427	and	r2,r4,r5
428	and	r0,r0,r6
429	add	r11,r11,r3
430	orr	r0,r0,r2			@ Maj(a,b,c)
431	add	r7,r7,r3
432	add	r11,r11,r0
433#if __ARM_ARCH__>=7
434	ldr	r3,[r1],#4
435#else
436	ldrb	r3,[r1,#3]			@ 9
437	ldrb	r12,[r1,#2]
438	ldrb	r2,[r1,#1]
439	ldrb	r0,[r1],#4
440	orr	r3,r3,r12,lsl#8
441	orr	r3,r3,r2,lsl#16
442	orr	r3,r3,r0,lsl#24
443#endif
444	mov	r0,r7,ror#6
445	ldr	r12,[r14],#4			@ *K256++
446	eor	r0,r0,r7,ror#11
447	eor	r2,r8,r9
448#if 9>=16
449	add	r3,r3,r1			@ from BODY_16_xx
450#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
451	rev	r3,r3
452#endif
453#if 9==15
454	str	r1,[sp,#17*4]			@ leave room for r1
455#endif
456	eor	r0,r0,r7,ror#25	@ Sigma1(e)
457	and	r2,r2,r7
458	str	r3,[sp,#9*4]
459	add	r3,r3,r0
460	eor	r2,r2,r9			@ Ch(e,f,g)
461	add	r3,r3,r10
462	mov	r10,r11,ror#2
463	add	r3,r3,r2
464	eor	r10,r10,r11,ror#13
465	add	r3,r3,r12
466	eor	r10,r10,r11,ror#22		@ Sigma0(a)
467#if 9>=15
468	ldr	r1,[sp,#11*4]		@ from BODY_16_xx
469#endif
470	orr	r0,r11,r4
471	and	r2,r11,r4
472	and	r0,r0,r5
473	add	r10,r10,r3
474	orr	r0,r0,r2			@ Maj(a,b,c)
475	add	r6,r6,r3
476	add	r10,r10,r0
477#if __ARM_ARCH__>=7
478	ldr	r3,[r1],#4
479#else
480	ldrb	r3,[r1,#3]			@ 10
481	ldrb	r12,[r1,#2]
482	ldrb	r2,[r1,#1]
483	ldrb	r0,[r1],#4
484	orr	r3,r3,r12,lsl#8
485	orr	r3,r3,r2,lsl#16
486	orr	r3,r3,r0,lsl#24
487#endif
488	mov	r0,r6,ror#6
489	ldr	r12,[r14],#4			@ *K256++
490	eor	r0,r0,r6,ror#11
491	eor	r2,r7,r8
492#if 10>=16
493	add	r3,r3,r1			@ from BODY_16_xx
494#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
495	rev	r3,r3
496#endif
497#if 10==15
498	str	r1,[sp,#17*4]			@ leave room for r1
499#endif
500	eor	r0,r0,r6,ror#25	@ Sigma1(e)
501	and	r2,r2,r6
502	str	r3,[sp,#10*4]
503	add	r3,r3,r0
504	eor	r2,r2,r8			@ Ch(e,f,g)
505	add	r3,r3,r9
506	mov	r9,r10,ror#2
507	add	r3,r3,r2
508	eor	r9,r9,r10,ror#13
509	add	r3,r3,r12
510	eor	r9,r9,r10,ror#22		@ Sigma0(a)
511#if 10>=15
512	ldr	r1,[sp,#12*4]		@ from BODY_16_xx
513#endif
514	orr	r0,r10,r11
515	and	r2,r10,r11
516	and	r0,r0,r4
517	add	r9,r9,r3
518	orr	r0,r0,r2			@ Maj(a,b,c)
519	add	r5,r5,r3
520	add	r9,r9,r0
521#if __ARM_ARCH__>=7
522	ldr	r3,[r1],#4
523#else
524	ldrb	r3,[r1,#3]			@ 11
525	ldrb	r12,[r1,#2]
526	ldrb	r2,[r1,#1]
527	ldrb	r0,[r1],#4
528	orr	r3,r3,r12,lsl#8
529	orr	r3,r3,r2,lsl#16
530	orr	r3,r3,r0,lsl#24
531#endif
532	mov	r0,r5,ror#6
533	ldr	r12,[r14],#4			@ *K256++
534	eor	r0,r0,r5,ror#11
535	eor	r2,r6,r7
536#if 11>=16
537	add	r3,r3,r1			@ from BODY_16_xx
538#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
539	rev	r3,r3
540#endif
541#if 11==15
542	str	r1,[sp,#17*4]			@ leave room for r1
543#endif
544	eor	r0,r0,r5,ror#25	@ Sigma1(e)
545	and	r2,r2,r5
546	str	r3,[sp,#11*4]
547	add	r3,r3,r0
548	eor	r2,r2,r7			@ Ch(e,f,g)
549	add	r3,r3,r8
550	mov	r8,r9,ror#2
551	add	r3,r3,r2
552	eor	r8,r8,r9,ror#13
553	add	r3,r3,r12
554	eor	r8,r8,r9,ror#22		@ Sigma0(a)
555#if 11>=15
556	ldr	r1,[sp,#13*4]		@ from BODY_16_xx
557#endif
558	orr	r0,r9,r10
559	and	r2,r9,r10
560	and	r0,r0,r11
561	add	r8,r8,r3
562	orr	r0,r0,r2			@ Maj(a,b,c)
563	add	r4,r4,r3
564	add	r8,r8,r0
565#if __ARM_ARCH__>=7
566	ldr	r3,[r1],#4
567#else
568	ldrb	r3,[r1,#3]			@ 12
569	ldrb	r12,[r1,#2]
570	ldrb	r2,[r1,#1]
571	ldrb	r0,[r1],#4
572	orr	r3,r3,r12,lsl#8
573	orr	r3,r3,r2,lsl#16
574	orr	r3,r3,r0,lsl#24
575#endif
576	mov	r0,r4,ror#6
577	ldr	r12,[r14],#4			@ *K256++
578	eor	r0,r0,r4,ror#11
579	eor	r2,r5,r6
580#if 12>=16
581	add	r3,r3,r1			@ from BODY_16_xx
582#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
583	rev	r3,r3
584#endif
585#if 12==15
586	str	r1,[sp,#17*4]			@ leave room for r1
587#endif
588	eor	r0,r0,r4,ror#25	@ Sigma1(e)
589	and	r2,r2,r4
590	str	r3,[sp,#12*4]
591	add	r3,r3,r0
592	eor	r2,r2,r6			@ Ch(e,f,g)
593	add	r3,r3,r7
594	mov	r7,r8,ror#2
595	add	r3,r3,r2
596	eor	r7,r7,r8,ror#13
597	add	r3,r3,r12
598	eor	r7,r7,r8,ror#22		@ Sigma0(a)
599#if 12>=15
600	ldr	r1,[sp,#14*4]		@ from BODY_16_xx
601#endif
602	orr	r0,r8,r9
603	and	r2,r8,r9
604	and	r0,r0,r10
605	add	r7,r7,r3
606	orr	r0,r0,r2			@ Maj(a,b,c)
607	add	r11,r11,r3
608	add	r7,r7,r0
609#if __ARM_ARCH__>=7
610	ldr	r3,[r1],#4
611#else
612	ldrb	r3,[r1,#3]			@ 13
613	ldrb	r12,[r1,#2]
614	ldrb	r2,[r1,#1]
615	ldrb	r0,[r1],#4
616	orr	r3,r3,r12,lsl#8
617	orr	r3,r3,r2,lsl#16
618	orr	r3,r3,r0,lsl#24
619#endif
620	mov	r0,r11,ror#6
621	ldr	r12,[r14],#4			@ *K256++
622	eor	r0,r0,r11,ror#11
623	eor	r2,r4,r5
624#if 13>=16
625	add	r3,r3,r1			@ from BODY_16_xx
626#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
627	rev	r3,r3
628#endif
629#if 13==15
630	str	r1,[sp,#17*4]			@ leave room for r1
631#endif
632	eor	r0,r0,r11,ror#25	@ Sigma1(e)
633	and	r2,r2,r11
634	str	r3,[sp,#13*4]
635	add	r3,r3,r0
636	eor	r2,r2,r5			@ Ch(e,f,g)
637	add	r3,r3,r6
638	mov	r6,r7,ror#2
639	add	r3,r3,r2
640	eor	r6,r6,r7,ror#13
641	add	r3,r3,r12
642	eor	r6,r6,r7,ror#22		@ Sigma0(a)
643#if 13>=15
644	ldr	r1,[sp,#15*4]		@ from BODY_16_xx
645#endif
646	orr	r0,r7,r8
647	and	r2,r7,r8
648	and	r0,r0,r9
649	add	r6,r6,r3
650	orr	r0,r0,r2			@ Maj(a,b,c)
651	add	r10,r10,r3
652	add	r6,r6,r0
653#if __ARM_ARCH__>=7
654	ldr	r3,[r1],#4
655#else
656	ldrb	r3,[r1,#3]			@ 14
657	ldrb	r12,[r1,#2]
658	ldrb	r2,[r1,#1]
659	ldrb	r0,[r1],#4
660	orr	r3,r3,r12,lsl#8
661	orr	r3,r3,r2,lsl#16
662	orr	r3,r3,r0,lsl#24
663#endif
664	mov	r0,r10,ror#6
665	ldr	r12,[r14],#4			@ *K256++
666	eor	r0,r0,r10,ror#11
667	eor	r2,r11,r4
668#if 14>=16
669	add	r3,r3,r1			@ from BODY_16_xx
670#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
671	rev	r3,r3
672#endif
673#if 14==15
674	str	r1,[sp,#17*4]			@ leave room for r1
675#endif
676	eor	r0,r0,r10,ror#25	@ Sigma1(e)
677	and	r2,r2,r10
678	str	r3,[sp,#14*4]
679	add	r3,r3,r0
680	eor	r2,r2,r4			@ Ch(e,f,g)
681	add	r3,r3,r5
682	mov	r5,r6,ror#2
683	add	r3,r3,r2
684	eor	r5,r5,r6,ror#13
685	add	r3,r3,r12
686	eor	r5,r5,r6,ror#22		@ Sigma0(a)
687#if 14>=15
688	ldr	r1,[sp,#0*4]		@ from BODY_16_xx
689#endif
690	orr	r0,r6,r7
691	and	r2,r6,r7
692	and	r0,r0,r8
693	add	r5,r5,r3
694	orr	r0,r0,r2			@ Maj(a,b,c)
695	add	r9,r9,r3
696	add	r5,r5,r0
697#if __ARM_ARCH__>=7
698	ldr	r3,[r1],#4
699#else
700	ldrb	r3,[r1,#3]			@ 15
701	ldrb	r12,[r1,#2]
702	ldrb	r2,[r1,#1]
703	ldrb	r0,[r1],#4
704	orr	r3,r3,r12,lsl#8
705	orr	r3,r3,r2,lsl#16
706	orr	r3,r3,r0,lsl#24
707#endif
708	mov	r0,r9,ror#6
709	ldr	r12,[r14],#4			@ *K256++
710	eor	r0,r0,r9,ror#11
711	eor	r2,r10,r11
712#if 15>=16
713	add	r3,r3,r1			@ from BODY_16_xx
714#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
715	rev	r3,r3
716#endif
717#if 15==15
718	str	r1,[sp,#17*4]			@ leave room for r1
719#endif
720	eor	r0,r0,r9,ror#25	@ Sigma1(e)
721	and	r2,r2,r9
722	str	r3,[sp,#15*4]
723	add	r3,r3,r0
724	eor	r2,r2,r11			@ Ch(e,f,g)
725	add	r3,r3,r4
726	mov	r4,r5,ror#2
727	add	r3,r3,r2
728	eor	r4,r4,r5,ror#13
729	add	r3,r3,r12
730	eor	r4,r4,r5,ror#22		@ Sigma0(a)
731#if 15>=15
732	ldr	r1,[sp,#1*4]		@ from BODY_16_xx
733#endif
734	orr	r0,r5,r6
735	and	r2,r5,r6
736	and	r0,r0,r7
737	add	r4,r4,r3
738	orr	r0,r0,r2			@ Maj(a,b,c)
739	add	r8,r8,r3
740	add	r4,r4,r0
741.Lrounds_16_xx:
742	@ ldr	r1,[sp,#1*4]		@ 16
743	ldr	r12,[sp,#14*4]
744	mov	r0,r1,ror#7
745	ldr	r3,[sp,#0*4]
746	eor	r0,r0,r1,ror#18
747	ldr	r2,[sp,#9*4]
748	eor	r0,r0,r1,lsr#3	@ sigma0(X[i+1])
749	mov	r1,r12,ror#17
750	add	r3,r3,r0
751	eor	r1,r1,r12,ror#19
752	add	r3,r3,r2
753	eor	r1,r1,r12,lsr#10	@ sigma1(X[i+14])
754	@ add	r3,r3,r1
755	mov	r0,r8,ror#6
756	ldr	r12,[r14],#4			@ *K256++
757	eor	r0,r0,r8,ror#11
758	eor	r2,r9,r10
759#if 16>=16
760	add	r3,r3,r1			@ from BODY_16_xx
761#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
762	rev	r3,r3
763#endif
764#if 16==15
765	str	r1,[sp,#17*4]			@ leave room for r1
766#endif
767	eor	r0,r0,r8,ror#25	@ Sigma1(e)
768	and	r2,r2,r8
769	str	r3,[sp,#0*4]
770	add	r3,r3,r0
771	eor	r2,r2,r10			@ Ch(e,f,g)
772	add	r3,r3,r11
773	mov	r11,r4,ror#2
774	add	r3,r3,r2
775	eor	r11,r11,r4,ror#13
776	add	r3,r3,r12
777	eor	r11,r11,r4,ror#22		@ Sigma0(a)
778#if 16>=15
779	ldr	r1,[sp,#2*4]		@ from BODY_16_xx
780#endif
781	orr	r0,r4,r5
782	and	r2,r4,r5
783	and	r0,r0,r6
784	add	r11,r11,r3
785	orr	r0,r0,r2			@ Maj(a,b,c)
786	add	r7,r7,r3
787	add	r11,r11,r0
788	@ ldr	r1,[sp,#2*4]		@ 17
789	ldr	r12,[sp,#15*4]
790	mov	r0,r1,ror#7
791	ldr	r3,[sp,#1*4]
792	eor	r0,r0,r1,ror#18
793	ldr	r2,[sp,#10*4]
794	eor	r0,r0,r1,lsr#3	@ sigma0(X[i+1])
795	mov	r1,r12,ror#17
796	add	r3,r3,r0
797	eor	r1,r1,r12,ror#19
798	add	r3,r3,r2
799	eor	r1,r1,r12,lsr#10	@ sigma1(X[i+14])
800	@ add	r3,r3,r1
801	mov	r0,r7,ror#6
802	ldr	r12,[r14],#4			@ *K256++
803	eor	r0,r0,r7,ror#11
804	eor	r2,r8,r9
805#if 17>=16
806	add	r3,r3,r1			@ from BODY_16_xx
807#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
808	rev	r3,r3
809#endif
810#if 17==15
811	str	r1,[sp,#17*4]			@ leave room for r1
812#endif
813	eor	r0,r0,r7,ror#25	@ Sigma1(e)
814	and	r2,r2,r7
815	str	r3,[sp,#1*4]
816	add	r3,r3,r0
817	eor	r2,r2,r9			@ Ch(e,f,g)
818	add	r3,r3,r10
819	mov	r10,r11,ror#2
820	add	r3,r3,r2
821	eor	r10,r10,r11,ror#13
822	add	r3,r3,r12
823	eor	r10,r10,r11,ror#22		@ Sigma0(a)
824#if 17>=15
825	ldr	r1,[sp,#3*4]		@ from BODY_16_xx
826#endif
827	orr	r0,r11,r4
828	and	r2,r11,r4
829	and	r0,r0,r5
830	add	r10,r10,r3
831	orr	r0,r0,r2			@ Maj(a,b,c)
832	add	r6,r6,r3
833	add	r10,r10,r0
834	@ ldr	r1,[sp,#3*4]		@ 18
835	ldr	r12,[sp,#0*4]
836	mov	r0,r1,ror#7
837	ldr	r3,[sp,#2*4]
838	eor	r0,r0,r1,ror#18
839	ldr	r2,[sp,#11*4]
840	eor	r0,r0,r1,lsr#3	@ sigma0(X[i+1])
841	mov	r1,r12,ror#17
842	add	r3,r3,r0
843	eor	r1,r1,r12,ror#19
844	add	r3,r3,r2
845	eor	r1,r1,r12,lsr#10	@ sigma1(X[i+14])
846	@ add	r3,r3,r1
847	mov	r0,r6,ror#6
848	ldr	r12,[r14],#4			@ *K256++
849	eor	r0,r0,r6,ror#11
850	eor	r2,r7,r8
851#if 18>=16
852	add	r3,r3,r1			@ from BODY_16_xx
853#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
854	rev	r3,r3
855#endif
856#if 18==15
857	str	r1,[sp,#17*4]			@ leave room for r1
858#endif
859	eor	r0,r0,r6,ror#25	@ Sigma1(e)
860	and	r2,r2,r6
861	str	r3,[sp,#2*4]
862	add	r3,r3,r0
863	eor	r2,r2,r8			@ Ch(e,f,g)
864	add	r3,r3,r9
865	mov	r9,r10,ror#2
866	add	r3,r3,r2
867	eor	r9,r9,r10,ror#13
868	add	r3,r3,r12
869	eor	r9,r9,r10,ror#22		@ Sigma0(a)
870#if 18>=15
871	ldr	r1,[sp,#4*4]		@ from BODY_16_xx
872#endif
873	orr	r0,r10,r11
874	and	r2,r10,r11
875	and	r0,r0,r4
876	add	r9,r9,r3
877	orr	r0,r0,r2			@ Maj(a,b,c)
878	add	r5,r5,r3
879	add	r9,r9,r0
880	@ ldr	r1,[sp,#4*4]		@ 19
881	ldr	r12,[sp,#1*4]
882	mov	r0,r1,ror#7
883	ldr	r3,[sp,#3*4]
884	eor	r0,r0,r1,ror#18
885	ldr	r2,[sp,#12*4]
886	eor	r0,r0,r1,lsr#3	@ sigma0(X[i+1])
887	mov	r1,r12,ror#17
888	add	r3,r3,r0
889	eor	r1,r1,r12,ror#19
890	add	r3,r3,r2
891	eor	r1,r1,r12,lsr#10	@ sigma1(X[i+14])
892	@ add	r3,r3,r1
893	mov	r0,r5,ror#6
894	ldr	r12,[r14],#4			@ *K256++
895	eor	r0,r0,r5,ror#11
896	eor	r2,r6,r7
897#if 19>=16
898	add	r3,r3,r1			@ from BODY_16_xx
899#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
900	rev	r3,r3
901#endif
902#if 19==15
903	str	r1,[sp,#17*4]			@ leave room for r1
904#endif
905	eor	r0,r0,r5,ror#25	@ Sigma1(e)
906	and	r2,r2,r5
907	str	r3,[sp,#3*4]
908	add	r3,r3,r0
909	eor	r2,r2,r7			@ Ch(e,f,g)
910	add	r3,r3,r8
911	mov	r8,r9,ror#2
912	add	r3,r3,r2
913	eor	r8,r8,r9,ror#13
914	add	r3,r3,r12
915	eor	r8,r8,r9,ror#22		@ Sigma0(a)
916#if 19>=15
917	ldr	r1,[sp,#5*4]		@ from BODY_16_xx
918#endif
919	orr	r0,r9,r10
920	and	r2,r9,r10
921	and	r0,r0,r11
922	add	r8,r8,r3
923	orr	r0,r0,r2			@ Maj(a,b,c)
924	add	r4,r4,r3
925	add	r8,r8,r0
926	@ ldr	r1,[sp,#5*4]		@ 20
927	ldr	r12,[sp,#2*4]
928	mov	r0,r1,ror#7
929	ldr	r3,[sp,#4*4]
930	eor	r0,r0,r1,ror#18
931	ldr	r2,[sp,#13*4]
932	eor	r0,r0,r1,lsr#3	@ sigma0(X[i+1])
933	mov	r1,r12,ror#17
934	add	r3,r3,r0
935	eor	r1,r1,r12,ror#19
936	add	r3,r3,r2
937	eor	r1,r1,r12,lsr#10	@ sigma1(X[i+14])
938	@ add	r3,r3,r1
939	mov	r0,r4,ror#6
940	ldr	r12,[r14],#4			@ *K256++
941	eor	r0,r0,r4,ror#11
942	eor	r2,r5,r6
943#if 20>=16
944	add	r3,r3,r1			@ from BODY_16_xx
945#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
946	rev	r3,r3
947#endif
948#if 20==15
949	str	r1,[sp,#17*4]			@ leave room for r1
950#endif
951	eor	r0,r0,r4,ror#25	@ Sigma1(e)
952	and	r2,r2,r4
953	str	r3,[sp,#4*4]
954	add	r3,r3,r0
955	eor	r2,r2,r6			@ Ch(e,f,g)
956	add	r3,r3,r7
957	mov	r7,r8,ror#2
958	add	r3,r3,r2
959	eor	r7,r7,r8,ror#13
960	add	r3,r3,r12
961	eor	r7,r7,r8,ror#22		@ Sigma0(a)
962#if 20>=15
963	ldr	r1,[sp,#6*4]		@ from BODY_16_xx
964#endif
965	orr	r0,r8,r9
966	and	r2,r8,r9
967	and	r0,r0,r10
968	add	r7,r7,r3
969	orr	r0,r0,r2			@ Maj(a,b,c)
970	add	r11,r11,r3
971	add	r7,r7,r0
972	@ ldr	r1,[sp,#6*4]		@ 21
973	ldr	r12,[sp,#3*4]
974	mov	r0,r1,ror#7
975	ldr	r3,[sp,#5*4]
976	eor	r0,r0,r1,ror#18
977	ldr	r2,[sp,#14*4]
978	eor	r0,r0,r1,lsr#3	@ sigma0(X[i+1])
979	mov	r1,r12,ror#17
980	add	r3,r3,r0
981	eor	r1,r1,r12,ror#19
982	add	r3,r3,r2
983	eor	r1,r1,r12,lsr#10	@ sigma1(X[i+14])
984	@ add	r3,r3,r1
985	mov	r0,r11,ror#6
986	ldr	r12,[r14],#4			@ *K256++
987	eor	r0,r0,r11,ror#11
988	eor	r2,r4,r5
989#if 21>=16
990	add	r3,r3,r1			@ from BODY_16_xx
991#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
992	rev	r3,r3
993#endif
994#if 21==15
995	str	r1,[sp,#17*4]			@ leave room for r1
996#endif
997	eor	r0,r0,r11,ror#25	@ Sigma1(e)
998	and	r2,r2,r11
999	str	r3,[sp,#5*4]
1000	add	r3,r3,r0
1001	eor	r2,r2,r5			@ Ch(e,f,g)
1002	add	r3,r3,r6
1003	mov	r6,r7,ror#2
1004	add	r3,r3,r2
1005	eor	r6,r6,r7,ror#13
1006	add	r3,r3,r12
1007	eor	r6,r6,r7,ror#22		@ Sigma0(a)
1008#if 21>=15
1009	ldr	r1,[sp,#7*4]		@ from BODY_16_xx
1010#endif
1011	orr	r0,r7,r8
1012	and	r2,r7,r8
1013	and	r0,r0,r9
1014	add	r6,r6,r3
1015	orr	r0,r0,r2			@ Maj(a,b,c)
1016	add	r10,r10,r3
1017	add	r6,r6,r0
1018	@ ldr	r1,[sp,#7*4]		@ 22
1019	ldr	r12,[sp,#4*4]
1020	mov	r0,r1,ror#7
1021	ldr	r3,[sp,#6*4]
1022	eor	r0,r0,r1,ror#18
1023	ldr	r2,[sp,#15*4]
1024	eor	r0,r0,r1,lsr#3	@ sigma0(X[i+1])
1025	mov	r1,r12,ror#17
1026	add	r3,r3,r0
1027	eor	r1,r1,r12,ror#19
1028	add	r3,r3,r2
1029	eor	r1,r1,r12,lsr#10	@ sigma1(X[i+14])
1030	@ add	r3,r3,r1
1031	mov	r0,r10,ror#6
1032	ldr	r12,[r14],#4			@ *K256++
1033	eor	r0,r0,r10,ror#11
1034	eor	r2,r11,r4
1035#if 22>=16
1036	add	r3,r3,r1			@ from BODY_16_xx
1037#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
1038	rev	r3,r3
1039#endif
1040#if 22==15
1041	str	r1,[sp,#17*4]			@ leave room for r1
1042#endif
1043	eor	r0,r0,r10,ror#25	@ Sigma1(e)
1044	and	r2,r2,r10
1045	str	r3,[sp,#6*4]
1046	add	r3,r3,r0
1047	eor	r2,r2,r4			@ Ch(e,f,g)
1048	add	r3,r3,r5
1049	mov	r5,r6,ror#2
1050	add	r3,r3,r2
1051	eor	r5,r5,r6,ror#13
1052	add	r3,r3,r12
1053	eor	r5,r5,r6,ror#22		@ Sigma0(a)
1054#if 22>=15
1055	ldr	r1,[sp,#8*4]		@ from BODY_16_xx
1056#endif
1057	orr	r0,r6,r7
1058	and	r2,r6,r7
1059	and	r0,r0,r8
1060	add	r5,r5,r3
1061	orr	r0,r0,r2			@ Maj(a,b,c)
1062	add	r9,r9,r3
1063	add	r5,r5,r0
1064	@ ldr	r1,[sp,#8*4]		@ 23
1065	ldr	r12,[sp,#5*4]
1066	mov	r0,r1,ror#7
1067	ldr	r3,[sp,#7*4]
1068	eor	r0,r0,r1,ror#18
1069	ldr	r2,[sp,#0*4]
1070	eor	r0,r0,r1,lsr#3	@ sigma0(X[i+1])
1071	mov	r1,r12,ror#17
1072	add	r3,r3,r0
1073	eor	r1,r1,r12,ror#19
1074	add	r3,r3,r2
1075	eor	r1,r1,r12,lsr#10	@ sigma1(X[i+14])
1076	@ add	r3,r3,r1
1077	mov	r0,r9,ror#6
1078	ldr	r12,[r14],#4			@ *K256++
1079	eor	r0,r0,r9,ror#11
1080	eor	r2,r10,r11
1081#if 23>=16
1082	add	r3,r3,r1			@ from BODY_16_xx
1083#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
1084	rev	r3,r3
1085#endif
1086#if 23==15
1087	str	r1,[sp,#17*4]			@ leave room for r1
1088#endif
1089	eor	r0,r0,r9,ror#25	@ Sigma1(e)
1090	and	r2,r2,r9
1091	str	r3,[sp,#7*4]
1092	add	r3,r3,r0
1093	eor	r2,r2,r11			@ Ch(e,f,g)
1094	add	r3,r3,r4
1095	mov	r4,r5,ror#2
1096	add	r3,r3,r2
1097	eor	r4,r4,r5,ror#13
1098	add	r3,r3,r12
1099	eor	r4,r4,r5,ror#22		@ Sigma0(a)
1100#if 23>=15
1101	ldr	r1,[sp,#9*4]		@ from BODY_16_xx
1102#endif
1103	orr	r0,r5,r6
1104	and	r2,r5,r6
1105	and	r0,r0,r7
1106	add	r4,r4,r3
1107	orr	r0,r0,r2			@ Maj(a,b,c)
1108	add	r8,r8,r3
1109	add	r4,r4,r0
1110	@ ldr	r1,[sp,#9*4]		@ 24
1111	ldr	r12,[sp,#6*4]
1112	mov	r0,r1,ror#7
1113	ldr	r3,[sp,#8*4]
1114	eor	r0,r0,r1,ror#18
1115	ldr	r2,[sp,#1*4]
1116	eor	r0,r0,r1,lsr#3	@ sigma0(X[i+1])
1117	mov	r1,r12,ror#17
1118	add	r3,r3,r0
1119	eor	r1,r1,r12,ror#19
1120	add	r3,r3,r2
1121	eor	r1,r1,r12,lsr#10	@ sigma1(X[i+14])
1122	@ add	r3,r3,r1
1123	mov	r0,r8,ror#6
1124	ldr	r12,[r14],#4			@ *K256++
1125	eor	r0,r0,r8,ror#11
1126	eor	r2,r9,r10
1127#if 24>=16
1128	add	r3,r3,r1			@ from BODY_16_xx
1129#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
1130	rev	r3,r3
1131#endif
1132#if 24==15
1133	str	r1,[sp,#17*4]			@ leave room for r1
1134#endif
1135	eor	r0,r0,r8,ror#25	@ Sigma1(e)
1136	and	r2,r2,r8
1137	str	r3,[sp,#8*4]
1138	add	r3,r3,r0
1139	eor	r2,r2,r10			@ Ch(e,f,g)
1140	add	r3,r3,r11
1141	mov	r11,r4,ror#2
1142	add	r3,r3,r2
1143	eor	r11,r11,r4,ror#13
1144	add	r3,r3,r12
1145	eor	r11,r11,r4,ror#22		@ Sigma0(a)
1146#if 24>=15
1147	ldr	r1,[sp,#10*4]		@ from BODY_16_xx
1148#endif
1149	orr	r0,r4,r5
1150	and	r2,r4,r5
1151	and	r0,r0,r6
1152	add	r11,r11,r3
1153	orr	r0,r0,r2			@ Maj(a,b,c)
1154	add	r7,r7,r3
1155	add	r11,r11,r0
1156	@ ldr	r1,[sp,#10*4]		@ 25
1157	ldr	r12,[sp,#7*4]
1158	mov	r0,r1,ror#7
1159	ldr	r3,[sp,#9*4]
1160	eor	r0,r0,r1,ror#18
1161	ldr	r2,[sp,#2*4]
1162	eor	r0,r0,r1,lsr#3	@ sigma0(X[i+1])
1163	mov	r1,r12,ror#17
1164	add	r3,r3,r0
1165	eor	r1,r1,r12,ror#19
1166	add	r3,r3,r2
1167	eor	r1,r1,r12,lsr#10	@ sigma1(X[i+14])
1168	@ add	r3,r3,r1
1169	mov	r0,r7,ror#6
1170	ldr	r12,[r14],#4			@ *K256++
1171	eor	r0,r0,r7,ror#11
1172	eor	r2,r8,r9
1173#if 25>=16
1174	add	r3,r3,r1			@ from BODY_16_xx
1175#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
1176	rev	r3,r3
1177#endif
1178#if 25==15
1179	str	r1,[sp,#17*4]			@ leave room for r1
1180#endif
1181	eor	r0,r0,r7,ror#25	@ Sigma1(e)
1182	and	r2,r2,r7
1183	str	r3,[sp,#9*4]
1184	add	r3,r3,r0
1185	eor	r2,r2,r9			@ Ch(e,f,g)
1186	add	r3,r3,r10
1187	mov	r10,r11,ror#2
1188	add	r3,r3,r2
1189	eor	r10,r10,r11,ror#13
1190	add	r3,r3,r12
1191	eor	r10,r10,r11,ror#22		@ Sigma0(a)
1192#if 25>=15
1193	ldr	r1,[sp,#11*4]		@ from BODY_16_xx
1194#endif
1195	orr	r0,r11,r4
1196	and	r2,r11,r4
1197	and	r0,r0,r5
1198	add	r10,r10,r3
1199	orr	r0,r0,r2			@ Maj(a,b,c)
1200	add	r6,r6,r3
1201	add	r10,r10,r0
1202	@ ldr	r1,[sp,#11*4]		@ 26
1203	ldr	r12,[sp,#8*4]
1204	mov	r0,r1,ror#7
1205	ldr	r3,[sp,#10*4]
1206	eor	r0,r0,r1,ror#18
1207	ldr	r2,[sp,#3*4]
1208	eor	r0,r0,r1,lsr#3	@ sigma0(X[i+1])
1209	mov	r1,r12,ror#17
1210	add	r3,r3,r0
1211	eor	r1,r1,r12,ror#19
1212	add	r3,r3,r2
1213	eor	r1,r1,r12,lsr#10	@ sigma1(X[i+14])
1214	@ add	r3,r3,r1
1215	mov	r0,r6,ror#6
1216	ldr	r12,[r14],#4			@ *K256++
1217	eor	r0,r0,r6,ror#11
1218	eor	r2,r7,r8
1219#if 26>=16
1220	add	r3,r3,r1			@ from BODY_16_xx
1221#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
1222	rev	r3,r3
1223#endif
1224#if 26==15
1225	str	r1,[sp,#17*4]			@ leave room for r1
1226#endif
1227	eor	r0,r0,r6,ror#25	@ Sigma1(e)
1228	and	r2,r2,r6
1229	str	r3,[sp,#10*4]
1230	add	r3,r3,r0
1231	eor	r2,r2,r8			@ Ch(e,f,g)
1232	add	r3,r3,r9
1233	mov	r9,r10,ror#2
1234	add	r3,r3,r2
1235	eor	r9,r9,r10,ror#13
1236	add	r3,r3,r12
1237	eor	r9,r9,r10,ror#22		@ Sigma0(a)
1238#if 26>=15
1239	ldr	r1,[sp,#12*4]		@ from BODY_16_xx
1240#endif
1241	orr	r0,r10,r11
1242	and	r2,r10,r11
1243	and	r0,r0,r4
1244	add	r9,r9,r3
1245	orr	r0,r0,r2			@ Maj(a,b,c)
1246	add	r5,r5,r3
1247	add	r9,r9,r0
1248	@ ldr	r1,[sp,#12*4]		@ 27
1249	ldr	r12,[sp,#9*4]
1250	mov	r0,r1,ror#7
1251	ldr	r3,[sp,#11*4]
1252	eor	r0,r0,r1,ror#18
1253	ldr	r2,[sp,#4*4]
1254	eor	r0,r0,r1,lsr#3	@ sigma0(X[i+1])
1255	mov	r1,r12,ror#17
1256	add	r3,r3,r0
1257	eor	r1,r1,r12,ror#19
1258	add	r3,r3,r2
1259	eor	r1,r1,r12,lsr#10	@ sigma1(X[i+14])
1260	@ add	r3,r3,r1
1261	mov	r0,r5,ror#6
1262	ldr	r12,[r14],#4			@ *K256++
1263	eor	r0,r0,r5,ror#11
1264	eor	r2,r6,r7
1265#if 27>=16
1266	add	r3,r3,r1			@ from BODY_16_xx
1267#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
1268	rev	r3,r3
1269#endif
1270#if 27==15
1271	str	r1,[sp,#17*4]			@ leave room for r1
1272#endif
1273	eor	r0,r0,r5,ror#25	@ Sigma1(e)
1274	and	r2,r2,r5
1275	str	r3,[sp,#11*4]
1276	add	r3,r3,r0
1277	eor	r2,r2,r7			@ Ch(e,f,g)
1278	add	r3,r3,r8
1279	mov	r8,r9,ror#2
1280	add	r3,r3,r2
1281	eor	r8,r8,r9,ror#13
1282	add	r3,r3,r12
1283	eor	r8,r8,r9,ror#22		@ Sigma0(a)
1284#if 27>=15
1285	ldr	r1,[sp,#13*4]		@ from BODY_16_xx
1286#endif
1287	orr	r0,r9,r10
1288	and	r2,r9,r10
1289	and	r0,r0,r11
1290	add	r8,r8,r3
1291	orr	r0,r0,r2			@ Maj(a,b,c)
1292	add	r4,r4,r3
1293	add	r8,r8,r0
1294	@ ldr	r1,[sp,#13*4]		@ 28
1295	ldr	r12,[sp,#10*4]
1296	mov	r0,r1,ror#7
1297	ldr	r3,[sp,#12*4]
1298	eor	r0,r0,r1,ror#18
1299	ldr	r2,[sp,#5*4]
1300	eor	r0,r0,r1,lsr#3	@ sigma0(X[i+1])
1301	mov	r1,r12,ror#17
1302	add	r3,r3,r0
1303	eor	r1,r1,r12,ror#19
1304	add	r3,r3,r2
1305	eor	r1,r1,r12,lsr#10	@ sigma1(X[i+14])
1306	@ add	r3,r3,r1
1307	mov	r0,r4,ror#6
1308	ldr	r12,[r14],#4			@ *K256++
1309	eor	r0,r0,r4,ror#11
1310	eor	r2,r5,r6
1311#if 28>=16
1312	add	r3,r3,r1			@ from BODY_16_xx
1313#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
1314	rev	r3,r3
1315#endif
1316#if 28==15
1317	str	r1,[sp,#17*4]			@ leave room for r1
1318#endif
1319	eor	r0,r0,r4,ror#25	@ Sigma1(e)
1320	and	r2,r2,r4
1321	str	r3,[sp,#12*4]
1322	add	r3,r3,r0
1323	eor	r2,r2,r6			@ Ch(e,f,g)
1324	add	r3,r3,r7
1325	mov	r7,r8,ror#2
1326	add	r3,r3,r2
1327	eor	r7,r7,r8,ror#13
1328	add	r3,r3,r12
1329	eor	r7,r7,r8,ror#22		@ Sigma0(a)
1330#if 28>=15
1331	ldr	r1,[sp,#14*4]		@ from BODY_16_xx
1332#endif
1333	orr	r0,r8,r9
1334	and	r2,r8,r9
1335	and	r0,r0,r10
1336	add	r7,r7,r3
1337	orr	r0,r0,r2			@ Maj(a,b,c)
1338	add	r11,r11,r3
1339	add	r7,r7,r0
1340	@ ldr	r1,[sp,#14*4]		@ 29
1341	ldr	r12,[sp,#11*4]
1342	mov	r0,r1,ror#7
1343	ldr	r3,[sp,#13*4]
1344	eor	r0,r0,r1,ror#18
1345	ldr	r2,[sp,#6*4]
1346	eor	r0,r0,r1,lsr#3	@ sigma0(X[i+1])
1347	mov	r1,r12,ror#17
1348	add	r3,r3,r0
1349	eor	r1,r1,r12,ror#19
1350	add	r3,r3,r2
1351	eor	r1,r1,r12,lsr#10	@ sigma1(X[i+14])
1352	@ add	r3,r3,r1
1353	mov	r0,r11,ror#6
1354	ldr	r12,[r14],#4			@ *K256++
1355	eor	r0,r0,r11,ror#11
1356	eor	r2,r4,r5
1357#if 29>=16
1358	add	r3,r3,r1			@ from BODY_16_xx
1359#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
1360	rev	r3,r3
1361#endif
1362#if 29==15
1363	str	r1,[sp,#17*4]			@ leave room for r1
1364#endif
1365	eor	r0,r0,r11,ror#25	@ Sigma1(e)
1366	and	r2,r2,r11
1367	str	r3,[sp,#13*4]
1368	add	r3,r3,r0
1369	eor	r2,r2,r5			@ Ch(e,f,g)
1370	add	r3,r3,r6
1371	mov	r6,r7,ror#2
1372	add	r3,r3,r2
1373	eor	r6,r6,r7,ror#13
1374	add	r3,r3,r12
1375	eor	r6,r6,r7,ror#22		@ Sigma0(a)
1376#if 29>=15
1377	ldr	r1,[sp,#15*4]		@ from BODY_16_xx
1378#endif
1379	orr	r0,r7,r8
1380	and	r2,r7,r8
1381	and	r0,r0,r9
1382	add	r6,r6,r3
1383	orr	r0,r0,r2			@ Maj(a,b,c)
1384	add	r10,r10,r3
1385	add	r6,r6,r0
1386	@ ldr	r1,[sp,#15*4]		@ 30
1387	ldr	r12,[sp,#12*4]
1388	mov	r0,r1,ror#7
1389	ldr	r3,[sp,#14*4]
1390	eor	r0,r0,r1,ror#18
1391	ldr	r2,[sp,#7*4]
1392	eor	r0,r0,r1,lsr#3	@ sigma0(X[i+1])
1393	mov	r1,r12,ror#17
1394	add	r3,r3,r0
1395	eor	r1,r1,r12,ror#19
1396	add	r3,r3,r2
1397	eor	r1,r1,r12,lsr#10	@ sigma1(X[i+14])
1398	@ add	r3,r3,r1
1399	mov	r0,r10,ror#6
1400	ldr	r12,[r14],#4			@ *K256++
1401	eor	r0,r0,r10,ror#11
1402	eor	r2,r11,r4
1403#if 30>=16
1404	add	r3,r3,r1			@ from BODY_16_xx
1405#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
1406	rev	r3,r3
1407#endif
1408#if 30==15
1409	str	r1,[sp,#17*4]			@ leave room for r1
1410#endif
1411	eor	r0,r0,r10,ror#25	@ Sigma1(e)
1412	and	r2,r2,r10
1413	str	r3,[sp,#14*4]
1414	add	r3,r3,r0
1415	eor	r2,r2,r4			@ Ch(e,f,g)
1416	add	r3,r3,r5
1417	mov	r5,r6,ror#2
1418	add	r3,r3,r2
1419	eor	r5,r5,r6,ror#13
1420	add	r3,r3,r12
1421	eor	r5,r5,r6,ror#22		@ Sigma0(a)
1422#if 30>=15
1423	ldr	r1,[sp,#0*4]		@ from BODY_16_xx
1424#endif
1425	orr	r0,r6,r7
1426	and	r2,r6,r7
1427	and	r0,r0,r8
1428	add	r5,r5,r3
1429	orr	r0,r0,r2			@ Maj(a,b,c)
1430	add	r9,r9,r3
1431	add	r5,r5,r0
1432	@ ldr	r1,[sp,#0*4]		@ 31
1433	ldr	r12,[sp,#13*4]
1434	mov	r0,r1,ror#7
1435	ldr	r3,[sp,#15*4]
1436	eor	r0,r0,r1,ror#18
1437	ldr	r2,[sp,#8*4]
1438	eor	r0,r0,r1,lsr#3	@ sigma0(X[i+1])
1439	mov	r1,r12,ror#17
1440	add	r3,r3,r0
1441	eor	r1,r1,r12,ror#19
1442	add	r3,r3,r2
1443	eor	r1,r1,r12,lsr#10	@ sigma1(X[i+14])
1444	@ add	r3,r3,r1
1445	mov	r0,r9,ror#6
1446	ldr	r12,[r14],#4			@ *K256++
1447	eor	r0,r0,r9,ror#11
1448	eor	r2,r10,r11
1449#if 31>=16
1450	add	r3,r3,r1			@ from BODY_16_xx
1451#elif __ARM_ARCH__>=7 && defined(__ARMEL__)
1452	rev	r3,r3
1453#endif
1454#if 31==15
1455	str	r1,[sp,#17*4]			@ leave room for r1
1456#endif
1457	eor	r0,r0,r9,ror#25	@ Sigma1(e)
1458	and	r2,r2,r9
1459	str	r3,[sp,#15*4]
1460	add	r3,r3,r0
1461	eor	r2,r2,r11			@ Ch(e,f,g)
1462	add	r3,r3,r4
1463	mov	r4,r5,ror#2
1464	add	r3,r3,r2
1465	eor	r4,r4,r5,ror#13
1466	add	r3,r3,r12
1467	eor	r4,r4,r5,ror#22		@ Sigma0(a)
1468#if 31>=15
1469	ldr	r1,[sp,#1*4]		@ from BODY_16_xx
1470#endif
1471	orr	r0,r5,r6
1472	and	r2,r5,r6
1473	and	r0,r0,r7
1474	add	r4,r4,r3
1475	orr	r0,r0,r2			@ Maj(a,b,c)
1476	add	r8,r8,r3
1477	add	r4,r4,r0
1478	and	r12,r12,#0xff
1479	cmp	r12,#0xf2
1480	bne	.Lrounds_16_xx
1481
1482	ldr	r3,[sp,#16*4]		@ pull ctx
1483	ldr	r0,[r3,#0]
1484	ldr	r2,[r3,#4]
1485	ldr	r12,[r3,#8]
1486	add	r4,r4,r0
1487	ldr	r0,[r3,#12]
1488	add	r5,r5,r2
1489	ldr	r2,[r3,#16]
1490	add	r6,r6,r12
1491	ldr	r12,[r3,#20]
1492	add	r7,r7,r0
1493	ldr	r0,[r3,#24]
1494	add	r8,r8,r2
1495	ldr	r2,[r3,#28]
1496	add	r9,r9,r12
1497	ldr	r1,[sp,#17*4]		@ pull inp
1498	ldr	r12,[sp,#18*4]		@ pull inp+len
1499	add	r10,r10,r0
1500	add	r11,r11,r2
1501	stmia	r3,{r4,r5,r6,r7,r8,r9,r10,r11}
1502	cmp	r1,r12
1503	sub	r14,r14,#256	@ rewind Ktbl
1504	bne	.Loop
1505
1506	add	sp,sp,#19*4	@ destroy frame
1507#if __ARM_ARCH__>=5
1508	ldmia	sp!,{r4-r11,pc}
1509#else
1510	ldmia	sp!,{r4-r11,lr}
1511	tst	lr,#1
1512	moveq	pc,lr			@ be binary compatible with V4, yet
1513	.word	0xe12fff1e			@ interoperable with Thumb ISA:-)
1514#endif
1515.size   sha256_block_data_order,.-sha256_block_data_order
1516.asciz  "SHA256 block transform for ARMv4, CRYPTOGAMS by <appro@openssl.org>"
1517.align	2
1518