1305153Sjkim/* $FreeBSD: stable/11/secure/lib/libcrypto/arm/sha256-armv4.S 326663 2017-12-07 18:04:48Z jkim $ */
2305153Sjkim/* Do not modify. This file is auto-generated from sha256-armv4.pl. */
3304636Sjkim
4304636Sjkim@ ====================================================================
5304636Sjkim@ Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
6304636Sjkim@ project. The module is, however, dual licensed under OpenSSL and
7304636Sjkim@ CRYPTOGAMS licenses depending on where you obtain it. For further
8304636Sjkim@ details see http://www.openssl.org/~appro/cryptogams/.
9304636Sjkim@
10304636Sjkim@ Permission to use under GPL terms is granted.
11304636Sjkim@ ====================================================================
12304636Sjkim
13304636Sjkim@ SHA256 block procedure for ARMv4. May 2007.
14304636Sjkim
15304636Sjkim@ Performance is ~2x better than gcc 3.4 generated code and in "abso-
16304636Sjkim@ lute" terms is ~2250 cycles per 64-byte block or ~35 cycles per
17304636Sjkim@ byte [on single-issue Xscale PXA250 core].
18304636Sjkim
19304636Sjkim@ July 2010.
20304636Sjkim@
21304636Sjkim@ Rescheduling for dual-issue pipeline resulted in 22% improvement on
22304636Sjkim@ Cortex A8 core and ~20 cycles per processed byte.
23304636Sjkim
24304636Sjkim@ February 2011.
25304636Sjkim@
26304636Sjkim@ Profiler-assisted and platform-specific optimization resulted in 16%
27304636Sjkim@ improvement on Cortex A8 core and ~15.4 cycles per processed byte.
28304636Sjkim
29304636Sjkim@ September 2013.
30304636Sjkim@
31304636Sjkim@ Add NEON implementation. On Cortex A8 it was measured to process one
32304636Sjkim@ byte in 12.5 cycles or 23% faster than integer-only code. Snapdragon
33304636Sjkim@ S4 does it in 12.5 cycles too, but it's 50% faster than integer-only
34304636Sjkim@ code (meaning that latter performs sub-optimally, nothing was done
35304636Sjkim@ about it).
36304636Sjkim
37304636Sjkim@ May 2014.
38304636Sjkim@
39304636Sjkim@ Add ARMv8 code path performing at 2.0 cpb on Apple A7.
40304636Sjkim
41304636Sjkim#ifndef __KERNEL__
42304636Sjkim# include "arm_arch.h"
43304636Sjkim#else
44304636Sjkim# define __ARM_ARCH__ __LINUX_ARM_ARCH__
45304636Sjkim# define __ARM_MAX_ARCH__ 7
46304636Sjkim#endif
47304636Sjkim
48304636Sjkim.text
49304636Sjkim#if __ARM_ARCH__<7
50304636Sjkim.code	32
51304636Sjkim#else
52304636Sjkim.syntax unified
53304636Sjkim# ifdef __thumb2__
54304636Sjkim.thumb
55304636Sjkim# else
56304636Sjkim.code   32
57304636Sjkim# endif
58304636Sjkim#endif
59304636Sjkim
60304636Sjkim.type	K256,%object
61304636Sjkim.align	5
62304636SjkimK256:
63304636Sjkim.word	0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
64304636Sjkim.word	0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5
65304636Sjkim.word	0xd807aa98,0x12835b01,0x243185be,0x550c7dc3
66304636Sjkim.word	0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174
67304636Sjkim.word	0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc
68304636Sjkim.word	0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da
69304636Sjkim.word	0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7
70304636Sjkim.word	0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967
71304636Sjkim.word	0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13
72304636Sjkim.word	0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85
73304636Sjkim.word	0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3
74304636Sjkim.word	0xd192e819,0xd6990624,0xf40e3585,0x106aa070
75304636Sjkim.word	0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5
76304636Sjkim.word	0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3
77304636Sjkim.word	0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
78304636Sjkim.word	0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
79304636Sjkim.size	K256,.-K256
80304636Sjkim.word	0				@ terminator
81304636Sjkim#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
82304636Sjkim.LOPENSSL_armcap:
83304636Sjkim.word	OPENSSL_armcap_P-sha256_block_data_order
84304636Sjkim#endif
85304636Sjkim.align	5
86304636Sjkim
87304636Sjkim.global	sha256_block_data_order
88304636Sjkim.type	sha256_block_data_order,%function
89304636Sjkimsha256_block_data_order:
90304636Sjkim#if __ARM_ARCH__<7
91304636Sjkim	sub	r3,pc,#8		@ sha256_block_data_order
92304636Sjkim#else
93326663Sjkim	adr	r3,.
94304636Sjkim#endif
95304636Sjkim#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
96304636Sjkim	ldr	r12,.LOPENSSL_armcap
97304636Sjkim	ldr	r12,[r3,r12]		@ OPENSSL_armcap_P
98304636Sjkim	tst	r12,#ARMV8_SHA256
99304636Sjkim	bne	.LARMv8
100304636Sjkim	tst	r12,#ARMV7_NEON
101304636Sjkim	bne	.LNEON
102304636Sjkim#endif
103304636Sjkim	add	r2,r1,r2,lsl#6	@ len to point at the end of inp
104304636Sjkim	stmdb	sp!,{r0,r1,r2,r4-r11,lr}
105304636Sjkim	ldmia	r0,{r4,r5,r6,r7,r8,r9,r10,r11}
106304636Sjkim	sub	r14,r3,#256+32	@ K256
107304636Sjkim	sub	sp,sp,#16*4		@ alloca(X[16])
108304636Sjkim.Loop:
109304636Sjkim# if __ARM_ARCH__>=7
110304636Sjkim	ldr	r2,[r1],#4
111304636Sjkim# else
112304636Sjkim	ldrb	r2,[r1,#3]
113304636Sjkim# endif
114304636Sjkim	eor	r3,r5,r6		@ magic
115304636Sjkim	eor	r12,r12,r12
116304636Sjkim#if __ARM_ARCH__>=7
117304636Sjkim	@ ldr	r2,[r1],#4			@ 0
118304636Sjkim# if 0==15
119304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
120304636Sjkim# endif
121304636Sjkim	eor	r0,r8,r8,ror#5
122304636Sjkim	add	r4,r4,r12			@ h+=Maj(a,b,c) from the past
123304636Sjkim	eor	r0,r0,r8,ror#19	@ Sigma1(e)
124304636Sjkim	rev	r2,r2
125304636Sjkim#else
126304636Sjkim	@ ldrb	r2,[r1,#3]			@ 0
127304636Sjkim	add	r4,r4,r12			@ h+=Maj(a,b,c) from the past
128304636Sjkim	ldrb	r12,[r1,#2]
129304636Sjkim	ldrb	r0,[r1,#1]
130304636Sjkim	orr	r2,r2,r12,lsl#8
131304636Sjkim	ldrb	r12,[r1],#4
132304636Sjkim	orr	r2,r2,r0,lsl#16
133304636Sjkim# if 0==15
134304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
135304636Sjkim# endif
136304636Sjkim	eor	r0,r8,r8,ror#5
137304636Sjkim	orr	r2,r2,r12,lsl#24
138304636Sjkim	eor	r0,r0,r8,ror#19	@ Sigma1(e)
139304636Sjkim#endif
140304636Sjkim	ldr	r12,[r14],#4			@ *K256++
141304636Sjkim	add	r11,r11,r2			@ h+=X[i]
142304636Sjkim	str	r2,[sp,#0*4]
143304636Sjkim	eor	r2,r9,r10
144304636Sjkim	add	r11,r11,r0,ror#6	@ h+=Sigma1(e)
145304636Sjkim	and	r2,r2,r8
146304636Sjkim	add	r11,r11,r12			@ h+=K256[i]
147304636Sjkim	eor	r2,r2,r10			@ Ch(e,f,g)
148304636Sjkim	eor	r0,r4,r4,ror#11
149304636Sjkim	add	r11,r11,r2			@ h+=Ch(e,f,g)
150304636Sjkim#if 0==31
151304636Sjkim	and	r12,r12,#0xff
152304636Sjkim	cmp	r12,#0xf2			@ done?
153304636Sjkim#endif
154304636Sjkim#if 0<15
155304636Sjkim# if __ARM_ARCH__>=7
156304636Sjkim	ldr	r2,[r1],#4			@ prefetch
157304636Sjkim# else
158304636Sjkim	ldrb	r2,[r1,#3]
159304636Sjkim# endif
160304636Sjkim	eor	r12,r4,r5			@ a^b, b^c in next round
161304636Sjkim#else
162304636Sjkim	ldr	r2,[sp,#2*4]		@ from future BODY_16_xx
163304636Sjkim	eor	r12,r4,r5			@ a^b, b^c in next round
164304636Sjkim	ldr	r1,[sp,#15*4]	@ from future BODY_16_xx
165304636Sjkim#endif
166304636Sjkim	eor	r0,r0,r4,ror#20	@ Sigma0(a)
167304636Sjkim	and	r3,r3,r12			@ (b^c)&=(a^b)
168304636Sjkim	add	r7,r7,r11			@ d+=h
169304636Sjkim	eor	r3,r3,r5			@ Maj(a,b,c)
170304636Sjkim	add	r11,r11,r0,ror#2	@ h+=Sigma0(a)
171304636Sjkim	@ add	r11,r11,r3			@ h+=Maj(a,b,c)
172304636Sjkim#if __ARM_ARCH__>=7
173304636Sjkim	@ ldr	r2,[r1],#4			@ 1
174304636Sjkim# if 1==15
175304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
176304636Sjkim# endif
177304636Sjkim	eor	r0,r7,r7,ror#5
178304636Sjkim	add	r11,r11,r3			@ h+=Maj(a,b,c) from the past
179304636Sjkim	eor	r0,r0,r7,ror#19	@ Sigma1(e)
180304636Sjkim	rev	r2,r2
181304636Sjkim#else
182304636Sjkim	@ ldrb	r2,[r1,#3]			@ 1
183304636Sjkim	add	r11,r11,r3			@ h+=Maj(a,b,c) from the past
184304636Sjkim	ldrb	r3,[r1,#2]
185304636Sjkim	ldrb	r0,[r1,#1]
186304636Sjkim	orr	r2,r2,r3,lsl#8
187304636Sjkim	ldrb	r3,[r1],#4
188304636Sjkim	orr	r2,r2,r0,lsl#16
189304636Sjkim# if 1==15
190304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
191304636Sjkim# endif
192304636Sjkim	eor	r0,r7,r7,ror#5
193304636Sjkim	orr	r2,r2,r3,lsl#24
194304636Sjkim	eor	r0,r0,r7,ror#19	@ Sigma1(e)
195304636Sjkim#endif
196304636Sjkim	ldr	r3,[r14],#4			@ *K256++
197304636Sjkim	add	r10,r10,r2			@ h+=X[i]
198304636Sjkim	str	r2,[sp,#1*4]
199304636Sjkim	eor	r2,r8,r9
200304636Sjkim	add	r10,r10,r0,ror#6	@ h+=Sigma1(e)
201304636Sjkim	and	r2,r2,r7
202304636Sjkim	add	r10,r10,r3			@ h+=K256[i]
203304636Sjkim	eor	r2,r2,r9			@ Ch(e,f,g)
204304636Sjkim	eor	r0,r11,r11,ror#11
205304636Sjkim	add	r10,r10,r2			@ h+=Ch(e,f,g)
206304636Sjkim#if 1==31
207304636Sjkim	and	r3,r3,#0xff
208304636Sjkim	cmp	r3,#0xf2			@ done?
209304636Sjkim#endif
210304636Sjkim#if 1<15
211304636Sjkim# if __ARM_ARCH__>=7
212304636Sjkim	ldr	r2,[r1],#4			@ prefetch
213304636Sjkim# else
214304636Sjkim	ldrb	r2,[r1,#3]
215304636Sjkim# endif
216304636Sjkim	eor	r3,r11,r4			@ a^b, b^c in next round
217304636Sjkim#else
218304636Sjkim	ldr	r2,[sp,#3*4]		@ from future BODY_16_xx
219304636Sjkim	eor	r3,r11,r4			@ a^b, b^c in next round
220304636Sjkim	ldr	r1,[sp,#0*4]	@ from future BODY_16_xx
221304636Sjkim#endif
222304636Sjkim	eor	r0,r0,r11,ror#20	@ Sigma0(a)
223304636Sjkim	and	r12,r12,r3			@ (b^c)&=(a^b)
224304636Sjkim	add	r6,r6,r10			@ d+=h
225304636Sjkim	eor	r12,r12,r4			@ Maj(a,b,c)
226304636Sjkim	add	r10,r10,r0,ror#2	@ h+=Sigma0(a)
227304636Sjkim	@ add	r10,r10,r12			@ h+=Maj(a,b,c)
228304636Sjkim#if __ARM_ARCH__>=7
229304636Sjkim	@ ldr	r2,[r1],#4			@ 2
230304636Sjkim# if 2==15
231304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
232304636Sjkim# endif
233304636Sjkim	eor	r0,r6,r6,ror#5
234304636Sjkim	add	r10,r10,r12			@ h+=Maj(a,b,c) from the past
235304636Sjkim	eor	r0,r0,r6,ror#19	@ Sigma1(e)
236304636Sjkim	rev	r2,r2
237304636Sjkim#else
238304636Sjkim	@ ldrb	r2,[r1,#3]			@ 2
239304636Sjkim	add	r10,r10,r12			@ h+=Maj(a,b,c) from the past
240304636Sjkim	ldrb	r12,[r1,#2]
241304636Sjkim	ldrb	r0,[r1,#1]
242304636Sjkim	orr	r2,r2,r12,lsl#8
243304636Sjkim	ldrb	r12,[r1],#4
244304636Sjkim	orr	r2,r2,r0,lsl#16
245304636Sjkim# if 2==15
246304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
247304636Sjkim# endif
248304636Sjkim	eor	r0,r6,r6,ror#5
249304636Sjkim	orr	r2,r2,r12,lsl#24
250304636Sjkim	eor	r0,r0,r6,ror#19	@ Sigma1(e)
251304636Sjkim#endif
252304636Sjkim	ldr	r12,[r14],#4			@ *K256++
253304636Sjkim	add	r9,r9,r2			@ h+=X[i]
254304636Sjkim	str	r2,[sp,#2*4]
255304636Sjkim	eor	r2,r7,r8
256304636Sjkim	add	r9,r9,r0,ror#6	@ h+=Sigma1(e)
257304636Sjkim	and	r2,r2,r6
258304636Sjkim	add	r9,r9,r12			@ h+=K256[i]
259304636Sjkim	eor	r2,r2,r8			@ Ch(e,f,g)
260304636Sjkim	eor	r0,r10,r10,ror#11
261304636Sjkim	add	r9,r9,r2			@ h+=Ch(e,f,g)
262304636Sjkim#if 2==31
263304636Sjkim	and	r12,r12,#0xff
264304636Sjkim	cmp	r12,#0xf2			@ done?
265304636Sjkim#endif
266304636Sjkim#if 2<15
267304636Sjkim# if __ARM_ARCH__>=7
268304636Sjkim	ldr	r2,[r1],#4			@ prefetch
269304636Sjkim# else
270304636Sjkim	ldrb	r2,[r1,#3]
271304636Sjkim# endif
272304636Sjkim	eor	r12,r10,r11			@ a^b, b^c in next round
273304636Sjkim#else
274304636Sjkim	ldr	r2,[sp,#4*4]		@ from future BODY_16_xx
275304636Sjkim	eor	r12,r10,r11			@ a^b, b^c in next round
276304636Sjkim	ldr	r1,[sp,#1*4]	@ from future BODY_16_xx
277304636Sjkim#endif
278304636Sjkim	eor	r0,r0,r10,ror#20	@ Sigma0(a)
279304636Sjkim	and	r3,r3,r12			@ (b^c)&=(a^b)
280304636Sjkim	add	r5,r5,r9			@ d+=h
281304636Sjkim	eor	r3,r3,r11			@ Maj(a,b,c)
282304636Sjkim	add	r9,r9,r0,ror#2	@ h+=Sigma0(a)
283304636Sjkim	@ add	r9,r9,r3			@ h+=Maj(a,b,c)
284304636Sjkim#if __ARM_ARCH__>=7
285304636Sjkim	@ ldr	r2,[r1],#4			@ 3
286304636Sjkim# if 3==15
287304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
288304636Sjkim# endif
289304636Sjkim	eor	r0,r5,r5,ror#5
290304636Sjkim	add	r9,r9,r3			@ h+=Maj(a,b,c) from the past
291304636Sjkim	eor	r0,r0,r5,ror#19	@ Sigma1(e)
292304636Sjkim	rev	r2,r2
293304636Sjkim#else
294304636Sjkim	@ ldrb	r2,[r1,#3]			@ 3
295304636Sjkim	add	r9,r9,r3			@ h+=Maj(a,b,c) from the past
296304636Sjkim	ldrb	r3,[r1,#2]
297304636Sjkim	ldrb	r0,[r1,#1]
298304636Sjkim	orr	r2,r2,r3,lsl#8
299304636Sjkim	ldrb	r3,[r1],#4
300304636Sjkim	orr	r2,r2,r0,lsl#16
301304636Sjkim# if 3==15
302304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
303304636Sjkim# endif
304304636Sjkim	eor	r0,r5,r5,ror#5
305304636Sjkim	orr	r2,r2,r3,lsl#24
306304636Sjkim	eor	r0,r0,r5,ror#19	@ Sigma1(e)
307304636Sjkim#endif
308304636Sjkim	ldr	r3,[r14],#4			@ *K256++
309304636Sjkim	add	r8,r8,r2			@ h+=X[i]
310304636Sjkim	str	r2,[sp,#3*4]
311304636Sjkim	eor	r2,r6,r7
312304636Sjkim	add	r8,r8,r0,ror#6	@ h+=Sigma1(e)
313304636Sjkim	and	r2,r2,r5
314304636Sjkim	add	r8,r8,r3			@ h+=K256[i]
315304636Sjkim	eor	r2,r2,r7			@ Ch(e,f,g)
316304636Sjkim	eor	r0,r9,r9,ror#11
317304636Sjkim	add	r8,r8,r2			@ h+=Ch(e,f,g)
318304636Sjkim#if 3==31
319304636Sjkim	and	r3,r3,#0xff
320304636Sjkim	cmp	r3,#0xf2			@ done?
321304636Sjkim#endif
322304636Sjkim#if 3<15
323304636Sjkim# if __ARM_ARCH__>=7
324304636Sjkim	ldr	r2,[r1],#4			@ prefetch
325304636Sjkim# else
326304636Sjkim	ldrb	r2,[r1,#3]
327304636Sjkim# endif
328304636Sjkim	eor	r3,r9,r10			@ a^b, b^c in next round
329304636Sjkim#else
330304636Sjkim	ldr	r2,[sp,#5*4]		@ from future BODY_16_xx
331304636Sjkim	eor	r3,r9,r10			@ a^b, b^c in next round
332304636Sjkim	ldr	r1,[sp,#2*4]	@ from future BODY_16_xx
333304636Sjkim#endif
334304636Sjkim	eor	r0,r0,r9,ror#20	@ Sigma0(a)
335304636Sjkim	and	r12,r12,r3			@ (b^c)&=(a^b)
336304636Sjkim	add	r4,r4,r8			@ d+=h
337304636Sjkim	eor	r12,r12,r10			@ Maj(a,b,c)
338304636Sjkim	add	r8,r8,r0,ror#2	@ h+=Sigma0(a)
339304636Sjkim	@ add	r8,r8,r12			@ h+=Maj(a,b,c)
340304636Sjkim#if __ARM_ARCH__>=7
341304636Sjkim	@ ldr	r2,[r1],#4			@ 4
342304636Sjkim# if 4==15
343304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
344304636Sjkim# endif
345304636Sjkim	eor	r0,r4,r4,ror#5
346304636Sjkim	add	r8,r8,r12			@ h+=Maj(a,b,c) from the past
347304636Sjkim	eor	r0,r0,r4,ror#19	@ Sigma1(e)
348304636Sjkim	rev	r2,r2
349304636Sjkim#else
350304636Sjkim	@ ldrb	r2,[r1,#3]			@ 4
351304636Sjkim	add	r8,r8,r12			@ h+=Maj(a,b,c) from the past
352304636Sjkim	ldrb	r12,[r1,#2]
353304636Sjkim	ldrb	r0,[r1,#1]
354304636Sjkim	orr	r2,r2,r12,lsl#8
355304636Sjkim	ldrb	r12,[r1],#4
356304636Sjkim	orr	r2,r2,r0,lsl#16
357304636Sjkim# if 4==15
358304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
359304636Sjkim# endif
360304636Sjkim	eor	r0,r4,r4,ror#5
361304636Sjkim	orr	r2,r2,r12,lsl#24
362304636Sjkim	eor	r0,r0,r4,ror#19	@ Sigma1(e)
363304636Sjkim#endif
364304636Sjkim	ldr	r12,[r14],#4			@ *K256++
365304636Sjkim	add	r7,r7,r2			@ h+=X[i]
366304636Sjkim	str	r2,[sp,#4*4]
367304636Sjkim	eor	r2,r5,r6
368304636Sjkim	add	r7,r7,r0,ror#6	@ h+=Sigma1(e)
369304636Sjkim	and	r2,r2,r4
370304636Sjkim	add	r7,r7,r12			@ h+=K256[i]
371304636Sjkim	eor	r2,r2,r6			@ Ch(e,f,g)
372304636Sjkim	eor	r0,r8,r8,ror#11
373304636Sjkim	add	r7,r7,r2			@ h+=Ch(e,f,g)
374304636Sjkim#if 4==31
375304636Sjkim	and	r12,r12,#0xff
376304636Sjkim	cmp	r12,#0xf2			@ done?
377304636Sjkim#endif
378304636Sjkim#if 4<15
379304636Sjkim# if __ARM_ARCH__>=7
380304636Sjkim	ldr	r2,[r1],#4			@ prefetch
381304636Sjkim# else
382304636Sjkim	ldrb	r2,[r1,#3]
383304636Sjkim# endif
384304636Sjkim	eor	r12,r8,r9			@ a^b, b^c in next round
385304636Sjkim#else
386304636Sjkim	ldr	r2,[sp,#6*4]		@ from future BODY_16_xx
387304636Sjkim	eor	r12,r8,r9			@ a^b, b^c in next round
388304636Sjkim	ldr	r1,[sp,#3*4]	@ from future BODY_16_xx
389304636Sjkim#endif
390304636Sjkim	eor	r0,r0,r8,ror#20	@ Sigma0(a)
391304636Sjkim	and	r3,r3,r12			@ (b^c)&=(a^b)
392304636Sjkim	add	r11,r11,r7			@ d+=h
393304636Sjkim	eor	r3,r3,r9			@ Maj(a,b,c)
394304636Sjkim	add	r7,r7,r0,ror#2	@ h+=Sigma0(a)
395304636Sjkim	@ add	r7,r7,r3			@ h+=Maj(a,b,c)
396304636Sjkim#if __ARM_ARCH__>=7
397304636Sjkim	@ ldr	r2,[r1],#4			@ 5
398304636Sjkim# if 5==15
399304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
400304636Sjkim# endif
401304636Sjkim	eor	r0,r11,r11,ror#5
402304636Sjkim	add	r7,r7,r3			@ h+=Maj(a,b,c) from the past
403304636Sjkim	eor	r0,r0,r11,ror#19	@ Sigma1(e)
404304636Sjkim	rev	r2,r2
405304636Sjkim#else
406304636Sjkim	@ ldrb	r2,[r1,#3]			@ 5
407304636Sjkim	add	r7,r7,r3			@ h+=Maj(a,b,c) from the past
408304636Sjkim	ldrb	r3,[r1,#2]
409304636Sjkim	ldrb	r0,[r1,#1]
410304636Sjkim	orr	r2,r2,r3,lsl#8
411304636Sjkim	ldrb	r3,[r1],#4
412304636Sjkim	orr	r2,r2,r0,lsl#16
413304636Sjkim# if 5==15
414304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
415304636Sjkim# endif
416304636Sjkim	eor	r0,r11,r11,ror#5
417304636Sjkim	orr	r2,r2,r3,lsl#24
418304636Sjkim	eor	r0,r0,r11,ror#19	@ Sigma1(e)
419304636Sjkim#endif
420304636Sjkim	ldr	r3,[r14],#4			@ *K256++
421304636Sjkim	add	r6,r6,r2			@ h+=X[i]
422304636Sjkim	str	r2,[sp,#5*4]
423304636Sjkim	eor	r2,r4,r5
424304636Sjkim	add	r6,r6,r0,ror#6	@ h+=Sigma1(e)
425304636Sjkim	and	r2,r2,r11
426304636Sjkim	add	r6,r6,r3			@ h+=K256[i]
427304636Sjkim	eor	r2,r2,r5			@ Ch(e,f,g)
428304636Sjkim	eor	r0,r7,r7,ror#11
429304636Sjkim	add	r6,r6,r2			@ h+=Ch(e,f,g)
430304636Sjkim#if 5==31
431304636Sjkim	and	r3,r3,#0xff
432304636Sjkim	cmp	r3,#0xf2			@ done?
433304636Sjkim#endif
434304636Sjkim#if 5<15
435304636Sjkim# if __ARM_ARCH__>=7
436304636Sjkim	ldr	r2,[r1],#4			@ prefetch
437304636Sjkim# else
438304636Sjkim	ldrb	r2,[r1,#3]
439304636Sjkim# endif
440304636Sjkim	eor	r3,r7,r8			@ a^b, b^c in next round
441304636Sjkim#else
442304636Sjkim	ldr	r2,[sp,#7*4]		@ from future BODY_16_xx
443304636Sjkim	eor	r3,r7,r8			@ a^b, b^c in next round
444304636Sjkim	ldr	r1,[sp,#4*4]	@ from future BODY_16_xx
445304636Sjkim#endif
446304636Sjkim	eor	r0,r0,r7,ror#20	@ Sigma0(a)
447304636Sjkim	and	r12,r12,r3			@ (b^c)&=(a^b)
448304636Sjkim	add	r10,r10,r6			@ d+=h
449304636Sjkim	eor	r12,r12,r8			@ Maj(a,b,c)
450304636Sjkim	add	r6,r6,r0,ror#2	@ h+=Sigma0(a)
451304636Sjkim	@ add	r6,r6,r12			@ h+=Maj(a,b,c)
452304636Sjkim#if __ARM_ARCH__>=7
453304636Sjkim	@ ldr	r2,[r1],#4			@ 6
454304636Sjkim# if 6==15
455304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
456304636Sjkim# endif
457304636Sjkim	eor	r0,r10,r10,ror#5
458304636Sjkim	add	r6,r6,r12			@ h+=Maj(a,b,c) from the past
459304636Sjkim	eor	r0,r0,r10,ror#19	@ Sigma1(e)
460304636Sjkim	rev	r2,r2
461304636Sjkim#else
462304636Sjkim	@ ldrb	r2,[r1,#3]			@ 6
463304636Sjkim	add	r6,r6,r12			@ h+=Maj(a,b,c) from the past
464304636Sjkim	ldrb	r12,[r1,#2]
465304636Sjkim	ldrb	r0,[r1,#1]
466304636Sjkim	orr	r2,r2,r12,lsl#8
467304636Sjkim	ldrb	r12,[r1],#4
468304636Sjkim	orr	r2,r2,r0,lsl#16
469304636Sjkim# if 6==15
470304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
471304636Sjkim# endif
472304636Sjkim	eor	r0,r10,r10,ror#5
473304636Sjkim	orr	r2,r2,r12,lsl#24
474304636Sjkim	eor	r0,r0,r10,ror#19	@ Sigma1(e)
475304636Sjkim#endif
476304636Sjkim	ldr	r12,[r14],#4			@ *K256++
477304636Sjkim	add	r5,r5,r2			@ h+=X[i]
478304636Sjkim	str	r2,[sp,#6*4]
479304636Sjkim	eor	r2,r11,r4
480304636Sjkim	add	r5,r5,r0,ror#6	@ h+=Sigma1(e)
481304636Sjkim	and	r2,r2,r10
482304636Sjkim	add	r5,r5,r12			@ h+=K256[i]
483304636Sjkim	eor	r2,r2,r4			@ Ch(e,f,g)
484304636Sjkim	eor	r0,r6,r6,ror#11
485304636Sjkim	add	r5,r5,r2			@ h+=Ch(e,f,g)
486304636Sjkim#if 6==31
487304636Sjkim	and	r12,r12,#0xff
488304636Sjkim	cmp	r12,#0xf2			@ done?
489304636Sjkim#endif
490304636Sjkim#if 6<15
491304636Sjkim# if __ARM_ARCH__>=7
492304636Sjkim	ldr	r2,[r1],#4			@ prefetch
493304636Sjkim# else
494304636Sjkim	ldrb	r2,[r1,#3]
495304636Sjkim# endif
496304636Sjkim	eor	r12,r6,r7			@ a^b, b^c in next round
497304636Sjkim#else
498304636Sjkim	ldr	r2,[sp,#8*4]		@ from future BODY_16_xx
499304636Sjkim	eor	r12,r6,r7			@ a^b, b^c in next round
500304636Sjkim	ldr	r1,[sp,#5*4]	@ from future BODY_16_xx
501304636Sjkim#endif
502304636Sjkim	eor	r0,r0,r6,ror#20	@ Sigma0(a)
503304636Sjkim	and	r3,r3,r12			@ (b^c)&=(a^b)
504304636Sjkim	add	r9,r9,r5			@ d+=h
505304636Sjkim	eor	r3,r3,r7			@ Maj(a,b,c)
506304636Sjkim	add	r5,r5,r0,ror#2	@ h+=Sigma0(a)
507304636Sjkim	@ add	r5,r5,r3			@ h+=Maj(a,b,c)
508304636Sjkim#if __ARM_ARCH__>=7
509304636Sjkim	@ ldr	r2,[r1],#4			@ 7
510304636Sjkim# if 7==15
511304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
512304636Sjkim# endif
513304636Sjkim	eor	r0,r9,r9,ror#5
514304636Sjkim	add	r5,r5,r3			@ h+=Maj(a,b,c) from the past
515304636Sjkim	eor	r0,r0,r9,ror#19	@ Sigma1(e)
516304636Sjkim	rev	r2,r2
517304636Sjkim#else
518304636Sjkim	@ ldrb	r2,[r1,#3]			@ 7
519304636Sjkim	add	r5,r5,r3			@ h+=Maj(a,b,c) from the past
520304636Sjkim	ldrb	r3,[r1,#2]
521304636Sjkim	ldrb	r0,[r1,#1]
522304636Sjkim	orr	r2,r2,r3,lsl#8
523304636Sjkim	ldrb	r3,[r1],#4
524304636Sjkim	orr	r2,r2,r0,lsl#16
525304636Sjkim# if 7==15
526304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
527304636Sjkim# endif
528304636Sjkim	eor	r0,r9,r9,ror#5
529304636Sjkim	orr	r2,r2,r3,lsl#24
530304636Sjkim	eor	r0,r0,r9,ror#19	@ Sigma1(e)
531304636Sjkim#endif
532304636Sjkim	ldr	r3,[r14],#4			@ *K256++
533304636Sjkim	add	r4,r4,r2			@ h+=X[i]
534304636Sjkim	str	r2,[sp,#7*4]
535304636Sjkim	eor	r2,r10,r11
536304636Sjkim	add	r4,r4,r0,ror#6	@ h+=Sigma1(e)
537304636Sjkim	and	r2,r2,r9
538304636Sjkim	add	r4,r4,r3			@ h+=K256[i]
539304636Sjkim	eor	r2,r2,r11			@ Ch(e,f,g)
540304636Sjkim	eor	r0,r5,r5,ror#11
541304636Sjkim	add	r4,r4,r2			@ h+=Ch(e,f,g)
542304636Sjkim#if 7==31
543304636Sjkim	and	r3,r3,#0xff
544304636Sjkim	cmp	r3,#0xf2			@ done?
545304636Sjkim#endif
546304636Sjkim#if 7<15
547304636Sjkim# if __ARM_ARCH__>=7
548304636Sjkim	ldr	r2,[r1],#4			@ prefetch
549304636Sjkim# else
550304636Sjkim	ldrb	r2,[r1,#3]
551304636Sjkim# endif
552304636Sjkim	eor	r3,r5,r6			@ a^b, b^c in next round
553304636Sjkim#else
554304636Sjkim	ldr	r2,[sp,#9*4]		@ from future BODY_16_xx
555304636Sjkim	eor	r3,r5,r6			@ a^b, b^c in next round
556304636Sjkim	ldr	r1,[sp,#6*4]	@ from future BODY_16_xx
557304636Sjkim#endif
558304636Sjkim	eor	r0,r0,r5,ror#20	@ Sigma0(a)
559304636Sjkim	and	r12,r12,r3			@ (b^c)&=(a^b)
560304636Sjkim	add	r8,r8,r4			@ d+=h
561304636Sjkim	eor	r12,r12,r6			@ Maj(a,b,c)
562304636Sjkim	add	r4,r4,r0,ror#2	@ h+=Sigma0(a)
563304636Sjkim	@ add	r4,r4,r12			@ h+=Maj(a,b,c)
564304636Sjkim#if __ARM_ARCH__>=7
565304636Sjkim	@ ldr	r2,[r1],#4			@ 8
566304636Sjkim# if 8==15
567304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
568304636Sjkim# endif
569304636Sjkim	eor	r0,r8,r8,ror#5
570304636Sjkim	add	r4,r4,r12			@ h+=Maj(a,b,c) from the past
571304636Sjkim	eor	r0,r0,r8,ror#19	@ Sigma1(e)
572304636Sjkim	rev	r2,r2
573304636Sjkim#else
574304636Sjkim	@ ldrb	r2,[r1,#3]			@ 8
575304636Sjkim	add	r4,r4,r12			@ h+=Maj(a,b,c) from the past
576304636Sjkim	ldrb	r12,[r1,#2]
577304636Sjkim	ldrb	r0,[r1,#1]
578304636Sjkim	orr	r2,r2,r12,lsl#8
579304636Sjkim	ldrb	r12,[r1],#4
580304636Sjkim	orr	r2,r2,r0,lsl#16
581304636Sjkim# if 8==15
582304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
583304636Sjkim# endif
584304636Sjkim	eor	r0,r8,r8,ror#5
585304636Sjkim	orr	r2,r2,r12,lsl#24
586304636Sjkim	eor	r0,r0,r8,ror#19	@ Sigma1(e)
587304636Sjkim#endif
588304636Sjkim	ldr	r12,[r14],#4			@ *K256++
589304636Sjkim	add	r11,r11,r2			@ h+=X[i]
590304636Sjkim	str	r2,[sp,#8*4]
591304636Sjkim	eor	r2,r9,r10
592304636Sjkim	add	r11,r11,r0,ror#6	@ h+=Sigma1(e)
593304636Sjkim	and	r2,r2,r8
594304636Sjkim	add	r11,r11,r12			@ h+=K256[i]
595304636Sjkim	eor	r2,r2,r10			@ Ch(e,f,g)
596304636Sjkim	eor	r0,r4,r4,ror#11
597304636Sjkim	add	r11,r11,r2			@ h+=Ch(e,f,g)
598304636Sjkim#if 8==31
599304636Sjkim	and	r12,r12,#0xff
600304636Sjkim	cmp	r12,#0xf2			@ done?
601304636Sjkim#endif
602304636Sjkim#if 8<15
603304636Sjkim# if __ARM_ARCH__>=7
604304636Sjkim	ldr	r2,[r1],#4			@ prefetch
605304636Sjkim# else
606304636Sjkim	ldrb	r2,[r1,#3]
607304636Sjkim# endif
608304636Sjkim	eor	r12,r4,r5			@ a^b, b^c in next round
609304636Sjkim#else
610304636Sjkim	ldr	r2,[sp,#10*4]		@ from future BODY_16_xx
611304636Sjkim	eor	r12,r4,r5			@ a^b, b^c in next round
612304636Sjkim	ldr	r1,[sp,#7*4]	@ from future BODY_16_xx
613304636Sjkim#endif
614304636Sjkim	eor	r0,r0,r4,ror#20	@ Sigma0(a)
615304636Sjkim	and	r3,r3,r12			@ (b^c)&=(a^b)
616304636Sjkim	add	r7,r7,r11			@ d+=h
617304636Sjkim	eor	r3,r3,r5			@ Maj(a,b,c)
618304636Sjkim	add	r11,r11,r0,ror#2	@ h+=Sigma0(a)
619304636Sjkim	@ add	r11,r11,r3			@ h+=Maj(a,b,c)
620304636Sjkim#if __ARM_ARCH__>=7
621304636Sjkim	@ ldr	r2,[r1],#4			@ 9
622304636Sjkim# if 9==15
623304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
624304636Sjkim# endif
625304636Sjkim	eor	r0,r7,r7,ror#5
626304636Sjkim	add	r11,r11,r3			@ h+=Maj(a,b,c) from the past
627304636Sjkim	eor	r0,r0,r7,ror#19	@ Sigma1(e)
628304636Sjkim	rev	r2,r2
629304636Sjkim#else
630304636Sjkim	@ ldrb	r2,[r1,#3]			@ 9
631304636Sjkim	add	r11,r11,r3			@ h+=Maj(a,b,c) from the past
632304636Sjkim	ldrb	r3,[r1,#2]
633304636Sjkim	ldrb	r0,[r1,#1]
634304636Sjkim	orr	r2,r2,r3,lsl#8
635304636Sjkim	ldrb	r3,[r1],#4
636304636Sjkim	orr	r2,r2,r0,lsl#16
637304636Sjkim# if 9==15
638304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
639304636Sjkim# endif
640304636Sjkim	eor	r0,r7,r7,ror#5
641304636Sjkim	orr	r2,r2,r3,lsl#24
642304636Sjkim	eor	r0,r0,r7,ror#19	@ Sigma1(e)
643304636Sjkim#endif
644304636Sjkim	ldr	r3,[r14],#4			@ *K256++
645304636Sjkim	add	r10,r10,r2			@ h+=X[i]
646304636Sjkim	str	r2,[sp,#9*4]
647304636Sjkim	eor	r2,r8,r9
648304636Sjkim	add	r10,r10,r0,ror#6	@ h+=Sigma1(e)
649304636Sjkim	and	r2,r2,r7
650304636Sjkim	add	r10,r10,r3			@ h+=K256[i]
651304636Sjkim	eor	r2,r2,r9			@ Ch(e,f,g)
652304636Sjkim	eor	r0,r11,r11,ror#11
653304636Sjkim	add	r10,r10,r2			@ h+=Ch(e,f,g)
654304636Sjkim#if 9==31
655304636Sjkim	and	r3,r3,#0xff
656304636Sjkim	cmp	r3,#0xf2			@ done?
657304636Sjkim#endif
658304636Sjkim#if 9<15
659304636Sjkim# if __ARM_ARCH__>=7
660304636Sjkim	ldr	r2,[r1],#4			@ prefetch
661304636Sjkim# else
662304636Sjkim	ldrb	r2,[r1,#3]
663304636Sjkim# endif
664304636Sjkim	eor	r3,r11,r4			@ a^b, b^c in next round
665304636Sjkim#else
666304636Sjkim	ldr	r2,[sp,#11*4]		@ from future BODY_16_xx
667304636Sjkim	eor	r3,r11,r4			@ a^b, b^c in next round
668304636Sjkim	ldr	r1,[sp,#8*4]	@ from future BODY_16_xx
669304636Sjkim#endif
670304636Sjkim	eor	r0,r0,r11,ror#20	@ Sigma0(a)
671304636Sjkim	and	r12,r12,r3			@ (b^c)&=(a^b)
672304636Sjkim	add	r6,r6,r10			@ d+=h
673304636Sjkim	eor	r12,r12,r4			@ Maj(a,b,c)
674304636Sjkim	add	r10,r10,r0,ror#2	@ h+=Sigma0(a)
675304636Sjkim	@ add	r10,r10,r12			@ h+=Maj(a,b,c)
676304636Sjkim#if __ARM_ARCH__>=7
677304636Sjkim	@ ldr	r2,[r1],#4			@ 10
678304636Sjkim# if 10==15
679304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
680304636Sjkim# endif
681304636Sjkim	eor	r0,r6,r6,ror#5
682304636Sjkim	add	r10,r10,r12			@ h+=Maj(a,b,c) from the past
683304636Sjkim	eor	r0,r0,r6,ror#19	@ Sigma1(e)
684304636Sjkim	rev	r2,r2
685304636Sjkim#else
686304636Sjkim	@ ldrb	r2,[r1,#3]			@ 10
687304636Sjkim	add	r10,r10,r12			@ h+=Maj(a,b,c) from the past
688304636Sjkim	ldrb	r12,[r1,#2]
689304636Sjkim	ldrb	r0,[r1,#1]
690304636Sjkim	orr	r2,r2,r12,lsl#8
691304636Sjkim	ldrb	r12,[r1],#4
692304636Sjkim	orr	r2,r2,r0,lsl#16
693304636Sjkim# if 10==15
694304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
695304636Sjkim# endif
696304636Sjkim	eor	r0,r6,r6,ror#5
697304636Sjkim	orr	r2,r2,r12,lsl#24
698304636Sjkim	eor	r0,r0,r6,ror#19	@ Sigma1(e)
699304636Sjkim#endif
700304636Sjkim	ldr	r12,[r14],#4			@ *K256++
701304636Sjkim	add	r9,r9,r2			@ h+=X[i]
702304636Sjkim	str	r2,[sp,#10*4]
703304636Sjkim	eor	r2,r7,r8
704304636Sjkim	add	r9,r9,r0,ror#6	@ h+=Sigma1(e)
705304636Sjkim	and	r2,r2,r6
706304636Sjkim	add	r9,r9,r12			@ h+=K256[i]
707304636Sjkim	eor	r2,r2,r8			@ Ch(e,f,g)
708304636Sjkim	eor	r0,r10,r10,ror#11
709304636Sjkim	add	r9,r9,r2			@ h+=Ch(e,f,g)
710304636Sjkim#if 10==31
711304636Sjkim	and	r12,r12,#0xff
712304636Sjkim	cmp	r12,#0xf2			@ done?
713304636Sjkim#endif
714304636Sjkim#if 10<15
715304636Sjkim# if __ARM_ARCH__>=7
716304636Sjkim	ldr	r2,[r1],#4			@ prefetch
717304636Sjkim# else
718304636Sjkim	ldrb	r2,[r1,#3]
719304636Sjkim# endif
720304636Sjkim	eor	r12,r10,r11			@ a^b, b^c in next round
721304636Sjkim#else
722304636Sjkim	ldr	r2,[sp,#12*4]		@ from future BODY_16_xx
723304636Sjkim	eor	r12,r10,r11			@ a^b, b^c in next round
724304636Sjkim	ldr	r1,[sp,#9*4]	@ from future BODY_16_xx
725304636Sjkim#endif
726304636Sjkim	eor	r0,r0,r10,ror#20	@ Sigma0(a)
727304636Sjkim	and	r3,r3,r12			@ (b^c)&=(a^b)
728304636Sjkim	add	r5,r5,r9			@ d+=h
729304636Sjkim	eor	r3,r3,r11			@ Maj(a,b,c)
730304636Sjkim	add	r9,r9,r0,ror#2	@ h+=Sigma0(a)
731304636Sjkim	@ add	r9,r9,r3			@ h+=Maj(a,b,c)
732304636Sjkim#if __ARM_ARCH__>=7
733304636Sjkim	@ ldr	r2,[r1],#4			@ 11
734304636Sjkim# if 11==15
735304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
736304636Sjkim# endif
737304636Sjkim	eor	r0,r5,r5,ror#5
738304636Sjkim	add	r9,r9,r3			@ h+=Maj(a,b,c) from the past
739304636Sjkim	eor	r0,r0,r5,ror#19	@ Sigma1(e)
740304636Sjkim	rev	r2,r2
741304636Sjkim#else
742304636Sjkim	@ ldrb	r2,[r1,#3]			@ 11
743304636Sjkim	add	r9,r9,r3			@ h+=Maj(a,b,c) from the past
744304636Sjkim	ldrb	r3,[r1,#2]
745304636Sjkim	ldrb	r0,[r1,#1]
746304636Sjkim	orr	r2,r2,r3,lsl#8
747304636Sjkim	ldrb	r3,[r1],#4
748304636Sjkim	orr	r2,r2,r0,lsl#16
749304636Sjkim# if 11==15
750304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
751304636Sjkim# endif
752304636Sjkim	eor	r0,r5,r5,ror#5
753304636Sjkim	orr	r2,r2,r3,lsl#24
754304636Sjkim	eor	r0,r0,r5,ror#19	@ Sigma1(e)
755304636Sjkim#endif
756304636Sjkim	ldr	r3,[r14],#4			@ *K256++
757304636Sjkim	add	r8,r8,r2			@ h+=X[i]
758304636Sjkim	str	r2,[sp,#11*4]
759304636Sjkim	eor	r2,r6,r7
760304636Sjkim	add	r8,r8,r0,ror#6	@ h+=Sigma1(e)
761304636Sjkim	and	r2,r2,r5
762304636Sjkim	add	r8,r8,r3			@ h+=K256[i]
763304636Sjkim	eor	r2,r2,r7			@ Ch(e,f,g)
764304636Sjkim	eor	r0,r9,r9,ror#11
765304636Sjkim	add	r8,r8,r2			@ h+=Ch(e,f,g)
766304636Sjkim#if 11==31
767304636Sjkim	and	r3,r3,#0xff
768304636Sjkim	cmp	r3,#0xf2			@ done?
769304636Sjkim#endif
770304636Sjkim#if 11<15
771304636Sjkim# if __ARM_ARCH__>=7
772304636Sjkim	ldr	r2,[r1],#4			@ prefetch
773304636Sjkim# else
774304636Sjkim	ldrb	r2,[r1,#3]
775304636Sjkim# endif
776304636Sjkim	eor	r3,r9,r10			@ a^b, b^c in next round
777304636Sjkim#else
778304636Sjkim	ldr	r2,[sp,#13*4]		@ from future BODY_16_xx
779304636Sjkim	eor	r3,r9,r10			@ a^b, b^c in next round
780304636Sjkim	ldr	r1,[sp,#10*4]	@ from future BODY_16_xx
781304636Sjkim#endif
782304636Sjkim	eor	r0,r0,r9,ror#20	@ Sigma0(a)
783304636Sjkim	and	r12,r12,r3			@ (b^c)&=(a^b)
784304636Sjkim	add	r4,r4,r8			@ d+=h
785304636Sjkim	eor	r12,r12,r10			@ Maj(a,b,c)
786304636Sjkim	add	r8,r8,r0,ror#2	@ h+=Sigma0(a)
787304636Sjkim	@ add	r8,r8,r12			@ h+=Maj(a,b,c)
788304636Sjkim#if __ARM_ARCH__>=7
789304636Sjkim	@ ldr	r2,[r1],#4			@ 12
790304636Sjkim# if 12==15
791304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
792304636Sjkim# endif
793304636Sjkim	eor	r0,r4,r4,ror#5
794304636Sjkim	add	r8,r8,r12			@ h+=Maj(a,b,c) from the past
795304636Sjkim	eor	r0,r0,r4,ror#19	@ Sigma1(e)
796304636Sjkim	rev	r2,r2
797304636Sjkim#else
798304636Sjkim	@ ldrb	r2,[r1,#3]			@ 12
799304636Sjkim	add	r8,r8,r12			@ h+=Maj(a,b,c) from the past
800304636Sjkim	ldrb	r12,[r1,#2]
801304636Sjkim	ldrb	r0,[r1,#1]
802304636Sjkim	orr	r2,r2,r12,lsl#8
803304636Sjkim	ldrb	r12,[r1],#4
804304636Sjkim	orr	r2,r2,r0,lsl#16
805304636Sjkim# if 12==15
806304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
807304636Sjkim# endif
808304636Sjkim	eor	r0,r4,r4,ror#5
809304636Sjkim	orr	r2,r2,r12,lsl#24
810304636Sjkim	eor	r0,r0,r4,ror#19	@ Sigma1(e)
811304636Sjkim#endif
812304636Sjkim	ldr	r12,[r14],#4			@ *K256++
813304636Sjkim	add	r7,r7,r2			@ h+=X[i]
814304636Sjkim	str	r2,[sp,#12*4]
815304636Sjkim	eor	r2,r5,r6
816304636Sjkim	add	r7,r7,r0,ror#6	@ h+=Sigma1(e)
817304636Sjkim	and	r2,r2,r4
818304636Sjkim	add	r7,r7,r12			@ h+=K256[i]
819304636Sjkim	eor	r2,r2,r6			@ Ch(e,f,g)
820304636Sjkim	eor	r0,r8,r8,ror#11
821304636Sjkim	add	r7,r7,r2			@ h+=Ch(e,f,g)
822304636Sjkim#if 12==31
823304636Sjkim	and	r12,r12,#0xff
824304636Sjkim	cmp	r12,#0xf2			@ done?
825304636Sjkim#endif
826304636Sjkim#if 12<15
827304636Sjkim# if __ARM_ARCH__>=7
828304636Sjkim	ldr	r2,[r1],#4			@ prefetch
829304636Sjkim# else
830304636Sjkim	ldrb	r2,[r1,#3]
831304636Sjkim# endif
832304636Sjkim	eor	r12,r8,r9			@ a^b, b^c in next round
833304636Sjkim#else
834304636Sjkim	ldr	r2,[sp,#14*4]		@ from future BODY_16_xx
835304636Sjkim	eor	r12,r8,r9			@ a^b, b^c in next round
836304636Sjkim	ldr	r1,[sp,#11*4]	@ from future BODY_16_xx
837304636Sjkim#endif
838304636Sjkim	eor	r0,r0,r8,ror#20	@ Sigma0(a)
839304636Sjkim	and	r3,r3,r12			@ (b^c)&=(a^b)
840304636Sjkim	add	r11,r11,r7			@ d+=h
841304636Sjkim	eor	r3,r3,r9			@ Maj(a,b,c)
842304636Sjkim	add	r7,r7,r0,ror#2	@ h+=Sigma0(a)
843304636Sjkim	@ add	r7,r7,r3			@ h+=Maj(a,b,c)
844304636Sjkim#if __ARM_ARCH__>=7
845304636Sjkim	@ ldr	r2,[r1],#4			@ 13
846304636Sjkim# if 13==15
847304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
848304636Sjkim# endif
849304636Sjkim	eor	r0,r11,r11,ror#5
850304636Sjkim	add	r7,r7,r3			@ h+=Maj(a,b,c) from the past
851304636Sjkim	eor	r0,r0,r11,ror#19	@ Sigma1(e)
852304636Sjkim	rev	r2,r2
853304636Sjkim#else
854304636Sjkim	@ ldrb	r2,[r1,#3]			@ 13
855304636Sjkim	add	r7,r7,r3			@ h+=Maj(a,b,c) from the past
856304636Sjkim	ldrb	r3,[r1,#2]
857304636Sjkim	ldrb	r0,[r1,#1]
858304636Sjkim	orr	r2,r2,r3,lsl#8
859304636Sjkim	ldrb	r3,[r1],#4
860304636Sjkim	orr	r2,r2,r0,lsl#16
861304636Sjkim# if 13==15
862304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
863304636Sjkim# endif
864304636Sjkim	eor	r0,r11,r11,ror#5
865304636Sjkim	orr	r2,r2,r3,lsl#24
866304636Sjkim	eor	r0,r0,r11,ror#19	@ Sigma1(e)
867304636Sjkim#endif
868304636Sjkim	ldr	r3,[r14],#4			@ *K256++
869304636Sjkim	add	r6,r6,r2			@ h+=X[i]
870304636Sjkim	str	r2,[sp,#13*4]
871304636Sjkim	eor	r2,r4,r5
872304636Sjkim	add	r6,r6,r0,ror#6	@ h+=Sigma1(e)
873304636Sjkim	and	r2,r2,r11
874304636Sjkim	add	r6,r6,r3			@ h+=K256[i]
875304636Sjkim	eor	r2,r2,r5			@ Ch(e,f,g)
876304636Sjkim	eor	r0,r7,r7,ror#11
877304636Sjkim	add	r6,r6,r2			@ h+=Ch(e,f,g)
878304636Sjkim#if 13==31
879304636Sjkim	and	r3,r3,#0xff
880304636Sjkim	cmp	r3,#0xf2			@ done?
881304636Sjkim#endif
882304636Sjkim#if 13<15
883304636Sjkim# if __ARM_ARCH__>=7
884304636Sjkim	ldr	r2,[r1],#4			@ prefetch
885304636Sjkim# else
886304636Sjkim	ldrb	r2,[r1,#3]
887304636Sjkim# endif
888304636Sjkim	eor	r3,r7,r8			@ a^b, b^c in next round
889304636Sjkim#else
890304636Sjkim	ldr	r2,[sp,#15*4]		@ from future BODY_16_xx
891304636Sjkim	eor	r3,r7,r8			@ a^b, b^c in next round
892304636Sjkim	ldr	r1,[sp,#12*4]	@ from future BODY_16_xx
893304636Sjkim#endif
894304636Sjkim	eor	r0,r0,r7,ror#20	@ Sigma0(a)
895304636Sjkim	and	r12,r12,r3			@ (b^c)&=(a^b)
896304636Sjkim	add	r10,r10,r6			@ d+=h
897304636Sjkim	eor	r12,r12,r8			@ Maj(a,b,c)
898304636Sjkim	add	r6,r6,r0,ror#2	@ h+=Sigma0(a)
899304636Sjkim	@ add	r6,r6,r12			@ h+=Maj(a,b,c)
900304636Sjkim#if __ARM_ARCH__>=7
901304636Sjkim	@ ldr	r2,[r1],#4			@ 14
902304636Sjkim# if 14==15
903304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
904304636Sjkim# endif
905304636Sjkim	eor	r0,r10,r10,ror#5
906304636Sjkim	add	r6,r6,r12			@ h+=Maj(a,b,c) from the past
907304636Sjkim	eor	r0,r0,r10,ror#19	@ Sigma1(e)
908304636Sjkim	rev	r2,r2
909304636Sjkim#else
910304636Sjkim	@ ldrb	r2,[r1,#3]			@ 14
911304636Sjkim	add	r6,r6,r12			@ h+=Maj(a,b,c) from the past
912304636Sjkim	ldrb	r12,[r1,#2]
913304636Sjkim	ldrb	r0,[r1,#1]
914304636Sjkim	orr	r2,r2,r12,lsl#8
915304636Sjkim	ldrb	r12,[r1],#4
916304636Sjkim	orr	r2,r2,r0,lsl#16
917304636Sjkim# if 14==15
918304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
919304636Sjkim# endif
920304636Sjkim	eor	r0,r10,r10,ror#5
921304636Sjkim	orr	r2,r2,r12,lsl#24
922304636Sjkim	eor	r0,r0,r10,ror#19	@ Sigma1(e)
923304636Sjkim#endif
924304636Sjkim	ldr	r12,[r14],#4			@ *K256++
925304636Sjkim	add	r5,r5,r2			@ h+=X[i]
926304636Sjkim	str	r2,[sp,#14*4]
927304636Sjkim	eor	r2,r11,r4
928304636Sjkim	add	r5,r5,r0,ror#6	@ h+=Sigma1(e)
929304636Sjkim	and	r2,r2,r10
930304636Sjkim	add	r5,r5,r12			@ h+=K256[i]
931304636Sjkim	eor	r2,r2,r4			@ Ch(e,f,g)
932304636Sjkim	eor	r0,r6,r6,ror#11
933304636Sjkim	add	r5,r5,r2			@ h+=Ch(e,f,g)
934304636Sjkim#if 14==31
935304636Sjkim	and	r12,r12,#0xff
936304636Sjkim	cmp	r12,#0xf2			@ done?
937304636Sjkim#endif
938304636Sjkim#if 14<15
939304636Sjkim# if __ARM_ARCH__>=7
940304636Sjkim	ldr	r2,[r1],#4			@ prefetch
941304636Sjkim# else
942304636Sjkim	ldrb	r2,[r1,#3]
943304636Sjkim# endif
944304636Sjkim	eor	r12,r6,r7			@ a^b, b^c in next round
945304636Sjkim#else
946304636Sjkim	ldr	r2,[sp,#0*4]		@ from future BODY_16_xx
947304636Sjkim	eor	r12,r6,r7			@ a^b, b^c in next round
948304636Sjkim	ldr	r1,[sp,#13*4]	@ from future BODY_16_xx
949304636Sjkim#endif
950304636Sjkim	eor	r0,r0,r6,ror#20	@ Sigma0(a)
951304636Sjkim	and	r3,r3,r12			@ (b^c)&=(a^b)
952304636Sjkim	add	r9,r9,r5			@ d+=h
953304636Sjkim	eor	r3,r3,r7			@ Maj(a,b,c)
954304636Sjkim	add	r5,r5,r0,ror#2	@ h+=Sigma0(a)
955304636Sjkim	@ add	r5,r5,r3			@ h+=Maj(a,b,c)
956304636Sjkim#if __ARM_ARCH__>=7
957304636Sjkim	@ ldr	r2,[r1],#4			@ 15
958304636Sjkim# if 15==15
959304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
960304636Sjkim# endif
961304636Sjkim	eor	r0,r9,r9,ror#5
962304636Sjkim	add	r5,r5,r3			@ h+=Maj(a,b,c) from the past
963304636Sjkim	eor	r0,r0,r9,ror#19	@ Sigma1(e)
964304636Sjkim	rev	r2,r2
965304636Sjkim#else
966304636Sjkim	@ ldrb	r2,[r1,#3]			@ 15
967304636Sjkim	add	r5,r5,r3			@ h+=Maj(a,b,c) from the past
968304636Sjkim	ldrb	r3,[r1,#2]
969304636Sjkim	ldrb	r0,[r1,#1]
970304636Sjkim	orr	r2,r2,r3,lsl#8
971304636Sjkim	ldrb	r3,[r1],#4
972304636Sjkim	orr	r2,r2,r0,lsl#16
973304636Sjkim# if 15==15
974304636Sjkim	str	r1,[sp,#17*4]			@ make room for r1
975304636Sjkim# endif
976304636Sjkim	eor	r0,r9,r9,ror#5
977304636Sjkim	orr	r2,r2,r3,lsl#24
978304636Sjkim	eor	r0,r0,r9,ror#19	@ Sigma1(e)
979304636Sjkim#endif
980304636Sjkim	ldr	r3,[r14],#4			@ *K256++
981304636Sjkim	add	r4,r4,r2			@ h+=X[i]
982304636Sjkim	str	r2,[sp,#15*4]
983304636Sjkim	eor	r2,r10,r11
984304636Sjkim	add	r4,r4,r0,ror#6	@ h+=Sigma1(e)
985304636Sjkim	and	r2,r2,r9
986304636Sjkim	add	r4,r4,r3			@ h+=K256[i]
987304636Sjkim	eor	r2,r2,r11			@ Ch(e,f,g)
988304636Sjkim	eor	r0,r5,r5,ror#11
989304636Sjkim	add	r4,r4,r2			@ h+=Ch(e,f,g)
990304636Sjkim#if 15==31
991304636Sjkim	and	r3,r3,#0xff
992304636Sjkim	cmp	r3,#0xf2			@ done?
993304636Sjkim#endif
994304636Sjkim#if 15<15
995304636Sjkim# if __ARM_ARCH__>=7
996304636Sjkim	ldr	r2,[r1],#4			@ prefetch
997304636Sjkim# else
998304636Sjkim	ldrb	r2,[r1,#3]
999304636Sjkim# endif
1000304636Sjkim	eor	r3,r5,r6			@ a^b, b^c in next round
1001304636Sjkim#else
1002304636Sjkim	ldr	r2,[sp,#1*4]		@ from future BODY_16_xx
1003304636Sjkim	eor	r3,r5,r6			@ a^b, b^c in next round
1004304636Sjkim	ldr	r1,[sp,#14*4]	@ from future BODY_16_xx
1005304636Sjkim#endif
1006304636Sjkim	eor	r0,r0,r5,ror#20	@ Sigma0(a)
1007304636Sjkim	and	r12,r12,r3			@ (b^c)&=(a^b)
1008304636Sjkim	add	r8,r8,r4			@ d+=h
1009304636Sjkim	eor	r12,r12,r6			@ Maj(a,b,c)
1010304636Sjkim	add	r4,r4,r0,ror#2	@ h+=Sigma0(a)
1011304636Sjkim	@ add	r4,r4,r12			@ h+=Maj(a,b,c)
1012304636Sjkim.Lrounds_16_xx:
1013304636Sjkim	@ ldr	r2,[sp,#1*4]		@ 16
1014304636Sjkim	@ ldr	r1,[sp,#14*4]
1015304636Sjkim	mov	r0,r2,ror#7
1016304636Sjkim	add	r4,r4,r12			@ h+=Maj(a,b,c) from the past
1017304636Sjkim	mov	r12,r1,ror#17
1018304636Sjkim	eor	r0,r0,r2,ror#18
1019304636Sjkim	eor	r12,r12,r1,ror#19
1020304636Sjkim	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1021304636Sjkim	ldr	r2,[sp,#0*4]
1022304636Sjkim	eor	r12,r12,r1,lsr#10	@ sigma1(X[i+14])
1023304636Sjkim	ldr	r1,[sp,#9*4]
1024304636Sjkim
1025304636Sjkim	add	r12,r12,r0
1026304636Sjkim	eor	r0,r8,r8,ror#5	@ from BODY_00_15
1027304636Sjkim	add	r2,r2,r12
1028304636Sjkim	eor	r0,r0,r8,ror#19	@ Sigma1(e)
1029304636Sjkim	add	r2,r2,r1			@ X[i]
1030304636Sjkim	ldr	r12,[r14],#4			@ *K256++
1031304636Sjkim	add	r11,r11,r2			@ h+=X[i]
1032304636Sjkim	str	r2,[sp,#0*4]
1033304636Sjkim	eor	r2,r9,r10
1034304636Sjkim	add	r11,r11,r0,ror#6	@ h+=Sigma1(e)
1035304636Sjkim	and	r2,r2,r8
1036304636Sjkim	add	r11,r11,r12			@ h+=K256[i]
1037304636Sjkim	eor	r2,r2,r10			@ Ch(e,f,g)
1038304636Sjkim	eor	r0,r4,r4,ror#11
1039304636Sjkim	add	r11,r11,r2			@ h+=Ch(e,f,g)
1040304636Sjkim#if 16==31
1041304636Sjkim	and	r12,r12,#0xff
1042304636Sjkim	cmp	r12,#0xf2			@ done?
1043304636Sjkim#endif
1044304636Sjkim#if 16<15
1045304636Sjkim# if __ARM_ARCH__>=7
1046304636Sjkim	ldr	r2,[r1],#4			@ prefetch
1047304636Sjkim# else
1048304636Sjkim	ldrb	r2,[r1,#3]
1049304636Sjkim# endif
1050304636Sjkim	eor	r12,r4,r5			@ a^b, b^c in next round
1051304636Sjkim#else
1052304636Sjkim	ldr	r2,[sp,#2*4]		@ from future BODY_16_xx
1053304636Sjkim	eor	r12,r4,r5			@ a^b, b^c in next round
1054304636Sjkim	ldr	r1,[sp,#15*4]	@ from future BODY_16_xx
1055304636Sjkim#endif
1056304636Sjkim	eor	r0,r0,r4,ror#20	@ Sigma0(a)
1057304636Sjkim	and	r3,r3,r12			@ (b^c)&=(a^b)
1058304636Sjkim	add	r7,r7,r11			@ d+=h
1059304636Sjkim	eor	r3,r3,r5			@ Maj(a,b,c)
1060304636Sjkim	add	r11,r11,r0,ror#2	@ h+=Sigma0(a)
1061304636Sjkim	@ add	r11,r11,r3			@ h+=Maj(a,b,c)
1062304636Sjkim	@ ldr	r2,[sp,#2*4]		@ 17
1063304636Sjkim	@ ldr	r1,[sp,#15*4]
1064304636Sjkim	mov	r0,r2,ror#7
1065304636Sjkim	add	r11,r11,r3			@ h+=Maj(a,b,c) from the past
1066304636Sjkim	mov	r3,r1,ror#17
1067304636Sjkim	eor	r0,r0,r2,ror#18
1068304636Sjkim	eor	r3,r3,r1,ror#19
1069304636Sjkim	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1070304636Sjkim	ldr	r2,[sp,#1*4]
1071304636Sjkim	eor	r3,r3,r1,lsr#10	@ sigma1(X[i+14])
1072304636Sjkim	ldr	r1,[sp,#10*4]
1073304636Sjkim
1074304636Sjkim	add	r3,r3,r0
1075304636Sjkim	eor	r0,r7,r7,ror#5	@ from BODY_00_15
1076304636Sjkim	add	r2,r2,r3
1077304636Sjkim	eor	r0,r0,r7,ror#19	@ Sigma1(e)
1078304636Sjkim	add	r2,r2,r1			@ X[i]
1079304636Sjkim	ldr	r3,[r14],#4			@ *K256++
1080304636Sjkim	add	r10,r10,r2			@ h+=X[i]
1081304636Sjkim	str	r2,[sp,#1*4]
1082304636Sjkim	eor	r2,r8,r9
1083304636Sjkim	add	r10,r10,r0,ror#6	@ h+=Sigma1(e)
1084304636Sjkim	and	r2,r2,r7
1085304636Sjkim	add	r10,r10,r3			@ h+=K256[i]
1086304636Sjkim	eor	r2,r2,r9			@ Ch(e,f,g)
1087304636Sjkim	eor	r0,r11,r11,ror#11
1088304636Sjkim	add	r10,r10,r2			@ h+=Ch(e,f,g)
1089304636Sjkim#if 17==31
1090304636Sjkim	and	r3,r3,#0xff
1091304636Sjkim	cmp	r3,#0xf2			@ done?
1092304636Sjkim#endif
1093304636Sjkim#if 17<15
1094304636Sjkim# if __ARM_ARCH__>=7
1095304636Sjkim	ldr	r2,[r1],#4			@ prefetch
1096304636Sjkim# else
1097304636Sjkim	ldrb	r2,[r1,#3]
1098304636Sjkim# endif
1099304636Sjkim	eor	r3,r11,r4			@ a^b, b^c in next round
1100304636Sjkim#else
1101304636Sjkim	ldr	r2,[sp,#3*4]		@ from future BODY_16_xx
1102304636Sjkim	eor	r3,r11,r4			@ a^b, b^c in next round
1103304636Sjkim	ldr	r1,[sp,#0*4]	@ from future BODY_16_xx
1104304636Sjkim#endif
1105304636Sjkim	eor	r0,r0,r11,ror#20	@ Sigma0(a)
1106304636Sjkim	and	r12,r12,r3			@ (b^c)&=(a^b)
1107304636Sjkim	add	r6,r6,r10			@ d+=h
1108304636Sjkim	eor	r12,r12,r4			@ Maj(a,b,c)
1109304636Sjkim	add	r10,r10,r0,ror#2	@ h+=Sigma0(a)
1110304636Sjkim	@ add	r10,r10,r12			@ h+=Maj(a,b,c)
1111304636Sjkim	@ ldr	r2,[sp,#3*4]		@ 18
1112304636Sjkim	@ ldr	r1,[sp,#0*4]
1113304636Sjkim	mov	r0,r2,ror#7
1114304636Sjkim	add	r10,r10,r12			@ h+=Maj(a,b,c) from the past
1115304636Sjkim	mov	r12,r1,ror#17
1116304636Sjkim	eor	r0,r0,r2,ror#18
1117304636Sjkim	eor	r12,r12,r1,ror#19
1118304636Sjkim	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1119304636Sjkim	ldr	r2,[sp,#2*4]
1120304636Sjkim	eor	r12,r12,r1,lsr#10	@ sigma1(X[i+14])
1121304636Sjkim	ldr	r1,[sp,#11*4]
1122304636Sjkim
1123304636Sjkim	add	r12,r12,r0
1124304636Sjkim	eor	r0,r6,r6,ror#5	@ from BODY_00_15
1125304636Sjkim	add	r2,r2,r12
1126304636Sjkim	eor	r0,r0,r6,ror#19	@ Sigma1(e)
1127304636Sjkim	add	r2,r2,r1			@ X[i]
1128304636Sjkim	ldr	r12,[r14],#4			@ *K256++
1129304636Sjkim	add	r9,r9,r2			@ h+=X[i]
1130304636Sjkim	str	r2,[sp,#2*4]
1131304636Sjkim	eor	r2,r7,r8
1132304636Sjkim	add	r9,r9,r0,ror#6	@ h+=Sigma1(e)
1133304636Sjkim	and	r2,r2,r6
1134304636Sjkim	add	r9,r9,r12			@ h+=K256[i]
1135304636Sjkim	eor	r2,r2,r8			@ Ch(e,f,g)
1136304636Sjkim	eor	r0,r10,r10,ror#11
1137304636Sjkim	add	r9,r9,r2			@ h+=Ch(e,f,g)
1138304636Sjkim#if 18==31
1139304636Sjkim	and	r12,r12,#0xff
1140304636Sjkim	cmp	r12,#0xf2			@ done?
1141304636Sjkim#endif
1142304636Sjkim#if 18<15
1143304636Sjkim# if __ARM_ARCH__>=7
1144304636Sjkim	ldr	r2,[r1],#4			@ prefetch
1145304636Sjkim# else
1146304636Sjkim	ldrb	r2,[r1,#3]
1147304636Sjkim# endif
1148304636Sjkim	eor	r12,r10,r11			@ a^b, b^c in next round
1149304636Sjkim#else
1150304636Sjkim	ldr	r2,[sp,#4*4]		@ from future BODY_16_xx
1151304636Sjkim	eor	r12,r10,r11			@ a^b, b^c in next round
1152304636Sjkim	ldr	r1,[sp,#1*4]	@ from future BODY_16_xx
1153304636Sjkim#endif
1154304636Sjkim	eor	r0,r0,r10,ror#20	@ Sigma0(a)
1155304636Sjkim	and	r3,r3,r12			@ (b^c)&=(a^b)
1156304636Sjkim	add	r5,r5,r9			@ d+=h
1157304636Sjkim	eor	r3,r3,r11			@ Maj(a,b,c)
1158304636Sjkim	add	r9,r9,r0,ror#2	@ h+=Sigma0(a)
1159304636Sjkim	@ add	r9,r9,r3			@ h+=Maj(a,b,c)
1160304636Sjkim	@ ldr	r2,[sp,#4*4]		@ 19
1161304636Sjkim	@ ldr	r1,[sp,#1*4]
1162304636Sjkim	mov	r0,r2,ror#7
1163304636Sjkim	add	r9,r9,r3			@ h+=Maj(a,b,c) from the past
1164304636Sjkim	mov	r3,r1,ror#17
1165304636Sjkim	eor	r0,r0,r2,ror#18
1166304636Sjkim	eor	r3,r3,r1,ror#19
1167304636Sjkim	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1168304636Sjkim	ldr	r2,[sp,#3*4]
1169304636Sjkim	eor	r3,r3,r1,lsr#10	@ sigma1(X[i+14])
1170304636Sjkim	ldr	r1,[sp,#12*4]
1171304636Sjkim
1172304636Sjkim	add	r3,r3,r0
1173304636Sjkim	eor	r0,r5,r5,ror#5	@ from BODY_00_15
1174304636Sjkim	add	r2,r2,r3
1175304636Sjkim	eor	r0,r0,r5,ror#19	@ Sigma1(e)
1176304636Sjkim	add	r2,r2,r1			@ X[i]
1177304636Sjkim	ldr	r3,[r14],#4			@ *K256++
1178304636Sjkim	add	r8,r8,r2			@ h+=X[i]
1179304636Sjkim	str	r2,[sp,#3*4]
1180304636Sjkim	eor	r2,r6,r7
1181304636Sjkim	add	r8,r8,r0,ror#6	@ h+=Sigma1(e)
1182304636Sjkim	and	r2,r2,r5
1183304636Sjkim	add	r8,r8,r3			@ h+=K256[i]
1184304636Sjkim	eor	r2,r2,r7			@ Ch(e,f,g)
1185304636Sjkim	eor	r0,r9,r9,ror#11
1186304636Sjkim	add	r8,r8,r2			@ h+=Ch(e,f,g)
1187304636Sjkim#if 19==31
1188304636Sjkim	and	r3,r3,#0xff
1189304636Sjkim	cmp	r3,#0xf2			@ done?
1190304636Sjkim#endif
1191304636Sjkim#if 19<15
1192304636Sjkim# if __ARM_ARCH__>=7
1193304636Sjkim	ldr	r2,[r1],#4			@ prefetch
1194304636Sjkim# else
1195304636Sjkim	ldrb	r2,[r1,#3]
1196304636Sjkim# endif
1197304636Sjkim	eor	r3,r9,r10			@ a^b, b^c in next round
1198304636Sjkim#else
1199304636Sjkim	ldr	r2,[sp,#5*4]		@ from future BODY_16_xx
1200304636Sjkim	eor	r3,r9,r10			@ a^b, b^c in next round
1201304636Sjkim	ldr	r1,[sp,#2*4]	@ from future BODY_16_xx
1202304636Sjkim#endif
1203304636Sjkim	eor	r0,r0,r9,ror#20	@ Sigma0(a)
1204304636Sjkim	and	r12,r12,r3			@ (b^c)&=(a^b)
1205304636Sjkim	add	r4,r4,r8			@ d+=h
1206304636Sjkim	eor	r12,r12,r10			@ Maj(a,b,c)
1207304636Sjkim	add	r8,r8,r0,ror#2	@ h+=Sigma0(a)
1208304636Sjkim	@ add	r8,r8,r12			@ h+=Maj(a,b,c)
1209304636Sjkim	@ ldr	r2,[sp,#5*4]		@ 20
1210304636Sjkim	@ ldr	r1,[sp,#2*4]
1211304636Sjkim	mov	r0,r2,ror#7
1212304636Sjkim	add	r8,r8,r12			@ h+=Maj(a,b,c) from the past
1213304636Sjkim	mov	r12,r1,ror#17
1214304636Sjkim	eor	r0,r0,r2,ror#18
1215304636Sjkim	eor	r12,r12,r1,ror#19
1216304636Sjkim	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1217304636Sjkim	ldr	r2,[sp,#4*4]
1218304636Sjkim	eor	r12,r12,r1,lsr#10	@ sigma1(X[i+14])
1219304636Sjkim	ldr	r1,[sp,#13*4]
1220304636Sjkim
1221304636Sjkim	add	r12,r12,r0
1222304636Sjkim	eor	r0,r4,r4,ror#5	@ from BODY_00_15
1223304636Sjkim	add	r2,r2,r12
1224304636Sjkim	eor	r0,r0,r4,ror#19	@ Sigma1(e)
1225304636Sjkim	add	r2,r2,r1			@ X[i]
1226304636Sjkim	ldr	r12,[r14],#4			@ *K256++
1227304636Sjkim	add	r7,r7,r2			@ h+=X[i]
1228304636Sjkim	str	r2,[sp,#4*4]
1229304636Sjkim	eor	r2,r5,r6
1230304636Sjkim	add	r7,r7,r0,ror#6	@ h+=Sigma1(e)
1231304636Sjkim	and	r2,r2,r4
1232304636Sjkim	add	r7,r7,r12			@ h+=K256[i]
1233304636Sjkim	eor	r2,r2,r6			@ Ch(e,f,g)
1234304636Sjkim	eor	r0,r8,r8,ror#11
1235304636Sjkim	add	r7,r7,r2			@ h+=Ch(e,f,g)
1236304636Sjkim#if 20==31
1237304636Sjkim	and	r12,r12,#0xff
1238304636Sjkim	cmp	r12,#0xf2			@ done?
1239304636Sjkim#endif
1240304636Sjkim#if 20<15
1241304636Sjkim# if __ARM_ARCH__>=7
1242304636Sjkim	ldr	r2,[r1],#4			@ prefetch
1243304636Sjkim# else
1244304636Sjkim	ldrb	r2,[r1,#3]
1245304636Sjkim# endif
1246304636Sjkim	eor	r12,r8,r9			@ a^b, b^c in next round
1247304636Sjkim#else
1248304636Sjkim	ldr	r2,[sp,#6*4]		@ from future BODY_16_xx
1249304636Sjkim	eor	r12,r8,r9			@ a^b, b^c in next round
1250304636Sjkim	ldr	r1,[sp,#3*4]	@ from future BODY_16_xx
1251304636Sjkim#endif
1252304636Sjkim	eor	r0,r0,r8,ror#20	@ Sigma0(a)
1253304636Sjkim	and	r3,r3,r12			@ (b^c)&=(a^b)
1254304636Sjkim	add	r11,r11,r7			@ d+=h
1255304636Sjkim	eor	r3,r3,r9			@ Maj(a,b,c)
1256304636Sjkim	add	r7,r7,r0,ror#2	@ h+=Sigma0(a)
1257304636Sjkim	@ add	r7,r7,r3			@ h+=Maj(a,b,c)
1258304636Sjkim	@ ldr	r2,[sp,#6*4]		@ 21
1259304636Sjkim	@ ldr	r1,[sp,#3*4]
1260304636Sjkim	mov	r0,r2,ror#7
1261304636Sjkim	add	r7,r7,r3			@ h+=Maj(a,b,c) from the past
1262304636Sjkim	mov	r3,r1,ror#17
1263304636Sjkim	eor	r0,r0,r2,ror#18
1264304636Sjkim	eor	r3,r3,r1,ror#19
1265304636Sjkim	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1266304636Sjkim	ldr	r2,[sp,#5*4]
1267304636Sjkim	eor	r3,r3,r1,lsr#10	@ sigma1(X[i+14])
1268304636Sjkim	ldr	r1,[sp,#14*4]
1269304636Sjkim
1270304636Sjkim	add	r3,r3,r0
1271304636Sjkim	eor	r0,r11,r11,ror#5	@ from BODY_00_15
1272304636Sjkim	add	r2,r2,r3
1273304636Sjkim	eor	r0,r0,r11,ror#19	@ Sigma1(e)
1274304636Sjkim	add	r2,r2,r1			@ X[i]
1275304636Sjkim	ldr	r3,[r14],#4			@ *K256++
1276304636Sjkim	add	r6,r6,r2			@ h+=X[i]
1277304636Sjkim	str	r2,[sp,#5*4]
1278304636Sjkim	eor	r2,r4,r5
1279304636Sjkim	add	r6,r6,r0,ror#6	@ h+=Sigma1(e)
1280304636Sjkim	and	r2,r2,r11
1281304636Sjkim	add	r6,r6,r3			@ h+=K256[i]
1282304636Sjkim	eor	r2,r2,r5			@ Ch(e,f,g)
1283304636Sjkim	eor	r0,r7,r7,ror#11
1284304636Sjkim	add	r6,r6,r2			@ h+=Ch(e,f,g)
1285304636Sjkim#if 21==31
1286304636Sjkim	and	r3,r3,#0xff
1287304636Sjkim	cmp	r3,#0xf2			@ done?
1288304636Sjkim#endif
1289304636Sjkim#if 21<15
1290304636Sjkim# if __ARM_ARCH__>=7
1291304636Sjkim	ldr	r2,[r1],#4			@ prefetch
1292304636Sjkim# else
1293304636Sjkim	ldrb	r2,[r1,#3]
1294304636Sjkim# endif
1295304636Sjkim	eor	r3,r7,r8			@ a^b, b^c in next round
1296304636Sjkim#else
1297304636Sjkim	ldr	r2,[sp,#7*4]		@ from future BODY_16_xx
1298304636Sjkim	eor	r3,r7,r8			@ a^b, b^c in next round
1299304636Sjkim	ldr	r1,[sp,#4*4]	@ from future BODY_16_xx
1300304636Sjkim#endif
1301304636Sjkim	eor	r0,r0,r7,ror#20	@ Sigma0(a)
1302304636Sjkim	and	r12,r12,r3			@ (b^c)&=(a^b)
1303304636Sjkim	add	r10,r10,r6			@ d+=h
1304304636Sjkim	eor	r12,r12,r8			@ Maj(a,b,c)
1305304636Sjkim	add	r6,r6,r0,ror#2	@ h+=Sigma0(a)
1306304636Sjkim	@ add	r6,r6,r12			@ h+=Maj(a,b,c)
1307304636Sjkim	@ ldr	r2,[sp,#7*4]		@ 22
1308304636Sjkim	@ ldr	r1,[sp,#4*4]
1309304636Sjkim	mov	r0,r2,ror#7
1310304636Sjkim	add	r6,r6,r12			@ h+=Maj(a,b,c) from the past
1311304636Sjkim	mov	r12,r1,ror#17
1312304636Sjkim	eor	r0,r0,r2,ror#18
1313304636Sjkim	eor	r12,r12,r1,ror#19
1314304636Sjkim	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1315304636Sjkim	ldr	r2,[sp,#6*4]
1316304636Sjkim	eor	r12,r12,r1,lsr#10	@ sigma1(X[i+14])
1317304636Sjkim	ldr	r1,[sp,#15*4]
1318304636Sjkim
1319304636Sjkim	add	r12,r12,r0
1320304636Sjkim	eor	r0,r10,r10,ror#5	@ from BODY_00_15
1321304636Sjkim	add	r2,r2,r12
1322304636Sjkim	eor	r0,r0,r10,ror#19	@ Sigma1(e)
1323304636Sjkim	add	r2,r2,r1			@ X[i]
1324304636Sjkim	ldr	r12,[r14],#4			@ *K256++
1325304636Sjkim	add	r5,r5,r2			@ h+=X[i]
1326304636Sjkim	str	r2,[sp,#6*4]
1327304636Sjkim	eor	r2,r11,r4
1328304636Sjkim	add	r5,r5,r0,ror#6	@ h+=Sigma1(e)
1329304636Sjkim	and	r2,r2,r10
1330304636Sjkim	add	r5,r5,r12			@ h+=K256[i]
1331304636Sjkim	eor	r2,r2,r4			@ Ch(e,f,g)
1332304636Sjkim	eor	r0,r6,r6,ror#11
1333304636Sjkim	add	r5,r5,r2			@ h+=Ch(e,f,g)
1334304636Sjkim#if 22==31
1335304636Sjkim	and	r12,r12,#0xff
1336304636Sjkim	cmp	r12,#0xf2			@ done?
1337304636Sjkim#endif
1338304636Sjkim#if 22<15
1339304636Sjkim# if __ARM_ARCH__>=7
1340304636Sjkim	ldr	r2,[r1],#4			@ prefetch
1341304636Sjkim# else
1342304636Sjkim	ldrb	r2,[r1,#3]
1343304636Sjkim# endif
1344304636Sjkim	eor	r12,r6,r7			@ a^b, b^c in next round
1345304636Sjkim#else
1346304636Sjkim	ldr	r2,[sp,#8*4]		@ from future BODY_16_xx
1347304636Sjkim	eor	r12,r6,r7			@ a^b, b^c in next round
1348304636Sjkim	ldr	r1,[sp,#5*4]	@ from future BODY_16_xx
1349304636Sjkim#endif
1350304636Sjkim	eor	r0,r0,r6,ror#20	@ Sigma0(a)
1351304636Sjkim	and	r3,r3,r12			@ (b^c)&=(a^b)
1352304636Sjkim	add	r9,r9,r5			@ d+=h
1353304636Sjkim	eor	r3,r3,r7			@ Maj(a,b,c)
1354304636Sjkim	add	r5,r5,r0,ror#2	@ h+=Sigma0(a)
1355304636Sjkim	@ add	r5,r5,r3			@ h+=Maj(a,b,c)
1356304636Sjkim	@ ldr	r2,[sp,#8*4]		@ 23
1357304636Sjkim	@ ldr	r1,[sp,#5*4]
1358304636Sjkim	mov	r0,r2,ror#7
1359304636Sjkim	add	r5,r5,r3			@ h+=Maj(a,b,c) from the past
1360304636Sjkim	mov	r3,r1,ror#17
1361304636Sjkim	eor	r0,r0,r2,ror#18
1362304636Sjkim	eor	r3,r3,r1,ror#19
1363304636Sjkim	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1364304636Sjkim	ldr	r2,[sp,#7*4]
1365304636Sjkim	eor	r3,r3,r1,lsr#10	@ sigma1(X[i+14])
1366304636Sjkim	ldr	r1,[sp,#0*4]
1367304636Sjkim
1368304636Sjkim	add	r3,r3,r0
1369304636Sjkim	eor	r0,r9,r9,ror#5	@ from BODY_00_15
1370304636Sjkim	add	r2,r2,r3
1371304636Sjkim	eor	r0,r0,r9,ror#19	@ Sigma1(e)
1372304636Sjkim	add	r2,r2,r1			@ X[i]
1373304636Sjkim	ldr	r3,[r14],#4			@ *K256++
1374304636Sjkim	add	r4,r4,r2			@ h+=X[i]
1375304636Sjkim	str	r2,[sp,#7*4]
1376304636Sjkim	eor	r2,r10,r11
1377304636Sjkim	add	r4,r4,r0,ror#6	@ h+=Sigma1(e)
1378304636Sjkim	and	r2,r2,r9
1379304636Sjkim	add	r4,r4,r3			@ h+=K256[i]
1380304636Sjkim	eor	r2,r2,r11			@ Ch(e,f,g)
1381304636Sjkim	eor	r0,r5,r5,ror#11
1382304636Sjkim	add	r4,r4,r2			@ h+=Ch(e,f,g)
1383304636Sjkim#if 23==31
1384304636Sjkim	and	r3,r3,#0xff
1385304636Sjkim	cmp	r3,#0xf2			@ done?
1386304636Sjkim#endif
1387304636Sjkim#if 23<15
1388304636Sjkim# if __ARM_ARCH__>=7
1389304636Sjkim	ldr	r2,[r1],#4			@ prefetch
1390304636Sjkim# else
1391304636Sjkim	ldrb	r2,[r1,#3]
1392304636Sjkim# endif
1393304636Sjkim	eor	r3,r5,r6			@ a^b, b^c in next round
1394304636Sjkim#else
1395304636Sjkim	ldr	r2,[sp,#9*4]		@ from future BODY_16_xx
1396304636Sjkim	eor	r3,r5,r6			@ a^b, b^c in next round
1397304636Sjkim	ldr	r1,[sp,#6*4]	@ from future BODY_16_xx
1398304636Sjkim#endif
1399304636Sjkim	eor	r0,r0,r5,ror#20	@ Sigma0(a)
1400304636Sjkim	and	r12,r12,r3			@ (b^c)&=(a^b)
1401304636Sjkim	add	r8,r8,r4			@ d+=h
1402304636Sjkim	eor	r12,r12,r6			@ Maj(a,b,c)
1403304636Sjkim	add	r4,r4,r0,ror#2	@ h+=Sigma0(a)
1404304636Sjkim	@ add	r4,r4,r12			@ h+=Maj(a,b,c)
1405304636Sjkim	@ ldr	r2,[sp,#9*4]		@ 24
1406304636Sjkim	@ ldr	r1,[sp,#6*4]
1407304636Sjkim	mov	r0,r2,ror#7
1408304636Sjkim	add	r4,r4,r12			@ h+=Maj(a,b,c) from the past
1409304636Sjkim	mov	r12,r1,ror#17
1410304636Sjkim	eor	r0,r0,r2,ror#18
1411304636Sjkim	eor	r12,r12,r1,ror#19
1412304636Sjkim	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1413304636Sjkim	ldr	r2,[sp,#8*4]
1414304636Sjkim	eor	r12,r12,r1,lsr#10	@ sigma1(X[i+14])
1415304636Sjkim	ldr	r1,[sp,#1*4]
1416304636Sjkim
1417304636Sjkim	add	r12,r12,r0
1418304636Sjkim	eor	r0,r8,r8,ror#5	@ from BODY_00_15
1419304636Sjkim	add	r2,r2,r12
1420304636Sjkim	eor	r0,r0,r8,ror#19	@ Sigma1(e)
1421304636Sjkim	add	r2,r2,r1			@ X[i]
1422304636Sjkim	ldr	r12,[r14],#4			@ *K256++
1423304636Sjkim	add	r11,r11,r2			@ h+=X[i]
1424304636Sjkim	str	r2,[sp,#8*4]
1425304636Sjkim	eor	r2,r9,r10
1426304636Sjkim	add	r11,r11,r0,ror#6	@ h+=Sigma1(e)
1427304636Sjkim	and	r2,r2,r8
1428304636Sjkim	add	r11,r11,r12			@ h+=K256[i]
1429304636Sjkim	eor	r2,r2,r10			@ Ch(e,f,g)
1430304636Sjkim	eor	r0,r4,r4,ror#11
1431304636Sjkim	add	r11,r11,r2			@ h+=Ch(e,f,g)
1432304636Sjkim#if 24==31
1433304636Sjkim	and	r12,r12,#0xff
1434304636Sjkim	cmp	r12,#0xf2			@ done?
1435304636Sjkim#endif
1436304636Sjkim#if 24<15
1437304636Sjkim# if __ARM_ARCH__>=7
1438304636Sjkim	ldr	r2,[r1],#4			@ prefetch
1439304636Sjkim# else
1440304636Sjkim	ldrb	r2,[r1,#3]
1441304636Sjkim# endif
1442304636Sjkim	eor	r12,r4,r5			@ a^b, b^c in next round
1443304636Sjkim#else
1444304636Sjkim	ldr	r2,[sp,#10*4]		@ from future BODY_16_xx
1445304636Sjkim	eor	r12,r4,r5			@ a^b, b^c in next round
1446304636Sjkim	ldr	r1,[sp,#7*4]	@ from future BODY_16_xx
1447304636Sjkim#endif
1448304636Sjkim	eor	r0,r0,r4,ror#20	@ Sigma0(a)
1449304636Sjkim	and	r3,r3,r12			@ (b^c)&=(a^b)
1450304636Sjkim	add	r7,r7,r11			@ d+=h
1451304636Sjkim	eor	r3,r3,r5			@ Maj(a,b,c)
1452304636Sjkim	add	r11,r11,r0,ror#2	@ h+=Sigma0(a)
1453304636Sjkim	@ add	r11,r11,r3			@ h+=Maj(a,b,c)
1454304636Sjkim	@ ldr	r2,[sp,#10*4]		@ 25
1455304636Sjkim	@ ldr	r1,[sp,#7*4]
1456304636Sjkim	mov	r0,r2,ror#7
1457304636Sjkim	add	r11,r11,r3			@ h+=Maj(a,b,c) from the past
1458304636Sjkim	mov	r3,r1,ror#17
1459304636Sjkim	eor	r0,r0,r2,ror#18
1460304636Sjkim	eor	r3,r3,r1,ror#19
1461304636Sjkim	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1462304636Sjkim	ldr	r2,[sp,#9*4]
1463304636Sjkim	eor	r3,r3,r1,lsr#10	@ sigma1(X[i+14])
1464304636Sjkim	ldr	r1,[sp,#2*4]
1465304636Sjkim
1466304636Sjkim	add	r3,r3,r0
1467304636Sjkim	eor	r0,r7,r7,ror#5	@ from BODY_00_15
1468304636Sjkim	add	r2,r2,r3
1469304636Sjkim	eor	r0,r0,r7,ror#19	@ Sigma1(e)
1470304636Sjkim	add	r2,r2,r1			@ X[i]
1471304636Sjkim	ldr	r3,[r14],#4			@ *K256++
1472304636Sjkim	add	r10,r10,r2			@ h+=X[i]
1473304636Sjkim	str	r2,[sp,#9*4]
1474304636Sjkim	eor	r2,r8,r9
1475304636Sjkim	add	r10,r10,r0,ror#6	@ h+=Sigma1(e)
1476304636Sjkim	and	r2,r2,r7
1477304636Sjkim	add	r10,r10,r3			@ h+=K256[i]
1478304636Sjkim	eor	r2,r2,r9			@ Ch(e,f,g)
1479304636Sjkim	eor	r0,r11,r11,ror#11
1480304636Sjkim	add	r10,r10,r2			@ h+=Ch(e,f,g)
1481304636Sjkim#if 25==31
1482304636Sjkim	and	r3,r3,#0xff
1483304636Sjkim	cmp	r3,#0xf2			@ done?
1484304636Sjkim#endif
1485304636Sjkim#if 25<15
1486304636Sjkim# if __ARM_ARCH__>=7
1487304636Sjkim	ldr	r2,[r1],#4			@ prefetch
1488304636Sjkim# else
1489304636Sjkim	ldrb	r2,[r1,#3]
1490304636Sjkim# endif
1491304636Sjkim	eor	r3,r11,r4			@ a^b, b^c in next round
1492304636Sjkim#else
1493304636Sjkim	ldr	r2,[sp,#11*4]		@ from future BODY_16_xx
1494304636Sjkim	eor	r3,r11,r4			@ a^b, b^c in next round
1495304636Sjkim	ldr	r1,[sp,#8*4]	@ from future BODY_16_xx
1496304636Sjkim#endif
1497304636Sjkim	eor	r0,r0,r11,ror#20	@ Sigma0(a)
1498304636Sjkim	and	r12,r12,r3			@ (b^c)&=(a^b)
1499304636Sjkim	add	r6,r6,r10			@ d+=h
1500304636Sjkim	eor	r12,r12,r4			@ Maj(a,b,c)
1501304636Sjkim	add	r10,r10,r0,ror#2	@ h+=Sigma0(a)
1502304636Sjkim	@ add	r10,r10,r12			@ h+=Maj(a,b,c)
1503304636Sjkim	@ ldr	r2,[sp,#11*4]		@ 26
1504304636Sjkim	@ ldr	r1,[sp,#8*4]
1505304636Sjkim	mov	r0,r2,ror#7
1506304636Sjkim	add	r10,r10,r12			@ h+=Maj(a,b,c) from the past
1507304636Sjkim	mov	r12,r1,ror#17
1508304636Sjkim	eor	r0,r0,r2,ror#18
1509304636Sjkim	eor	r12,r12,r1,ror#19
1510304636Sjkim	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1511304636Sjkim	ldr	r2,[sp,#10*4]
1512304636Sjkim	eor	r12,r12,r1,lsr#10	@ sigma1(X[i+14])
1513304636Sjkim	ldr	r1,[sp,#3*4]
1514304636Sjkim
1515304636Sjkim	add	r12,r12,r0
1516304636Sjkim	eor	r0,r6,r6,ror#5	@ from BODY_00_15
1517304636Sjkim	add	r2,r2,r12
1518304636Sjkim	eor	r0,r0,r6,ror#19	@ Sigma1(e)
1519304636Sjkim	add	r2,r2,r1			@ X[i]
1520304636Sjkim	ldr	r12,[r14],#4			@ *K256++
1521304636Sjkim	add	r9,r9,r2			@ h+=X[i]
1522304636Sjkim	str	r2,[sp,#10*4]
1523304636Sjkim	eor	r2,r7,r8
1524304636Sjkim	add	r9,r9,r0,ror#6	@ h+=Sigma1(e)
1525304636Sjkim	and	r2,r2,r6
1526304636Sjkim	add	r9,r9,r12			@ h+=K256[i]
1527304636Sjkim	eor	r2,r2,r8			@ Ch(e,f,g)
1528304636Sjkim	eor	r0,r10,r10,ror#11
1529304636Sjkim	add	r9,r9,r2			@ h+=Ch(e,f,g)
1530304636Sjkim#if 26==31
1531304636Sjkim	and	r12,r12,#0xff
1532304636Sjkim	cmp	r12,#0xf2			@ done?
1533304636Sjkim#endif
1534304636Sjkim#if 26<15
1535304636Sjkim# if __ARM_ARCH__>=7
1536304636Sjkim	ldr	r2,[r1],#4			@ prefetch
1537304636Sjkim# else
1538304636Sjkim	ldrb	r2,[r1,#3]
1539304636Sjkim# endif
1540304636Sjkim	eor	r12,r10,r11			@ a^b, b^c in next round
1541304636Sjkim#else
1542304636Sjkim	ldr	r2,[sp,#12*4]		@ from future BODY_16_xx
1543304636Sjkim	eor	r12,r10,r11			@ a^b, b^c in next round
1544304636Sjkim	ldr	r1,[sp,#9*4]	@ from future BODY_16_xx
1545304636Sjkim#endif
1546304636Sjkim	eor	r0,r0,r10,ror#20	@ Sigma0(a)
1547304636Sjkim	and	r3,r3,r12			@ (b^c)&=(a^b)
1548304636Sjkim	add	r5,r5,r9			@ d+=h
1549304636Sjkim	eor	r3,r3,r11			@ Maj(a,b,c)
1550304636Sjkim	add	r9,r9,r0,ror#2	@ h+=Sigma0(a)
1551304636Sjkim	@ add	r9,r9,r3			@ h+=Maj(a,b,c)
1552304636Sjkim	@ ldr	r2,[sp,#12*4]		@ 27
1553304636Sjkim	@ ldr	r1,[sp,#9*4]
1554304636Sjkim	mov	r0,r2,ror#7
1555304636Sjkim	add	r9,r9,r3			@ h+=Maj(a,b,c) from the past
1556304636Sjkim	mov	r3,r1,ror#17
1557304636Sjkim	eor	r0,r0,r2,ror#18
1558304636Sjkim	eor	r3,r3,r1,ror#19
1559304636Sjkim	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1560304636Sjkim	ldr	r2,[sp,#11*4]
1561304636Sjkim	eor	r3,r3,r1,lsr#10	@ sigma1(X[i+14])
1562304636Sjkim	ldr	r1,[sp,#4*4]
1563304636Sjkim
1564304636Sjkim	add	r3,r3,r0
1565304636Sjkim	eor	r0,r5,r5,ror#5	@ from BODY_00_15
1566304636Sjkim	add	r2,r2,r3
1567304636Sjkim	eor	r0,r0,r5,ror#19	@ Sigma1(e)
1568304636Sjkim	add	r2,r2,r1			@ X[i]
1569304636Sjkim	ldr	r3,[r14],#4			@ *K256++
1570304636Sjkim	add	r8,r8,r2			@ h+=X[i]
1571304636Sjkim	str	r2,[sp,#11*4]
1572304636Sjkim	eor	r2,r6,r7
1573304636Sjkim	add	r8,r8,r0,ror#6	@ h+=Sigma1(e)
1574304636Sjkim	and	r2,r2,r5
1575304636Sjkim	add	r8,r8,r3			@ h+=K256[i]
1576304636Sjkim	eor	r2,r2,r7			@ Ch(e,f,g)
1577304636Sjkim	eor	r0,r9,r9,ror#11
1578304636Sjkim	add	r8,r8,r2			@ h+=Ch(e,f,g)
1579304636Sjkim#if 27==31
1580304636Sjkim	and	r3,r3,#0xff
1581304636Sjkim	cmp	r3,#0xf2			@ done?
1582304636Sjkim#endif
1583304636Sjkim#if 27<15
1584304636Sjkim# if __ARM_ARCH__>=7
1585304636Sjkim	ldr	r2,[r1],#4			@ prefetch
1586304636Sjkim# else
1587304636Sjkim	ldrb	r2,[r1,#3]
1588304636Sjkim# endif
1589304636Sjkim	eor	r3,r9,r10			@ a^b, b^c in next round
1590304636Sjkim#else
1591304636Sjkim	ldr	r2,[sp,#13*4]		@ from future BODY_16_xx
1592304636Sjkim	eor	r3,r9,r10			@ a^b, b^c in next round
1593304636Sjkim	ldr	r1,[sp,#10*4]	@ from future BODY_16_xx
1594304636Sjkim#endif
1595304636Sjkim	eor	r0,r0,r9,ror#20	@ Sigma0(a)
1596304636Sjkim	and	r12,r12,r3			@ (b^c)&=(a^b)
1597304636Sjkim	add	r4,r4,r8			@ d+=h
1598304636Sjkim	eor	r12,r12,r10			@ Maj(a,b,c)
1599304636Sjkim	add	r8,r8,r0,ror#2	@ h+=Sigma0(a)
1600304636Sjkim	@ add	r8,r8,r12			@ h+=Maj(a,b,c)
1601304636Sjkim	@ ldr	r2,[sp,#13*4]		@ 28
1602304636Sjkim	@ ldr	r1,[sp,#10*4]
1603304636Sjkim	mov	r0,r2,ror#7
1604304636Sjkim	add	r8,r8,r12			@ h+=Maj(a,b,c) from the past
1605304636Sjkim	mov	r12,r1,ror#17
1606304636Sjkim	eor	r0,r0,r2,ror#18
1607304636Sjkim	eor	r12,r12,r1,ror#19
1608304636Sjkim	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1609304636Sjkim	ldr	r2,[sp,#12*4]
1610304636Sjkim	eor	r12,r12,r1,lsr#10	@ sigma1(X[i+14])
1611304636Sjkim	ldr	r1,[sp,#5*4]
1612304636Sjkim
1613304636Sjkim	add	r12,r12,r0
1614304636Sjkim	eor	r0,r4,r4,ror#5	@ from BODY_00_15
1615304636Sjkim	add	r2,r2,r12
1616304636Sjkim	eor	r0,r0,r4,ror#19	@ Sigma1(e)
1617304636Sjkim	add	r2,r2,r1			@ X[i]
1618304636Sjkim	ldr	r12,[r14],#4			@ *K256++
1619304636Sjkim	add	r7,r7,r2			@ h+=X[i]
1620304636Sjkim	str	r2,[sp,#12*4]
1621304636Sjkim	eor	r2,r5,r6
1622304636Sjkim	add	r7,r7,r0,ror#6	@ h+=Sigma1(e)
1623304636Sjkim	and	r2,r2,r4
1624304636Sjkim	add	r7,r7,r12			@ h+=K256[i]
1625304636Sjkim	eor	r2,r2,r6			@ Ch(e,f,g)
1626304636Sjkim	eor	r0,r8,r8,ror#11
1627304636Sjkim	add	r7,r7,r2			@ h+=Ch(e,f,g)
1628304636Sjkim#if 28==31
1629304636Sjkim	and	r12,r12,#0xff
1630304636Sjkim	cmp	r12,#0xf2			@ done?
1631304636Sjkim#endif
1632304636Sjkim#if 28<15
1633304636Sjkim# if __ARM_ARCH__>=7
1634304636Sjkim	ldr	r2,[r1],#4			@ prefetch
1635304636Sjkim# else
1636304636Sjkim	ldrb	r2,[r1,#3]
1637304636Sjkim# endif
1638304636Sjkim	eor	r12,r8,r9			@ a^b, b^c in next round
1639304636Sjkim#else
1640304636Sjkim	ldr	r2,[sp,#14*4]		@ from future BODY_16_xx
1641304636Sjkim	eor	r12,r8,r9			@ a^b, b^c in next round
1642304636Sjkim	ldr	r1,[sp,#11*4]	@ from future BODY_16_xx
1643304636Sjkim#endif
1644304636Sjkim	eor	r0,r0,r8,ror#20	@ Sigma0(a)
1645304636Sjkim	and	r3,r3,r12			@ (b^c)&=(a^b)
1646304636Sjkim	add	r11,r11,r7			@ d+=h
1647304636Sjkim	eor	r3,r3,r9			@ Maj(a,b,c)
1648304636Sjkim	add	r7,r7,r0,ror#2	@ h+=Sigma0(a)
1649304636Sjkim	@ add	r7,r7,r3			@ h+=Maj(a,b,c)
1650304636Sjkim	@ ldr	r2,[sp,#14*4]		@ 29
1651304636Sjkim	@ ldr	r1,[sp,#11*4]
1652304636Sjkim	mov	r0,r2,ror#7
1653304636Sjkim	add	r7,r7,r3			@ h+=Maj(a,b,c) from the past
1654304636Sjkim	mov	r3,r1,ror#17
1655304636Sjkim	eor	r0,r0,r2,ror#18
1656304636Sjkim	eor	r3,r3,r1,ror#19
1657304636Sjkim	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1658304636Sjkim	ldr	r2,[sp,#13*4]
1659304636Sjkim	eor	r3,r3,r1,lsr#10	@ sigma1(X[i+14])
1660304636Sjkim	ldr	r1,[sp,#6*4]
1661304636Sjkim
1662304636Sjkim	add	r3,r3,r0
1663304636Sjkim	eor	r0,r11,r11,ror#5	@ from BODY_00_15
1664304636Sjkim	add	r2,r2,r3
1665304636Sjkim	eor	r0,r0,r11,ror#19	@ Sigma1(e)
1666304636Sjkim	add	r2,r2,r1			@ X[i]
1667304636Sjkim	ldr	r3,[r14],#4			@ *K256++
1668304636Sjkim	add	r6,r6,r2			@ h+=X[i]
1669304636Sjkim	str	r2,[sp,#13*4]
1670304636Sjkim	eor	r2,r4,r5
1671304636Sjkim	add	r6,r6,r0,ror#6	@ h+=Sigma1(e)
1672304636Sjkim	and	r2,r2,r11
1673304636Sjkim	add	r6,r6,r3			@ h+=K256[i]
1674304636Sjkim	eor	r2,r2,r5			@ Ch(e,f,g)
1675304636Sjkim	eor	r0,r7,r7,ror#11
1676304636Sjkim	add	r6,r6,r2			@ h+=Ch(e,f,g)
1677304636Sjkim#if 29==31
1678304636Sjkim	and	r3,r3,#0xff
1679304636Sjkim	cmp	r3,#0xf2			@ done?
1680304636Sjkim#endif
1681304636Sjkim#if 29<15
1682304636Sjkim# if __ARM_ARCH__>=7
1683304636Sjkim	ldr	r2,[r1],#4			@ prefetch
1684304636Sjkim# else
1685304636Sjkim	ldrb	r2,[r1,#3]
1686304636Sjkim# endif
1687304636Sjkim	eor	r3,r7,r8			@ a^b, b^c in next round
1688304636Sjkim#else
1689304636Sjkim	ldr	r2,[sp,#15*4]		@ from future BODY_16_xx
1690304636Sjkim	eor	r3,r7,r8			@ a^b, b^c in next round
1691304636Sjkim	ldr	r1,[sp,#12*4]	@ from future BODY_16_xx
1692304636Sjkim#endif
1693304636Sjkim	eor	r0,r0,r7,ror#20	@ Sigma0(a)
1694304636Sjkim	and	r12,r12,r3			@ (b^c)&=(a^b)
1695304636Sjkim	add	r10,r10,r6			@ d+=h
1696304636Sjkim	eor	r12,r12,r8			@ Maj(a,b,c)
1697304636Sjkim	add	r6,r6,r0,ror#2	@ h+=Sigma0(a)
1698304636Sjkim	@ add	r6,r6,r12			@ h+=Maj(a,b,c)
1699304636Sjkim	@ ldr	r2,[sp,#15*4]		@ 30
1700304636Sjkim	@ ldr	r1,[sp,#12*4]
1701304636Sjkim	mov	r0,r2,ror#7
1702304636Sjkim	add	r6,r6,r12			@ h+=Maj(a,b,c) from the past
1703304636Sjkim	mov	r12,r1,ror#17
1704304636Sjkim	eor	r0,r0,r2,ror#18
1705304636Sjkim	eor	r12,r12,r1,ror#19
1706304636Sjkim	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1707304636Sjkim	ldr	r2,[sp,#14*4]
1708304636Sjkim	eor	r12,r12,r1,lsr#10	@ sigma1(X[i+14])
1709304636Sjkim	ldr	r1,[sp,#7*4]
1710304636Sjkim
1711304636Sjkim	add	r12,r12,r0
1712304636Sjkim	eor	r0,r10,r10,ror#5	@ from BODY_00_15
1713304636Sjkim	add	r2,r2,r12
1714304636Sjkim	eor	r0,r0,r10,ror#19	@ Sigma1(e)
1715304636Sjkim	add	r2,r2,r1			@ X[i]
1716304636Sjkim	ldr	r12,[r14],#4			@ *K256++
1717304636Sjkim	add	r5,r5,r2			@ h+=X[i]
1718304636Sjkim	str	r2,[sp,#14*4]
1719304636Sjkim	eor	r2,r11,r4
1720304636Sjkim	add	r5,r5,r0,ror#6	@ h+=Sigma1(e)
1721304636Sjkim	and	r2,r2,r10
1722304636Sjkim	add	r5,r5,r12			@ h+=K256[i]
1723304636Sjkim	eor	r2,r2,r4			@ Ch(e,f,g)
1724304636Sjkim	eor	r0,r6,r6,ror#11
1725304636Sjkim	add	r5,r5,r2			@ h+=Ch(e,f,g)
1726304636Sjkim#if 30==31
1727304636Sjkim	and	r12,r12,#0xff
1728304636Sjkim	cmp	r12,#0xf2			@ done?
1729304636Sjkim#endif
1730304636Sjkim#if 30<15
1731304636Sjkim# if __ARM_ARCH__>=7
1732304636Sjkim	ldr	r2,[r1],#4			@ prefetch
1733304636Sjkim# else
1734304636Sjkim	ldrb	r2,[r1,#3]
1735304636Sjkim# endif
1736304636Sjkim	eor	r12,r6,r7			@ a^b, b^c in next round
1737304636Sjkim#else
1738304636Sjkim	ldr	r2,[sp,#0*4]		@ from future BODY_16_xx
1739304636Sjkim	eor	r12,r6,r7			@ a^b, b^c in next round
1740304636Sjkim	ldr	r1,[sp,#13*4]	@ from future BODY_16_xx
1741304636Sjkim#endif
1742304636Sjkim	eor	r0,r0,r6,ror#20	@ Sigma0(a)
1743304636Sjkim	and	r3,r3,r12			@ (b^c)&=(a^b)
1744304636Sjkim	add	r9,r9,r5			@ d+=h
1745304636Sjkim	eor	r3,r3,r7			@ Maj(a,b,c)
1746304636Sjkim	add	r5,r5,r0,ror#2	@ h+=Sigma0(a)
1747304636Sjkim	@ add	r5,r5,r3			@ h+=Maj(a,b,c)
1748304636Sjkim	@ ldr	r2,[sp,#0*4]		@ 31
1749304636Sjkim	@ ldr	r1,[sp,#13*4]
1750304636Sjkim	mov	r0,r2,ror#7
1751304636Sjkim	add	r5,r5,r3			@ h+=Maj(a,b,c) from the past
1752304636Sjkim	mov	r3,r1,ror#17
1753304636Sjkim	eor	r0,r0,r2,ror#18
1754304636Sjkim	eor	r3,r3,r1,ror#19
1755304636Sjkim	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1756304636Sjkim	ldr	r2,[sp,#15*4]
1757304636Sjkim	eor	r3,r3,r1,lsr#10	@ sigma1(X[i+14])
1758304636Sjkim	ldr	r1,[sp,#8*4]
1759304636Sjkim
1760304636Sjkim	add	r3,r3,r0
1761304636Sjkim	eor	r0,r9,r9,ror#5	@ from BODY_00_15
1762304636Sjkim	add	r2,r2,r3
1763304636Sjkim	eor	r0,r0,r9,ror#19	@ Sigma1(e)
1764304636Sjkim	add	r2,r2,r1			@ X[i]
1765304636Sjkim	ldr	r3,[r14],#4			@ *K256++
1766304636Sjkim	add	r4,r4,r2			@ h+=X[i]
1767304636Sjkim	str	r2,[sp,#15*4]
1768304636Sjkim	eor	r2,r10,r11
1769304636Sjkim	add	r4,r4,r0,ror#6	@ h+=Sigma1(e)
1770304636Sjkim	and	r2,r2,r9
1771304636Sjkim	add	r4,r4,r3			@ h+=K256[i]
1772304636Sjkim	eor	r2,r2,r11			@ Ch(e,f,g)
1773304636Sjkim	eor	r0,r5,r5,ror#11
1774304636Sjkim	add	r4,r4,r2			@ h+=Ch(e,f,g)
1775304636Sjkim#if 31==31
1776304636Sjkim	and	r3,r3,#0xff
1777304636Sjkim	cmp	r3,#0xf2			@ done?
1778304636Sjkim#endif
1779304636Sjkim#if 31<15
1780304636Sjkim# if __ARM_ARCH__>=7
1781304636Sjkim	ldr	r2,[r1],#4			@ prefetch
1782304636Sjkim# else
1783304636Sjkim	ldrb	r2,[r1,#3]
1784304636Sjkim# endif
1785304636Sjkim	eor	r3,r5,r6			@ a^b, b^c in next round
1786304636Sjkim#else
1787304636Sjkim	ldr	r2,[sp,#1*4]		@ from future BODY_16_xx
1788304636Sjkim	eor	r3,r5,r6			@ a^b, b^c in next round
1789304636Sjkim	ldr	r1,[sp,#14*4]	@ from future BODY_16_xx
1790304636Sjkim#endif
1791304636Sjkim	eor	r0,r0,r5,ror#20	@ Sigma0(a)
1792304636Sjkim	and	r12,r12,r3			@ (b^c)&=(a^b)
1793304636Sjkim	add	r8,r8,r4			@ d+=h
1794304636Sjkim	eor	r12,r12,r6			@ Maj(a,b,c)
1795304636Sjkim	add	r4,r4,r0,ror#2	@ h+=Sigma0(a)
1796304636Sjkim	@ add	r4,r4,r12			@ h+=Maj(a,b,c)
1797304636Sjkim#if __ARM_ARCH__>=7
1798304636Sjkim	ite	eq			@ Thumb2 thing, sanity check in ARM
1799304636Sjkim#endif
1800304636Sjkim	ldreq	r3,[sp,#16*4]		@ pull ctx
1801304636Sjkim	bne	.Lrounds_16_xx
1802304636Sjkim
1803304636Sjkim	add	r4,r4,r12		@ h+=Maj(a,b,c) from the past
1804304636Sjkim	ldr	r0,[r3,#0]
1805304636Sjkim	ldr	r2,[r3,#4]
1806304636Sjkim	ldr	r12,[r3,#8]
1807304636Sjkim	add	r4,r4,r0
1808304636Sjkim	ldr	r0,[r3,#12]
1809304636Sjkim	add	r5,r5,r2
1810304636Sjkim	ldr	r2,[r3,#16]
1811304636Sjkim	add	r6,r6,r12
1812304636Sjkim	ldr	r12,[r3,#20]
1813304636Sjkim	add	r7,r7,r0
1814304636Sjkim	ldr	r0,[r3,#24]
1815304636Sjkim	add	r8,r8,r2
1816304636Sjkim	ldr	r2,[r3,#28]
1817304636Sjkim	add	r9,r9,r12
1818304636Sjkim	ldr	r1,[sp,#17*4]		@ pull inp
1819304636Sjkim	ldr	r12,[sp,#18*4]		@ pull inp+len
1820304636Sjkim	add	r10,r10,r0
1821304636Sjkim	add	r11,r11,r2
1822304636Sjkim	stmia	r3,{r4,r5,r6,r7,r8,r9,r10,r11}
1823304636Sjkim	cmp	r1,r12
1824304636Sjkim	sub	r14,r14,#256	@ rewind Ktbl
1825304636Sjkim	bne	.Loop
1826304636Sjkim
1827304636Sjkim	add	sp,sp,#19*4	@ destroy frame
1828304636Sjkim#if __ARM_ARCH__>=5
1829304636Sjkim	ldmia	sp!,{r4-r11,pc}
1830304636Sjkim#else
1831304636Sjkim	ldmia	sp!,{r4-r11,lr}
1832304636Sjkim	tst	lr,#1
1833304636Sjkim	moveq	pc,lr			@ be binary compatible with V4, yet
1834304636Sjkim	.word	0xe12fff1e			@ interoperable with Thumb ISA:-)
1835304636Sjkim#endif
1836304636Sjkim.size	sha256_block_data_order,.-sha256_block_data_order
1837304636Sjkim#if __ARM_MAX_ARCH__>=7
1838304636Sjkim.arch	armv7-a
1839304636Sjkim.fpu	neon
1840304636Sjkim
1841304636Sjkim.global	sha256_block_data_order_neon
1842304636Sjkim.type	sha256_block_data_order_neon,%function
1843304636Sjkim.align	4
1844304636Sjkimsha256_block_data_order_neon:
1845304636Sjkim.LNEON:
1846304636Sjkim	stmdb	sp!,{r4-r12,lr}
1847304636Sjkim
1848304636Sjkim	sub	r11,sp,#16*4+16
1849304636Sjkim	adr	r14,K256
1850304636Sjkim	bic	r11,r11,#15		@ align for 128-bit stores
1851304636Sjkim	mov	r12,sp
1852304636Sjkim	mov	sp,r11			@ alloca
1853304636Sjkim	add	r2,r1,r2,lsl#6	@ len to point at the end of inp
1854304636Sjkim
1855304636Sjkim	vld1.8		{q0},[r1]!
1856304636Sjkim	vld1.8		{q1},[r1]!
1857304636Sjkim	vld1.8		{q2},[r1]!
1858304636Sjkim	vld1.8		{q3},[r1]!
1859304636Sjkim	vld1.32		{q8},[r14,:128]!
1860304636Sjkim	vld1.32		{q9},[r14,:128]!
1861304636Sjkim	vld1.32		{q10},[r14,:128]!
1862304636Sjkim	vld1.32		{q11},[r14,:128]!
1863304636Sjkim	vrev32.8	q0,q0		@ yes, even on
1864304636Sjkim	str		r0,[sp,#64]
1865304636Sjkim	vrev32.8	q1,q1		@ big-endian
1866304636Sjkim	str		r1,[sp,#68]
1867304636Sjkim	mov		r1,sp
1868304636Sjkim	vrev32.8	q2,q2
1869304636Sjkim	str		r2,[sp,#72]
1870304636Sjkim	vrev32.8	q3,q3
1871304636Sjkim	str		r12,[sp,#76]		@ save original sp
1872304636Sjkim	vadd.i32	q8,q8,q0
1873304636Sjkim	vadd.i32	q9,q9,q1
1874304636Sjkim	vst1.32		{q8},[r1,:128]!
1875304636Sjkim	vadd.i32	q10,q10,q2
1876304636Sjkim	vst1.32		{q9},[r1,:128]!
1877304636Sjkim	vadd.i32	q11,q11,q3
1878304636Sjkim	vst1.32		{q10},[r1,:128]!
1879304636Sjkim	vst1.32		{q11},[r1,:128]!
1880304636Sjkim
1881304636Sjkim	ldmia		r0,{r4-r11}
1882304636Sjkim	sub		r1,r1,#64
1883304636Sjkim	ldr		r2,[sp,#0]
1884304636Sjkim	eor		r12,r12,r12
1885304636Sjkim	eor		r3,r5,r6
1886304636Sjkim	b		.L_00_48
1887304636Sjkim
1888304636Sjkim.align	4
1889304636Sjkim.L_00_48:
1890304636Sjkim	vext.8	q8,q0,q1,#4
1891304636Sjkim	add	r11,r11,r2
1892304636Sjkim	eor	r2,r9,r10
1893304636Sjkim	eor	r0,r8,r8,ror#5
1894304636Sjkim	vext.8	q9,q2,q3,#4
1895304636Sjkim	add	r4,r4,r12
1896304636Sjkim	and	r2,r2,r8
1897304636Sjkim	eor	r12,r0,r8,ror#19
1898304636Sjkim	vshr.u32	q10,q8,#7
1899304636Sjkim	eor	r0,r4,r4,ror#11
1900304636Sjkim	eor	r2,r2,r10
1901304636Sjkim	vadd.i32	q0,q0,q9
1902304636Sjkim	add	r11,r11,r12,ror#6
1903304636Sjkim	eor	r12,r4,r5
1904304636Sjkim	vshr.u32	q9,q8,#3
1905304636Sjkim	eor	r0,r0,r4,ror#20
1906304636Sjkim	add	r11,r11,r2
1907304636Sjkim	vsli.32	q10,q8,#25
1908304636Sjkim	ldr	r2,[sp,#4]
1909304636Sjkim	and	r3,r3,r12
1910304636Sjkim	vshr.u32	q11,q8,#18
1911304636Sjkim	add	r7,r7,r11
1912304636Sjkim	add	r11,r11,r0,ror#2
1913304636Sjkim	eor	r3,r3,r5
1914304636Sjkim	veor	q9,q9,q10
1915304636Sjkim	add	r10,r10,r2
1916304636Sjkim	vsli.32	q11,q8,#14
1917304636Sjkim	eor	r2,r8,r9
1918304636Sjkim	eor	r0,r7,r7,ror#5
1919304636Sjkim	vshr.u32	d24,d7,#17
1920304636Sjkim	add	r11,r11,r3
1921304636Sjkim	and	r2,r2,r7
1922304636Sjkim	veor	q9,q9,q11
1923304636Sjkim	eor	r3,r0,r7,ror#19
1924304636Sjkim	eor	r0,r11,r11,ror#11
1925304636Sjkim	vsli.32	d24,d7,#15
1926304636Sjkim	eor	r2,r2,r9
1927304636Sjkim	add	r10,r10,r3,ror#6
1928304636Sjkim	vshr.u32	d25,d7,#10
1929304636Sjkim	eor	r3,r11,r4
1930304636Sjkim	eor	r0,r0,r11,ror#20
1931304636Sjkim	vadd.i32	q0,q0,q9
1932304636Sjkim	add	r10,r10,r2
1933304636Sjkim	ldr	r2,[sp,#8]
1934304636Sjkim	veor	d25,d25,d24
1935304636Sjkim	and	r12,r12,r3
1936304636Sjkim	add	r6,r6,r10
1937304636Sjkim	vshr.u32	d24,d7,#19
1938304636Sjkim	add	r10,r10,r0,ror#2
1939304636Sjkim	eor	r12,r12,r4
1940304636Sjkim	vsli.32	d24,d7,#13
1941304636Sjkim	add	r9,r9,r2
1942304636Sjkim	eor	r2,r7,r8
1943304636Sjkim	veor	d25,d25,d24
1944304636Sjkim	eor	r0,r6,r6,ror#5
1945304636Sjkim	add	r10,r10,r12
1946304636Sjkim	vadd.i32	d0,d0,d25
1947304636Sjkim	and	r2,r2,r6
1948304636Sjkim	eor	r12,r0,r6,ror#19
1949304636Sjkim	vshr.u32	d24,d0,#17
1950304636Sjkim	eor	r0,r10,r10,ror#11
1951304636Sjkim	eor	r2,r2,r8
1952304636Sjkim	vsli.32	d24,d0,#15
1953304636Sjkim	add	r9,r9,r12,ror#6
1954304636Sjkim	eor	r12,r10,r11
1955304636Sjkim	vshr.u32	d25,d0,#10
1956304636Sjkim	eor	r0,r0,r10,ror#20
1957304636Sjkim	add	r9,r9,r2
1958304636Sjkim	veor	d25,d25,d24
1959304636Sjkim	ldr	r2,[sp,#12]
1960304636Sjkim	and	r3,r3,r12
1961304636Sjkim	vshr.u32	d24,d0,#19
1962304636Sjkim	add	r5,r5,r9
1963304636Sjkim	add	r9,r9,r0,ror#2
1964304636Sjkim	eor	r3,r3,r11
1965304636Sjkim	vld1.32	{q8},[r14,:128]!
1966304636Sjkim	add	r8,r8,r2
1967304636Sjkim	vsli.32	d24,d0,#13
1968304636Sjkim	eor	r2,r6,r7
1969304636Sjkim	eor	r0,r5,r5,ror#5
1970304636Sjkim	veor	d25,d25,d24
1971304636Sjkim	add	r9,r9,r3
1972304636Sjkim	and	r2,r2,r5
1973304636Sjkim	vadd.i32	d1,d1,d25
1974304636Sjkim	eor	r3,r0,r5,ror#19
1975304636Sjkim	eor	r0,r9,r9,ror#11
1976304636Sjkim	vadd.i32	q8,q8,q0
1977304636Sjkim	eor	r2,r2,r7
1978304636Sjkim	add	r8,r8,r3,ror#6
1979304636Sjkim	eor	r3,r9,r10
1980304636Sjkim	eor	r0,r0,r9,ror#20
1981304636Sjkim	add	r8,r8,r2
1982304636Sjkim	ldr	r2,[sp,#16]
1983304636Sjkim	and	r12,r12,r3
1984304636Sjkim	add	r4,r4,r8
1985304636Sjkim	vst1.32	{q8},[r1,:128]!
1986304636Sjkim	add	r8,r8,r0,ror#2
1987304636Sjkim	eor	r12,r12,r10
1988304636Sjkim	vext.8	q8,q1,q2,#4
1989304636Sjkim	add	r7,r7,r2
1990304636Sjkim	eor	r2,r5,r6
1991304636Sjkim	eor	r0,r4,r4,ror#5
1992304636Sjkim	vext.8	q9,q3,q0,#4
1993304636Sjkim	add	r8,r8,r12
1994304636Sjkim	and	r2,r2,r4
1995304636Sjkim	eor	r12,r0,r4,ror#19
1996304636Sjkim	vshr.u32	q10,q8,#7
1997304636Sjkim	eor	r0,r8,r8,ror#11
1998304636Sjkim	eor	r2,r2,r6
1999304636Sjkim	vadd.i32	q1,q1,q9
2000304636Sjkim	add	r7,r7,r12,ror#6
2001304636Sjkim	eor	r12,r8,r9
2002304636Sjkim	vshr.u32	q9,q8,#3
2003304636Sjkim	eor	r0,r0,r8,ror#20
2004304636Sjkim	add	r7,r7,r2
2005304636Sjkim	vsli.32	q10,q8,#25
2006304636Sjkim	ldr	r2,[sp,#20]
2007304636Sjkim	and	r3,r3,r12
2008304636Sjkim	vshr.u32	q11,q8,#18
2009304636Sjkim	add	r11,r11,r7
2010304636Sjkim	add	r7,r7,r0,ror#2
2011304636Sjkim	eor	r3,r3,r9
2012304636Sjkim	veor	q9,q9,q10
2013304636Sjkim	add	r6,r6,r2
2014304636Sjkim	vsli.32	q11,q8,#14
2015304636Sjkim	eor	r2,r4,r5
2016304636Sjkim	eor	r0,r11,r11,ror#5
2017304636Sjkim	vshr.u32	d24,d1,#17
2018304636Sjkim	add	r7,r7,r3
2019304636Sjkim	and	r2,r2,r11
2020304636Sjkim	veor	q9,q9,q11
2021304636Sjkim	eor	r3,r0,r11,ror#19
2022304636Sjkim	eor	r0,r7,r7,ror#11
2023304636Sjkim	vsli.32	d24,d1,#15
2024304636Sjkim	eor	r2,r2,r5
2025304636Sjkim	add	r6,r6,r3,ror#6
2026304636Sjkim	vshr.u32	d25,d1,#10
2027304636Sjkim	eor	r3,r7,r8
2028304636Sjkim	eor	r0,r0,r7,ror#20
2029304636Sjkim	vadd.i32	q1,q1,q9
2030304636Sjkim	add	r6,r6,r2
2031304636Sjkim	ldr	r2,[sp,#24]
2032304636Sjkim	veor	d25,d25,d24
2033304636Sjkim	and	r12,r12,r3
2034304636Sjkim	add	r10,r10,r6
2035304636Sjkim	vshr.u32	d24,d1,#19
2036304636Sjkim	add	r6,r6,r0,ror#2
2037304636Sjkim	eor	r12,r12,r8
2038304636Sjkim	vsli.32	d24,d1,#13
2039304636Sjkim	add	r5,r5,r2
2040304636Sjkim	eor	r2,r11,r4
2041304636Sjkim	veor	d25,d25,d24
2042304636Sjkim	eor	r0,r10,r10,ror#5
2043304636Sjkim	add	r6,r6,r12
2044304636Sjkim	vadd.i32	d2,d2,d25
2045304636Sjkim	and	r2,r2,r10
2046304636Sjkim	eor	r12,r0,r10,ror#19
2047304636Sjkim	vshr.u32	d24,d2,#17
2048304636Sjkim	eor	r0,r6,r6,ror#11
2049304636Sjkim	eor	r2,r2,r4
2050304636Sjkim	vsli.32	d24,d2,#15
2051304636Sjkim	add	r5,r5,r12,ror#6
2052304636Sjkim	eor	r12,r6,r7
2053304636Sjkim	vshr.u32	d25,d2,#10
2054304636Sjkim	eor	r0,r0,r6,ror#20
2055304636Sjkim	add	r5,r5,r2
2056304636Sjkim	veor	d25,d25,d24
2057304636Sjkim	ldr	r2,[sp,#28]
2058304636Sjkim	and	r3,r3,r12
2059304636Sjkim	vshr.u32	d24,d2,#19
2060304636Sjkim	add	r9,r9,r5
2061304636Sjkim	add	r5,r5,r0,ror#2
2062304636Sjkim	eor	r3,r3,r7
2063304636Sjkim	vld1.32	{q8},[r14,:128]!
2064304636Sjkim	add	r4,r4,r2
2065304636Sjkim	vsli.32	d24,d2,#13
2066304636Sjkim	eor	r2,r10,r11
2067304636Sjkim	eor	r0,r9,r9,ror#5
2068304636Sjkim	veor	d25,d25,d24
2069304636Sjkim	add	r5,r5,r3
2070304636Sjkim	and	r2,r2,r9
2071304636Sjkim	vadd.i32	d3,d3,d25
2072304636Sjkim	eor	r3,r0,r9,ror#19
2073304636Sjkim	eor	r0,r5,r5,ror#11
2074304636Sjkim	vadd.i32	q8,q8,q1
2075304636Sjkim	eor	r2,r2,r11
2076304636Sjkim	add	r4,r4,r3,ror#6
2077304636Sjkim	eor	r3,r5,r6
2078304636Sjkim	eor	r0,r0,r5,ror#20
2079304636Sjkim	add	r4,r4,r2
2080304636Sjkim	ldr	r2,[sp,#32]
2081304636Sjkim	and	r12,r12,r3
2082304636Sjkim	add	r8,r8,r4
2083304636Sjkim	vst1.32	{q8},[r1,:128]!
2084304636Sjkim	add	r4,r4,r0,ror#2
2085304636Sjkim	eor	r12,r12,r6
2086304636Sjkim	vext.8	q8,q2,q3,#4
2087304636Sjkim	add	r11,r11,r2
2088304636Sjkim	eor	r2,r9,r10
2089304636Sjkim	eor	r0,r8,r8,ror#5
2090304636Sjkim	vext.8	q9,q0,q1,#4
2091304636Sjkim	add	r4,r4,r12
2092304636Sjkim	and	r2,r2,r8
2093304636Sjkim	eor	r12,r0,r8,ror#19
2094304636Sjkim	vshr.u32	q10,q8,#7
2095304636Sjkim	eor	r0,r4,r4,ror#11
2096304636Sjkim	eor	r2,r2,r10
2097304636Sjkim	vadd.i32	q2,q2,q9
2098304636Sjkim	add	r11,r11,r12,ror#6
2099304636Sjkim	eor	r12,r4,r5
2100304636Sjkim	vshr.u32	q9,q8,#3
2101304636Sjkim	eor	r0,r0,r4,ror#20
2102304636Sjkim	add	r11,r11,r2
2103304636Sjkim	vsli.32	q10,q8,#25
2104304636Sjkim	ldr	r2,[sp,#36]
2105304636Sjkim	and	r3,r3,r12
2106304636Sjkim	vshr.u32	q11,q8,#18
2107304636Sjkim	add	r7,r7,r11
2108304636Sjkim	add	r11,r11,r0,ror#2
2109304636Sjkim	eor	r3,r3,r5
2110304636Sjkim	veor	q9,q9,q10
2111304636Sjkim	add	r10,r10,r2
2112304636Sjkim	vsli.32	q11,q8,#14
2113304636Sjkim	eor	r2,r8,r9
2114304636Sjkim	eor	r0,r7,r7,ror#5
2115304636Sjkim	vshr.u32	d24,d3,#17
2116304636Sjkim	add	r11,r11,r3
2117304636Sjkim	and	r2,r2,r7
2118304636Sjkim	veor	q9,q9,q11
2119304636Sjkim	eor	r3,r0,r7,ror#19
2120304636Sjkim	eor	r0,r11,r11,ror#11
2121304636Sjkim	vsli.32	d24,d3,#15
2122304636Sjkim	eor	r2,r2,r9
2123304636Sjkim	add	r10,r10,r3,ror#6
2124304636Sjkim	vshr.u32	d25,d3,#10
2125304636Sjkim	eor	r3,r11,r4
2126304636Sjkim	eor	r0,r0,r11,ror#20
2127304636Sjkim	vadd.i32	q2,q2,q9
2128304636Sjkim	add	r10,r10,r2
2129304636Sjkim	ldr	r2,[sp,#40]
2130304636Sjkim	veor	d25,d25,d24
2131304636Sjkim	and	r12,r12,r3
2132304636Sjkim	add	r6,r6,r10
2133304636Sjkim	vshr.u32	d24,d3,#19
2134304636Sjkim	add	r10,r10,r0,ror#2
2135304636Sjkim	eor	r12,r12,r4
2136304636Sjkim	vsli.32	d24,d3,#13
2137304636Sjkim	add	r9,r9,r2
2138304636Sjkim	eor	r2,r7,r8
2139304636Sjkim	veor	d25,d25,d24
2140304636Sjkim	eor	r0,r6,r6,ror#5
2141304636Sjkim	add	r10,r10,r12
2142304636Sjkim	vadd.i32	d4,d4,d25
2143304636Sjkim	and	r2,r2,r6
2144304636Sjkim	eor	r12,r0,r6,ror#19
2145304636Sjkim	vshr.u32	d24,d4,#17
2146304636Sjkim	eor	r0,r10,r10,ror#11
2147304636Sjkim	eor	r2,r2,r8
2148304636Sjkim	vsli.32	d24,d4,#15
2149304636Sjkim	add	r9,r9,r12,ror#6
2150304636Sjkim	eor	r12,r10,r11
2151304636Sjkim	vshr.u32	d25,d4,#10
2152304636Sjkim	eor	r0,r0,r10,ror#20
2153304636Sjkim	add	r9,r9,r2
2154304636Sjkim	veor	d25,d25,d24
2155304636Sjkim	ldr	r2,[sp,#44]
2156304636Sjkim	and	r3,r3,r12
2157304636Sjkim	vshr.u32	d24,d4,#19
2158304636Sjkim	add	r5,r5,r9
2159304636Sjkim	add	r9,r9,r0,ror#2
2160304636Sjkim	eor	r3,r3,r11
2161304636Sjkim	vld1.32	{q8},[r14,:128]!
2162304636Sjkim	add	r8,r8,r2
2163304636Sjkim	vsli.32	d24,d4,#13
2164304636Sjkim	eor	r2,r6,r7
2165304636Sjkim	eor	r0,r5,r5,ror#5
2166304636Sjkim	veor	d25,d25,d24
2167304636Sjkim	add	r9,r9,r3
2168304636Sjkim	and	r2,r2,r5
2169304636Sjkim	vadd.i32	d5,d5,d25
2170304636Sjkim	eor	r3,r0,r5,ror#19
2171304636Sjkim	eor	r0,r9,r9,ror#11
2172304636Sjkim	vadd.i32	q8,q8,q2
2173304636Sjkim	eor	r2,r2,r7
2174304636Sjkim	add	r8,r8,r3,ror#6
2175304636Sjkim	eor	r3,r9,r10
2176304636Sjkim	eor	r0,r0,r9,ror#20
2177304636Sjkim	add	r8,r8,r2
2178304636Sjkim	ldr	r2,[sp,#48]
2179304636Sjkim	and	r12,r12,r3
2180304636Sjkim	add	r4,r4,r8
2181304636Sjkim	vst1.32	{q8},[r1,:128]!
2182304636Sjkim	add	r8,r8,r0,ror#2
2183304636Sjkim	eor	r12,r12,r10
2184304636Sjkim	vext.8	q8,q3,q0,#4
2185304636Sjkim	add	r7,r7,r2
2186304636Sjkim	eor	r2,r5,r6
2187304636Sjkim	eor	r0,r4,r4,ror#5
2188304636Sjkim	vext.8	q9,q1,q2,#4
2189304636Sjkim	add	r8,r8,r12
2190304636Sjkim	and	r2,r2,r4
2191304636Sjkim	eor	r12,r0,r4,ror#19
2192304636Sjkim	vshr.u32	q10,q8,#7
2193304636Sjkim	eor	r0,r8,r8,ror#11
2194304636Sjkim	eor	r2,r2,r6
2195304636Sjkim	vadd.i32	q3,q3,q9
2196304636Sjkim	add	r7,r7,r12,ror#6
2197304636Sjkim	eor	r12,r8,r9
2198304636Sjkim	vshr.u32	q9,q8,#3
2199304636Sjkim	eor	r0,r0,r8,ror#20
2200304636Sjkim	add	r7,r7,r2
2201304636Sjkim	vsli.32	q10,q8,#25
2202304636Sjkim	ldr	r2,[sp,#52]
2203304636Sjkim	and	r3,r3,r12
2204304636Sjkim	vshr.u32	q11,q8,#18
2205304636Sjkim	add	r11,r11,r7
2206304636Sjkim	add	r7,r7,r0,ror#2
2207304636Sjkim	eor	r3,r3,r9
2208304636Sjkim	veor	q9,q9,q10
2209304636Sjkim	add	r6,r6,r2
2210304636Sjkim	vsli.32	q11,q8,#14
2211304636Sjkim	eor	r2,r4,r5
2212304636Sjkim	eor	r0,r11,r11,ror#5
2213304636Sjkim	vshr.u32	d24,d5,#17
2214304636Sjkim	add	r7,r7,r3
2215304636Sjkim	and	r2,r2,r11
2216304636Sjkim	veor	q9,q9,q11
2217304636Sjkim	eor	r3,r0,r11,ror#19
2218304636Sjkim	eor	r0,r7,r7,ror#11
2219304636Sjkim	vsli.32	d24,d5,#15
2220304636Sjkim	eor	r2,r2,r5
2221304636Sjkim	add	r6,r6,r3,ror#6
2222304636Sjkim	vshr.u32	d25,d5,#10
2223304636Sjkim	eor	r3,r7,r8
2224304636Sjkim	eor	r0,r0,r7,ror#20
2225304636Sjkim	vadd.i32	q3,q3,q9
2226304636Sjkim	add	r6,r6,r2
2227304636Sjkim	ldr	r2,[sp,#56]
2228304636Sjkim	veor	d25,d25,d24
2229304636Sjkim	and	r12,r12,r3
2230304636Sjkim	add	r10,r10,r6
2231304636Sjkim	vshr.u32	d24,d5,#19
2232304636Sjkim	add	r6,r6,r0,ror#2
2233304636Sjkim	eor	r12,r12,r8
2234304636Sjkim	vsli.32	d24,d5,#13
2235304636Sjkim	add	r5,r5,r2
2236304636Sjkim	eor	r2,r11,r4
2237304636Sjkim	veor	d25,d25,d24
2238304636Sjkim	eor	r0,r10,r10,ror#5
2239304636Sjkim	add	r6,r6,r12
2240304636Sjkim	vadd.i32	d6,d6,d25
2241304636Sjkim	and	r2,r2,r10
2242304636Sjkim	eor	r12,r0,r10,ror#19
2243304636Sjkim	vshr.u32	d24,d6,#17
2244304636Sjkim	eor	r0,r6,r6,ror#11
2245304636Sjkim	eor	r2,r2,r4
2246304636Sjkim	vsli.32	d24,d6,#15
2247304636Sjkim	add	r5,r5,r12,ror#6
2248304636Sjkim	eor	r12,r6,r7
2249304636Sjkim	vshr.u32	d25,d6,#10
2250304636Sjkim	eor	r0,r0,r6,ror#20
2251304636Sjkim	add	r5,r5,r2
2252304636Sjkim	veor	d25,d25,d24
2253304636Sjkim	ldr	r2,[sp,#60]
2254304636Sjkim	and	r3,r3,r12
2255304636Sjkim	vshr.u32	d24,d6,#19
2256304636Sjkim	add	r9,r9,r5
2257304636Sjkim	add	r5,r5,r0,ror#2
2258304636Sjkim	eor	r3,r3,r7
2259304636Sjkim	vld1.32	{q8},[r14,:128]!
2260304636Sjkim	add	r4,r4,r2
2261304636Sjkim	vsli.32	d24,d6,#13
2262304636Sjkim	eor	r2,r10,r11
2263304636Sjkim	eor	r0,r9,r9,ror#5
2264304636Sjkim	veor	d25,d25,d24
2265304636Sjkim	add	r5,r5,r3
2266304636Sjkim	and	r2,r2,r9
2267304636Sjkim	vadd.i32	d7,d7,d25
2268304636Sjkim	eor	r3,r0,r9,ror#19
2269304636Sjkim	eor	r0,r5,r5,ror#11
2270304636Sjkim	vadd.i32	q8,q8,q3
2271304636Sjkim	eor	r2,r2,r11
2272304636Sjkim	add	r4,r4,r3,ror#6
2273304636Sjkim	eor	r3,r5,r6
2274304636Sjkim	eor	r0,r0,r5,ror#20
2275304636Sjkim	add	r4,r4,r2
2276304636Sjkim	ldr	r2,[r14]
2277304636Sjkim	and	r12,r12,r3
2278304636Sjkim	add	r8,r8,r4
2279304636Sjkim	vst1.32	{q8},[r1,:128]!
2280304636Sjkim	add	r4,r4,r0,ror#2
2281304636Sjkim	eor	r12,r12,r6
2282304636Sjkim	teq	r2,#0				@ check for K256 terminator
2283304636Sjkim	ldr	r2,[sp,#0]
2284304636Sjkim	sub	r1,r1,#64
2285304636Sjkim	bne	.L_00_48
2286304636Sjkim
2287304636Sjkim	ldr		r1,[sp,#68]
2288304636Sjkim	ldr		r0,[sp,#72]
2289304636Sjkim	sub		r14,r14,#256	@ rewind r14
2290304636Sjkim	teq		r1,r0
2291304636Sjkim	it		eq
2292304636Sjkim	subeq		r1,r1,#64		@ avoid SEGV
2293304636Sjkim	vld1.8		{q0},[r1]!		@ load next input block
2294304636Sjkim	vld1.8		{q1},[r1]!
2295304636Sjkim	vld1.8		{q2},[r1]!
2296304636Sjkim	vld1.8		{q3},[r1]!
2297304636Sjkim	it		ne
2298304636Sjkim	strne		r1,[sp,#68]
2299304636Sjkim	mov		r1,sp
2300304636Sjkim	add	r11,r11,r2
2301304636Sjkim	eor	r2,r9,r10
2302304636Sjkim	eor	r0,r8,r8,ror#5
2303304636Sjkim	add	r4,r4,r12
2304304636Sjkim	vld1.32	{q8},[r14,:128]!
2305304636Sjkim	and	r2,r2,r8
2306304636Sjkim	eor	r12,r0,r8,ror#19
2307304636Sjkim	eor	r0,r4,r4,ror#11
2308304636Sjkim	eor	r2,r2,r10
2309304636Sjkim	vrev32.8	q0,q0
2310304636Sjkim	add	r11,r11,r12,ror#6
2311304636Sjkim	eor	r12,r4,r5
2312304636Sjkim	eor	r0,r0,r4,ror#20
2313304636Sjkim	add	r11,r11,r2
2314304636Sjkim	vadd.i32	q8,q8,q0
2315304636Sjkim	ldr	r2,[sp,#4]
2316304636Sjkim	and	r3,r3,r12
2317304636Sjkim	add	r7,r7,r11
2318304636Sjkim	add	r11,r11,r0,ror#2
2319304636Sjkim	eor	r3,r3,r5
2320304636Sjkim	add	r10,r10,r2
2321304636Sjkim	eor	r2,r8,r9
2322304636Sjkim	eor	r0,r7,r7,ror#5
2323304636Sjkim	add	r11,r11,r3
2324304636Sjkim	and	r2,r2,r7
2325304636Sjkim	eor	r3,r0,r7,ror#19
2326304636Sjkim	eor	r0,r11,r11,ror#11
2327304636Sjkim	eor	r2,r2,r9
2328304636Sjkim	add	r10,r10,r3,ror#6
2329304636Sjkim	eor	r3,r11,r4
2330304636Sjkim	eor	r0,r0,r11,ror#20
2331304636Sjkim	add	r10,r10,r2
2332304636Sjkim	ldr	r2,[sp,#8]
2333304636Sjkim	and	r12,r12,r3
2334304636Sjkim	add	r6,r6,r10
2335304636Sjkim	add	r10,r10,r0,ror#2
2336304636Sjkim	eor	r12,r12,r4
2337304636Sjkim	add	r9,r9,r2
2338304636Sjkim	eor	r2,r7,r8
2339304636Sjkim	eor	r0,r6,r6,ror#5
2340304636Sjkim	add	r10,r10,r12
2341304636Sjkim	and	r2,r2,r6
2342304636Sjkim	eor	r12,r0,r6,ror#19
2343304636Sjkim	eor	r0,r10,r10,ror#11
2344304636Sjkim	eor	r2,r2,r8
2345304636Sjkim	add	r9,r9,r12,ror#6
2346304636Sjkim	eor	r12,r10,r11
2347304636Sjkim	eor	r0,r0,r10,ror#20
2348304636Sjkim	add	r9,r9,r2
2349304636Sjkim	ldr	r2,[sp,#12]
2350304636Sjkim	and	r3,r3,r12
2351304636Sjkim	add	r5,r5,r9
2352304636Sjkim	add	r9,r9,r0,ror#2
2353304636Sjkim	eor	r3,r3,r11
2354304636Sjkim	add	r8,r8,r2
2355304636Sjkim	eor	r2,r6,r7
2356304636Sjkim	eor	r0,r5,r5,ror#5
2357304636Sjkim	add	r9,r9,r3
2358304636Sjkim	and	r2,r2,r5
2359304636Sjkim	eor	r3,r0,r5,ror#19
2360304636Sjkim	eor	r0,r9,r9,ror#11
2361304636Sjkim	eor	r2,r2,r7
2362304636Sjkim	add	r8,r8,r3,ror#6
2363304636Sjkim	eor	r3,r9,r10
2364304636Sjkim	eor	r0,r0,r9,ror#20
2365304636Sjkim	add	r8,r8,r2
2366304636Sjkim	ldr	r2,[sp,#16]
2367304636Sjkim	and	r12,r12,r3
2368304636Sjkim	add	r4,r4,r8
2369304636Sjkim	add	r8,r8,r0,ror#2
2370304636Sjkim	eor	r12,r12,r10
2371304636Sjkim	vst1.32	{q8},[r1,:128]!
2372304636Sjkim	add	r7,r7,r2
2373304636Sjkim	eor	r2,r5,r6
2374304636Sjkim	eor	r0,r4,r4,ror#5
2375304636Sjkim	add	r8,r8,r12
2376304636Sjkim	vld1.32	{q8},[r14,:128]!
2377304636Sjkim	and	r2,r2,r4
2378304636Sjkim	eor	r12,r0,r4,ror#19
2379304636Sjkim	eor	r0,r8,r8,ror#11
2380304636Sjkim	eor	r2,r2,r6
2381304636Sjkim	vrev32.8	q1,q1
2382304636Sjkim	add	r7,r7,r12,ror#6
2383304636Sjkim	eor	r12,r8,r9
2384304636Sjkim	eor	r0,r0,r8,ror#20
2385304636Sjkim	add	r7,r7,r2
2386304636Sjkim	vadd.i32	q8,q8,q1
2387304636Sjkim	ldr	r2,[sp,#20]
2388304636Sjkim	and	r3,r3,r12
2389304636Sjkim	add	r11,r11,r7
2390304636Sjkim	add	r7,r7,r0,ror#2
2391304636Sjkim	eor	r3,r3,r9
2392304636Sjkim	add	r6,r6,r2
2393304636Sjkim	eor	r2,r4,r5
2394304636Sjkim	eor	r0,r11,r11,ror#5
2395304636Sjkim	add	r7,r7,r3
2396304636Sjkim	and	r2,r2,r11
2397304636Sjkim	eor	r3,r0,r11,ror#19
2398304636Sjkim	eor	r0,r7,r7,ror#11
2399304636Sjkim	eor	r2,r2,r5
2400304636Sjkim	add	r6,r6,r3,ror#6
2401304636Sjkim	eor	r3,r7,r8
2402304636Sjkim	eor	r0,r0,r7,ror#20
2403304636Sjkim	add	r6,r6,r2
2404304636Sjkim	ldr	r2,[sp,#24]
2405304636Sjkim	and	r12,r12,r3
2406304636Sjkim	add	r10,r10,r6
2407304636Sjkim	add	r6,r6,r0,ror#2
2408304636Sjkim	eor	r12,r12,r8
2409304636Sjkim	add	r5,r5,r2
2410304636Sjkim	eor	r2,r11,r4
2411304636Sjkim	eor	r0,r10,r10,ror#5
2412304636Sjkim	add	r6,r6,r12
2413304636Sjkim	and	r2,r2,r10
2414304636Sjkim	eor	r12,r0,r10,ror#19
2415304636Sjkim	eor	r0,r6,r6,ror#11
2416304636Sjkim	eor	r2,r2,r4
2417304636Sjkim	add	r5,r5,r12,ror#6
2418304636Sjkim	eor	r12,r6,r7
2419304636Sjkim	eor	r0,r0,r6,ror#20
2420304636Sjkim	add	r5,r5,r2
2421304636Sjkim	ldr	r2,[sp,#28]
2422304636Sjkim	and	r3,r3,r12
2423304636Sjkim	add	r9,r9,r5
2424304636Sjkim	add	r5,r5,r0,ror#2
2425304636Sjkim	eor	r3,r3,r7
2426304636Sjkim	add	r4,r4,r2
2427304636Sjkim	eor	r2,r10,r11
2428304636Sjkim	eor	r0,r9,r9,ror#5
2429304636Sjkim	add	r5,r5,r3
2430304636Sjkim	and	r2,r2,r9
2431304636Sjkim	eor	r3,r0,r9,ror#19
2432304636Sjkim	eor	r0,r5,r5,ror#11
2433304636Sjkim	eor	r2,r2,r11
2434304636Sjkim	add	r4,r4,r3,ror#6
2435304636Sjkim	eor	r3,r5,r6
2436304636Sjkim	eor	r0,r0,r5,ror#20
2437304636Sjkim	add	r4,r4,r2
2438304636Sjkim	ldr	r2,[sp,#32]
2439304636Sjkim	and	r12,r12,r3
2440304636Sjkim	add	r8,r8,r4
2441304636Sjkim	add	r4,r4,r0,ror#2
2442304636Sjkim	eor	r12,r12,r6
2443304636Sjkim	vst1.32	{q8},[r1,:128]!
2444304636Sjkim	add	r11,r11,r2
2445304636Sjkim	eor	r2,r9,r10
2446304636Sjkim	eor	r0,r8,r8,ror#5
2447304636Sjkim	add	r4,r4,r12
2448304636Sjkim	vld1.32	{q8},[r14,:128]!
2449304636Sjkim	and	r2,r2,r8
2450304636Sjkim	eor	r12,r0,r8,ror#19
2451304636Sjkim	eor	r0,r4,r4,ror#11
2452304636Sjkim	eor	r2,r2,r10
2453304636Sjkim	vrev32.8	q2,q2
2454304636Sjkim	add	r11,r11,r12,ror#6
2455304636Sjkim	eor	r12,r4,r5
2456304636Sjkim	eor	r0,r0,r4,ror#20
2457304636Sjkim	add	r11,r11,r2
2458304636Sjkim	vadd.i32	q8,q8,q2
2459304636Sjkim	ldr	r2,[sp,#36]
2460304636Sjkim	and	r3,r3,r12
2461304636Sjkim	add	r7,r7,r11
2462304636Sjkim	add	r11,r11,r0,ror#2
2463304636Sjkim	eor	r3,r3,r5
2464304636Sjkim	add	r10,r10,r2
2465304636Sjkim	eor	r2,r8,r9
2466304636Sjkim	eor	r0,r7,r7,ror#5
2467304636Sjkim	add	r11,r11,r3
2468304636Sjkim	and	r2,r2,r7
2469304636Sjkim	eor	r3,r0,r7,ror#19
2470304636Sjkim	eor	r0,r11,r11,ror#11
2471304636Sjkim	eor	r2,r2,r9
2472304636Sjkim	add	r10,r10,r3,ror#6
2473304636Sjkim	eor	r3,r11,r4
2474304636Sjkim	eor	r0,r0,r11,ror#20
2475304636Sjkim	add	r10,r10,r2
2476304636Sjkim	ldr	r2,[sp,#40]
2477304636Sjkim	and	r12,r12,r3
2478304636Sjkim	add	r6,r6,r10
2479304636Sjkim	add	r10,r10,r0,ror#2
2480304636Sjkim	eor	r12,r12,r4
2481304636Sjkim	add	r9,r9,r2
2482304636Sjkim	eor	r2,r7,r8
2483304636Sjkim	eor	r0,r6,r6,ror#5
2484304636Sjkim	add	r10,r10,r12
2485304636Sjkim	and	r2,r2,r6
2486304636Sjkim	eor	r12,r0,r6,ror#19
2487304636Sjkim	eor	r0,r10,r10,ror#11
2488304636Sjkim	eor	r2,r2,r8
2489304636Sjkim	add	r9,r9,r12,ror#6
2490304636Sjkim	eor	r12,r10,r11
2491304636Sjkim	eor	r0,r0,r10,ror#20
2492304636Sjkim	add	r9,r9,r2
2493304636Sjkim	ldr	r2,[sp,#44]
2494304636Sjkim	and	r3,r3,r12
2495304636Sjkim	add	r5,r5,r9
2496304636Sjkim	add	r9,r9,r0,ror#2
2497304636Sjkim	eor	r3,r3,r11
2498304636Sjkim	add	r8,r8,r2
2499304636Sjkim	eor	r2,r6,r7
2500304636Sjkim	eor	r0,r5,r5,ror#5
2501304636Sjkim	add	r9,r9,r3
2502304636Sjkim	and	r2,r2,r5
2503304636Sjkim	eor	r3,r0,r5,ror#19
2504304636Sjkim	eor	r0,r9,r9,ror#11
2505304636Sjkim	eor	r2,r2,r7
2506304636Sjkim	add	r8,r8,r3,ror#6
2507304636Sjkim	eor	r3,r9,r10
2508304636Sjkim	eor	r0,r0,r9,ror#20
2509304636Sjkim	add	r8,r8,r2
2510304636Sjkim	ldr	r2,[sp,#48]
2511304636Sjkim	and	r12,r12,r3
2512304636Sjkim	add	r4,r4,r8
2513304636Sjkim	add	r8,r8,r0,ror#2
2514304636Sjkim	eor	r12,r12,r10
2515304636Sjkim	vst1.32	{q8},[r1,:128]!
2516304636Sjkim	add	r7,r7,r2
2517304636Sjkim	eor	r2,r5,r6
2518304636Sjkim	eor	r0,r4,r4,ror#5
2519304636Sjkim	add	r8,r8,r12
2520304636Sjkim	vld1.32	{q8},[r14,:128]!
2521304636Sjkim	and	r2,r2,r4
2522304636Sjkim	eor	r12,r0,r4,ror#19
2523304636Sjkim	eor	r0,r8,r8,ror#11
2524304636Sjkim	eor	r2,r2,r6
2525304636Sjkim	vrev32.8	q3,q3
2526304636Sjkim	add	r7,r7,r12,ror#6
2527304636Sjkim	eor	r12,r8,r9
2528304636Sjkim	eor	r0,r0,r8,ror#20
2529304636Sjkim	add	r7,r7,r2
2530304636Sjkim	vadd.i32	q8,q8,q3
2531304636Sjkim	ldr	r2,[sp,#52]
2532304636Sjkim	and	r3,r3,r12
2533304636Sjkim	add	r11,r11,r7
2534304636Sjkim	add	r7,r7,r0,ror#2
2535304636Sjkim	eor	r3,r3,r9
2536304636Sjkim	add	r6,r6,r2
2537304636Sjkim	eor	r2,r4,r5
2538304636Sjkim	eor	r0,r11,r11,ror#5
2539304636Sjkim	add	r7,r7,r3
2540304636Sjkim	and	r2,r2,r11
2541304636Sjkim	eor	r3,r0,r11,ror#19
2542304636Sjkim	eor	r0,r7,r7,ror#11
2543304636Sjkim	eor	r2,r2,r5
2544304636Sjkim	add	r6,r6,r3,ror#6
2545304636Sjkim	eor	r3,r7,r8
2546304636Sjkim	eor	r0,r0,r7,ror#20
2547304636Sjkim	add	r6,r6,r2
2548304636Sjkim	ldr	r2,[sp,#56]
2549304636Sjkim	and	r12,r12,r3
2550304636Sjkim	add	r10,r10,r6
2551304636Sjkim	add	r6,r6,r0,ror#2
2552304636Sjkim	eor	r12,r12,r8
2553304636Sjkim	add	r5,r5,r2
2554304636Sjkim	eor	r2,r11,r4
2555304636Sjkim	eor	r0,r10,r10,ror#5
2556304636Sjkim	add	r6,r6,r12
2557304636Sjkim	and	r2,r2,r10
2558304636Sjkim	eor	r12,r0,r10,ror#19
2559304636Sjkim	eor	r0,r6,r6,ror#11
2560304636Sjkim	eor	r2,r2,r4
2561304636Sjkim	add	r5,r5,r12,ror#6
2562304636Sjkim	eor	r12,r6,r7
2563304636Sjkim	eor	r0,r0,r6,ror#20
2564304636Sjkim	add	r5,r5,r2
2565304636Sjkim	ldr	r2,[sp,#60]
2566304636Sjkim	and	r3,r3,r12
2567304636Sjkim	add	r9,r9,r5
2568304636Sjkim	add	r5,r5,r0,ror#2
2569304636Sjkim	eor	r3,r3,r7
2570304636Sjkim	add	r4,r4,r2
2571304636Sjkim	eor	r2,r10,r11
2572304636Sjkim	eor	r0,r9,r9,ror#5
2573304636Sjkim	add	r5,r5,r3
2574304636Sjkim	and	r2,r2,r9
2575304636Sjkim	eor	r3,r0,r9,ror#19
2576304636Sjkim	eor	r0,r5,r5,ror#11
2577304636Sjkim	eor	r2,r2,r11
2578304636Sjkim	add	r4,r4,r3,ror#6
2579304636Sjkim	eor	r3,r5,r6
2580304636Sjkim	eor	r0,r0,r5,ror#20
2581304636Sjkim	add	r4,r4,r2
2582304636Sjkim	ldr	r2,[sp,#64]
2583304636Sjkim	and	r12,r12,r3
2584304636Sjkim	add	r8,r8,r4
2585304636Sjkim	add	r4,r4,r0,ror#2
2586304636Sjkim	eor	r12,r12,r6
2587304636Sjkim	vst1.32	{q8},[r1,:128]!
2588304636Sjkim	ldr	r0,[r2,#0]
2589304636Sjkim	add	r4,r4,r12			@ h+=Maj(a,b,c) from the past
2590304636Sjkim	ldr	r12,[r2,#4]
2591304636Sjkim	ldr	r3,[r2,#8]
2592304636Sjkim	ldr	r1,[r2,#12]
2593304636Sjkim	add	r4,r4,r0			@ accumulate
2594304636Sjkim	ldr	r0,[r2,#16]
2595304636Sjkim	add	r5,r5,r12
2596304636Sjkim	ldr	r12,[r2,#20]
2597304636Sjkim	add	r6,r6,r3
2598304636Sjkim	ldr	r3,[r2,#24]
2599304636Sjkim	add	r7,r7,r1
2600304636Sjkim	ldr	r1,[r2,#28]
2601304636Sjkim	add	r8,r8,r0
2602304636Sjkim	str	r4,[r2],#4
2603304636Sjkim	add	r9,r9,r12
2604304636Sjkim	str	r5,[r2],#4
2605304636Sjkim	add	r10,r10,r3
2606304636Sjkim	str	r6,[r2],#4
2607304636Sjkim	add	r11,r11,r1
2608304636Sjkim	str	r7,[r2],#4
2609304636Sjkim	stmia	r2,{r8-r11}
2610304636Sjkim
2611304636Sjkim	ittte	ne
2612304636Sjkim	movne	r1,sp
2613304636Sjkim	ldrne	r2,[sp,#0]
2614304636Sjkim	eorne	r12,r12,r12
2615304636Sjkim	ldreq	sp,[sp,#76]			@ restore original sp
2616304636Sjkim	itt	ne
2617304636Sjkim	eorne	r3,r5,r6
2618304636Sjkim	bne	.L_00_48
2619304636Sjkim
2620304636Sjkim	ldmia	sp!,{r4-r12,pc}
2621304636Sjkim.size	sha256_block_data_order_neon,.-sha256_block_data_order_neon
2622304636Sjkim#endif
2623304636Sjkim#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
2624304636Sjkim
2625304636Sjkim# ifdef __thumb2__
2626304636Sjkim#  define INST(a,b,c,d)	.byte	c,d|0xc,a,b
2627304636Sjkim# else
2628304636Sjkim#  define INST(a,b,c,d)	.byte	a,b,c,d
2629304636Sjkim# endif
2630304636Sjkim
2631304636Sjkim.type	sha256_block_data_order_armv8,%function
2632304636Sjkim.align	5
2633304636Sjkimsha256_block_data_order_armv8:
2634304636Sjkim.LARMv8:
2635304636Sjkim	vld1.32	{q0,q1},[r0]
2636304636Sjkim# ifdef __thumb2__
2637304636Sjkim	adr	r3,.LARMv8
2638304636Sjkim	sub	r3,r3,#.LARMv8-K256
2639304636Sjkim# else
2640304636Sjkim	sub	r3,r3,#256+32
2641304636Sjkim# endif
2642304636Sjkim	add	r2,r1,r2,lsl#6	@ len to point at the end of inp
2643304636Sjkim
2644304636Sjkim.Loop_v8:
2645304636Sjkim	vld1.8		{q8-q9},[r1]!
2646304636Sjkim	vld1.8		{q10-q11},[r1]!
2647304636Sjkim	vld1.32		{q12},[r3]!
2648304636Sjkim	vrev32.8	q8,q8
2649304636Sjkim	vrev32.8	q9,q9
2650304636Sjkim	vrev32.8	q10,q10
2651304636Sjkim	vrev32.8	q11,q11
2652304636Sjkim	vmov		q14,q0	@ offload
2653304636Sjkim	vmov		q15,q1
2654304636Sjkim	teq		r1,r2
2655304636Sjkim	vld1.32		{q13},[r3]!
2656304636Sjkim	vadd.i32	q12,q12,q8
2657304636Sjkim	INST(0xe2,0x03,0xfa,0xf3)	@ sha256su0 q8,q9
2658304636Sjkim	vmov		q2,q0
2659304636Sjkim	INST(0x68,0x0c,0x02,0xf3)	@ sha256h q0,q1,q12
2660304636Sjkim	INST(0x68,0x2c,0x14,0xf3)	@ sha256h2 q1,q2,q12
2661304636Sjkim	INST(0xe6,0x0c,0x64,0xf3)	@ sha256su1 q8,q10,q11
2662304636Sjkim	vld1.32		{q12},[r3]!
2663304636Sjkim	vadd.i32	q13,q13,q9
2664304636Sjkim	INST(0xe4,0x23,0xfa,0xf3)	@ sha256su0 q9,q10
2665304636Sjkim	vmov		q2,q0
2666304636Sjkim	INST(0x6a,0x0c,0x02,0xf3)	@ sha256h q0,q1,q13
2667304636Sjkim	INST(0x6a,0x2c,0x14,0xf3)	@ sha256h2 q1,q2,q13
2668304636Sjkim	INST(0xe0,0x2c,0x66,0xf3)	@ sha256su1 q9,q11,q8
2669304636Sjkim	vld1.32		{q13},[r3]!
2670304636Sjkim	vadd.i32	q12,q12,q10
2671304636Sjkim	INST(0xe6,0x43,0xfa,0xf3)	@ sha256su0 q10,q11
2672304636Sjkim	vmov		q2,q0
2673304636Sjkim	INST(0x68,0x0c,0x02,0xf3)	@ sha256h q0,q1,q12
2674304636Sjkim	INST(0x68,0x2c,0x14,0xf3)	@ sha256h2 q1,q2,q12
2675304636Sjkim	INST(0xe2,0x4c,0x60,0xf3)	@ sha256su1 q10,q8,q9
2676304636Sjkim	vld1.32		{q12},[r3]!
2677304636Sjkim	vadd.i32	q13,q13,q11
2678304636Sjkim	INST(0xe0,0x63,0xfa,0xf3)	@ sha256su0 q11,q8
2679304636Sjkim	vmov		q2,q0
2680304636Sjkim	INST(0x6a,0x0c,0x02,0xf3)	@ sha256h q0,q1,q13
2681304636Sjkim	INST(0x6a,0x2c,0x14,0xf3)	@ sha256h2 q1,q2,q13
2682304636Sjkim	INST(0xe4,0x6c,0x62,0xf3)	@ sha256su1 q11,q9,q10
2683304636Sjkim	vld1.32		{q13},[r3]!
2684304636Sjkim	vadd.i32	q12,q12,q8
2685304636Sjkim	INST(0xe2,0x03,0xfa,0xf3)	@ sha256su0 q8,q9
2686304636Sjkim	vmov		q2,q0
2687304636Sjkim	INST(0x68,0x0c,0x02,0xf3)	@ sha256h q0,q1,q12
2688304636Sjkim	INST(0x68,0x2c,0x14,0xf3)	@ sha256h2 q1,q2,q12
2689304636Sjkim	INST(0xe6,0x0c,0x64,0xf3)	@ sha256su1 q8,q10,q11
2690304636Sjkim	vld1.32		{q12},[r3]!
2691304636Sjkim	vadd.i32	q13,q13,q9
2692304636Sjkim	INST(0xe4,0x23,0xfa,0xf3)	@ sha256su0 q9,q10
2693304636Sjkim	vmov		q2,q0
2694304636Sjkim	INST(0x6a,0x0c,0x02,0xf3)	@ sha256h q0,q1,q13
2695304636Sjkim	INST(0x6a,0x2c,0x14,0xf3)	@ sha256h2 q1,q2,q13
2696304636Sjkim	INST(0xe0,0x2c,0x66,0xf3)	@ sha256su1 q9,q11,q8
2697304636Sjkim	vld1.32		{q13},[r3]!
2698304636Sjkim	vadd.i32	q12,q12,q10
2699304636Sjkim	INST(0xe6,0x43,0xfa,0xf3)	@ sha256su0 q10,q11
2700304636Sjkim	vmov		q2,q0
2701304636Sjkim	INST(0x68,0x0c,0x02,0xf3)	@ sha256h q0,q1,q12
2702304636Sjkim	INST(0x68,0x2c,0x14,0xf3)	@ sha256h2 q1,q2,q12
2703304636Sjkim	INST(0xe2,0x4c,0x60,0xf3)	@ sha256su1 q10,q8,q9
2704304636Sjkim	vld1.32		{q12},[r3]!
2705304636Sjkim	vadd.i32	q13,q13,q11
2706304636Sjkim	INST(0xe0,0x63,0xfa,0xf3)	@ sha256su0 q11,q8
2707304636Sjkim	vmov		q2,q0
2708304636Sjkim	INST(0x6a,0x0c,0x02,0xf3)	@ sha256h q0,q1,q13
2709304636Sjkim	INST(0x6a,0x2c,0x14,0xf3)	@ sha256h2 q1,q2,q13
2710304636Sjkim	INST(0xe4,0x6c,0x62,0xf3)	@ sha256su1 q11,q9,q10
2711304636Sjkim	vld1.32		{q13},[r3]!
2712304636Sjkim	vadd.i32	q12,q12,q8
2713304636Sjkim	INST(0xe2,0x03,0xfa,0xf3)	@ sha256su0 q8,q9
2714304636Sjkim	vmov		q2,q0
2715304636Sjkim	INST(0x68,0x0c,0x02,0xf3)	@ sha256h q0,q1,q12
2716304636Sjkim	INST(0x68,0x2c,0x14,0xf3)	@ sha256h2 q1,q2,q12
2717304636Sjkim	INST(0xe6,0x0c,0x64,0xf3)	@ sha256su1 q8,q10,q11
2718304636Sjkim	vld1.32		{q12},[r3]!
2719304636Sjkim	vadd.i32	q13,q13,q9
2720304636Sjkim	INST(0xe4,0x23,0xfa,0xf3)	@ sha256su0 q9,q10
2721304636Sjkim	vmov		q2,q0
2722304636Sjkim	INST(0x6a,0x0c,0x02,0xf3)	@ sha256h q0,q1,q13
2723304636Sjkim	INST(0x6a,0x2c,0x14,0xf3)	@ sha256h2 q1,q2,q13
2724304636Sjkim	INST(0xe0,0x2c,0x66,0xf3)	@ sha256su1 q9,q11,q8
2725304636Sjkim	vld1.32		{q13},[r3]!
2726304636Sjkim	vadd.i32	q12,q12,q10
2727304636Sjkim	INST(0xe6,0x43,0xfa,0xf3)	@ sha256su0 q10,q11
2728304636Sjkim	vmov		q2,q0
2729304636Sjkim	INST(0x68,0x0c,0x02,0xf3)	@ sha256h q0,q1,q12
2730304636Sjkim	INST(0x68,0x2c,0x14,0xf3)	@ sha256h2 q1,q2,q12
2731304636Sjkim	INST(0xe2,0x4c,0x60,0xf3)	@ sha256su1 q10,q8,q9
2732304636Sjkim	vld1.32		{q12},[r3]!
2733304636Sjkim	vadd.i32	q13,q13,q11
2734304636Sjkim	INST(0xe0,0x63,0xfa,0xf3)	@ sha256su0 q11,q8
2735304636Sjkim	vmov		q2,q0
2736304636Sjkim	INST(0x6a,0x0c,0x02,0xf3)	@ sha256h q0,q1,q13
2737304636Sjkim	INST(0x6a,0x2c,0x14,0xf3)	@ sha256h2 q1,q2,q13
2738304636Sjkim	INST(0xe4,0x6c,0x62,0xf3)	@ sha256su1 q11,q9,q10
2739304636Sjkim	vld1.32		{q13},[r3]!
2740304636Sjkim	vadd.i32	q12,q12,q8
2741304636Sjkim	vmov		q2,q0
2742304636Sjkim	INST(0x68,0x0c,0x02,0xf3)	@ sha256h q0,q1,q12
2743304636Sjkim	INST(0x68,0x2c,0x14,0xf3)	@ sha256h2 q1,q2,q12
2744304636Sjkim
2745304636Sjkim	vld1.32		{q12},[r3]!
2746304636Sjkim	vadd.i32	q13,q13,q9
2747304636Sjkim	vmov		q2,q0
2748304636Sjkim	INST(0x6a,0x0c,0x02,0xf3)	@ sha256h q0,q1,q13
2749304636Sjkim	INST(0x6a,0x2c,0x14,0xf3)	@ sha256h2 q1,q2,q13
2750304636Sjkim
2751304636Sjkim	vld1.32		{q13},[r3]
2752304636Sjkim	vadd.i32	q12,q12,q10
2753304636Sjkim	sub		r3,r3,#256-16	@ rewind
2754304636Sjkim	vmov		q2,q0
2755304636Sjkim	INST(0x68,0x0c,0x02,0xf3)	@ sha256h q0,q1,q12
2756304636Sjkim	INST(0x68,0x2c,0x14,0xf3)	@ sha256h2 q1,q2,q12
2757304636Sjkim
2758304636Sjkim	vadd.i32	q13,q13,q11
2759304636Sjkim	vmov		q2,q0
2760304636Sjkim	INST(0x6a,0x0c,0x02,0xf3)	@ sha256h q0,q1,q13
2761304636Sjkim	INST(0x6a,0x2c,0x14,0xf3)	@ sha256h2 q1,q2,q13
2762304636Sjkim
2763304636Sjkim	vadd.i32	q0,q0,q14
2764304636Sjkim	vadd.i32	q1,q1,q15
2765304636Sjkim	it		ne
2766304636Sjkim	bne		.Loop_v8
2767304636Sjkim
2768304636Sjkim	vst1.32		{q0,q1},[r0]
2769304636Sjkim
2770304636Sjkim	bx	lr		@ bx lr
2771304636Sjkim.size	sha256_block_data_order_armv8,.-sha256_block_data_order_armv8
2772304636Sjkim#endif
2773304636Sjkim.asciz  "SHA256 block transform for ARMv4/NEON/ARMv8, CRYPTOGAMS by <appro@openssl.org>"
2774304636Sjkim.align	2
2775304636Sjkim#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
2776304636Sjkim.comm   OPENSSL_armcap_P,4,4
2777304636Sjkim#endif
2778