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