xref: /minix3/crypto/external/bsd/openssl/lib/libcrypto/arch/arm/sha256-armv4.S (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1*0a6a1f1dSLionel Sambuc#include "arm_arch.h"
2*0a6a1f1dSLionel Sambuc#include "arm_asm.h"
3*0a6a1f1dSLionel Sambuc
4*0a6a1f1dSLionel Sambuc.text
5*0a6a1f1dSLionel Sambuc.code	32
6*0a6a1f1dSLionel Sambuc
7*0a6a1f1dSLionel Sambuc.type	K256,%object
8*0a6a1f1dSLionel Sambuc.align	5
9*0a6a1f1dSLionel SambucK256:
10*0a6a1f1dSLionel Sambuc.word	0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
11*0a6a1f1dSLionel Sambuc.word	0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5
12*0a6a1f1dSLionel Sambuc.word	0xd807aa98,0x12835b01,0x243185be,0x550c7dc3
13*0a6a1f1dSLionel Sambuc.word	0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174
14*0a6a1f1dSLionel Sambuc.word	0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc
15*0a6a1f1dSLionel Sambuc.word	0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da
16*0a6a1f1dSLionel Sambuc.word	0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7
17*0a6a1f1dSLionel Sambuc.word	0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967
18*0a6a1f1dSLionel Sambuc.word	0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13
19*0a6a1f1dSLionel Sambuc.word	0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85
20*0a6a1f1dSLionel Sambuc.word	0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3
21*0a6a1f1dSLionel Sambuc.word	0xd192e819,0xd6990624,0xf40e3585,0x106aa070
22*0a6a1f1dSLionel Sambuc.word	0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5
23*0a6a1f1dSLionel Sambuc.word	0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3
24*0a6a1f1dSLionel Sambuc.word	0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
25*0a6a1f1dSLionel Sambuc.word	0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
26*0a6a1f1dSLionel Sambuc.size	K256,.-K256
27*0a6a1f1dSLionel Sambuc.word	0				@ terminator
28*0a6a1f1dSLionel Sambuc#if __ARM_MAX_ARCH__>=7
29*0a6a1f1dSLionel Sambuc.LOPENSSL_armcap:
30*0a6a1f1dSLionel Sambuc.word	OPENSSL_armcap_P-sha256_block_data_order
31*0a6a1f1dSLionel Sambuc#endif
32*0a6a1f1dSLionel Sambuc.align	5
33*0a6a1f1dSLionel Sambuc
34*0a6a1f1dSLionel Sambuc.global	sha256_block_data_order
35*0a6a1f1dSLionel Sambuc.type	sha256_block_data_order,%function
36*0a6a1f1dSLionel Sambucsha256_block_data_order:
37*0a6a1f1dSLionel Sambuc	sub	r3,pc,#8		@ sha256_block_data_order
38*0a6a1f1dSLionel Sambuc	add	r2,r1,r2,lsl#6	@ len to point at the end of inp
39*0a6a1f1dSLionel Sambuc#if __ARM_MAX_ARCH__>=7
40*0a6a1f1dSLionel Sambuc	ldr	r12,.LOPENSSL_armcap
41*0a6a1f1dSLionel Sambuc	ldr	r12,[r3,r12]		@ OPENSSL_armcap_P
42*0a6a1f1dSLionel Sambuc	tst	r12,#ARMV8_SHA256
43*0a6a1f1dSLionel Sambuc	bne	.LARMv8
44*0a6a1f1dSLionel Sambuc	tst	r12,#ARMV7_NEON
45*0a6a1f1dSLionel Sambuc	bne	.LNEON
46*0a6a1f1dSLionel Sambuc#endif
47*0a6a1f1dSLionel Sambuc	stmdb	sp!,{r0,r1,r2,r4-r11,lr}
48*0a6a1f1dSLionel Sambuc	ldmia	r0,{r4,r5,r6,r7,r8,r9,r10,r11}
49*0a6a1f1dSLionel Sambuc	sub	r14,r3,#256+32	@ K256
50*0a6a1f1dSLionel Sambuc	sub	sp,sp,#16*4		@ alloca(X[16])
51*0a6a1f1dSLionel Sambuc.Loop:
52*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
53*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4
54*0a6a1f1dSLionel Sambuc# else
55*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
56*0a6a1f1dSLionel Sambuc# endif
57*0a6a1f1dSLionel Sambuc	eor	r3,r5,r6		@ magic
58*0a6a1f1dSLionel Sambuc	eor	r12,r12,r12
59*0a6a1f1dSLionel Sambuc#if __ARM_ARCH__>=7
60*0a6a1f1dSLionel Sambuc	@ ldr	r2,[r1],#4			@ 0
61*0a6a1f1dSLionel Sambuc# if 0==15
62*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
63*0a6a1f1dSLionel Sambuc# endif
64*0a6a1f1dSLionel Sambuc	eor	r0,r8,r8,ror#5
65*0a6a1f1dSLionel Sambuc	add	r4,r4,r12			@ h+=Maj(a,b,c) from the past
66*0a6a1f1dSLionel Sambuc	eor	r0,r0,r8,ror#19	@ Sigma1(e)
67*0a6a1f1dSLionel Sambuc	rev	r2,r2
68*0a6a1f1dSLionel Sambuc#else
69*0a6a1f1dSLionel Sambuc	@ ldrb	r2,[r1,#3]			@ 0
70*0a6a1f1dSLionel Sambuc	add	r4,r4,r12			@ h+=Maj(a,b,c) from the past
71*0a6a1f1dSLionel Sambuc	ldrb	r12,[r1,#2]
72*0a6a1f1dSLionel Sambuc	ldrb	r0,[r1,#1]
73*0a6a1f1dSLionel Sambuc	orr	r2,r2,r12,lsl#8
74*0a6a1f1dSLionel Sambuc	ldrb	r12,[r1],#4
75*0a6a1f1dSLionel Sambuc	orr	r2,r2,r0,lsl#16
76*0a6a1f1dSLionel Sambuc# if 0==15
77*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
78*0a6a1f1dSLionel Sambuc# endif
79*0a6a1f1dSLionel Sambuc	eor	r0,r8,r8,ror#5
80*0a6a1f1dSLionel Sambuc	orr	r2,r2,r12,lsl#24
81*0a6a1f1dSLionel Sambuc	eor	r0,r0,r8,ror#19	@ Sigma1(e)
82*0a6a1f1dSLionel Sambuc#endif
83*0a6a1f1dSLionel Sambuc	ldr	r12,[r14],#4			@ *K256++
84*0a6a1f1dSLionel Sambuc	add	r11,r11,r2			@ h+=X[i]
85*0a6a1f1dSLionel Sambuc	str	r2,[sp,#0*4]
86*0a6a1f1dSLionel Sambuc	eor	r2,r9,r10
87*0a6a1f1dSLionel Sambuc	add	r11,r11,r0,ror#6	@ h+=Sigma1(e)
88*0a6a1f1dSLionel Sambuc	and	r2,r2,r8
89*0a6a1f1dSLionel Sambuc	add	r11,r11,r12			@ h+=K256[i]
90*0a6a1f1dSLionel Sambuc	eor	r2,r2,r10			@ Ch(e,f,g)
91*0a6a1f1dSLionel Sambuc	eor	r0,r4,r4,ror#11
92*0a6a1f1dSLionel Sambuc	add	r11,r11,r2			@ h+=Ch(e,f,g)
93*0a6a1f1dSLionel Sambuc#if 0==31
94*0a6a1f1dSLionel Sambuc	and	r12,r12,#0xff
95*0a6a1f1dSLionel Sambuc	cmp	r12,#0xf2			@ done?
96*0a6a1f1dSLionel Sambuc#endif
97*0a6a1f1dSLionel Sambuc#if 0<15
98*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
99*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
100*0a6a1f1dSLionel Sambuc# else
101*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
102*0a6a1f1dSLionel Sambuc# endif
103*0a6a1f1dSLionel Sambuc	eor	r12,r4,r5			@ a^b, b^c in next round
104*0a6a1f1dSLionel Sambuc#else
105*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#2*4]		@ from future BODY_16_xx
106*0a6a1f1dSLionel Sambuc	eor	r12,r4,r5			@ a^b, b^c in next round
107*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#15*4]	@ from future BODY_16_xx
108*0a6a1f1dSLionel Sambuc#endif
109*0a6a1f1dSLionel Sambuc	eor	r0,r0,r4,ror#20	@ Sigma0(a)
110*0a6a1f1dSLionel Sambuc	and	r3,r3,r12			@ (b^c)&=(a^b)
111*0a6a1f1dSLionel Sambuc	add	r7,r7,r11			@ d+=h
112*0a6a1f1dSLionel Sambuc	eor	r3,r3,r5			@ Maj(a,b,c)
113*0a6a1f1dSLionel Sambuc	add	r11,r11,r0,ror#2	@ h+=Sigma0(a)
114*0a6a1f1dSLionel Sambuc	@ add	r11,r11,r3			@ h+=Maj(a,b,c)
115*0a6a1f1dSLionel Sambuc#if __ARM_ARCH__>=7
116*0a6a1f1dSLionel Sambuc	@ ldr	r2,[r1],#4			@ 1
117*0a6a1f1dSLionel Sambuc# if 1==15
118*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
119*0a6a1f1dSLionel Sambuc# endif
120*0a6a1f1dSLionel Sambuc	eor	r0,r7,r7,ror#5
121*0a6a1f1dSLionel Sambuc	add	r11,r11,r3			@ h+=Maj(a,b,c) from the past
122*0a6a1f1dSLionel Sambuc	eor	r0,r0,r7,ror#19	@ Sigma1(e)
123*0a6a1f1dSLionel Sambuc	rev	r2,r2
124*0a6a1f1dSLionel Sambuc#else
125*0a6a1f1dSLionel Sambuc	@ ldrb	r2,[r1,#3]			@ 1
126*0a6a1f1dSLionel Sambuc	add	r11,r11,r3			@ h+=Maj(a,b,c) from the past
127*0a6a1f1dSLionel Sambuc	ldrb	r3,[r1,#2]
128*0a6a1f1dSLionel Sambuc	ldrb	r0,[r1,#1]
129*0a6a1f1dSLionel Sambuc	orr	r2,r2,r3,lsl#8
130*0a6a1f1dSLionel Sambuc	ldrb	r3,[r1],#4
131*0a6a1f1dSLionel Sambuc	orr	r2,r2,r0,lsl#16
132*0a6a1f1dSLionel Sambuc# if 1==15
133*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
134*0a6a1f1dSLionel Sambuc# endif
135*0a6a1f1dSLionel Sambuc	eor	r0,r7,r7,ror#5
136*0a6a1f1dSLionel Sambuc	orr	r2,r2,r3,lsl#24
137*0a6a1f1dSLionel Sambuc	eor	r0,r0,r7,ror#19	@ Sigma1(e)
138*0a6a1f1dSLionel Sambuc#endif
139*0a6a1f1dSLionel Sambuc	ldr	r3,[r14],#4			@ *K256++
140*0a6a1f1dSLionel Sambuc	add	r10,r10,r2			@ h+=X[i]
141*0a6a1f1dSLionel Sambuc	str	r2,[sp,#1*4]
142*0a6a1f1dSLionel Sambuc	eor	r2,r8,r9
143*0a6a1f1dSLionel Sambuc	add	r10,r10,r0,ror#6	@ h+=Sigma1(e)
144*0a6a1f1dSLionel Sambuc	and	r2,r2,r7
145*0a6a1f1dSLionel Sambuc	add	r10,r10,r3			@ h+=K256[i]
146*0a6a1f1dSLionel Sambuc	eor	r2,r2,r9			@ Ch(e,f,g)
147*0a6a1f1dSLionel Sambuc	eor	r0,r11,r11,ror#11
148*0a6a1f1dSLionel Sambuc	add	r10,r10,r2			@ h+=Ch(e,f,g)
149*0a6a1f1dSLionel Sambuc#if 1==31
150*0a6a1f1dSLionel Sambuc	and	r3,r3,#0xff
151*0a6a1f1dSLionel Sambuc	cmp	r3,#0xf2			@ done?
152*0a6a1f1dSLionel Sambuc#endif
153*0a6a1f1dSLionel Sambuc#if 1<15
154*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
155*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
156*0a6a1f1dSLionel Sambuc# else
157*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
158*0a6a1f1dSLionel Sambuc# endif
159*0a6a1f1dSLionel Sambuc	eor	r3,r11,r4			@ a^b, b^c in next round
160*0a6a1f1dSLionel Sambuc#else
161*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#3*4]		@ from future BODY_16_xx
162*0a6a1f1dSLionel Sambuc	eor	r3,r11,r4			@ a^b, b^c in next round
163*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#0*4]	@ from future BODY_16_xx
164*0a6a1f1dSLionel Sambuc#endif
165*0a6a1f1dSLionel Sambuc	eor	r0,r0,r11,ror#20	@ Sigma0(a)
166*0a6a1f1dSLionel Sambuc	and	r12,r12,r3			@ (b^c)&=(a^b)
167*0a6a1f1dSLionel Sambuc	add	r6,r6,r10			@ d+=h
168*0a6a1f1dSLionel Sambuc	eor	r12,r12,r4			@ Maj(a,b,c)
169*0a6a1f1dSLionel Sambuc	add	r10,r10,r0,ror#2	@ h+=Sigma0(a)
170*0a6a1f1dSLionel Sambuc	@ add	r10,r10,r12			@ h+=Maj(a,b,c)
171*0a6a1f1dSLionel Sambuc#if __ARM_ARCH__>=7
172*0a6a1f1dSLionel Sambuc	@ ldr	r2,[r1],#4			@ 2
173*0a6a1f1dSLionel Sambuc# if 2==15
174*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
175*0a6a1f1dSLionel Sambuc# endif
176*0a6a1f1dSLionel Sambuc	eor	r0,r6,r6,ror#5
177*0a6a1f1dSLionel Sambuc	add	r10,r10,r12			@ h+=Maj(a,b,c) from the past
178*0a6a1f1dSLionel Sambuc	eor	r0,r0,r6,ror#19	@ Sigma1(e)
179*0a6a1f1dSLionel Sambuc	rev	r2,r2
180*0a6a1f1dSLionel Sambuc#else
181*0a6a1f1dSLionel Sambuc	@ ldrb	r2,[r1,#3]			@ 2
182*0a6a1f1dSLionel Sambuc	add	r10,r10,r12			@ h+=Maj(a,b,c) from the past
183*0a6a1f1dSLionel Sambuc	ldrb	r12,[r1,#2]
184*0a6a1f1dSLionel Sambuc	ldrb	r0,[r1,#1]
185*0a6a1f1dSLionel Sambuc	orr	r2,r2,r12,lsl#8
186*0a6a1f1dSLionel Sambuc	ldrb	r12,[r1],#4
187*0a6a1f1dSLionel Sambuc	orr	r2,r2,r0,lsl#16
188*0a6a1f1dSLionel Sambuc# if 2==15
189*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
190*0a6a1f1dSLionel Sambuc# endif
191*0a6a1f1dSLionel Sambuc	eor	r0,r6,r6,ror#5
192*0a6a1f1dSLionel Sambuc	orr	r2,r2,r12,lsl#24
193*0a6a1f1dSLionel Sambuc	eor	r0,r0,r6,ror#19	@ Sigma1(e)
194*0a6a1f1dSLionel Sambuc#endif
195*0a6a1f1dSLionel Sambuc	ldr	r12,[r14],#4			@ *K256++
196*0a6a1f1dSLionel Sambuc	add	r9,r9,r2			@ h+=X[i]
197*0a6a1f1dSLionel Sambuc	str	r2,[sp,#2*4]
198*0a6a1f1dSLionel Sambuc	eor	r2,r7,r8
199*0a6a1f1dSLionel Sambuc	add	r9,r9,r0,ror#6	@ h+=Sigma1(e)
200*0a6a1f1dSLionel Sambuc	and	r2,r2,r6
201*0a6a1f1dSLionel Sambuc	add	r9,r9,r12			@ h+=K256[i]
202*0a6a1f1dSLionel Sambuc	eor	r2,r2,r8			@ Ch(e,f,g)
203*0a6a1f1dSLionel Sambuc	eor	r0,r10,r10,ror#11
204*0a6a1f1dSLionel Sambuc	add	r9,r9,r2			@ h+=Ch(e,f,g)
205*0a6a1f1dSLionel Sambuc#if 2==31
206*0a6a1f1dSLionel Sambuc	and	r12,r12,#0xff
207*0a6a1f1dSLionel Sambuc	cmp	r12,#0xf2			@ done?
208*0a6a1f1dSLionel Sambuc#endif
209*0a6a1f1dSLionel Sambuc#if 2<15
210*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
211*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
212*0a6a1f1dSLionel Sambuc# else
213*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
214*0a6a1f1dSLionel Sambuc# endif
215*0a6a1f1dSLionel Sambuc	eor	r12,r10,r11			@ a^b, b^c in next round
216*0a6a1f1dSLionel Sambuc#else
217*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#4*4]		@ from future BODY_16_xx
218*0a6a1f1dSLionel Sambuc	eor	r12,r10,r11			@ a^b, b^c in next round
219*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#1*4]	@ from future BODY_16_xx
220*0a6a1f1dSLionel Sambuc#endif
221*0a6a1f1dSLionel Sambuc	eor	r0,r0,r10,ror#20	@ Sigma0(a)
222*0a6a1f1dSLionel Sambuc	and	r3,r3,r12			@ (b^c)&=(a^b)
223*0a6a1f1dSLionel Sambuc	add	r5,r5,r9			@ d+=h
224*0a6a1f1dSLionel Sambuc	eor	r3,r3,r11			@ Maj(a,b,c)
225*0a6a1f1dSLionel Sambuc	add	r9,r9,r0,ror#2	@ h+=Sigma0(a)
226*0a6a1f1dSLionel Sambuc	@ add	r9,r9,r3			@ h+=Maj(a,b,c)
227*0a6a1f1dSLionel Sambuc#if __ARM_ARCH__>=7
228*0a6a1f1dSLionel Sambuc	@ ldr	r2,[r1],#4			@ 3
229*0a6a1f1dSLionel Sambuc# if 3==15
230*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
231*0a6a1f1dSLionel Sambuc# endif
232*0a6a1f1dSLionel Sambuc	eor	r0,r5,r5,ror#5
233*0a6a1f1dSLionel Sambuc	add	r9,r9,r3			@ h+=Maj(a,b,c) from the past
234*0a6a1f1dSLionel Sambuc	eor	r0,r0,r5,ror#19	@ Sigma1(e)
235*0a6a1f1dSLionel Sambuc	rev	r2,r2
236*0a6a1f1dSLionel Sambuc#else
237*0a6a1f1dSLionel Sambuc	@ ldrb	r2,[r1,#3]			@ 3
238*0a6a1f1dSLionel Sambuc	add	r9,r9,r3			@ h+=Maj(a,b,c) from the past
239*0a6a1f1dSLionel Sambuc	ldrb	r3,[r1,#2]
240*0a6a1f1dSLionel Sambuc	ldrb	r0,[r1,#1]
241*0a6a1f1dSLionel Sambuc	orr	r2,r2,r3,lsl#8
242*0a6a1f1dSLionel Sambuc	ldrb	r3,[r1],#4
243*0a6a1f1dSLionel Sambuc	orr	r2,r2,r0,lsl#16
244*0a6a1f1dSLionel Sambuc# if 3==15
245*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
246*0a6a1f1dSLionel Sambuc# endif
247*0a6a1f1dSLionel Sambuc	eor	r0,r5,r5,ror#5
248*0a6a1f1dSLionel Sambuc	orr	r2,r2,r3,lsl#24
249*0a6a1f1dSLionel Sambuc	eor	r0,r0,r5,ror#19	@ Sigma1(e)
250*0a6a1f1dSLionel Sambuc#endif
251*0a6a1f1dSLionel Sambuc	ldr	r3,[r14],#4			@ *K256++
252*0a6a1f1dSLionel Sambuc	add	r8,r8,r2			@ h+=X[i]
253*0a6a1f1dSLionel Sambuc	str	r2,[sp,#3*4]
254*0a6a1f1dSLionel Sambuc	eor	r2,r6,r7
255*0a6a1f1dSLionel Sambuc	add	r8,r8,r0,ror#6	@ h+=Sigma1(e)
256*0a6a1f1dSLionel Sambuc	and	r2,r2,r5
257*0a6a1f1dSLionel Sambuc	add	r8,r8,r3			@ h+=K256[i]
258*0a6a1f1dSLionel Sambuc	eor	r2,r2,r7			@ Ch(e,f,g)
259*0a6a1f1dSLionel Sambuc	eor	r0,r9,r9,ror#11
260*0a6a1f1dSLionel Sambuc	add	r8,r8,r2			@ h+=Ch(e,f,g)
261*0a6a1f1dSLionel Sambuc#if 3==31
262*0a6a1f1dSLionel Sambuc	and	r3,r3,#0xff
263*0a6a1f1dSLionel Sambuc	cmp	r3,#0xf2			@ done?
264*0a6a1f1dSLionel Sambuc#endif
265*0a6a1f1dSLionel Sambuc#if 3<15
266*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
267*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
268*0a6a1f1dSLionel Sambuc# else
269*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
270*0a6a1f1dSLionel Sambuc# endif
271*0a6a1f1dSLionel Sambuc	eor	r3,r9,r10			@ a^b, b^c in next round
272*0a6a1f1dSLionel Sambuc#else
273*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#5*4]		@ from future BODY_16_xx
274*0a6a1f1dSLionel Sambuc	eor	r3,r9,r10			@ a^b, b^c in next round
275*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#2*4]	@ from future BODY_16_xx
276*0a6a1f1dSLionel Sambuc#endif
277*0a6a1f1dSLionel Sambuc	eor	r0,r0,r9,ror#20	@ Sigma0(a)
278*0a6a1f1dSLionel Sambuc	and	r12,r12,r3			@ (b^c)&=(a^b)
279*0a6a1f1dSLionel Sambuc	add	r4,r4,r8			@ d+=h
280*0a6a1f1dSLionel Sambuc	eor	r12,r12,r10			@ Maj(a,b,c)
281*0a6a1f1dSLionel Sambuc	add	r8,r8,r0,ror#2	@ h+=Sigma0(a)
282*0a6a1f1dSLionel Sambuc	@ add	r8,r8,r12			@ h+=Maj(a,b,c)
283*0a6a1f1dSLionel Sambuc#if __ARM_ARCH__>=7
284*0a6a1f1dSLionel Sambuc	@ ldr	r2,[r1],#4			@ 4
285*0a6a1f1dSLionel Sambuc# if 4==15
286*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
287*0a6a1f1dSLionel Sambuc# endif
288*0a6a1f1dSLionel Sambuc	eor	r0,r4,r4,ror#5
289*0a6a1f1dSLionel Sambuc	add	r8,r8,r12			@ h+=Maj(a,b,c) from the past
290*0a6a1f1dSLionel Sambuc	eor	r0,r0,r4,ror#19	@ Sigma1(e)
291*0a6a1f1dSLionel Sambuc	rev	r2,r2
292*0a6a1f1dSLionel Sambuc#else
293*0a6a1f1dSLionel Sambuc	@ ldrb	r2,[r1,#3]			@ 4
294*0a6a1f1dSLionel Sambuc	add	r8,r8,r12			@ h+=Maj(a,b,c) from the past
295*0a6a1f1dSLionel Sambuc	ldrb	r12,[r1,#2]
296*0a6a1f1dSLionel Sambuc	ldrb	r0,[r1,#1]
297*0a6a1f1dSLionel Sambuc	orr	r2,r2,r12,lsl#8
298*0a6a1f1dSLionel Sambuc	ldrb	r12,[r1],#4
299*0a6a1f1dSLionel Sambuc	orr	r2,r2,r0,lsl#16
300*0a6a1f1dSLionel Sambuc# if 4==15
301*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
302*0a6a1f1dSLionel Sambuc# endif
303*0a6a1f1dSLionel Sambuc	eor	r0,r4,r4,ror#5
304*0a6a1f1dSLionel Sambuc	orr	r2,r2,r12,lsl#24
305*0a6a1f1dSLionel Sambuc	eor	r0,r0,r4,ror#19	@ Sigma1(e)
306*0a6a1f1dSLionel Sambuc#endif
307*0a6a1f1dSLionel Sambuc	ldr	r12,[r14],#4			@ *K256++
308*0a6a1f1dSLionel Sambuc	add	r7,r7,r2			@ h+=X[i]
309*0a6a1f1dSLionel Sambuc	str	r2,[sp,#4*4]
310*0a6a1f1dSLionel Sambuc	eor	r2,r5,r6
311*0a6a1f1dSLionel Sambuc	add	r7,r7,r0,ror#6	@ h+=Sigma1(e)
312*0a6a1f1dSLionel Sambuc	and	r2,r2,r4
313*0a6a1f1dSLionel Sambuc	add	r7,r7,r12			@ h+=K256[i]
314*0a6a1f1dSLionel Sambuc	eor	r2,r2,r6			@ Ch(e,f,g)
315*0a6a1f1dSLionel Sambuc	eor	r0,r8,r8,ror#11
316*0a6a1f1dSLionel Sambuc	add	r7,r7,r2			@ h+=Ch(e,f,g)
317*0a6a1f1dSLionel Sambuc#if 4==31
318*0a6a1f1dSLionel Sambuc	and	r12,r12,#0xff
319*0a6a1f1dSLionel Sambuc	cmp	r12,#0xf2			@ done?
320*0a6a1f1dSLionel Sambuc#endif
321*0a6a1f1dSLionel Sambuc#if 4<15
322*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
323*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
324*0a6a1f1dSLionel Sambuc# else
325*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
326*0a6a1f1dSLionel Sambuc# endif
327*0a6a1f1dSLionel Sambuc	eor	r12,r8,r9			@ a^b, b^c in next round
328*0a6a1f1dSLionel Sambuc#else
329*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#6*4]		@ from future BODY_16_xx
330*0a6a1f1dSLionel Sambuc	eor	r12,r8,r9			@ a^b, b^c in next round
331*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#3*4]	@ from future BODY_16_xx
332*0a6a1f1dSLionel Sambuc#endif
333*0a6a1f1dSLionel Sambuc	eor	r0,r0,r8,ror#20	@ Sigma0(a)
334*0a6a1f1dSLionel Sambuc	and	r3,r3,r12			@ (b^c)&=(a^b)
335*0a6a1f1dSLionel Sambuc	add	r11,r11,r7			@ d+=h
336*0a6a1f1dSLionel Sambuc	eor	r3,r3,r9			@ Maj(a,b,c)
337*0a6a1f1dSLionel Sambuc	add	r7,r7,r0,ror#2	@ h+=Sigma0(a)
338*0a6a1f1dSLionel Sambuc	@ add	r7,r7,r3			@ h+=Maj(a,b,c)
339*0a6a1f1dSLionel Sambuc#if __ARM_ARCH__>=7
340*0a6a1f1dSLionel Sambuc	@ ldr	r2,[r1],#4			@ 5
341*0a6a1f1dSLionel Sambuc# if 5==15
342*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
343*0a6a1f1dSLionel Sambuc# endif
344*0a6a1f1dSLionel Sambuc	eor	r0,r11,r11,ror#5
345*0a6a1f1dSLionel Sambuc	add	r7,r7,r3			@ h+=Maj(a,b,c) from the past
346*0a6a1f1dSLionel Sambuc	eor	r0,r0,r11,ror#19	@ Sigma1(e)
347*0a6a1f1dSLionel Sambuc	rev	r2,r2
348*0a6a1f1dSLionel Sambuc#else
349*0a6a1f1dSLionel Sambuc	@ ldrb	r2,[r1,#3]			@ 5
350*0a6a1f1dSLionel Sambuc	add	r7,r7,r3			@ h+=Maj(a,b,c) from the past
351*0a6a1f1dSLionel Sambuc	ldrb	r3,[r1,#2]
352*0a6a1f1dSLionel Sambuc	ldrb	r0,[r1,#1]
353*0a6a1f1dSLionel Sambuc	orr	r2,r2,r3,lsl#8
354*0a6a1f1dSLionel Sambuc	ldrb	r3,[r1],#4
355*0a6a1f1dSLionel Sambuc	orr	r2,r2,r0,lsl#16
356*0a6a1f1dSLionel Sambuc# if 5==15
357*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
358*0a6a1f1dSLionel Sambuc# endif
359*0a6a1f1dSLionel Sambuc	eor	r0,r11,r11,ror#5
360*0a6a1f1dSLionel Sambuc	orr	r2,r2,r3,lsl#24
361*0a6a1f1dSLionel Sambuc	eor	r0,r0,r11,ror#19	@ Sigma1(e)
362*0a6a1f1dSLionel Sambuc#endif
363*0a6a1f1dSLionel Sambuc	ldr	r3,[r14],#4			@ *K256++
364*0a6a1f1dSLionel Sambuc	add	r6,r6,r2			@ h+=X[i]
365*0a6a1f1dSLionel Sambuc	str	r2,[sp,#5*4]
366*0a6a1f1dSLionel Sambuc	eor	r2,r4,r5
367*0a6a1f1dSLionel Sambuc	add	r6,r6,r0,ror#6	@ h+=Sigma1(e)
368*0a6a1f1dSLionel Sambuc	and	r2,r2,r11
369*0a6a1f1dSLionel Sambuc	add	r6,r6,r3			@ h+=K256[i]
370*0a6a1f1dSLionel Sambuc	eor	r2,r2,r5			@ Ch(e,f,g)
371*0a6a1f1dSLionel Sambuc	eor	r0,r7,r7,ror#11
372*0a6a1f1dSLionel Sambuc	add	r6,r6,r2			@ h+=Ch(e,f,g)
373*0a6a1f1dSLionel Sambuc#if 5==31
374*0a6a1f1dSLionel Sambuc	and	r3,r3,#0xff
375*0a6a1f1dSLionel Sambuc	cmp	r3,#0xf2			@ done?
376*0a6a1f1dSLionel Sambuc#endif
377*0a6a1f1dSLionel Sambuc#if 5<15
378*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
379*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
380*0a6a1f1dSLionel Sambuc# else
381*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
382*0a6a1f1dSLionel Sambuc# endif
383*0a6a1f1dSLionel Sambuc	eor	r3,r7,r8			@ a^b, b^c in next round
384*0a6a1f1dSLionel Sambuc#else
385*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#7*4]		@ from future BODY_16_xx
386*0a6a1f1dSLionel Sambuc	eor	r3,r7,r8			@ a^b, b^c in next round
387*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#4*4]	@ from future BODY_16_xx
388*0a6a1f1dSLionel Sambuc#endif
389*0a6a1f1dSLionel Sambuc	eor	r0,r0,r7,ror#20	@ Sigma0(a)
390*0a6a1f1dSLionel Sambuc	and	r12,r12,r3			@ (b^c)&=(a^b)
391*0a6a1f1dSLionel Sambuc	add	r10,r10,r6			@ d+=h
392*0a6a1f1dSLionel Sambuc	eor	r12,r12,r8			@ Maj(a,b,c)
393*0a6a1f1dSLionel Sambuc	add	r6,r6,r0,ror#2	@ h+=Sigma0(a)
394*0a6a1f1dSLionel Sambuc	@ add	r6,r6,r12			@ h+=Maj(a,b,c)
395*0a6a1f1dSLionel Sambuc#if __ARM_ARCH__>=7
396*0a6a1f1dSLionel Sambuc	@ ldr	r2,[r1],#4			@ 6
397*0a6a1f1dSLionel Sambuc# if 6==15
398*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
399*0a6a1f1dSLionel Sambuc# endif
400*0a6a1f1dSLionel Sambuc	eor	r0,r10,r10,ror#5
401*0a6a1f1dSLionel Sambuc	add	r6,r6,r12			@ h+=Maj(a,b,c) from the past
402*0a6a1f1dSLionel Sambuc	eor	r0,r0,r10,ror#19	@ Sigma1(e)
403*0a6a1f1dSLionel Sambuc	rev	r2,r2
404*0a6a1f1dSLionel Sambuc#else
405*0a6a1f1dSLionel Sambuc	@ ldrb	r2,[r1,#3]			@ 6
406*0a6a1f1dSLionel Sambuc	add	r6,r6,r12			@ h+=Maj(a,b,c) from the past
407*0a6a1f1dSLionel Sambuc	ldrb	r12,[r1,#2]
408*0a6a1f1dSLionel Sambuc	ldrb	r0,[r1,#1]
409*0a6a1f1dSLionel Sambuc	orr	r2,r2,r12,lsl#8
410*0a6a1f1dSLionel Sambuc	ldrb	r12,[r1],#4
411*0a6a1f1dSLionel Sambuc	orr	r2,r2,r0,lsl#16
412*0a6a1f1dSLionel Sambuc# if 6==15
413*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
414*0a6a1f1dSLionel Sambuc# endif
415*0a6a1f1dSLionel Sambuc	eor	r0,r10,r10,ror#5
416*0a6a1f1dSLionel Sambuc	orr	r2,r2,r12,lsl#24
417*0a6a1f1dSLionel Sambuc	eor	r0,r0,r10,ror#19	@ Sigma1(e)
418*0a6a1f1dSLionel Sambuc#endif
419*0a6a1f1dSLionel Sambuc	ldr	r12,[r14],#4			@ *K256++
420*0a6a1f1dSLionel Sambuc	add	r5,r5,r2			@ h+=X[i]
421*0a6a1f1dSLionel Sambuc	str	r2,[sp,#6*4]
422*0a6a1f1dSLionel Sambuc	eor	r2,r11,r4
423*0a6a1f1dSLionel Sambuc	add	r5,r5,r0,ror#6	@ h+=Sigma1(e)
424*0a6a1f1dSLionel Sambuc	and	r2,r2,r10
425*0a6a1f1dSLionel Sambuc	add	r5,r5,r12			@ h+=K256[i]
426*0a6a1f1dSLionel Sambuc	eor	r2,r2,r4			@ Ch(e,f,g)
427*0a6a1f1dSLionel Sambuc	eor	r0,r6,r6,ror#11
428*0a6a1f1dSLionel Sambuc	add	r5,r5,r2			@ h+=Ch(e,f,g)
429*0a6a1f1dSLionel Sambuc#if 6==31
430*0a6a1f1dSLionel Sambuc	and	r12,r12,#0xff
431*0a6a1f1dSLionel Sambuc	cmp	r12,#0xf2			@ done?
432*0a6a1f1dSLionel Sambuc#endif
433*0a6a1f1dSLionel Sambuc#if 6<15
434*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
435*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
436*0a6a1f1dSLionel Sambuc# else
437*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
438*0a6a1f1dSLionel Sambuc# endif
439*0a6a1f1dSLionel Sambuc	eor	r12,r6,r7			@ a^b, b^c in next round
440*0a6a1f1dSLionel Sambuc#else
441*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#8*4]		@ from future BODY_16_xx
442*0a6a1f1dSLionel Sambuc	eor	r12,r6,r7			@ a^b, b^c in next round
443*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#5*4]	@ from future BODY_16_xx
444*0a6a1f1dSLionel Sambuc#endif
445*0a6a1f1dSLionel Sambuc	eor	r0,r0,r6,ror#20	@ Sigma0(a)
446*0a6a1f1dSLionel Sambuc	and	r3,r3,r12			@ (b^c)&=(a^b)
447*0a6a1f1dSLionel Sambuc	add	r9,r9,r5			@ d+=h
448*0a6a1f1dSLionel Sambuc	eor	r3,r3,r7			@ Maj(a,b,c)
449*0a6a1f1dSLionel Sambuc	add	r5,r5,r0,ror#2	@ h+=Sigma0(a)
450*0a6a1f1dSLionel Sambuc	@ add	r5,r5,r3			@ h+=Maj(a,b,c)
451*0a6a1f1dSLionel Sambuc#if __ARM_ARCH__>=7
452*0a6a1f1dSLionel Sambuc	@ ldr	r2,[r1],#4			@ 7
453*0a6a1f1dSLionel Sambuc# if 7==15
454*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
455*0a6a1f1dSLionel Sambuc# endif
456*0a6a1f1dSLionel Sambuc	eor	r0,r9,r9,ror#5
457*0a6a1f1dSLionel Sambuc	add	r5,r5,r3			@ h+=Maj(a,b,c) from the past
458*0a6a1f1dSLionel Sambuc	eor	r0,r0,r9,ror#19	@ Sigma1(e)
459*0a6a1f1dSLionel Sambuc	rev	r2,r2
460*0a6a1f1dSLionel Sambuc#else
461*0a6a1f1dSLionel Sambuc	@ ldrb	r2,[r1,#3]			@ 7
462*0a6a1f1dSLionel Sambuc	add	r5,r5,r3			@ h+=Maj(a,b,c) from the past
463*0a6a1f1dSLionel Sambuc	ldrb	r3,[r1,#2]
464*0a6a1f1dSLionel Sambuc	ldrb	r0,[r1,#1]
465*0a6a1f1dSLionel Sambuc	orr	r2,r2,r3,lsl#8
466*0a6a1f1dSLionel Sambuc	ldrb	r3,[r1],#4
467*0a6a1f1dSLionel Sambuc	orr	r2,r2,r0,lsl#16
468*0a6a1f1dSLionel Sambuc# if 7==15
469*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
470*0a6a1f1dSLionel Sambuc# endif
471*0a6a1f1dSLionel Sambuc	eor	r0,r9,r9,ror#5
472*0a6a1f1dSLionel Sambuc	orr	r2,r2,r3,lsl#24
473*0a6a1f1dSLionel Sambuc	eor	r0,r0,r9,ror#19	@ Sigma1(e)
474*0a6a1f1dSLionel Sambuc#endif
475*0a6a1f1dSLionel Sambuc	ldr	r3,[r14],#4			@ *K256++
476*0a6a1f1dSLionel Sambuc	add	r4,r4,r2			@ h+=X[i]
477*0a6a1f1dSLionel Sambuc	str	r2,[sp,#7*4]
478*0a6a1f1dSLionel Sambuc	eor	r2,r10,r11
479*0a6a1f1dSLionel Sambuc	add	r4,r4,r0,ror#6	@ h+=Sigma1(e)
480*0a6a1f1dSLionel Sambuc	and	r2,r2,r9
481*0a6a1f1dSLionel Sambuc	add	r4,r4,r3			@ h+=K256[i]
482*0a6a1f1dSLionel Sambuc	eor	r2,r2,r11			@ Ch(e,f,g)
483*0a6a1f1dSLionel Sambuc	eor	r0,r5,r5,ror#11
484*0a6a1f1dSLionel Sambuc	add	r4,r4,r2			@ h+=Ch(e,f,g)
485*0a6a1f1dSLionel Sambuc#if 7==31
486*0a6a1f1dSLionel Sambuc	and	r3,r3,#0xff
487*0a6a1f1dSLionel Sambuc	cmp	r3,#0xf2			@ done?
488*0a6a1f1dSLionel Sambuc#endif
489*0a6a1f1dSLionel Sambuc#if 7<15
490*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
491*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
492*0a6a1f1dSLionel Sambuc# else
493*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
494*0a6a1f1dSLionel Sambuc# endif
495*0a6a1f1dSLionel Sambuc	eor	r3,r5,r6			@ a^b, b^c in next round
496*0a6a1f1dSLionel Sambuc#else
497*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#9*4]		@ from future BODY_16_xx
498*0a6a1f1dSLionel Sambuc	eor	r3,r5,r6			@ a^b, b^c in next round
499*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#6*4]	@ from future BODY_16_xx
500*0a6a1f1dSLionel Sambuc#endif
501*0a6a1f1dSLionel Sambuc	eor	r0,r0,r5,ror#20	@ Sigma0(a)
502*0a6a1f1dSLionel Sambuc	and	r12,r12,r3			@ (b^c)&=(a^b)
503*0a6a1f1dSLionel Sambuc	add	r8,r8,r4			@ d+=h
504*0a6a1f1dSLionel Sambuc	eor	r12,r12,r6			@ Maj(a,b,c)
505*0a6a1f1dSLionel Sambuc	add	r4,r4,r0,ror#2	@ h+=Sigma0(a)
506*0a6a1f1dSLionel Sambuc	@ add	r4,r4,r12			@ h+=Maj(a,b,c)
507*0a6a1f1dSLionel Sambuc#if __ARM_ARCH__>=7
508*0a6a1f1dSLionel Sambuc	@ ldr	r2,[r1],#4			@ 8
509*0a6a1f1dSLionel Sambuc# if 8==15
510*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
511*0a6a1f1dSLionel Sambuc# endif
512*0a6a1f1dSLionel Sambuc	eor	r0,r8,r8,ror#5
513*0a6a1f1dSLionel Sambuc	add	r4,r4,r12			@ h+=Maj(a,b,c) from the past
514*0a6a1f1dSLionel Sambuc	eor	r0,r0,r8,ror#19	@ Sigma1(e)
515*0a6a1f1dSLionel Sambuc	rev	r2,r2
516*0a6a1f1dSLionel Sambuc#else
517*0a6a1f1dSLionel Sambuc	@ ldrb	r2,[r1,#3]			@ 8
518*0a6a1f1dSLionel Sambuc	add	r4,r4,r12			@ h+=Maj(a,b,c) from the past
519*0a6a1f1dSLionel Sambuc	ldrb	r12,[r1,#2]
520*0a6a1f1dSLionel Sambuc	ldrb	r0,[r1,#1]
521*0a6a1f1dSLionel Sambuc	orr	r2,r2,r12,lsl#8
522*0a6a1f1dSLionel Sambuc	ldrb	r12,[r1],#4
523*0a6a1f1dSLionel Sambuc	orr	r2,r2,r0,lsl#16
524*0a6a1f1dSLionel Sambuc# if 8==15
525*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
526*0a6a1f1dSLionel Sambuc# endif
527*0a6a1f1dSLionel Sambuc	eor	r0,r8,r8,ror#5
528*0a6a1f1dSLionel Sambuc	orr	r2,r2,r12,lsl#24
529*0a6a1f1dSLionel Sambuc	eor	r0,r0,r8,ror#19	@ Sigma1(e)
530*0a6a1f1dSLionel Sambuc#endif
531*0a6a1f1dSLionel Sambuc	ldr	r12,[r14],#4			@ *K256++
532*0a6a1f1dSLionel Sambuc	add	r11,r11,r2			@ h+=X[i]
533*0a6a1f1dSLionel Sambuc	str	r2,[sp,#8*4]
534*0a6a1f1dSLionel Sambuc	eor	r2,r9,r10
535*0a6a1f1dSLionel Sambuc	add	r11,r11,r0,ror#6	@ h+=Sigma1(e)
536*0a6a1f1dSLionel Sambuc	and	r2,r2,r8
537*0a6a1f1dSLionel Sambuc	add	r11,r11,r12			@ h+=K256[i]
538*0a6a1f1dSLionel Sambuc	eor	r2,r2,r10			@ Ch(e,f,g)
539*0a6a1f1dSLionel Sambuc	eor	r0,r4,r4,ror#11
540*0a6a1f1dSLionel Sambuc	add	r11,r11,r2			@ h+=Ch(e,f,g)
541*0a6a1f1dSLionel Sambuc#if 8==31
542*0a6a1f1dSLionel Sambuc	and	r12,r12,#0xff
543*0a6a1f1dSLionel Sambuc	cmp	r12,#0xf2			@ done?
544*0a6a1f1dSLionel Sambuc#endif
545*0a6a1f1dSLionel Sambuc#if 8<15
546*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
547*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
548*0a6a1f1dSLionel Sambuc# else
549*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
550*0a6a1f1dSLionel Sambuc# endif
551*0a6a1f1dSLionel Sambuc	eor	r12,r4,r5			@ a^b, b^c in next round
552*0a6a1f1dSLionel Sambuc#else
553*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#10*4]		@ from future BODY_16_xx
554*0a6a1f1dSLionel Sambuc	eor	r12,r4,r5			@ a^b, b^c in next round
555*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#7*4]	@ from future BODY_16_xx
556*0a6a1f1dSLionel Sambuc#endif
557*0a6a1f1dSLionel Sambuc	eor	r0,r0,r4,ror#20	@ Sigma0(a)
558*0a6a1f1dSLionel Sambuc	and	r3,r3,r12			@ (b^c)&=(a^b)
559*0a6a1f1dSLionel Sambuc	add	r7,r7,r11			@ d+=h
560*0a6a1f1dSLionel Sambuc	eor	r3,r3,r5			@ Maj(a,b,c)
561*0a6a1f1dSLionel Sambuc	add	r11,r11,r0,ror#2	@ h+=Sigma0(a)
562*0a6a1f1dSLionel Sambuc	@ add	r11,r11,r3			@ h+=Maj(a,b,c)
563*0a6a1f1dSLionel Sambuc#if __ARM_ARCH__>=7
564*0a6a1f1dSLionel Sambuc	@ ldr	r2,[r1],#4			@ 9
565*0a6a1f1dSLionel Sambuc# if 9==15
566*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
567*0a6a1f1dSLionel Sambuc# endif
568*0a6a1f1dSLionel Sambuc	eor	r0,r7,r7,ror#5
569*0a6a1f1dSLionel Sambuc	add	r11,r11,r3			@ h+=Maj(a,b,c) from the past
570*0a6a1f1dSLionel Sambuc	eor	r0,r0,r7,ror#19	@ Sigma1(e)
571*0a6a1f1dSLionel Sambuc	rev	r2,r2
572*0a6a1f1dSLionel Sambuc#else
573*0a6a1f1dSLionel Sambuc	@ ldrb	r2,[r1,#3]			@ 9
574*0a6a1f1dSLionel Sambuc	add	r11,r11,r3			@ h+=Maj(a,b,c) from the past
575*0a6a1f1dSLionel Sambuc	ldrb	r3,[r1,#2]
576*0a6a1f1dSLionel Sambuc	ldrb	r0,[r1,#1]
577*0a6a1f1dSLionel Sambuc	orr	r2,r2,r3,lsl#8
578*0a6a1f1dSLionel Sambuc	ldrb	r3,[r1],#4
579*0a6a1f1dSLionel Sambuc	orr	r2,r2,r0,lsl#16
580*0a6a1f1dSLionel Sambuc# if 9==15
581*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
582*0a6a1f1dSLionel Sambuc# endif
583*0a6a1f1dSLionel Sambuc	eor	r0,r7,r7,ror#5
584*0a6a1f1dSLionel Sambuc	orr	r2,r2,r3,lsl#24
585*0a6a1f1dSLionel Sambuc	eor	r0,r0,r7,ror#19	@ Sigma1(e)
586*0a6a1f1dSLionel Sambuc#endif
587*0a6a1f1dSLionel Sambuc	ldr	r3,[r14],#4			@ *K256++
588*0a6a1f1dSLionel Sambuc	add	r10,r10,r2			@ h+=X[i]
589*0a6a1f1dSLionel Sambuc	str	r2,[sp,#9*4]
590*0a6a1f1dSLionel Sambuc	eor	r2,r8,r9
591*0a6a1f1dSLionel Sambuc	add	r10,r10,r0,ror#6	@ h+=Sigma1(e)
592*0a6a1f1dSLionel Sambuc	and	r2,r2,r7
593*0a6a1f1dSLionel Sambuc	add	r10,r10,r3			@ h+=K256[i]
594*0a6a1f1dSLionel Sambuc	eor	r2,r2,r9			@ Ch(e,f,g)
595*0a6a1f1dSLionel Sambuc	eor	r0,r11,r11,ror#11
596*0a6a1f1dSLionel Sambuc	add	r10,r10,r2			@ h+=Ch(e,f,g)
597*0a6a1f1dSLionel Sambuc#if 9==31
598*0a6a1f1dSLionel Sambuc	and	r3,r3,#0xff
599*0a6a1f1dSLionel Sambuc	cmp	r3,#0xf2			@ done?
600*0a6a1f1dSLionel Sambuc#endif
601*0a6a1f1dSLionel Sambuc#if 9<15
602*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
603*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
604*0a6a1f1dSLionel Sambuc# else
605*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
606*0a6a1f1dSLionel Sambuc# endif
607*0a6a1f1dSLionel Sambuc	eor	r3,r11,r4			@ a^b, b^c in next round
608*0a6a1f1dSLionel Sambuc#else
609*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#11*4]		@ from future BODY_16_xx
610*0a6a1f1dSLionel Sambuc	eor	r3,r11,r4			@ a^b, b^c in next round
611*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#8*4]	@ from future BODY_16_xx
612*0a6a1f1dSLionel Sambuc#endif
613*0a6a1f1dSLionel Sambuc	eor	r0,r0,r11,ror#20	@ Sigma0(a)
614*0a6a1f1dSLionel Sambuc	and	r12,r12,r3			@ (b^c)&=(a^b)
615*0a6a1f1dSLionel Sambuc	add	r6,r6,r10			@ d+=h
616*0a6a1f1dSLionel Sambuc	eor	r12,r12,r4			@ Maj(a,b,c)
617*0a6a1f1dSLionel Sambuc	add	r10,r10,r0,ror#2	@ h+=Sigma0(a)
618*0a6a1f1dSLionel Sambuc	@ add	r10,r10,r12			@ h+=Maj(a,b,c)
619*0a6a1f1dSLionel Sambuc#if __ARM_ARCH__>=7
620*0a6a1f1dSLionel Sambuc	@ ldr	r2,[r1],#4			@ 10
621*0a6a1f1dSLionel Sambuc# if 10==15
622*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
623*0a6a1f1dSLionel Sambuc# endif
624*0a6a1f1dSLionel Sambuc	eor	r0,r6,r6,ror#5
625*0a6a1f1dSLionel Sambuc	add	r10,r10,r12			@ h+=Maj(a,b,c) from the past
626*0a6a1f1dSLionel Sambuc	eor	r0,r0,r6,ror#19	@ Sigma1(e)
627*0a6a1f1dSLionel Sambuc	rev	r2,r2
628*0a6a1f1dSLionel Sambuc#else
629*0a6a1f1dSLionel Sambuc	@ ldrb	r2,[r1,#3]			@ 10
630*0a6a1f1dSLionel Sambuc	add	r10,r10,r12			@ h+=Maj(a,b,c) from the past
631*0a6a1f1dSLionel Sambuc	ldrb	r12,[r1,#2]
632*0a6a1f1dSLionel Sambuc	ldrb	r0,[r1,#1]
633*0a6a1f1dSLionel Sambuc	orr	r2,r2,r12,lsl#8
634*0a6a1f1dSLionel Sambuc	ldrb	r12,[r1],#4
635*0a6a1f1dSLionel Sambuc	orr	r2,r2,r0,lsl#16
636*0a6a1f1dSLionel Sambuc# if 10==15
637*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
638*0a6a1f1dSLionel Sambuc# endif
639*0a6a1f1dSLionel Sambuc	eor	r0,r6,r6,ror#5
640*0a6a1f1dSLionel Sambuc	orr	r2,r2,r12,lsl#24
641*0a6a1f1dSLionel Sambuc	eor	r0,r0,r6,ror#19	@ Sigma1(e)
642*0a6a1f1dSLionel Sambuc#endif
643*0a6a1f1dSLionel Sambuc	ldr	r12,[r14],#4			@ *K256++
644*0a6a1f1dSLionel Sambuc	add	r9,r9,r2			@ h+=X[i]
645*0a6a1f1dSLionel Sambuc	str	r2,[sp,#10*4]
646*0a6a1f1dSLionel Sambuc	eor	r2,r7,r8
647*0a6a1f1dSLionel Sambuc	add	r9,r9,r0,ror#6	@ h+=Sigma1(e)
648*0a6a1f1dSLionel Sambuc	and	r2,r2,r6
649*0a6a1f1dSLionel Sambuc	add	r9,r9,r12			@ h+=K256[i]
650*0a6a1f1dSLionel Sambuc	eor	r2,r2,r8			@ Ch(e,f,g)
651*0a6a1f1dSLionel Sambuc	eor	r0,r10,r10,ror#11
652*0a6a1f1dSLionel Sambuc	add	r9,r9,r2			@ h+=Ch(e,f,g)
653*0a6a1f1dSLionel Sambuc#if 10==31
654*0a6a1f1dSLionel Sambuc	and	r12,r12,#0xff
655*0a6a1f1dSLionel Sambuc	cmp	r12,#0xf2			@ done?
656*0a6a1f1dSLionel Sambuc#endif
657*0a6a1f1dSLionel Sambuc#if 10<15
658*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
659*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
660*0a6a1f1dSLionel Sambuc# else
661*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
662*0a6a1f1dSLionel Sambuc# endif
663*0a6a1f1dSLionel Sambuc	eor	r12,r10,r11			@ a^b, b^c in next round
664*0a6a1f1dSLionel Sambuc#else
665*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#12*4]		@ from future BODY_16_xx
666*0a6a1f1dSLionel Sambuc	eor	r12,r10,r11			@ a^b, b^c in next round
667*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#9*4]	@ from future BODY_16_xx
668*0a6a1f1dSLionel Sambuc#endif
669*0a6a1f1dSLionel Sambuc	eor	r0,r0,r10,ror#20	@ Sigma0(a)
670*0a6a1f1dSLionel Sambuc	and	r3,r3,r12			@ (b^c)&=(a^b)
671*0a6a1f1dSLionel Sambuc	add	r5,r5,r9			@ d+=h
672*0a6a1f1dSLionel Sambuc	eor	r3,r3,r11			@ Maj(a,b,c)
673*0a6a1f1dSLionel Sambuc	add	r9,r9,r0,ror#2	@ h+=Sigma0(a)
674*0a6a1f1dSLionel Sambuc	@ add	r9,r9,r3			@ h+=Maj(a,b,c)
675*0a6a1f1dSLionel Sambuc#if __ARM_ARCH__>=7
676*0a6a1f1dSLionel Sambuc	@ ldr	r2,[r1],#4			@ 11
677*0a6a1f1dSLionel Sambuc# if 11==15
678*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
679*0a6a1f1dSLionel Sambuc# endif
680*0a6a1f1dSLionel Sambuc	eor	r0,r5,r5,ror#5
681*0a6a1f1dSLionel Sambuc	add	r9,r9,r3			@ h+=Maj(a,b,c) from the past
682*0a6a1f1dSLionel Sambuc	eor	r0,r0,r5,ror#19	@ Sigma1(e)
683*0a6a1f1dSLionel Sambuc	rev	r2,r2
684*0a6a1f1dSLionel Sambuc#else
685*0a6a1f1dSLionel Sambuc	@ ldrb	r2,[r1,#3]			@ 11
686*0a6a1f1dSLionel Sambuc	add	r9,r9,r3			@ h+=Maj(a,b,c) from the past
687*0a6a1f1dSLionel Sambuc	ldrb	r3,[r1,#2]
688*0a6a1f1dSLionel Sambuc	ldrb	r0,[r1,#1]
689*0a6a1f1dSLionel Sambuc	orr	r2,r2,r3,lsl#8
690*0a6a1f1dSLionel Sambuc	ldrb	r3,[r1],#4
691*0a6a1f1dSLionel Sambuc	orr	r2,r2,r0,lsl#16
692*0a6a1f1dSLionel Sambuc# if 11==15
693*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
694*0a6a1f1dSLionel Sambuc# endif
695*0a6a1f1dSLionel Sambuc	eor	r0,r5,r5,ror#5
696*0a6a1f1dSLionel Sambuc	orr	r2,r2,r3,lsl#24
697*0a6a1f1dSLionel Sambuc	eor	r0,r0,r5,ror#19	@ Sigma1(e)
698*0a6a1f1dSLionel Sambuc#endif
699*0a6a1f1dSLionel Sambuc	ldr	r3,[r14],#4			@ *K256++
700*0a6a1f1dSLionel Sambuc	add	r8,r8,r2			@ h+=X[i]
701*0a6a1f1dSLionel Sambuc	str	r2,[sp,#11*4]
702*0a6a1f1dSLionel Sambuc	eor	r2,r6,r7
703*0a6a1f1dSLionel Sambuc	add	r8,r8,r0,ror#6	@ h+=Sigma1(e)
704*0a6a1f1dSLionel Sambuc	and	r2,r2,r5
705*0a6a1f1dSLionel Sambuc	add	r8,r8,r3			@ h+=K256[i]
706*0a6a1f1dSLionel Sambuc	eor	r2,r2,r7			@ Ch(e,f,g)
707*0a6a1f1dSLionel Sambuc	eor	r0,r9,r9,ror#11
708*0a6a1f1dSLionel Sambuc	add	r8,r8,r2			@ h+=Ch(e,f,g)
709*0a6a1f1dSLionel Sambuc#if 11==31
710*0a6a1f1dSLionel Sambuc	and	r3,r3,#0xff
711*0a6a1f1dSLionel Sambuc	cmp	r3,#0xf2			@ done?
712*0a6a1f1dSLionel Sambuc#endif
713*0a6a1f1dSLionel Sambuc#if 11<15
714*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
715*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
716*0a6a1f1dSLionel Sambuc# else
717*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
718*0a6a1f1dSLionel Sambuc# endif
719*0a6a1f1dSLionel Sambuc	eor	r3,r9,r10			@ a^b, b^c in next round
720*0a6a1f1dSLionel Sambuc#else
721*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#13*4]		@ from future BODY_16_xx
722*0a6a1f1dSLionel Sambuc	eor	r3,r9,r10			@ a^b, b^c in next round
723*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#10*4]	@ from future BODY_16_xx
724*0a6a1f1dSLionel Sambuc#endif
725*0a6a1f1dSLionel Sambuc	eor	r0,r0,r9,ror#20	@ Sigma0(a)
726*0a6a1f1dSLionel Sambuc	and	r12,r12,r3			@ (b^c)&=(a^b)
727*0a6a1f1dSLionel Sambuc	add	r4,r4,r8			@ d+=h
728*0a6a1f1dSLionel Sambuc	eor	r12,r12,r10			@ Maj(a,b,c)
729*0a6a1f1dSLionel Sambuc	add	r8,r8,r0,ror#2	@ h+=Sigma0(a)
730*0a6a1f1dSLionel Sambuc	@ add	r8,r8,r12			@ h+=Maj(a,b,c)
731*0a6a1f1dSLionel Sambuc#if __ARM_ARCH__>=7
732*0a6a1f1dSLionel Sambuc	@ ldr	r2,[r1],#4			@ 12
733*0a6a1f1dSLionel Sambuc# if 12==15
734*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
735*0a6a1f1dSLionel Sambuc# endif
736*0a6a1f1dSLionel Sambuc	eor	r0,r4,r4,ror#5
737*0a6a1f1dSLionel Sambuc	add	r8,r8,r12			@ h+=Maj(a,b,c) from the past
738*0a6a1f1dSLionel Sambuc	eor	r0,r0,r4,ror#19	@ Sigma1(e)
739*0a6a1f1dSLionel Sambuc	rev	r2,r2
740*0a6a1f1dSLionel Sambuc#else
741*0a6a1f1dSLionel Sambuc	@ ldrb	r2,[r1,#3]			@ 12
742*0a6a1f1dSLionel Sambuc	add	r8,r8,r12			@ h+=Maj(a,b,c) from the past
743*0a6a1f1dSLionel Sambuc	ldrb	r12,[r1,#2]
744*0a6a1f1dSLionel Sambuc	ldrb	r0,[r1,#1]
745*0a6a1f1dSLionel Sambuc	orr	r2,r2,r12,lsl#8
746*0a6a1f1dSLionel Sambuc	ldrb	r12,[r1],#4
747*0a6a1f1dSLionel Sambuc	orr	r2,r2,r0,lsl#16
748*0a6a1f1dSLionel Sambuc# if 12==15
749*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
750*0a6a1f1dSLionel Sambuc# endif
751*0a6a1f1dSLionel Sambuc	eor	r0,r4,r4,ror#5
752*0a6a1f1dSLionel Sambuc	orr	r2,r2,r12,lsl#24
753*0a6a1f1dSLionel Sambuc	eor	r0,r0,r4,ror#19	@ Sigma1(e)
754*0a6a1f1dSLionel Sambuc#endif
755*0a6a1f1dSLionel Sambuc	ldr	r12,[r14],#4			@ *K256++
756*0a6a1f1dSLionel Sambuc	add	r7,r7,r2			@ h+=X[i]
757*0a6a1f1dSLionel Sambuc	str	r2,[sp,#12*4]
758*0a6a1f1dSLionel Sambuc	eor	r2,r5,r6
759*0a6a1f1dSLionel Sambuc	add	r7,r7,r0,ror#6	@ h+=Sigma1(e)
760*0a6a1f1dSLionel Sambuc	and	r2,r2,r4
761*0a6a1f1dSLionel Sambuc	add	r7,r7,r12			@ h+=K256[i]
762*0a6a1f1dSLionel Sambuc	eor	r2,r2,r6			@ Ch(e,f,g)
763*0a6a1f1dSLionel Sambuc	eor	r0,r8,r8,ror#11
764*0a6a1f1dSLionel Sambuc	add	r7,r7,r2			@ h+=Ch(e,f,g)
765*0a6a1f1dSLionel Sambuc#if 12==31
766*0a6a1f1dSLionel Sambuc	and	r12,r12,#0xff
767*0a6a1f1dSLionel Sambuc	cmp	r12,#0xf2			@ done?
768*0a6a1f1dSLionel Sambuc#endif
769*0a6a1f1dSLionel Sambuc#if 12<15
770*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
771*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
772*0a6a1f1dSLionel Sambuc# else
773*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
774*0a6a1f1dSLionel Sambuc# endif
775*0a6a1f1dSLionel Sambuc	eor	r12,r8,r9			@ a^b, b^c in next round
776*0a6a1f1dSLionel Sambuc#else
777*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#14*4]		@ from future BODY_16_xx
778*0a6a1f1dSLionel Sambuc	eor	r12,r8,r9			@ a^b, b^c in next round
779*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#11*4]	@ from future BODY_16_xx
780*0a6a1f1dSLionel Sambuc#endif
781*0a6a1f1dSLionel Sambuc	eor	r0,r0,r8,ror#20	@ Sigma0(a)
782*0a6a1f1dSLionel Sambuc	and	r3,r3,r12			@ (b^c)&=(a^b)
783*0a6a1f1dSLionel Sambuc	add	r11,r11,r7			@ d+=h
784*0a6a1f1dSLionel Sambuc	eor	r3,r3,r9			@ Maj(a,b,c)
785*0a6a1f1dSLionel Sambuc	add	r7,r7,r0,ror#2	@ h+=Sigma0(a)
786*0a6a1f1dSLionel Sambuc	@ add	r7,r7,r3			@ h+=Maj(a,b,c)
787*0a6a1f1dSLionel Sambuc#if __ARM_ARCH__>=7
788*0a6a1f1dSLionel Sambuc	@ ldr	r2,[r1],#4			@ 13
789*0a6a1f1dSLionel Sambuc# if 13==15
790*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
791*0a6a1f1dSLionel Sambuc# endif
792*0a6a1f1dSLionel Sambuc	eor	r0,r11,r11,ror#5
793*0a6a1f1dSLionel Sambuc	add	r7,r7,r3			@ h+=Maj(a,b,c) from the past
794*0a6a1f1dSLionel Sambuc	eor	r0,r0,r11,ror#19	@ Sigma1(e)
795*0a6a1f1dSLionel Sambuc	rev	r2,r2
796*0a6a1f1dSLionel Sambuc#else
797*0a6a1f1dSLionel Sambuc	@ ldrb	r2,[r1,#3]			@ 13
798*0a6a1f1dSLionel Sambuc	add	r7,r7,r3			@ h+=Maj(a,b,c) from the past
799*0a6a1f1dSLionel Sambuc	ldrb	r3,[r1,#2]
800*0a6a1f1dSLionel Sambuc	ldrb	r0,[r1,#1]
801*0a6a1f1dSLionel Sambuc	orr	r2,r2,r3,lsl#8
802*0a6a1f1dSLionel Sambuc	ldrb	r3,[r1],#4
803*0a6a1f1dSLionel Sambuc	orr	r2,r2,r0,lsl#16
804*0a6a1f1dSLionel Sambuc# if 13==15
805*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
806*0a6a1f1dSLionel Sambuc# endif
807*0a6a1f1dSLionel Sambuc	eor	r0,r11,r11,ror#5
808*0a6a1f1dSLionel Sambuc	orr	r2,r2,r3,lsl#24
809*0a6a1f1dSLionel Sambuc	eor	r0,r0,r11,ror#19	@ Sigma1(e)
810*0a6a1f1dSLionel Sambuc#endif
811*0a6a1f1dSLionel Sambuc	ldr	r3,[r14],#4			@ *K256++
812*0a6a1f1dSLionel Sambuc	add	r6,r6,r2			@ h+=X[i]
813*0a6a1f1dSLionel Sambuc	str	r2,[sp,#13*4]
814*0a6a1f1dSLionel Sambuc	eor	r2,r4,r5
815*0a6a1f1dSLionel Sambuc	add	r6,r6,r0,ror#6	@ h+=Sigma1(e)
816*0a6a1f1dSLionel Sambuc	and	r2,r2,r11
817*0a6a1f1dSLionel Sambuc	add	r6,r6,r3			@ h+=K256[i]
818*0a6a1f1dSLionel Sambuc	eor	r2,r2,r5			@ Ch(e,f,g)
819*0a6a1f1dSLionel Sambuc	eor	r0,r7,r7,ror#11
820*0a6a1f1dSLionel Sambuc	add	r6,r6,r2			@ h+=Ch(e,f,g)
821*0a6a1f1dSLionel Sambuc#if 13==31
822*0a6a1f1dSLionel Sambuc	and	r3,r3,#0xff
823*0a6a1f1dSLionel Sambuc	cmp	r3,#0xf2			@ done?
824*0a6a1f1dSLionel Sambuc#endif
825*0a6a1f1dSLionel Sambuc#if 13<15
826*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
827*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
828*0a6a1f1dSLionel Sambuc# else
829*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
830*0a6a1f1dSLionel Sambuc# endif
831*0a6a1f1dSLionel Sambuc	eor	r3,r7,r8			@ a^b, b^c in next round
832*0a6a1f1dSLionel Sambuc#else
833*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#15*4]		@ from future BODY_16_xx
834*0a6a1f1dSLionel Sambuc	eor	r3,r7,r8			@ a^b, b^c in next round
835*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#12*4]	@ from future BODY_16_xx
836*0a6a1f1dSLionel Sambuc#endif
837*0a6a1f1dSLionel Sambuc	eor	r0,r0,r7,ror#20	@ Sigma0(a)
838*0a6a1f1dSLionel Sambuc	and	r12,r12,r3			@ (b^c)&=(a^b)
839*0a6a1f1dSLionel Sambuc	add	r10,r10,r6			@ d+=h
840*0a6a1f1dSLionel Sambuc	eor	r12,r12,r8			@ Maj(a,b,c)
841*0a6a1f1dSLionel Sambuc	add	r6,r6,r0,ror#2	@ h+=Sigma0(a)
842*0a6a1f1dSLionel Sambuc	@ add	r6,r6,r12			@ h+=Maj(a,b,c)
843*0a6a1f1dSLionel Sambuc#if __ARM_ARCH__>=7
844*0a6a1f1dSLionel Sambuc	@ ldr	r2,[r1],#4			@ 14
845*0a6a1f1dSLionel Sambuc# if 14==15
846*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
847*0a6a1f1dSLionel Sambuc# endif
848*0a6a1f1dSLionel Sambuc	eor	r0,r10,r10,ror#5
849*0a6a1f1dSLionel Sambuc	add	r6,r6,r12			@ h+=Maj(a,b,c) from the past
850*0a6a1f1dSLionel Sambuc	eor	r0,r0,r10,ror#19	@ Sigma1(e)
851*0a6a1f1dSLionel Sambuc	rev	r2,r2
852*0a6a1f1dSLionel Sambuc#else
853*0a6a1f1dSLionel Sambuc	@ ldrb	r2,[r1,#3]			@ 14
854*0a6a1f1dSLionel Sambuc	add	r6,r6,r12			@ h+=Maj(a,b,c) from the past
855*0a6a1f1dSLionel Sambuc	ldrb	r12,[r1,#2]
856*0a6a1f1dSLionel Sambuc	ldrb	r0,[r1,#1]
857*0a6a1f1dSLionel Sambuc	orr	r2,r2,r12,lsl#8
858*0a6a1f1dSLionel Sambuc	ldrb	r12,[r1],#4
859*0a6a1f1dSLionel Sambuc	orr	r2,r2,r0,lsl#16
860*0a6a1f1dSLionel Sambuc# if 14==15
861*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
862*0a6a1f1dSLionel Sambuc# endif
863*0a6a1f1dSLionel Sambuc	eor	r0,r10,r10,ror#5
864*0a6a1f1dSLionel Sambuc	orr	r2,r2,r12,lsl#24
865*0a6a1f1dSLionel Sambuc	eor	r0,r0,r10,ror#19	@ Sigma1(e)
866*0a6a1f1dSLionel Sambuc#endif
867*0a6a1f1dSLionel Sambuc	ldr	r12,[r14],#4			@ *K256++
868*0a6a1f1dSLionel Sambuc	add	r5,r5,r2			@ h+=X[i]
869*0a6a1f1dSLionel Sambuc	str	r2,[sp,#14*4]
870*0a6a1f1dSLionel Sambuc	eor	r2,r11,r4
871*0a6a1f1dSLionel Sambuc	add	r5,r5,r0,ror#6	@ h+=Sigma1(e)
872*0a6a1f1dSLionel Sambuc	and	r2,r2,r10
873*0a6a1f1dSLionel Sambuc	add	r5,r5,r12			@ h+=K256[i]
874*0a6a1f1dSLionel Sambuc	eor	r2,r2,r4			@ Ch(e,f,g)
875*0a6a1f1dSLionel Sambuc	eor	r0,r6,r6,ror#11
876*0a6a1f1dSLionel Sambuc	add	r5,r5,r2			@ h+=Ch(e,f,g)
877*0a6a1f1dSLionel Sambuc#if 14==31
878*0a6a1f1dSLionel Sambuc	and	r12,r12,#0xff
879*0a6a1f1dSLionel Sambuc	cmp	r12,#0xf2			@ done?
880*0a6a1f1dSLionel Sambuc#endif
881*0a6a1f1dSLionel Sambuc#if 14<15
882*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
883*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
884*0a6a1f1dSLionel Sambuc# else
885*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
886*0a6a1f1dSLionel Sambuc# endif
887*0a6a1f1dSLionel Sambuc	eor	r12,r6,r7			@ a^b, b^c in next round
888*0a6a1f1dSLionel Sambuc#else
889*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#0*4]		@ from future BODY_16_xx
890*0a6a1f1dSLionel Sambuc	eor	r12,r6,r7			@ a^b, b^c in next round
891*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#13*4]	@ from future BODY_16_xx
892*0a6a1f1dSLionel Sambuc#endif
893*0a6a1f1dSLionel Sambuc	eor	r0,r0,r6,ror#20	@ Sigma0(a)
894*0a6a1f1dSLionel Sambuc	and	r3,r3,r12			@ (b^c)&=(a^b)
895*0a6a1f1dSLionel Sambuc	add	r9,r9,r5			@ d+=h
896*0a6a1f1dSLionel Sambuc	eor	r3,r3,r7			@ Maj(a,b,c)
897*0a6a1f1dSLionel Sambuc	add	r5,r5,r0,ror#2	@ h+=Sigma0(a)
898*0a6a1f1dSLionel Sambuc	@ add	r5,r5,r3			@ h+=Maj(a,b,c)
899*0a6a1f1dSLionel Sambuc#if __ARM_ARCH__>=7
900*0a6a1f1dSLionel Sambuc	@ ldr	r2,[r1],#4			@ 15
901*0a6a1f1dSLionel Sambuc# if 15==15
902*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
903*0a6a1f1dSLionel Sambuc# endif
904*0a6a1f1dSLionel Sambuc	eor	r0,r9,r9,ror#5
905*0a6a1f1dSLionel Sambuc	add	r5,r5,r3			@ h+=Maj(a,b,c) from the past
906*0a6a1f1dSLionel Sambuc	eor	r0,r0,r9,ror#19	@ Sigma1(e)
907*0a6a1f1dSLionel Sambuc	rev	r2,r2
908*0a6a1f1dSLionel Sambuc#else
909*0a6a1f1dSLionel Sambuc	@ ldrb	r2,[r1,#3]			@ 15
910*0a6a1f1dSLionel Sambuc	add	r5,r5,r3			@ h+=Maj(a,b,c) from the past
911*0a6a1f1dSLionel Sambuc	ldrb	r3,[r1,#2]
912*0a6a1f1dSLionel Sambuc	ldrb	r0,[r1,#1]
913*0a6a1f1dSLionel Sambuc	orr	r2,r2,r3,lsl#8
914*0a6a1f1dSLionel Sambuc	ldrb	r3,[r1],#4
915*0a6a1f1dSLionel Sambuc	orr	r2,r2,r0,lsl#16
916*0a6a1f1dSLionel Sambuc# if 15==15
917*0a6a1f1dSLionel Sambuc	str	r1,[sp,#17*4]			@ make room for r1
918*0a6a1f1dSLionel Sambuc# endif
919*0a6a1f1dSLionel Sambuc	eor	r0,r9,r9,ror#5
920*0a6a1f1dSLionel Sambuc	orr	r2,r2,r3,lsl#24
921*0a6a1f1dSLionel Sambuc	eor	r0,r0,r9,ror#19	@ Sigma1(e)
922*0a6a1f1dSLionel Sambuc#endif
923*0a6a1f1dSLionel Sambuc	ldr	r3,[r14],#4			@ *K256++
924*0a6a1f1dSLionel Sambuc	add	r4,r4,r2			@ h+=X[i]
925*0a6a1f1dSLionel Sambuc	str	r2,[sp,#15*4]
926*0a6a1f1dSLionel Sambuc	eor	r2,r10,r11
927*0a6a1f1dSLionel Sambuc	add	r4,r4,r0,ror#6	@ h+=Sigma1(e)
928*0a6a1f1dSLionel Sambuc	and	r2,r2,r9
929*0a6a1f1dSLionel Sambuc	add	r4,r4,r3			@ h+=K256[i]
930*0a6a1f1dSLionel Sambuc	eor	r2,r2,r11			@ Ch(e,f,g)
931*0a6a1f1dSLionel Sambuc	eor	r0,r5,r5,ror#11
932*0a6a1f1dSLionel Sambuc	add	r4,r4,r2			@ h+=Ch(e,f,g)
933*0a6a1f1dSLionel Sambuc#if 15==31
934*0a6a1f1dSLionel Sambuc	and	r3,r3,#0xff
935*0a6a1f1dSLionel Sambuc	cmp	r3,#0xf2			@ done?
936*0a6a1f1dSLionel Sambuc#endif
937*0a6a1f1dSLionel Sambuc#if 15<15
938*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
939*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
940*0a6a1f1dSLionel Sambuc# else
941*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
942*0a6a1f1dSLionel Sambuc# endif
943*0a6a1f1dSLionel Sambuc	eor	r3,r5,r6			@ a^b, b^c in next round
944*0a6a1f1dSLionel Sambuc#else
945*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#1*4]		@ from future BODY_16_xx
946*0a6a1f1dSLionel Sambuc	eor	r3,r5,r6			@ a^b, b^c in next round
947*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#14*4]	@ from future BODY_16_xx
948*0a6a1f1dSLionel Sambuc#endif
949*0a6a1f1dSLionel Sambuc	eor	r0,r0,r5,ror#20	@ Sigma0(a)
950*0a6a1f1dSLionel Sambuc	and	r12,r12,r3			@ (b^c)&=(a^b)
951*0a6a1f1dSLionel Sambuc	add	r8,r8,r4			@ d+=h
952*0a6a1f1dSLionel Sambuc	eor	r12,r12,r6			@ Maj(a,b,c)
953*0a6a1f1dSLionel Sambuc	add	r4,r4,r0,ror#2	@ h+=Sigma0(a)
954*0a6a1f1dSLionel Sambuc	@ add	r4,r4,r12			@ h+=Maj(a,b,c)
955*0a6a1f1dSLionel Sambuc.Lrounds_16_xx:
956*0a6a1f1dSLionel Sambuc	@ ldr	r2,[sp,#1*4]		@ 16
957*0a6a1f1dSLionel Sambuc	@ ldr	r1,[sp,#14*4]
958*0a6a1f1dSLionel Sambuc	mov	r0,r2,ror#7
959*0a6a1f1dSLionel Sambuc	add	r4,r4,r12			@ h+=Maj(a,b,c) from the past
960*0a6a1f1dSLionel Sambuc	mov	r12,r1,ror#17
961*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,ror#18
962*0a6a1f1dSLionel Sambuc	eor	r12,r12,r1,ror#19
963*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
964*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#0*4]
965*0a6a1f1dSLionel Sambuc	eor	r12,r12,r1,lsr#10	@ sigma1(X[i+14])
966*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#9*4]
967*0a6a1f1dSLionel Sambuc
968*0a6a1f1dSLionel Sambuc	add	r12,r12,r0
969*0a6a1f1dSLionel Sambuc	eor	r0,r8,r8,ror#5	@ from BODY_00_15
970*0a6a1f1dSLionel Sambuc	add	r2,r2,r12
971*0a6a1f1dSLionel Sambuc	eor	r0,r0,r8,ror#19	@ Sigma1(e)
972*0a6a1f1dSLionel Sambuc	add	r2,r2,r1			@ X[i]
973*0a6a1f1dSLionel Sambuc	ldr	r12,[r14],#4			@ *K256++
974*0a6a1f1dSLionel Sambuc	add	r11,r11,r2			@ h+=X[i]
975*0a6a1f1dSLionel Sambuc	str	r2,[sp,#0*4]
976*0a6a1f1dSLionel Sambuc	eor	r2,r9,r10
977*0a6a1f1dSLionel Sambuc	add	r11,r11,r0,ror#6	@ h+=Sigma1(e)
978*0a6a1f1dSLionel Sambuc	and	r2,r2,r8
979*0a6a1f1dSLionel Sambuc	add	r11,r11,r12			@ h+=K256[i]
980*0a6a1f1dSLionel Sambuc	eor	r2,r2,r10			@ Ch(e,f,g)
981*0a6a1f1dSLionel Sambuc	eor	r0,r4,r4,ror#11
982*0a6a1f1dSLionel Sambuc	add	r11,r11,r2			@ h+=Ch(e,f,g)
983*0a6a1f1dSLionel Sambuc#if 16==31
984*0a6a1f1dSLionel Sambuc	and	r12,r12,#0xff
985*0a6a1f1dSLionel Sambuc	cmp	r12,#0xf2			@ done?
986*0a6a1f1dSLionel Sambuc#endif
987*0a6a1f1dSLionel Sambuc#if 16<15
988*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
989*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
990*0a6a1f1dSLionel Sambuc# else
991*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
992*0a6a1f1dSLionel Sambuc# endif
993*0a6a1f1dSLionel Sambuc	eor	r12,r4,r5			@ a^b, b^c in next round
994*0a6a1f1dSLionel Sambuc#else
995*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#2*4]		@ from future BODY_16_xx
996*0a6a1f1dSLionel Sambuc	eor	r12,r4,r5			@ a^b, b^c in next round
997*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#15*4]	@ from future BODY_16_xx
998*0a6a1f1dSLionel Sambuc#endif
999*0a6a1f1dSLionel Sambuc	eor	r0,r0,r4,ror#20	@ Sigma0(a)
1000*0a6a1f1dSLionel Sambuc	and	r3,r3,r12			@ (b^c)&=(a^b)
1001*0a6a1f1dSLionel Sambuc	add	r7,r7,r11			@ d+=h
1002*0a6a1f1dSLionel Sambuc	eor	r3,r3,r5			@ Maj(a,b,c)
1003*0a6a1f1dSLionel Sambuc	add	r11,r11,r0,ror#2	@ h+=Sigma0(a)
1004*0a6a1f1dSLionel Sambuc	@ add	r11,r11,r3			@ h+=Maj(a,b,c)
1005*0a6a1f1dSLionel Sambuc	@ ldr	r2,[sp,#2*4]		@ 17
1006*0a6a1f1dSLionel Sambuc	@ ldr	r1,[sp,#15*4]
1007*0a6a1f1dSLionel Sambuc	mov	r0,r2,ror#7
1008*0a6a1f1dSLionel Sambuc	add	r11,r11,r3			@ h+=Maj(a,b,c) from the past
1009*0a6a1f1dSLionel Sambuc	mov	r3,r1,ror#17
1010*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,ror#18
1011*0a6a1f1dSLionel Sambuc	eor	r3,r3,r1,ror#19
1012*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1013*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#1*4]
1014*0a6a1f1dSLionel Sambuc	eor	r3,r3,r1,lsr#10	@ sigma1(X[i+14])
1015*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#10*4]
1016*0a6a1f1dSLionel Sambuc
1017*0a6a1f1dSLionel Sambuc	add	r3,r3,r0
1018*0a6a1f1dSLionel Sambuc	eor	r0,r7,r7,ror#5	@ from BODY_00_15
1019*0a6a1f1dSLionel Sambuc	add	r2,r2,r3
1020*0a6a1f1dSLionel Sambuc	eor	r0,r0,r7,ror#19	@ Sigma1(e)
1021*0a6a1f1dSLionel Sambuc	add	r2,r2,r1			@ X[i]
1022*0a6a1f1dSLionel Sambuc	ldr	r3,[r14],#4			@ *K256++
1023*0a6a1f1dSLionel Sambuc	add	r10,r10,r2			@ h+=X[i]
1024*0a6a1f1dSLionel Sambuc	str	r2,[sp,#1*4]
1025*0a6a1f1dSLionel Sambuc	eor	r2,r8,r9
1026*0a6a1f1dSLionel Sambuc	add	r10,r10,r0,ror#6	@ h+=Sigma1(e)
1027*0a6a1f1dSLionel Sambuc	and	r2,r2,r7
1028*0a6a1f1dSLionel Sambuc	add	r10,r10,r3			@ h+=K256[i]
1029*0a6a1f1dSLionel Sambuc	eor	r2,r2,r9			@ Ch(e,f,g)
1030*0a6a1f1dSLionel Sambuc	eor	r0,r11,r11,ror#11
1031*0a6a1f1dSLionel Sambuc	add	r10,r10,r2			@ h+=Ch(e,f,g)
1032*0a6a1f1dSLionel Sambuc#if 17==31
1033*0a6a1f1dSLionel Sambuc	and	r3,r3,#0xff
1034*0a6a1f1dSLionel Sambuc	cmp	r3,#0xf2			@ done?
1035*0a6a1f1dSLionel Sambuc#endif
1036*0a6a1f1dSLionel Sambuc#if 17<15
1037*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
1038*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
1039*0a6a1f1dSLionel Sambuc# else
1040*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
1041*0a6a1f1dSLionel Sambuc# endif
1042*0a6a1f1dSLionel Sambuc	eor	r3,r11,r4			@ a^b, b^c in next round
1043*0a6a1f1dSLionel Sambuc#else
1044*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#3*4]		@ from future BODY_16_xx
1045*0a6a1f1dSLionel Sambuc	eor	r3,r11,r4			@ a^b, b^c in next round
1046*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#0*4]	@ from future BODY_16_xx
1047*0a6a1f1dSLionel Sambuc#endif
1048*0a6a1f1dSLionel Sambuc	eor	r0,r0,r11,ror#20	@ Sigma0(a)
1049*0a6a1f1dSLionel Sambuc	and	r12,r12,r3			@ (b^c)&=(a^b)
1050*0a6a1f1dSLionel Sambuc	add	r6,r6,r10			@ d+=h
1051*0a6a1f1dSLionel Sambuc	eor	r12,r12,r4			@ Maj(a,b,c)
1052*0a6a1f1dSLionel Sambuc	add	r10,r10,r0,ror#2	@ h+=Sigma0(a)
1053*0a6a1f1dSLionel Sambuc	@ add	r10,r10,r12			@ h+=Maj(a,b,c)
1054*0a6a1f1dSLionel Sambuc	@ ldr	r2,[sp,#3*4]		@ 18
1055*0a6a1f1dSLionel Sambuc	@ ldr	r1,[sp,#0*4]
1056*0a6a1f1dSLionel Sambuc	mov	r0,r2,ror#7
1057*0a6a1f1dSLionel Sambuc	add	r10,r10,r12			@ h+=Maj(a,b,c) from the past
1058*0a6a1f1dSLionel Sambuc	mov	r12,r1,ror#17
1059*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,ror#18
1060*0a6a1f1dSLionel Sambuc	eor	r12,r12,r1,ror#19
1061*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1062*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#2*4]
1063*0a6a1f1dSLionel Sambuc	eor	r12,r12,r1,lsr#10	@ sigma1(X[i+14])
1064*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#11*4]
1065*0a6a1f1dSLionel Sambuc
1066*0a6a1f1dSLionel Sambuc	add	r12,r12,r0
1067*0a6a1f1dSLionel Sambuc	eor	r0,r6,r6,ror#5	@ from BODY_00_15
1068*0a6a1f1dSLionel Sambuc	add	r2,r2,r12
1069*0a6a1f1dSLionel Sambuc	eor	r0,r0,r6,ror#19	@ Sigma1(e)
1070*0a6a1f1dSLionel Sambuc	add	r2,r2,r1			@ X[i]
1071*0a6a1f1dSLionel Sambuc	ldr	r12,[r14],#4			@ *K256++
1072*0a6a1f1dSLionel Sambuc	add	r9,r9,r2			@ h+=X[i]
1073*0a6a1f1dSLionel Sambuc	str	r2,[sp,#2*4]
1074*0a6a1f1dSLionel Sambuc	eor	r2,r7,r8
1075*0a6a1f1dSLionel Sambuc	add	r9,r9,r0,ror#6	@ h+=Sigma1(e)
1076*0a6a1f1dSLionel Sambuc	and	r2,r2,r6
1077*0a6a1f1dSLionel Sambuc	add	r9,r9,r12			@ h+=K256[i]
1078*0a6a1f1dSLionel Sambuc	eor	r2,r2,r8			@ Ch(e,f,g)
1079*0a6a1f1dSLionel Sambuc	eor	r0,r10,r10,ror#11
1080*0a6a1f1dSLionel Sambuc	add	r9,r9,r2			@ h+=Ch(e,f,g)
1081*0a6a1f1dSLionel Sambuc#if 18==31
1082*0a6a1f1dSLionel Sambuc	and	r12,r12,#0xff
1083*0a6a1f1dSLionel Sambuc	cmp	r12,#0xf2			@ done?
1084*0a6a1f1dSLionel Sambuc#endif
1085*0a6a1f1dSLionel Sambuc#if 18<15
1086*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
1087*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
1088*0a6a1f1dSLionel Sambuc# else
1089*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
1090*0a6a1f1dSLionel Sambuc# endif
1091*0a6a1f1dSLionel Sambuc	eor	r12,r10,r11			@ a^b, b^c in next round
1092*0a6a1f1dSLionel Sambuc#else
1093*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#4*4]		@ from future BODY_16_xx
1094*0a6a1f1dSLionel Sambuc	eor	r12,r10,r11			@ a^b, b^c in next round
1095*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#1*4]	@ from future BODY_16_xx
1096*0a6a1f1dSLionel Sambuc#endif
1097*0a6a1f1dSLionel Sambuc	eor	r0,r0,r10,ror#20	@ Sigma0(a)
1098*0a6a1f1dSLionel Sambuc	and	r3,r3,r12			@ (b^c)&=(a^b)
1099*0a6a1f1dSLionel Sambuc	add	r5,r5,r9			@ d+=h
1100*0a6a1f1dSLionel Sambuc	eor	r3,r3,r11			@ Maj(a,b,c)
1101*0a6a1f1dSLionel Sambuc	add	r9,r9,r0,ror#2	@ h+=Sigma0(a)
1102*0a6a1f1dSLionel Sambuc	@ add	r9,r9,r3			@ h+=Maj(a,b,c)
1103*0a6a1f1dSLionel Sambuc	@ ldr	r2,[sp,#4*4]		@ 19
1104*0a6a1f1dSLionel Sambuc	@ ldr	r1,[sp,#1*4]
1105*0a6a1f1dSLionel Sambuc	mov	r0,r2,ror#7
1106*0a6a1f1dSLionel Sambuc	add	r9,r9,r3			@ h+=Maj(a,b,c) from the past
1107*0a6a1f1dSLionel Sambuc	mov	r3,r1,ror#17
1108*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,ror#18
1109*0a6a1f1dSLionel Sambuc	eor	r3,r3,r1,ror#19
1110*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1111*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#3*4]
1112*0a6a1f1dSLionel Sambuc	eor	r3,r3,r1,lsr#10	@ sigma1(X[i+14])
1113*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#12*4]
1114*0a6a1f1dSLionel Sambuc
1115*0a6a1f1dSLionel Sambuc	add	r3,r3,r0
1116*0a6a1f1dSLionel Sambuc	eor	r0,r5,r5,ror#5	@ from BODY_00_15
1117*0a6a1f1dSLionel Sambuc	add	r2,r2,r3
1118*0a6a1f1dSLionel Sambuc	eor	r0,r0,r5,ror#19	@ Sigma1(e)
1119*0a6a1f1dSLionel Sambuc	add	r2,r2,r1			@ X[i]
1120*0a6a1f1dSLionel Sambuc	ldr	r3,[r14],#4			@ *K256++
1121*0a6a1f1dSLionel Sambuc	add	r8,r8,r2			@ h+=X[i]
1122*0a6a1f1dSLionel Sambuc	str	r2,[sp,#3*4]
1123*0a6a1f1dSLionel Sambuc	eor	r2,r6,r7
1124*0a6a1f1dSLionel Sambuc	add	r8,r8,r0,ror#6	@ h+=Sigma1(e)
1125*0a6a1f1dSLionel Sambuc	and	r2,r2,r5
1126*0a6a1f1dSLionel Sambuc	add	r8,r8,r3			@ h+=K256[i]
1127*0a6a1f1dSLionel Sambuc	eor	r2,r2,r7			@ Ch(e,f,g)
1128*0a6a1f1dSLionel Sambuc	eor	r0,r9,r9,ror#11
1129*0a6a1f1dSLionel Sambuc	add	r8,r8,r2			@ h+=Ch(e,f,g)
1130*0a6a1f1dSLionel Sambuc#if 19==31
1131*0a6a1f1dSLionel Sambuc	and	r3,r3,#0xff
1132*0a6a1f1dSLionel Sambuc	cmp	r3,#0xf2			@ done?
1133*0a6a1f1dSLionel Sambuc#endif
1134*0a6a1f1dSLionel Sambuc#if 19<15
1135*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
1136*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
1137*0a6a1f1dSLionel Sambuc# else
1138*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
1139*0a6a1f1dSLionel Sambuc# endif
1140*0a6a1f1dSLionel Sambuc	eor	r3,r9,r10			@ a^b, b^c in next round
1141*0a6a1f1dSLionel Sambuc#else
1142*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#5*4]		@ from future BODY_16_xx
1143*0a6a1f1dSLionel Sambuc	eor	r3,r9,r10			@ a^b, b^c in next round
1144*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#2*4]	@ from future BODY_16_xx
1145*0a6a1f1dSLionel Sambuc#endif
1146*0a6a1f1dSLionel Sambuc	eor	r0,r0,r9,ror#20	@ Sigma0(a)
1147*0a6a1f1dSLionel Sambuc	and	r12,r12,r3			@ (b^c)&=(a^b)
1148*0a6a1f1dSLionel Sambuc	add	r4,r4,r8			@ d+=h
1149*0a6a1f1dSLionel Sambuc	eor	r12,r12,r10			@ Maj(a,b,c)
1150*0a6a1f1dSLionel Sambuc	add	r8,r8,r0,ror#2	@ h+=Sigma0(a)
1151*0a6a1f1dSLionel Sambuc	@ add	r8,r8,r12			@ h+=Maj(a,b,c)
1152*0a6a1f1dSLionel Sambuc	@ ldr	r2,[sp,#5*4]		@ 20
1153*0a6a1f1dSLionel Sambuc	@ ldr	r1,[sp,#2*4]
1154*0a6a1f1dSLionel Sambuc	mov	r0,r2,ror#7
1155*0a6a1f1dSLionel Sambuc	add	r8,r8,r12			@ h+=Maj(a,b,c) from the past
1156*0a6a1f1dSLionel Sambuc	mov	r12,r1,ror#17
1157*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,ror#18
1158*0a6a1f1dSLionel Sambuc	eor	r12,r12,r1,ror#19
1159*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1160*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#4*4]
1161*0a6a1f1dSLionel Sambuc	eor	r12,r12,r1,lsr#10	@ sigma1(X[i+14])
1162*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#13*4]
1163*0a6a1f1dSLionel Sambuc
1164*0a6a1f1dSLionel Sambuc	add	r12,r12,r0
1165*0a6a1f1dSLionel Sambuc	eor	r0,r4,r4,ror#5	@ from BODY_00_15
1166*0a6a1f1dSLionel Sambuc	add	r2,r2,r12
1167*0a6a1f1dSLionel Sambuc	eor	r0,r0,r4,ror#19	@ Sigma1(e)
1168*0a6a1f1dSLionel Sambuc	add	r2,r2,r1			@ X[i]
1169*0a6a1f1dSLionel Sambuc	ldr	r12,[r14],#4			@ *K256++
1170*0a6a1f1dSLionel Sambuc	add	r7,r7,r2			@ h+=X[i]
1171*0a6a1f1dSLionel Sambuc	str	r2,[sp,#4*4]
1172*0a6a1f1dSLionel Sambuc	eor	r2,r5,r6
1173*0a6a1f1dSLionel Sambuc	add	r7,r7,r0,ror#6	@ h+=Sigma1(e)
1174*0a6a1f1dSLionel Sambuc	and	r2,r2,r4
1175*0a6a1f1dSLionel Sambuc	add	r7,r7,r12			@ h+=K256[i]
1176*0a6a1f1dSLionel Sambuc	eor	r2,r2,r6			@ Ch(e,f,g)
1177*0a6a1f1dSLionel Sambuc	eor	r0,r8,r8,ror#11
1178*0a6a1f1dSLionel Sambuc	add	r7,r7,r2			@ h+=Ch(e,f,g)
1179*0a6a1f1dSLionel Sambuc#if 20==31
1180*0a6a1f1dSLionel Sambuc	and	r12,r12,#0xff
1181*0a6a1f1dSLionel Sambuc	cmp	r12,#0xf2			@ done?
1182*0a6a1f1dSLionel Sambuc#endif
1183*0a6a1f1dSLionel Sambuc#if 20<15
1184*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
1185*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
1186*0a6a1f1dSLionel Sambuc# else
1187*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
1188*0a6a1f1dSLionel Sambuc# endif
1189*0a6a1f1dSLionel Sambuc	eor	r12,r8,r9			@ a^b, b^c in next round
1190*0a6a1f1dSLionel Sambuc#else
1191*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#6*4]		@ from future BODY_16_xx
1192*0a6a1f1dSLionel Sambuc	eor	r12,r8,r9			@ a^b, b^c in next round
1193*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#3*4]	@ from future BODY_16_xx
1194*0a6a1f1dSLionel Sambuc#endif
1195*0a6a1f1dSLionel Sambuc	eor	r0,r0,r8,ror#20	@ Sigma0(a)
1196*0a6a1f1dSLionel Sambuc	and	r3,r3,r12			@ (b^c)&=(a^b)
1197*0a6a1f1dSLionel Sambuc	add	r11,r11,r7			@ d+=h
1198*0a6a1f1dSLionel Sambuc	eor	r3,r3,r9			@ Maj(a,b,c)
1199*0a6a1f1dSLionel Sambuc	add	r7,r7,r0,ror#2	@ h+=Sigma0(a)
1200*0a6a1f1dSLionel Sambuc	@ add	r7,r7,r3			@ h+=Maj(a,b,c)
1201*0a6a1f1dSLionel Sambuc	@ ldr	r2,[sp,#6*4]		@ 21
1202*0a6a1f1dSLionel Sambuc	@ ldr	r1,[sp,#3*4]
1203*0a6a1f1dSLionel Sambuc	mov	r0,r2,ror#7
1204*0a6a1f1dSLionel Sambuc	add	r7,r7,r3			@ h+=Maj(a,b,c) from the past
1205*0a6a1f1dSLionel Sambuc	mov	r3,r1,ror#17
1206*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,ror#18
1207*0a6a1f1dSLionel Sambuc	eor	r3,r3,r1,ror#19
1208*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1209*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#5*4]
1210*0a6a1f1dSLionel Sambuc	eor	r3,r3,r1,lsr#10	@ sigma1(X[i+14])
1211*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#14*4]
1212*0a6a1f1dSLionel Sambuc
1213*0a6a1f1dSLionel Sambuc	add	r3,r3,r0
1214*0a6a1f1dSLionel Sambuc	eor	r0,r11,r11,ror#5	@ from BODY_00_15
1215*0a6a1f1dSLionel Sambuc	add	r2,r2,r3
1216*0a6a1f1dSLionel Sambuc	eor	r0,r0,r11,ror#19	@ Sigma1(e)
1217*0a6a1f1dSLionel Sambuc	add	r2,r2,r1			@ X[i]
1218*0a6a1f1dSLionel Sambuc	ldr	r3,[r14],#4			@ *K256++
1219*0a6a1f1dSLionel Sambuc	add	r6,r6,r2			@ h+=X[i]
1220*0a6a1f1dSLionel Sambuc	str	r2,[sp,#5*4]
1221*0a6a1f1dSLionel Sambuc	eor	r2,r4,r5
1222*0a6a1f1dSLionel Sambuc	add	r6,r6,r0,ror#6	@ h+=Sigma1(e)
1223*0a6a1f1dSLionel Sambuc	and	r2,r2,r11
1224*0a6a1f1dSLionel Sambuc	add	r6,r6,r3			@ h+=K256[i]
1225*0a6a1f1dSLionel Sambuc	eor	r2,r2,r5			@ Ch(e,f,g)
1226*0a6a1f1dSLionel Sambuc	eor	r0,r7,r7,ror#11
1227*0a6a1f1dSLionel Sambuc	add	r6,r6,r2			@ h+=Ch(e,f,g)
1228*0a6a1f1dSLionel Sambuc#if 21==31
1229*0a6a1f1dSLionel Sambuc	and	r3,r3,#0xff
1230*0a6a1f1dSLionel Sambuc	cmp	r3,#0xf2			@ done?
1231*0a6a1f1dSLionel Sambuc#endif
1232*0a6a1f1dSLionel Sambuc#if 21<15
1233*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
1234*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
1235*0a6a1f1dSLionel Sambuc# else
1236*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
1237*0a6a1f1dSLionel Sambuc# endif
1238*0a6a1f1dSLionel Sambuc	eor	r3,r7,r8			@ a^b, b^c in next round
1239*0a6a1f1dSLionel Sambuc#else
1240*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#7*4]		@ from future BODY_16_xx
1241*0a6a1f1dSLionel Sambuc	eor	r3,r7,r8			@ a^b, b^c in next round
1242*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#4*4]	@ from future BODY_16_xx
1243*0a6a1f1dSLionel Sambuc#endif
1244*0a6a1f1dSLionel Sambuc	eor	r0,r0,r7,ror#20	@ Sigma0(a)
1245*0a6a1f1dSLionel Sambuc	and	r12,r12,r3			@ (b^c)&=(a^b)
1246*0a6a1f1dSLionel Sambuc	add	r10,r10,r6			@ d+=h
1247*0a6a1f1dSLionel Sambuc	eor	r12,r12,r8			@ Maj(a,b,c)
1248*0a6a1f1dSLionel Sambuc	add	r6,r6,r0,ror#2	@ h+=Sigma0(a)
1249*0a6a1f1dSLionel Sambuc	@ add	r6,r6,r12			@ h+=Maj(a,b,c)
1250*0a6a1f1dSLionel Sambuc	@ ldr	r2,[sp,#7*4]		@ 22
1251*0a6a1f1dSLionel Sambuc	@ ldr	r1,[sp,#4*4]
1252*0a6a1f1dSLionel Sambuc	mov	r0,r2,ror#7
1253*0a6a1f1dSLionel Sambuc	add	r6,r6,r12			@ h+=Maj(a,b,c) from the past
1254*0a6a1f1dSLionel Sambuc	mov	r12,r1,ror#17
1255*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,ror#18
1256*0a6a1f1dSLionel Sambuc	eor	r12,r12,r1,ror#19
1257*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1258*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#6*4]
1259*0a6a1f1dSLionel Sambuc	eor	r12,r12,r1,lsr#10	@ sigma1(X[i+14])
1260*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#15*4]
1261*0a6a1f1dSLionel Sambuc
1262*0a6a1f1dSLionel Sambuc	add	r12,r12,r0
1263*0a6a1f1dSLionel Sambuc	eor	r0,r10,r10,ror#5	@ from BODY_00_15
1264*0a6a1f1dSLionel Sambuc	add	r2,r2,r12
1265*0a6a1f1dSLionel Sambuc	eor	r0,r0,r10,ror#19	@ Sigma1(e)
1266*0a6a1f1dSLionel Sambuc	add	r2,r2,r1			@ X[i]
1267*0a6a1f1dSLionel Sambuc	ldr	r12,[r14],#4			@ *K256++
1268*0a6a1f1dSLionel Sambuc	add	r5,r5,r2			@ h+=X[i]
1269*0a6a1f1dSLionel Sambuc	str	r2,[sp,#6*4]
1270*0a6a1f1dSLionel Sambuc	eor	r2,r11,r4
1271*0a6a1f1dSLionel Sambuc	add	r5,r5,r0,ror#6	@ h+=Sigma1(e)
1272*0a6a1f1dSLionel Sambuc	and	r2,r2,r10
1273*0a6a1f1dSLionel Sambuc	add	r5,r5,r12			@ h+=K256[i]
1274*0a6a1f1dSLionel Sambuc	eor	r2,r2,r4			@ Ch(e,f,g)
1275*0a6a1f1dSLionel Sambuc	eor	r0,r6,r6,ror#11
1276*0a6a1f1dSLionel Sambuc	add	r5,r5,r2			@ h+=Ch(e,f,g)
1277*0a6a1f1dSLionel Sambuc#if 22==31
1278*0a6a1f1dSLionel Sambuc	and	r12,r12,#0xff
1279*0a6a1f1dSLionel Sambuc	cmp	r12,#0xf2			@ done?
1280*0a6a1f1dSLionel Sambuc#endif
1281*0a6a1f1dSLionel Sambuc#if 22<15
1282*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
1283*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
1284*0a6a1f1dSLionel Sambuc# else
1285*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
1286*0a6a1f1dSLionel Sambuc# endif
1287*0a6a1f1dSLionel Sambuc	eor	r12,r6,r7			@ a^b, b^c in next round
1288*0a6a1f1dSLionel Sambuc#else
1289*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#8*4]		@ from future BODY_16_xx
1290*0a6a1f1dSLionel Sambuc	eor	r12,r6,r7			@ a^b, b^c in next round
1291*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#5*4]	@ from future BODY_16_xx
1292*0a6a1f1dSLionel Sambuc#endif
1293*0a6a1f1dSLionel Sambuc	eor	r0,r0,r6,ror#20	@ Sigma0(a)
1294*0a6a1f1dSLionel Sambuc	and	r3,r3,r12			@ (b^c)&=(a^b)
1295*0a6a1f1dSLionel Sambuc	add	r9,r9,r5			@ d+=h
1296*0a6a1f1dSLionel Sambuc	eor	r3,r3,r7			@ Maj(a,b,c)
1297*0a6a1f1dSLionel Sambuc	add	r5,r5,r0,ror#2	@ h+=Sigma0(a)
1298*0a6a1f1dSLionel Sambuc	@ add	r5,r5,r3			@ h+=Maj(a,b,c)
1299*0a6a1f1dSLionel Sambuc	@ ldr	r2,[sp,#8*4]		@ 23
1300*0a6a1f1dSLionel Sambuc	@ ldr	r1,[sp,#5*4]
1301*0a6a1f1dSLionel Sambuc	mov	r0,r2,ror#7
1302*0a6a1f1dSLionel Sambuc	add	r5,r5,r3			@ h+=Maj(a,b,c) from the past
1303*0a6a1f1dSLionel Sambuc	mov	r3,r1,ror#17
1304*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,ror#18
1305*0a6a1f1dSLionel Sambuc	eor	r3,r3,r1,ror#19
1306*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1307*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#7*4]
1308*0a6a1f1dSLionel Sambuc	eor	r3,r3,r1,lsr#10	@ sigma1(X[i+14])
1309*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#0*4]
1310*0a6a1f1dSLionel Sambuc
1311*0a6a1f1dSLionel Sambuc	add	r3,r3,r0
1312*0a6a1f1dSLionel Sambuc	eor	r0,r9,r9,ror#5	@ from BODY_00_15
1313*0a6a1f1dSLionel Sambuc	add	r2,r2,r3
1314*0a6a1f1dSLionel Sambuc	eor	r0,r0,r9,ror#19	@ Sigma1(e)
1315*0a6a1f1dSLionel Sambuc	add	r2,r2,r1			@ X[i]
1316*0a6a1f1dSLionel Sambuc	ldr	r3,[r14],#4			@ *K256++
1317*0a6a1f1dSLionel Sambuc	add	r4,r4,r2			@ h+=X[i]
1318*0a6a1f1dSLionel Sambuc	str	r2,[sp,#7*4]
1319*0a6a1f1dSLionel Sambuc	eor	r2,r10,r11
1320*0a6a1f1dSLionel Sambuc	add	r4,r4,r0,ror#6	@ h+=Sigma1(e)
1321*0a6a1f1dSLionel Sambuc	and	r2,r2,r9
1322*0a6a1f1dSLionel Sambuc	add	r4,r4,r3			@ h+=K256[i]
1323*0a6a1f1dSLionel Sambuc	eor	r2,r2,r11			@ Ch(e,f,g)
1324*0a6a1f1dSLionel Sambuc	eor	r0,r5,r5,ror#11
1325*0a6a1f1dSLionel Sambuc	add	r4,r4,r2			@ h+=Ch(e,f,g)
1326*0a6a1f1dSLionel Sambuc#if 23==31
1327*0a6a1f1dSLionel Sambuc	and	r3,r3,#0xff
1328*0a6a1f1dSLionel Sambuc	cmp	r3,#0xf2			@ done?
1329*0a6a1f1dSLionel Sambuc#endif
1330*0a6a1f1dSLionel Sambuc#if 23<15
1331*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
1332*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
1333*0a6a1f1dSLionel Sambuc# else
1334*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
1335*0a6a1f1dSLionel Sambuc# endif
1336*0a6a1f1dSLionel Sambuc	eor	r3,r5,r6			@ a^b, b^c in next round
1337*0a6a1f1dSLionel Sambuc#else
1338*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#9*4]		@ from future BODY_16_xx
1339*0a6a1f1dSLionel Sambuc	eor	r3,r5,r6			@ a^b, b^c in next round
1340*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#6*4]	@ from future BODY_16_xx
1341*0a6a1f1dSLionel Sambuc#endif
1342*0a6a1f1dSLionel Sambuc	eor	r0,r0,r5,ror#20	@ Sigma0(a)
1343*0a6a1f1dSLionel Sambuc	and	r12,r12,r3			@ (b^c)&=(a^b)
1344*0a6a1f1dSLionel Sambuc	add	r8,r8,r4			@ d+=h
1345*0a6a1f1dSLionel Sambuc	eor	r12,r12,r6			@ Maj(a,b,c)
1346*0a6a1f1dSLionel Sambuc	add	r4,r4,r0,ror#2	@ h+=Sigma0(a)
1347*0a6a1f1dSLionel Sambuc	@ add	r4,r4,r12			@ h+=Maj(a,b,c)
1348*0a6a1f1dSLionel Sambuc	@ ldr	r2,[sp,#9*4]		@ 24
1349*0a6a1f1dSLionel Sambuc	@ ldr	r1,[sp,#6*4]
1350*0a6a1f1dSLionel Sambuc	mov	r0,r2,ror#7
1351*0a6a1f1dSLionel Sambuc	add	r4,r4,r12			@ h+=Maj(a,b,c) from the past
1352*0a6a1f1dSLionel Sambuc	mov	r12,r1,ror#17
1353*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,ror#18
1354*0a6a1f1dSLionel Sambuc	eor	r12,r12,r1,ror#19
1355*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1356*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#8*4]
1357*0a6a1f1dSLionel Sambuc	eor	r12,r12,r1,lsr#10	@ sigma1(X[i+14])
1358*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#1*4]
1359*0a6a1f1dSLionel Sambuc
1360*0a6a1f1dSLionel Sambuc	add	r12,r12,r0
1361*0a6a1f1dSLionel Sambuc	eor	r0,r8,r8,ror#5	@ from BODY_00_15
1362*0a6a1f1dSLionel Sambuc	add	r2,r2,r12
1363*0a6a1f1dSLionel Sambuc	eor	r0,r0,r8,ror#19	@ Sigma1(e)
1364*0a6a1f1dSLionel Sambuc	add	r2,r2,r1			@ X[i]
1365*0a6a1f1dSLionel Sambuc	ldr	r12,[r14],#4			@ *K256++
1366*0a6a1f1dSLionel Sambuc	add	r11,r11,r2			@ h+=X[i]
1367*0a6a1f1dSLionel Sambuc	str	r2,[sp,#8*4]
1368*0a6a1f1dSLionel Sambuc	eor	r2,r9,r10
1369*0a6a1f1dSLionel Sambuc	add	r11,r11,r0,ror#6	@ h+=Sigma1(e)
1370*0a6a1f1dSLionel Sambuc	and	r2,r2,r8
1371*0a6a1f1dSLionel Sambuc	add	r11,r11,r12			@ h+=K256[i]
1372*0a6a1f1dSLionel Sambuc	eor	r2,r2,r10			@ Ch(e,f,g)
1373*0a6a1f1dSLionel Sambuc	eor	r0,r4,r4,ror#11
1374*0a6a1f1dSLionel Sambuc	add	r11,r11,r2			@ h+=Ch(e,f,g)
1375*0a6a1f1dSLionel Sambuc#if 24==31
1376*0a6a1f1dSLionel Sambuc	and	r12,r12,#0xff
1377*0a6a1f1dSLionel Sambuc	cmp	r12,#0xf2			@ done?
1378*0a6a1f1dSLionel Sambuc#endif
1379*0a6a1f1dSLionel Sambuc#if 24<15
1380*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
1381*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
1382*0a6a1f1dSLionel Sambuc# else
1383*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
1384*0a6a1f1dSLionel Sambuc# endif
1385*0a6a1f1dSLionel Sambuc	eor	r12,r4,r5			@ a^b, b^c in next round
1386*0a6a1f1dSLionel Sambuc#else
1387*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#10*4]		@ from future BODY_16_xx
1388*0a6a1f1dSLionel Sambuc	eor	r12,r4,r5			@ a^b, b^c in next round
1389*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#7*4]	@ from future BODY_16_xx
1390*0a6a1f1dSLionel Sambuc#endif
1391*0a6a1f1dSLionel Sambuc	eor	r0,r0,r4,ror#20	@ Sigma0(a)
1392*0a6a1f1dSLionel Sambuc	and	r3,r3,r12			@ (b^c)&=(a^b)
1393*0a6a1f1dSLionel Sambuc	add	r7,r7,r11			@ d+=h
1394*0a6a1f1dSLionel Sambuc	eor	r3,r3,r5			@ Maj(a,b,c)
1395*0a6a1f1dSLionel Sambuc	add	r11,r11,r0,ror#2	@ h+=Sigma0(a)
1396*0a6a1f1dSLionel Sambuc	@ add	r11,r11,r3			@ h+=Maj(a,b,c)
1397*0a6a1f1dSLionel Sambuc	@ ldr	r2,[sp,#10*4]		@ 25
1398*0a6a1f1dSLionel Sambuc	@ ldr	r1,[sp,#7*4]
1399*0a6a1f1dSLionel Sambuc	mov	r0,r2,ror#7
1400*0a6a1f1dSLionel Sambuc	add	r11,r11,r3			@ h+=Maj(a,b,c) from the past
1401*0a6a1f1dSLionel Sambuc	mov	r3,r1,ror#17
1402*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,ror#18
1403*0a6a1f1dSLionel Sambuc	eor	r3,r3,r1,ror#19
1404*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1405*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#9*4]
1406*0a6a1f1dSLionel Sambuc	eor	r3,r3,r1,lsr#10	@ sigma1(X[i+14])
1407*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#2*4]
1408*0a6a1f1dSLionel Sambuc
1409*0a6a1f1dSLionel Sambuc	add	r3,r3,r0
1410*0a6a1f1dSLionel Sambuc	eor	r0,r7,r7,ror#5	@ from BODY_00_15
1411*0a6a1f1dSLionel Sambuc	add	r2,r2,r3
1412*0a6a1f1dSLionel Sambuc	eor	r0,r0,r7,ror#19	@ Sigma1(e)
1413*0a6a1f1dSLionel Sambuc	add	r2,r2,r1			@ X[i]
1414*0a6a1f1dSLionel Sambuc	ldr	r3,[r14],#4			@ *K256++
1415*0a6a1f1dSLionel Sambuc	add	r10,r10,r2			@ h+=X[i]
1416*0a6a1f1dSLionel Sambuc	str	r2,[sp,#9*4]
1417*0a6a1f1dSLionel Sambuc	eor	r2,r8,r9
1418*0a6a1f1dSLionel Sambuc	add	r10,r10,r0,ror#6	@ h+=Sigma1(e)
1419*0a6a1f1dSLionel Sambuc	and	r2,r2,r7
1420*0a6a1f1dSLionel Sambuc	add	r10,r10,r3			@ h+=K256[i]
1421*0a6a1f1dSLionel Sambuc	eor	r2,r2,r9			@ Ch(e,f,g)
1422*0a6a1f1dSLionel Sambuc	eor	r0,r11,r11,ror#11
1423*0a6a1f1dSLionel Sambuc	add	r10,r10,r2			@ h+=Ch(e,f,g)
1424*0a6a1f1dSLionel Sambuc#if 25==31
1425*0a6a1f1dSLionel Sambuc	and	r3,r3,#0xff
1426*0a6a1f1dSLionel Sambuc	cmp	r3,#0xf2			@ done?
1427*0a6a1f1dSLionel Sambuc#endif
1428*0a6a1f1dSLionel Sambuc#if 25<15
1429*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
1430*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
1431*0a6a1f1dSLionel Sambuc# else
1432*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
1433*0a6a1f1dSLionel Sambuc# endif
1434*0a6a1f1dSLionel Sambuc	eor	r3,r11,r4			@ a^b, b^c in next round
1435*0a6a1f1dSLionel Sambuc#else
1436*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#11*4]		@ from future BODY_16_xx
1437*0a6a1f1dSLionel Sambuc	eor	r3,r11,r4			@ a^b, b^c in next round
1438*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#8*4]	@ from future BODY_16_xx
1439*0a6a1f1dSLionel Sambuc#endif
1440*0a6a1f1dSLionel Sambuc	eor	r0,r0,r11,ror#20	@ Sigma0(a)
1441*0a6a1f1dSLionel Sambuc	and	r12,r12,r3			@ (b^c)&=(a^b)
1442*0a6a1f1dSLionel Sambuc	add	r6,r6,r10			@ d+=h
1443*0a6a1f1dSLionel Sambuc	eor	r12,r12,r4			@ Maj(a,b,c)
1444*0a6a1f1dSLionel Sambuc	add	r10,r10,r0,ror#2	@ h+=Sigma0(a)
1445*0a6a1f1dSLionel Sambuc	@ add	r10,r10,r12			@ h+=Maj(a,b,c)
1446*0a6a1f1dSLionel Sambuc	@ ldr	r2,[sp,#11*4]		@ 26
1447*0a6a1f1dSLionel Sambuc	@ ldr	r1,[sp,#8*4]
1448*0a6a1f1dSLionel Sambuc	mov	r0,r2,ror#7
1449*0a6a1f1dSLionel Sambuc	add	r10,r10,r12			@ h+=Maj(a,b,c) from the past
1450*0a6a1f1dSLionel Sambuc	mov	r12,r1,ror#17
1451*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,ror#18
1452*0a6a1f1dSLionel Sambuc	eor	r12,r12,r1,ror#19
1453*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1454*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#10*4]
1455*0a6a1f1dSLionel Sambuc	eor	r12,r12,r1,lsr#10	@ sigma1(X[i+14])
1456*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#3*4]
1457*0a6a1f1dSLionel Sambuc
1458*0a6a1f1dSLionel Sambuc	add	r12,r12,r0
1459*0a6a1f1dSLionel Sambuc	eor	r0,r6,r6,ror#5	@ from BODY_00_15
1460*0a6a1f1dSLionel Sambuc	add	r2,r2,r12
1461*0a6a1f1dSLionel Sambuc	eor	r0,r0,r6,ror#19	@ Sigma1(e)
1462*0a6a1f1dSLionel Sambuc	add	r2,r2,r1			@ X[i]
1463*0a6a1f1dSLionel Sambuc	ldr	r12,[r14],#4			@ *K256++
1464*0a6a1f1dSLionel Sambuc	add	r9,r9,r2			@ h+=X[i]
1465*0a6a1f1dSLionel Sambuc	str	r2,[sp,#10*4]
1466*0a6a1f1dSLionel Sambuc	eor	r2,r7,r8
1467*0a6a1f1dSLionel Sambuc	add	r9,r9,r0,ror#6	@ h+=Sigma1(e)
1468*0a6a1f1dSLionel Sambuc	and	r2,r2,r6
1469*0a6a1f1dSLionel Sambuc	add	r9,r9,r12			@ h+=K256[i]
1470*0a6a1f1dSLionel Sambuc	eor	r2,r2,r8			@ Ch(e,f,g)
1471*0a6a1f1dSLionel Sambuc	eor	r0,r10,r10,ror#11
1472*0a6a1f1dSLionel Sambuc	add	r9,r9,r2			@ h+=Ch(e,f,g)
1473*0a6a1f1dSLionel Sambuc#if 26==31
1474*0a6a1f1dSLionel Sambuc	and	r12,r12,#0xff
1475*0a6a1f1dSLionel Sambuc	cmp	r12,#0xf2			@ done?
1476*0a6a1f1dSLionel Sambuc#endif
1477*0a6a1f1dSLionel Sambuc#if 26<15
1478*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
1479*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
1480*0a6a1f1dSLionel Sambuc# else
1481*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
1482*0a6a1f1dSLionel Sambuc# endif
1483*0a6a1f1dSLionel Sambuc	eor	r12,r10,r11			@ a^b, b^c in next round
1484*0a6a1f1dSLionel Sambuc#else
1485*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#12*4]		@ from future BODY_16_xx
1486*0a6a1f1dSLionel Sambuc	eor	r12,r10,r11			@ a^b, b^c in next round
1487*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#9*4]	@ from future BODY_16_xx
1488*0a6a1f1dSLionel Sambuc#endif
1489*0a6a1f1dSLionel Sambuc	eor	r0,r0,r10,ror#20	@ Sigma0(a)
1490*0a6a1f1dSLionel Sambuc	and	r3,r3,r12			@ (b^c)&=(a^b)
1491*0a6a1f1dSLionel Sambuc	add	r5,r5,r9			@ d+=h
1492*0a6a1f1dSLionel Sambuc	eor	r3,r3,r11			@ Maj(a,b,c)
1493*0a6a1f1dSLionel Sambuc	add	r9,r9,r0,ror#2	@ h+=Sigma0(a)
1494*0a6a1f1dSLionel Sambuc	@ add	r9,r9,r3			@ h+=Maj(a,b,c)
1495*0a6a1f1dSLionel Sambuc	@ ldr	r2,[sp,#12*4]		@ 27
1496*0a6a1f1dSLionel Sambuc	@ ldr	r1,[sp,#9*4]
1497*0a6a1f1dSLionel Sambuc	mov	r0,r2,ror#7
1498*0a6a1f1dSLionel Sambuc	add	r9,r9,r3			@ h+=Maj(a,b,c) from the past
1499*0a6a1f1dSLionel Sambuc	mov	r3,r1,ror#17
1500*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,ror#18
1501*0a6a1f1dSLionel Sambuc	eor	r3,r3,r1,ror#19
1502*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1503*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#11*4]
1504*0a6a1f1dSLionel Sambuc	eor	r3,r3,r1,lsr#10	@ sigma1(X[i+14])
1505*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#4*4]
1506*0a6a1f1dSLionel Sambuc
1507*0a6a1f1dSLionel Sambuc	add	r3,r3,r0
1508*0a6a1f1dSLionel Sambuc	eor	r0,r5,r5,ror#5	@ from BODY_00_15
1509*0a6a1f1dSLionel Sambuc	add	r2,r2,r3
1510*0a6a1f1dSLionel Sambuc	eor	r0,r0,r5,ror#19	@ Sigma1(e)
1511*0a6a1f1dSLionel Sambuc	add	r2,r2,r1			@ X[i]
1512*0a6a1f1dSLionel Sambuc	ldr	r3,[r14],#4			@ *K256++
1513*0a6a1f1dSLionel Sambuc	add	r8,r8,r2			@ h+=X[i]
1514*0a6a1f1dSLionel Sambuc	str	r2,[sp,#11*4]
1515*0a6a1f1dSLionel Sambuc	eor	r2,r6,r7
1516*0a6a1f1dSLionel Sambuc	add	r8,r8,r0,ror#6	@ h+=Sigma1(e)
1517*0a6a1f1dSLionel Sambuc	and	r2,r2,r5
1518*0a6a1f1dSLionel Sambuc	add	r8,r8,r3			@ h+=K256[i]
1519*0a6a1f1dSLionel Sambuc	eor	r2,r2,r7			@ Ch(e,f,g)
1520*0a6a1f1dSLionel Sambuc	eor	r0,r9,r9,ror#11
1521*0a6a1f1dSLionel Sambuc	add	r8,r8,r2			@ h+=Ch(e,f,g)
1522*0a6a1f1dSLionel Sambuc#if 27==31
1523*0a6a1f1dSLionel Sambuc	and	r3,r3,#0xff
1524*0a6a1f1dSLionel Sambuc	cmp	r3,#0xf2			@ done?
1525*0a6a1f1dSLionel Sambuc#endif
1526*0a6a1f1dSLionel Sambuc#if 27<15
1527*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
1528*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
1529*0a6a1f1dSLionel Sambuc# else
1530*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
1531*0a6a1f1dSLionel Sambuc# endif
1532*0a6a1f1dSLionel Sambuc	eor	r3,r9,r10			@ a^b, b^c in next round
1533*0a6a1f1dSLionel Sambuc#else
1534*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#13*4]		@ from future BODY_16_xx
1535*0a6a1f1dSLionel Sambuc	eor	r3,r9,r10			@ a^b, b^c in next round
1536*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#10*4]	@ from future BODY_16_xx
1537*0a6a1f1dSLionel Sambuc#endif
1538*0a6a1f1dSLionel Sambuc	eor	r0,r0,r9,ror#20	@ Sigma0(a)
1539*0a6a1f1dSLionel Sambuc	and	r12,r12,r3			@ (b^c)&=(a^b)
1540*0a6a1f1dSLionel Sambuc	add	r4,r4,r8			@ d+=h
1541*0a6a1f1dSLionel Sambuc	eor	r12,r12,r10			@ Maj(a,b,c)
1542*0a6a1f1dSLionel Sambuc	add	r8,r8,r0,ror#2	@ h+=Sigma0(a)
1543*0a6a1f1dSLionel Sambuc	@ add	r8,r8,r12			@ h+=Maj(a,b,c)
1544*0a6a1f1dSLionel Sambuc	@ ldr	r2,[sp,#13*4]		@ 28
1545*0a6a1f1dSLionel Sambuc	@ ldr	r1,[sp,#10*4]
1546*0a6a1f1dSLionel Sambuc	mov	r0,r2,ror#7
1547*0a6a1f1dSLionel Sambuc	add	r8,r8,r12			@ h+=Maj(a,b,c) from the past
1548*0a6a1f1dSLionel Sambuc	mov	r12,r1,ror#17
1549*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,ror#18
1550*0a6a1f1dSLionel Sambuc	eor	r12,r12,r1,ror#19
1551*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1552*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#12*4]
1553*0a6a1f1dSLionel Sambuc	eor	r12,r12,r1,lsr#10	@ sigma1(X[i+14])
1554*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#5*4]
1555*0a6a1f1dSLionel Sambuc
1556*0a6a1f1dSLionel Sambuc	add	r12,r12,r0
1557*0a6a1f1dSLionel Sambuc	eor	r0,r4,r4,ror#5	@ from BODY_00_15
1558*0a6a1f1dSLionel Sambuc	add	r2,r2,r12
1559*0a6a1f1dSLionel Sambuc	eor	r0,r0,r4,ror#19	@ Sigma1(e)
1560*0a6a1f1dSLionel Sambuc	add	r2,r2,r1			@ X[i]
1561*0a6a1f1dSLionel Sambuc	ldr	r12,[r14],#4			@ *K256++
1562*0a6a1f1dSLionel Sambuc	add	r7,r7,r2			@ h+=X[i]
1563*0a6a1f1dSLionel Sambuc	str	r2,[sp,#12*4]
1564*0a6a1f1dSLionel Sambuc	eor	r2,r5,r6
1565*0a6a1f1dSLionel Sambuc	add	r7,r7,r0,ror#6	@ h+=Sigma1(e)
1566*0a6a1f1dSLionel Sambuc	and	r2,r2,r4
1567*0a6a1f1dSLionel Sambuc	add	r7,r7,r12			@ h+=K256[i]
1568*0a6a1f1dSLionel Sambuc	eor	r2,r2,r6			@ Ch(e,f,g)
1569*0a6a1f1dSLionel Sambuc	eor	r0,r8,r8,ror#11
1570*0a6a1f1dSLionel Sambuc	add	r7,r7,r2			@ h+=Ch(e,f,g)
1571*0a6a1f1dSLionel Sambuc#if 28==31
1572*0a6a1f1dSLionel Sambuc	and	r12,r12,#0xff
1573*0a6a1f1dSLionel Sambuc	cmp	r12,#0xf2			@ done?
1574*0a6a1f1dSLionel Sambuc#endif
1575*0a6a1f1dSLionel Sambuc#if 28<15
1576*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
1577*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
1578*0a6a1f1dSLionel Sambuc# else
1579*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
1580*0a6a1f1dSLionel Sambuc# endif
1581*0a6a1f1dSLionel Sambuc	eor	r12,r8,r9			@ a^b, b^c in next round
1582*0a6a1f1dSLionel Sambuc#else
1583*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#14*4]		@ from future BODY_16_xx
1584*0a6a1f1dSLionel Sambuc	eor	r12,r8,r9			@ a^b, b^c in next round
1585*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#11*4]	@ from future BODY_16_xx
1586*0a6a1f1dSLionel Sambuc#endif
1587*0a6a1f1dSLionel Sambuc	eor	r0,r0,r8,ror#20	@ Sigma0(a)
1588*0a6a1f1dSLionel Sambuc	and	r3,r3,r12			@ (b^c)&=(a^b)
1589*0a6a1f1dSLionel Sambuc	add	r11,r11,r7			@ d+=h
1590*0a6a1f1dSLionel Sambuc	eor	r3,r3,r9			@ Maj(a,b,c)
1591*0a6a1f1dSLionel Sambuc	add	r7,r7,r0,ror#2	@ h+=Sigma0(a)
1592*0a6a1f1dSLionel Sambuc	@ add	r7,r7,r3			@ h+=Maj(a,b,c)
1593*0a6a1f1dSLionel Sambuc	@ ldr	r2,[sp,#14*4]		@ 29
1594*0a6a1f1dSLionel Sambuc	@ ldr	r1,[sp,#11*4]
1595*0a6a1f1dSLionel Sambuc	mov	r0,r2,ror#7
1596*0a6a1f1dSLionel Sambuc	add	r7,r7,r3			@ h+=Maj(a,b,c) from the past
1597*0a6a1f1dSLionel Sambuc	mov	r3,r1,ror#17
1598*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,ror#18
1599*0a6a1f1dSLionel Sambuc	eor	r3,r3,r1,ror#19
1600*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1601*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#13*4]
1602*0a6a1f1dSLionel Sambuc	eor	r3,r3,r1,lsr#10	@ sigma1(X[i+14])
1603*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#6*4]
1604*0a6a1f1dSLionel Sambuc
1605*0a6a1f1dSLionel Sambuc	add	r3,r3,r0
1606*0a6a1f1dSLionel Sambuc	eor	r0,r11,r11,ror#5	@ from BODY_00_15
1607*0a6a1f1dSLionel Sambuc	add	r2,r2,r3
1608*0a6a1f1dSLionel Sambuc	eor	r0,r0,r11,ror#19	@ Sigma1(e)
1609*0a6a1f1dSLionel Sambuc	add	r2,r2,r1			@ X[i]
1610*0a6a1f1dSLionel Sambuc	ldr	r3,[r14],#4			@ *K256++
1611*0a6a1f1dSLionel Sambuc	add	r6,r6,r2			@ h+=X[i]
1612*0a6a1f1dSLionel Sambuc	str	r2,[sp,#13*4]
1613*0a6a1f1dSLionel Sambuc	eor	r2,r4,r5
1614*0a6a1f1dSLionel Sambuc	add	r6,r6,r0,ror#6	@ h+=Sigma1(e)
1615*0a6a1f1dSLionel Sambuc	and	r2,r2,r11
1616*0a6a1f1dSLionel Sambuc	add	r6,r6,r3			@ h+=K256[i]
1617*0a6a1f1dSLionel Sambuc	eor	r2,r2,r5			@ Ch(e,f,g)
1618*0a6a1f1dSLionel Sambuc	eor	r0,r7,r7,ror#11
1619*0a6a1f1dSLionel Sambuc	add	r6,r6,r2			@ h+=Ch(e,f,g)
1620*0a6a1f1dSLionel Sambuc#if 29==31
1621*0a6a1f1dSLionel Sambuc	and	r3,r3,#0xff
1622*0a6a1f1dSLionel Sambuc	cmp	r3,#0xf2			@ done?
1623*0a6a1f1dSLionel Sambuc#endif
1624*0a6a1f1dSLionel Sambuc#if 29<15
1625*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
1626*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
1627*0a6a1f1dSLionel Sambuc# else
1628*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
1629*0a6a1f1dSLionel Sambuc# endif
1630*0a6a1f1dSLionel Sambuc	eor	r3,r7,r8			@ a^b, b^c in next round
1631*0a6a1f1dSLionel Sambuc#else
1632*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#15*4]		@ from future BODY_16_xx
1633*0a6a1f1dSLionel Sambuc	eor	r3,r7,r8			@ a^b, b^c in next round
1634*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#12*4]	@ from future BODY_16_xx
1635*0a6a1f1dSLionel Sambuc#endif
1636*0a6a1f1dSLionel Sambuc	eor	r0,r0,r7,ror#20	@ Sigma0(a)
1637*0a6a1f1dSLionel Sambuc	and	r12,r12,r3			@ (b^c)&=(a^b)
1638*0a6a1f1dSLionel Sambuc	add	r10,r10,r6			@ d+=h
1639*0a6a1f1dSLionel Sambuc	eor	r12,r12,r8			@ Maj(a,b,c)
1640*0a6a1f1dSLionel Sambuc	add	r6,r6,r0,ror#2	@ h+=Sigma0(a)
1641*0a6a1f1dSLionel Sambuc	@ add	r6,r6,r12			@ h+=Maj(a,b,c)
1642*0a6a1f1dSLionel Sambuc	@ ldr	r2,[sp,#15*4]		@ 30
1643*0a6a1f1dSLionel Sambuc	@ ldr	r1,[sp,#12*4]
1644*0a6a1f1dSLionel Sambuc	mov	r0,r2,ror#7
1645*0a6a1f1dSLionel Sambuc	add	r6,r6,r12			@ h+=Maj(a,b,c) from the past
1646*0a6a1f1dSLionel Sambuc	mov	r12,r1,ror#17
1647*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,ror#18
1648*0a6a1f1dSLionel Sambuc	eor	r12,r12,r1,ror#19
1649*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1650*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#14*4]
1651*0a6a1f1dSLionel Sambuc	eor	r12,r12,r1,lsr#10	@ sigma1(X[i+14])
1652*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#7*4]
1653*0a6a1f1dSLionel Sambuc
1654*0a6a1f1dSLionel Sambuc	add	r12,r12,r0
1655*0a6a1f1dSLionel Sambuc	eor	r0,r10,r10,ror#5	@ from BODY_00_15
1656*0a6a1f1dSLionel Sambuc	add	r2,r2,r12
1657*0a6a1f1dSLionel Sambuc	eor	r0,r0,r10,ror#19	@ Sigma1(e)
1658*0a6a1f1dSLionel Sambuc	add	r2,r2,r1			@ X[i]
1659*0a6a1f1dSLionel Sambuc	ldr	r12,[r14],#4			@ *K256++
1660*0a6a1f1dSLionel Sambuc	add	r5,r5,r2			@ h+=X[i]
1661*0a6a1f1dSLionel Sambuc	str	r2,[sp,#14*4]
1662*0a6a1f1dSLionel Sambuc	eor	r2,r11,r4
1663*0a6a1f1dSLionel Sambuc	add	r5,r5,r0,ror#6	@ h+=Sigma1(e)
1664*0a6a1f1dSLionel Sambuc	and	r2,r2,r10
1665*0a6a1f1dSLionel Sambuc	add	r5,r5,r12			@ h+=K256[i]
1666*0a6a1f1dSLionel Sambuc	eor	r2,r2,r4			@ Ch(e,f,g)
1667*0a6a1f1dSLionel Sambuc	eor	r0,r6,r6,ror#11
1668*0a6a1f1dSLionel Sambuc	add	r5,r5,r2			@ h+=Ch(e,f,g)
1669*0a6a1f1dSLionel Sambuc#if 30==31
1670*0a6a1f1dSLionel Sambuc	and	r12,r12,#0xff
1671*0a6a1f1dSLionel Sambuc	cmp	r12,#0xf2			@ done?
1672*0a6a1f1dSLionel Sambuc#endif
1673*0a6a1f1dSLionel Sambuc#if 30<15
1674*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
1675*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
1676*0a6a1f1dSLionel Sambuc# else
1677*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
1678*0a6a1f1dSLionel Sambuc# endif
1679*0a6a1f1dSLionel Sambuc	eor	r12,r6,r7			@ a^b, b^c in next round
1680*0a6a1f1dSLionel Sambuc#else
1681*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#0*4]		@ from future BODY_16_xx
1682*0a6a1f1dSLionel Sambuc	eor	r12,r6,r7			@ a^b, b^c in next round
1683*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#13*4]	@ from future BODY_16_xx
1684*0a6a1f1dSLionel Sambuc#endif
1685*0a6a1f1dSLionel Sambuc	eor	r0,r0,r6,ror#20	@ Sigma0(a)
1686*0a6a1f1dSLionel Sambuc	and	r3,r3,r12			@ (b^c)&=(a^b)
1687*0a6a1f1dSLionel Sambuc	add	r9,r9,r5			@ d+=h
1688*0a6a1f1dSLionel Sambuc	eor	r3,r3,r7			@ Maj(a,b,c)
1689*0a6a1f1dSLionel Sambuc	add	r5,r5,r0,ror#2	@ h+=Sigma0(a)
1690*0a6a1f1dSLionel Sambuc	@ add	r5,r5,r3			@ h+=Maj(a,b,c)
1691*0a6a1f1dSLionel Sambuc	@ ldr	r2,[sp,#0*4]		@ 31
1692*0a6a1f1dSLionel Sambuc	@ ldr	r1,[sp,#13*4]
1693*0a6a1f1dSLionel Sambuc	mov	r0,r2,ror#7
1694*0a6a1f1dSLionel Sambuc	add	r5,r5,r3			@ h+=Maj(a,b,c) from the past
1695*0a6a1f1dSLionel Sambuc	mov	r3,r1,ror#17
1696*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,ror#18
1697*0a6a1f1dSLionel Sambuc	eor	r3,r3,r1,ror#19
1698*0a6a1f1dSLionel Sambuc	eor	r0,r0,r2,lsr#3	@ sigma0(X[i+1])
1699*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#15*4]
1700*0a6a1f1dSLionel Sambuc	eor	r3,r3,r1,lsr#10	@ sigma1(X[i+14])
1701*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#8*4]
1702*0a6a1f1dSLionel Sambuc
1703*0a6a1f1dSLionel Sambuc	add	r3,r3,r0
1704*0a6a1f1dSLionel Sambuc	eor	r0,r9,r9,ror#5	@ from BODY_00_15
1705*0a6a1f1dSLionel Sambuc	add	r2,r2,r3
1706*0a6a1f1dSLionel Sambuc	eor	r0,r0,r9,ror#19	@ Sigma1(e)
1707*0a6a1f1dSLionel Sambuc	add	r2,r2,r1			@ X[i]
1708*0a6a1f1dSLionel Sambuc	ldr	r3,[r14],#4			@ *K256++
1709*0a6a1f1dSLionel Sambuc	add	r4,r4,r2			@ h+=X[i]
1710*0a6a1f1dSLionel Sambuc	str	r2,[sp,#15*4]
1711*0a6a1f1dSLionel Sambuc	eor	r2,r10,r11
1712*0a6a1f1dSLionel Sambuc	add	r4,r4,r0,ror#6	@ h+=Sigma1(e)
1713*0a6a1f1dSLionel Sambuc	and	r2,r2,r9
1714*0a6a1f1dSLionel Sambuc	add	r4,r4,r3			@ h+=K256[i]
1715*0a6a1f1dSLionel Sambuc	eor	r2,r2,r11			@ Ch(e,f,g)
1716*0a6a1f1dSLionel Sambuc	eor	r0,r5,r5,ror#11
1717*0a6a1f1dSLionel Sambuc	add	r4,r4,r2			@ h+=Ch(e,f,g)
1718*0a6a1f1dSLionel Sambuc#if 31==31
1719*0a6a1f1dSLionel Sambuc	and	r3,r3,#0xff
1720*0a6a1f1dSLionel Sambuc	cmp	r3,#0xf2			@ done?
1721*0a6a1f1dSLionel Sambuc#endif
1722*0a6a1f1dSLionel Sambuc#if 31<15
1723*0a6a1f1dSLionel Sambuc# if __ARM_ARCH__>=7
1724*0a6a1f1dSLionel Sambuc	ldr	r2,[r1],#4			@ prefetch
1725*0a6a1f1dSLionel Sambuc# else
1726*0a6a1f1dSLionel Sambuc	ldrb	r2,[r1,#3]
1727*0a6a1f1dSLionel Sambuc# endif
1728*0a6a1f1dSLionel Sambuc	eor	r3,r5,r6			@ a^b, b^c in next round
1729*0a6a1f1dSLionel Sambuc#else
1730*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#1*4]		@ from future BODY_16_xx
1731*0a6a1f1dSLionel Sambuc	eor	r3,r5,r6			@ a^b, b^c in next round
1732*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#14*4]	@ from future BODY_16_xx
1733*0a6a1f1dSLionel Sambuc#endif
1734*0a6a1f1dSLionel Sambuc	eor	r0,r0,r5,ror#20	@ Sigma0(a)
1735*0a6a1f1dSLionel Sambuc	and	r12,r12,r3			@ (b^c)&=(a^b)
1736*0a6a1f1dSLionel Sambuc	add	r8,r8,r4			@ d+=h
1737*0a6a1f1dSLionel Sambuc	eor	r12,r12,r6			@ Maj(a,b,c)
1738*0a6a1f1dSLionel Sambuc	add	r4,r4,r0,ror#2	@ h+=Sigma0(a)
1739*0a6a1f1dSLionel Sambuc	@ add	r4,r4,r12			@ h+=Maj(a,b,c)
1740*0a6a1f1dSLionel Sambuc	ldreq	r3,[sp,#16*4]		@ pull ctx
1741*0a6a1f1dSLionel Sambuc	bne	.Lrounds_16_xx
1742*0a6a1f1dSLionel Sambuc
1743*0a6a1f1dSLionel Sambuc	add	r4,r4,r12		@ h+=Maj(a,b,c) from the past
1744*0a6a1f1dSLionel Sambuc	ldr	r0,[r3,#0]
1745*0a6a1f1dSLionel Sambuc	ldr	r2,[r3,#4]
1746*0a6a1f1dSLionel Sambuc	ldr	r12,[r3,#8]
1747*0a6a1f1dSLionel Sambuc	add	r4,r4,r0
1748*0a6a1f1dSLionel Sambuc	ldr	r0,[r3,#12]
1749*0a6a1f1dSLionel Sambuc	add	r5,r5,r2
1750*0a6a1f1dSLionel Sambuc	ldr	r2,[r3,#16]
1751*0a6a1f1dSLionel Sambuc	add	r6,r6,r12
1752*0a6a1f1dSLionel Sambuc	ldr	r12,[r3,#20]
1753*0a6a1f1dSLionel Sambuc	add	r7,r7,r0
1754*0a6a1f1dSLionel Sambuc	ldr	r0,[r3,#24]
1755*0a6a1f1dSLionel Sambuc	add	r8,r8,r2
1756*0a6a1f1dSLionel Sambuc	ldr	r2,[r3,#28]
1757*0a6a1f1dSLionel Sambuc	add	r9,r9,r12
1758*0a6a1f1dSLionel Sambuc	ldr	r1,[sp,#17*4]		@ pull inp
1759*0a6a1f1dSLionel Sambuc	ldr	r12,[sp,#18*4]		@ pull inp+len
1760*0a6a1f1dSLionel Sambuc	add	r10,r10,r0
1761*0a6a1f1dSLionel Sambuc	add	r11,r11,r2
1762*0a6a1f1dSLionel Sambuc	stmia	r3,{r4,r5,r6,r7,r8,r9,r10,r11}
1763*0a6a1f1dSLionel Sambuc	cmp	r1,r12
1764*0a6a1f1dSLionel Sambuc	sub	r14,r14,#256	@ rewind Ktbl
1765*0a6a1f1dSLionel Sambuc	bne	.Loop
1766*0a6a1f1dSLionel Sambuc
1767*0a6a1f1dSLionel Sambuc	add	sp,sp,#19*4	@ destroy frame
1768*0a6a1f1dSLionel Sambuc#if __ARM_ARCH__>=5
1769*0a6a1f1dSLionel Sambuc	ldmia	sp!,{r4-r11,pc}
1770*0a6a1f1dSLionel Sambuc#else
1771*0a6a1f1dSLionel Sambuc	ldmia	sp!,{r4-r11,lr}
1772*0a6a1f1dSLionel Sambuc	tst	lr,#1
1773*0a6a1f1dSLionel Sambuc	moveq	pc,lr			@ be binary compatible with V4, yet
1774*0a6a1f1dSLionel Sambuc	.word	0xe12fff1e			@ interoperable with Thumb ISA:-)
1775*0a6a1f1dSLionel Sambuc#endif
1776*0a6a1f1dSLionel Sambuc.size	sha256_block_data_order,.-sha256_block_data_order
1777*0a6a1f1dSLionel Sambuc#if __ARM_MAX_ARCH__>=7
1778*0a6a1f1dSLionel Sambuc.arch	armv7-a
1779*0a6a1f1dSLionel Sambuc.fpu	neon
1780*0a6a1f1dSLionel Sambuc
1781*0a6a1f1dSLionel Sambuc.type	sha256_block_data_order_neon,%function
1782*0a6a1f1dSLionel Sambuc.align	4
1783*0a6a1f1dSLionel Sambucsha256_block_data_order_neon:
1784*0a6a1f1dSLionel Sambuc.LNEON:
1785*0a6a1f1dSLionel Sambuc	stmdb	sp!,{r4-r12,lr}
1786*0a6a1f1dSLionel Sambuc
1787*0a6a1f1dSLionel Sambuc	mov	r12,sp
1788*0a6a1f1dSLionel Sambuc	sub	sp,sp,#16*4+16		@ alloca
1789*0a6a1f1dSLionel Sambuc	sub	r14,r3,#256+32	@ K256
1790*0a6a1f1dSLionel Sambuc	bic	sp,sp,#15		@ align for 128-bit stores
1791*0a6a1f1dSLionel Sambuc
1792*0a6a1f1dSLionel Sambuc	vld1.8		{q0},[r1]!
1793*0a6a1f1dSLionel Sambuc	vld1.8		{q1},[r1]!
1794*0a6a1f1dSLionel Sambuc	vld1.8		{q2},[r1]!
1795*0a6a1f1dSLionel Sambuc	vld1.8		{q3},[r1]!
1796*0a6a1f1dSLionel Sambuc	vld1.32		{q8},[r14,:128]!
1797*0a6a1f1dSLionel Sambuc	vld1.32		{q9},[r14,:128]!
1798*0a6a1f1dSLionel Sambuc	vld1.32		{q10},[r14,:128]!
1799*0a6a1f1dSLionel Sambuc	vld1.32		{q11},[r14,:128]!
1800*0a6a1f1dSLionel Sambuc	vrev32.8	q0,q0		@ yes, even on
1801*0a6a1f1dSLionel Sambuc	str		r0,[sp,#64]
1802*0a6a1f1dSLionel Sambuc	vrev32.8	q1,q1		@ big-endian
1803*0a6a1f1dSLionel Sambuc	str		r1,[sp,#68]
1804*0a6a1f1dSLionel Sambuc	mov		r1,sp
1805*0a6a1f1dSLionel Sambuc	vrev32.8	q2,q2
1806*0a6a1f1dSLionel Sambuc	str		r2,[sp,#72]
1807*0a6a1f1dSLionel Sambuc	vrev32.8	q3,q3
1808*0a6a1f1dSLionel Sambuc	str		r12,[sp,#76]		@ save original sp
1809*0a6a1f1dSLionel Sambuc	vadd.i32	q8,q8,q0
1810*0a6a1f1dSLionel Sambuc	vadd.i32	q9,q9,q1
1811*0a6a1f1dSLionel Sambuc	vst1.32		{q8},[r1,:128]!
1812*0a6a1f1dSLionel Sambuc	vadd.i32	q10,q10,q2
1813*0a6a1f1dSLionel Sambuc	vst1.32		{q9},[r1,:128]!
1814*0a6a1f1dSLionel Sambuc	vadd.i32	q11,q11,q3
1815*0a6a1f1dSLionel Sambuc	vst1.32		{q10},[r1,:128]!
1816*0a6a1f1dSLionel Sambuc	vst1.32		{q11},[r1,:128]!
1817*0a6a1f1dSLionel Sambuc
1818*0a6a1f1dSLionel Sambuc	ldmia		r0,{r4-r11}
1819*0a6a1f1dSLionel Sambuc	sub		r1,r1,#64
1820*0a6a1f1dSLionel Sambuc	ldr		r2,[sp,#0]
1821*0a6a1f1dSLionel Sambuc	eor		r12,r12,r12
1822*0a6a1f1dSLionel Sambuc	eor		r3,r5,r6
1823*0a6a1f1dSLionel Sambuc	b		.L_00_48
1824*0a6a1f1dSLionel Sambuc
1825*0a6a1f1dSLionel Sambuc.align	4
1826*0a6a1f1dSLionel Sambuc.L_00_48:
1827*0a6a1f1dSLionel Sambuc	vext.8	q8,q0,q1,#4
1828*0a6a1f1dSLionel Sambuc	add	r11,r11,r2
1829*0a6a1f1dSLionel Sambuc	eor	r2,r9,r10
1830*0a6a1f1dSLionel Sambuc	eor	r0,r8,r8,ror#5
1831*0a6a1f1dSLionel Sambuc	vext.8	q9,q2,q3,#4
1832*0a6a1f1dSLionel Sambuc	add	r4,r4,r12
1833*0a6a1f1dSLionel Sambuc	and	r2,r2,r8
1834*0a6a1f1dSLionel Sambuc	eor	r12,r0,r8,ror#19
1835*0a6a1f1dSLionel Sambuc	vshr.u32	q10,q8,#7
1836*0a6a1f1dSLionel Sambuc	eor	r0,r4,r4,ror#11
1837*0a6a1f1dSLionel Sambuc	eor	r2,r2,r10
1838*0a6a1f1dSLionel Sambuc	vadd.i32	q0,q0,q9
1839*0a6a1f1dSLionel Sambuc	add	r11,r11,r12,ror#6
1840*0a6a1f1dSLionel Sambuc	eor	r12,r4,r5
1841*0a6a1f1dSLionel Sambuc	vshr.u32	q9,q8,#3
1842*0a6a1f1dSLionel Sambuc	eor	r0,r0,r4,ror#20
1843*0a6a1f1dSLionel Sambuc	add	r11,r11,r2
1844*0a6a1f1dSLionel Sambuc	vsli.32	q10,q8,#25
1845*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#4]
1846*0a6a1f1dSLionel Sambuc	and	r3,r3,r12
1847*0a6a1f1dSLionel Sambuc	vshr.u32	q11,q8,#18
1848*0a6a1f1dSLionel Sambuc	add	r7,r7,r11
1849*0a6a1f1dSLionel Sambuc	add	r11,r11,r0,ror#2
1850*0a6a1f1dSLionel Sambuc	eor	r3,r3,r5
1851*0a6a1f1dSLionel Sambuc	veor	q9,q9,q10
1852*0a6a1f1dSLionel Sambuc	add	r10,r10,r2
1853*0a6a1f1dSLionel Sambuc	vsli.32	q11,q8,#14
1854*0a6a1f1dSLionel Sambuc	eor	r2,r8,r9
1855*0a6a1f1dSLionel Sambuc	eor	r0,r7,r7,ror#5
1856*0a6a1f1dSLionel Sambuc	vshr.u32	d24,d7,#17
1857*0a6a1f1dSLionel Sambuc	add	r11,r11,r3
1858*0a6a1f1dSLionel Sambuc	and	r2,r2,r7
1859*0a6a1f1dSLionel Sambuc	veor	q9,q9,q11
1860*0a6a1f1dSLionel Sambuc	eor	r3,r0,r7,ror#19
1861*0a6a1f1dSLionel Sambuc	eor	r0,r11,r11,ror#11
1862*0a6a1f1dSLionel Sambuc	vsli.32	d24,d7,#15
1863*0a6a1f1dSLionel Sambuc	eor	r2,r2,r9
1864*0a6a1f1dSLionel Sambuc	add	r10,r10,r3,ror#6
1865*0a6a1f1dSLionel Sambuc	vshr.u32	d25,d7,#10
1866*0a6a1f1dSLionel Sambuc	eor	r3,r11,r4
1867*0a6a1f1dSLionel Sambuc	eor	r0,r0,r11,ror#20
1868*0a6a1f1dSLionel Sambuc	vadd.i32	q0,q0,q9
1869*0a6a1f1dSLionel Sambuc	add	r10,r10,r2
1870*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#8]
1871*0a6a1f1dSLionel Sambuc	veor	d25,d25,d24
1872*0a6a1f1dSLionel Sambuc	and	r12,r12,r3
1873*0a6a1f1dSLionel Sambuc	add	r6,r6,r10
1874*0a6a1f1dSLionel Sambuc	vshr.u32	d24,d7,#19
1875*0a6a1f1dSLionel Sambuc	add	r10,r10,r0,ror#2
1876*0a6a1f1dSLionel Sambuc	eor	r12,r12,r4
1877*0a6a1f1dSLionel Sambuc	vsli.32	d24,d7,#13
1878*0a6a1f1dSLionel Sambuc	add	r9,r9,r2
1879*0a6a1f1dSLionel Sambuc	eor	r2,r7,r8
1880*0a6a1f1dSLionel Sambuc	veor	d25,d25,d24
1881*0a6a1f1dSLionel Sambuc	eor	r0,r6,r6,ror#5
1882*0a6a1f1dSLionel Sambuc	add	r10,r10,r12
1883*0a6a1f1dSLionel Sambuc	vadd.i32	d0,d0,d25
1884*0a6a1f1dSLionel Sambuc	and	r2,r2,r6
1885*0a6a1f1dSLionel Sambuc	eor	r12,r0,r6,ror#19
1886*0a6a1f1dSLionel Sambuc	vshr.u32	d24,d0,#17
1887*0a6a1f1dSLionel Sambuc	eor	r0,r10,r10,ror#11
1888*0a6a1f1dSLionel Sambuc	eor	r2,r2,r8
1889*0a6a1f1dSLionel Sambuc	vsli.32	d24,d0,#15
1890*0a6a1f1dSLionel Sambuc	add	r9,r9,r12,ror#6
1891*0a6a1f1dSLionel Sambuc	eor	r12,r10,r11
1892*0a6a1f1dSLionel Sambuc	vshr.u32	d25,d0,#10
1893*0a6a1f1dSLionel Sambuc	eor	r0,r0,r10,ror#20
1894*0a6a1f1dSLionel Sambuc	add	r9,r9,r2
1895*0a6a1f1dSLionel Sambuc	veor	d25,d25,d24
1896*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#12]
1897*0a6a1f1dSLionel Sambuc	and	r3,r3,r12
1898*0a6a1f1dSLionel Sambuc	vshr.u32	d24,d0,#19
1899*0a6a1f1dSLionel Sambuc	add	r5,r5,r9
1900*0a6a1f1dSLionel Sambuc	add	r9,r9,r0,ror#2
1901*0a6a1f1dSLionel Sambuc	eor	r3,r3,r11
1902*0a6a1f1dSLionel Sambuc	vld1.32	{q8},[r14,:128]!
1903*0a6a1f1dSLionel Sambuc	add	r8,r8,r2
1904*0a6a1f1dSLionel Sambuc	vsli.32	d24,d0,#13
1905*0a6a1f1dSLionel Sambuc	eor	r2,r6,r7
1906*0a6a1f1dSLionel Sambuc	eor	r0,r5,r5,ror#5
1907*0a6a1f1dSLionel Sambuc	veor	d25,d25,d24
1908*0a6a1f1dSLionel Sambuc	add	r9,r9,r3
1909*0a6a1f1dSLionel Sambuc	and	r2,r2,r5
1910*0a6a1f1dSLionel Sambuc	vadd.i32	d1,d1,d25
1911*0a6a1f1dSLionel Sambuc	eor	r3,r0,r5,ror#19
1912*0a6a1f1dSLionel Sambuc	eor	r0,r9,r9,ror#11
1913*0a6a1f1dSLionel Sambuc	vadd.i32	q8,q8,q0
1914*0a6a1f1dSLionel Sambuc	eor	r2,r2,r7
1915*0a6a1f1dSLionel Sambuc	add	r8,r8,r3,ror#6
1916*0a6a1f1dSLionel Sambuc	eor	r3,r9,r10
1917*0a6a1f1dSLionel Sambuc	eor	r0,r0,r9,ror#20
1918*0a6a1f1dSLionel Sambuc	add	r8,r8,r2
1919*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#16]
1920*0a6a1f1dSLionel Sambuc	and	r12,r12,r3
1921*0a6a1f1dSLionel Sambuc	add	r4,r4,r8
1922*0a6a1f1dSLionel Sambuc	vst1.32	{q8},[r1,:128]!
1923*0a6a1f1dSLionel Sambuc	add	r8,r8,r0,ror#2
1924*0a6a1f1dSLionel Sambuc	eor	r12,r12,r10
1925*0a6a1f1dSLionel Sambuc	vext.8	q8,q1,q2,#4
1926*0a6a1f1dSLionel Sambuc	add	r7,r7,r2
1927*0a6a1f1dSLionel Sambuc	eor	r2,r5,r6
1928*0a6a1f1dSLionel Sambuc	eor	r0,r4,r4,ror#5
1929*0a6a1f1dSLionel Sambuc	vext.8	q9,q3,q0,#4
1930*0a6a1f1dSLionel Sambuc	add	r8,r8,r12
1931*0a6a1f1dSLionel Sambuc	and	r2,r2,r4
1932*0a6a1f1dSLionel Sambuc	eor	r12,r0,r4,ror#19
1933*0a6a1f1dSLionel Sambuc	vshr.u32	q10,q8,#7
1934*0a6a1f1dSLionel Sambuc	eor	r0,r8,r8,ror#11
1935*0a6a1f1dSLionel Sambuc	eor	r2,r2,r6
1936*0a6a1f1dSLionel Sambuc	vadd.i32	q1,q1,q9
1937*0a6a1f1dSLionel Sambuc	add	r7,r7,r12,ror#6
1938*0a6a1f1dSLionel Sambuc	eor	r12,r8,r9
1939*0a6a1f1dSLionel Sambuc	vshr.u32	q9,q8,#3
1940*0a6a1f1dSLionel Sambuc	eor	r0,r0,r8,ror#20
1941*0a6a1f1dSLionel Sambuc	add	r7,r7,r2
1942*0a6a1f1dSLionel Sambuc	vsli.32	q10,q8,#25
1943*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#20]
1944*0a6a1f1dSLionel Sambuc	and	r3,r3,r12
1945*0a6a1f1dSLionel Sambuc	vshr.u32	q11,q8,#18
1946*0a6a1f1dSLionel Sambuc	add	r11,r11,r7
1947*0a6a1f1dSLionel Sambuc	add	r7,r7,r0,ror#2
1948*0a6a1f1dSLionel Sambuc	eor	r3,r3,r9
1949*0a6a1f1dSLionel Sambuc	veor	q9,q9,q10
1950*0a6a1f1dSLionel Sambuc	add	r6,r6,r2
1951*0a6a1f1dSLionel Sambuc	vsli.32	q11,q8,#14
1952*0a6a1f1dSLionel Sambuc	eor	r2,r4,r5
1953*0a6a1f1dSLionel Sambuc	eor	r0,r11,r11,ror#5
1954*0a6a1f1dSLionel Sambuc	vshr.u32	d24,d1,#17
1955*0a6a1f1dSLionel Sambuc	add	r7,r7,r3
1956*0a6a1f1dSLionel Sambuc	and	r2,r2,r11
1957*0a6a1f1dSLionel Sambuc	veor	q9,q9,q11
1958*0a6a1f1dSLionel Sambuc	eor	r3,r0,r11,ror#19
1959*0a6a1f1dSLionel Sambuc	eor	r0,r7,r7,ror#11
1960*0a6a1f1dSLionel Sambuc	vsli.32	d24,d1,#15
1961*0a6a1f1dSLionel Sambuc	eor	r2,r2,r5
1962*0a6a1f1dSLionel Sambuc	add	r6,r6,r3,ror#6
1963*0a6a1f1dSLionel Sambuc	vshr.u32	d25,d1,#10
1964*0a6a1f1dSLionel Sambuc	eor	r3,r7,r8
1965*0a6a1f1dSLionel Sambuc	eor	r0,r0,r7,ror#20
1966*0a6a1f1dSLionel Sambuc	vadd.i32	q1,q1,q9
1967*0a6a1f1dSLionel Sambuc	add	r6,r6,r2
1968*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#24]
1969*0a6a1f1dSLionel Sambuc	veor	d25,d25,d24
1970*0a6a1f1dSLionel Sambuc	and	r12,r12,r3
1971*0a6a1f1dSLionel Sambuc	add	r10,r10,r6
1972*0a6a1f1dSLionel Sambuc	vshr.u32	d24,d1,#19
1973*0a6a1f1dSLionel Sambuc	add	r6,r6,r0,ror#2
1974*0a6a1f1dSLionel Sambuc	eor	r12,r12,r8
1975*0a6a1f1dSLionel Sambuc	vsli.32	d24,d1,#13
1976*0a6a1f1dSLionel Sambuc	add	r5,r5,r2
1977*0a6a1f1dSLionel Sambuc	eor	r2,r11,r4
1978*0a6a1f1dSLionel Sambuc	veor	d25,d25,d24
1979*0a6a1f1dSLionel Sambuc	eor	r0,r10,r10,ror#5
1980*0a6a1f1dSLionel Sambuc	add	r6,r6,r12
1981*0a6a1f1dSLionel Sambuc	vadd.i32	d2,d2,d25
1982*0a6a1f1dSLionel Sambuc	and	r2,r2,r10
1983*0a6a1f1dSLionel Sambuc	eor	r12,r0,r10,ror#19
1984*0a6a1f1dSLionel Sambuc	vshr.u32	d24,d2,#17
1985*0a6a1f1dSLionel Sambuc	eor	r0,r6,r6,ror#11
1986*0a6a1f1dSLionel Sambuc	eor	r2,r2,r4
1987*0a6a1f1dSLionel Sambuc	vsli.32	d24,d2,#15
1988*0a6a1f1dSLionel Sambuc	add	r5,r5,r12,ror#6
1989*0a6a1f1dSLionel Sambuc	eor	r12,r6,r7
1990*0a6a1f1dSLionel Sambuc	vshr.u32	d25,d2,#10
1991*0a6a1f1dSLionel Sambuc	eor	r0,r0,r6,ror#20
1992*0a6a1f1dSLionel Sambuc	add	r5,r5,r2
1993*0a6a1f1dSLionel Sambuc	veor	d25,d25,d24
1994*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#28]
1995*0a6a1f1dSLionel Sambuc	and	r3,r3,r12
1996*0a6a1f1dSLionel Sambuc	vshr.u32	d24,d2,#19
1997*0a6a1f1dSLionel Sambuc	add	r9,r9,r5
1998*0a6a1f1dSLionel Sambuc	add	r5,r5,r0,ror#2
1999*0a6a1f1dSLionel Sambuc	eor	r3,r3,r7
2000*0a6a1f1dSLionel Sambuc	vld1.32	{q8},[r14,:128]!
2001*0a6a1f1dSLionel Sambuc	add	r4,r4,r2
2002*0a6a1f1dSLionel Sambuc	vsli.32	d24,d2,#13
2003*0a6a1f1dSLionel Sambuc	eor	r2,r10,r11
2004*0a6a1f1dSLionel Sambuc	eor	r0,r9,r9,ror#5
2005*0a6a1f1dSLionel Sambuc	veor	d25,d25,d24
2006*0a6a1f1dSLionel Sambuc	add	r5,r5,r3
2007*0a6a1f1dSLionel Sambuc	and	r2,r2,r9
2008*0a6a1f1dSLionel Sambuc	vadd.i32	d3,d3,d25
2009*0a6a1f1dSLionel Sambuc	eor	r3,r0,r9,ror#19
2010*0a6a1f1dSLionel Sambuc	eor	r0,r5,r5,ror#11
2011*0a6a1f1dSLionel Sambuc	vadd.i32	q8,q8,q1
2012*0a6a1f1dSLionel Sambuc	eor	r2,r2,r11
2013*0a6a1f1dSLionel Sambuc	add	r4,r4,r3,ror#6
2014*0a6a1f1dSLionel Sambuc	eor	r3,r5,r6
2015*0a6a1f1dSLionel Sambuc	eor	r0,r0,r5,ror#20
2016*0a6a1f1dSLionel Sambuc	add	r4,r4,r2
2017*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#32]
2018*0a6a1f1dSLionel Sambuc	and	r12,r12,r3
2019*0a6a1f1dSLionel Sambuc	add	r8,r8,r4
2020*0a6a1f1dSLionel Sambuc	vst1.32	{q8},[r1,:128]!
2021*0a6a1f1dSLionel Sambuc	add	r4,r4,r0,ror#2
2022*0a6a1f1dSLionel Sambuc	eor	r12,r12,r6
2023*0a6a1f1dSLionel Sambuc	vext.8	q8,q2,q3,#4
2024*0a6a1f1dSLionel Sambuc	add	r11,r11,r2
2025*0a6a1f1dSLionel Sambuc	eor	r2,r9,r10
2026*0a6a1f1dSLionel Sambuc	eor	r0,r8,r8,ror#5
2027*0a6a1f1dSLionel Sambuc	vext.8	q9,q0,q1,#4
2028*0a6a1f1dSLionel Sambuc	add	r4,r4,r12
2029*0a6a1f1dSLionel Sambuc	and	r2,r2,r8
2030*0a6a1f1dSLionel Sambuc	eor	r12,r0,r8,ror#19
2031*0a6a1f1dSLionel Sambuc	vshr.u32	q10,q8,#7
2032*0a6a1f1dSLionel Sambuc	eor	r0,r4,r4,ror#11
2033*0a6a1f1dSLionel Sambuc	eor	r2,r2,r10
2034*0a6a1f1dSLionel Sambuc	vadd.i32	q2,q2,q9
2035*0a6a1f1dSLionel Sambuc	add	r11,r11,r12,ror#6
2036*0a6a1f1dSLionel Sambuc	eor	r12,r4,r5
2037*0a6a1f1dSLionel Sambuc	vshr.u32	q9,q8,#3
2038*0a6a1f1dSLionel Sambuc	eor	r0,r0,r4,ror#20
2039*0a6a1f1dSLionel Sambuc	add	r11,r11,r2
2040*0a6a1f1dSLionel Sambuc	vsli.32	q10,q8,#25
2041*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#36]
2042*0a6a1f1dSLionel Sambuc	and	r3,r3,r12
2043*0a6a1f1dSLionel Sambuc	vshr.u32	q11,q8,#18
2044*0a6a1f1dSLionel Sambuc	add	r7,r7,r11
2045*0a6a1f1dSLionel Sambuc	add	r11,r11,r0,ror#2
2046*0a6a1f1dSLionel Sambuc	eor	r3,r3,r5
2047*0a6a1f1dSLionel Sambuc	veor	q9,q9,q10
2048*0a6a1f1dSLionel Sambuc	add	r10,r10,r2
2049*0a6a1f1dSLionel Sambuc	vsli.32	q11,q8,#14
2050*0a6a1f1dSLionel Sambuc	eor	r2,r8,r9
2051*0a6a1f1dSLionel Sambuc	eor	r0,r7,r7,ror#5
2052*0a6a1f1dSLionel Sambuc	vshr.u32	d24,d3,#17
2053*0a6a1f1dSLionel Sambuc	add	r11,r11,r3
2054*0a6a1f1dSLionel Sambuc	and	r2,r2,r7
2055*0a6a1f1dSLionel Sambuc	veor	q9,q9,q11
2056*0a6a1f1dSLionel Sambuc	eor	r3,r0,r7,ror#19
2057*0a6a1f1dSLionel Sambuc	eor	r0,r11,r11,ror#11
2058*0a6a1f1dSLionel Sambuc	vsli.32	d24,d3,#15
2059*0a6a1f1dSLionel Sambuc	eor	r2,r2,r9
2060*0a6a1f1dSLionel Sambuc	add	r10,r10,r3,ror#6
2061*0a6a1f1dSLionel Sambuc	vshr.u32	d25,d3,#10
2062*0a6a1f1dSLionel Sambuc	eor	r3,r11,r4
2063*0a6a1f1dSLionel Sambuc	eor	r0,r0,r11,ror#20
2064*0a6a1f1dSLionel Sambuc	vadd.i32	q2,q2,q9
2065*0a6a1f1dSLionel Sambuc	add	r10,r10,r2
2066*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#40]
2067*0a6a1f1dSLionel Sambuc	veor	d25,d25,d24
2068*0a6a1f1dSLionel Sambuc	and	r12,r12,r3
2069*0a6a1f1dSLionel Sambuc	add	r6,r6,r10
2070*0a6a1f1dSLionel Sambuc	vshr.u32	d24,d3,#19
2071*0a6a1f1dSLionel Sambuc	add	r10,r10,r0,ror#2
2072*0a6a1f1dSLionel Sambuc	eor	r12,r12,r4
2073*0a6a1f1dSLionel Sambuc	vsli.32	d24,d3,#13
2074*0a6a1f1dSLionel Sambuc	add	r9,r9,r2
2075*0a6a1f1dSLionel Sambuc	eor	r2,r7,r8
2076*0a6a1f1dSLionel Sambuc	veor	d25,d25,d24
2077*0a6a1f1dSLionel Sambuc	eor	r0,r6,r6,ror#5
2078*0a6a1f1dSLionel Sambuc	add	r10,r10,r12
2079*0a6a1f1dSLionel Sambuc	vadd.i32	d4,d4,d25
2080*0a6a1f1dSLionel Sambuc	and	r2,r2,r6
2081*0a6a1f1dSLionel Sambuc	eor	r12,r0,r6,ror#19
2082*0a6a1f1dSLionel Sambuc	vshr.u32	d24,d4,#17
2083*0a6a1f1dSLionel Sambuc	eor	r0,r10,r10,ror#11
2084*0a6a1f1dSLionel Sambuc	eor	r2,r2,r8
2085*0a6a1f1dSLionel Sambuc	vsli.32	d24,d4,#15
2086*0a6a1f1dSLionel Sambuc	add	r9,r9,r12,ror#6
2087*0a6a1f1dSLionel Sambuc	eor	r12,r10,r11
2088*0a6a1f1dSLionel Sambuc	vshr.u32	d25,d4,#10
2089*0a6a1f1dSLionel Sambuc	eor	r0,r0,r10,ror#20
2090*0a6a1f1dSLionel Sambuc	add	r9,r9,r2
2091*0a6a1f1dSLionel Sambuc	veor	d25,d25,d24
2092*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#44]
2093*0a6a1f1dSLionel Sambuc	and	r3,r3,r12
2094*0a6a1f1dSLionel Sambuc	vshr.u32	d24,d4,#19
2095*0a6a1f1dSLionel Sambuc	add	r5,r5,r9
2096*0a6a1f1dSLionel Sambuc	add	r9,r9,r0,ror#2
2097*0a6a1f1dSLionel Sambuc	eor	r3,r3,r11
2098*0a6a1f1dSLionel Sambuc	vld1.32	{q8},[r14,:128]!
2099*0a6a1f1dSLionel Sambuc	add	r8,r8,r2
2100*0a6a1f1dSLionel Sambuc	vsli.32	d24,d4,#13
2101*0a6a1f1dSLionel Sambuc	eor	r2,r6,r7
2102*0a6a1f1dSLionel Sambuc	eor	r0,r5,r5,ror#5
2103*0a6a1f1dSLionel Sambuc	veor	d25,d25,d24
2104*0a6a1f1dSLionel Sambuc	add	r9,r9,r3
2105*0a6a1f1dSLionel Sambuc	and	r2,r2,r5
2106*0a6a1f1dSLionel Sambuc	vadd.i32	d5,d5,d25
2107*0a6a1f1dSLionel Sambuc	eor	r3,r0,r5,ror#19
2108*0a6a1f1dSLionel Sambuc	eor	r0,r9,r9,ror#11
2109*0a6a1f1dSLionel Sambuc	vadd.i32	q8,q8,q2
2110*0a6a1f1dSLionel Sambuc	eor	r2,r2,r7
2111*0a6a1f1dSLionel Sambuc	add	r8,r8,r3,ror#6
2112*0a6a1f1dSLionel Sambuc	eor	r3,r9,r10
2113*0a6a1f1dSLionel Sambuc	eor	r0,r0,r9,ror#20
2114*0a6a1f1dSLionel Sambuc	add	r8,r8,r2
2115*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#48]
2116*0a6a1f1dSLionel Sambuc	and	r12,r12,r3
2117*0a6a1f1dSLionel Sambuc	add	r4,r4,r8
2118*0a6a1f1dSLionel Sambuc	vst1.32	{q8},[r1,:128]!
2119*0a6a1f1dSLionel Sambuc	add	r8,r8,r0,ror#2
2120*0a6a1f1dSLionel Sambuc	eor	r12,r12,r10
2121*0a6a1f1dSLionel Sambuc	vext.8	q8,q3,q0,#4
2122*0a6a1f1dSLionel Sambuc	add	r7,r7,r2
2123*0a6a1f1dSLionel Sambuc	eor	r2,r5,r6
2124*0a6a1f1dSLionel Sambuc	eor	r0,r4,r4,ror#5
2125*0a6a1f1dSLionel Sambuc	vext.8	q9,q1,q2,#4
2126*0a6a1f1dSLionel Sambuc	add	r8,r8,r12
2127*0a6a1f1dSLionel Sambuc	and	r2,r2,r4
2128*0a6a1f1dSLionel Sambuc	eor	r12,r0,r4,ror#19
2129*0a6a1f1dSLionel Sambuc	vshr.u32	q10,q8,#7
2130*0a6a1f1dSLionel Sambuc	eor	r0,r8,r8,ror#11
2131*0a6a1f1dSLionel Sambuc	eor	r2,r2,r6
2132*0a6a1f1dSLionel Sambuc	vadd.i32	q3,q3,q9
2133*0a6a1f1dSLionel Sambuc	add	r7,r7,r12,ror#6
2134*0a6a1f1dSLionel Sambuc	eor	r12,r8,r9
2135*0a6a1f1dSLionel Sambuc	vshr.u32	q9,q8,#3
2136*0a6a1f1dSLionel Sambuc	eor	r0,r0,r8,ror#20
2137*0a6a1f1dSLionel Sambuc	add	r7,r7,r2
2138*0a6a1f1dSLionel Sambuc	vsli.32	q10,q8,#25
2139*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#52]
2140*0a6a1f1dSLionel Sambuc	and	r3,r3,r12
2141*0a6a1f1dSLionel Sambuc	vshr.u32	q11,q8,#18
2142*0a6a1f1dSLionel Sambuc	add	r11,r11,r7
2143*0a6a1f1dSLionel Sambuc	add	r7,r7,r0,ror#2
2144*0a6a1f1dSLionel Sambuc	eor	r3,r3,r9
2145*0a6a1f1dSLionel Sambuc	veor	q9,q9,q10
2146*0a6a1f1dSLionel Sambuc	add	r6,r6,r2
2147*0a6a1f1dSLionel Sambuc	vsli.32	q11,q8,#14
2148*0a6a1f1dSLionel Sambuc	eor	r2,r4,r5
2149*0a6a1f1dSLionel Sambuc	eor	r0,r11,r11,ror#5
2150*0a6a1f1dSLionel Sambuc	vshr.u32	d24,d5,#17
2151*0a6a1f1dSLionel Sambuc	add	r7,r7,r3
2152*0a6a1f1dSLionel Sambuc	and	r2,r2,r11
2153*0a6a1f1dSLionel Sambuc	veor	q9,q9,q11
2154*0a6a1f1dSLionel Sambuc	eor	r3,r0,r11,ror#19
2155*0a6a1f1dSLionel Sambuc	eor	r0,r7,r7,ror#11
2156*0a6a1f1dSLionel Sambuc	vsli.32	d24,d5,#15
2157*0a6a1f1dSLionel Sambuc	eor	r2,r2,r5
2158*0a6a1f1dSLionel Sambuc	add	r6,r6,r3,ror#6
2159*0a6a1f1dSLionel Sambuc	vshr.u32	d25,d5,#10
2160*0a6a1f1dSLionel Sambuc	eor	r3,r7,r8
2161*0a6a1f1dSLionel Sambuc	eor	r0,r0,r7,ror#20
2162*0a6a1f1dSLionel Sambuc	vadd.i32	q3,q3,q9
2163*0a6a1f1dSLionel Sambuc	add	r6,r6,r2
2164*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#56]
2165*0a6a1f1dSLionel Sambuc	veor	d25,d25,d24
2166*0a6a1f1dSLionel Sambuc	and	r12,r12,r3
2167*0a6a1f1dSLionel Sambuc	add	r10,r10,r6
2168*0a6a1f1dSLionel Sambuc	vshr.u32	d24,d5,#19
2169*0a6a1f1dSLionel Sambuc	add	r6,r6,r0,ror#2
2170*0a6a1f1dSLionel Sambuc	eor	r12,r12,r8
2171*0a6a1f1dSLionel Sambuc	vsli.32	d24,d5,#13
2172*0a6a1f1dSLionel Sambuc	add	r5,r5,r2
2173*0a6a1f1dSLionel Sambuc	eor	r2,r11,r4
2174*0a6a1f1dSLionel Sambuc	veor	d25,d25,d24
2175*0a6a1f1dSLionel Sambuc	eor	r0,r10,r10,ror#5
2176*0a6a1f1dSLionel Sambuc	add	r6,r6,r12
2177*0a6a1f1dSLionel Sambuc	vadd.i32	d6,d6,d25
2178*0a6a1f1dSLionel Sambuc	and	r2,r2,r10
2179*0a6a1f1dSLionel Sambuc	eor	r12,r0,r10,ror#19
2180*0a6a1f1dSLionel Sambuc	vshr.u32	d24,d6,#17
2181*0a6a1f1dSLionel Sambuc	eor	r0,r6,r6,ror#11
2182*0a6a1f1dSLionel Sambuc	eor	r2,r2,r4
2183*0a6a1f1dSLionel Sambuc	vsli.32	d24,d6,#15
2184*0a6a1f1dSLionel Sambuc	add	r5,r5,r12,ror#6
2185*0a6a1f1dSLionel Sambuc	eor	r12,r6,r7
2186*0a6a1f1dSLionel Sambuc	vshr.u32	d25,d6,#10
2187*0a6a1f1dSLionel Sambuc	eor	r0,r0,r6,ror#20
2188*0a6a1f1dSLionel Sambuc	add	r5,r5,r2
2189*0a6a1f1dSLionel Sambuc	veor	d25,d25,d24
2190*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#60]
2191*0a6a1f1dSLionel Sambuc	and	r3,r3,r12
2192*0a6a1f1dSLionel Sambuc	vshr.u32	d24,d6,#19
2193*0a6a1f1dSLionel Sambuc	add	r9,r9,r5
2194*0a6a1f1dSLionel Sambuc	add	r5,r5,r0,ror#2
2195*0a6a1f1dSLionel Sambuc	eor	r3,r3,r7
2196*0a6a1f1dSLionel Sambuc	vld1.32	{q8},[r14,:128]!
2197*0a6a1f1dSLionel Sambuc	add	r4,r4,r2
2198*0a6a1f1dSLionel Sambuc	vsli.32	d24,d6,#13
2199*0a6a1f1dSLionel Sambuc	eor	r2,r10,r11
2200*0a6a1f1dSLionel Sambuc	eor	r0,r9,r9,ror#5
2201*0a6a1f1dSLionel Sambuc	veor	d25,d25,d24
2202*0a6a1f1dSLionel Sambuc	add	r5,r5,r3
2203*0a6a1f1dSLionel Sambuc	and	r2,r2,r9
2204*0a6a1f1dSLionel Sambuc	vadd.i32	d7,d7,d25
2205*0a6a1f1dSLionel Sambuc	eor	r3,r0,r9,ror#19
2206*0a6a1f1dSLionel Sambuc	eor	r0,r5,r5,ror#11
2207*0a6a1f1dSLionel Sambuc	vadd.i32	q8,q8,q3
2208*0a6a1f1dSLionel Sambuc	eor	r2,r2,r11
2209*0a6a1f1dSLionel Sambuc	add	r4,r4,r3,ror#6
2210*0a6a1f1dSLionel Sambuc	eor	r3,r5,r6
2211*0a6a1f1dSLionel Sambuc	eor	r0,r0,r5,ror#20
2212*0a6a1f1dSLionel Sambuc	add	r4,r4,r2
2213*0a6a1f1dSLionel Sambuc	ldr	r2,[r14]
2214*0a6a1f1dSLionel Sambuc	and	r12,r12,r3
2215*0a6a1f1dSLionel Sambuc	add	r8,r8,r4
2216*0a6a1f1dSLionel Sambuc	vst1.32	{q8},[r1,:128]!
2217*0a6a1f1dSLionel Sambuc	add	r4,r4,r0,ror#2
2218*0a6a1f1dSLionel Sambuc	eor	r12,r12,r6
2219*0a6a1f1dSLionel Sambuc	teq	r2,#0				@ check for K256 terminator
2220*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#0]
2221*0a6a1f1dSLionel Sambuc	sub	r1,r1,#64
2222*0a6a1f1dSLionel Sambuc	bne	.L_00_48
2223*0a6a1f1dSLionel Sambuc
2224*0a6a1f1dSLionel Sambuc	ldr		r1,[sp,#68]
2225*0a6a1f1dSLionel Sambuc	ldr		r0,[sp,#72]
2226*0a6a1f1dSLionel Sambuc	sub		r14,r14,#256	@ rewind r14
2227*0a6a1f1dSLionel Sambuc	teq		r1,r0
2228*0a6a1f1dSLionel Sambuc	subeq		r1,r1,#64		@ avoid SEGV
2229*0a6a1f1dSLionel Sambuc	vld1.8		{q0},[r1]!		@ load next input block
2230*0a6a1f1dSLionel Sambuc	vld1.8		{q1},[r1]!
2231*0a6a1f1dSLionel Sambuc	vld1.8		{q2},[r1]!
2232*0a6a1f1dSLionel Sambuc	vld1.8		{q3},[r1]!
2233*0a6a1f1dSLionel Sambuc	strne		r1,[sp,#68]
2234*0a6a1f1dSLionel Sambuc	mov		r1,sp
2235*0a6a1f1dSLionel Sambuc	add	r11,r11,r2
2236*0a6a1f1dSLionel Sambuc	eor	r2,r9,r10
2237*0a6a1f1dSLionel Sambuc	eor	r0,r8,r8,ror#5
2238*0a6a1f1dSLionel Sambuc	add	r4,r4,r12
2239*0a6a1f1dSLionel Sambuc	vld1.32	{q8},[r14,:128]!
2240*0a6a1f1dSLionel Sambuc	and	r2,r2,r8
2241*0a6a1f1dSLionel Sambuc	eor	r12,r0,r8,ror#19
2242*0a6a1f1dSLionel Sambuc	eor	r0,r4,r4,ror#11
2243*0a6a1f1dSLionel Sambuc	eor	r2,r2,r10
2244*0a6a1f1dSLionel Sambuc	vrev32.8	q0,q0
2245*0a6a1f1dSLionel Sambuc	add	r11,r11,r12,ror#6
2246*0a6a1f1dSLionel Sambuc	eor	r12,r4,r5
2247*0a6a1f1dSLionel Sambuc	eor	r0,r0,r4,ror#20
2248*0a6a1f1dSLionel Sambuc	add	r11,r11,r2
2249*0a6a1f1dSLionel Sambuc	vadd.i32	q8,q8,q0
2250*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#4]
2251*0a6a1f1dSLionel Sambuc	and	r3,r3,r12
2252*0a6a1f1dSLionel Sambuc	add	r7,r7,r11
2253*0a6a1f1dSLionel Sambuc	add	r11,r11,r0,ror#2
2254*0a6a1f1dSLionel Sambuc	eor	r3,r3,r5
2255*0a6a1f1dSLionel Sambuc	add	r10,r10,r2
2256*0a6a1f1dSLionel Sambuc	eor	r2,r8,r9
2257*0a6a1f1dSLionel Sambuc	eor	r0,r7,r7,ror#5
2258*0a6a1f1dSLionel Sambuc	add	r11,r11,r3
2259*0a6a1f1dSLionel Sambuc	and	r2,r2,r7
2260*0a6a1f1dSLionel Sambuc	eor	r3,r0,r7,ror#19
2261*0a6a1f1dSLionel Sambuc	eor	r0,r11,r11,ror#11
2262*0a6a1f1dSLionel Sambuc	eor	r2,r2,r9
2263*0a6a1f1dSLionel Sambuc	add	r10,r10,r3,ror#6
2264*0a6a1f1dSLionel Sambuc	eor	r3,r11,r4
2265*0a6a1f1dSLionel Sambuc	eor	r0,r0,r11,ror#20
2266*0a6a1f1dSLionel Sambuc	add	r10,r10,r2
2267*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#8]
2268*0a6a1f1dSLionel Sambuc	and	r12,r12,r3
2269*0a6a1f1dSLionel Sambuc	add	r6,r6,r10
2270*0a6a1f1dSLionel Sambuc	add	r10,r10,r0,ror#2
2271*0a6a1f1dSLionel Sambuc	eor	r12,r12,r4
2272*0a6a1f1dSLionel Sambuc	add	r9,r9,r2
2273*0a6a1f1dSLionel Sambuc	eor	r2,r7,r8
2274*0a6a1f1dSLionel Sambuc	eor	r0,r6,r6,ror#5
2275*0a6a1f1dSLionel Sambuc	add	r10,r10,r12
2276*0a6a1f1dSLionel Sambuc	and	r2,r2,r6
2277*0a6a1f1dSLionel Sambuc	eor	r12,r0,r6,ror#19
2278*0a6a1f1dSLionel Sambuc	eor	r0,r10,r10,ror#11
2279*0a6a1f1dSLionel Sambuc	eor	r2,r2,r8
2280*0a6a1f1dSLionel Sambuc	add	r9,r9,r12,ror#6
2281*0a6a1f1dSLionel Sambuc	eor	r12,r10,r11
2282*0a6a1f1dSLionel Sambuc	eor	r0,r0,r10,ror#20
2283*0a6a1f1dSLionel Sambuc	add	r9,r9,r2
2284*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#12]
2285*0a6a1f1dSLionel Sambuc	and	r3,r3,r12
2286*0a6a1f1dSLionel Sambuc	add	r5,r5,r9
2287*0a6a1f1dSLionel Sambuc	add	r9,r9,r0,ror#2
2288*0a6a1f1dSLionel Sambuc	eor	r3,r3,r11
2289*0a6a1f1dSLionel Sambuc	add	r8,r8,r2
2290*0a6a1f1dSLionel Sambuc	eor	r2,r6,r7
2291*0a6a1f1dSLionel Sambuc	eor	r0,r5,r5,ror#5
2292*0a6a1f1dSLionel Sambuc	add	r9,r9,r3
2293*0a6a1f1dSLionel Sambuc	and	r2,r2,r5
2294*0a6a1f1dSLionel Sambuc	eor	r3,r0,r5,ror#19
2295*0a6a1f1dSLionel Sambuc	eor	r0,r9,r9,ror#11
2296*0a6a1f1dSLionel Sambuc	eor	r2,r2,r7
2297*0a6a1f1dSLionel Sambuc	add	r8,r8,r3,ror#6
2298*0a6a1f1dSLionel Sambuc	eor	r3,r9,r10
2299*0a6a1f1dSLionel Sambuc	eor	r0,r0,r9,ror#20
2300*0a6a1f1dSLionel Sambuc	add	r8,r8,r2
2301*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#16]
2302*0a6a1f1dSLionel Sambuc	and	r12,r12,r3
2303*0a6a1f1dSLionel Sambuc	add	r4,r4,r8
2304*0a6a1f1dSLionel Sambuc	add	r8,r8,r0,ror#2
2305*0a6a1f1dSLionel Sambuc	eor	r12,r12,r10
2306*0a6a1f1dSLionel Sambuc	vst1.32	{q8},[r1,:128]!
2307*0a6a1f1dSLionel Sambuc	add	r7,r7,r2
2308*0a6a1f1dSLionel Sambuc	eor	r2,r5,r6
2309*0a6a1f1dSLionel Sambuc	eor	r0,r4,r4,ror#5
2310*0a6a1f1dSLionel Sambuc	add	r8,r8,r12
2311*0a6a1f1dSLionel Sambuc	vld1.32	{q8},[r14,:128]!
2312*0a6a1f1dSLionel Sambuc	and	r2,r2,r4
2313*0a6a1f1dSLionel Sambuc	eor	r12,r0,r4,ror#19
2314*0a6a1f1dSLionel Sambuc	eor	r0,r8,r8,ror#11
2315*0a6a1f1dSLionel Sambuc	eor	r2,r2,r6
2316*0a6a1f1dSLionel Sambuc	vrev32.8	q1,q1
2317*0a6a1f1dSLionel Sambuc	add	r7,r7,r12,ror#6
2318*0a6a1f1dSLionel Sambuc	eor	r12,r8,r9
2319*0a6a1f1dSLionel Sambuc	eor	r0,r0,r8,ror#20
2320*0a6a1f1dSLionel Sambuc	add	r7,r7,r2
2321*0a6a1f1dSLionel Sambuc	vadd.i32	q8,q8,q1
2322*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#20]
2323*0a6a1f1dSLionel Sambuc	and	r3,r3,r12
2324*0a6a1f1dSLionel Sambuc	add	r11,r11,r7
2325*0a6a1f1dSLionel Sambuc	add	r7,r7,r0,ror#2
2326*0a6a1f1dSLionel Sambuc	eor	r3,r3,r9
2327*0a6a1f1dSLionel Sambuc	add	r6,r6,r2
2328*0a6a1f1dSLionel Sambuc	eor	r2,r4,r5
2329*0a6a1f1dSLionel Sambuc	eor	r0,r11,r11,ror#5
2330*0a6a1f1dSLionel Sambuc	add	r7,r7,r3
2331*0a6a1f1dSLionel Sambuc	and	r2,r2,r11
2332*0a6a1f1dSLionel Sambuc	eor	r3,r0,r11,ror#19
2333*0a6a1f1dSLionel Sambuc	eor	r0,r7,r7,ror#11
2334*0a6a1f1dSLionel Sambuc	eor	r2,r2,r5
2335*0a6a1f1dSLionel Sambuc	add	r6,r6,r3,ror#6
2336*0a6a1f1dSLionel Sambuc	eor	r3,r7,r8
2337*0a6a1f1dSLionel Sambuc	eor	r0,r0,r7,ror#20
2338*0a6a1f1dSLionel Sambuc	add	r6,r6,r2
2339*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#24]
2340*0a6a1f1dSLionel Sambuc	and	r12,r12,r3
2341*0a6a1f1dSLionel Sambuc	add	r10,r10,r6
2342*0a6a1f1dSLionel Sambuc	add	r6,r6,r0,ror#2
2343*0a6a1f1dSLionel Sambuc	eor	r12,r12,r8
2344*0a6a1f1dSLionel Sambuc	add	r5,r5,r2
2345*0a6a1f1dSLionel Sambuc	eor	r2,r11,r4
2346*0a6a1f1dSLionel Sambuc	eor	r0,r10,r10,ror#5
2347*0a6a1f1dSLionel Sambuc	add	r6,r6,r12
2348*0a6a1f1dSLionel Sambuc	and	r2,r2,r10
2349*0a6a1f1dSLionel Sambuc	eor	r12,r0,r10,ror#19
2350*0a6a1f1dSLionel Sambuc	eor	r0,r6,r6,ror#11
2351*0a6a1f1dSLionel Sambuc	eor	r2,r2,r4
2352*0a6a1f1dSLionel Sambuc	add	r5,r5,r12,ror#6
2353*0a6a1f1dSLionel Sambuc	eor	r12,r6,r7
2354*0a6a1f1dSLionel Sambuc	eor	r0,r0,r6,ror#20
2355*0a6a1f1dSLionel Sambuc	add	r5,r5,r2
2356*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#28]
2357*0a6a1f1dSLionel Sambuc	and	r3,r3,r12
2358*0a6a1f1dSLionel Sambuc	add	r9,r9,r5
2359*0a6a1f1dSLionel Sambuc	add	r5,r5,r0,ror#2
2360*0a6a1f1dSLionel Sambuc	eor	r3,r3,r7
2361*0a6a1f1dSLionel Sambuc	add	r4,r4,r2
2362*0a6a1f1dSLionel Sambuc	eor	r2,r10,r11
2363*0a6a1f1dSLionel Sambuc	eor	r0,r9,r9,ror#5
2364*0a6a1f1dSLionel Sambuc	add	r5,r5,r3
2365*0a6a1f1dSLionel Sambuc	and	r2,r2,r9
2366*0a6a1f1dSLionel Sambuc	eor	r3,r0,r9,ror#19
2367*0a6a1f1dSLionel Sambuc	eor	r0,r5,r5,ror#11
2368*0a6a1f1dSLionel Sambuc	eor	r2,r2,r11
2369*0a6a1f1dSLionel Sambuc	add	r4,r4,r3,ror#6
2370*0a6a1f1dSLionel Sambuc	eor	r3,r5,r6
2371*0a6a1f1dSLionel Sambuc	eor	r0,r0,r5,ror#20
2372*0a6a1f1dSLionel Sambuc	add	r4,r4,r2
2373*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#32]
2374*0a6a1f1dSLionel Sambuc	and	r12,r12,r3
2375*0a6a1f1dSLionel Sambuc	add	r8,r8,r4
2376*0a6a1f1dSLionel Sambuc	add	r4,r4,r0,ror#2
2377*0a6a1f1dSLionel Sambuc	eor	r12,r12,r6
2378*0a6a1f1dSLionel Sambuc	vst1.32	{q8},[r1,:128]!
2379*0a6a1f1dSLionel Sambuc	add	r11,r11,r2
2380*0a6a1f1dSLionel Sambuc	eor	r2,r9,r10
2381*0a6a1f1dSLionel Sambuc	eor	r0,r8,r8,ror#5
2382*0a6a1f1dSLionel Sambuc	add	r4,r4,r12
2383*0a6a1f1dSLionel Sambuc	vld1.32	{q8},[r14,:128]!
2384*0a6a1f1dSLionel Sambuc	and	r2,r2,r8
2385*0a6a1f1dSLionel Sambuc	eor	r12,r0,r8,ror#19
2386*0a6a1f1dSLionel Sambuc	eor	r0,r4,r4,ror#11
2387*0a6a1f1dSLionel Sambuc	eor	r2,r2,r10
2388*0a6a1f1dSLionel Sambuc	vrev32.8	q2,q2
2389*0a6a1f1dSLionel Sambuc	add	r11,r11,r12,ror#6
2390*0a6a1f1dSLionel Sambuc	eor	r12,r4,r5
2391*0a6a1f1dSLionel Sambuc	eor	r0,r0,r4,ror#20
2392*0a6a1f1dSLionel Sambuc	add	r11,r11,r2
2393*0a6a1f1dSLionel Sambuc	vadd.i32	q8,q8,q2
2394*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#36]
2395*0a6a1f1dSLionel Sambuc	and	r3,r3,r12
2396*0a6a1f1dSLionel Sambuc	add	r7,r7,r11
2397*0a6a1f1dSLionel Sambuc	add	r11,r11,r0,ror#2
2398*0a6a1f1dSLionel Sambuc	eor	r3,r3,r5
2399*0a6a1f1dSLionel Sambuc	add	r10,r10,r2
2400*0a6a1f1dSLionel Sambuc	eor	r2,r8,r9
2401*0a6a1f1dSLionel Sambuc	eor	r0,r7,r7,ror#5
2402*0a6a1f1dSLionel Sambuc	add	r11,r11,r3
2403*0a6a1f1dSLionel Sambuc	and	r2,r2,r7
2404*0a6a1f1dSLionel Sambuc	eor	r3,r0,r7,ror#19
2405*0a6a1f1dSLionel Sambuc	eor	r0,r11,r11,ror#11
2406*0a6a1f1dSLionel Sambuc	eor	r2,r2,r9
2407*0a6a1f1dSLionel Sambuc	add	r10,r10,r3,ror#6
2408*0a6a1f1dSLionel Sambuc	eor	r3,r11,r4
2409*0a6a1f1dSLionel Sambuc	eor	r0,r0,r11,ror#20
2410*0a6a1f1dSLionel Sambuc	add	r10,r10,r2
2411*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#40]
2412*0a6a1f1dSLionel Sambuc	and	r12,r12,r3
2413*0a6a1f1dSLionel Sambuc	add	r6,r6,r10
2414*0a6a1f1dSLionel Sambuc	add	r10,r10,r0,ror#2
2415*0a6a1f1dSLionel Sambuc	eor	r12,r12,r4
2416*0a6a1f1dSLionel Sambuc	add	r9,r9,r2
2417*0a6a1f1dSLionel Sambuc	eor	r2,r7,r8
2418*0a6a1f1dSLionel Sambuc	eor	r0,r6,r6,ror#5
2419*0a6a1f1dSLionel Sambuc	add	r10,r10,r12
2420*0a6a1f1dSLionel Sambuc	and	r2,r2,r6
2421*0a6a1f1dSLionel Sambuc	eor	r12,r0,r6,ror#19
2422*0a6a1f1dSLionel Sambuc	eor	r0,r10,r10,ror#11
2423*0a6a1f1dSLionel Sambuc	eor	r2,r2,r8
2424*0a6a1f1dSLionel Sambuc	add	r9,r9,r12,ror#6
2425*0a6a1f1dSLionel Sambuc	eor	r12,r10,r11
2426*0a6a1f1dSLionel Sambuc	eor	r0,r0,r10,ror#20
2427*0a6a1f1dSLionel Sambuc	add	r9,r9,r2
2428*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#44]
2429*0a6a1f1dSLionel Sambuc	and	r3,r3,r12
2430*0a6a1f1dSLionel Sambuc	add	r5,r5,r9
2431*0a6a1f1dSLionel Sambuc	add	r9,r9,r0,ror#2
2432*0a6a1f1dSLionel Sambuc	eor	r3,r3,r11
2433*0a6a1f1dSLionel Sambuc	add	r8,r8,r2
2434*0a6a1f1dSLionel Sambuc	eor	r2,r6,r7
2435*0a6a1f1dSLionel Sambuc	eor	r0,r5,r5,ror#5
2436*0a6a1f1dSLionel Sambuc	add	r9,r9,r3
2437*0a6a1f1dSLionel Sambuc	and	r2,r2,r5
2438*0a6a1f1dSLionel Sambuc	eor	r3,r0,r5,ror#19
2439*0a6a1f1dSLionel Sambuc	eor	r0,r9,r9,ror#11
2440*0a6a1f1dSLionel Sambuc	eor	r2,r2,r7
2441*0a6a1f1dSLionel Sambuc	add	r8,r8,r3,ror#6
2442*0a6a1f1dSLionel Sambuc	eor	r3,r9,r10
2443*0a6a1f1dSLionel Sambuc	eor	r0,r0,r9,ror#20
2444*0a6a1f1dSLionel Sambuc	add	r8,r8,r2
2445*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#48]
2446*0a6a1f1dSLionel Sambuc	and	r12,r12,r3
2447*0a6a1f1dSLionel Sambuc	add	r4,r4,r8
2448*0a6a1f1dSLionel Sambuc	add	r8,r8,r0,ror#2
2449*0a6a1f1dSLionel Sambuc	eor	r12,r12,r10
2450*0a6a1f1dSLionel Sambuc	vst1.32	{q8},[r1,:128]!
2451*0a6a1f1dSLionel Sambuc	add	r7,r7,r2
2452*0a6a1f1dSLionel Sambuc	eor	r2,r5,r6
2453*0a6a1f1dSLionel Sambuc	eor	r0,r4,r4,ror#5
2454*0a6a1f1dSLionel Sambuc	add	r8,r8,r12
2455*0a6a1f1dSLionel Sambuc	vld1.32	{q8},[r14,:128]!
2456*0a6a1f1dSLionel Sambuc	and	r2,r2,r4
2457*0a6a1f1dSLionel Sambuc	eor	r12,r0,r4,ror#19
2458*0a6a1f1dSLionel Sambuc	eor	r0,r8,r8,ror#11
2459*0a6a1f1dSLionel Sambuc	eor	r2,r2,r6
2460*0a6a1f1dSLionel Sambuc	vrev32.8	q3,q3
2461*0a6a1f1dSLionel Sambuc	add	r7,r7,r12,ror#6
2462*0a6a1f1dSLionel Sambuc	eor	r12,r8,r9
2463*0a6a1f1dSLionel Sambuc	eor	r0,r0,r8,ror#20
2464*0a6a1f1dSLionel Sambuc	add	r7,r7,r2
2465*0a6a1f1dSLionel Sambuc	vadd.i32	q8,q8,q3
2466*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#52]
2467*0a6a1f1dSLionel Sambuc	and	r3,r3,r12
2468*0a6a1f1dSLionel Sambuc	add	r11,r11,r7
2469*0a6a1f1dSLionel Sambuc	add	r7,r7,r0,ror#2
2470*0a6a1f1dSLionel Sambuc	eor	r3,r3,r9
2471*0a6a1f1dSLionel Sambuc	add	r6,r6,r2
2472*0a6a1f1dSLionel Sambuc	eor	r2,r4,r5
2473*0a6a1f1dSLionel Sambuc	eor	r0,r11,r11,ror#5
2474*0a6a1f1dSLionel Sambuc	add	r7,r7,r3
2475*0a6a1f1dSLionel Sambuc	and	r2,r2,r11
2476*0a6a1f1dSLionel Sambuc	eor	r3,r0,r11,ror#19
2477*0a6a1f1dSLionel Sambuc	eor	r0,r7,r7,ror#11
2478*0a6a1f1dSLionel Sambuc	eor	r2,r2,r5
2479*0a6a1f1dSLionel Sambuc	add	r6,r6,r3,ror#6
2480*0a6a1f1dSLionel Sambuc	eor	r3,r7,r8
2481*0a6a1f1dSLionel Sambuc	eor	r0,r0,r7,ror#20
2482*0a6a1f1dSLionel Sambuc	add	r6,r6,r2
2483*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#56]
2484*0a6a1f1dSLionel Sambuc	and	r12,r12,r3
2485*0a6a1f1dSLionel Sambuc	add	r10,r10,r6
2486*0a6a1f1dSLionel Sambuc	add	r6,r6,r0,ror#2
2487*0a6a1f1dSLionel Sambuc	eor	r12,r12,r8
2488*0a6a1f1dSLionel Sambuc	add	r5,r5,r2
2489*0a6a1f1dSLionel Sambuc	eor	r2,r11,r4
2490*0a6a1f1dSLionel Sambuc	eor	r0,r10,r10,ror#5
2491*0a6a1f1dSLionel Sambuc	add	r6,r6,r12
2492*0a6a1f1dSLionel Sambuc	and	r2,r2,r10
2493*0a6a1f1dSLionel Sambuc	eor	r12,r0,r10,ror#19
2494*0a6a1f1dSLionel Sambuc	eor	r0,r6,r6,ror#11
2495*0a6a1f1dSLionel Sambuc	eor	r2,r2,r4
2496*0a6a1f1dSLionel Sambuc	add	r5,r5,r12,ror#6
2497*0a6a1f1dSLionel Sambuc	eor	r12,r6,r7
2498*0a6a1f1dSLionel Sambuc	eor	r0,r0,r6,ror#20
2499*0a6a1f1dSLionel Sambuc	add	r5,r5,r2
2500*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#60]
2501*0a6a1f1dSLionel Sambuc	and	r3,r3,r12
2502*0a6a1f1dSLionel Sambuc	add	r9,r9,r5
2503*0a6a1f1dSLionel Sambuc	add	r5,r5,r0,ror#2
2504*0a6a1f1dSLionel Sambuc	eor	r3,r3,r7
2505*0a6a1f1dSLionel Sambuc	add	r4,r4,r2
2506*0a6a1f1dSLionel Sambuc	eor	r2,r10,r11
2507*0a6a1f1dSLionel Sambuc	eor	r0,r9,r9,ror#5
2508*0a6a1f1dSLionel Sambuc	add	r5,r5,r3
2509*0a6a1f1dSLionel Sambuc	and	r2,r2,r9
2510*0a6a1f1dSLionel Sambuc	eor	r3,r0,r9,ror#19
2511*0a6a1f1dSLionel Sambuc	eor	r0,r5,r5,ror#11
2512*0a6a1f1dSLionel Sambuc	eor	r2,r2,r11
2513*0a6a1f1dSLionel Sambuc	add	r4,r4,r3,ror#6
2514*0a6a1f1dSLionel Sambuc	eor	r3,r5,r6
2515*0a6a1f1dSLionel Sambuc	eor	r0,r0,r5,ror#20
2516*0a6a1f1dSLionel Sambuc	add	r4,r4,r2
2517*0a6a1f1dSLionel Sambuc	ldr	r2,[sp,#64]
2518*0a6a1f1dSLionel Sambuc	and	r12,r12,r3
2519*0a6a1f1dSLionel Sambuc	add	r8,r8,r4
2520*0a6a1f1dSLionel Sambuc	add	r4,r4,r0,ror#2
2521*0a6a1f1dSLionel Sambuc	eor	r12,r12,r6
2522*0a6a1f1dSLionel Sambuc	vst1.32	{q8},[r1,:128]!
2523*0a6a1f1dSLionel Sambuc	ldr	r0,[r2,#0]
2524*0a6a1f1dSLionel Sambuc	add	r4,r4,r12			@ h+=Maj(a,b,c) from the past
2525*0a6a1f1dSLionel Sambuc	ldr	r12,[r2,#4]
2526*0a6a1f1dSLionel Sambuc	ldr	r3,[r2,#8]
2527*0a6a1f1dSLionel Sambuc	ldr	r1,[r2,#12]
2528*0a6a1f1dSLionel Sambuc	add	r4,r4,r0			@ accumulate
2529*0a6a1f1dSLionel Sambuc	ldr	r0,[r2,#16]
2530*0a6a1f1dSLionel Sambuc	add	r5,r5,r12
2531*0a6a1f1dSLionel Sambuc	ldr	r12,[r2,#20]
2532*0a6a1f1dSLionel Sambuc	add	r6,r6,r3
2533*0a6a1f1dSLionel Sambuc	ldr	r3,[r2,#24]
2534*0a6a1f1dSLionel Sambuc	add	r7,r7,r1
2535*0a6a1f1dSLionel Sambuc	ldr	r1,[r2,#28]
2536*0a6a1f1dSLionel Sambuc	add	r8,r8,r0
2537*0a6a1f1dSLionel Sambuc	str	r4,[r2],#4
2538*0a6a1f1dSLionel Sambuc	add	r9,r9,r12
2539*0a6a1f1dSLionel Sambuc	str	r5,[r2],#4
2540*0a6a1f1dSLionel Sambuc	add	r10,r10,r3
2541*0a6a1f1dSLionel Sambuc	str	r6,[r2],#4
2542*0a6a1f1dSLionel Sambuc	add	r11,r11,r1
2543*0a6a1f1dSLionel Sambuc	str	r7,[r2],#4
2544*0a6a1f1dSLionel Sambuc	stmia	r2,{r8-r11}
2545*0a6a1f1dSLionel Sambuc
2546*0a6a1f1dSLionel Sambuc	movne	r1,sp
2547*0a6a1f1dSLionel Sambuc	ldrne	r2,[sp,#0]
2548*0a6a1f1dSLionel Sambuc	eorne	r12,r12,r12
2549*0a6a1f1dSLionel Sambuc	ldreq	sp,[sp,#76]			@ restore original sp
2550*0a6a1f1dSLionel Sambuc	eorne	r3,r5,r6
2551*0a6a1f1dSLionel Sambuc	bne	.L_00_48
2552*0a6a1f1dSLionel Sambuc
2553*0a6a1f1dSLionel Sambuc	ldmia	sp!,{r4-r12,pc}
2554*0a6a1f1dSLionel Sambuc.size	sha256_block_data_order_neon,.-sha256_block_data_order_neon
2555*0a6a1f1dSLionel Sambuc#endif
2556*0a6a1f1dSLionel Sambuc#if __ARM_MAX_ARCH__>=7
2557*0a6a1f1dSLionel Sambuc.type	sha256_block_data_order_armv8,%function
2558*0a6a1f1dSLionel Sambuc.align	5
2559*0a6a1f1dSLionel Sambucsha256_block_data_order_armv8:
2560*0a6a1f1dSLionel Sambuc.LARMv8:
2561*0a6a1f1dSLionel Sambuc	vld1.32	{q0,q1},[r0]
2562*0a6a1f1dSLionel Sambuc	sub	r3,r3,#sha256_block_data_order-K256
2563*0a6a1f1dSLionel Sambuc
2564*0a6a1f1dSLionel Sambuc.Loop_v8:
2565*0a6a1f1dSLionel Sambuc	vld1.8		{q8-q9},[r1]!
2566*0a6a1f1dSLionel Sambuc	vld1.8		{q10-q11},[r1]!
2567*0a6a1f1dSLionel Sambuc	vld1.32		{q12},[r3]!
2568*0a6a1f1dSLionel Sambuc	vrev32.8	q8,q8
2569*0a6a1f1dSLionel Sambuc	vrev32.8	q9,q9
2570*0a6a1f1dSLionel Sambuc	vrev32.8	q10,q10
2571*0a6a1f1dSLionel Sambuc	vrev32.8	q11,q11
2572*0a6a1f1dSLionel Sambuc	vmov		q14,q0	@ offload
2573*0a6a1f1dSLionel Sambuc	vmov		q15,q1
2574*0a6a1f1dSLionel Sambuc	teq		r1,r2
2575*0a6a1f1dSLionel Sambuc	vld1.32		{q13},[r3]!
2576*0a6a1f1dSLionel Sambuc	vadd.i32	q12,q12,q8
2577*0a6a1f1dSLionel Sambuc	.inst	0xf3fa03e2	@ sha256su0 q8,q9
2578*0a6a1f1dSLionel Sambuc	vmov		q2,q0
2579*0a6a1f1dSLionel Sambuc	.inst	0xf3020c68	@ sha256h q0,q1,q12
2580*0a6a1f1dSLionel Sambuc	.inst	0xf3142c68	@ sha256h2 q1,q2,q12
2581*0a6a1f1dSLionel Sambuc	.inst	0xf3640ce6	@ sha256su1 q8,q10,q11
2582*0a6a1f1dSLionel Sambuc	vld1.32		{q12},[r3]!
2583*0a6a1f1dSLionel Sambuc	vadd.i32	q13,q13,q9
2584*0a6a1f1dSLionel Sambuc	.inst	0xf3fa23e4	@ sha256su0 q9,q10
2585*0a6a1f1dSLionel Sambuc	vmov		q2,q0
2586*0a6a1f1dSLionel Sambuc	.inst	0xf3020c6a	@ sha256h q0,q1,q13
2587*0a6a1f1dSLionel Sambuc	.inst	0xf3142c6a	@ sha256h2 q1,q2,q13
2588*0a6a1f1dSLionel Sambuc	.inst	0xf3662ce0	@ sha256su1 q9,q11,q8
2589*0a6a1f1dSLionel Sambuc	vld1.32		{q13},[r3]!
2590*0a6a1f1dSLionel Sambuc	vadd.i32	q12,q12,q10
2591*0a6a1f1dSLionel Sambuc	.inst	0xf3fa43e6	@ sha256su0 q10,q11
2592*0a6a1f1dSLionel Sambuc	vmov		q2,q0
2593*0a6a1f1dSLionel Sambuc	.inst	0xf3020c68	@ sha256h q0,q1,q12
2594*0a6a1f1dSLionel Sambuc	.inst	0xf3142c68	@ sha256h2 q1,q2,q12
2595*0a6a1f1dSLionel Sambuc	.inst	0xf3604ce2	@ sha256su1 q10,q8,q9
2596*0a6a1f1dSLionel Sambuc	vld1.32		{q12},[r3]!
2597*0a6a1f1dSLionel Sambuc	vadd.i32	q13,q13,q11
2598*0a6a1f1dSLionel Sambuc	.inst	0xf3fa63e0	@ sha256su0 q11,q8
2599*0a6a1f1dSLionel Sambuc	vmov		q2,q0
2600*0a6a1f1dSLionel Sambuc	.inst	0xf3020c6a	@ sha256h q0,q1,q13
2601*0a6a1f1dSLionel Sambuc	.inst	0xf3142c6a	@ sha256h2 q1,q2,q13
2602*0a6a1f1dSLionel Sambuc	.inst	0xf3626ce4	@ sha256su1 q11,q9,q10
2603*0a6a1f1dSLionel Sambuc	vld1.32		{q13},[r3]!
2604*0a6a1f1dSLionel Sambuc	vadd.i32	q12,q12,q8
2605*0a6a1f1dSLionel Sambuc	.inst	0xf3fa03e2	@ sha256su0 q8,q9
2606*0a6a1f1dSLionel Sambuc	vmov		q2,q0
2607*0a6a1f1dSLionel Sambuc	.inst	0xf3020c68	@ sha256h q0,q1,q12
2608*0a6a1f1dSLionel Sambuc	.inst	0xf3142c68	@ sha256h2 q1,q2,q12
2609*0a6a1f1dSLionel Sambuc	.inst	0xf3640ce6	@ sha256su1 q8,q10,q11
2610*0a6a1f1dSLionel Sambuc	vld1.32		{q12},[r3]!
2611*0a6a1f1dSLionel Sambuc	vadd.i32	q13,q13,q9
2612*0a6a1f1dSLionel Sambuc	.inst	0xf3fa23e4	@ sha256su0 q9,q10
2613*0a6a1f1dSLionel Sambuc	vmov		q2,q0
2614*0a6a1f1dSLionel Sambuc	.inst	0xf3020c6a	@ sha256h q0,q1,q13
2615*0a6a1f1dSLionel Sambuc	.inst	0xf3142c6a	@ sha256h2 q1,q2,q13
2616*0a6a1f1dSLionel Sambuc	.inst	0xf3662ce0	@ sha256su1 q9,q11,q8
2617*0a6a1f1dSLionel Sambuc	vld1.32		{q13},[r3]!
2618*0a6a1f1dSLionel Sambuc	vadd.i32	q12,q12,q10
2619*0a6a1f1dSLionel Sambuc	.inst	0xf3fa43e6	@ sha256su0 q10,q11
2620*0a6a1f1dSLionel Sambuc	vmov		q2,q0
2621*0a6a1f1dSLionel Sambuc	.inst	0xf3020c68	@ sha256h q0,q1,q12
2622*0a6a1f1dSLionel Sambuc	.inst	0xf3142c68	@ sha256h2 q1,q2,q12
2623*0a6a1f1dSLionel Sambuc	.inst	0xf3604ce2	@ sha256su1 q10,q8,q9
2624*0a6a1f1dSLionel Sambuc	vld1.32		{q12},[r3]!
2625*0a6a1f1dSLionel Sambuc	vadd.i32	q13,q13,q11
2626*0a6a1f1dSLionel Sambuc	.inst	0xf3fa63e0	@ sha256su0 q11,q8
2627*0a6a1f1dSLionel Sambuc	vmov		q2,q0
2628*0a6a1f1dSLionel Sambuc	.inst	0xf3020c6a	@ sha256h q0,q1,q13
2629*0a6a1f1dSLionel Sambuc	.inst	0xf3142c6a	@ sha256h2 q1,q2,q13
2630*0a6a1f1dSLionel Sambuc	.inst	0xf3626ce4	@ sha256su1 q11,q9,q10
2631*0a6a1f1dSLionel Sambuc	vld1.32		{q13},[r3]!
2632*0a6a1f1dSLionel Sambuc	vadd.i32	q12,q12,q8
2633*0a6a1f1dSLionel Sambuc	.inst	0xf3fa03e2	@ sha256su0 q8,q9
2634*0a6a1f1dSLionel Sambuc	vmov		q2,q0
2635*0a6a1f1dSLionel Sambuc	.inst	0xf3020c68	@ sha256h q0,q1,q12
2636*0a6a1f1dSLionel Sambuc	.inst	0xf3142c68	@ sha256h2 q1,q2,q12
2637*0a6a1f1dSLionel Sambuc	.inst	0xf3640ce6	@ sha256su1 q8,q10,q11
2638*0a6a1f1dSLionel Sambuc	vld1.32		{q12},[r3]!
2639*0a6a1f1dSLionel Sambuc	vadd.i32	q13,q13,q9
2640*0a6a1f1dSLionel Sambuc	.inst	0xf3fa23e4	@ sha256su0 q9,q10
2641*0a6a1f1dSLionel Sambuc	vmov		q2,q0
2642*0a6a1f1dSLionel Sambuc	.inst	0xf3020c6a	@ sha256h q0,q1,q13
2643*0a6a1f1dSLionel Sambuc	.inst	0xf3142c6a	@ sha256h2 q1,q2,q13
2644*0a6a1f1dSLionel Sambuc	.inst	0xf3662ce0	@ sha256su1 q9,q11,q8
2645*0a6a1f1dSLionel Sambuc	vld1.32		{q13},[r3]!
2646*0a6a1f1dSLionel Sambuc	vadd.i32	q12,q12,q10
2647*0a6a1f1dSLionel Sambuc	.inst	0xf3fa43e6	@ sha256su0 q10,q11
2648*0a6a1f1dSLionel Sambuc	vmov		q2,q0
2649*0a6a1f1dSLionel Sambuc	.inst	0xf3020c68	@ sha256h q0,q1,q12
2650*0a6a1f1dSLionel Sambuc	.inst	0xf3142c68	@ sha256h2 q1,q2,q12
2651*0a6a1f1dSLionel Sambuc	.inst	0xf3604ce2	@ sha256su1 q10,q8,q9
2652*0a6a1f1dSLionel Sambuc	vld1.32		{q12},[r3]!
2653*0a6a1f1dSLionel Sambuc	vadd.i32	q13,q13,q11
2654*0a6a1f1dSLionel Sambuc	.inst	0xf3fa63e0	@ sha256su0 q11,q8
2655*0a6a1f1dSLionel Sambuc	vmov		q2,q0
2656*0a6a1f1dSLionel Sambuc	.inst	0xf3020c6a	@ sha256h q0,q1,q13
2657*0a6a1f1dSLionel Sambuc	.inst	0xf3142c6a	@ sha256h2 q1,q2,q13
2658*0a6a1f1dSLionel Sambuc	.inst	0xf3626ce4	@ sha256su1 q11,q9,q10
2659*0a6a1f1dSLionel Sambuc	vld1.32		{q13},[r3]!
2660*0a6a1f1dSLionel Sambuc	vadd.i32	q12,q12,q8
2661*0a6a1f1dSLionel Sambuc	vmov		q2,q0
2662*0a6a1f1dSLionel Sambuc	.inst	0xf3020c68	@ sha256h q0,q1,q12
2663*0a6a1f1dSLionel Sambuc	.inst	0xf3142c68	@ sha256h2 q1,q2,q12
2664*0a6a1f1dSLionel Sambuc
2665*0a6a1f1dSLionel Sambuc	vld1.32		{q12},[r3]!
2666*0a6a1f1dSLionel Sambuc	vadd.i32	q13,q13,q9
2667*0a6a1f1dSLionel Sambuc	vmov		q2,q0
2668*0a6a1f1dSLionel Sambuc	.inst	0xf3020c6a	@ sha256h q0,q1,q13
2669*0a6a1f1dSLionel Sambuc	.inst	0xf3142c6a	@ sha256h2 q1,q2,q13
2670*0a6a1f1dSLionel Sambuc
2671*0a6a1f1dSLionel Sambuc	vld1.32		{q13},[r3]
2672*0a6a1f1dSLionel Sambuc	vadd.i32	q12,q12,q10
2673*0a6a1f1dSLionel Sambuc	sub		r3,r3,#256-16	@ rewind
2674*0a6a1f1dSLionel Sambuc	vmov		q2,q0
2675*0a6a1f1dSLionel Sambuc	.inst	0xf3020c68	@ sha256h q0,q1,q12
2676*0a6a1f1dSLionel Sambuc	.inst	0xf3142c68	@ sha256h2 q1,q2,q12
2677*0a6a1f1dSLionel Sambuc
2678*0a6a1f1dSLionel Sambuc	vadd.i32	q13,q13,q11
2679*0a6a1f1dSLionel Sambuc	vmov		q2,q0
2680*0a6a1f1dSLionel Sambuc	.inst	0xf3020c6a	@ sha256h q0,q1,q13
2681*0a6a1f1dSLionel Sambuc	.inst	0xf3142c6a	@ sha256h2 q1,q2,q13
2682*0a6a1f1dSLionel Sambuc
2683*0a6a1f1dSLionel Sambuc	vadd.i32	q0,q0,q14
2684*0a6a1f1dSLionel Sambuc	vadd.i32	q1,q1,q15
2685*0a6a1f1dSLionel Sambuc	bne		.Loop_v8
2686*0a6a1f1dSLionel Sambuc
2687*0a6a1f1dSLionel Sambuc	vst1.32		{q0,q1},[r0]
2688*0a6a1f1dSLionel Sambuc
2689*0a6a1f1dSLionel Sambuc	RET		@ bx lr
2690*0a6a1f1dSLionel Sambuc.size	sha256_block_data_order_armv8,.-sha256_block_data_order_armv8
2691*0a6a1f1dSLionel Sambuc#endif
2692*0a6a1f1dSLionel Sambuc.asciz  "SHA256 block transform for ARMv4/NEON/ARMv8, CRYPTOGAMS by <appro@openssl.org>"
2693*0a6a1f1dSLionel Sambuc.align	2
2694*0a6a1f1dSLionel Sambuc#if __ARM_MAX_ARCH__>=7
2695*0a6a1f1dSLionel Sambuc.comm   OPENSSL_armcap_P,4,4
2696*0a6a1f1dSLionel Sambuc#endif
2697