/* SPDX-License-Identifier: GPL-2.0 OR MIT */ /* * Copyright (C) 2015-2018 Jason A. Donenfeld . 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. */ #if defined(CONFIG_KERNEL_MODE_NEON) && !defined(__ARMEB__) #include .text .fpu neon .arch armv7-a .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) #endif