root/lib/crypto/arm/curve25519-core.S
/* SPDX-License-Identifier: GPL-2.0 OR MIT */
/*
 * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
 *
 * Based on public domain code from Daniel J. Bernstein and Peter Schwabe. This
 * began from SUPERCOP's curve25519/neon2/scalarmult.s, but has subsequently been
 * manually reworked for use in kernel space.
 */

#include <linux/linkage.h>

.text
.arch armv7-a
.fpu neon
.align 4

ENTRY(curve25519_neon)
        push            {r4-r11, lr}
        mov             ip, sp
        sub             r3, sp, #704
        and             r3, r3, #0xfffffff0
        mov             sp, r3
        movw            r4, #0
        movw            r5, #254
        vmov.i32        q0, #1
        vshr.u64        q1, q0, #7
        vshr.u64        q0, q0, #8
        vmov.i32        d4, #19
        vmov.i32        d5, #38
        add             r6, sp, #480
        vst1.8          {d2-d3}, [r6, : 128]!
        vst1.8          {d0-d1}, [r6, : 128]!
        vst1.8          {d4-d5}, [r6, : 128]
        add             r6, r3, #0
        vmov.i32        q2, #0
        vst1.8          {d4-d5}, [r6, : 128]!
        vst1.8          {d4-d5}, [r6, : 128]!
        vst1.8          d4, [r6, : 64]
        add             r6, r3, #0
        movw            r7, #960
        sub             r7, r7, #2
        neg             r7, r7
        sub             r7, r7, r7, LSL #7
        str             r7, [r6]
        add             r6, sp, #672
        vld1.8          {d4-d5}, [r1]!
        vld1.8          {d6-d7}, [r1]
        vst1.8          {d4-d5}, [r6, : 128]!
        vst1.8          {d6-d7}, [r6, : 128]
        sub             r1, r6, #16
        ldrb            r6, [r1]
        and             r6, r6, #248
        strb            r6, [r1]
        ldrb            r6, [r1, #31]
        and             r6, r6, #127
        orr             r6, r6, #64
        strb            r6, [r1, #31]
        vmov.i64        q2, #0xffffffff
        vshr.u64        q3, q2, #7
        vshr.u64        q2, q2, #6
        vld1.8          {d8}, [r2]
        vld1.8          {d10}, [r2]
        add             r2, r2, #6
        vld1.8          {d12}, [r2]
        vld1.8          {d14}, [r2]
        add             r2, r2, #6
        vld1.8          {d16}, [r2]
        add             r2, r2, #4
        vld1.8          {d18}, [r2]
        vld1.8          {d20}, [r2]
        add             r2, r2, #6
        vld1.8          {d22}, [r2]
        add             r2, r2, #2
        vld1.8          {d24}, [r2]
        vld1.8          {d26}, [r2]
        vshr.u64        q5, q5, #26
        vshr.u64        q6, q6, #3
        vshr.u64        q7, q7, #29
        vshr.u64        q8, q8, #6
        vshr.u64        q10, q10, #25
        vshr.u64        q11, q11, #3
        vshr.u64        q12, q12, #12
        vshr.u64        q13, q13, #38
        vand            q4, q4, q2
        vand            q6, q6, q2
        vand            q8, q8, q2
        vand            q10, q10, q2
        vand            q2, q12, q2
        vand            q5, q5, q3
        vand            q7, q7, q3
        vand            q9, q9, q3
        vand            q11, q11, q3
        vand            q3, q13, q3
        add             r2, r3, #48
        vadd.i64        q12, q4, q1
        vadd.i64        q13, q10, q1
        vshr.s64        q12, q12, #26
        vshr.s64        q13, q13, #26
        vadd.i64        q5, q5, q12
        vshl.i64        q12, q12, #26
        vadd.i64        q14, q5, q0
        vadd.i64        q11, q11, q13
        vshl.i64        q13, q13, #26
        vadd.i64        q15, q11, q0
        vsub.i64        q4, q4, q12
        vshr.s64        q12, q14, #25
        vsub.i64        q10, q10, q13
        vshr.s64        q13, q15, #25
        vadd.i64        q6, q6, q12
        vshl.i64        q12, q12, #25
        vadd.i64        q14, q6, q1
        vadd.i64        q2, q2, q13
        vsub.i64        q5, q5, q12
        vshr.s64        q12, q14, #26
        vshl.i64        q13, q13, #25
        vadd.i64        q14, q2, q1
        vadd.i64        q7, q7, q12
        vshl.i64        q12, q12, #26
        vadd.i64        q15, q7, q0
        vsub.i64        q11, q11, q13
        vshr.s64        q13, q14, #26
        vsub.i64        q6, q6, q12
        vshr.s64        q12, q15, #25
        vadd.i64        q3, q3, q13
        vshl.i64        q13, q13, #26
        vadd.i64        q14, q3, q0
        vadd.i64        q8, q8, q12
        vshl.i64        q12, q12, #25
        vadd.i64        q15, q8, q1
        add             r2, r2, #8
        vsub.i64        q2, q2, q13
        vshr.s64        q13, q14, #25
        vsub.i64        q7, q7, q12
        vshr.s64        q12, q15, #26
        vadd.i64        q14, q13, q13
        vadd.i64        q9, q9, q12
        vtrn.32         d12, d14
        vshl.i64        q12, q12, #26
        vtrn.32         d13, d15
        vadd.i64        q0, q9, q0
        vadd.i64        q4, q4, q14
        vst1.8          d12, [r2, : 64]!
        vshl.i64        q6, q13, #4
        vsub.i64        q7, q8, q12
        vshr.s64        q0, q0, #25
        vadd.i64        q4, q4, q6
        vadd.i64        q6, q10, q0
        vshl.i64        q0, q0, #25
        vadd.i64        q8, q6, q1
        vadd.i64        q4, q4, q13
        vshl.i64        q10, q13, #25
        vadd.i64        q1, q4, q1
        vsub.i64        q0, q9, q0
        vshr.s64        q8, q8, #26
        vsub.i64        q3, q3, q10
        vtrn.32         d14, d0
        vshr.s64        q1, q1, #26
        vtrn.32         d15, d1
        vadd.i64        q0, q11, q8
        vst1.8          d14, [r2, : 64]
        vshl.i64        q7, q8, #26
        vadd.i64        q5, q5, q1
        vtrn.32         d4, d6
        vshl.i64        q1, q1, #26
        vtrn.32         d5, d7
        vsub.i64        q3, q6, q7
        add             r2, r2, #16
        vsub.i64        q1, q4, q1
        vst1.8          d4, [r2, : 64]
        vtrn.32         d6, d0
        vtrn.32         d7, d1
        sub             r2, r2, #8
        vtrn.32         d2, d10
        vtrn.32         d3, d11
        vst1.8          d6, [r2, : 64]
        sub             r2, r2, #24
        vst1.8          d2, [r2, : 64]
        add             r2, r3, #96
        vmov.i32        q0, #0
        vmov.i64        d2, #0xff
        vmov.i64        d3, #0
        vshr.u32        q1, q1, #7
        vst1.8          {d2-d3}, [r2, : 128]!
        vst1.8          {d0-d1}, [r2, : 128]!
        vst1.8          d0, [r2, : 64]
        add             r2, r3, #144
        vmov.i32        q0, #0
        vst1.8          {d0-d1}, [r2, : 128]!
        vst1.8          {d0-d1}, [r2, : 128]!
        vst1.8          d0, [r2, : 64]
        add             r2, r3, #240
        vmov.i32        q0, #0
        vmov.i64        d2, #0xff
        vmov.i64        d3, #0
        vshr.u32        q1, q1, #7
        vst1.8          {d2-d3}, [r2, : 128]!
        vst1.8          {d0-d1}, [r2, : 128]!
        vst1.8          d0, [r2, : 64]
        add             r2, r3, #48
        add             r6, r3, #192
        vld1.8          {d0-d1}, [r2, : 128]!
        vld1.8          {d2-d3}, [r2, : 128]!
        vld1.8          {d4}, [r2, : 64]
        vst1.8          {d0-d1}, [r6, : 128]!
        vst1.8          {d2-d3}, [r6, : 128]!
        vst1.8          d4, [r6, : 64]
.Lmainloop:
        mov             r2, r5, LSR #3
        and             r6, r5, #7
        ldrb            r2, [r1, r2]
        mov             r2, r2, LSR r6
        and             r2, r2, #1
        str             r5, [sp, #456]
        eor             r4, r4, r2
        str             r2, [sp, #460]
        neg             r2, r4
        add             r4, r3, #96
        add             r5, r3, #192
        add             r6, r3, #144
        vld1.8          {d8-d9}, [r4, : 128]!
        add             r7, r3, #240
        vld1.8          {d10-d11}, [r5, : 128]!
        veor            q6, q4, q5
        vld1.8          {d14-d15}, [r6, : 128]!
        vdup.i32        q8, r2
        vld1.8          {d18-d19}, [r7, : 128]!
        veor            q10, q7, q9
        vld1.8          {d22-d23}, [r4, : 128]!
        vand            q6, q6, q8
        vld1.8          {d24-d25}, [r5, : 128]!
        vand            q10, q10, q8
        vld1.8          {d26-d27}, [r6, : 128]!
        veor            q4, q4, q6
        vld1.8          {d28-d29}, [r7, : 128]!
        veor            q5, q5, q6
        vld1.8          {d0}, [r4, : 64]
        veor            q6, q7, q10
        vld1.8          {d2}, [r5, : 64]
        veor            q7, q9, q10
        vld1.8          {d4}, [r6, : 64]
        veor            q9, q11, q12
        vld1.8          {d6}, [r7, : 64]
        veor            q10, q0, q1
        sub             r2, r4, #32
        vand            q9, q9, q8
        sub             r4, r5, #32
        vand            q10, q10, q8
        sub             r5, r6, #32
        veor            q11, q11, q9
        sub             r6, r7, #32
        veor            q0, q0, q10
        veor            q9, q12, q9
        veor            q1, q1, q10
        veor            q10, q13, q14
        veor            q12, q2, q3
        vand            q10, q10, q8
        vand            q8, q12, q8
        veor            q12, q13, q10
        veor            q2, q2, q8
        veor            q10, q14, q10
        veor            q3, q3, q8
        vadd.i32        q8, q4, q6
        vsub.i32        q4, q4, q6
        vst1.8          {d16-d17}, [r2, : 128]!
        vadd.i32        q6, q11, q12
        vst1.8          {d8-d9}, [r5, : 128]!
        vsub.i32        q4, q11, q12
        vst1.8          {d12-d13}, [r2, : 128]!
        vadd.i32        q6, q0, q2
        vst1.8          {d8-d9}, [r5, : 128]!
        vsub.i32        q0, q0, q2
        vst1.8          d12, [r2, : 64]
        vadd.i32        q2, q5, q7
        vst1.8          d0, [r5, : 64]
        vsub.i32        q0, q5, q7
        vst1.8          {d4-d5}, [r4, : 128]!
        vadd.i32        q2, q9, q10
        vst1.8          {d0-d1}, [r6, : 128]!
        vsub.i32        q0, q9, q10
        vst1.8          {d4-d5}, [r4, : 128]!
        vadd.i32        q2, q1, q3
        vst1.8          {d0-d1}, [r6, : 128]!
        vsub.i32        q0, q1, q3
        vst1.8          d4, [r4, : 64]
        vst1.8          d0, [r6, : 64]
        add             r2, sp, #512
        add             r4, r3, #96
        add             r5, r3, #144
        vld1.8          {d0-d1}, [r2, : 128]
        vld1.8          {d2-d3}, [r4, : 128]!
        vld1.8          {d4-d5}, [r5, : 128]!
        vzip.i32        q1, q2
        vld1.8          {d6-d7}, [r4, : 128]!
        vld1.8          {d8-d9}, [r5, : 128]!
        vshl.i32        q5, q1, #1
        vzip.i32        q3, q4
        vshl.i32        q6, q2, #1
        vld1.8          {d14}, [r4, : 64]
        vshl.i32        q8, q3, #1
        vld1.8          {d15}, [r5, : 64]
        vshl.i32        q9, q4, #1
        vmul.i32        d21, d7, d1
        vtrn.32         d14, d15
        vmul.i32        q11, q4, q0
        vmul.i32        q0, q7, q0
        vmull.s32       q12, d2, d2
        vmlal.s32       q12, d11, d1
        vmlal.s32       q12, d12, d0
        vmlal.s32       q12, d13, d23
        vmlal.s32       q12, d16, d22
        vmlal.s32       q12, d7, d21
        vmull.s32       q10, d2, d11
        vmlal.s32       q10, d4, d1
        vmlal.s32       q10, d13, d0
        vmlal.s32       q10, d6, d23
        vmlal.s32       q10, d17, d22
        vmull.s32       q13, d10, d4
        vmlal.s32       q13, d11, d3
        vmlal.s32       q13, d13, d1
        vmlal.s32       q13, d16, d0
        vmlal.s32       q13, d17, d23
        vmlal.s32       q13, d8, d22
        vmull.s32       q1, d10, d5
        vmlal.s32       q1, d11, d4
        vmlal.s32       q1, d6, d1
        vmlal.s32       q1, d17, d0
        vmlal.s32       q1, d8, d23
        vmull.s32       q14, d10, d6
        vmlal.s32       q14, d11, d13
        vmlal.s32       q14, d4, d4
        vmlal.s32       q14, d17, d1
        vmlal.s32       q14, d18, d0
        vmlal.s32       q14, d9, d23
        vmull.s32       q11, d10, d7
        vmlal.s32       q11, d11, d6
        vmlal.s32       q11, d12, d5
        vmlal.s32       q11, d8, d1
        vmlal.s32       q11, d19, d0
        vmull.s32       q15, d10, d8
        vmlal.s32       q15, d11, d17
        vmlal.s32       q15, d12, d6
        vmlal.s32       q15, d13, d5
        vmlal.s32       q15, d19, d1
        vmlal.s32       q15, d14, d0
        vmull.s32       q2, d10, d9
        vmlal.s32       q2, d11, d8
        vmlal.s32       q2, d12, d7
        vmlal.s32       q2, d13, d6
        vmlal.s32       q2, d14, d1
        vmull.s32       q0, d15, d1
        vmlal.s32       q0, d10, d14
        vmlal.s32       q0, d11, d19
        vmlal.s32       q0, d12, d8
        vmlal.s32       q0, d13, d17
        vmlal.s32       q0, d6, d6
        add             r2, sp, #480
        vld1.8          {d18-d19}, [r2, : 128]!
        vmull.s32       q3, d16, d7
        vmlal.s32       q3, d10, d15
        vmlal.s32       q3, d11, d14
        vmlal.s32       q3, d12, d9
        vmlal.s32       q3, d13, d8
        vld1.8          {d8-d9}, [r2, : 128]
        vadd.i64        q5, q12, q9
        vadd.i64        q6, q15, q9
        vshr.s64        q5, q5, #26
        vshr.s64        q6, q6, #26
        vadd.i64        q7, q10, q5
        vshl.i64        q5, q5, #26
        vadd.i64        q8, q7, q4
        vadd.i64        q2, q2, q6
        vshl.i64        q6, q6, #26
        vadd.i64        q10, q2, q4
        vsub.i64        q5, q12, q5
        vshr.s64        q8, q8, #25
        vsub.i64        q6, q15, q6
        vshr.s64        q10, q10, #25
        vadd.i64        q12, q13, q8
        vshl.i64        q8, q8, #25
        vadd.i64        q13, q12, q9
        vadd.i64        q0, q0, q10
        vsub.i64        q7, q7, q8
        vshr.s64        q8, q13, #26
        vshl.i64        q10, q10, #25
        vadd.i64        q13, q0, q9
        vadd.i64        q1, q1, q8
        vshl.i64        q8, q8, #26
        vadd.i64        q15, q1, q4
        vsub.i64        q2, q2, q10
        vshr.s64        q10, q13, #26
        vsub.i64        q8, q12, q8
        vshr.s64        q12, q15, #25
        vadd.i64        q3, q3, q10
        vshl.i64        q10, q10, #26
        vadd.i64        q13, q3, q4
        vadd.i64        q14, q14, q12
        add             r2, r3, #288
        vshl.i64        q12, q12, #25
        add             r4, r3, #336
        vadd.i64        q15, q14, q9
        add             r2, r2, #8
        vsub.i64        q0, q0, q10
        add             r4, r4, #8
        vshr.s64        q10, q13, #25
        vsub.i64        q1, q1, q12
        vshr.s64        q12, q15, #26
        vadd.i64        q13, q10, q10
        vadd.i64        q11, q11, q12
        vtrn.32         d16, d2
        vshl.i64        q12, q12, #26
        vtrn.32         d17, d3
        vadd.i64        q1, q11, q4
        vadd.i64        q4, q5, q13
        vst1.8          d16, [r2, : 64]!
        vshl.i64        q5, q10, #4
        vst1.8          d17, [r4, : 64]!
        vsub.i64        q8, q14, q12
        vshr.s64        q1, q1, #25
        vadd.i64        q4, q4, q5
        vadd.i64        q5, q6, q1
        vshl.i64        q1, q1, #25
        vadd.i64        q6, q5, q9
        vadd.i64        q4, q4, q10
        vshl.i64        q10, q10, #25
        vadd.i64        q9, q4, q9
        vsub.i64        q1, q11, q1
        vshr.s64        q6, q6, #26
        vsub.i64        q3, q3, q10
        vtrn.32         d16, d2
        vshr.s64        q9, q9, #26
        vtrn.32         d17, d3
        vadd.i64        q1, q2, q6
        vst1.8          d16, [r2, : 64]
        vshl.i64        q2, q6, #26
        vst1.8          d17, [r4, : 64]
        vadd.i64        q6, q7, q9
        vtrn.32         d0, d6
        vshl.i64        q7, q9, #26
        vtrn.32         d1, d7
        vsub.i64        q2, q5, q2
        add             r2, r2, #16
        vsub.i64        q3, q4, q7
        vst1.8          d0, [r2, : 64]
        add             r4, r4, #16
        vst1.8          d1, [r4, : 64]
        vtrn.32         d4, d2
        vtrn.32         d5, d3
        sub             r2, r2, #8
        sub             r4, r4, #8
        vtrn.32         d6, d12
        vtrn.32         d7, d13
        vst1.8          d4, [r2, : 64]
        vst1.8          d5, [r4, : 64]
        sub             r2, r2, #24
        sub             r4, r4, #24
        vst1.8          d6, [r2, : 64]
        vst1.8          d7, [r4, : 64]
        add             r2, r3, #240
        add             r4, r3, #96
        vld1.8          {d0-d1}, [r4, : 128]!
        vld1.8          {d2-d3}, [r4, : 128]!
        vld1.8          {d4}, [r4, : 64]
        add             r4, r3, #144
        vld1.8          {d6-d7}, [r4, : 128]!
        vtrn.32         q0, q3
        vld1.8          {d8-d9}, [r4, : 128]!
        vshl.i32        q5, q0, #4
        vtrn.32         q1, q4
        vshl.i32        q6, q3, #4
        vadd.i32        q5, q5, q0
        vadd.i32        q6, q6, q3
        vshl.i32        q7, q1, #4
        vld1.8          {d5}, [r4, : 64]
        vshl.i32        q8, q4, #4
        vtrn.32         d4, d5
        vadd.i32        q7, q7, q1
        vadd.i32        q8, q8, q4
        vld1.8          {d18-d19}, [r2, : 128]!
        vshl.i32        q10, q2, #4
        vld1.8          {d22-d23}, [r2, : 128]!
        vadd.i32        q10, q10, q2
        vld1.8          {d24}, [r2, : 64]
        vadd.i32        q5, q5, q0
        add             r2, r3, #192
        vld1.8          {d26-d27}, [r2, : 128]!
        vadd.i32        q6, q6, q3
        vld1.8          {d28-d29}, [r2, : 128]!
        vadd.i32        q8, q8, q4
        vld1.8          {d25}, [r2, : 64]
        vadd.i32        q10, q10, q2
        vtrn.32         q9, q13
        vadd.i32        q7, q7, q1
        vadd.i32        q5, q5, q0
        vtrn.32         q11, q14
        vadd.i32        q6, q6, q3
        add             r2, sp, #528
        vadd.i32        q10, q10, q2
        vtrn.32         d24, d25
        vst1.8          {d12-d13}, [r2, : 128]!
        vshl.i32        q6, q13, #1
        vst1.8          {d20-d21}, [r2, : 128]!
        vshl.i32        q10, q14, #1
        vst1.8          {d12-d13}, [r2, : 128]!
        vshl.i32        q15, q12, #1
        vadd.i32        q8, q8, q4
        vext.32         d10, d31, d30, #0
        vadd.i32        q7, q7, q1
        vst1.8          {d16-d17}, [r2, : 128]!
        vmull.s32       q8, d18, d5
        vmlal.s32       q8, d26, d4
        vmlal.s32       q8, d19, d9
        vmlal.s32       q8, d27, d3
        vmlal.s32       q8, d22, d8
        vmlal.s32       q8, d28, d2
        vmlal.s32       q8, d23, d7
        vmlal.s32       q8, d29, d1
        vmlal.s32       q8, d24, d6
        vmlal.s32       q8, d25, d0
        vst1.8          {d14-d15}, [r2, : 128]!
        vmull.s32       q2, d18, d4
        vmlal.s32       q2, d12, d9
        vmlal.s32       q2, d13, d8
        vmlal.s32       q2, d19, d3
        vmlal.s32       q2, d22, d2
        vmlal.s32       q2, d23, d1
        vmlal.s32       q2, d24, d0
        vst1.8          {d20-d21}, [r2, : 128]!
        vmull.s32       q7, d18, d9
        vmlal.s32       q7, d26, d3
        vmlal.s32       q7, d19, d8
        vmlal.s32       q7, d27, d2
        vmlal.s32       q7, d22, d7
        vmlal.s32       q7, d28, d1
        vmlal.s32       q7, d23, d6
        vmlal.s32       q7, d29, d0
        vst1.8          {d10-d11}, [r2, : 128]!
        vmull.s32       q5, d18, d3
        vmlal.s32       q5, d19, d2
        vmlal.s32       q5, d22, d1
        vmlal.s32       q5, d23, d0
        vmlal.s32       q5, d12, d8
        vst1.8          {d16-d17}, [r2, : 128]
        vmull.s32       q4, d18, d8
        vmlal.s32       q4, d26, d2
        vmlal.s32       q4, d19, d7
        vmlal.s32       q4, d27, d1
        vmlal.s32       q4, d22, d6
        vmlal.s32       q4, d28, d0
        vmull.s32       q8, d18, d7
        vmlal.s32       q8, d26, d1
        vmlal.s32       q8, d19, d6
        vmlal.s32       q8, d27, d0
        add             r2, sp, #544
        vld1.8          {d20-d21}, [r2, : 128]
        vmlal.s32       q7, d24, d21
        vmlal.s32       q7, d25, d20
        vmlal.s32       q4, d23, d21
        vmlal.s32       q4, d29, d20
        vmlal.s32       q8, d22, d21
        vmlal.s32       q8, d28, d20
        vmlal.s32       q5, d24, d20
        vst1.8          {d14-d15}, [r2, : 128]
        vmull.s32       q7, d18, d6
        vmlal.s32       q7, d26, d0
        add             r2, sp, #624
        vld1.8          {d30-d31}, [r2, : 128]
        vmlal.s32       q2, d30, d21
        vmlal.s32       q7, d19, d21
        vmlal.s32       q7, d27, d20
        add             r2, sp, #592
        vld1.8          {d26-d27}, [r2, : 128]
        vmlal.s32       q4, d25, d27
        vmlal.s32       q8, d29, d27
        vmlal.s32       q8, d25, d26
        vmlal.s32       q7, d28, d27
        vmlal.s32       q7, d29, d26
        add             r2, sp, #576
        vld1.8          {d28-d29}, [r2, : 128]
        vmlal.s32       q4, d24, d29
        vmlal.s32       q8, d23, d29
        vmlal.s32       q8, d24, d28
        vmlal.s32       q7, d22, d29
        vmlal.s32       q7, d23, d28
        vst1.8          {d8-d9}, [r2, : 128]
        add             r2, sp, #528
        vld1.8          {d8-d9}, [r2, : 128]
        vmlal.s32       q7, d24, d9
        vmlal.s32       q7, d25, d31
        vmull.s32       q1, d18, d2
        vmlal.s32       q1, d19, d1
        vmlal.s32       q1, d22, d0
        vmlal.s32       q1, d24, d27
        vmlal.s32       q1, d23, d20
        vmlal.s32       q1, d12, d7
        vmlal.s32       q1, d13, d6
        vmull.s32       q6, d18, d1
        vmlal.s32       q6, d19, d0
        vmlal.s32       q6, d23, d27
        vmlal.s32       q6, d22, d20
        vmlal.s32       q6, d24, d26
        vmull.s32       q0, d18, d0
        vmlal.s32       q0, d22, d27
        vmlal.s32       q0, d23, d26
        vmlal.s32       q0, d24, d31
        vmlal.s32       q0, d19, d20
        add             r2, sp, #608
        vld1.8          {d18-d19}, [r2, : 128]
        vmlal.s32       q2, d18, d7
        vmlal.s32       q5, d18, d6
        vmlal.s32       q1, d18, d21
        vmlal.s32       q0, d18, d28
        vmlal.s32       q6, d18, d29
        vmlal.s32       q2, d19, d6
        vmlal.s32       q5, d19, d21
        vmlal.s32       q1, d19, d29
        vmlal.s32       q0, d19, d9
        vmlal.s32       q6, d19, d28
        add             r2, sp, #560
        vld1.8          {d18-d19}, [r2, : 128]
        add             r2, sp, #480
        vld1.8          {d22-d23}, [r2, : 128]
        vmlal.s32       q5, d19, d7
        vmlal.s32       q0, d18, d21
        vmlal.s32       q0, d19, d29
        vmlal.s32       q6, d18, d6
        add             r2, sp, #496
        vld1.8          {d6-d7}, [r2, : 128]
        vmlal.s32       q6, d19, d21
        add             r2, sp, #544
        vld1.8          {d18-d19}, [r2, : 128]
        vmlal.s32       q0, d30, d8
        add             r2, sp, #640
        vld1.8          {d20-d21}, [r2, : 128]
        vmlal.s32       q5, d30, d29
        add             r2, sp, #576
        vld1.8          {d24-d25}, [r2, : 128]
        vmlal.s32       q1, d30, d28
        vadd.i64        q13, q0, q11
        vadd.i64        q14, q5, q11
        vmlal.s32       q6, d30, d9
        vshr.s64        q4, q13, #26
        vshr.s64        q13, q14, #26
        vadd.i64        q7, q7, q4
        vshl.i64        q4, q4, #26
        vadd.i64        q14, q7, q3
        vadd.i64        q9, q9, q13
        vshl.i64        q13, q13, #26
        vadd.i64        q15, q9, q3
        vsub.i64        q0, q0, q4
        vshr.s64        q4, q14, #25
        vsub.i64        q5, q5, q13
        vshr.s64        q13, q15, #25
        vadd.i64        q6, q6, q4
        vshl.i64        q4, q4, #25
        vadd.i64        q14, q6, q11
        vadd.i64        q2, q2, q13
        vsub.i64        q4, q7, q4
        vshr.s64        q7, q14, #26
        vshl.i64        q13, q13, #25
        vadd.i64        q14, q2, q11
        vadd.i64        q8, q8, q7
        vshl.i64        q7, q7, #26
        vadd.i64        q15, q8, q3
        vsub.i64        q9, q9, q13
        vshr.s64        q13, q14, #26
        vsub.i64        q6, q6, q7
        vshr.s64        q7, q15, #25
        vadd.i64        q10, q10, q13
        vshl.i64        q13, q13, #26
        vadd.i64        q14, q10, q3
        vadd.i64        q1, q1, q7
        add             r2, r3, #144
        vshl.i64        q7, q7, #25
        add             r4, r3, #96
        vadd.i64        q15, q1, q11
        add             r2, r2, #8
        vsub.i64        q2, q2, q13
        add             r4, r4, #8
        vshr.s64        q13, q14, #25
        vsub.i64        q7, q8, q7
        vshr.s64        q8, q15, #26
        vadd.i64        q14, q13, q13
        vadd.i64        q12, q12, q8
        vtrn.32         d12, d14
        vshl.i64        q8, q8, #26
        vtrn.32         d13, d15
        vadd.i64        q3, q12, q3
        vadd.i64        q0, q0, q14
        vst1.8          d12, [r2, : 64]!
        vshl.i64        q7, q13, #4
        vst1.8          d13, [r4, : 64]!
        vsub.i64        q1, q1, q8
        vshr.s64        q3, q3, #25
        vadd.i64        q0, q0, q7
        vadd.i64        q5, q5, q3
        vshl.i64        q3, q3, #25
        vadd.i64        q6, q5, q11
        vadd.i64        q0, q0, q13
        vshl.i64        q7, q13, #25
        vadd.i64        q8, q0, q11
        vsub.i64        q3, q12, q3
        vshr.s64        q6, q6, #26
        vsub.i64        q7, q10, q7
        vtrn.32         d2, d6
        vshr.s64        q8, q8, #26
        vtrn.32         d3, d7
        vadd.i64        q3, q9, q6
        vst1.8          d2, [r2, : 64]
        vshl.i64        q6, q6, #26
        vst1.8          d3, [r4, : 64]
        vadd.i64        q1, q4, q8
        vtrn.32         d4, d14
        vshl.i64        q4, q8, #26
        vtrn.32         d5, d15
        vsub.i64        q5, q5, q6
        add             r2, r2, #16
        vsub.i64        q0, q0, q4
        vst1.8          d4, [r2, : 64]
        add             r4, r4, #16
        vst1.8          d5, [r4, : 64]
        vtrn.32         d10, d6
        vtrn.32         d11, d7
        sub             r2, r2, #8
        sub             r4, r4, #8
        vtrn.32         d0, d2
        vtrn.32         d1, d3
        vst1.8          d10, [r2, : 64]
        vst1.8          d11, [r4, : 64]
        sub             r2, r2, #24
        sub             r4, r4, #24
        vst1.8          d0, [r2, : 64]
        vst1.8          d1, [r4, : 64]
        add             r2, r3, #288
        add             r4, r3, #336
        vld1.8          {d0-d1}, [r2, : 128]!
        vld1.8          {d2-d3}, [r4, : 128]!
        vsub.i32        q0, q0, q1
        vld1.8          {d2-d3}, [r2, : 128]!
        vld1.8          {d4-d5}, [r4, : 128]!
        vsub.i32        q1, q1, q2
        add             r5, r3, #240
        vld1.8          {d4}, [r2, : 64]
        vld1.8          {d6}, [r4, : 64]
        vsub.i32        q2, q2, q3
        vst1.8          {d0-d1}, [r5, : 128]!
        vst1.8          {d2-d3}, [r5, : 128]!
        vst1.8          d4, [r5, : 64]
        add             r2, r3, #144
        add             r4, r3, #96
        add             r5, r3, #144
        add             r6, r3, #192
        vld1.8          {d0-d1}, [r2, : 128]!
        vld1.8          {d2-d3}, [r4, : 128]!
        vsub.i32        q2, q0, q1
        vadd.i32        q0, q0, q1
        vld1.8          {d2-d3}, [r2, : 128]!
        vld1.8          {d6-d7}, [r4, : 128]!
        vsub.i32        q4, q1, q3
        vadd.i32        q1, q1, q3
        vld1.8          {d6}, [r2, : 64]
        vld1.8          {d10}, [r4, : 64]
        vsub.i32        q6, q3, q5
        vadd.i32        q3, q3, q5
        vst1.8          {d4-d5}, [r5, : 128]!
        vst1.8          {d0-d1}, [r6, : 128]!
        vst1.8          {d8-d9}, [r5, : 128]!
        vst1.8          {d2-d3}, [r6, : 128]!
        vst1.8          d12, [r5, : 64]
        vst1.8          d6, [r6, : 64]
        add             r2, r3, #0
        add             r4, r3, #240
        vld1.8          {d0-d1}, [r4, : 128]!
        vld1.8          {d2-d3}, [r4, : 128]!
        vld1.8          {d4}, [r4, : 64]
        add             r4, r3, #336
        vld1.8          {d6-d7}, [r4, : 128]!
        vtrn.32         q0, q3
        vld1.8          {d8-d9}, [r4, : 128]!
        vshl.i32        q5, q0, #4
        vtrn.32         q1, q4
        vshl.i32        q6, q3, #4
        vadd.i32        q5, q5, q0
        vadd.i32        q6, q6, q3
        vshl.i32        q7, q1, #4
        vld1.8          {d5}, [r4, : 64]
        vshl.i32        q8, q4, #4
        vtrn.32         d4, d5
        vadd.i32        q7, q7, q1
        vadd.i32        q8, q8, q4
        vld1.8          {d18-d19}, [r2, : 128]!
        vshl.i32        q10, q2, #4
        vld1.8          {d22-d23}, [r2, : 128]!
        vadd.i32        q10, q10, q2
        vld1.8          {d24}, [r2, : 64]
        vadd.i32        q5, q5, q0
        add             r2, r3, #288
        vld1.8          {d26-d27}, [r2, : 128]!
        vadd.i32        q6, q6, q3
        vld1.8          {d28-d29}, [r2, : 128]!
        vadd.i32        q8, q8, q4
        vld1.8          {d25}, [r2, : 64]
        vadd.i32        q10, q10, q2
        vtrn.32         q9, q13
        vadd.i32        q7, q7, q1
        vadd.i32        q5, q5, q0
        vtrn.32         q11, q14
        vadd.i32        q6, q6, q3
        add             r2, sp, #528
        vadd.i32        q10, q10, q2
        vtrn.32         d24, d25
        vst1.8          {d12-d13}, [r2, : 128]!
        vshl.i32        q6, q13, #1
        vst1.8          {d20-d21}, [r2, : 128]!
        vshl.i32        q10, q14, #1
        vst1.8          {d12-d13}, [r2, : 128]!
        vshl.i32        q15, q12, #1
        vadd.i32        q8, q8, q4
        vext.32         d10, d31, d30, #0
        vadd.i32        q7, q7, q1
        vst1.8          {d16-d17}, [r2, : 128]!
        vmull.s32       q8, d18, d5
        vmlal.s32       q8, d26, d4
        vmlal.s32       q8, d19, d9
        vmlal.s32       q8, d27, d3
        vmlal.s32       q8, d22, d8
        vmlal.s32       q8, d28, d2
        vmlal.s32       q8, d23, d7
        vmlal.s32       q8, d29, d1
        vmlal.s32       q8, d24, d6
        vmlal.s32       q8, d25, d0
        vst1.8          {d14-d15}, [r2, : 128]!
        vmull.s32       q2, d18, d4
        vmlal.s32       q2, d12, d9
        vmlal.s32       q2, d13, d8
        vmlal.s32       q2, d19, d3
        vmlal.s32       q2, d22, d2
        vmlal.s32       q2, d23, d1
        vmlal.s32       q2, d24, d0
        vst1.8          {d20-d21}, [r2, : 128]!
        vmull.s32       q7, d18, d9
        vmlal.s32       q7, d26, d3
        vmlal.s32       q7, d19, d8
        vmlal.s32       q7, d27, d2
        vmlal.s32       q7, d22, d7
        vmlal.s32       q7, d28, d1
        vmlal.s32       q7, d23, d6
        vmlal.s32       q7, d29, d0
        vst1.8          {d10-d11}, [r2, : 128]!
        vmull.s32       q5, d18, d3
        vmlal.s32       q5, d19, d2
        vmlal.s32       q5, d22, d1
        vmlal.s32       q5, d23, d0
        vmlal.s32       q5, d12, d8
        vst1.8          {d16-d17}, [r2, : 128]!
        vmull.s32       q4, d18, d8
        vmlal.s32       q4, d26, d2
        vmlal.s32       q4, d19, d7
        vmlal.s32       q4, d27, d1
        vmlal.s32       q4, d22, d6
        vmlal.s32       q4, d28, d0
        vmull.s32       q8, d18, d7
        vmlal.s32       q8, d26, d1
        vmlal.s32       q8, d19, d6
        vmlal.s32       q8, d27, d0
        add             r2, sp, #544
        vld1.8          {d20-d21}, [r2, : 128]
        vmlal.s32       q7, d24, d21
        vmlal.s32       q7, d25, d20
        vmlal.s32       q4, d23, d21
        vmlal.s32       q4, d29, d20
        vmlal.s32       q8, d22, d21
        vmlal.s32       q8, d28, d20
        vmlal.s32       q5, d24, d20
        vst1.8          {d14-d15}, [r2, : 128]
        vmull.s32       q7, d18, d6
        vmlal.s32       q7, d26, d0
        add             r2, sp, #624
        vld1.8          {d30-d31}, [r2, : 128]
        vmlal.s32       q2, d30, d21
        vmlal.s32       q7, d19, d21
        vmlal.s32       q7, d27, d20
        add             r2, sp, #592
        vld1.8          {d26-d27}, [r2, : 128]
        vmlal.s32       q4, d25, d27
        vmlal.s32       q8, d29, d27
        vmlal.s32       q8, d25, d26
        vmlal.s32       q7, d28, d27
        vmlal.s32       q7, d29, d26
        add             r2, sp, #576
        vld1.8          {d28-d29}, [r2, : 128]
        vmlal.s32       q4, d24, d29
        vmlal.s32       q8, d23, d29
        vmlal.s32       q8, d24, d28
        vmlal.s32       q7, d22, d29
        vmlal.s32       q7, d23, d28
        vst1.8          {d8-d9}, [r2, : 128]
        add             r2, sp, #528
        vld1.8          {d8-d9}, [r2, : 128]
        vmlal.s32       q7, d24, d9
        vmlal.s32       q7, d25, d31
        vmull.s32       q1, d18, d2
        vmlal.s32       q1, d19, d1
        vmlal.s32       q1, d22, d0
        vmlal.s32       q1, d24, d27
        vmlal.s32       q1, d23, d20
        vmlal.s32       q1, d12, d7
        vmlal.s32       q1, d13, d6
        vmull.s32       q6, d18, d1
        vmlal.s32       q6, d19, d0
        vmlal.s32       q6, d23, d27
        vmlal.s32       q6, d22, d20
        vmlal.s32       q6, d24, d26
        vmull.s32       q0, d18, d0
        vmlal.s32       q0, d22, d27
        vmlal.s32       q0, d23, d26
        vmlal.s32       q0, d24, d31
        vmlal.s32       q0, d19, d20
        add             r2, sp, #608
        vld1.8          {d18-d19}, [r2, : 128]
        vmlal.s32       q2, d18, d7
        vmlal.s32       q5, d18, d6
        vmlal.s32       q1, d18, d21
        vmlal.s32       q0, d18, d28
        vmlal.s32       q6, d18, d29
        vmlal.s32       q2, d19, d6
        vmlal.s32       q5, d19, d21
        vmlal.s32       q1, d19, d29
        vmlal.s32       q0, d19, d9
        vmlal.s32       q6, d19, d28
        add             r2, sp, #560
        vld1.8          {d18-d19}, [r2, : 128]
        add             r2, sp, #480
        vld1.8          {d22-d23}, [r2, : 128]
        vmlal.s32       q5, d19, d7
        vmlal.s32       q0, d18, d21
        vmlal.s32       q0, d19, d29
        vmlal.s32       q6, d18, d6
        add             r2, sp, #496
        vld1.8          {d6-d7}, [r2, : 128]
        vmlal.s32       q6, d19, d21
        add             r2, sp, #544
        vld1.8          {d18-d19}, [r2, : 128]
        vmlal.s32       q0, d30, d8
        add             r2, sp, #640
        vld1.8          {d20-d21}, [r2, : 128]
        vmlal.s32       q5, d30, d29
        add             r2, sp, #576
        vld1.8          {d24-d25}, [r2, : 128]
        vmlal.s32       q1, d30, d28
        vadd.i64        q13, q0, q11
        vadd.i64        q14, q5, q11
        vmlal.s32       q6, d30, d9
        vshr.s64        q4, q13, #26
        vshr.s64        q13, q14, #26
        vadd.i64        q7, q7, q4
        vshl.i64        q4, q4, #26
        vadd.i64        q14, q7, q3
        vadd.i64        q9, q9, q13
        vshl.i64        q13, q13, #26
        vadd.i64        q15, q9, q3
        vsub.i64        q0, q0, q4
        vshr.s64        q4, q14, #25
        vsub.i64        q5, q5, q13
        vshr.s64        q13, q15, #25
        vadd.i64        q6, q6, q4
        vshl.i64        q4, q4, #25
        vadd.i64        q14, q6, q11
        vadd.i64        q2, q2, q13
        vsub.i64        q4, q7, q4
        vshr.s64        q7, q14, #26
        vshl.i64        q13, q13, #25
        vadd.i64        q14, q2, q11
        vadd.i64        q8, q8, q7
        vshl.i64        q7, q7, #26
        vadd.i64        q15, q8, q3
        vsub.i64        q9, q9, q13
        vshr.s64        q13, q14, #26
        vsub.i64        q6, q6, q7
        vshr.s64        q7, q15, #25
        vadd.i64        q10, q10, q13
        vshl.i64        q13, q13, #26
        vadd.i64        q14, q10, q3
        vadd.i64        q1, q1, q7
        add             r2, r3, #288
        vshl.i64        q7, q7, #25
        add             r4, r3, #96
        vadd.i64        q15, q1, q11
        add             r2, r2, #8
        vsub.i64        q2, q2, q13
        add             r4, r4, #8
        vshr.s64        q13, q14, #25
        vsub.i64        q7, q8, q7
        vshr.s64        q8, q15, #26
        vadd.i64        q14, q13, q13
        vadd.i64        q12, q12, q8
        vtrn.32         d12, d14
        vshl.i64        q8, q8, #26
        vtrn.32         d13, d15
        vadd.i64        q3, q12, q3
        vadd.i64        q0, q0, q14
        vst1.8          d12, [r2, : 64]!
        vshl.i64        q7, q13, #4
        vst1.8          d13, [r4, : 64]!
        vsub.i64        q1, q1, q8
        vshr.s64        q3, q3, #25
        vadd.i64        q0, q0, q7
        vadd.i64        q5, q5, q3
        vshl.i64        q3, q3, #25
        vadd.i64        q6, q5, q11
        vadd.i64        q0, q0, q13
        vshl.i64        q7, q13, #25
        vadd.i64        q8, q0, q11
        vsub.i64        q3, q12, q3
        vshr.s64        q6, q6, #26
        vsub.i64        q7, q10, q7
        vtrn.32         d2, d6
        vshr.s64        q8, q8, #26
        vtrn.32         d3, d7
        vadd.i64        q3, q9, q6
        vst1.8          d2, [r2, : 64]
        vshl.i64        q6, q6, #26
        vst1.8          d3, [r4, : 64]
        vadd.i64        q1, q4, q8
        vtrn.32         d4, d14
        vshl.i64        q4, q8, #26
        vtrn.32         d5, d15
        vsub.i64        q5, q5, q6
        add             r2, r2, #16
        vsub.i64        q0, q0, q4
        vst1.8          d4, [r2, : 64]
        add             r4, r4, #16
        vst1.8          d5, [r4, : 64]
        vtrn.32         d10, d6
        vtrn.32         d11, d7
        sub             r2, r2, #8
        sub             r4, r4, #8
        vtrn.32         d0, d2
        vtrn.32         d1, d3
        vst1.8          d10, [r2, : 64]
        vst1.8          d11, [r4, : 64]
        sub             r2, r2, #24
        sub             r4, r4, #24
        vst1.8          d0, [r2, : 64]
        vst1.8          d1, [r4, : 64]
        add             r2, sp, #512
        add             r4, r3, #144
        add             r5, r3, #192
        vld1.8          {d0-d1}, [r2, : 128]
        vld1.8          {d2-d3}, [r4, : 128]!
        vld1.8          {d4-d5}, [r5, : 128]!
        vzip.i32        q1, q2
        vld1.8          {d6-d7}, [r4, : 128]!
        vld1.8          {d8-d9}, [r5, : 128]!
        vshl.i32        q5, q1, #1
        vzip.i32        q3, q4
        vshl.i32        q6, q2, #1
        vld1.8          {d14}, [r4, : 64]
        vshl.i32        q8, q3, #1
        vld1.8          {d15}, [r5, : 64]
        vshl.i32        q9, q4, #1
        vmul.i32        d21, d7, d1
        vtrn.32         d14, d15
        vmul.i32        q11, q4, q0
        vmul.i32        q0, q7, q0
        vmull.s32       q12, d2, d2
        vmlal.s32       q12, d11, d1
        vmlal.s32       q12, d12, d0
        vmlal.s32       q12, d13, d23
        vmlal.s32       q12, d16, d22
        vmlal.s32       q12, d7, d21
        vmull.s32       q10, d2, d11
        vmlal.s32       q10, d4, d1
        vmlal.s32       q10, d13, d0
        vmlal.s32       q10, d6, d23
        vmlal.s32       q10, d17, d22
        vmull.s32       q13, d10, d4
        vmlal.s32       q13, d11, d3
        vmlal.s32       q13, d13, d1
        vmlal.s32       q13, d16, d0
        vmlal.s32       q13, d17, d23
        vmlal.s32       q13, d8, d22
        vmull.s32       q1, d10, d5
        vmlal.s32       q1, d11, d4
        vmlal.s32       q1, d6, d1
        vmlal.s32       q1, d17, d0
        vmlal.s32       q1, d8, d23
        vmull.s32       q14, d10, d6
        vmlal.s32       q14, d11, d13
        vmlal.s32       q14, d4, d4
        vmlal.s32       q14, d17, d1
        vmlal.s32       q14, d18, d0
        vmlal.s32       q14, d9, d23
        vmull.s32       q11, d10, d7
        vmlal.s32       q11, d11, d6
        vmlal.s32       q11, d12, d5
        vmlal.s32       q11, d8, d1
        vmlal.s32       q11, d19, d0
        vmull.s32       q15, d10, d8
        vmlal.s32       q15, d11, d17
        vmlal.s32       q15, d12, d6
        vmlal.s32       q15, d13, d5
        vmlal.s32       q15, d19, d1
        vmlal.s32       q15, d14, d0
        vmull.s32       q2, d10, d9
        vmlal.s32       q2, d11, d8
        vmlal.s32       q2, d12, d7
        vmlal.s32       q2, d13, d6
        vmlal.s32       q2, d14, d1
        vmull.s32       q0, d15, d1
        vmlal.s32       q0, d10, d14
        vmlal.s32       q0, d11, d19
        vmlal.s32       q0, d12, d8
        vmlal.s32       q0, d13, d17
        vmlal.s32       q0, d6, d6
        add             r2, sp, #480
        vld1.8          {d18-d19}, [r2, : 128]!
        vmull.s32       q3, d16, d7
        vmlal.s32       q3, d10, d15
        vmlal.s32       q3, d11, d14
        vmlal.s32       q3, d12, d9
        vmlal.s32       q3, d13, d8
        vld1.8          {d8-d9}, [r2, : 128]
        vadd.i64        q5, q12, q9
        vadd.i64        q6, q15, q9
        vshr.s64        q5, q5, #26
        vshr.s64        q6, q6, #26
        vadd.i64        q7, q10, q5
        vshl.i64        q5, q5, #26
        vadd.i64        q8, q7, q4
        vadd.i64        q2, q2, q6
        vshl.i64        q6, q6, #26
        vadd.i64        q10, q2, q4
        vsub.i64        q5, q12, q5
        vshr.s64        q8, q8, #25
        vsub.i64        q6, q15, q6
        vshr.s64        q10, q10, #25
        vadd.i64        q12, q13, q8
        vshl.i64        q8, q8, #25
        vadd.i64        q13, q12, q9
        vadd.i64        q0, q0, q10
        vsub.i64        q7, q7, q8
        vshr.s64        q8, q13, #26
        vshl.i64        q10, q10, #25
        vadd.i64        q13, q0, q9
        vadd.i64        q1, q1, q8
        vshl.i64        q8, q8, #26
        vadd.i64        q15, q1, q4
        vsub.i64        q2, q2, q10
        vshr.s64        q10, q13, #26
        vsub.i64        q8, q12, q8
        vshr.s64        q12, q15, #25
        vadd.i64        q3, q3, q10
        vshl.i64        q10, q10, #26
        vadd.i64        q13, q3, q4
        vadd.i64        q14, q14, q12
        add             r2, r3, #144
        vshl.i64        q12, q12, #25
        add             r4, r3, #192
        vadd.i64        q15, q14, q9
        add             r2, r2, #8
        vsub.i64        q0, q0, q10
        add             r4, r4, #8
        vshr.s64        q10, q13, #25
        vsub.i64        q1, q1, q12
        vshr.s64        q12, q15, #26
        vadd.i64        q13, q10, q10
        vadd.i64        q11, q11, q12
        vtrn.32         d16, d2
        vshl.i64        q12, q12, #26
        vtrn.32         d17, d3
        vadd.i64        q1, q11, q4
        vadd.i64        q4, q5, q13
        vst1.8          d16, [r2, : 64]!
        vshl.i64        q5, q10, #4
        vst1.8          d17, [r4, : 64]!
        vsub.i64        q8, q14, q12
        vshr.s64        q1, q1, #25
        vadd.i64        q4, q4, q5
        vadd.i64        q5, q6, q1
        vshl.i64        q1, q1, #25
        vadd.i64        q6, q5, q9
        vadd.i64        q4, q4, q10
        vshl.i64        q10, q10, #25
        vadd.i64        q9, q4, q9
        vsub.i64        q1, q11, q1
        vshr.s64        q6, q6, #26
        vsub.i64        q3, q3, q10
        vtrn.32         d16, d2
        vshr.s64        q9, q9, #26
        vtrn.32         d17, d3
        vadd.i64        q1, q2, q6
        vst1.8          d16, [r2, : 64]
        vshl.i64        q2, q6, #26
        vst1.8          d17, [r4, : 64]
        vadd.i64        q6, q7, q9
        vtrn.32         d0, d6
        vshl.i64        q7, q9, #26
        vtrn.32         d1, d7
        vsub.i64        q2, q5, q2
        add             r2, r2, #16
        vsub.i64        q3, q4, q7
        vst1.8          d0, [r2, : 64]
        add             r4, r4, #16
        vst1.8          d1, [r4, : 64]
        vtrn.32         d4, d2
        vtrn.32         d5, d3
        sub             r2, r2, #8
        sub             r4, r4, #8
        vtrn.32         d6, d12
        vtrn.32         d7, d13
        vst1.8          d4, [r2, : 64]
        vst1.8          d5, [r4, : 64]
        sub             r2, r2, #24
        sub             r4, r4, #24
        vst1.8          d6, [r2, : 64]
        vst1.8          d7, [r4, : 64]
        add             r2, r3, #336
        add             r4, r3, #288
        vld1.8          {d0-d1}, [r2, : 128]!
        vld1.8          {d2-d3}, [r4, : 128]!
        vadd.i32        q0, q0, q1
        vld1.8          {d2-d3}, [r2, : 128]!
        vld1.8          {d4-d5}, [r4, : 128]!
        vadd.i32        q1, q1, q2
        add             r5, r3, #288
        vld1.8          {d4}, [r2, : 64]
        vld1.8          {d6}, [r4, : 64]
        vadd.i32        q2, q2, q3
        vst1.8          {d0-d1}, [r5, : 128]!
        vst1.8          {d2-d3}, [r5, : 128]!
        vst1.8          d4, [r5, : 64]
        add             r2, r3, #48
        add             r4, r3, #144
        vld1.8          {d0-d1}, [r4, : 128]!
        vld1.8          {d2-d3}, [r4, : 128]!
        vld1.8          {d4}, [r4, : 64]
        add             r4, r3, #288
        vld1.8          {d6-d7}, [r4, : 128]!
        vtrn.32         q0, q3
        vld1.8          {d8-d9}, [r4, : 128]!
        vshl.i32        q5, q0, #4
        vtrn.32         q1, q4
        vshl.i32        q6, q3, #4
        vadd.i32        q5, q5, q0
        vadd.i32        q6, q6, q3
        vshl.i32        q7, q1, #4
        vld1.8          {d5}, [r4, : 64]
        vshl.i32        q8, q4, #4
        vtrn.32         d4, d5
        vadd.i32        q7, q7, q1
        vadd.i32        q8, q8, q4
        vld1.8          {d18-d19}, [r2, : 128]!
        vshl.i32        q10, q2, #4
        vld1.8          {d22-d23}, [r2, : 128]!
        vadd.i32        q10, q10, q2
        vld1.8          {d24}, [r2, : 64]
        vadd.i32        q5, q5, q0
        add             r2, r3, #240
        vld1.8          {d26-d27}, [r2, : 128]!
        vadd.i32        q6, q6, q3
        vld1.8          {d28-d29}, [r2, : 128]!
        vadd.i32        q8, q8, q4
        vld1.8          {d25}, [r2, : 64]
        vadd.i32        q10, q10, q2
        vtrn.32         q9, q13
        vadd.i32        q7, q7, q1
        vadd.i32        q5, q5, q0
        vtrn.32         q11, q14
        vadd.i32        q6, q6, q3
        add             r2, sp, #528
        vadd.i32        q10, q10, q2
        vtrn.32         d24, d25
        vst1.8          {d12-d13}, [r2, : 128]!
        vshl.i32        q6, q13, #1
        vst1.8          {d20-d21}, [r2, : 128]!
        vshl.i32        q10, q14, #1
        vst1.8          {d12-d13}, [r2, : 128]!
        vshl.i32        q15, q12, #1
        vadd.i32        q8, q8, q4
        vext.32         d10, d31, d30, #0
        vadd.i32        q7, q7, q1
        vst1.8          {d16-d17}, [r2, : 128]!
        vmull.s32       q8, d18, d5
        vmlal.s32       q8, d26, d4
        vmlal.s32       q8, d19, d9
        vmlal.s32       q8, d27, d3
        vmlal.s32       q8, d22, d8
        vmlal.s32       q8, d28, d2
        vmlal.s32       q8, d23, d7
        vmlal.s32       q8, d29, d1
        vmlal.s32       q8, d24, d6
        vmlal.s32       q8, d25, d0
        vst1.8          {d14-d15}, [r2, : 128]!
        vmull.s32       q2, d18, d4
        vmlal.s32       q2, d12, d9
        vmlal.s32       q2, d13, d8
        vmlal.s32       q2, d19, d3
        vmlal.s32       q2, d22, d2
        vmlal.s32       q2, d23, d1
        vmlal.s32       q2, d24, d0
        vst1.8          {d20-d21}, [r2, : 128]!
        vmull.s32       q7, d18, d9
        vmlal.s32       q7, d26, d3
        vmlal.s32       q7, d19, d8
        vmlal.s32       q7, d27, d2
        vmlal.s32       q7, d22, d7
        vmlal.s32       q7, d28, d1
        vmlal.s32       q7, d23, d6
        vmlal.s32       q7, d29, d0
        vst1.8          {d10-d11}, [r2, : 128]!
        vmull.s32       q5, d18, d3
        vmlal.s32       q5, d19, d2
        vmlal.s32       q5, d22, d1
        vmlal.s32       q5, d23, d0
        vmlal.s32       q5, d12, d8
        vst1.8          {d16-d17}, [r2, : 128]!
        vmull.s32       q4, d18, d8
        vmlal.s32       q4, d26, d2
        vmlal.s32       q4, d19, d7
        vmlal.s32       q4, d27, d1
        vmlal.s32       q4, d22, d6
        vmlal.s32       q4, d28, d0
        vmull.s32       q8, d18, d7
        vmlal.s32       q8, d26, d1
        vmlal.s32       q8, d19, d6
        vmlal.s32       q8, d27, d0
        add             r2, sp, #544
        vld1.8          {d20-d21}, [r2, : 128]
        vmlal.s32       q7, d24, d21
        vmlal.s32       q7, d25, d20
        vmlal.s32       q4, d23, d21
        vmlal.s32       q4, d29, d20
        vmlal.s32       q8, d22, d21
        vmlal.s32       q8, d28, d20
        vmlal.s32       q5, d24, d20
        vst1.8          {d14-d15}, [r2, : 128]
        vmull.s32       q7, d18, d6
        vmlal.s32       q7, d26, d0
        add             r2, sp, #624
        vld1.8          {d30-d31}, [r2, : 128]
        vmlal.s32       q2, d30, d21
        vmlal.s32       q7, d19, d21
        vmlal.s32       q7, d27, d20
        add             r2, sp, #592
        vld1.8          {d26-d27}, [r2, : 128]
        vmlal.s32       q4, d25, d27
        vmlal.s32       q8, d29, d27
        vmlal.s32       q8, d25, d26
        vmlal.s32       q7, d28, d27
        vmlal.s32       q7, d29, d26
        add             r2, sp, #576
        vld1.8          {d28-d29}, [r2, : 128]
        vmlal.s32       q4, d24, d29
        vmlal.s32       q8, d23, d29
        vmlal.s32       q8, d24, d28
        vmlal.s32       q7, d22, d29
        vmlal.s32       q7, d23, d28
        vst1.8          {d8-d9}, [r2, : 128]
        add             r2, sp, #528
        vld1.8          {d8-d9}, [r2, : 128]
        vmlal.s32       q7, d24, d9
        vmlal.s32       q7, d25, d31
        vmull.s32       q1, d18, d2
        vmlal.s32       q1, d19, d1
        vmlal.s32       q1, d22, d0
        vmlal.s32       q1, d24, d27
        vmlal.s32       q1, d23, d20
        vmlal.s32       q1, d12, d7
        vmlal.s32       q1, d13, d6
        vmull.s32       q6, d18, d1
        vmlal.s32       q6, d19, d0
        vmlal.s32       q6, d23, d27
        vmlal.s32       q6, d22, d20
        vmlal.s32       q6, d24, d26
        vmull.s32       q0, d18, d0
        vmlal.s32       q0, d22, d27
        vmlal.s32       q0, d23, d26
        vmlal.s32       q0, d24, d31
        vmlal.s32       q0, d19, d20
        add             r2, sp, #608
        vld1.8          {d18-d19}, [r2, : 128]
        vmlal.s32       q2, d18, d7
        vmlal.s32       q5, d18, d6
        vmlal.s32       q1, d18, d21
        vmlal.s32       q0, d18, d28
        vmlal.s32       q6, d18, d29
        vmlal.s32       q2, d19, d6
        vmlal.s32       q5, d19, d21
        vmlal.s32       q1, d19, d29
        vmlal.s32       q0, d19, d9
        vmlal.s32       q6, d19, d28
        add             r2, sp, #560
        vld1.8          {d18-d19}, [r2, : 128]
        add             r2, sp, #480
        vld1.8          {d22-d23}, [r2, : 128]
        vmlal.s32       q5, d19, d7
        vmlal.s32       q0, d18, d21
        vmlal.s32       q0, d19, d29
        vmlal.s32       q6, d18, d6
        add             r2, sp, #496
        vld1.8          {d6-d7}, [r2, : 128]
        vmlal.s32       q6, d19, d21
        add             r2, sp, #544
        vld1.8          {d18-d19}, [r2, : 128]
        vmlal.s32       q0, d30, d8
        add             r2, sp, #640
        vld1.8          {d20-d21}, [r2, : 128]
        vmlal.s32       q5, d30, d29
        add             r2, sp, #576
        vld1.8          {d24-d25}, [r2, : 128]
        vmlal.s32       q1, d30, d28
        vadd.i64        q13, q0, q11
        vadd.i64        q14, q5, q11
        vmlal.s32       q6, d30, d9
        vshr.s64        q4, q13, #26
        vshr.s64        q13, q14, #26
        vadd.i64        q7, q7, q4
        vshl.i64        q4, q4, #26
        vadd.i64        q14, q7, q3
        vadd.i64        q9, q9, q13
        vshl.i64        q13, q13, #26
        vadd.i64        q15, q9, q3
        vsub.i64        q0, q0, q4
        vshr.s64        q4, q14, #25
        vsub.i64        q5, q5, q13
        vshr.s64        q13, q15, #25
        vadd.i64        q6, q6, q4
        vshl.i64        q4, q4, #25
        vadd.i64        q14, q6, q11
        vadd.i64        q2, q2, q13
        vsub.i64        q4, q7, q4
        vshr.s64        q7, q14, #26
        vshl.i64        q13, q13, #25
        vadd.i64        q14, q2, q11
        vadd.i64        q8, q8, q7
        vshl.i64        q7, q7, #26
        vadd.i64        q15, q8, q3
        vsub.i64        q9, q9, q13
        vshr.s64        q13, q14, #26
        vsub.i64        q6, q6, q7
        vshr.s64        q7, q15, #25
        vadd.i64        q10, q10, q13
        vshl.i64        q13, q13, #26
        vadd.i64        q14, q10, q3
        vadd.i64        q1, q1, q7
        add             r2, r3, #240
        vshl.i64        q7, q7, #25
        add             r4, r3, #144
        vadd.i64        q15, q1, q11
        add             r2, r2, #8
        vsub.i64        q2, q2, q13
        add             r4, r4, #8
        vshr.s64        q13, q14, #25
        vsub.i64        q7, q8, q7
        vshr.s64        q8, q15, #26
        vadd.i64        q14, q13, q13
        vadd.i64        q12, q12, q8
        vtrn.32         d12, d14
        vshl.i64        q8, q8, #26
        vtrn.32         d13, d15
        vadd.i64        q3, q12, q3
        vadd.i64        q0, q0, q14
        vst1.8          d12, [r2, : 64]!
        vshl.i64        q7, q13, #4
        vst1.8          d13, [r4, : 64]!
        vsub.i64        q1, q1, q8
        vshr.s64        q3, q3, #25
        vadd.i64        q0, q0, q7
        vadd.i64        q5, q5, q3
        vshl.i64        q3, q3, #25
        vadd.i64        q6, q5, q11
        vadd.i64        q0, q0, q13
        vshl.i64        q7, q13, #25
        vadd.i64        q8, q0, q11
        vsub.i64        q3, q12, q3
        vshr.s64        q6, q6, #26
        vsub.i64        q7, q10, q7
        vtrn.32         d2, d6
        vshr.s64        q8, q8, #26
        vtrn.32         d3, d7
        vadd.i64        q3, q9, q6
        vst1.8          d2, [r2, : 64]
        vshl.i64        q6, q6, #26
        vst1.8          d3, [r4, : 64]
        vadd.i64        q1, q4, q8
        vtrn.32         d4, d14
        vshl.i64        q4, q8, #26
        vtrn.32         d5, d15
        vsub.i64        q5, q5, q6
        add             r2, r2, #16
        vsub.i64        q0, q0, q4
        vst1.8          d4, [r2, : 64]
        add             r4, r4, #16
        vst1.8          d5, [r4, : 64]
        vtrn.32         d10, d6
        vtrn.32         d11, d7
        sub             r2, r2, #8
        sub             r4, r4, #8
        vtrn.32         d0, d2
        vtrn.32         d1, d3
        vst1.8          d10, [r2, : 64]
        vst1.8          d11, [r4, : 64]
        sub             r2, r2, #24
        sub             r4, r4, #24
        vst1.8          d0, [r2, : 64]
        vst1.8          d1, [r4, : 64]
        ldr             r2, [sp, #456]
        ldr             r4, [sp, #460]
        subs            r5, r2, #1
        bge             .Lmainloop
        add             r1, r3, #144
        add             r2, r3, #336
        vld1.8          {d0-d1}, [r1, : 128]!
        vld1.8          {d2-d3}, [r1, : 128]!
        vld1.8          {d4}, [r1, : 64]
        vst1.8          {d0-d1}, [r2, : 128]!
        vst1.8          {d2-d3}, [r2, : 128]!
        vst1.8          d4, [r2, : 64]
        movw            r1, #0
.Linvertloop:
        add             r2, r3, #144
        movw            r4, #0
        movw            r5, #2
        cmp             r1, #1
        moveq           r5, #1
        addeq           r2, r3, #336
        addeq           r4, r3, #48
        cmp             r1, #2
        moveq           r5, #1
        addeq           r2, r3, #48
        cmp             r1, #3
        moveq           r5, #5
        addeq           r4, r3, #336
        cmp             r1, #4
        moveq           r5, #10
        cmp             r1, #5
        moveq           r5, #20
        cmp             r1, #6
        moveq           r5, #10
        addeq           r2, r3, #336
        addeq           r4, r3, #336
        cmp             r1, #7
        moveq           r5, #50
        cmp             r1, #8
        moveq           r5, #100
        cmp             r1, #9
        moveq           r5, #50
        addeq           r2, r3, #336
        cmp             r1, #10
        moveq           r5, #5
        addeq           r2, r3, #48
        cmp             r1, #11
        moveq           r5, #0
        addeq           r2, r3, #96
        add             r6, r3, #144
        add             r7, r3, #288
        vld1.8          {d0-d1}, [r6, : 128]!
        vld1.8          {d2-d3}, [r6, : 128]!
        vld1.8          {d4}, [r6, : 64]
        vst1.8          {d0-d1}, [r7, : 128]!
        vst1.8          {d2-d3}, [r7, : 128]!
        vst1.8          d4, [r7, : 64]
        cmp             r5, #0
        beq             .Lskipsquaringloop
.Lsquaringloop:
        add             r6, r3, #288
        add             r7, r3, #288
        add             r8, r3, #288
        vmov.i32        q0, #19
        vmov.i32        q1, #0
        vmov.i32        q2, #1
        vzip.i32        q1, q2
        vld1.8          {d4-d5}, [r7, : 128]!
        vld1.8          {d6-d7}, [r7, : 128]!
        vld1.8          {d9}, [r7, : 64]
        vld1.8          {d10-d11}, [r6, : 128]!
        add             r7, sp, #384
        vld1.8          {d12-d13}, [r6, : 128]!
        vmul.i32        q7, q2, q0
        vld1.8          {d8}, [r6, : 64]
        vext.32         d17, d11, d10, #1
        vmul.i32        q9, q3, q0
        vext.32         d16, d10, d8, #1
        vshl.u32        q10, q5, q1
        vext.32         d22, d14, d4, #1
        vext.32         d24, d18, d6, #1
        vshl.u32        q13, q6, q1
        vshl.u32        d28, d8, d2
        vrev64.i32      d22, d22
        vmul.i32        d1, d9, d1
        vrev64.i32      d24, d24
        vext.32         d29, d8, d13, #1
        vext.32         d0, d1, d9, #1
        vrev64.i32      d0, d0
        vext.32         d2, d9, d1, #1
        vext.32         d23, d15, d5, #1
        vmull.s32       q4, d20, d4
        vrev64.i32      d23, d23
        vmlal.s32       q4, d21, d1
        vrev64.i32      d2, d2
        vmlal.s32       q4, d26, d19
        vext.32         d3, d5, d15, #1
        vmlal.s32       q4, d27, d18
        vrev64.i32      d3, d3
        vmlal.s32       q4, d28, d15
        vext.32         d14, d12, d11, #1
        vmull.s32       q5, d16, d23
        vext.32         d15, d13, d12, #1
        vmlal.s32       q5, d17, d4
        vst1.8          d8, [r7, : 64]!
        vmlal.s32       q5, d14, d1
        vext.32         d12, d9, d8, #0
        vmlal.s32       q5, d15, d19
        vmov.i64        d13, #0
        vmlal.s32       q5, d29, d18
        vext.32         d25, d19, d7, #1
        vmlal.s32       q6, d20, d5
        vrev64.i32      d25, d25
        vmlal.s32       q6, d21, d4
        vst1.8          d11, [r7, : 64]!
        vmlal.s32       q6, d26, d1
        vext.32         d9, d10, d10, #0
        vmlal.s32       q6, d27, d19
        vmov.i64        d8, #0
        vmlal.s32       q6, d28, d18
        vmlal.s32       q4, d16, d24
        vmlal.s32       q4, d17, d5
        vmlal.s32       q4, d14, d4
        vst1.8          d12, [r7, : 64]!
        vmlal.s32       q4, d15, d1
        vext.32         d10, d13, d12, #0
        vmlal.s32       q4, d29, d19
        vmov.i64        d11, #0
        vmlal.s32       q5, d20, d6
        vmlal.s32       q5, d21, d5
        vmlal.s32       q5, d26, d4
        vext.32         d13, d8, d8, #0
        vmlal.s32       q5, d27, d1
        vmov.i64        d12, #0
        vmlal.s32       q5, d28, d19
        vst1.8          d9, [r7, : 64]!
        vmlal.s32       q6, d16, d25
        vmlal.s32       q6, d17, d6
        vst1.8          d10, [r7, : 64]
        vmlal.s32       q6, d14, d5
        vext.32         d8, d11, d10, #0
        vmlal.s32       q6, d15, d4
        vmov.i64        d9, #0
        vmlal.s32       q6, d29, d1
        vmlal.s32       q4, d20, d7
        vmlal.s32       q4, d21, d6
        vmlal.s32       q4, d26, d5
        vext.32         d11, d12, d12, #0
        vmlal.s32       q4, d27, d4
        vmov.i64        d10, #0
        vmlal.s32       q4, d28, d1
        vmlal.s32       q5, d16, d0
        sub             r6, r7, #32
        vmlal.s32       q5, d17, d7
        vmlal.s32       q5, d14, d6
        vext.32         d30, d9, d8, #0
        vmlal.s32       q5, d15, d5
        vld1.8          {d31}, [r6, : 64]!
        vmlal.s32       q5, d29, d4
        vmlal.s32       q15, d20, d0
        vext.32         d0, d6, d18, #1
        vmlal.s32       q15, d21, d25
        vrev64.i32      d0, d0
        vmlal.s32       q15, d26, d24
        vext.32         d1, d7, d19, #1
        vext.32         d7, d10, d10, #0
        vmlal.s32       q15, d27, d23
        vrev64.i32      d1, d1
        vld1.8          {d6}, [r6, : 64]
        vmlal.s32       q15, d28, d22
        vmlal.s32       q3, d16, d4
        add             r6, r6, #24
        vmlal.s32       q3, d17, d2
        vext.32         d4, d31, d30, #0
        vmov            d17, d11
        vmlal.s32       q3, d14, d1
        vext.32         d11, d13, d13, #0
        vext.32         d13, d30, d30, #0
        vmlal.s32       q3, d15, d0
        vext.32         d1, d8, d8, #0
        vmlal.s32       q3, d29, d3
        vld1.8          {d5}, [r6, : 64]
        sub             r6, r6, #16
        vext.32         d10, d6, d6, #0
        vmov.i32        q1, #0xffffffff
        vshl.i64        q4, q1, #25
        add             r7, sp, #480
        vld1.8          {d14-d15}, [r7, : 128]
        vadd.i64        q9, q2, q7
        vshl.i64        q1, q1, #26
        vshr.s64        q10, q9, #26
        vld1.8          {d0}, [r6, : 64]!
        vadd.i64        q5, q5, q10
        vand            q9, q9, q1
        vld1.8          {d16}, [r6, : 64]!
        add             r6, sp, #496
        vld1.8          {d20-d21}, [r6, : 128]
        vadd.i64        q11, q5, q10
        vsub.i64        q2, q2, q9
        vshr.s64        q9, q11, #25
        vext.32         d12, d5, d4, #0
        vand            q11, q11, q4
        vadd.i64        q0, q0, q9
        vmov            d19, d7
        vadd.i64        q3, q0, q7
        vsub.i64        q5, q5, q11
        vshr.s64        q11, q3, #26
        vext.32         d18, d11, d10, #0
        vand            q3, q3, q1
        vadd.i64        q8, q8, q11
        vadd.i64        q11, q8, q10
        vsub.i64        q0, q0, q3
        vshr.s64        q3, q11, #25
        vand            q11, q11, q4
        vadd.i64        q3, q6, q3
        vadd.i64        q6, q3, q7
        vsub.i64        q8, q8, q11
        vshr.s64        q11, q6, #26
        vand            q6, q6, q1
        vadd.i64        q9, q9, q11
        vadd.i64        d25, d19, d21
        vsub.i64        q3, q3, q6
        vshr.s64        d23, d25, #25
        vand            q4, q12, q4
        vadd.i64        d21, d23, d23
        vshl.i64        d25, d23, #4
        vadd.i64        d21, d21, d23
        vadd.i64        d25, d25, d21
        vadd.i64        d4, d4, d25
        vzip.i32        q0, q8
        vadd.i64        d12, d4, d14
        add             r6, r8, #8
        vst1.8          d0, [r6, : 64]
        vsub.i64        d19, d19, d9
        add             r6, r6, #16
        vst1.8          d16, [r6, : 64]
        vshr.s64        d22, d12, #26
        vand            q0, q6, q1
        vadd.i64        d10, d10, d22
        vzip.i32        q3, q9
        vsub.i64        d4, d4, d0
        sub             r6, r6, #8
        vst1.8          d6, [r6, : 64]
        add             r6, r6, #16
        vst1.8          d18, [r6, : 64]
        vzip.i32        q2, q5
        sub             r6, r6, #32
        vst1.8          d4, [r6, : 64]
        subs            r5, r5, #1
        bhi             .Lsquaringloop
.Lskipsquaringloop:
        mov             r2, r2
        add             r5, r3, #288
        add             r6, r3, #144
        vmov.i32        q0, #19
        vmov.i32        q1, #0
        vmov.i32        q2, #1
        vzip.i32        q1, q2
        vld1.8          {d4-d5}, [r5, : 128]!
        vld1.8          {d6-d7}, [r5, : 128]!
        vld1.8          {d9}, [r5, : 64]
        vld1.8          {d10-d11}, [r2, : 128]!
        add             r5, sp, #384
        vld1.8          {d12-d13}, [r2, : 128]!
        vmul.i32        q7, q2, q0
        vld1.8          {d8}, [r2, : 64]
        vext.32         d17, d11, d10, #1
        vmul.i32        q9, q3, q0
        vext.32         d16, d10, d8, #1
        vshl.u32        q10, q5, q1
        vext.32         d22, d14, d4, #1
        vext.32         d24, d18, d6, #1
        vshl.u32        q13, q6, q1
        vshl.u32        d28, d8, d2
        vrev64.i32      d22, d22
        vmul.i32        d1, d9, d1
        vrev64.i32      d24, d24
        vext.32         d29, d8, d13, #1
        vext.32         d0, d1, d9, #1
        vrev64.i32      d0, d0
        vext.32         d2, d9, d1, #1
        vext.32         d23, d15, d5, #1
        vmull.s32       q4, d20, d4
        vrev64.i32      d23, d23
        vmlal.s32       q4, d21, d1
        vrev64.i32      d2, d2
        vmlal.s32       q4, d26, d19
        vext.32         d3, d5, d15, #1
        vmlal.s32       q4, d27, d18
        vrev64.i32      d3, d3
        vmlal.s32       q4, d28, d15
        vext.32         d14, d12, d11, #1
        vmull.s32       q5, d16, d23
        vext.32         d15, d13, d12, #1
        vmlal.s32       q5, d17, d4
        vst1.8          d8, [r5, : 64]!
        vmlal.s32       q5, d14, d1
        vext.32         d12, d9, d8, #0
        vmlal.s32       q5, d15, d19
        vmov.i64        d13, #0
        vmlal.s32       q5, d29, d18
        vext.32         d25, d19, d7, #1
        vmlal.s32       q6, d20, d5
        vrev64.i32      d25, d25
        vmlal.s32       q6, d21, d4
        vst1.8          d11, [r5, : 64]!
        vmlal.s32       q6, d26, d1
        vext.32         d9, d10, d10, #0
        vmlal.s32       q6, d27, d19
        vmov.i64        d8, #0
        vmlal.s32       q6, d28, d18
        vmlal.s32       q4, d16, d24
        vmlal.s32       q4, d17, d5
        vmlal.s32       q4, d14, d4
        vst1.8          d12, [r5, : 64]!
        vmlal.s32       q4, d15, d1
        vext.32         d10, d13, d12, #0
        vmlal.s32       q4, d29, d19
        vmov.i64        d11, #0
        vmlal.s32       q5, d20, d6
        vmlal.s32       q5, d21, d5
        vmlal.s32       q5, d26, d4
        vext.32         d13, d8, d8, #0
        vmlal.s32       q5, d27, d1
        vmov.i64        d12, #0
        vmlal.s32       q5, d28, d19
        vst1.8          d9, [r5, : 64]!
        vmlal.s32       q6, d16, d25
        vmlal.s32       q6, d17, d6
        vst1.8          d10, [r5, : 64]
        vmlal.s32       q6, d14, d5
        vext.32         d8, d11, d10, #0
        vmlal.s32       q6, d15, d4
        vmov.i64        d9, #0
        vmlal.s32       q6, d29, d1
        vmlal.s32       q4, d20, d7
        vmlal.s32       q4, d21, d6
        vmlal.s32       q4, d26, d5
        vext.32         d11, d12, d12, #0
        vmlal.s32       q4, d27, d4
        vmov.i64        d10, #0
        vmlal.s32       q4, d28, d1
        vmlal.s32       q5, d16, d0
        sub             r2, r5, #32
        vmlal.s32       q5, d17, d7
        vmlal.s32       q5, d14, d6
        vext.32         d30, d9, d8, #0
        vmlal.s32       q5, d15, d5
        vld1.8          {d31}, [r2, : 64]!
        vmlal.s32       q5, d29, d4
        vmlal.s32       q15, d20, d0
        vext.32         d0, d6, d18, #1
        vmlal.s32       q15, d21, d25
        vrev64.i32      d0, d0
        vmlal.s32       q15, d26, d24
        vext.32         d1, d7, d19, #1
        vext.32         d7, d10, d10, #0
        vmlal.s32       q15, d27, d23
        vrev64.i32      d1, d1
        vld1.8          {d6}, [r2, : 64]
        vmlal.s32       q15, d28, d22
        vmlal.s32       q3, d16, d4
        add             r2, r2, #24
        vmlal.s32       q3, d17, d2
        vext.32         d4, d31, d30, #0
        vmov            d17, d11
        vmlal.s32       q3, d14, d1
        vext.32         d11, d13, d13, #0
        vext.32         d13, d30, d30, #0
        vmlal.s32       q3, d15, d0
        vext.32         d1, d8, d8, #0
        vmlal.s32       q3, d29, d3
        vld1.8          {d5}, [r2, : 64]
        sub             r2, r2, #16
        vext.32         d10, d6, d6, #0
        vmov.i32        q1, #0xffffffff
        vshl.i64        q4, q1, #25
        add             r5, sp, #480
        vld1.8          {d14-d15}, [r5, : 128]
        vadd.i64        q9, q2, q7
        vshl.i64        q1, q1, #26
        vshr.s64        q10, q9, #26
        vld1.8          {d0}, [r2, : 64]!
        vadd.i64        q5, q5, q10
        vand            q9, q9, q1
        vld1.8          {d16}, [r2, : 64]!
        add             r2, sp, #496
        vld1.8          {d20-d21}, [r2, : 128]
        vadd.i64        q11, q5, q10
        vsub.i64        q2, q2, q9
        vshr.s64        q9, q11, #25
        vext.32         d12, d5, d4, #0
        vand            q11, q11, q4
        vadd.i64        q0, q0, q9
        vmov            d19, d7
        vadd.i64        q3, q0, q7
        vsub.i64        q5, q5, q11
        vshr.s64        q11, q3, #26
        vext.32         d18, d11, d10, #0
        vand            q3, q3, q1
        vadd.i64        q8, q8, q11
        vadd.i64        q11, q8, q10
        vsub.i64        q0, q0, q3
        vshr.s64        q3, q11, #25
        vand            q11, q11, q4
        vadd.i64        q3, q6, q3
        vadd.i64        q6, q3, q7
        vsub.i64        q8, q8, q11
        vshr.s64        q11, q6, #26
        vand            q6, q6, q1
        vadd.i64        q9, q9, q11
        vadd.i64        d25, d19, d21
        vsub.i64        q3, q3, q6
        vshr.s64        d23, d25, #25
        vand            q4, q12, q4
        vadd.i64        d21, d23, d23
        vshl.i64        d25, d23, #4
        vadd.i64        d21, d21, d23
        vadd.i64        d25, d25, d21
        vadd.i64        d4, d4, d25
        vzip.i32        q0, q8
        vadd.i64        d12, d4, d14
        add             r2, r6, #8
        vst1.8          d0, [r2, : 64]
        vsub.i64        d19, d19, d9
        add             r2, r2, #16
        vst1.8          d16, [r2, : 64]
        vshr.s64        d22, d12, #26
        vand            q0, q6, q1
        vadd.i64        d10, d10, d22
        vzip.i32        q3, q9
        vsub.i64        d4, d4, d0
        sub             r2, r2, #8
        vst1.8          d6, [r2, : 64]
        add             r2, r2, #16
        vst1.8          d18, [r2, : 64]
        vzip.i32        q2, q5
        sub             r2, r2, #32
        vst1.8          d4, [r2, : 64]
        cmp             r4, #0
        beq             .Lskippostcopy
        add             r2, r3, #144
        mov             r4, r4
        vld1.8          {d0-d1}, [r2, : 128]!
        vld1.8          {d2-d3}, [r2, : 128]!
        vld1.8          {d4}, [r2, : 64]
        vst1.8          {d0-d1}, [r4, : 128]!
        vst1.8          {d2-d3}, [r4, : 128]!
        vst1.8          d4, [r4, : 64]
.Lskippostcopy:
        cmp             r1, #1
        bne             .Lskipfinalcopy
        add             r2, r3, #288
        add             r4, r3, #144
        vld1.8          {d0-d1}, [r2, : 128]!
        vld1.8          {d2-d3}, [r2, : 128]!
        vld1.8          {d4}, [r2, : 64]
        vst1.8          {d0-d1}, [r4, : 128]!
        vst1.8          {d2-d3}, [r4, : 128]!
        vst1.8          d4, [r4, : 64]
.Lskipfinalcopy:
        add             r1, r1, #1
        cmp             r1, #12
        blo             .Linvertloop
        add             r1, r3, #144
        ldr             r2, [r1], #4
        ldr             r3, [r1], #4
        ldr             r4, [r1], #4
        ldr             r5, [r1], #4
        ldr             r6, [r1], #4
        ldr             r7, [r1], #4
        ldr             r8, [r1], #4
        ldr             r9, [r1], #4
        ldr             r10, [r1], #4
        ldr             r1, [r1]
        add             r11, r1, r1, LSL #4
        add             r11, r11, r1, LSL #1
        add             r11, r11, #16777216
        mov             r11, r11, ASR #25
        add             r11, r11, r2
        mov             r11, r11, ASR #26
        add             r11, r11, r3
        mov             r11, r11, ASR #25
        add             r11, r11, r4
        mov             r11, r11, ASR #26
        add             r11, r11, r5
        mov             r11, r11, ASR #25
        add             r11, r11, r6
        mov             r11, r11, ASR #26
        add             r11, r11, r7
        mov             r11, r11, ASR #25
        add             r11, r11, r8
        mov             r11, r11, ASR #26
        add             r11, r11, r9
        mov             r11, r11, ASR #25
        add             r11, r11, r10
        mov             r11, r11, ASR #26
        add             r11, r11, r1
        mov             r11, r11, ASR #25
        add             r2, r2, r11
        add             r2, r2, r11, LSL #1
        add             r2, r2, r11, LSL #4
        mov             r11, r2, ASR #26
        add             r3, r3, r11
        sub             r2, r2, r11, LSL #26
        mov             r11, r3, ASR #25
        add             r4, r4, r11
        sub             r3, r3, r11, LSL #25
        mov             r11, r4, ASR #26
        add             r5, r5, r11
        sub             r4, r4, r11, LSL #26
        mov             r11, r5, ASR #25
        add             r6, r6, r11
        sub             r5, r5, r11, LSL #25
        mov             r11, r6, ASR #26
        add             r7, r7, r11
        sub             r6, r6, r11, LSL #26
        mov             r11, r7, ASR #25
        add             r8, r8, r11
        sub             r7, r7, r11, LSL #25
        mov             r11, r8, ASR #26
        add             r9, r9, r11
        sub             r8, r8, r11, LSL #26
        mov             r11, r9, ASR #25
        add             r10, r10, r11
        sub             r9, r9, r11, LSL #25
        mov             r11, r10, ASR #26
        add             r1, r1, r11
        sub             r10, r10, r11, LSL #26
        mov             r11, r1, ASR #25
        sub             r1, r1, r11, LSL #25
        add             r2, r2, r3, LSL #26
        mov             r3, r3, LSR #6
        add             r3, r3, r4, LSL #19
        mov             r4, r4, LSR #13
        add             r4, r4, r5, LSL #13
        mov             r5, r5, LSR #19
        add             r5, r5, r6, LSL #6
        add             r6, r7, r8, LSL #25
        mov             r7, r8, LSR #7
        add             r7, r7, r9, LSL #19
        mov             r8, r9, LSR #13
        add             r8, r8, r10, LSL #12
        mov             r9, r10, LSR #20
        add             r1, r9, r1, LSL #6
        str             r2, [r0]
        str             r3, [r0, #4]
        str             r4, [r0, #8]
        str             r5, [r0, #12]
        str             r6, [r0, #16]
        str             r7, [r0, #20]
        str             r8, [r0, #24]
        str             r1, [r0, #28]
        movw            r0, #0
        mov             sp, ip
        pop             {r4-r11, pc}
ENDPROC(curve25519_neon)