cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

curve25519-core.S (46959B)


      1/* SPDX-License-Identifier: GPL-2.0 OR MIT */
      2/*
      3 * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
      4 *
      5 * Based on public domain code from Daniel J. Bernstein and Peter Schwabe. This
      6 * began from SUPERCOP's curve25519/neon2/scalarmult.s, but has subsequently been
      7 * manually reworked for use in kernel space.
      8 */
      9
     10#include <linux/linkage.h>
     11
     12.text
     13.arch armv7-a
     14.fpu neon
     15.align 4
     16
     17ENTRY(curve25519_neon)
     18	push		{r4-r11, lr}
     19	mov		ip, sp
     20	sub		r3, sp, #704
     21	and		r3, r3, #0xfffffff0
     22	mov		sp, r3
     23	movw		r4, #0
     24	movw		r5, #254
     25	vmov.i32	q0, #1
     26	vshr.u64	q1, q0, #7
     27	vshr.u64	q0, q0, #8
     28	vmov.i32	d4, #19
     29	vmov.i32	d5, #38
     30	add		r6, sp, #480
     31	vst1.8		{d2-d3}, [r6, : 128]!
     32	vst1.8		{d0-d1}, [r6, : 128]!
     33	vst1.8		{d4-d5}, [r6, : 128]
     34	add		r6, r3, #0
     35	vmov.i32	q2, #0
     36	vst1.8		{d4-d5}, [r6, : 128]!
     37	vst1.8		{d4-d5}, [r6, : 128]!
     38	vst1.8		d4, [r6, : 64]
     39	add		r6, r3, #0
     40	movw		r7, #960
     41	sub		r7, r7, #2
     42	neg		r7, r7
     43	sub		r7, r7, r7, LSL #7
     44	str		r7, [r6]
     45	add		r6, sp, #672
     46	vld1.8		{d4-d5}, [r1]!
     47	vld1.8		{d6-d7}, [r1]
     48	vst1.8		{d4-d5}, [r6, : 128]!
     49	vst1.8		{d6-d7}, [r6, : 128]
     50	sub		r1, r6, #16
     51	ldrb		r6, [r1]
     52	and		r6, r6, #248
     53	strb		r6, [r1]
     54	ldrb		r6, [r1, #31]
     55	and		r6, r6, #127
     56	orr		r6, r6, #64
     57	strb		r6, [r1, #31]
     58	vmov.i64	q2, #0xffffffff
     59	vshr.u64	q3, q2, #7
     60	vshr.u64	q2, q2, #6
     61	vld1.8		{d8}, [r2]
     62	vld1.8		{d10}, [r2]
     63	add		r2, r2, #6
     64	vld1.8		{d12}, [r2]
     65	vld1.8		{d14}, [r2]
     66	add		r2, r2, #6
     67	vld1.8		{d16}, [r2]
     68	add		r2, r2, #4
     69	vld1.8		{d18}, [r2]
     70	vld1.8		{d20}, [r2]
     71	add		r2, r2, #6
     72	vld1.8		{d22}, [r2]
     73	add		r2, r2, #2
     74	vld1.8		{d24}, [r2]
     75	vld1.8		{d26}, [r2]
     76	vshr.u64	q5, q5, #26
     77	vshr.u64	q6, q6, #3
     78	vshr.u64	q7, q7, #29
     79	vshr.u64	q8, q8, #6
     80	vshr.u64	q10, q10, #25
     81	vshr.u64	q11, q11, #3
     82	vshr.u64	q12, q12, #12
     83	vshr.u64	q13, q13, #38
     84	vand		q4, q4, q2
     85	vand		q6, q6, q2
     86	vand		q8, q8, q2
     87	vand		q10, q10, q2
     88	vand		q2, q12, q2
     89	vand		q5, q5, q3
     90	vand		q7, q7, q3
     91	vand		q9, q9, q3
     92	vand		q11, q11, q3
     93	vand		q3, q13, q3
     94	add		r2, r3, #48
     95	vadd.i64	q12, q4, q1
     96	vadd.i64	q13, q10, q1
     97	vshr.s64	q12, q12, #26
     98	vshr.s64	q13, q13, #26
     99	vadd.i64	q5, q5, q12
    100	vshl.i64	q12, q12, #26
    101	vadd.i64	q14, q5, q0
    102	vadd.i64	q11, q11, q13
    103	vshl.i64	q13, q13, #26
    104	vadd.i64	q15, q11, q0
    105	vsub.i64	q4, q4, q12
    106	vshr.s64	q12, q14, #25
    107	vsub.i64	q10, q10, q13
    108	vshr.s64	q13, q15, #25
    109	vadd.i64	q6, q6, q12
    110	vshl.i64	q12, q12, #25
    111	vadd.i64	q14, q6, q1
    112	vadd.i64	q2, q2, q13
    113	vsub.i64	q5, q5, q12
    114	vshr.s64	q12, q14, #26
    115	vshl.i64	q13, q13, #25
    116	vadd.i64	q14, q2, q1
    117	vadd.i64	q7, q7, q12
    118	vshl.i64	q12, q12, #26
    119	vadd.i64	q15, q7, q0
    120	vsub.i64	q11, q11, q13
    121	vshr.s64	q13, q14, #26
    122	vsub.i64	q6, q6, q12
    123	vshr.s64	q12, q15, #25
    124	vadd.i64	q3, q3, q13
    125	vshl.i64	q13, q13, #26
    126	vadd.i64	q14, q3, q0
    127	vadd.i64	q8, q8, q12
    128	vshl.i64	q12, q12, #25
    129	vadd.i64	q15, q8, q1
    130	add		r2, r2, #8
    131	vsub.i64	q2, q2, q13
    132	vshr.s64	q13, q14, #25
    133	vsub.i64	q7, q7, q12
    134	vshr.s64	q12, q15, #26
    135	vadd.i64	q14, q13, q13
    136	vadd.i64	q9, q9, q12
    137	vtrn.32		d12, d14
    138	vshl.i64	q12, q12, #26
    139	vtrn.32		d13, d15
    140	vadd.i64	q0, q9, q0
    141	vadd.i64	q4, q4, q14
    142	vst1.8		d12, [r2, : 64]!
    143	vshl.i64	q6, q13, #4
    144	vsub.i64	q7, q8, q12
    145	vshr.s64	q0, q0, #25
    146	vadd.i64	q4, q4, q6
    147	vadd.i64	q6, q10, q0
    148	vshl.i64	q0, q0, #25
    149	vadd.i64	q8, q6, q1
    150	vadd.i64	q4, q4, q13
    151	vshl.i64	q10, q13, #25
    152	vadd.i64	q1, q4, q1
    153	vsub.i64	q0, q9, q0
    154	vshr.s64	q8, q8, #26
    155	vsub.i64	q3, q3, q10
    156	vtrn.32		d14, d0
    157	vshr.s64	q1, q1, #26
    158	vtrn.32		d15, d1
    159	vadd.i64	q0, q11, q8
    160	vst1.8		d14, [r2, : 64]
    161	vshl.i64	q7, q8, #26
    162	vadd.i64	q5, q5, q1
    163	vtrn.32		d4, d6
    164	vshl.i64	q1, q1, #26
    165	vtrn.32		d5, d7
    166	vsub.i64	q3, q6, q7
    167	add		r2, r2, #16
    168	vsub.i64	q1, q4, q1
    169	vst1.8		d4, [r2, : 64]
    170	vtrn.32		d6, d0
    171	vtrn.32		d7, d1
    172	sub		r2, r2, #8
    173	vtrn.32		d2, d10
    174	vtrn.32		d3, d11
    175	vst1.8		d6, [r2, : 64]
    176	sub		r2, r2, #24
    177	vst1.8		d2, [r2, : 64]
    178	add		r2, r3, #96
    179	vmov.i32	q0, #0
    180	vmov.i64	d2, #0xff
    181	vmov.i64	d3, #0
    182	vshr.u32	q1, q1, #7
    183	vst1.8		{d2-d3}, [r2, : 128]!
    184	vst1.8		{d0-d1}, [r2, : 128]!
    185	vst1.8		d0, [r2, : 64]
    186	add		r2, r3, #144
    187	vmov.i32	q0, #0
    188	vst1.8		{d0-d1}, [r2, : 128]!
    189	vst1.8		{d0-d1}, [r2, : 128]!
    190	vst1.8		d0, [r2, : 64]
    191	add		r2, r3, #240
    192	vmov.i32	q0, #0
    193	vmov.i64	d2, #0xff
    194	vmov.i64	d3, #0
    195	vshr.u32	q1, q1, #7
    196	vst1.8		{d2-d3}, [r2, : 128]!
    197	vst1.8		{d0-d1}, [r2, : 128]!
    198	vst1.8		d0, [r2, : 64]
    199	add		r2, r3, #48
    200	add		r6, r3, #192
    201	vld1.8		{d0-d1}, [r2, : 128]!
    202	vld1.8		{d2-d3}, [r2, : 128]!
    203	vld1.8		{d4}, [r2, : 64]
    204	vst1.8		{d0-d1}, [r6, : 128]!
    205	vst1.8		{d2-d3}, [r6, : 128]!
    206	vst1.8		d4, [r6, : 64]
    207.Lmainloop:
    208	mov		r2, r5, LSR #3
    209	and		r6, r5, #7
    210	ldrb		r2, [r1, r2]
    211	mov		r2, r2, LSR r6
    212	and		r2, r2, #1
    213	str		r5, [sp, #456]
    214	eor		r4, r4, r2
    215	str		r2, [sp, #460]
    216	neg		r2, r4
    217	add		r4, r3, #96
    218	add		r5, r3, #192
    219	add		r6, r3, #144
    220	vld1.8		{d8-d9}, [r4, : 128]!
    221	add		r7, r3, #240
    222	vld1.8		{d10-d11}, [r5, : 128]!
    223	veor		q6, q4, q5
    224	vld1.8		{d14-d15}, [r6, : 128]!
    225	vdup.i32	q8, r2
    226	vld1.8		{d18-d19}, [r7, : 128]!
    227	veor		q10, q7, q9
    228	vld1.8		{d22-d23}, [r4, : 128]!
    229	vand		q6, q6, q8
    230	vld1.8		{d24-d25}, [r5, : 128]!
    231	vand		q10, q10, q8
    232	vld1.8		{d26-d27}, [r6, : 128]!
    233	veor		q4, q4, q6
    234	vld1.8		{d28-d29}, [r7, : 128]!
    235	veor		q5, q5, q6
    236	vld1.8		{d0}, [r4, : 64]
    237	veor		q6, q7, q10
    238	vld1.8		{d2}, [r5, : 64]
    239	veor		q7, q9, q10
    240	vld1.8		{d4}, [r6, : 64]
    241	veor		q9, q11, q12
    242	vld1.8		{d6}, [r7, : 64]
    243	veor		q10, q0, q1
    244	sub		r2, r4, #32
    245	vand		q9, q9, q8
    246	sub		r4, r5, #32
    247	vand		q10, q10, q8
    248	sub		r5, r6, #32
    249	veor		q11, q11, q9
    250	sub		r6, r7, #32
    251	veor		q0, q0, q10
    252	veor		q9, q12, q9
    253	veor		q1, q1, q10
    254	veor		q10, q13, q14
    255	veor		q12, q2, q3
    256	vand		q10, q10, q8
    257	vand		q8, q12, q8
    258	veor		q12, q13, q10
    259	veor		q2, q2, q8
    260	veor		q10, q14, q10
    261	veor		q3, q3, q8
    262	vadd.i32	q8, q4, q6
    263	vsub.i32	q4, q4, q6
    264	vst1.8		{d16-d17}, [r2, : 128]!
    265	vadd.i32	q6, q11, q12
    266	vst1.8		{d8-d9}, [r5, : 128]!
    267	vsub.i32	q4, q11, q12
    268	vst1.8		{d12-d13}, [r2, : 128]!
    269	vadd.i32	q6, q0, q2
    270	vst1.8		{d8-d9}, [r5, : 128]!
    271	vsub.i32	q0, q0, q2
    272	vst1.8		d12, [r2, : 64]
    273	vadd.i32	q2, q5, q7
    274	vst1.8		d0, [r5, : 64]
    275	vsub.i32	q0, q5, q7
    276	vst1.8		{d4-d5}, [r4, : 128]!
    277	vadd.i32	q2, q9, q10
    278	vst1.8		{d0-d1}, [r6, : 128]!
    279	vsub.i32	q0, q9, q10
    280	vst1.8		{d4-d5}, [r4, : 128]!
    281	vadd.i32	q2, q1, q3
    282	vst1.8		{d0-d1}, [r6, : 128]!
    283	vsub.i32	q0, q1, q3
    284	vst1.8		d4, [r4, : 64]
    285	vst1.8		d0, [r6, : 64]
    286	add		r2, sp, #512
    287	add		r4, r3, #96
    288	add		r5, r3, #144
    289	vld1.8		{d0-d1}, [r2, : 128]
    290	vld1.8		{d2-d3}, [r4, : 128]!
    291	vld1.8		{d4-d5}, [r5, : 128]!
    292	vzip.i32	q1, q2
    293	vld1.8		{d6-d7}, [r4, : 128]!
    294	vld1.8		{d8-d9}, [r5, : 128]!
    295	vshl.i32	q5, q1, #1
    296	vzip.i32	q3, q4
    297	vshl.i32	q6, q2, #1
    298	vld1.8		{d14}, [r4, : 64]
    299	vshl.i32	q8, q3, #1
    300	vld1.8		{d15}, [r5, : 64]
    301	vshl.i32	q9, q4, #1
    302	vmul.i32	d21, d7, d1
    303	vtrn.32		d14, d15
    304	vmul.i32	q11, q4, q0
    305	vmul.i32	q0, q7, q0
    306	vmull.s32	q12, d2, d2
    307	vmlal.s32	q12, d11, d1
    308	vmlal.s32	q12, d12, d0
    309	vmlal.s32	q12, d13, d23
    310	vmlal.s32	q12, d16, d22
    311	vmlal.s32	q12, d7, d21
    312	vmull.s32	q10, d2, d11
    313	vmlal.s32	q10, d4, d1
    314	vmlal.s32	q10, d13, d0
    315	vmlal.s32	q10, d6, d23
    316	vmlal.s32	q10, d17, d22
    317	vmull.s32	q13, d10, d4
    318	vmlal.s32	q13, d11, d3
    319	vmlal.s32	q13, d13, d1
    320	vmlal.s32	q13, d16, d0
    321	vmlal.s32	q13, d17, d23
    322	vmlal.s32	q13, d8, d22
    323	vmull.s32	q1, d10, d5
    324	vmlal.s32	q1, d11, d4
    325	vmlal.s32	q1, d6, d1
    326	vmlal.s32	q1, d17, d0
    327	vmlal.s32	q1, d8, d23
    328	vmull.s32	q14, d10, d6
    329	vmlal.s32	q14, d11, d13
    330	vmlal.s32	q14, d4, d4
    331	vmlal.s32	q14, d17, d1
    332	vmlal.s32	q14, d18, d0
    333	vmlal.s32	q14, d9, d23
    334	vmull.s32	q11, d10, d7
    335	vmlal.s32	q11, d11, d6
    336	vmlal.s32	q11, d12, d5
    337	vmlal.s32	q11, d8, d1
    338	vmlal.s32	q11, d19, d0
    339	vmull.s32	q15, d10, d8
    340	vmlal.s32	q15, d11, d17
    341	vmlal.s32	q15, d12, d6
    342	vmlal.s32	q15, d13, d5
    343	vmlal.s32	q15, d19, d1
    344	vmlal.s32	q15, d14, d0
    345	vmull.s32	q2, d10, d9
    346	vmlal.s32	q2, d11, d8
    347	vmlal.s32	q2, d12, d7
    348	vmlal.s32	q2, d13, d6
    349	vmlal.s32	q2, d14, d1
    350	vmull.s32	q0, d15, d1
    351	vmlal.s32	q0, d10, d14
    352	vmlal.s32	q0, d11, d19
    353	vmlal.s32	q0, d12, d8
    354	vmlal.s32	q0, d13, d17
    355	vmlal.s32	q0, d6, d6
    356	add		r2, sp, #480
    357	vld1.8		{d18-d19}, [r2, : 128]!
    358	vmull.s32	q3, d16, d7
    359	vmlal.s32	q3, d10, d15
    360	vmlal.s32	q3, d11, d14
    361	vmlal.s32	q3, d12, d9
    362	vmlal.s32	q3, d13, d8
    363	vld1.8		{d8-d9}, [r2, : 128]
    364	vadd.i64	q5, q12, q9
    365	vadd.i64	q6, q15, q9
    366	vshr.s64	q5, q5, #26
    367	vshr.s64	q6, q6, #26
    368	vadd.i64	q7, q10, q5
    369	vshl.i64	q5, q5, #26
    370	vadd.i64	q8, q7, q4
    371	vadd.i64	q2, q2, q6
    372	vshl.i64	q6, q6, #26
    373	vadd.i64	q10, q2, q4
    374	vsub.i64	q5, q12, q5
    375	vshr.s64	q8, q8, #25
    376	vsub.i64	q6, q15, q6
    377	vshr.s64	q10, q10, #25
    378	vadd.i64	q12, q13, q8
    379	vshl.i64	q8, q8, #25
    380	vadd.i64	q13, q12, q9
    381	vadd.i64	q0, q0, q10
    382	vsub.i64	q7, q7, q8
    383	vshr.s64	q8, q13, #26
    384	vshl.i64	q10, q10, #25
    385	vadd.i64	q13, q0, q9
    386	vadd.i64	q1, q1, q8
    387	vshl.i64	q8, q8, #26
    388	vadd.i64	q15, q1, q4
    389	vsub.i64	q2, q2, q10
    390	vshr.s64	q10, q13, #26
    391	vsub.i64	q8, q12, q8
    392	vshr.s64	q12, q15, #25
    393	vadd.i64	q3, q3, q10
    394	vshl.i64	q10, q10, #26
    395	vadd.i64	q13, q3, q4
    396	vadd.i64	q14, q14, q12
    397	add		r2, r3, #288
    398	vshl.i64	q12, q12, #25
    399	add		r4, r3, #336
    400	vadd.i64	q15, q14, q9
    401	add		r2, r2, #8
    402	vsub.i64	q0, q0, q10
    403	add		r4, r4, #8
    404	vshr.s64	q10, q13, #25
    405	vsub.i64	q1, q1, q12
    406	vshr.s64	q12, q15, #26
    407	vadd.i64	q13, q10, q10
    408	vadd.i64	q11, q11, q12
    409	vtrn.32		d16, d2
    410	vshl.i64	q12, q12, #26
    411	vtrn.32		d17, d3
    412	vadd.i64	q1, q11, q4
    413	vadd.i64	q4, q5, q13
    414	vst1.8		d16, [r2, : 64]!
    415	vshl.i64	q5, q10, #4
    416	vst1.8		d17, [r4, : 64]!
    417	vsub.i64	q8, q14, q12
    418	vshr.s64	q1, q1, #25
    419	vadd.i64	q4, q4, q5
    420	vadd.i64	q5, q6, q1
    421	vshl.i64	q1, q1, #25
    422	vadd.i64	q6, q5, q9
    423	vadd.i64	q4, q4, q10
    424	vshl.i64	q10, q10, #25
    425	vadd.i64	q9, q4, q9
    426	vsub.i64	q1, q11, q1
    427	vshr.s64	q6, q6, #26
    428	vsub.i64	q3, q3, q10
    429	vtrn.32		d16, d2
    430	vshr.s64	q9, q9, #26
    431	vtrn.32		d17, d3
    432	vadd.i64	q1, q2, q6
    433	vst1.8		d16, [r2, : 64]
    434	vshl.i64	q2, q6, #26
    435	vst1.8		d17, [r4, : 64]
    436	vadd.i64	q6, q7, q9
    437	vtrn.32		d0, d6
    438	vshl.i64	q7, q9, #26
    439	vtrn.32		d1, d7
    440	vsub.i64	q2, q5, q2
    441	add		r2, r2, #16
    442	vsub.i64	q3, q4, q7
    443	vst1.8		d0, [r2, : 64]
    444	add		r4, r4, #16
    445	vst1.8		d1, [r4, : 64]
    446	vtrn.32		d4, d2
    447	vtrn.32		d5, d3
    448	sub		r2, r2, #8
    449	sub		r4, r4, #8
    450	vtrn.32		d6, d12
    451	vtrn.32		d7, d13
    452	vst1.8		d4, [r2, : 64]
    453	vst1.8		d5, [r4, : 64]
    454	sub		r2, r2, #24
    455	sub		r4, r4, #24
    456	vst1.8		d6, [r2, : 64]
    457	vst1.8		d7, [r4, : 64]
    458	add		r2, r3, #240
    459	add		r4, r3, #96
    460	vld1.8		{d0-d1}, [r4, : 128]!
    461	vld1.8		{d2-d3}, [r4, : 128]!
    462	vld1.8		{d4}, [r4, : 64]
    463	add		r4, r3, #144
    464	vld1.8		{d6-d7}, [r4, : 128]!
    465	vtrn.32		q0, q3
    466	vld1.8		{d8-d9}, [r4, : 128]!
    467	vshl.i32	q5, q0, #4
    468	vtrn.32		q1, q4
    469	vshl.i32	q6, q3, #4
    470	vadd.i32	q5, q5, q0
    471	vadd.i32	q6, q6, q3
    472	vshl.i32	q7, q1, #4
    473	vld1.8		{d5}, [r4, : 64]
    474	vshl.i32	q8, q4, #4
    475	vtrn.32		d4, d5
    476	vadd.i32	q7, q7, q1
    477	vadd.i32	q8, q8, q4
    478	vld1.8		{d18-d19}, [r2, : 128]!
    479	vshl.i32	q10, q2, #4
    480	vld1.8		{d22-d23}, [r2, : 128]!
    481	vadd.i32	q10, q10, q2
    482	vld1.8		{d24}, [r2, : 64]
    483	vadd.i32	q5, q5, q0
    484	add		r2, r3, #192
    485	vld1.8		{d26-d27}, [r2, : 128]!
    486	vadd.i32	q6, q6, q3
    487	vld1.8		{d28-d29}, [r2, : 128]!
    488	vadd.i32	q8, q8, q4
    489	vld1.8		{d25}, [r2, : 64]
    490	vadd.i32	q10, q10, q2
    491	vtrn.32		q9, q13
    492	vadd.i32	q7, q7, q1
    493	vadd.i32	q5, q5, q0
    494	vtrn.32		q11, q14
    495	vadd.i32	q6, q6, q3
    496	add		r2, sp, #528
    497	vadd.i32	q10, q10, q2
    498	vtrn.32		d24, d25
    499	vst1.8		{d12-d13}, [r2, : 128]!
    500	vshl.i32	q6, q13, #1
    501	vst1.8		{d20-d21}, [r2, : 128]!
    502	vshl.i32	q10, q14, #1
    503	vst1.8		{d12-d13}, [r2, : 128]!
    504	vshl.i32	q15, q12, #1
    505	vadd.i32	q8, q8, q4
    506	vext.32		d10, d31, d30, #0
    507	vadd.i32	q7, q7, q1
    508	vst1.8		{d16-d17}, [r2, : 128]!
    509	vmull.s32	q8, d18, d5
    510	vmlal.s32	q8, d26, d4
    511	vmlal.s32	q8, d19, d9
    512	vmlal.s32	q8, d27, d3
    513	vmlal.s32	q8, d22, d8
    514	vmlal.s32	q8, d28, d2
    515	vmlal.s32	q8, d23, d7
    516	vmlal.s32	q8, d29, d1
    517	vmlal.s32	q8, d24, d6
    518	vmlal.s32	q8, d25, d0
    519	vst1.8		{d14-d15}, [r2, : 128]!
    520	vmull.s32	q2, d18, d4
    521	vmlal.s32	q2, d12, d9
    522	vmlal.s32	q2, d13, d8
    523	vmlal.s32	q2, d19, d3
    524	vmlal.s32	q2, d22, d2
    525	vmlal.s32	q2, d23, d1
    526	vmlal.s32	q2, d24, d0
    527	vst1.8		{d20-d21}, [r2, : 128]!
    528	vmull.s32	q7, d18, d9
    529	vmlal.s32	q7, d26, d3
    530	vmlal.s32	q7, d19, d8
    531	vmlal.s32	q7, d27, d2
    532	vmlal.s32	q7, d22, d7
    533	vmlal.s32	q7, d28, d1
    534	vmlal.s32	q7, d23, d6
    535	vmlal.s32	q7, d29, d0
    536	vst1.8		{d10-d11}, [r2, : 128]!
    537	vmull.s32	q5, d18, d3
    538	vmlal.s32	q5, d19, d2
    539	vmlal.s32	q5, d22, d1
    540	vmlal.s32	q5, d23, d0
    541	vmlal.s32	q5, d12, d8
    542	vst1.8		{d16-d17}, [r2, : 128]
    543	vmull.s32	q4, d18, d8
    544	vmlal.s32	q4, d26, d2
    545	vmlal.s32	q4, d19, d7
    546	vmlal.s32	q4, d27, d1
    547	vmlal.s32	q4, d22, d6
    548	vmlal.s32	q4, d28, d0
    549	vmull.s32	q8, d18, d7
    550	vmlal.s32	q8, d26, d1
    551	vmlal.s32	q8, d19, d6
    552	vmlal.s32	q8, d27, d0
    553	add		r2, sp, #544
    554	vld1.8		{d20-d21}, [r2, : 128]
    555	vmlal.s32	q7, d24, d21
    556	vmlal.s32	q7, d25, d20
    557	vmlal.s32	q4, d23, d21
    558	vmlal.s32	q4, d29, d20
    559	vmlal.s32	q8, d22, d21
    560	vmlal.s32	q8, d28, d20
    561	vmlal.s32	q5, d24, d20
    562	vst1.8		{d14-d15}, [r2, : 128]
    563	vmull.s32	q7, d18, d6
    564	vmlal.s32	q7, d26, d0
    565	add		r2, sp, #624
    566	vld1.8		{d30-d31}, [r2, : 128]
    567	vmlal.s32	q2, d30, d21
    568	vmlal.s32	q7, d19, d21
    569	vmlal.s32	q7, d27, d20
    570	add		r2, sp, #592
    571	vld1.8		{d26-d27}, [r2, : 128]
    572	vmlal.s32	q4, d25, d27
    573	vmlal.s32	q8, d29, d27
    574	vmlal.s32	q8, d25, d26
    575	vmlal.s32	q7, d28, d27
    576	vmlal.s32	q7, d29, d26
    577	add		r2, sp, #576
    578	vld1.8		{d28-d29}, [r2, : 128]
    579	vmlal.s32	q4, d24, d29
    580	vmlal.s32	q8, d23, d29
    581	vmlal.s32	q8, d24, d28
    582	vmlal.s32	q7, d22, d29
    583	vmlal.s32	q7, d23, d28
    584	vst1.8		{d8-d9}, [r2, : 128]
    585	add		r2, sp, #528
    586	vld1.8		{d8-d9}, [r2, : 128]
    587	vmlal.s32	q7, d24, d9
    588	vmlal.s32	q7, d25, d31
    589	vmull.s32	q1, d18, d2
    590	vmlal.s32	q1, d19, d1
    591	vmlal.s32	q1, d22, d0
    592	vmlal.s32	q1, d24, d27
    593	vmlal.s32	q1, d23, d20
    594	vmlal.s32	q1, d12, d7
    595	vmlal.s32	q1, d13, d6
    596	vmull.s32	q6, d18, d1
    597	vmlal.s32	q6, d19, d0
    598	vmlal.s32	q6, d23, d27
    599	vmlal.s32	q6, d22, d20
    600	vmlal.s32	q6, d24, d26
    601	vmull.s32	q0, d18, d0
    602	vmlal.s32	q0, d22, d27
    603	vmlal.s32	q0, d23, d26
    604	vmlal.s32	q0, d24, d31
    605	vmlal.s32	q0, d19, d20
    606	add		r2, sp, #608
    607	vld1.8		{d18-d19}, [r2, : 128]
    608	vmlal.s32	q2, d18, d7
    609	vmlal.s32	q5, d18, d6
    610	vmlal.s32	q1, d18, d21
    611	vmlal.s32	q0, d18, d28
    612	vmlal.s32	q6, d18, d29
    613	vmlal.s32	q2, d19, d6
    614	vmlal.s32	q5, d19, d21
    615	vmlal.s32	q1, d19, d29
    616	vmlal.s32	q0, d19, d9
    617	vmlal.s32	q6, d19, d28
    618	add		r2, sp, #560
    619	vld1.8		{d18-d19}, [r2, : 128]
    620	add		r2, sp, #480
    621	vld1.8		{d22-d23}, [r2, : 128]
    622	vmlal.s32	q5, d19, d7
    623	vmlal.s32	q0, d18, d21
    624	vmlal.s32	q0, d19, d29
    625	vmlal.s32	q6, d18, d6
    626	add		r2, sp, #496
    627	vld1.8		{d6-d7}, [r2, : 128]
    628	vmlal.s32	q6, d19, d21
    629	add		r2, sp, #544
    630	vld1.8		{d18-d19}, [r2, : 128]
    631	vmlal.s32	q0, d30, d8
    632	add		r2, sp, #640
    633	vld1.8		{d20-d21}, [r2, : 128]
    634	vmlal.s32	q5, d30, d29
    635	add		r2, sp, #576
    636	vld1.8		{d24-d25}, [r2, : 128]
    637	vmlal.s32	q1, d30, d28
    638	vadd.i64	q13, q0, q11
    639	vadd.i64	q14, q5, q11
    640	vmlal.s32	q6, d30, d9
    641	vshr.s64	q4, q13, #26
    642	vshr.s64	q13, q14, #26
    643	vadd.i64	q7, q7, q4
    644	vshl.i64	q4, q4, #26
    645	vadd.i64	q14, q7, q3
    646	vadd.i64	q9, q9, q13
    647	vshl.i64	q13, q13, #26
    648	vadd.i64	q15, q9, q3
    649	vsub.i64	q0, q0, q4
    650	vshr.s64	q4, q14, #25
    651	vsub.i64	q5, q5, q13
    652	vshr.s64	q13, q15, #25
    653	vadd.i64	q6, q6, q4
    654	vshl.i64	q4, q4, #25
    655	vadd.i64	q14, q6, q11
    656	vadd.i64	q2, q2, q13
    657	vsub.i64	q4, q7, q4
    658	vshr.s64	q7, q14, #26
    659	vshl.i64	q13, q13, #25
    660	vadd.i64	q14, q2, q11
    661	vadd.i64	q8, q8, q7
    662	vshl.i64	q7, q7, #26
    663	vadd.i64	q15, q8, q3
    664	vsub.i64	q9, q9, q13
    665	vshr.s64	q13, q14, #26
    666	vsub.i64	q6, q6, q7
    667	vshr.s64	q7, q15, #25
    668	vadd.i64	q10, q10, q13
    669	vshl.i64	q13, q13, #26
    670	vadd.i64	q14, q10, q3
    671	vadd.i64	q1, q1, q7
    672	add		r2, r3, #144
    673	vshl.i64	q7, q7, #25
    674	add		r4, r3, #96
    675	vadd.i64	q15, q1, q11
    676	add		r2, r2, #8
    677	vsub.i64	q2, q2, q13
    678	add		r4, r4, #8
    679	vshr.s64	q13, q14, #25
    680	vsub.i64	q7, q8, q7
    681	vshr.s64	q8, q15, #26
    682	vadd.i64	q14, q13, q13
    683	vadd.i64	q12, q12, q8
    684	vtrn.32		d12, d14
    685	vshl.i64	q8, q8, #26
    686	vtrn.32		d13, d15
    687	vadd.i64	q3, q12, q3
    688	vadd.i64	q0, q0, q14
    689	vst1.8		d12, [r2, : 64]!
    690	vshl.i64	q7, q13, #4
    691	vst1.8		d13, [r4, : 64]!
    692	vsub.i64	q1, q1, q8
    693	vshr.s64	q3, q3, #25
    694	vadd.i64	q0, q0, q7
    695	vadd.i64	q5, q5, q3
    696	vshl.i64	q3, q3, #25
    697	vadd.i64	q6, q5, q11
    698	vadd.i64	q0, q0, q13
    699	vshl.i64	q7, q13, #25
    700	vadd.i64	q8, q0, q11
    701	vsub.i64	q3, q12, q3
    702	vshr.s64	q6, q6, #26
    703	vsub.i64	q7, q10, q7
    704	vtrn.32		d2, d6
    705	vshr.s64	q8, q8, #26
    706	vtrn.32		d3, d7
    707	vadd.i64	q3, q9, q6
    708	vst1.8		d2, [r2, : 64]
    709	vshl.i64	q6, q6, #26
    710	vst1.8		d3, [r4, : 64]
    711	vadd.i64	q1, q4, q8
    712	vtrn.32		d4, d14
    713	vshl.i64	q4, q8, #26
    714	vtrn.32		d5, d15
    715	vsub.i64	q5, q5, q6
    716	add		r2, r2, #16
    717	vsub.i64	q0, q0, q4
    718	vst1.8		d4, [r2, : 64]
    719	add		r4, r4, #16
    720	vst1.8		d5, [r4, : 64]
    721	vtrn.32		d10, d6
    722	vtrn.32		d11, d7
    723	sub		r2, r2, #8
    724	sub		r4, r4, #8
    725	vtrn.32		d0, d2
    726	vtrn.32		d1, d3
    727	vst1.8		d10, [r2, : 64]
    728	vst1.8		d11, [r4, : 64]
    729	sub		r2, r2, #24
    730	sub		r4, r4, #24
    731	vst1.8		d0, [r2, : 64]
    732	vst1.8		d1, [r4, : 64]
    733	add		r2, r3, #288
    734	add		r4, r3, #336
    735	vld1.8		{d0-d1}, [r2, : 128]!
    736	vld1.8		{d2-d3}, [r4, : 128]!
    737	vsub.i32	q0, q0, q1
    738	vld1.8		{d2-d3}, [r2, : 128]!
    739	vld1.8		{d4-d5}, [r4, : 128]!
    740	vsub.i32	q1, q1, q2
    741	add		r5, r3, #240
    742	vld1.8		{d4}, [r2, : 64]
    743	vld1.8		{d6}, [r4, : 64]
    744	vsub.i32	q2, q2, q3
    745	vst1.8		{d0-d1}, [r5, : 128]!
    746	vst1.8		{d2-d3}, [r5, : 128]!
    747	vst1.8		d4, [r5, : 64]
    748	add		r2, r3, #144
    749	add		r4, r3, #96
    750	add		r5, r3, #144
    751	add		r6, r3, #192
    752	vld1.8		{d0-d1}, [r2, : 128]!
    753	vld1.8		{d2-d3}, [r4, : 128]!
    754	vsub.i32	q2, q0, q1
    755	vadd.i32	q0, q0, q1
    756	vld1.8		{d2-d3}, [r2, : 128]!
    757	vld1.8		{d6-d7}, [r4, : 128]!
    758	vsub.i32	q4, q1, q3
    759	vadd.i32	q1, q1, q3
    760	vld1.8		{d6}, [r2, : 64]
    761	vld1.8		{d10}, [r4, : 64]
    762	vsub.i32	q6, q3, q5
    763	vadd.i32	q3, q3, q5
    764	vst1.8		{d4-d5}, [r5, : 128]!
    765	vst1.8		{d0-d1}, [r6, : 128]!
    766	vst1.8		{d8-d9}, [r5, : 128]!
    767	vst1.8		{d2-d3}, [r6, : 128]!
    768	vst1.8		d12, [r5, : 64]
    769	vst1.8		d6, [r6, : 64]
    770	add		r2, r3, #0
    771	add		r4, r3, #240
    772	vld1.8		{d0-d1}, [r4, : 128]!
    773	vld1.8		{d2-d3}, [r4, : 128]!
    774	vld1.8		{d4}, [r4, : 64]
    775	add		r4, r3, #336
    776	vld1.8		{d6-d7}, [r4, : 128]!
    777	vtrn.32		q0, q3
    778	vld1.8		{d8-d9}, [r4, : 128]!
    779	vshl.i32	q5, q0, #4
    780	vtrn.32		q1, q4
    781	vshl.i32	q6, q3, #4
    782	vadd.i32	q5, q5, q0
    783	vadd.i32	q6, q6, q3
    784	vshl.i32	q7, q1, #4
    785	vld1.8		{d5}, [r4, : 64]
    786	vshl.i32	q8, q4, #4
    787	vtrn.32		d4, d5
    788	vadd.i32	q7, q7, q1
    789	vadd.i32	q8, q8, q4
    790	vld1.8		{d18-d19}, [r2, : 128]!
    791	vshl.i32	q10, q2, #4
    792	vld1.8		{d22-d23}, [r2, : 128]!
    793	vadd.i32	q10, q10, q2
    794	vld1.8		{d24}, [r2, : 64]
    795	vadd.i32	q5, q5, q0
    796	add		r2, r3, #288
    797	vld1.8		{d26-d27}, [r2, : 128]!
    798	vadd.i32	q6, q6, q3
    799	vld1.8		{d28-d29}, [r2, : 128]!
    800	vadd.i32	q8, q8, q4
    801	vld1.8		{d25}, [r2, : 64]
    802	vadd.i32	q10, q10, q2
    803	vtrn.32		q9, q13
    804	vadd.i32	q7, q7, q1
    805	vadd.i32	q5, q5, q0
    806	vtrn.32		q11, q14
    807	vadd.i32	q6, q6, q3
    808	add		r2, sp, #528
    809	vadd.i32	q10, q10, q2
    810	vtrn.32		d24, d25
    811	vst1.8		{d12-d13}, [r2, : 128]!
    812	vshl.i32	q6, q13, #1
    813	vst1.8		{d20-d21}, [r2, : 128]!
    814	vshl.i32	q10, q14, #1
    815	vst1.8		{d12-d13}, [r2, : 128]!
    816	vshl.i32	q15, q12, #1
    817	vadd.i32	q8, q8, q4
    818	vext.32		d10, d31, d30, #0
    819	vadd.i32	q7, q7, q1
    820	vst1.8		{d16-d17}, [r2, : 128]!
    821	vmull.s32	q8, d18, d5
    822	vmlal.s32	q8, d26, d4
    823	vmlal.s32	q8, d19, d9
    824	vmlal.s32	q8, d27, d3
    825	vmlal.s32	q8, d22, d8
    826	vmlal.s32	q8, d28, d2
    827	vmlal.s32	q8, d23, d7
    828	vmlal.s32	q8, d29, d1
    829	vmlal.s32	q8, d24, d6
    830	vmlal.s32	q8, d25, d0
    831	vst1.8		{d14-d15}, [r2, : 128]!
    832	vmull.s32	q2, d18, d4
    833	vmlal.s32	q2, d12, d9
    834	vmlal.s32	q2, d13, d8
    835	vmlal.s32	q2, d19, d3
    836	vmlal.s32	q2, d22, d2
    837	vmlal.s32	q2, d23, d1
    838	vmlal.s32	q2, d24, d0
    839	vst1.8		{d20-d21}, [r2, : 128]!
    840	vmull.s32	q7, d18, d9
    841	vmlal.s32	q7, d26, d3
    842	vmlal.s32	q7, d19, d8
    843	vmlal.s32	q7, d27, d2
    844	vmlal.s32	q7, d22, d7
    845	vmlal.s32	q7, d28, d1
    846	vmlal.s32	q7, d23, d6
    847	vmlal.s32	q7, d29, d0
    848	vst1.8		{d10-d11}, [r2, : 128]!
    849	vmull.s32	q5, d18, d3
    850	vmlal.s32	q5, d19, d2
    851	vmlal.s32	q5, d22, d1
    852	vmlal.s32	q5, d23, d0
    853	vmlal.s32	q5, d12, d8
    854	vst1.8		{d16-d17}, [r2, : 128]!
    855	vmull.s32	q4, d18, d8
    856	vmlal.s32	q4, d26, d2
    857	vmlal.s32	q4, d19, d7
    858	vmlal.s32	q4, d27, d1
    859	vmlal.s32	q4, d22, d6
    860	vmlal.s32	q4, d28, d0
    861	vmull.s32	q8, d18, d7
    862	vmlal.s32	q8, d26, d1
    863	vmlal.s32	q8, d19, d6
    864	vmlal.s32	q8, d27, d0
    865	add		r2, sp, #544
    866	vld1.8		{d20-d21}, [r2, : 128]
    867	vmlal.s32	q7, d24, d21
    868	vmlal.s32	q7, d25, d20
    869	vmlal.s32	q4, d23, d21
    870	vmlal.s32	q4, d29, d20
    871	vmlal.s32	q8, d22, d21
    872	vmlal.s32	q8, d28, d20
    873	vmlal.s32	q5, d24, d20
    874	vst1.8		{d14-d15}, [r2, : 128]
    875	vmull.s32	q7, d18, d6
    876	vmlal.s32	q7, d26, d0
    877	add		r2, sp, #624
    878	vld1.8		{d30-d31}, [r2, : 128]
    879	vmlal.s32	q2, d30, d21
    880	vmlal.s32	q7, d19, d21
    881	vmlal.s32	q7, d27, d20
    882	add		r2, sp, #592
    883	vld1.8		{d26-d27}, [r2, : 128]
    884	vmlal.s32	q4, d25, d27
    885	vmlal.s32	q8, d29, d27
    886	vmlal.s32	q8, d25, d26
    887	vmlal.s32	q7, d28, d27
    888	vmlal.s32	q7, d29, d26
    889	add		r2, sp, #576
    890	vld1.8		{d28-d29}, [r2, : 128]
    891	vmlal.s32	q4, d24, d29
    892	vmlal.s32	q8, d23, d29
    893	vmlal.s32	q8, d24, d28
    894	vmlal.s32	q7, d22, d29
    895	vmlal.s32	q7, d23, d28
    896	vst1.8		{d8-d9}, [r2, : 128]
    897	add		r2, sp, #528
    898	vld1.8		{d8-d9}, [r2, : 128]
    899	vmlal.s32	q7, d24, d9
    900	vmlal.s32	q7, d25, d31
    901	vmull.s32	q1, d18, d2
    902	vmlal.s32	q1, d19, d1
    903	vmlal.s32	q1, d22, d0
    904	vmlal.s32	q1, d24, d27
    905	vmlal.s32	q1, d23, d20
    906	vmlal.s32	q1, d12, d7
    907	vmlal.s32	q1, d13, d6
    908	vmull.s32	q6, d18, d1
    909	vmlal.s32	q6, d19, d0
    910	vmlal.s32	q6, d23, d27
    911	vmlal.s32	q6, d22, d20
    912	vmlal.s32	q6, d24, d26
    913	vmull.s32	q0, d18, d0
    914	vmlal.s32	q0, d22, d27
    915	vmlal.s32	q0, d23, d26
    916	vmlal.s32	q0, d24, d31
    917	vmlal.s32	q0, d19, d20
    918	add		r2, sp, #608
    919	vld1.8		{d18-d19}, [r2, : 128]
    920	vmlal.s32	q2, d18, d7
    921	vmlal.s32	q5, d18, d6
    922	vmlal.s32	q1, d18, d21
    923	vmlal.s32	q0, d18, d28
    924	vmlal.s32	q6, d18, d29
    925	vmlal.s32	q2, d19, d6
    926	vmlal.s32	q5, d19, d21
    927	vmlal.s32	q1, d19, d29
    928	vmlal.s32	q0, d19, d9
    929	vmlal.s32	q6, d19, d28
    930	add		r2, sp, #560
    931	vld1.8		{d18-d19}, [r2, : 128]
    932	add		r2, sp, #480
    933	vld1.8		{d22-d23}, [r2, : 128]
    934	vmlal.s32	q5, d19, d7
    935	vmlal.s32	q0, d18, d21
    936	vmlal.s32	q0, d19, d29
    937	vmlal.s32	q6, d18, d6
    938	add		r2, sp, #496
    939	vld1.8		{d6-d7}, [r2, : 128]
    940	vmlal.s32	q6, d19, d21
    941	add		r2, sp, #544
    942	vld1.8		{d18-d19}, [r2, : 128]
    943	vmlal.s32	q0, d30, d8
    944	add		r2, sp, #640
    945	vld1.8		{d20-d21}, [r2, : 128]
    946	vmlal.s32	q5, d30, d29
    947	add		r2, sp, #576
    948	vld1.8		{d24-d25}, [r2, : 128]
    949	vmlal.s32	q1, d30, d28
    950	vadd.i64	q13, q0, q11
    951	vadd.i64	q14, q5, q11
    952	vmlal.s32	q6, d30, d9
    953	vshr.s64	q4, q13, #26
    954	vshr.s64	q13, q14, #26
    955	vadd.i64	q7, q7, q4
    956	vshl.i64	q4, q4, #26
    957	vadd.i64	q14, q7, q3
    958	vadd.i64	q9, q9, q13
    959	vshl.i64	q13, q13, #26
    960	vadd.i64	q15, q9, q3
    961	vsub.i64	q0, q0, q4
    962	vshr.s64	q4, q14, #25
    963	vsub.i64	q5, q5, q13
    964	vshr.s64	q13, q15, #25
    965	vadd.i64	q6, q6, q4
    966	vshl.i64	q4, q4, #25
    967	vadd.i64	q14, q6, q11
    968	vadd.i64	q2, q2, q13
    969	vsub.i64	q4, q7, q4
    970	vshr.s64	q7, q14, #26
    971	vshl.i64	q13, q13, #25
    972	vadd.i64	q14, q2, q11
    973	vadd.i64	q8, q8, q7
    974	vshl.i64	q7, q7, #26
    975	vadd.i64	q15, q8, q3
    976	vsub.i64	q9, q9, q13
    977	vshr.s64	q13, q14, #26
    978	vsub.i64	q6, q6, q7
    979	vshr.s64	q7, q15, #25
    980	vadd.i64	q10, q10, q13
    981	vshl.i64	q13, q13, #26
    982	vadd.i64	q14, q10, q3
    983	vadd.i64	q1, q1, q7
    984	add		r2, r3, #288
    985	vshl.i64	q7, q7, #25
    986	add		r4, r3, #96
    987	vadd.i64	q15, q1, q11
    988	add		r2, r2, #8
    989	vsub.i64	q2, q2, q13
    990	add		r4, r4, #8
    991	vshr.s64	q13, q14, #25
    992	vsub.i64	q7, q8, q7
    993	vshr.s64	q8, q15, #26
    994	vadd.i64	q14, q13, q13
    995	vadd.i64	q12, q12, q8
    996	vtrn.32		d12, d14
    997	vshl.i64	q8, q8, #26
    998	vtrn.32		d13, d15
    999	vadd.i64	q3, q12, q3
   1000	vadd.i64	q0, q0, q14
   1001	vst1.8		d12, [r2, : 64]!
   1002	vshl.i64	q7, q13, #4
   1003	vst1.8		d13, [r4, : 64]!
   1004	vsub.i64	q1, q1, q8
   1005	vshr.s64	q3, q3, #25
   1006	vadd.i64	q0, q0, q7
   1007	vadd.i64	q5, q5, q3
   1008	vshl.i64	q3, q3, #25
   1009	vadd.i64	q6, q5, q11
   1010	vadd.i64	q0, q0, q13
   1011	vshl.i64	q7, q13, #25
   1012	vadd.i64	q8, q0, q11
   1013	vsub.i64	q3, q12, q3
   1014	vshr.s64	q6, q6, #26
   1015	vsub.i64	q7, q10, q7
   1016	vtrn.32		d2, d6
   1017	vshr.s64	q8, q8, #26
   1018	vtrn.32		d3, d7
   1019	vadd.i64	q3, q9, q6
   1020	vst1.8		d2, [r2, : 64]
   1021	vshl.i64	q6, q6, #26
   1022	vst1.8		d3, [r4, : 64]
   1023	vadd.i64	q1, q4, q8
   1024	vtrn.32		d4, d14
   1025	vshl.i64	q4, q8, #26
   1026	vtrn.32		d5, d15
   1027	vsub.i64	q5, q5, q6
   1028	add		r2, r2, #16
   1029	vsub.i64	q0, q0, q4
   1030	vst1.8		d4, [r2, : 64]
   1031	add		r4, r4, #16
   1032	vst1.8		d5, [r4, : 64]
   1033	vtrn.32		d10, d6
   1034	vtrn.32		d11, d7
   1035	sub		r2, r2, #8
   1036	sub		r4, r4, #8
   1037	vtrn.32		d0, d2
   1038	vtrn.32		d1, d3
   1039	vst1.8		d10, [r2, : 64]
   1040	vst1.8		d11, [r4, : 64]
   1041	sub		r2, r2, #24
   1042	sub		r4, r4, #24
   1043	vst1.8		d0, [r2, : 64]
   1044	vst1.8		d1, [r4, : 64]
   1045	add		r2, sp, #512
   1046	add		r4, r3, #144
   1047	add		r5, r3, #192
   1048	vld1.8		{d0-d1}, [r2, : 128]
   1049	vld1.8		{d2-d3}, [r4, : 128]!
   1050	vld1.8		{d4-d5}, [r5, : 128]!
   1051	vzip.i32	q1, q2
   1052	vld1.8		{d6-d7}, [r4, : 128]!
   1053	vld1.8		{d8-d9}, [r5, : 128]!
   1054	vshl.i32	q5, q1, #1
   1055	vzip.i32	q3, q4
   1056	vshl.i32	q6, q2, #1
   1057	vld1.8		{d14}, [r4, : 64]
   1058	vshl.i32	q8, q3, #1
   1059	vld1.8		{d15}, [r5, : 64]
   1060	vshl.i32	q9, q4, #1
   1061	vmul.i32	d21, d7, d1
   1062	vtrn.32		d14, d15
   1063	vmul.i32	q11, q4, q0
   1064	vmul.i32	q0, q7, q0
   1065	vmull.s32	q12, d2, d2
   1066	vmlal.s32	q12, d11, d1
   1067	vmlal.s32	q12, d12, d0
   1068	vmlal.s32	q12, d13, d23
   1069	vmlal.s32	q12, d16, d22
   1070	vmlal.s32	q12, d7, d21
   1071	vmull.s32	q10, d2, d11
   1072	vmlal.s32	q10, d4, d1
   1073	vmlal.s32	q10, d13, d0
   1074	vmlal.s32	q10, d6, d23
   1075	vmlal.s32	q10, d17, d22
   1076	vmull.s32	q13, d10, d4
   1077	vmlal.s32	q13, d11, d3
   1078	vmlal.s32	q13, d13, d1
   1079	vmlal.s32	q13, d16, d0
   1080	vmlal.s32	q13, d17, d23
   1081	vmlal.s32	q13, d8, d22
   1082	vmull.s32	q1, d10, d5
   1083	vmlal.s32	q1, d11, d4
   1084	vmlal.s32	q1, d6, d1
   1085	vmlal.s32	q1, d17, d0
   1086	vmlal.s32	q1, d8, d23
   1087	vmull.s32	q14, d10, d6
   1088	vmlal.s32	q14, d11, d13
   1089	vmlal.s32	q14, d4, d4
   1090	vmlal.s32	q14, d17, d1
   1091	vmlal.s32	q14, d18, d0
   1092	vmlal.s32	q14, d9, d23
   1093	vmull.s32	q11, d10, d7
   1094	vmlal.s32	q11, d11, d6
   1095	vmlal.s32	q11, d12, d5
   1096	vmlal.s32	q11, d8, d1
   1097	vmlal.s32	q11, d19, d0
   1098	vmull.s32	q15, d10, d8
   1099	vmlal.s32	q15, d11, d17
   1100	vmlal.s32	q15, d12, d6
   1101	vmlal.s32	q15, d13, d5
   1102	vmlal.s32	q15, d19, d1
   1103	vmlal.s32	q15, d14, d0
   1104	vmull.s32	q2, d10, d9
   1105	vmlal.s32	q2, d11, d8
   1106	vmlal.s32	q2, d12, d7
   1107	vmlal.s32	q2, d13, d6
   1108	vmlal.s32	q2, d14, d1
   1109	vmull.s32	q0, d15, d1
   1110	vmlal.s32	q0, d10, d14
   1111	vmlal.s32	q0, d11, d19
   1112	vmlal.s32	q0, d12, d8
   1113	vmlal.s32	q0, d13, d17
   1114	vmlal.s32	q0, d6, d6
   1115	add		r2, sp, #480
   1116	vld1.8		{d18-d19}, [r2, : 128]!
   1117	vmull.s32	q3, d16, d7
   1118	vmlal.s32	q3, d10, d15
   1119	vmlal.s32	q3, d11, d14
   1120	vmlal.s32	q3, d12, d9
   1121	vmlal.s32	q3, d13, d8
   1122	vld1.8		{d8-d9}, [r2, : 128]
   1123	vadd.i64	q5, q12, q9
   1124	vadd.i64	q6, q15, q9
   1125	vshr.s64	q5, q5, #26
   1126	vshr.s64	q6, q6, #26
   1127	vadd.i64	q7, q10, q5
   1128	vshl.i64	q5, q5, #26
   1129	vadd.i64	q8, q7, q4
   1130	vadd.i64	q2, q2, q6
   1131	vshl.i64	q6, q6, #26
   1132	vadd.i64	q10, q2, q4
   1133	vsub.i64	q5, q12, q5
   1134	vshr.s64	q8, q8, #25
   1135	vsub.i64	q6, q15, q6
   1136	vshr.s64	q10, q10, #25
   1137	vadd.i64	q12, q13, q8
   1138	vshl.i64	q8, q8, #25
   1139	vadd.i64	q13, q12, q9
   1140	vadd.i64	q0, q0, q10
   1141	vsub.i64	q7, q7, q8
   1142	vshr.s64	q8, q13, #26
   1143	vshl.i64	q10, q10, #25
   1144	vadd.i64	q13, q0, q9
   1145	vadd.i64	q1, q1, q8
   1146	vshl.i64	q8, q8, #26
   1147	vadd.i64	q15, q1, q4
   1148	vsub.i64	q2, q2, q10
   1149	vshr.s64	q10, q13, #26
   1150	vsub.i64	q8, q12, q8
   1151	vshr.s64	q12, q15, #25
   1152	vadd.i64	q3, q3, q10
   1153	vshl.i64	q10, q10, #26
   1154	vadd.i64	q13, q3, q4
   1155	vadd.i64	q14, q14, q12
   1156	add		r2, r3, #144
   1157	vshl.i64	q12, q12, #25
   1158	add		r4, r3, #192
   1159	vadd.i64	q15, q14, q9
   1160	add		r2, r2, #8
   1161	vsub.i64	q0, q0, q10
   1162	add		r4, r4, #8
   1163	vshr.s64	q10, q13, #25
   1164	vsub.i64	q1, q1, q12
   1165	vshr.s64	q12, q15, #26
   1166	vadd.i64	q13, q10, q10
   1167	vadd.i64	q11, q11, q12
   1168	vtrn.32		d16, d2
   1169	vshl.i64	q12, q12, #26
   1170	vtrn.32		d17, d3
   1171	vadd.i64	q1, q11, q4
   1172	vadd.i64	q4, q5, q13
   1173	vst1.8		d16, [r2, : 64]!
   1174	vshl.i64	q5, q10, #4
   1175	vst1.8		d17, [r4, : 64]!
   1176	vsub.i64	q8, q14, q12
   1177	vshr.s64	q1, q1, #25
   1178	vadd.i64	q4, q4, q5
   1179	vadd.i64	q5, q6, q1
   1180	vshl.i64	q1, q1, #25
   1181	vadd.i64	q6, q5, q9
   1182	vadd.i64	q4, q4, q10
   1183	vshl.i64	q10, q10, #25
   1184	vadd.i64	q9, q4, q9
   1185	vsub.i64	q1, q11, q1
   1186	vshr.s64	q6, q6, #26
   1187	vsub.i64	q3, q3, q10
   1188	vtrn.32		d16, d2
   1189	vshr.s64	q9, q9, #26
   1190	vtrn.32		d17, d3
   1191	vadd.i64	q1, q2, q6
   1192	vst1.8		d16, [r2, : 64]
   1193	vshl.i64	q2, q6, #26
   1194	vst1.8		d17, [r4, : 64]
   1195	vadd.i64	q6, q7, q9
   1196	vtrn.32		d0, d6
   1197	vshl.i64	q7, q9, #26
   1198	vtrn.32		d1, d7
   1199	vsub.i64	q2, q5, q2
   1200	add		r2, r2, #16
   1201	vsub.i64	q3, q4, q7
   1202	vst1.8		d0, [r2, : 64]
   1203	add		r4, r4, #16
   1204	vst1.8		d1, [r4, : 64]
   1205	vtrn.32		d4, d2
   1206	vtrn.32		d5, d3
   1207	sub		r2, r2, #8
   1208	sub		r4, r4, #8
   1209	vtrn.32		d6, d12
   1210	vtrn.32		d7, d13
   1211	vst1.8		d4, [r2, : 64]
   1212	vst1.8		d5, [r4, : 64]
   1213	sub		r2, r2, #24
   1214	sub		r4, r4, #24
   1215	vst1.8		d6, [r2, : 64]
   1216	vst1.8		d7, [r4, : 64]
   1217	add		r2, r3, #336
   1218	add		r4, r3, #288
   1219	vld1.8		{d0-d1}, [r2, : 128]!
   1220	vld1.8		{d2-d3}, [r4, : 128]!
   1221	vadd.i32	q0, q0, q1
   1222	vld1.8		{d2-d3}, [r2, : 128]!
   1223	vld1.8		{d4-d5}, [r4, : 128]!
   1224	vadd.i32	q1, q1, q2
   1225	add		r5, r3, #288
   1226	vld1.8		{d4}, [r2, : 64]
   1227	vld1.8		{d6}, [r4, : 64]
   1228	vadd.i32	q2, q2, q3
   1229	vst1.8		{d0-d1}, [r5, : 128]!
   1230	vst1.8		{d2-d3}, [r5, : 128]!
   1231	vst1.8		d4, [r5, : 64]
   1232	add		r2, r3, #48
   1233	add		r4, r3, #144
   1234	vld1.8		{d0-d1}, [r4, : 128]!
   1235	vld1.8		{d2-d3}, [r4, : 128]!
   1236	vld1.8		{d4}, [r4, : 64]
   1237	add		r4, r3, #288
   1238	vld1.8		{d6-d7}, [r4, : 128]!
   1239	vtrn.32		q0, q3
   1240	vld1.8		{d8-d9}, [r4, : 128]!
   1241	vshl.i32	q5, q0, #4
   1242	vtrn.32		q1, q4
   1243	vshl.i32	q6, q3, #4
   1244	vadd.i32	q5, q5, q0
   1245	vadd.i32	q6, q6, q3
   1246	vshl.i32	q7, q1, #4
   1247	vld1.8		{d5}, [r4, : 64]
   1248	vshl.i32	q8, q4, #4
   1249	vtrn.32		d4, d5
   1250	vadd.i32	q7, q7, q1
   1251	vadd.i32	q8, q8, q4
   1252	vld1.8		{d18-d19}, [r2, : 128]!
   1253	vshl.i32	q10, q2, #4
   1254	vld1.8		{d22-d23}, [r2, : 128]!
   1255	vadd.i32	q10, q10, q2
   1256	vld1.8		{d24}, [r2, : 64]
   1257	vadd.i32	q5, q5, q0
   1258	add		r2, r3, #240
   1259	vld1.8		{d26-d27}, [r2, : 128]!
   1260	vadd.i32	q6, q6, q3
   1261	vld1.8		{d28-d29}, [r2, : 128]!
   1262	vadd.i32	q8, q8, q4
   1263	vld1.8		{d25}, [r2, : 64]
   1264	vadd.i32	q10, q10, q2
   1265	vtrn.32		q9, q13
   1266	vadd.i32	q7, q7, q1
   1267	vadd.i32	q5, q5, q0
   1268	vtrn.32		q11, q14
   1269	vadd.i32	q6, q6, q3
   1270	add		r2, sp, #528
   1271	vadd.i32	q10, q10, q2
   1272	vtrn.32		d24, d25
   1273	vst1.8		{d12-d13}, [r2, : 128]!
   1274	vshl.i32	q6, q13, #1
   1275	vst1.8		{d20-d21}, [r2, : 128]!
   1276	vshl.i32	q10, q14, #1
   1277	vst1.8		{d12-d13}, [r2, : 128]!
   1278	vshl.i32	q15, q12, #1
   1279	vadd.i32	q8, q8, q4
   1280	vext.32		d10, d31, d30, #0
   1281	vadd.i32	q7, q7, q1
   1282	vst1.8		{d16-d17}, [r2, : 128]!
   1283	vmull.s32	q8, d18, d5
   1284	vmlal.s32	q8, d26, d4
   1285	vmlal.s32	q8, d19, d9
   1286	vmlal.s32	q8, d27, d3
   1287	vmlal.s32	q8, d22, d8
   1288	vmlal.s32	q8, d28, d2
   1289	vmlal.s32	q8, d23, d7
   1290	vmlal.s32	q8, d29, d1
   1291	vmlal.s32	q8, d24, d6
   1292	vmlal.s32	q8, d25, d0
   1293	vst1.8		{d14-d15}, [r2, : 128]!
   1294	vmull.s32	q2, d18, d4
   1295	vmlal.s32	q2, d12, d9
   1296	vmlal.s32	q2, d13, d8
   1297	vmlal.s32	q2, d19, d3
   1298	vmlal.s32	q2, d22, d2
   1299	vmlal.s32	q2, d23, d1
   1300	vmlal.s32	q2, d24, d0
   1301	vst1.8		{d20-d21}, [r2, : 128]!
   1302	vmull.s32	q7, d18, d9
   1303	vmlal.s32	q7, d26, d3
   1304	vmlal.s32	q7, d19, d8
   1305	vmlal.s32	q7, d27, d2
   1306	vmlal.s32	q7, d22, d7
   1307	vmlal.s32	q7, d28, d1
   1308	vmlal.s32	q7, d23, d6
   1309	vmlal.s32	q7, d29, d0
   1310	vst1.8		{d10-d11}, [r2, : 128]!
   1311	vmull.s32	q5, d18, d3
   1312	vmlal.s32	q5, d19, d2
   1313	vmlal.s32	q5, d22, d1
   1314	vmlal.s32	q5, d23, d0
   1315	vmlal.s32	q5, d12, d8
   1316	vst1.8		{d16-d17}, [r2, : 128]!
   1317	vmull.s32	q4, d18, d8
   1318	vmlal.s32	q4, d26, d2
   1319	vmlal.s32	q4, d19, d7
   1320	vmlal.s32	q4, d27, d1
   1321	vmlal.s32	q4, d22, d6
   1322	vmlal.s32	q4, d28, d0
   1323	vmull.s32	q8, d18, d7
   1324	vmlal.s32	q8, d26, d1
   1325	vmlal.s32	q8, d19, d6
   1326	vmlal.s32	q8, d27, d0
   1327	add		r2, sp, #544
   1328	vld1.8		{d20-d21}, [r2, : 128]
   1329	vmlal.s32	q7, d24, d21
   1330	vmlal.s32	q7, d25, d20
   1331	vmlal.s32	q4, d23, d21
   1332	vmlal.s32	q4, d29, d20
   1333	vmlal.s32	q8, d22, d21
   1334	vmlal.s32	q8, d28, d20
   1335	vmlal.s32	q5, d24, d20
   1336	vst1.8		{d14-d15}, [r2, : 128]
   1337	vmull.s32	q7, d18, d6
   1338	vmlal.s32	q7, d26, d0
   1339	add		r2, sp, #624
   1340	vld1.8		{d30-d31}, [r2, : 128]
   1341	vmlal.s32	q2, d30, d21
   1342	vmlal.s32	q7, d19, d21
   1343	vmlal.s32	q7, d27, d20
   1344	add		r2, sp, #592
   1345	vld1.8		{d26-d27}, [r2, : 128]
   1346	vmlal.s32	q4, d25, d27
   1347	vmlal.s32	q8, d29, d27
   1348	vmlal.s32	q8, d25, d26
   1349	vmlal.s32	q7, d28, d27
   1350	vmlal.s32	q7, d29, d26
   1351	add		r2, sp, #576
   1352	vld1.8		{d28-d29}, [r2, : 128]
   1353	vmlal.s32	q4, d24, d29
   1354	vmlal.s32	q8, d23, d29
   1355	vmlal.s32	q8, d24, d28
   1356	vmlal.s32	q7, d22, d29
   1357	vmlal.s32	q7, d23, d28
   1358	vst1.8		{d8-d9}, [r2, : 128]
   1359	add		r2, sp, #528
   1360	vld1.8		{d8-d9}, [r2, : 128]
   1361	vmlal.s32	q7, d24, d9
   1362	vmlal.s32	q7, d25, d31
   1363	vmull.s32	q1, d18, d2
   1364	vmlal.s32	q1, d19, d1
   1365	vmlal.s32	q1, d22, d0
   1366	vmlal.s32	q1, d24, d27
   1367	vmlal.s32	q1, d23, d20
   1368	vmlal.s32	q1, d12, d7
   1369	vmlal.s32	q1, d13, d6
   1370	vmull.s32	q6, d18, d1
   1371	vmlal.s32	q6, d19, d0
   1372	vmlal.s32	q6, d23, d27
   1373	vmlal.s32	q6, d22, d20
   1374	vmlal.s32	q6, d24, d26
   1375	vmull.s32	q0, d18, d0
   1376	vmlal.s32	q0, d22, d27
   1377	vmlal.s32	q0, d23, d26
   1378	vmlal.s32	q0, d24, d31
   1379	vmlal.s32	q0, d19, d20
   1380	add		r2, sp, #608
   1381	vld1.8		{d18-d19}, [r2, : 128]
   1382	vmlal.s32	q2, d18, d7
   1383	vmlal.s32	q5, d18, d6
   1384	vmlal.s32	q1, d18, d21
   1385	vmlal.s32	q0, d18, d28
   1386	vmlal.s32	q6, d18, d29
   1387	vmlal.s32	q2, d19, d6
   1388	vmlal.s32	q5, d19, d21
   1389	vmlal.s32	q1, d19, d29
   1390	vmlal.s32	q0, d19, d9
   1391	vmlal.s32	q6, d19, d28
   1392	add		r2, sp, #560
   1393	vld1.8		{d18-d19}, [r2, : 128]
   1394	add		r2, sp, #480
   1395	vld1.8		{d22-d23}, [r2, : 128]
   1396	vmlal.s32	q5, d19, d7
   1397	vmlal.s32	q0, d18, d21
   1398	vmlal.s32	q0, d19, d29
   1399	vmlal.s32	q6, d18, d6
   1400	add		r2, sp, #496
   1401	vld1.8		{d6-d7}, [r2, : 128]
   1402	vmlal.s32	q6, d19, d21
   1403	add		r2, sp, #544
   1404	vld1.8		{d18-d19}, [r2, : 128]
   1405	vmlal.s32	q0, d30, d8
   1406	add		r2, sp, #640
   1407	vld1.8		{d20-d21}, [r2, : 128]
   1408	vmlal.s32	q5, d30, d29
   1409	add		r2, sp, #576
   1410	vld1.8		{d24-d25}, [r2, : 128]
   1411	vmlal.s32	q1, d30, d28
   1412	vadd.i64	q13, q0, q11
   1413	vadd.i64	q14, q5, q11
   1414	vmlal.s32	q6, d30, d9
   1415	vshr.s64	q4, q13, #26
   1416	vshr.s64	q13, q14, #26
   1417	vadd.i64	q7, q7, q4
   1418	vshl.i64	q4, q4, #26
   1419	vadd.i64	q14, q7, q3
   1420	vadd.i64	q9, q9, q13
   1421	vshl.i64	q13, q13, #26
   1422	vadd.i64	q15, q9, q3
   1423	vsub.i64	q0, q0, q4
   1424	vshr.s64	q4, q14, #25
   1425	vsub.i64	q5, q5, q13
   1426	vshr.s64	q13, q15, #25
   1427	vadd.i64	q6, q6, q4
   1428	vshl.i64	q4, q4, #25
   1429	vadd.i64	q14, q6, q11
   1430	vadd.i64	q2, q2, q13
   1431	vsub.i64	q4, q7, q4
   1432	vshr.s64	q7, q14, #26
   1433	vshl.i64	q13, q13, #25
   1434	vadd.i64	q14, q2, q11
   1435	vadd.i64	q8, q8, q7
   1436	vshl.i64	q7, q7, #26
   1437	vadd.i64	q15, q8, q3
   1438	vsub.i64	q9, q9, q13
   1439	vshr.s64	q13, q14, #26
   1440	vsub.i64	q6, q6, q7
   1441	vshr.s64	q7, q15, #25
   1442	vadd.i64	q10, q10, q13
   1443	vshl.i64	q13, q13, #26
   1444	vadd.i64	q14, q10, q3
   1445	vadd.i64	q1, q1, q7
   1446	add		r2, r3, #240
   1447	vshl.i64	q7, q7, #25
   1448	add		r4, r3, #144
   1449	vadd.i64	q15, q1, q11
   1450	add		r2, r2, #8
   1451	vsub.i64	q2, q2, q13
   1452	add		r4, r4, #8
   1453	vshr.s64	q13, q14, #25
   1454	vsub.i64	q7, q8, q7
   1455	vshr.s64	q8, q15, #26
   1456	vadd.i64	q14, q13, q13
   1457	vadd.i64	q12, q12, q8
   1458	vtrn.32		d12, d14
   1459	vshl.i64	q8, q8, #26
   1460	vtrn.32		d13, d15
   1461	vadd.i64	q3, q12, q3
   1462	vadd.i64	q0, q0, q14
   1463	vst1.8		d12, [r2, : 64]!
   1464	vshl.i64	q7, q13, #4
   1465	vst1.8		d13, [r4, : 64]!
   1466	vsub.i64	q1, q1, q8
   1467	vshr.s64	q3, q3, #25
   1468	vadd.i64	q0, q0, q7
   1469	vadd.i64	q5, q5, q3
   1470	vshl.i64	q3, q3, #25
   1471	vadd.i64	q6, q5, q11
   1472	vadd.i64	q0, q0, q13
   1473	vshl.i64	q7, q13, #25
   1474	vadd.i64	q8, q0, q11
   1475	vsub.i64	q3, q12, q3
   1476	vshr.s64	q6, q6, #26
   1477	vsub.i64	q7, q10, q7
   1478	vtrn.32		d2, d6
   1479	vshr.s64	q8, q8, #26
   1480	vtrn.32		d3, d7
   1481	vadd.i64	q3, q9, q6
   1482	vst1.8		d2, [r2, : 64]
   1483	vshl.i64	q6, q6, #26
   1484	vst1.8		d3, [r4, : 64]
   1485	vadd.i64	q1, q4, q8
   1486	vtrn.32		d4, d14
   1487	vshl.i64	q4, q8, #26
   1488	vtrn.32		d5, d15
   1489	vsub.i64	q5, q5, q6
   1490	add		r2, r2, #16
   1491	vsub.i64	q0, q0, q4
   1492	vst1.8		d4, [r2, : 64]
   1493	add		r4, r4, #16
   1494	vst1.8		d5, [r4, : 64]
   1495	vtrn.32		d10, d6
   1496	vtrn.32		d11, d7
   1497	sub		r2, r2, #8
   1498	sub		r4, r4, #8
   1499	vtrn.32		d0, d2
   1500	vtrn.32		d1, d3
   1501	vst1.8		d10, [r2, : 64]
   1502	vst1.8		d11, [r4, : 64]
   1503	sub		r2, r2, #24
   1504	sub		r4, r4, #24
   1505	vst1.8		d0, [r2, : 64]
   1506	vst1.8		d1, [r4, : 64]
   1507	ldr		r2, [sp, #456]
   1508	ldr		r4, [sp, #460]
   1509	subs		r5, r2, #1
   1510	bge		.Lmainloop
   1511	add		r1, r3, #144
   1512	add		r2, r3, #336
   1513	vld1.8		{d0-d1}, [r1, : 128]!
   1514	vld1.8		{d2-d3}, [r1, : 128]!
   1515	vld1.8		{d4}, [r1, : 64]
   1516	vst1.8		{d0-d1}, [r2, : 128]!
   1517	vst1.8		{d2-d3}, [r2, : 128]!
   1518	vst1.8		d4, [r2, : 64]
   1519	movw		r1, #0
   1520.Linvertloop:
   1521	add		r2, r3, #144
   1522	movw		r4, #0
   1523	movw		r5, #2
   1524	cmp		r1, #1
   1525	moveq		r5, #1
   1526	addeq		r2, r3, #336
   1527	addeq		r4, r3, #48
   1528	cmp		r1, #2
   1529	moveq		r5, #1
   1530	addeq		r2, r3, #48
   1531	cmp		r1, #3
   1532	moveq		r5, #5
   1533	addeq		r4, r3, #336
   1534	cmp		r1, #4
   1535	moveq		r5, #10
   1536	cmp		r1, #5
   1537	moveq		r5, #20
   1538	cmp		r1, #6
   1539	moveq		r5, #10
   1540	addeq		r2, r3, #336
   1541	addeq		r4, r3, #336
   1542	cmp		r1, #7
   1543	moveq		r5, #50
   1544	cmp		r1, #8
   1545	moveq		r5, #100
   1546	cmp		r1, #9
   1547	moveq		r5, #50
   1548	addeq		r2, r3, #336
   1549	cmp		r1, #10
   1550	moveq		r5, #5
   1551	addeq		r2, r3, #48
   1552	cmp		r1, #11
   1553	moveq		r5, #0
   1554	addeq		r2, r3, #96
   1555	add		r6, r3, #144
   1556	add		r7, r3, #288
   1557	vld1.8		{d0-d1}, [r6, : 128]!
   1558	vld1.8		{d2-d3}, [r6, : 128]!
   1559	vld1.8		{d4}, [r6, : 64]
   1560	vst1.8		{d0-d1}, [r7, : 128]!
   1561	vst1.8		{d2-d3}, [r7, : 128]!
   1562	vst1.8		d4, [r7, : 64]
   1563	cmp		r5, #0
   1564	beq		.Lskipsquaringloop
   1565.Lsquaringloop:
   1566	add		r6, r3, #288
   1567	add		r7, r3, #288
   1568	add		r8, r3, #288
   1569	vmov.i32	q0, #19
   1570	vmov.i32	q1, #0
   1571	vmov.i32	q2, #1
   1572	vzip.i32	q1, q2
   1573	vld1.8		{d4-d5}, [r7, : 128]!
   1574	vld1.8		{d6-d7}, [r7, : 128]!
   1575	vld1.8		{d9}, [r7, : 64]
   1576	vld1.8		{d10-d11}, [r6, : 128]!
   1577	add		r7, sp, #384
   1578	vld1.8		{d12-d13}, [r6, : 128]!
   1579	vmul.i32	q7, q2, q0
   1580	vld1.8		{d8}, [r6, : 64]
   1581	vext.32		d17, d11, d10, #1
   1582	vmul.i32	q9, q3, q0
   1583	vext.32		d16, d10, d8, #1
   1584	vshl.u32	q10, q5, q1
   1585	vext.32		d22, d14, d4, #1
   1586	vext.32		d24, d18, d6, #1
   1587	vshl.u32	q13, q6, q1
   1588	vshl.u32	d28, d8, d2
   1589	vrev64.i32	d22, d22
   1590	vmul.i32	d1, d9, d1
   1591	vrev64.i32	d24, d24
   1592	vext.32		d29, d8, d13, #1
   1593	vext.32		d0, d1, d9, #1
   1594	vrev64.i32	d0, d0
   1595	vext.32		d2, d9, d1, #1
   1596	vext.32		d23, d15, d5, #1
   1597	vmull.s32	q4, d20, d4
   1598	vrev64.i32	d23, d23
   1599	vmlal.s32	q4, d21, d1
   1600	vrev64.i32	d2, d2
   1601	vmlal.s32	q4, d26, d19
   1602	vext.32		d3, d5, d15, #1
   1603	vmlal.s32	q4, d27, d18
   1604	vrev64.i32	d3, d3
   1605	vmlal.s32	q4, d28, d15
   1606	vext.32		d14, d12, d11, #1
   1607	vmull.s32	q5, d16, d23
   1608	vext.32		d15, d13, d12, #1
   1609	vmlal.s32	q5, d17, d4
   1610	vst1.8		d8, [r7, : 64]!
   1611	vmlal.s32	q5, d14, d1
   1612	vext.32		d12, d9, d8, #0
   1613	vmlal.s32	q5, d15, d19
   1614	vmov.i64	d13, #0
   1615	vmlal.s32	q5, d29, d18
   1616	vext.32		d25, d19, d7, #1
   1617	vmlal.s32	q6, d20, d5
   1618	vrev64.i32	d25, d25
   1619	vmlal.s32	q6, d21, d4
   1620	vst1.8		d11, [r7, : 64]!
   1621	vmlal.s32	q6, d26, d1
   1622	vext.32		d9, d10, d10, #0
   1623	vmlal.s32	q6, d27, d19
   1624	vmov.i64	d8, #0
   1625	vmlal.s32	q6, d28, d18
   1626	vmlal.s32	q4, d16, d24
   1627	vmlal.s32	q4, d17, d5
   1628	vmlal.s32	q4, d14, d4
   1629	vst1.8		d12, [r7, : 64]!
   1630	vmlal.s32	q4, d15, d1
   1631	vext.32		d10, d13, d12, #0
   1632	vmlal.s32	q4, d29, d19
   1633	vmov.i64	d11, #0
   1634	vmlal.s32	q5, d20, d6
   1635	vmlal.s32	q5, d21, d5
   1636	vmlal.s32	q5, d26, d4
   1637	vext.32		d13, d8, d8, #0
   1638	vmlal.s32	q5, d27, d1
   1639	vmov.i64	d12, #0
   1640	vmlal.s32	q5, d28, d19
   1641	vst1.8		d9, [r7, : 64]!
   1642	vmlal.s32	q6, d16, d25
   1643	vmlal.s32	q6, d17, d6
   1644	vst1.8		d10, [r7, : 64]
   1645	vmlal.s32	q6, d14, d5
   1646	vext.32		d8, d11, d10, #0
   1647	vmlal.s32	q6, d15, d4
   1648	vmov.i64	d9, #0
   1649	vmlal.s32	q6, d29, d1
   1650	vmlal.s32	q4, d20, d7
   1651	vmlal.s32	q4, d21, d6
   1652	vmlal.s32	q4, d26, d5
   1653	vext.32		d11, d12, d12, #0
   1654	vmlal.s32	q4, d27, d4
   1655	vmov.i64	d10, #0
   1656	vmlal.s32	q4, d28, d1
   1657	vmlal.s32	q5, d16, d0
   1658	sub		r6, r7, #32
   1659	vmlal.s32	q5, d17, d7
   1660	vmlal.s32	q5, d14, d6
   1661	vext.32		d30, d9, d8, #0
   1662	vmlal.s32	q5, d15, d5
   1663	vld1.8		{d31}, [r6, : 64]!
   1664	vmlal.s32	q5, d29, d4
   1665	vmlal.s32	q15, d20, d0
   1666	vext.32		d0, d6, d18, #1
   1667	vmlal.s32	q15, d21, d25
   1668	vrev64.i32	d0, d0
   1669	vmlal.s32	q15, d26, d24
   1670	vext.32		d1, d7, d19, #1
   1671	vext.32		d7, d10, d10, #0
   1672	vmlal.s32	q15, d27, d23
   1673	vrev64.i32	d1, d1
   1674	vld1.8		{d6}, [r6, : 64]
   1675	vmlal.s32	q15, d28, d22
   1676	vmlal.s32	q3, d16, d4
   1677	add		r6, r6, #24
   1678	vmlal.s32	q3, d17, d2
   1679	vext.32		d4, d31, d30, #0
   1680	vmov		d17, d11
   1681	vmlal.s32	q3, d14, d1
   1682	vext.32		d11, d13, d13, #0
   1683	vext.32		d13, d30, d30, #0
   1684	vmlal.s32	q3, d15, d0
   1685	vext.32		d1, d8, d8, #0
   1686	vmlal.s32	q3, d29, d3
   1687	vld1.8		{d5}, [r6, : 64]
   1688	sub		r6, r6, #16
   1689	vext.32		d10, d6, d6, #0
   1690	vmov.i32	q1, #0xffffffff
   1691	vshl.i64	q4, q1, #25
   1692	add		r7, sp, #480
   1693	vld1.8		{d14-d15}, [r7, : 128]
   1694	vadd.i64	q9, q2, q7
   1695	vshl.i64	q1, q1, #26
   1696	vshr.s64	q10, q9, #26
   1697	vld1.8		{d0}, [r6, : 64]!
   1698	vadd.i64	q5, q5, q10
   1699	vand		q9, q9, q1
   1700	vld1.8		{d16}, [r6, : 64]!
   1701	add		r6, sp, #496
   1702	vld1.8		{d20-d21}, [r6, : 128]
   1703	vadd.i64	q11, q5, q10
   1704	vsub.i64	q2, q2, q9
   1705	vshr.s64	q9, q11, #25
   1706	vext.32		d12, d5, d4, #0
   1707	vand		q11, q11, q4
   1708	vadd.i64	q0, q0, q9
   1709	vmov		d19, d7
   1710	vadd.i64	q3, q0, q7
   1711	vsub.i64	q5, q5, q11
   1712	vshr.s64	q11, q3, #26
   1713	vext.32		d18, d11, d10, #0
   1714	vand		q3, q3, q1
   1715	vadd.i64	q8, q8, q11
   1716	vadd.i64	q11, q8, q10
   1717	vsub.i64	q0, q0, q3
   1718	vshr.s64	q3, q11, #25
   1719	vand		q11, q11, q4
   1720	vadd.i64	q3, q6, q3
   1721	vadd.i64	q6, q3, q7
   1722	vsub.i64	q8, q8, q11
   1723	vshr.s64	q11, q6, #26
   1724	vand		q6, q6, q1
   1725	vadd.i64	q9, q9, q11
   1726	vadd.i64	d25, d19, d21
   1727	vsub.i64	q3, q3, q6
   1728	vshr.s64	d23, d25, #25
   1729	vand		q4, q12, q4
   1730	vadd.i64	d21, d23, d23
   1731	vshl.i64	d25, d23, #4
   1732	vadd.i64	d21, d21, d23
   1733	vadd.i64	d25, d25, d21
   1734	vadd.i64	d4, d4, d25
   1735	vzip.i32	q0, q8
   1736	vadd.i64	d12, d4, d14
   1737	add		r6, r8, #8
   1738	vst1.8		d0, [r6, : 64]
   1739	vsub.i64	d19, d19, d9
   1740	add		r6, r6, #16
   1741	vst1.8		d16, [r6, : 64]
   1742	vshr.s64	d22, d12, #26
   1743	vand		q0, q6, q1
   1744	vadd.i64	d10, d10, d22
   1745	vzip.i32	q3, q9
   1746	vsub.i64	d4, d4, d0
   1747	sub		r6, r6, #8
   1748	vst1.8		d6, [r6, : 64]
   1749	add		r6, r6, #16
   1750	vst1.8		d18, [r6, : 64]
   1751	vzip.i32	q2, q5
   1752	sub		r6, r6, #32
   1753	vst1.8		d4, [r6, : 64]
   1754	subs		r5, r5, #1
   1755	bhi		.Lsquaringloop
   1756.Lskipsquaringloop:
   1757	mov		r2, r2
   1758	add		r5, r3, #288
   1759	add		r6, r3, #144
   1760	vmov.i32	q0, #19
   1761	vmov.i32	q1, #0
   1762	vmov.i32	q2, #1
   1763	vzip.i32	q1, q2
   1764	vld1.8		{d4-d5}, [r5, : 128]!
   1765	vld1.8		{d6-d7}, [r5, : 128]!
   1766	vld1.8		{d9}, [r5, : 64]
   1767	vld1.8		{d10-d11}, [r2, : 128]!
   1768	add		r5, sp, #384
   1769	vld1.8		{d12-d13}, [r2, : 128]!
   1770	vmul.i32	q7, q2, q0
   1771	vld1.8		{d8}, [r2, : 64]
   1772	vext.32		d17, d11, d10, #1
   1773	vmul.i32	q9, q3, q0
   1774	vext.32		d16, d10, d8, #1
   1775	vshl.u32	q10, q5, q1
   1776	vext.32		d22, d14, d4, #1
   1777	vext.32		d24, d18, d6, #1
   1778	vshl.u32	q13, q6, q1
   1779	vshl.u32	d28, d8, d2
   1780	vrev64.i32	d22, d22
   1781	vmul.i32	d1, d9, d1
   1782	vrev64.i32	d24, d24
   1783	vext.32		d29, d8, d13, #1
   1784	vext.32		d0, d1, d9, #1
   1785	vrev64.i32	d0, d0
   1786	vext.32		d2, d9, d1, #1
   1787	vext.32		d23, d15, d5, #1
   1788	vmull.s32	q4, d20, d4
   1789	vrev64.i32	d23, d23
   1790	vmlal.s32	q4, d21, d1
   1791	vrev64.i32	d2, d2
   1792	vmlal.s32	q4, d26, d19
   1793	vext.32		d3, d5, d15, #1
   1794	vmlal.s32	q4, d27, d18
   1795	vrev64.i32	d3, d3
   1796	vmlal.s32	q4, d28, d15
   1797	vext.32		d14, d12, d11, #1
   1798	vmull.s32	q5, d16, d23
   1799	vext.32		d15, d13, d12, #1
   1800	vmlal.s32	q5, d17, d4
   1801	vst1.8		d8, [r5, : 64]!
   1802	vmlal.s32	q5, d14, d1
   1803	vext.32		d12, d9, d8, #0
   1804	vmlal.s32	q5, d15, d19
   1805	vmov.i64	d13, #0
   1806	vmlal.s32	q5, d29, d18
   1807	vext.32		d25, d19, d7, #1
   1808	vmlal.s32	q6, d20, d5
   1809	vrev64.i32	d25, d25
   1810	vmlal.s32	q6, d21, d4
   1811	vst1.8		d11, [r5, : 64]!
   1812	vmlal.s32	q6, d26, d1
   1813	vext.32		d9, d10, d10, #0
   1814	vmlal.s32	q6, d27, d19
   1815	vmov.i64	d8, #0
   1816	vmlal.s32	q6, d28, d18
   1817	vmlal.s32	q4, d16, d24
   1818	vmlal.s32	q4, d17, d5
   1819	vmlal.s32	q4, d14, d4
   1820	vst1.8		d12, [r5, : 64]!
   1821	vmlal.s32	q4, d15, d1
   1822	vext.32		d10, d13, d12, #0
   1823	vmlal.s32	q4, d29, d19
   1824	vmov.i64	d11, #0
   1825	vmlal.s32	q5, d20, d6
   1826	vmlal.s32	q5, d21, d5
   1827	vmlal.s32	q5, d26, d4
   1828	vext.32		d13, d8, d8, #0
   1829	vmlal.s32	q5, d27, d1
   1830	vmov.i64	d12, #0
   1831	vmlal.s32	q5, d28, d19
   1832	vst1.8		d9, [r5, : 64]!
   1833	vmlal.s32	q6, d16, d25
   1834	vmlal.s32	q6, d17, d6
   1835	vst1.8		d10, [r5, : 64]
   1836	vmlal.s32	q6, d14, d5
   1837	vext.32		d8, d11, d10, #0
   1838	vmlal.s32	q6, d15, d4
   1839	vmov.i64	d9, #0
   1840	vmlal.s32	q6, d29, d1
   1841	vmlal.s32	q4, d20, d7
   1842	vmlal.s32	q4, d21, d6
   1843	vmlal.s32	q4, d26, d5
   1844	vext.32		d11, d12, d12, #0
   1845	vmlal.s32	q4, d27, d4
   1846	vmov.i64	d10, #0
   1847	vmlal.s32	q4, d28, d1
   1848	vmlal.s32	q5, d16, d0
   1849	sub		r2, r5, #32
   1850	vmlal.s32	q5, d17, d7
   1851	vmlal.s32	q5, d14, d6
   1852	vext.32		d30, d9, d8, #0
   1853	vmlal.s32	q5, d15, d5
   1854	vld1.8		{d31}, [r2, : 64]!
   1855	vmlal.s32	q5, d29, d4
   1856	vmlal.s32	q15, d20, d0
   1857	vext.32		d0, d6, d18, #1
   1858	vmlal.s32	q15, d21, d25
   1859	vrev64.i32	d0, d0
   1860	vmlal.s32	q15, d26, d24
   1861	vext.32		d1, d7, d19, #1
   1862	vext.32		d7, d10, d10, #0
   1863	vmlal.s32	q15, d27, d23
   1864	vrev64.i32	d1, d1
   1865	vld1.8		{d6}, [r2, : 64]
   1866	vmlal.s32	q15, d28, d22
   1867	vmlal.s32	q3, d16, d4
   1868	add		r2, r2, #24
   1869	vmlal.s32	q3, d17, d2
   1870	vext.32		d4, d31, d30, #0
   1871	vmov		d17, d11
   1872	vmlal.s32	q3, d14, d1
   1873	vext.32		d11, d13, d13, #0
   1874	vext.32		d13, d30, d30, #0
   1875	vmlal.s32	q3, d15, d0
   1876	vext.32		d1, d8, d8, #0
   1877	vmlal.s32	q3, d29, d3
   1878	vld1.8		{d5}, [r2, : 64]
   1879	sub		r2, r2, #16
   1880	vext.32		d10, d6, d6, #0
   1881	vmov.i32	q1, #0xffffffff
   1882	vshl.i64	q4, q1, #25
   1883	add		r5, sp, #480
   1884	vld1.8		{d14-d15}, [r5, : 128]
   1885	vadd.i64	q9, q2, q7
   1886	vshl.i64	q1, q1, #26
   1887	vshr.s64	q10, q9, #26
   1888	vld1.8		{d0}, [r2, : 64]!
   1889	vadd.i64	q5, q5, q10
   1890	vand		q9, q9, q1
   1891	vld1.8		{d16}, [r2, : 64]!
   1892	add		r2, sp, #496
   1893	vld1.8		{d20-d21}, [r2, : 128]
   1894	vadd.i64	q11, q5, q10
   1895	vsub.i64	q2, q2, q9
   1896	vshr.s64	q9, q11, #25
   1897	vext.32		d12, d5, d4, #0
   1898	vand		q11, q11, q4
   1899	vadd.i64	q0, q0, q9
   1900	vmov		d19, d7
   1901	vadd.i64	q3, q0, q7
   1902	vsub.i64	q5, q5, q11
   1903	vshr.s64	q11, q3, #26
   1904	vext.32		d18, d11, d10, #0
   1905	vand		q3, q3, q1
   1906	vadd.i64	q8, q8, q11
   1907	vadd.i64	q11, q8, q10
   1908	vsub.i64	q0, q0, q3
   1909	vshr.s64	q3, q11, #25
   1910	vand		q11, q11, q4
   1911	vadd.i64	q3, q6, q3
   1912	vadd.i64	q6, q3, q7
   1913	vsub.i64	q8, q8, q11
   1914	vshr.s64	q11, q6, #26
   1915	vand		q6, q6, q1
   1916	vadd.i64	q9, q9, q11
   1917	vadd.i64	d25, d19, d21
   1918	vsub.i64	q3, q3, q6
   1919	vshr.s64	d23, d25, #25
   1920	vand		q4, q12, q4
   1921	vadd.i64	d21, d23, d23
   1922	vshl.i64	d25, d23, #4
   1923	vadd.i64	d21, d21, d23
   1924	vadd.i64	d25, d25, d21
   1925	vadd.i64	d4, d4, d25
   1926	vzip.i32	q0, q8
   1927	vadd.i64	d12, d4, d14
   1928	add		r2, r6, #8
   1929	vst1.8		d0, [r2, : 64]
   1930	vsub.i64	d19, d19, d9
   1931	add		r2, r2, #16
   1932	vst1.8		d16, [r2, : 64]
   1933	vshr.s64	d22, d12, #26
   1934	vand		q0, q6, q1
   1935	vadd.i64	d10, d10, d22
   1936	vzip.i32	q3, q9
   1937	vsub.i64	d4, d4, d0
   1938	sub		r2, r2, #8
   1939	vst1.8		d6, [r2, : 64]
   1940	add		r2, r2, #16
   1941	vst1.8		d18, [r2, : 64]
   1942	vzip.i32	q2, q5
   1943	sub		r2, r2, #32
   1944	vst1.8		d4, [r2, : 64]
   1945	cmp		r4, #0
   1946	beq		.Lskippostcopy
   1947	add		r2, r3, #144
   1948	mov		r4, r4
   1949	vld1.8		{d0-d1}, [r2, : 128]!
   1950	vld1.8		{d2-d3}, [r2, : 128]!
   1951	vld1.8		{d4}, [r2, : 64]
   1952	vst1.8		{d0-d1}, [r4, : 128]!
   1953	vst1.8		{d2-d3}, [r4, : 128]!
   1954	vst1.8		d4, [r4, : 64]
   1955.Lskippostcopy:
   1956	cmp		r1, #1
   1957	bne		.Lskipfinalcopy
   1958	add		r2, r3, #288
   1959	add		r4, r3, #144
   1960	vld1.8		{d0-d1}, [r2, : 128]!
   1961	vld1.8		{d2-d3}, [r2, : 128]!
   1962	vld1.8		{d4}, [r2, : 64]
   1963	vst1.8		{d0-d1}, [r4, : 128]!
   1964	vst1.8		{d2-d3}, [r4, : 128]!
   1965	vst1.8		d4, [r4, : 64]
   1966.Lskipfinalcopy:
   1967	add		r1, r1, #1
   1968	cmp		r1, #12
   1969	blo		.Linvertloop
   1970	add		r1, r3, #144
   1971	ldr		r2, [r1], #4
   1972	ldr		r3, [r1], #4
   1973	ldr		r4, [r1], #4
   1974	ldr		r5, [r1], #4
   1975	ldr		r6, [r1], #4
   1976	ldr		r7, [r1], #4
   1977	ldr		r8, [r1], #4
   1978	ldr		r9, [r1], #4
   1979	ldr		r10, [r1], #4
   1980	ldr		r1, [r1]
   1981	add		r11, r1, r1, LSL #4
   1982	add		r11, r11, r1, LSL #1
   1983	add		r11, r11, #16777216
   1984	mov		r11, r11, ASR #25
   1985	add		r11, r11, r2
   1986	mov		r11, r11, ASR #26
   1987	add		r11, r11, r3
   1988	mov		r11, r11, ASR #25
   1989	add		r11, r11, r4
   1990	mov		r11, r11, ASR #26
   1991	add		r11, r11, r5
   1992	mov		r11, r11, ASR #25
   1993	add		r11, r11, r6
   1994	mov		r11, r11, ASR #26
   1995	add		r11, r11, r7
   1996	mov		r11, r11, ASR #25
   1997	add		r11, r11, r8
   1998	mov		r11, r11, ASR #26
   1999	add		r11, r11, r9
   2000	mov		r11, r11, ASR #25
   2001	add		r11, r11, r10
   2002	mov		r11, r11, ASR #26
   2003	add		r11, r11, r1
   2004	mov		r11, r11, ASR #25
   2005	add		r2, r2, r11
   2006	add		r2, r2, r11, LSL #1
   2007	add		r2, r2, r11, LSL #4
   2008	mov		r11, r2, ASR #26
   2009	add		r3, r3, r11
   2010	sub		r2, r2, r11, LSL #26
   2011	mov		r11, r3, ASR #25
   2012	add		r4, r4, r11
   2013	sub		r3, r3, r11, LSL #25
   2014	mov		r11, r4, ASR #26
   2015	add		r5, r5, r11
   2016	sub		r4, r4, r11, LSL #26
   2017	mov		r11, r5, ASR #25
   2018	add		r6, r6, r11
   2019	sub		r5, r5, r11, LSL #25
   2020	mov		r11, r6, ASR #26
   2021	add		r7, r7, r11
   2022	sub		r6, r6, r11, LSL #26
   2023	mov		r11, r7, ASR #25
   2024	add		r8, r8, r11
   2025	sub		r7, r7, r11, LSL #25
   2026	mov		r11, r8, ASR #26
   2027	add		r9, r9, r11
   2028	sub		r8, r8, r11, LSL #26
   2029	mov		r11, r9, ASR #25
   2030	add		r10, r10, r11
   2031	sub		r9, r9, r11, LSL #25
   2032	mov		r11, r10, ASR #26
   2033	add		r1, r1, r11
   2034	sub		r10, r10, r11, LSL #26
   2035	mov		r11, r1, ASR #25
   2036	sub		r1, r1, r11, LSL #25
   2037	add		r2, r2, r3, LSL #26
   2038	mov		r3, r3, LSR #6
   2039	add		r3, r3, r4, LSL #19
   2040	mov		r4, r4, LSR #13
   2041	add		r4, r4, r5, LSL #13
   2042	mov		r5, r5, LSR #19
   2043	add		r5, r5, r6, LSL #6
   2044	add		r6, r7, r8, LSL #25
   2045	mov		r7, r8, LSR #7
   2046	add		r7, r7, r9, LSL #19
   2047	mov		r8, r9, LSR #13
   2048	add		r8, r8, r10, LSL #12
   2049	mov		r9, r10, LSR #20
   2050	add		r1, r9, r1, LSL #6
   2051	str		r2, [r0]
   2052	str		r3, [r0, #4]
   2053	str		r4, [r0, #8]
   2054	str		r5, [r0, #12]
   2055	str		r6, [r0, #16]
   2056	str		r7, [r0, #20]
   2057	str		r8, [r0, #24]
   2058	str		r1, [r0, #28]
   2059	movw		r0, #0
   2060	mov		sp, ip
   2061	pop		{r4-r11, pc}
   2062ENDPROC(curve25519_neon)