Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 OR MIT */
0002 /*
0003  * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
0004  *
0005  * Based on public domain code from Daniel J. Bernstein and Peter Schwabe. This
0006  * began from SUPERCOP's curve25519/neon2/scalarmult.s, but has subsequently been
0007  * manually reworked for use in kernel space.
0008  */
0009 
0010 #include <linux/linkage.h>
0011 
0012 .text
0013 .arch armv7-a
0014 .fpu neon
0015 .align 4
0016 
0017 ENTRY(curve25519_neon)
0018     push        {r4-r11, lr}
0019     mov     ip, sp
0020     sub     r3, sp, #704
0021     and     r3, r3, #0xfffffff0
0022     mov     sp, r3
0023     movw        r4, #0
0024     movw        r5, #254
0025     vmov.i32    q0, #1
0026     vshr.u64    q1, q0, #7
0027     vshr.u64    q0, q0, #8
0028     vmov.i32    d4, #19
0029     vmov.i32    d5, #38
0030     add     r6, sp, #480
0031     vst1.8      {d2-d3}, [r6, : 128]!
0032     vst1.8      {d0-d1}, [r6, : 128]!
0033     vst1.8      {d4-d5}, [r6, : 128]
0034     add     r6, r3, #0
0035     vmov.i32    q2, #0
0036     vst1.8      {d4-d5}, [r6, : 128]!
0037     vst1.8      {d4-d5}, [r6, : 128]!
0038     vst1.8      d4, [r6, : 64]
0039     add     r6, r3, #0
0040     movw        r7, #960
0041     sub     r7, r7, #2
0042     neg     r7, r7
0043     sub     r7, r7, r7, LSL #7
0044     str     r7, [r6]
0045     add     r6, sp, #672
0046     vld1.8      {d4-d5}, [r1]!
0047     vld1.8      {d6-d7}, [r1]
0048     vst1.8      {d4-d5}, [r6, : 128]!
0049     vst1.8      {d6-d7}, [r6, : 128]
0050     sub     r1, r6, #16
0051     ldrb        r6, [r1]
0052     and     r6, r6, #248
0053     strb        r6, [r1]
0054     ldrb        r6, [r1, #31]
0055     and     r6, r6, #127
0056     orr     r6, r6, #64
0057     strb        r6, [r1, #31]
0058     vmov.i64    q2, #0xffffffff
0059     vshr.u64    q3, q2, #7
0060     vshr.u64    q2, q2, #6
0061     vld1.8      {d8}, [r2]
0062     vld1.8      {d10}, [r2]
0063     add     r2, r2, #6
0064     vld1.8      {d12}, [r2]
0065     vld1.8      {d14}, [r2]
0066     add     r2, r2, #6
0067     vld1.8      {d16}, [r2]
0068     add     r2, r2, #4
0069     vld1.8      {d18}, [r2]
0070     vld1.8      {d20}, [r2]
0071     add     r2, r2, #6
0072     vld1.8      {d22}, [r2]
0073     add     r2, r2, #2
0074     vld1.8      {d24}, [r2]
0075     vld1.8      {d26}, [r2]
0076     vshr.u64    q5, q5, #26
0077     vshr.u64    q6, q6, #3
0078     vshr.u64    q7, q7, #29
0079     vshr.u64    q8, q8, #6
0080     vshr.u64    q10, q10, #25
0081     vshr.u64    q11, q11, #3
0082     vshr.u64    q12, q12, #12
0083     vshr.u64    q13, q13, #38
0084     vand        q4, q4, q2
0085     vand        q6, q6, q2
0086     vand        q8, q8, q2
0087     vand        q10, q10, q2
0088     vand        q2, q12, q2
0089     vand        q5, q5, q3
0090     vand        q7, q7, q3
0091     vand        q9, q9, q3
0092     vand        q11, q11, q3
0093     vand        q3, q13, q3
0094     add     r2, r3, #48
0095     vadd.i64    q12, q4, q1
0096     vadd.i64    q13, q10, q1
0097     vshr.s64    q12, q12, #26
0098     vshr.s64    q13, q13, #26
0099     vadd.i64    q5, q5, q12
0100     vshl.i64    q12, q12, #26
0101     vadd.i64    q14, q5, q0
0102     vadd.i64    q11, q11, q13
0103     vshl.i64    q13, q13, #26
0104     vadd.i64    q15, q11, q0
0105     vsub.i64    q4, q4, q12
0106     vshr.s64    q12, q14, #25
0107     vsub.i64    q10, q10, q13
0108     vshr.s64    q13, q15, #25
0109     vadd.i64    q6, q6, q12
0110     vshl.i64    q12, q12, #25
0111     vadd.i64    q14, q6, q1
0112     vadd.i64    q2, q2, q13
0113     vsub.i64    q5, q5, q12
0114     vshr.s64    q12, q14, #26
0115     vshl.i64    q13, q13, #25
0116     vadd.i64    q14, q2, q1
0117     vadd.i64    q7, q7, q12
0118     vshl.i64    q12, q12, #26
0119     vadd.i64    q15, q7, q0
0120     vsub.i64    q11, q11, q13
0121     vshr.s64    q13, q14, #26
0122     vsub.i64    q6, q6, q12
0123     vshr.s64    q12, q15, #25
0124     vadd.i64    q3, q3, q13
0125     vshl.i64    q13, q13, #26
0126     vadd.i64    q14, q3, q0
0127     vadd.i64    q8, q8, q12
0128     vshl.i64    q12, q12, #25
0129     vadd.i64    q15, q8, q1
0130     add     r2, r2, #8
0131     vsub.i64    q2, q2, q13
0132     vshr.s64    q13, q14, #25
0133     vsub.i64    q7, q7, q12
0134     vshr.s64    q12, q15, #26
0135     vadd.i64    q14, q13, q13
0136     vadd.i64    q9, q9, q12
0137     vtrn.32     d12, d14
0138     vshl.i64    q12, q12, #26
0139     vtrn.32     d13, d15
0140     vadd.i64    q0, q9, q0
0141     vadd.i64    q4, q4, q14
0142     vst1.8      d12, [r2, : 64]!
0143     vshl.i64    q6, q13, #4
0144     vsub.i64    q7, q8, q12
0145     vshr.s64    q0, q0, #25
0146     vadd.i64    q4, q4, q6
0147     vadd.i64    q6, q10, q0
0148     vshl.i64    q0, q0, #25
0149     vadd.i64    q8, q6, q1
0150     vadd.i64    q4, q4, q13
0151     vshl.i64    q10, q13, #25
0152     vadd.i64    q1, q4, q1
0153     vsub.i64    q0, q9, q0
0154     vshr.s64    q8, q8, #26
0155     vsub.i64    q3, q3, q10
0156     vtrn.32     d14, d0
0157     vshr.s64    q1, q1, #26
0158     vtrn.32     d15, d1
0159     vadd.i64    q0, q11, q8
0160     vst1.8      d14, [r2, : 64]
0161     vshl.i64    q7, q8, #26
0162     vadd.i64    q5, q5, q1
0163     vtrn.32     d4, d6
0164     vshl.i64    q1, q1, #26
0165     vtrn.32     d5, d7
0166     vsub.i64    q3, q6, q7
0167     add     r2, r2, #16
0168     vsub.i64    q1, q4, q1
0169     vst1.8      d4, [r2, : 64]
0170     vtrn.32     d6, d0
0171     vtrn.32     d7, d1
0172     sub     r2, r2, #8
0173     vtrn.32     d2, d10
0174     vtrn.32     d3, d11
0175     vst1.8      d6, [r2, : 64]
0176     sub     r2, r2, #24
0177     vst1.8      d2, [r2, : 64]
0178     add     r2, r3, #96
0179     vmov.i32    q0, #0
0180     vmov.i64    d2, #0xff
0181     vmov.i64    d3, #0
0182     vshr.u32    q1, q1, #7
0183     vst1.8      {d2-d3}, [r2, : 128]!
0184     vst1.8      {d0-d1}, [r2, : 128]!
0185     vst1.8      d0, [r2, : 64]
0186     add     r2, r3, #144
0187     vmov.i32    q0, #0
0188     vst1.8      {d0-d1}, [r2, : 128]!
0189     vst1.8      {d0-d1}, [r2, : 128]!
0190     vst1.8      d0, [r2, : 64]
0191     add     r2, r3, #240
0192     vmov.i32    q0, #0
0193     vmov.i64    d2, #0xff
0194     vmov.i64    d3, #0
0195     vshr.u32    q1, q1, #7
0196     vst1.8      {d2-d3}, [r2, : 128]!
0197     vst1.8      {d0-d1}, [r2, : 128]!
0198     vst1.8      d0, [r2, : 64]
0199     add     r2, r3, #48
0200     add     r6, r3, #192
0201     vld1.8      {d0-d1}, [r2, : 128]!
0202     vld1.8      {d2-d3}, [r2, : 128]!
0203     vld1.8      {d4}, [r2, : 64]
0204     vst1.8      {d0-d1}, [r6, : 128]!
0205     vst1.8      {d2-d3}, [r6, : 128]!
0206     vst1.8      d4, [r6, : 64]
0207 .Lmainloop:
0208     mov     r2, r5, LSR #3
0209     and     r6, r5, #7
0210     ldrb        r2, [r1, r2]
0211     mov     r2, r2, LSR r6
0212     and     r2, r2, #1
0213     str     r5, [sp, #456]
0214     eor     r4, r4, r2
0215     str     r2, [sp, #460]
0216     neg     r2, r4
0217     add     r4, r3, #96
0218     add     r5, r3, #192
0219     add     r6, r3, #144
0220     vld1.8      {d8-d9}, [r4, : 128]!
0221     add     r7, r3, #240
0222     vld1.8      {d10-d11}, [r5, : 128]!
0223     veor        q6, q4, q5
0224     vld1.8      {d14-d15}, [r6, : 128]!
0225     vdup.i32    q8, r2
0226     vld1.8      {d18-d19}, [r7, : 128]!
0227     veor        q10, q7, q9
0228     vld1.8      {d22-d23}, [r4, : 128]!
0229     vand        q6, q6, q8
0230     vld1.8      {d24-d25}, [r5, : 128]!
0231     vand        q10, q10, q8
0232     vld1.8      {d26-d27}, [r6, : 128]!
0233     veor        q4, q4, q6
0234     vld1.8      {d28-d29}, [r7, : 128]!
0235     veor        q5, q5, q6
0236     vld1.8      {d0}, [r4, : 64]
0237     veor        q6, q7, q10
0238     vld1.8      {d2}, [r5, : 64]
0239     veor        q7, q9, q10
0240     vld1.8      {d4}, [r6, : 64]
0241     veor        q9, q11, q12
0242     vld1.8      {d6}, [r7, : 64]
0243     veor        q10, q0, q1
0244     sub     r2, r4, #32
0245     vand        q9, q9, q8
0246     sub     r4, r5, #32
0247     vand        q10, q10, q8
0248     sub     r5, r6, #32
0249     veor        q11, q11, q9
0250     sub     r6, r7, #32
0251     veor        q0, q0, q10
0252     veor        q9, q12, q9
0253     veor        q1, q1, q10
0254     veor        q10, q13, q14
0255     veor        q12, q2, q3
0256     vand        q10, q10, q8
0257     vand        q8, q12, q8
0258     veor        q12, q13, q10
0259     veor        q2, q2, q8
0260     veor        q10, q14, q10
0261     veor        q3, q3, q8
0262     vadd.i32    q8, q4, q6
0263     vsub.i32    q4, q4, q6
0264     vst1.8      {d16-d17}, [r2, : 128]!
0265     vadd.i32    q6, q11, q12
0266     vst1.8      {d8-d9}, [r5, : 128]!
0267     vsub.i32    q4, q11, q12
0268     vst1.8      {d12-d13}, [r2, : 128]!
0269     vadd.i32    q6, q0, q2
0270     vst1.8      {d8-d9}, [r5, : 128]!
0271     vsub.i32    q0, q0, q2
0272     vst1.8      d12, [r2, : 64]
0273     vadd.i32    q2, q5, q7
0274     vst1.8      d0, [r5, : 64]
0275     vsub.i32    q0, q5, q7
0276     vst1.8      {d4-d5}, [r4, : 128]!
0277     vadd.i32    q2, q9, q10
0278     vst1.8      {d0-d1}, [r6, : 128]!
0279     vsub.i32    q0, q9, q10
0280     vst1.8      {d4-d5}, [r4, : 128]!
0281     vadd.i32    q2, q1, q3
0282     vst1.8      {d0-d1}, [r6, : 128]!
0283     vsub.i32    q0, q1, q3
0284     vst1.8      d4, [r4, : 64]
0285     vst1.8      d0, [r6, : 64]
0286     add     r2, sp, #512
0287     add     r4, r3, #96
0288     add     r5, r3, #144
0289     vld1.8      {d0-d1}, [r2, : 128]
0290     vld1.8      {d2-d3}, [r4, : 128]!
0291     vld1.8      {d4-d5}, [r5, : 128]!
0292     vzip.i32    q1, q2
0293     vld1.8      {d6-d7}, [r4, : 128]!
0294     vld1.8      {d8-d9}, [r5, : 128]!
0295     vshl.i32    q5, q1, #1
0296     vzip.i32    q3, q4
0297     vshl.i32    q6, q2, #1
0298     vld1.8      {d14}, [r4, : 64]
0299     vshl.i32    q8, q3, #1
0300     vld1.8      {d15}, [r5, : 64]
0301     vshl.i32    q9, q4, #1
0302     vmul.i32    d21, d7, d1
0303     vtrn.32     d14, d15
0304     vmul.i32    q11, q4, q0
0305     vmul.i32    q0, q7, q0
0306     vmull.s32   q12, d2, d2
0307     vmlal.s32   q12, d11, d1
0308     vmlal.s32   q12, d12, d0
0309     vmlal.s32   q12, d13, d23
0310     vmlal.s32   q12, d16, d22
0311     vmlal.s32   q12, d7, d21
0312     vmull.s32   q10, d2, d11
0313     vmlal.s32   q10, d4, d1
0314     vmlal.s32   q10, d13, d0
0315     vmlal.s32   q10, d6, d23
0316     vmlal.s32   q10, d17, d22
0317     vmull.s32   q13, d10, d4
0318     vmlal.s32   q13, d11, d3
0319     vmlal.s32   q13, d13, d1
0320     vmlal.s32   q13, d16, d0
0321     vmlal.s32   q13, d17, d23
0322     vmlal.s32   q13, d8, d22
0323     vmull.s32   q1, d10, d5
0324     vmlal.s32   q1, d11, d4
0325     vmlal.s32   q1, d6, d1
0326     vmlal.s32   q1, d17, d0
0327     vmlal.s32   q1, d8, d23
0328     vmull.s32   q14, d10, d6
0329     vmlal.s32   q14, d11, d13
0330     vmlal.s32   q14, d4, d4
0331     vmlal.s32   q14, d17, d1
0332     vmlal.s32   q14, d18, d0
0333     vmlal.s32   q14, d9, d23
0334     vmull.s32   q11, d10, d7
0335     vmlal.s32   q11, d11, d6
0336     vmlal.s32   q11, d12, d5
0337     vmlal.s32   q11, d8, d1
0338     vmlal.s32   q11, d19, d0
0339     vmull.s32   q15, d10, d8
0340     vmlal.s32   q15, d11, d17
0341     vmlal.s32   q15, d12, d6
0342     vmlal.s32   q15, d13, d5
0343     vmlal.s32   q15, d19, d1
0344     vmlal.s32   q15, d14, d0
0345     vmull.s32   q2, d10, d9
0346     vmlal.s32   q2, d11, d8
0347     vmlal.s32   q2, d12, d7
0348     vmlal.s32   q2, d13, d6
0349     vmlal.s32   q2, d14, d1
0350     vmull.s32   q0, d15, d1
0351     vmlal.s32   q0, d10, d14
0352     vmlal.s32   q0, d11, d19
0353     vmlal.s32   q0, d12, d8
0354     vmlal.s32   q0, d13, d17
0355     vmlal.s32   q0, d6, d6
0356     add     r2, sp, #480
0357     vld1.8      {d18-d19}, [r2, : 128]!
0358     vmull.s32   q3, d16, d7
0359     vmlal.s32   q3, d10, d15
0360     vmlal.s32   q3, d11, d14
0361     vmlal.s32   q3, d12, d9
0362     vmlal.s32   q3, d13, d8
0363     vld1.8      {d8-d9}, [r2, : 128]
0364     vadd.i64    q5, q12, q9
0365     vadd.i64    q6, q15, q9
0366     vshr.s64    q5, q5, #26
0367     vshr.s64    q6, q6, #26
0368     vadd.i64    q7, q10, q5
0369     vshl.i64    q5, q5, #26
0370     vadd.i64    q8, q7, q4
0371     vadd.i64    q2, q2, q6
0372     vshl.i64    q6, q6, #26
0373     vadd.i64    q10, q2, q4
0374     vsub.i64    q5, q12, q5
0375     vshr.s64    q8, q8, #25
0376     vsub.i64    q6, q15, q6
0377     vshr.s64    q10, q10, #25
0378     vadd.i64    q12, q13, q8
0379     vshl.i64    q8, q8, #25
0380     vadd.i64    q13, q12, q9
0381     vadd.i64    q0, q0, q10
0382     vsub.i64    q7, q7, q8
0383     vshr.s64    q8, q13, #26
0384     vshl.i64    q10, q10, #25
0385     vadd.i64    q13, q0, q9
0386     vadd.i64    q1, q1, q8
0387     vshl.i64    q8, q8, #26
0388     vadd.i64    q15, q1, q4
0389     vsub.i64    q2, q2, q10
0390     vshr.s64    q10, q13, #26
0391     vsub.i64    q8, q12, q8
0392     vshr.s64    q12, q15, #25
0393     vadd.i64    q3, q3, q10
0394     vshl.i64    q10, q10, #26
0395     vadd.i64    q13, q3, q4
0396     vadd.i64    q14, q14, q12
0397     add     r2, r3, #288
0398     vshl.i64    q12, q12, #25
0399     add     r4, r3, #336
0400     vadd.i64    q15, q14, q9
0401     add     r2, r2, #8
0402     vsub.i64    q0, q0, q10
0403     add     r4, r4, #8
0404     vshr.s64    q10, q13, #25
0405     vsub.i64    q1, q1, q12
0406     vshr.s64    q12, q15, #26
0407     vadd.i64    q13, q10, q10
0408     vadd.i64    q11, q11, q12
0409     vtrn.32     d16, d2
0410     vshl.i64    q12, q12, #26
0411     vtrn.32     d17, d3
0412     vadd.i64    q1, q11, q4
0413     vadd.i64    q4, q5, q13
0414     vst1.8      d16, [r2, : 64]!
0415     vshl.i64    q5, q10, #4
0416     vst1.8      d17, [r4, : 64]!
0417     vsub.i64    q8, q14, q12
0418     vshr.s64    q1, q1, #25
0419     vadd.i64    q4, q4, q5
0420     vadd.i64    q5, q6, q1
0421     vshl.i64    q1, q1, #25
0422     vadd.i64    q6, q5, q9
0423     vadd.i64    q4, q4, q10
0424     vshl.i64    q10, q10, #25
0425     vadd.i64    q9, q4, q9
0426     vsub.i64    q1, q11, q1
0427     vshr.s64    q6, q6, #26
0428     vsub.i64    q3, q3, q10
0429     vtrn.32     d16, d2
0430     vshr.s64    q9, q9, #26
0431     vtrn.32     d17, d3
0432     vadd.i64    q1, q2, q6
0433     vst1.8      d16, [r2, : 64]
0434     vshl.i64    q2, q6, #26
0435     vst1.8      d17, [r4, : 64]
0436     vadd.i64    q6, q7, q9
0437     vtrn.32     d0, d6
0438     vshl.i64    q7, q9, #26
0439     vtrn.32     d1, d7
0440     vsub.i64    q2, q5, q2
0441     add     r2, r2, #16
0442     vsub.i64    q3, q4, q7
0443     vst1.8      d0, [r2, : 64]
0444     add     r4, r4, #16
0445     vst1.8      d1, [r4, : 64]
0446     vtrn.32     d4, d2
0447     vtrn.32     d5, d3
0448     sub     r2, r2, #8
0449     sub     r4, r4, #8
0450     vtrn.32     d6, d12
0451     vtrn.32     d7, d13
0452     vst1.8      d4, [r2, : 64]
0453     vst1.8      d5, [r4, : 64]
0454     sub     r2, r2, #24
0455     sub     r4, r4, #24
0456     vst1.8      d6, [r2, : 64]
0457     vst1.8      d7, [r4, : 64]
0458     add     r2, r3, #240
0459     add     r4, r3, #96
0460     vld1.8      {d0-d1}, [r4, : 128]!
0461     vld1.8      {d2-d3}, [r4, : 128]!
0462     vld1.8      {d4}, [r4, : 64]
0463     add     r4, r3, #144
0464     vld1.8      {d6-d7}, [r4, : 128]!
0465     vtrn.32     q0, q3
0466     vld1.8      {d8-d9}, [r4, : 128]!
0467     vshl.i32    q5, q0, #4
0468     vtrn.32     q1, q4
0469     vshl.i32    q6, q3, #4
0470     vadd.i32    q5, q5, q0
0471     vadd.i32    q6, q6, q3
0472     vshl.i32    q7, q1, #4
0473     vld1.8      {d5}, [r4, : 64]
0474     vshl.i32    q8, q4, #4
0475     vtrn.32     d4, d5
0476     vadd.i32    q7, q7, q1
0477     vadd.i32    q8, q8, q4
0478     vld1.8      {d18-d19}, [r2, : 128]!
0479     vshl.i32    q10, q2, #4
0480     vld1.8      {d22-d23}, [r2, : 128]!
0481     vadd.i32    q10, q10, q2
0482     vld1.8      {d24}, [r2, : 64]
0483     vadd.i32    q5, q5, q0
0484     add     r2, r3, #192
0485     vld1.8      {d26-d27}, [r2, : 128]!
0486     vadd.i32    q6, q6, q3
0487     vld1.8      {d28-d29}, [r2, : 128]!
0488     vadd.i32    q8, q8, q4
0489     vld1.8      {d25}, [r2, : 64]
0490     vadd.i32    q10, q10, q2
0491     vtrn.32     q9, q13
0492     vadd.i32    q7, q7, q1
0493     vadd.i32    q5, q5, q0
0494     vtrn.32     q11, q14
0495     vadd.i32    q6, q6, q3
0496     add     r2, sp, #528
0497     vadd.i32    q10, q10, q2
0498     vtrn.32     d24, d25
0499     vst1.8      {d12-d13}, [r2, : 128]!
0500     vshl.i32    q6, q13, #1
0501     vst1.8      {d20-d21}, [r2, : 128]!
0502     vshl.i32    q10, q14, #1
0503     vst1.8      {d12-d13}, [r2, : 128]!
0504     vshl.i32    q15, q12, #1
0505     vadd.i32    q8, q8, q4
0506     vext.32     d10, d31, d30, #0
0507     vadd.i32    q7, q7, q1
0508     vst1.8      {d16-d17}, [r2, : 128]!
0509     vmull.s32   q8, d18, d5
0510     vmlal.s32   q8, d26, d4
0511     vmlal.s32   q8, d19, d9
0512     vmlal.s32   q8, d27, d3
0513     vmlal.s32   q8, d22, d8
0514     vmlal.s32   q8, d28, d2
0515     vmlal.s32   q8, d23, d7
0516     vmlal.s32   q8, d29, d1
0517     vmlal.s32   q8, d24, d6
0518     vmlal.s32   q8, d25, d0
0519     vst1.8      {d14-d15}, [r2, : 128]!
0520     vmull.s32   q2, d18, d4
0521     vmlal.s32   q2, d12, d9
0522     vmlal.s32   q2, d13, d8
0523     vmlal.s32   q2, d19, d3
0524     vmlal.s32   q2, d22, d2
0525     vmlal.s32   q2, d23, d1
0526     vmlal.s32   q2, d24, d0
0527     vst1.8      {d20-d21}, [r2, : 128]!
0528     vmull.s32   q7, d18, d9
0529     vmlal.s32   q7, d26, d3
0530     vmlal.s32   q7, d19, d8
0531     vmlal.s32   q7, d27, d2
0532     vmlal.s32   q7, d22, d7
0533     vmlal.s32   q7, d28, d1
0534     vmlal.s32   q7, d23, d6
0535     vmlal.s32   q7, d29, d0
0536     vst1.8      {d10-d11}, [r2, : 128]!
0537     vmull.s32   q5, d18, d3
0538     vmlal.s32   q5, d19, d2
0539     vmlal.s32   q5, d22, d1
0540     vmlal.s32   q5, d23, d0
0541     vmlal.s32   q5, d12, d8
0542     vst1.8      {d16-d17}, [r2, : 128]
0543     vmull.s32   q4, d18, d8
0544     vmlal.s32   q4, d26, d2
0545     vmlal.s32   q4, d19, d7
0546     vmlal.s32   q4, d27, d1
0547     vmlal.s32   q4, d22, d6
0548     vmlal.s32   q4, d28, d0
0549     vmull.s32   q8, d18, d7
0550     vmlal.s32   q8, d26, d1
0551     vmlal.s32   q8, d19, d6
0552     vmlal.s32   q8, d27, d0
0553     add     r2, sp, #544
0554     vld1.8      {d20-d21}, [r2, : 128]
0555     vmlal.s32   q7, d24, d21
0556     vmlal.s32   q7, d25, d20
0557     vmlal.s32   q4, d23, d21
0558     vmlal.s32   q4, d29, d20
0559     vmlal.s32   q8, d22, d21
0560     vmlal.s32   q8, d28, d20
0561     vmlal.s32   q5, d24, d20
0562     vst1.8      {d14-d15}, [r2, : 128]
0563     vmull.s32   q7, d18, d6
0564     vmlal.s32   q7, d26, d0
0565     add     r2, sp, #624
0566     vld1.8      {d30-d31}, [r2, : 128]
0567     vmlal.s32   q2, d30, d21
0568     vmlal.s32   q7, d19, d21
0569     vmlal.s32   q7, d27, d20
0570     add     r2, sp, #592
0571     vld1.8      {d26-d27}, [r2, : 128]
0572     vmlal.s32   q4, d25, d27
0573     vmlal.s32   q8, d29, d27
0574     vmlal.s32   q8, d25, d26
0575     vmlal.s32   q7, d28, d27
0576     vmlal.s32   q7, d29, d26
0577     add     r2, sp, #576
0578     vld1.8      {d28-d29}, [r2, : 128]
0579     vmlal.s32   q4, d24, d29
0580     vmlal.s32   q8, d23, d29
0581     vmlal.s32   q8, d24, d28
0582     vmlal.s32   q7, d22, d29
0583     vmlal.s32   q7, d23, d28
0584     vst1.8      {d8-d9}, [r2, : 128]
0585     add     r2, sp, #528
0586     vld1.8      {d8-d9}, [r2, : 128]
0587     vmlal.s32   q7, d24, d9
0588     vmlal.s32   q7, d25, d31
0589     vmull.s32   q1, d18, d2
0590     vmlal.s32   q1, d19, d1
0591     vmlal.s32   q1, d22, d0
0592     vmlal.s32   q1, d24, d27
0593     vmlal.s32   q1, d23, d20
0594     vmlal.s32   q1, d12, d7
0595     vmlal.s32   q1, d13, d6
0596     vmull.s32   q6, d18, d1
0597     vmlal.s32   q6, d19, d0
0598     vmlal.s32   q6, d23, d27
0599     vmlal.s32   q6, d22, d20
0600     vmlal.s32   q6, d24, d26
0601     vmull.s32   q0, d18, d0
0602     vmlal.s32   q0, d22, d27
0603     vmlal.s32   q0, d23, d26
0604     vmlal.s32   q0, d24, d31
0605     vmlal.s32   q0, d19, d20
0606     add     r2, sp, #608
0607     vld1.8      {d18-d19}, [r2, : 128]
0608     vmlal.s32   q2, d18, d7
0609     vmlal.s32   q5, d18, d6
0610     vmlal.s32   q1, d18, d21
0611     vmlal.s32   q0, d18, d28
0612     vmlal.s32   q6, d18, d29
0613     vmlal.s32   q2, d19, d6
0614     vmlal.s32   q5, d19, d21
0615     vmlal.s32   q1, d19, d29
0616     vmlal.s32   q0, d19, d9
0617     vmlal.s32   q6, d19, d28
0618     add     r2, sp, #560
0619     vld1.8      {d18-d19}, [r2, : 128]
0620     add     r2, sp, #480
0621     vld1.8      {d22-d23}, [r2, : 128]
0622     vmlal.s32   q5, d19, d7
0623     vmlal.s32   q0, d18, d21
0624     vmlal.s32   q0, d19, d29
0625     vmlal.s32   q6, d18, d6
0626     add     r2, sp, #496
0627     vld1.8      {d6-d7}, [r2, : 128]
0628     vmlal.s32   q6, d19, d21
0629     add     r2, sp, #544
0630     vld1.8      {d18-d19}, [r2, : 128]
0631     vmlal.s32   q0, d30, d8
0632     add     r2, sp, #640
0633     vld1.8      {d20-d21}, [r2, : 128]
0634     vmlal.s32   q5, d30, d29
0635     add     r2, sp, #576
0636     vld1.8      {d24-d25}, [r2, : 128]
0637     vmlal.s32   q1, d30, d28
0638     vadd.i64    q13, q0, q11
0639     vadd.i64    q14, q5, q11
0640     vmlal.s32   q6, d30, d9
0641     vshr.s64    q4, q13, #26
0642     vshr.s64    q13, q14, #26
0643     vadd.i64    q7, q7, q4
0644     vshl.i64    q4, q4, #26
0645     vadd.i64    q14, q7, q3
0646     vadd.i64    q9, q9, q13
0647     vshl.i64    q13, q13, #26
0648     vadd.i64    q15, q9, q3
0649     vsub.i64    q0, q0, q4
0650     vshr.s64    q4, q14, #25
0651     vsub.i64    q5, q5, q13
0652     vshr.s64    q13, q15, #25
0653     vadd.i64    q6, q6, q4
0654     vshl.i64    q4, q4, #25
0655     vadd.i64    q14, q6, q11
0656     vadd.i64    q2, q2, q13
0657     vsub.i64    q4, q7, q4
0658     vshr.s64    q7, q14, #26
0659     vshl.i64    q13, q13, #25
0660     vadd.i64    q14, q2, q11
0661     vadd.i64    q8, q8, q7
0662     vshl.i64    q7, q7, #26
0663     vadd.i64    q15, q8, q3
0664     vsub.i64    q9, q9, q13
0665     vshr.s64    q13, q14, #26
0666     vsub.i64    q6, q6, q7
0667     vshr.s64    q7, q15, #25
0668     vadd.i64    q10, q10, q13
0669     vshl.i64    q13, q13, #26
0670     vadd.i64    q14, q10, q3
0671     vadd.i64    q1, q1, q7
0672     add     r2, r3, #144
0673     vshl.i64    q7, q7, #25
0674     add     r4, r3, #96
0675     vadd.i64    q15, q1, q11
0676     add     r2, r2, #8
0677     vsub.i64    q2, q2, q13
0678     add     r4, r4, #8
0679     vshr.s64    q13, q14, #25
0680     vsub.i64    q7, q8, q7
0681     vshr.s64    q8, q15, #26
0682     vadd.i64    q14, q13, q13
0683     vadd.i64    q12, q12, q8
0684     vtrn.32     d12, d14
0685     vshl.i64    q8, q8, #26
0686     vtrn.32     d13, d15
0687     vadd.i64    q3, q12, q3
0688     vadd.i64    q0, q0, q14
0689     vst1.8      d12, [r2, : 64]!
0690     vshl.i64    q7, q13, #4
0691     vst1.8      d13, [r4, : 64]!
0692     vsub.i64    q1, q1, q8
0693     vshr.s64    q3, q3, #25
0694     vadd.i64    q0, q0, q7
0695     vadd.i64    q5, q5, q3
0696     vshl.i64    q3, q3, #25
0697     vadd.i64    q6, q5, q11
0698     vadd.i64    q0, q0, q13
0699     vshl.i64    q7, q13, #25
0700     vadd.i64    q8, q0, q11
0701     vsub.i64    q3, q12, q3
0702     vshr.s64    q6, q6, #26
0703     vsub.i64    q7, q10, q7
0704     vtrn.32     d2, d6
0705     vshr.s64    q8, q8, #26
0706     vtrn.32     d3, d7
0707     vadd.i64    q3, q9, q6
0708     vst1.8      d2, [r2, : 64]
0709     vshl.i64    q6, q6, #26
0710     vst1.8      d3, [r4, : 64]
0711     vadd.i64    q1, q4, q8
0712     vtrn.32     d4, d14
0713     vshl.i64    q4, q8, #26
0714     vtrn.32     d5, d15
0715     vsub.i64    q5, q5, q6
0716     add     r2, r2, #16
0717     vsub.i64    q0, q0, q4
0718     vst1.8      d4, [r2, : 64]
0719     add     r4, r4, #16
0720     vst1.8      d5, [r4, : 64]
0721     vtrn.32     d10, d6
0722     vtrn.32     d11, d7
0723     sub     r2, r2, #8
0724     sub     r4, r4, #8
0725     vtrn.32     d0, d2
0726     vtrn.32     d1, d3
0727     vst1.8      d10, [r2, : 64]
0728     vst1.8      d11, [r4, : 64]
0729     sub     r2, r2, #24
0730     sub     r4, r4, #24
0731     vst1.8      d0, [r2, : 64]
0732     vst1.8      d1, [r4, : 64]
0733     add     r2, r3, #288
0734     add     r4, r3, #336
0735     vld1.8      {d0-d1}, [r2, : 128]!
0736     vld1.8      {d2-d3}, [r4, : 128]!
0737     vsub.i32    q0, q0, q1
0738     vld1.8      {d2-d3}, [r2, : 128]!
0739     vld1.8      {d4-d5}, [r4, : 128]!
0740     vsub.i32    q1, q1, q2
0741     add     r5, r3, #240
0742     vld1.8      {d4}, [r2, : 64]
0743     vld1.8      {d6}, [r4, : 64]
0744     vsub.i32    q2, q2, q3
0745     vst1.8      {d0-d1}, [r5, : 128]!
0746     vst1.8      {d2-d3}, [r5, : 128]!
0747     vst1.8      d4, [r5, : 64]
0748     add     r2, r3, #144
0749     add     r4, r3, #96
0750     add     r5, r3, #144
0751     add     r6, r3, #192
0752     vld1.8      {d0-d1}, [r2, : 128]!
0753     vld1.8      {d2-d3}, [r4, : 128]!
0754     vsub.i32    q2, q0, q1
0755     vadd.i32    q0, q0, q1
0756     vld1.8      {d2-d3}, [r2, : 128]!
0757     vld1.8      {d6-d7}, [r4, : 128]!
0758     vsub.i32    q4, q1, q3
0759     vadd.i32    q1, q1, q3
0760     vld1.8      {d6}, [r2, : 64]
0761     vld1.8      {d10}, [r4, : 64]
0762     vsub.i32    q6, q3, q5
0763     vadd.i32    q3, q3, q5
0764     vst1.8      {d4-d5}, [r5, : 128]!
0765     vst1.8      {d0-d1}, [r6, : 128]!
0766     vst1.8      {d8-d9}, [r5, : 128]!
0767     vst1.8      {d2-d3}, [r6, : 128]!
0768     vst1.8      d12, [r5, : 64]
0769     vst1.8      d6, [r6, : 64]
0770     add     r2, r3, #0
0771     add     r4, r3, #240
0772     vld1.8      {d0-d1}, [r4, : 128]!
0773     vld1.8      {d2-d3}, [r4, : 128]!
0774     vld1.8      {d4}, [r4, : 64]
0775     add     r4, r3, #336
0776     vld1.8      {d6-d7}, [r4, : 128]!
0777     vtrn.32     q0, q3
0778     vld1.8      {d8-d9}, [r4, : 128]!
0779     vshl.i32    q5, q0, #4
0780     vtrn.32     q1, q4
0781     vshl.i32    q6, q3, #4
0782     vadd.i32    q5, q5, q0
0783     vadd.i32    q6, q6, q3
0784     vshl.i32    q7, q1, #4
0785     vld1.8      {d5}, [r4, : 64]
0786     vshl.i32    q8, q4, #4
0787     vtrn.32     d4, d5
0788     vadd.i32    q7, q7, q1
0789     vadd.i32    q8, q8, q4
0790     vld1.8      {d18-d19}, [r2, : 128]!
0791     vshl.i32    q10, q2, #4
0792     vld1.8      {d22-d23}, [r2, : 128]!
0793     vadd.i32    q10, q10, q2
0794     vld1.8      {d24}, [r2, : 64]
0795     vadd.i32    q5, q5, q0
0796     add     r2, r3, #288
0797     vld1.8      {d26-d27}, [r2, : 128]!
0798     vadd.i32    q6, q6, q3
0799     vld1.8      {d28-d29}, [r2, : 128]!
0800     vadd.i32    q8, q8, q4
0801     vld1.8      {d25}, [r2, : 64]
0802     vadd.i32    q10, q10, q2
0803     vtrn.32     q9, q13
0804     vadd.i32    q7, q7, q1
0805     vadd.i32    q5, q5, q0
0806     vtrn.32     q11, q14
0807     vadd.i32    q6, q6, q3
0808     add     r2, sp, #528
0809     vadd.i32    q10, q10, q2
0810     vtrn.32     d24, d25
0811     vst1.8      {d12-d13}, [r2, : 128]!
0812     vshl.i32    q6, q13, #1
0813     vst1.8      {d20-d21}, [r2, : 128]!
0814     vshl.i32    q10, q14, #1
0815     vst1.8      {d12-d13}, [r2, : 128]!
0816     vshl.i32    q15, q12, #1
0817     vadd.i32    q8, q8, q4
0818     vext.32     d10, d31, d30, #0
0819     vadd.i32    q7, q7, q1
0820     vst1.8      {d16-d17}, [r2, : 128]!
0821     vmull.s32   q8, d18, d5
0822     vmlal.s32   q8, d26, d4
0823     vmlal.s32   q8, d19, d9
0824     vmlal.s32   q8, d27, d3
0825     vmlal.s32   q8, d22, d8
0826     vmlal.s32   q8, d28, d2
0827     vmlal.s32   q8, d23, d7
0828     vmlal.s32   q8, d29, d1
0829     vmlal.s32   q8, d24, d6
0830     vmlal.s32   q8, d25, d0
0831     vst1.8      {d14-d15}, [r2, : 128]!
0832     vmull.s32   q2, d18, d4
0833     vmlal.s32   q2, d12, d9
0834     vmlal.s32   q2, d13, d8
0835     vmlal.s32   q2, d19, d3
0836     vmlal.s32   q2, d22, d2
0837     vmlal.s32   q2, d23, d1
0838     vmlal.s32   q2, d24, d0
0839     vst1.8      {d20-d21}, [r2, : 128]!
0840     vmull.s32   q7, d18, d9
0841     vmlal.s32   q7, d26, d3
0842     vmlal.s32   q7, d19, d8
0843     vmlal.s32   q7, d27, d2
0844     vmlal.s32   q7, d22, d7
0845     vmlal.s32   q7, d28, d1
0846     vmlal.s32   q7, d23, d6
0847     vmlal.s32   q7, d29, d0
0848     vst1.8      {d10-d11}, [r2, : 128]!
0849     vmull.s32   q5, d18, d3
0850     vmlal.s32   q5, d19, d2
0851     vmlal.s32   q5, d22, d1
0852     vmlal.s32   q5, d23, d0
0853     vmlal.s32   q5, d12, d8
0854     vst1.8      {d16-d17}, [r2, : 128]!
0855     vmull.s32   q4, d18, d8
0856     vmlal.s32   q4, d26, d2
0857     vmlal.s32   q4, d19, d7
0858     vmlal.s32   q4, d27, d1
0859     vmlal.s32   q4, d22, d6
0860     vmlal.s32   q4, d28, d0
0861     vmull.s32   q8, d18, d7
0862     vmlal.s32   q8, d26, d1
0863     vmlal.s32   q8, d19, d6
0864     vmlal.s32   q8, d27, d0
0865     add     r2, sp, #544
0866     vld1.8      {d20-d21}, [r2, : 128]
0867     vmlal.s32   q7, d24, d21
0868     vmlal.s32   q7, d25, d20
0869     vmlal.s32   q4, d23, d21
0870     vmlal.s32   q4, d29, d20
0871     vmlal.s32   q8, d22, d21
0872     vmlal.s32   q8, d28, d20
0873     vmlal.s32   q5, d24, d20
0874     vst1.8      {d14-d15}, [r2, : 128]
0875     vmull.s32   q7, d18, d6
0876     vmlal.s32   q7, d26, d0
0877     add     r2, sp, #624
0878     vld1.8      {d30-d31}, [r2, : 128]
0879     vmlal.s32   q2, d30, d21
0880     vmlal.s32   q7, d19, d21
0881     vmlal.s32   q7, d27, d20
0882     add     r2, sp, #592
0883     vld1.8      {d26-d27}, [r2, : 128]
0884     vmlal.s32   q4, d25, d27
0885     vmlal.s32   q8, d29, d27
0886     vmlal.s32   q8, d25, d26
0887     vmlal.s32   q7, d28, d27
0888     vmlal.s32   q7, d29, d26
0889     add     r2, sp, #576
0890     vld1.8      {d28-d29}, [r2, : 128]
0891     vmlal.s32   q4, d24, d29
0892     vmlal.s32   q8, d23, d29
0893     vmlal.s32   q8, d24, d28
0894     vmlal.s32   q7, d22, d29
0895     vmlal.s32   q7, d23, d28
0896     vst1.8      {d8-d9}, [r2, : 128]
0897     add     r2, sp, #528
0898     vld1.8      {d8-d9}, [r2, : 128]
0899     vmlal.s32   q7, d24, d9
0900     vmlal.s32   q7, d25, d31
0901     vmull.s32   q1, d18, d2
0902     vmlal.s32   q1, d19, d1
0903     vmlal.s32   q1, d22, d0
0904     vmlal.s32   q1, d24, d27
0905     vmlal.s32   q1, d23, d20
0906     vmlal.s32   q1, d12, d7
0907     vmlal.s32   q1, d13, d6
0908     vmull.s32   q6, d18, d1
0909     vmlal.s32   q6, d19, d0
0910     vmlal.s32   q6, d23, d27
0911     vmlal.s32   q6, d22, d20
0912     vmlal.s32   q6, d24, d26
0913     vmull.s32   q0, d18, d0
0914     vmlal.s32   q0, d22, d27
0915     vmlal.s32   q0, d23, d26
0916     vmlal.s32   q0, d24, d31
0917     vmlal.s32   q0, d19, d20
0918     add     r2, sp, #608
0919     vld1.8      {d18-d19}, [r2, : 128]
0920     vmlal.s32   q2, d18, d7
0921     vmlal.s32   q5, d18, d6
0922     vmlal.s32   q1, d18, d21
0923     vmlal.s32   q0, d18, d28
0924     vmlal.s32   q6, d18, d29
0925     vmlal.s32   q2, d19, d6
0926     vmlal.s32   q5, d19, d21
0927     vmlal.s32   q1, d19, d29
0928     vmlal.s32   q0, d19, d9
0929     vmlal.s32   q6, d19, d28
0930     add     r2, sp, #560
0931     vld1.8      {d18-d19}, [r2, : 128]
0932     add     r2, sp, #480
0933     vld1.8      {d22-d23}, [r2, : 128]
0934     vmlal.s32   q5, d19, d7
0935     vmlal.s32   q0, d18, d21
0936     vmlal.s32   q0, d19, d29
0937     vmlal.s32   q6, d18, d6
0938     add     r2, sp, #496
0939     vld1.8      {d6-d7}, [r2, : 128]
0940     vmlal.s32   q6, d19, d21
0941     add     r2, sp, #544
0942     vld1.8      {d18-d19}, [r2, : 128]
0943     vmlal.s32   q0, d30, d8
0944     add     r2, sp, #640
0945     vld1.8      {d20-d21}, [r2, : 128]
0946     vmlal.s32   q5, d30, d29
0947     add     r2, sp, #576
0948     vld1.8      {d24-d25}, [r2, : 128]
0949     vmlal.s32   q1, d30, d28
0950     vadd.i64    q13, q0, q11
0951     vadd.i64    q14, q5, q11
0952     vmlal.s32   q6, d30, d9
0953     vshr.s64    q4, q13, #26
0954     vshr.s64    q13, q14, #26
0955     vadd.i64    q7, q7, q4
0956     vshl.i64    q4, q4, #26
0957     vadd.i64    q14, q7, q3
0958     vadd.i64    q9, q9, q13
0959     vshl.i64    q13, q13, #26
0960     vadd.i64    q15, q9, q3
0961     vsub.i64    q0, q0, q4
0962     vshr.s64    q4, q14, #25
0963     vsub.i64    q5, q5, q13
0964     vshr.s64    q13, q15, #25
0965     vadd.i64    q6, q6, q4
0966     vshl.i64    q4, q4, #25
0967     vadd.i64    q14, q6, q11
0968     vadd.i64    q2, q2, q13
0969     vsub.i64    q4, q7, q4
0970     vshr.s64    q7, q14, #26
0971     vshl.i64    q13, q13, #25
0972     vadd.i64    q14, q2, q11
0973     vadd.i64    q8, q8, q7
0974     vshl.i64    q7, q7, #26
0975     vadd.i64    q15, q8, q3
0976     vsub.i64    q9, q9, q13
0977     vshr.s64    q13, q14, #26
0978     vsub.i64    q6, q6, q7
0979     vshr.s64    q7, q15, #25
0980     vadd.i64    q10, q10, q13
0981     vshl.i64    q13, q13, #26
0982     vadd.i64    q14, q10, q3
0983     vadd.i64    q1, q1, q7
0984     add     r2, r3, #288
0985     vshl.i64    q7, q7, #25
0986     add     r4, r3, #96
0987     vadd.i64    q15, q1, q11
0988     add     r2, r2, #8
0989     vsub.i64    q2, q2, q13
0990     add     r4, r4, #8
0991     vshr.s64    q13, q14, #25
0992     vsub.i64    q7, q8, q7
0993     vshr.s64    q8, q15, #26
0994     vadd.i64    q14, q13, q13
0995     vadd.i64    q12, q12, q8
0996     vtrn.32     d12, d14
0997     vshl.i64    q8, q8, #26
0998     vtrn.32     d13, d15
0999     vadd.i64    q3, q12, q3
1000     vadd.i64    q0, q0, q14
1001     vst1.8      d12, [r2, : 64]!
1002     vshl.i64    q7, q13, #4
1003     vst1.8      d13, [r4, : 64]!
1004     vsub.i64    q1, q1, q8
1005     vshr.s64    q3, q3, #25
1006     vadd.i64    q0, q0, q7
1007     vadd.i64    q5, q5, q3
1008     vshl.i64    q3, q3, #25
1009     vadd.i64    q6, q5, q11
1010     vadd.i64    q0, q0, q13
1011     vshl.i64    q7, q13, #25
1012     vadd.i64    q8, q0, q11
1013     vsub.i64    q3, q12, q3
1014     vshr.s64    q6, q6, #26
1015     vsub.i64    q7, q10, q7
1016     vtrn.32     d2, d6
1017     vshr.s64    q8, q8, #26
1018     vtrn.32     d3, d7
1019     vadd.i64    q3, q9, q6
1020     vst1.8      d2, [r2, : 64]
1021     vshl.i64    q6, q6, #26
1022     vst1.8      d3, [r4, : 64]
1023     vadd.i64    q1, q4, q8
1024     vtrn.32     d4, d14
1025     vshl.i64    q4, q8, #26
1026     vtrn.32     d5, d15
1027     vsub.i64    q5, q5, q6
1028     add     r2, r2, #16
1029     vsub.i64    q0, q0, q4
1030     vst1.8      d4, [r2, : 64]
1031     add     r4, r4, #16
1032     vst1.8      d5, [r4, : 64]
1033     vtrn.32     d10, d6
1034     vtrn.32     d11, d7
1035     sub     r2, r2, #8
1036     sub     r4, r4, #8
1037     vtrn.32     d0, d2
1038     vtrn.32     d1, d3
1039     vst1.8      d10, [r2, : 64]
1040     vst1.8      d11, [r4, : 64]
1041     sub     r2, r2, #24
1042     sub     r4, r4, #24
1043     vst1.8      d0, [r2, : 64]
1044     vst1.8      d1, [r4, : 64]
1045     add     r2, sp, #512
1046     add     r4, r3, #144
1047     add     r5, r3, #192
1048     vld1.8      {d0-d1}, [r2, : 128]
1049     vld1.8      {d2-d3}, [r4, : 128]!
1050     vld1.8      {d4-d5}, [r5, : 128]!
1051     vzip.i32    q1, q2
1052     vld1.8      {d6-d7}, [r4, : 128]!
1053     vld1.8      {d8-d9}, [r5, : 128]!
1054     vshl.i32    q5, q1, #1
1055     vzip.i32    q3, q4
1056     vshl.i32    q6, q2, #1
1057     vld1.8      {d14}, [r4, : 64]
1058     vshl.i32    q8, q3, #1
1059     vld1.8      {d15}, [r5, : 64]
1060     vshl.i32    q9, q4, #1
1061     vmul.i32    d21, d7, d1
1062     vtrn.32     d14, d15
1063     vmul.i32    q11, q4, q0
1064     vmul.i32    q0, q7, q0
1065     vmull.s32   q12, d2, d2
1066     vmlal.s32   q12, d11, d1
1067     vmlal.s32   q12, d12, d0
1068     vmlal.s32   q12, d13, d23
1069     vmlal.s32   q12, d16, d22
1070     vmlal.s32   q12, d7, d21
1071     vmull.s32   q10, d2, d11
1072     vmlal.s32   q10, d4, d1
1073     vmlal.s32   q10, d13, d0
1074     vmlal.s32   q10, d6, d23
1075     vmlal.s32   q10, d17, d22
1076     vmull.s32   q13, d10, d4
1077     vmlal.s32   q13, d11, d3
1078     vmlal.s32   q13, d13, d1
1079     vmlal.s32   q13, d16, d0
1080     vmlal.s32   q13, d17, d23
1081     vmlal.s32   q13, d8, d22
1082     vmull.s32   q1, d10, d5
1083     vmlal.s32   q1, d11, d4
1084     vmlal.s32   q1, d6, d1
1085     vmlal.s32   q1, d17, d0
1086     vmlal.s32   q1, d8, d23
1087     vmull.s32   q14, d10, d6
1088     vmlal.s32   q14, d11, d13
1089     vmlal.s32   q14, d4, d4
1090     vmlal.s32   q14, d17, d1
1091     vmlal.s32   q14, d18, d0
1092     vmlal.s32   q14, d9, d23
1093     vmull.s32   q11, d10, d7
1094     vmlal.s32   q11, d11, d6
1095     vmlal.s32   q11, d12, d5
1096     vmlal.s32   q11, d8, d1
1097     vmlal.s32   q11, d19, d0
1098     vmull.s32   q15, d10, d8
1099     vmlal.s32   q15, d11, d17
1100     vmlal.s32   q15, d12, d6
1101     vmlal.s32   q15, d13, d5
1102     vmlal.s32   q15, d19, d1
1103     vmlal.s32   q15, d14, d0
1104     vmull.s32   q2, d10, d9
1105     vmlal.s32   q2, d11, d8
1106     vmlal.s32   q2, d12, d7
1107     vmlal.s32   q2, d13, d6
1108     vmlal.s32   q2, d14, d1
1109     vmull.s32   q0, d15, d1
1110     vmlal.s32   q0, d10, d14
1111     vmlal.s32   q0, d11, d19
1112     vmlal.s32   q0, d12, d8
1113     vmlal.s32   q0, d13, d17
1114     vmlal.s32   q0, d6, d6
1115     add     r2, sp, #480
1116     vld1.8      {d18-d19}, [r2, : 128]!
1117     vmull.s32   q3, d16, d7
1118     vmlal.s32   q3, d10, d15
1119     vmlal.s32   q3, d11, d14
1120     vmlal.s32   q3, d12, d9
1121     vmlal.s32   q3, d13, d8
1122     vld1.8      {d8-d9}, [r2, : 128]
1123     vadd.i64    q5, q12, q9
1124     vadd.i64    q6, q15, q9
1125     vshr.s64    q5, q5, #26
1126     vshr.s64    q6, q6, #26
1127     vadd.i64    q7, q10, q5
1128     vshl.i64    q5, q5, #26
1129     vadd.i64    q8, q7, q4
1130     vadd.i64    q2, q2, q6
1131     vshl.i64    q6, q6, #26
1132     vadd.i64    q10, q2, q4
1133     vsub.i64    q5, q12, q5
1134     vshr.s64    q8, q8, #25
1135     vsub.i64    q6, q15, q6
1136     vshr.s64    q10, q10, #25
1137     vadd.i64    q12, q13, q8
1138     vshl.i64    q8, q8, #25
1139     vadd.i64    q13, q12, q9
1140     vadd.i64    q0, q0, q10
1141     vsub.i64    q7, q7, q8
1142     vshr.s64    q8, q13, #26
1143     vshl.i64    q10, q10, #25
1144     vadd.i64    q13, q0, q9
1145     vadd.i64    q1, q1, q8
1146     vshl.i64    q8, q8, #26
1147     vadd.i64    q15, q1, q4
1148     vsub.i64    q2, q2, q10
1149     vshr.s64    q10, q13, #26
1150     vsub.i64    q8, q12, q8
1151     vshr.s64    q12, q15, #25
1152     vadd.i64    q3, q3, q10
1153     vshl.i64    q10, q10, #26
1154     vadd.i64    q13, q3, q4
1155     vadd.i64    q14, q14, q12
1156     add     r2, r3, #144
1157     vshl.i64    q12, q12, #25
1158     add     r4, r3, #192
1159     vadd.i64    q15, q14, q9
1160     add     r2, r2, #8
1161     vsub.i64    q0, q0, q10
1162     add     r4, r4, #8
1163     vshr.s64    q10, q13, #25
1164     vsub.i64    q1, q1, q12
1165     vshr.s64    q12, q15, #26
1166     vadd.i64    q13, q10, q10
1167     vadd.i64    q11, q11, q12
1168     vtrn.32     d16, d2
1169     vshl.i64    q12, q12, #26
1170     vtrn.32     d17, d3
1171     vadd.i64    q1, q11, q4
1172     vadd.i64    q4, q5, q13
1173     vst1.8      d16, [r2, : 64]!
1174     vshl.i64    q5, q10, #4
1175     vst1.8      d17, [r4, : 64]!
1176     vsub.i64    q8, q14, q12
1177     vshr.s64    q1, q1, #25
1178     vadd.i64    q4, q4, q5
1179     vadd.i64    q5, q6, q1
1180     vshl.i64    q1, q1, #25
1181     vadd.i64    q6, q5, q9
1182     vadd.i64    q4, q4, q10
1183     vshl.i64    q10, q10, #25
1184     vadd.i64    q9, q4, q9
1185     vsub.i64    q1, q11, q1
1186     vshr.s64    q6, q6, #26
1187     vsub.i64    q3, q3, q10
1188     vtrn.32     d16, d2
1189     vshr.s64    q9, q9, #26
1190     vtrn.32     d17, d3
1191     vadd.i64    q1, q2, q6
1192     vst1.8      d16, [r2, : 64]
1193     vshl.i64    q2, q6, #26
1194     vst1.8      d17, [r4, : 64]
1195     vadd.i64    q6, q7, q9
1196     vtrn.32     d0, d6
1197     vshl.i64    q7, q9, #26
1198     vtrn.32     d1, d7
1199     vsub.i64    q2, q5, q2
1200     add     r2, r2, #16
1201     vsub.i64    q3, q4, q7
1202     vst1.8      d0, [r2, : 64]
1203     add     r4, r4, #16
1204     vst1.8      d1, [r4, : 64]
1205     vtrn.32     d4, d2
1206     vtrn.32     d5, d3
1207     sub     r2, r2, #8
1208     sub     r4, r4, #8
1209     vtrn.32     d6, d12
1210     vtrn.32     d7, d13
1211     vst1.8      d4, [r2, : 64]
1212     vst1.8      d5, [r4, : 64]
1213     sub     r2, r2, #24
1214     sub     r4, r4, #24
1215     vst1.8      d6, [r2, : 64]
1216     vst1.8      d7, [r4, : 64]
1217     add     r2, r3, #336
1218     add     r4, r3, #288
1219     vld1.8      {d0-d1}, [r2, : 128]!
1220     vld1.8      {d2-d3}, [r4, : 128]!
1221     vadd.i32    q0, q0, q1
1222     vld1.8      {d2-d3}, [r2, : 128]!
1223     vld1.8      {d4-d5}, [r4, : 128]!
1224     vadd.i32    q1, q1, q2
1225     add     r5, r3, #288
1226     vld1.8      {d4}, [r2, : 64]
1227     vld1.8      {d6}, [r4, : 64]
1228     vadd.i32    q2, q2, q3
1229     vst1.8      {d0-d1}, [r5, : 128]!
1230     vst1.8      {d2-d3}, [r5, : 128]!
1231     vst1.8      d4, [r5, : 64]
1232     add     r2, r3, #48
1233     add     r4, r3, #144
1234     vld1.8      {d0-d1}, [r4, : 128]!
1235     vld1.8      {d2-d3}, [r4, : 128]!
1236     vld1.8      {d4}, [r4, : 64]
1237     add     r4, r3, #288
1238     vld1.8      {d6-d7}, [r4, : 128]!
1239     vtrn.32     q0, q3
1240     vld1.8      {d8-d9}, [r4, : 128]!
1241     vshl.i32    q5, q0, #4
1242     vtrn.32     q1, q4
1243     vshl.i32    q6, q3, #4
1244     vadd.i32    q5, q5, q0
1245     vadd.i32    q6, q6, q3
1246     vshl.i32    q7, q1, #4
1247     vld1.8      {d5}, [r4, : 64]
1248     vshl.i32    q8, q4, #4
1249     vtrn.32     d4, d5
1250     vadd.i32    q7, q7, q1
1251     vadd.i32    q8, q8, q4
1252     vld1.8      {d18-d19}, [r2, : 128]!
1253     vshl.i32    q10, q2, #4
1254     vld1.8      {d22-d23}, [r2, : 128]!
1255     vadd.i32    q10, q10, q2
1256     vld1.8      {d24}, [r2, : 64]
1257     vadd.i32    q5, q5, q0
1258     add     r2, r3, #240
1259     vld1.8      {d26-d27}, [r2, : 128]!
1260     vadd.i32    q6, q6, q3
1261     vld1.8      {d28-d29}, [r2, : 128]!
1262     vadd.i32    q8, q8, q4
1263     vld1.8      {d25}, [r2, : 64]
1264     vadd.i32    q10, q10, q2
1265     vtrn.32     q9, q13
1266     vadd.i32    q7, q7, q1
1267     vadd.i32    q5, q5, q0
1268     vtrn.32     q11, q14
1269     vadd.i32    q6, q6, q3
1270     add     r2, sp, #528
1271     vadd.i32    q10, q10, q2
1272     vtrn.32     d24, d25
1273     vst1.8      {d12-d13}, [r2, : 128]!
1274     vshl.i32    q6, q13, #1
1275     vst1.8      {d20-d21}, [r2, : 128]!
1276     vshl.i32    q10, q14, #1
1277     vst1.8      {d12-d13}, [r2, : 128]!
1278     vshl.i32    q15, q12, #1
1279     vadd.i32    q8, q8, q4
1280     vext.32     d10, d31, d30, #0
1281     vadd.i32    q7, q7, q1
1282     vst1.8      {d16-d17}, [r2, : 128]!
1283     vmull.s32   q8, d18, d5
1284     vmlal.s32   q8, d26, d4
1285     vmlal.s32   q8, d19, d9
1286     vmlal.s32   q8, d27, d3
1287     vmlal.s32   q8, d22, d8
1288     vmlal.s32   q8, d28, d2
1289     vmlal.s32   q8, d23, d7
1290     vmlal.s32   q8, d29, d1
1291     vmlal.s32   q8, d24, d6
1292     vmlal.s32   q8, d25, d0
1293     vst1.8      {d14-d15}, [r2, : 128]!
1294     vmull.s32   q2, d18, d4
1295     vmlal.s32   q2, d12, d9
1296     vmlal.s32   q2, d13, d8
1297     vmlal.s32   q2, d19, d3
1298     vmlal.s32   q2, d22, d2
1299     vmlal.s32   q2, d23, d1
1300     vmlal.s32   q2, d24, d0
1301     vst1.8      {d20-d21}, [r2, : 128]!
1302     vmull.s32   q7, d18, d9
1303     vmlal.s32   q7, d26, d3
1304     vmlal.s32   q7, d19, d8
1305     vmlal.s32   q7, d27, d2
1306     vmlal.s32   q7, d22, d7
1307     vmlal.s32   q7, d28, d1
1308     vmlal.s32   q7, d23, d6
1309     vmlal.s32   q7, d29, d0
1310     vst1.8      {d10-d11}, [r2, : 128]!
1311     vmull.s32   q5, d18, d3
1312     vmlal.s32   q5, d19, d2
1313     vmlal.s32   q5, d22, d1
1314     vmlal.s32   q5, d23, d0
1315     vmlal.s32   q5, d12, d8
1316     vst1.8      {d16-d17}, [r2, : 128]!
1317     vmull.s32   q4, d18, d8
1318     vmlal.s32   q4, d26, d2
1319     vmlal.s32   q4, d19, d7
1320     vmlal.s32   q4, d27, d1
1321     vmlal.s32   q4, d22, d6
1322     vmlal.s32   q4, d28, d0
1323     vmull.s32   q8, d18, d7
1324     vmlal.s32   q8, d26, d1
1325     vmlal.s32   q8, d19, d6
1326     vmlal.s32   q8, d27, d0
1327     add     r2, sp, #544
1328     vld1.8      {d20-d21}, [r2, : 128]
1329     vmlal.s32   q7, d24, d21
1330     vmlal.s32   q7, d25, d20
1331     vmlal.s32   q4, d23, d21
1332     vmlal.s32   q4, d29, d20
1333     vmlal.s32   q8, d22, d21
1334     vmlal.s32   q8, d28, d20
1335     vmlal.s32   q5, d24, d20
1336     vst1.8      {d14-d15}, [r2, : 128]
1337     vmull.s32   q7, d18, d6
1338     vmlal.s32   q7, d26, d0
1339     add     r2, sp, #624
1340     vld1.8      {d30-d31}, [r2, : 128]
1341     vmlal.s32   q2, d30, d21
1342     vmlal.s32   q7, d19, d21
1343     vmlal.s32   q7, d27, d20
1344     add     r2, sp, #592
1345     vld1.8      {d26-d27}, [r2, : 128]
1346     vmlal.s32   q4, d25, d27
1347     vmlal.s32   q8, d29, d27
1348     vmlal.s32   q8, d25, d26
1349     vmlal.s32   q7, d28, d27
1350     vmlal.s32   q7, d29, d26
1351     add     r2, sp, #576
1352     vld1.8      {d28-d29}, [r2, : 128]
1353     vmlal.s32   q4, d24, d29
1354     vmlal.s32   q8, d23, d29
1355     vmlal.s32   q8, d24, d28
1356     vmlal.s32   q7, d22, d29
1357     vmlal.s32   q7, d23, d28
1358     vst1.8      {d8-d9}, [r2, : 128]
1359     add     r2, sp, #528
1360     vld1.8      {d8-d9}, [r2, : 128]
1361     vmlal.s32   q7, d24, d9
1362     vmlal.s32   q7, d25, d31
1363     vmull.s32   q1, d18, d2
1364     vmlal.s32   q1, d19, d1
1365     vmlal.s32   q1, d22, d0
1366     vmlal.s32   q1, d24, d27
1367     vmlal.s32   q1, d23, d20
1368     vmlal.s32   q1, d12, d7
1369     vmlal.s32   q1, d13, d6
1370     vmull.s32   q6, d18, d1
1371     vmlal.s32   q6, d19, d0
1372     vmlal.s32   q6, d23, d27
1373     vmlal.s32   q6, d22, d20
1374     vmlal.s32   q6, d24, d26
1375     vmull.s32   q0, d18, d0
1376     vmlal.s32   q0, d22, d27
1377     vmlal.s32   q0, d23, d26
1378     vmlal.s32   q0, d24, d31
1379     vmlal.s32   q0, d19, d20
1380     add     r2, sp, #608
1381     vld1.8      {d18-d19}, [r2, : 128]
1382     vmlal.s32   q2, d18, d7
1383     vmlal.s32   q5, d18, d6
1384     vmlal.s32   q1, d18, d21
1385     vmlal.s32   q0, d18, d28
1386     vmlal.s32   q6, d18, d29
1387     vmlal.s32   q2, d19, d6
1388     vmlal.s32   q5, d19, d21
1389     vmlal.s32   q1, d19, d29
1390     vmlal.s32   q0, d19, d9
1391     vmlal.s32   q6, d19, d28
1392     add     r2, sp, #560
1393     vld1.8      {d18-d19}, [r2, : 128]
1394     add     r2, sp, #480
1395     vld1.8      {d22-d23}, [r2, : 128]
1396     vmlal.s32   q5, d19, d7
1397     vmlal.s32   q0, d18, d21
1398     vmlal.s32   q0, d19, d29
1399     vmlal.s32   q6, d18, d6
1400     add     r2, sp, #496
1401     vld1.8      {d6-d7}, [r2, : 128]
1402     vmlal.s32   q6, d19, d21
1403     add     r2, sp, #544
1404     vld1.8      {d18-d19}, [r2, : 128]
1405     vmlal.s32   q0, d30, d8
1406     add     r2, sp, #640
1407     vld1.8      {d20-d21}, [r2, : 128]
1408     vmlal.s32   q5, d30, d29
1409     add     r2, sp, #576
1410     vld1.8      {d24-d25}, [r2, : 128]
1411     vmlal.s32   q1, d30, d28
1412     vadd.i64    q13, q0, q11
1413     vadd.i64    q14, q5, q11
1414     vmlal.s32   q6, d30, d9
1415     vshr.s64    q4, q13, #26
1416     vshr.s64    q13, q14, #26
1417     vadd.i64    q7, q7, q4
1418     vshl.i64    q4, q4, #26
1419     vadd.i64    q14, q7, q3
1420     vadd.i64    q9, q9, q13
1421     vshl.i64    q13, q13, #26
1422     vadd.i64    q15, q9, q3
1423     vsub.i64    q0, q0, q4
1424     vshr.s64    q4, q14, #25
1425     vsub.i64    q5, q5, q13
1426     vshr.s64    q13, q15, #25
1427     vadd.i64    q6, q6, q4
1428     vshl.i64    q4, q4, #25
1429     vadd.i64    q14, q6, q11
1430     vadd.i64    q2, q2, q13
1431     vsub.i64    q4, q7, q4
1432     vshr.s64    q7, q14, #26
1433     vshl.i64    q13, q13, #25
1434     vadd.i64    q14, q2, q11
1435     vadd.i64    q8, q8, q7
1436     vshl.i64    q7, q7, #26
1437     vadd.i64    q15, q8, q3
1438     vsub.i64    q9, q9, q13
1439     vshr.s64    q13, q14, #26
1440     vsub.i64    q6, q6, q7
1441     vshr.s64    q7, q15, #25
1442     vadd.i64    q10, q10, q13
1443     vshl.i64    q13, q13, #26
1444     vadd.i64    q14, q10, q3
1445     vadd.i64    q1, q1, q7
1446     add     r2, r3, #240
1447     vshl.i64    q7, q7, #25
1448     add     r4, r3, #144
1449     vadd.i64    q15, q1, q11
1450     add     r2, r2, #8
1451     vsub.i64    q2, q2, q13
1452     add     r4, r4, #8
1453     vshr.s64    q13, q14, #25
1454     vsub.i64    q7, q8, q7
1455     vshr.s64    q8, q15, #26
1456     vadd.i64    q14, q13, q13
1457     vadd.i64    q12, q12, q8
1458     vtrn.32     d12, d14
1459     vshl.i64    q8, q8, #26
1460     vtrn.32     d13, d15
1461     vadd.i64    q3, q12, q3
1462     vadd.i64    q0, q0, q14
1463     vst1.8      d12, [r2, : 64]!
1464     vshl.i64    q7, q13, #4
1465     vst1.8      d13, [r4, : 64]!
1466     vsub.i64    q1, q1, q8
1467     vshr.s64    q3, q3, #25
1468     vadd.i64    q0, q0, q7
1469     vadd.i64    q5, q5, q3
1470     vshl.i64    q3, q3, #25
1471     vadd.i64    q6, q5, q11
1472     vadd.i64    q0, q0, q13
1473     vshl.i64    q7, q13, #25
1474     vadd.i64    q8, q0, q11
1475     vsub.i64    q3, q12, q3
1476     vshr.s64    q6, q6, #26
1477     vsub.i64    q7, q10, q7
1478     vtrn.32     d2, d6
1479     vshr.s64    q8, q8, #26
1480     vtrn.32     d3, d7
1481     vadd.i64    q3, q9, q6
1482     vst1.8      d2, [r2, : 64]
1483     vshl.i64    q6, q6, #26
1484     vst1.8      d3, [r4, : 64]
1485     vadd.i64    q1, q4, q8
1486     vtrn.32     d4, d14
1487     vshl.i64    q4, q8, #26
1488     vtrn.32     d5, d15
1489     vsub.i64    q5, q5, q6
1490     add     r2, r2, #16
1491     vsub.i64    q0, q0, q4
1492     vst1.8      d4, [r2, : 64]
1493     add     r4, r4, #16
1494     vst1.8      d5, [r4, : 64]
1495     vtrn.32     d10, d6
1496     vtrn.32     d11, d7
1497     sub     r2, r2, #8
1498     sub     r4, r4, #8
1499     vtrn.32     d0, d2
1500     vtrn.32     d1, d3
1501     vst1.8      d10, [r2, : 64]
1502     vst1.8      d11, [r4, : 64]
1503     sub     r2, r2, #24
1504     sub     r4, r4, #24
1505     vst1.8      d0, [r2, : 64]
1506     vst1.8      d1, [r4, : 64]
1507     ldr     r2, [sp, #456]
1508     ldr     r4, [sp, #460]
1509     subs        r5, r2, #1
1510     bge     .Lmainloop
1511     add     r1, r3, #144
1512     add     r2, r3, #336
1513     vld1.8      {d0-d1}, [r1, : 128]!
1514     vld1.8      {d2-d3}, [r1, : 128]!
1515     vld1.8      {d4}, [r1, : 64]
1516     vst1.8      {d0-d1}, [r2, : 128]!
1517     vst1.8      {d2-d3}, [r2, : 128]!
1518     vst1.8      d4, [r2, : 64]
1519     movw        r1, #0
1520 .Linvertloop:
1521     add     r2, r3, #144
1522     movw        r4, #0
1523     movw        r5, #2
1524     cmp     r1, #1
1525     moveq       r5, #1
1526     addeq       r2, r3, #336
1527     addeq       r4, r3, #48
1528     cmp     r1, #2
1529     moveq       r5, #1
1530     addeq       r2, r3, #48
1531     cmp     r1, #3
1532     moveq       r5, #5
1533     addeq       r4, r3, #336
1534     cmp     r1, #4
1535     moveq       r5, #10
1536     cmp     r1, #5
1537     moveq       r5, #20
1538     cmp     r1, #6
1539     moveq       r5, #10
1540     addeq       r2, r3, #336
1541     addeq       r4, r3, #336
1542     cmp     r1, #7
1543     moveq       r5, #50
1544     cmp     r1, #8
1545     moveq       r5, #100
1546     cmp     r1, #9
1547     moveq       r5, #50
1548     addeq       r2, r3, #336
1549     cmp     r1, #10
1550     moveq       r5, #5
1551     addeq       r2, r3, #48
1552     cmp     r1, #11
1553     moveq       r5, #0
1554     addeq       r2, r3, #96
1555     add     r6, r3, #144
1556     add     r7, r3, #288
1557     vld1.8      {d0-d1}, [r6, : 128]!
1558     vld1.8      {d2-d3}, [r6, : 128]!
1559     vld1.8      {d4}, [r6, : 64]
1560     vst1.8      {d0-d1}, [r7, : 128]!
1561     vst1.8      {d2-d3}, [r7, : 128]!
1562     vst1.8      d4, [r7, : 64]
1563     cmp     r5, #0
1564     beq     .Lskipsquaringloop
1565 .Lsquaringloop:
1566     add     r6, r3, #288
1567     add     r7, r3, #288
1568     add     r8, r3, #288
1569     vmov.i32    q0, #19
1570     vmov.i32    q1, #0
1571     vmov.i32    q2, #1
1572     vzip.i32    q1, q2
1573     vld1.8      {d4-d5}, [r7, : 128]!
1574     vld1.8      {d6-d7}, [r7, : 128]!
1575     vld1.8      {d9}, [r7, : 64]
1576     vld1.8      {d10-d11}, [r6, : 128]!
1577     add     r7, sp, #384
1578     vld1.8      {d12-d13}, [r6, : 128]!
1579     vmul.i32    q7, q2, q0
1580     vld1.8      {d8}, [r6, : 64]
1581     vext.32     d17, d11, d10, #1
1582     vmul.i32    q9, q3, q0
1583     vext.32     d16, d10, d8, #1
1584     vshl.u32    q10, q5, q1
1585     vext.32     d22, d14, d4, #1
1586     vext.32     d24, d18, d6, #1
1587     vshl.u32    q13, q6, q1
1588     vshl.u32    d28, d8, d2
1589     vrev64.i32  d22, d22
1590     vmul.i32    d1, d9, d1
1591     vrev64.i32  d24, d24
1592     vext.32     d29, d8, d13, #1
1593     vext.32     d0, d1, d9, #1
1594     vrev64.i32  d0, d0
1595     vext.32     d2, d9, d1, #1
1596     vext.32     d23, d15, d5, #1
1597     vmull.s32   q4, d20, d4
1598     vrev64.i32  d23, d23
1599     vmlal.s32   q4, d21, d1
1600     vrev64.i32  d2, d2
1601     vmlal.s32   q4, d26, d19
1602     vext.32     d3, d5, d15, #1
1603     vmlal.s32   q4, d27, d18
1604     vrev64.i32  d3, d3
1605     vmlal.s32   q4, d28, d15
1606     vext.32     d14, d12, d11, #1
1607     vmull.s32   q5, d16, d23
1608     vext.32     d15, d13, d12, #1
1609     vmlal.s32   q5, d17, d4
1610     vst1.8      d8, [r7, : 64]!
1611     vmlal.s32   q5, d14, d1
1612     vext.32     d12, d9, d8, #0
1613     vmlal.s32   q5, d15, d19
1614     vmov.i64    d13, #0
1615     vmlal.s32   q5, d29, d18
1616     vext.32     d25, d19, d7, #1
1617     vmlal.s32   q6, d20, d5
1618     vrev64.i32  d25, d25
1619     vmlal.s32   q6, d21, d4
1620     vst1.8      d11, [r7, : 64]!
1621     vmlal.s32   q6, d26, d1
1622     vext.32     d9, d10, d10, #0
1623     vmlal.s32   q6, d27, d19
1624     vmov.i64    d8, #0
1625     vmlal.s32   q6, d28, d18
1626     vmlal.s32   q4, d16, d24
1627     vmlal.s32   q4, d17, d5
1628     vmlal.s32   q4, d14, d4
1629     vst1.8      d12, [r7, : 64]!
1630     vmlal.s32   q4, d15, d1
1631     vext.32     d10, d13, d12, #0
1632     vmlal.s32   q4, d29, d19
1633     vmov.i64    d11, #0
1634     vmlal.s32   q5, d20, d6
1635     vmlal.s32   q5, d21, d5
1636     vmlal.s32   q5, d26, d4
1637     vext.32     d13, d8, d8, #0
1638     vmlal.s32   q5, d27, d1
1639     vmov.i64    d12, #0
1640     vmlal.s32   q5, d28, d19
1641     vst1.8      d9, [r7, : 64]!
1642     vmlal.s32   q6, d16, d25
1643     vmlal.s32   q6, d17, d6
1644     vst1.8      d10, [r7, : 64]
1645     vmlal.s32   q6, d14, d5
1646     vext.32     d8, d11, d10, #0
1647     vmlal.s32   q6, d15, d4
1648     vmov.i64    d9, #0
1649     vmlal.s32   q6, d29, d1
1650     vmlal.s32   q4, d20, d7
1651     vmlal.s32   q4, d21, d6
1652     vmlal.s32   q4, d26, d5
1653     vext.32     d11, d12, d12, #0
1654     vmlal.s32   q4, d27, d4
1655     vmov.i64    d10, #0
1656     vmlal.s32   q4, d28, d1
1657     vmlal.s32   q5, d16, d0
1658     sub     r6, r7, #32
1659     vmlal.s32   q5, d17, d7
1660     vmlal.s32   q5, d14, d6
1661     vext.32     d30, d9, d8, #0
1662     vmlal.s32   q5, d15, d5
1663     vld1.8      {d31}, [r6, : 64]!
1664     vmlal.s32   q5, d29, d4
1665     vmlal.s32   q15, d20, d0
1666     vext.32     d0, d6, d18, #1
1667     vmlal.s32   q15, d21, d25
1668     vrev64.i32  d0, d0
1669     vmlal.s32   q15, d26, d24
1670     vext.32     d1, d7, d19, #1
1671     vext.32     d7, d10, d10, #0
1672     vmlal.s32   q15, d27, d23
1673     vrev64.i32  d1, d1
1674     vld1.8      {d6}, [r6, : 64]
1675     vmlal.s32   q15, d28, d22
1676     vmlal.s32   q3, d16, d4
1677     add     r6, r6, #24
1678     vmlal.s32   q3, d17, d2
1679     vext.32     d4, d31, d30, #0
1680     vmov        d17, d11
1681     vmlal.s32   q3, d14, d1
1682     vext.32     d11, d13, d13, #0
1683     vext.32     d13, d30, d30, #0
1684     vmlal.s32   q3, d15, d0
1685     vext.32     d1, d8, d8, #0
1686     vmlal.s32   q3, d29, d3
1687     vld1.8      {d5}, [r6, : 64]
1688     sub     r6, r6, #16
1689     vext.32     d10, d6, d6, #0
1690     vmov.i32    q1, #0xffffffff
1691     vshl.i64    q4, q1, #25
1692     add     r7, sp, #480
1693     vld1.8      {d14-d15}, [r7, : 128]
1694     vadd.i64    q9, q2, q7
1695     vshl.i64    q1, q1, #26
1696     vshr.s64    q10, q9, #26
1697     vld1.8      {d0}, [r6, : 64]!
1698     vadd.i64    q5, q5, q10
1699     vand        q9, q9, q1
1700     vld1.8      {d16}, [r6, : 64]!
1701     add     r6, sp, #496
1702     vld1.8      {d20-d21}, [r6, : 128]
1703     vadd.i64    q11, q5, q10
1704     vsub.i64    q2, q2, q9
1705     vshr.s64    q9, q11, #25
1706     vext.32     d12, d5, d4, #0
1707     vand        q11, q11, q4
1708     vadd.i64    q0, q0, q9
1709     vmov        d19, d7
1710     vadd.i64    q3, q0, q7
1711     vsub.i64    q5, q5, q11
1712     vshr.s64    q11, q3, #26
1713     vext.32     d18, d11, d10, #0
1714     vand        q3, q3, q1
1715     vadd.i64    q8, q8, q11
1716     vadd.i64    q11, q8, q10
1717     vsub.i64    q0, q0, q3
1718     vshr.s64    q3, q11, #25
1719     vand        q11, q11, q4
1720     vadd.i64    q3, q6, q3
1721     vadd.i64    q6, q3, q7
1722     vsub.i64    q8, q8, q11
1723     vshr.s64    q11, q6, #26
1724     vand        q6, q6, q1
1725     vadd.i64    q9, q9, q11
1726     vadd.i64    d25, d19, d21
1727     vsub.i64    q3, q3, q6
1728     vshr.s64    d23, d25, #25
1729     vand        q4, q12, q4
1730     vadd.i64    d21, d23, d23
1731     vshl.i64    d25, d23, #4
1732     vadd.i64    d21, d21, d23
1733     vadd.i64    d25, d25, d21
1734     vadd.i64    d4, d4, d25
1735     vzip.i32    q0, q8
1736     vadd.i64    d12, d4, d14
1737     add     r6, r8, #8
1738     vst1.8      d0, [r6, : 64]
1739     vsub.i64    d19, d19, d9
1740     add     r6, r6, #16
1741     vst1.8      d16, [r6, : 64]
1742     vshr.s64    d22, d12, #26
1743     vand        q0, q6, q1
1744     vadd.i64    d10, d10, d22
1745     vzip.i32    q3, q9
1746     vsub.i64    d4, d4, d0
1747     sub     r6, r6, #8
1748     vst1.8      d6, [r6, : 64]
1749     add     r6, r6, #16
1750     vst1.8      d18, [r6, : 64]
1751     vzip.i32    q2, q5
1752     sub     r6, r6, #32
1753     vst1.8      d4, [r6, : 64]
1754     subs        r5, r5, #1
1755     bhi     .Lsquaringloop
1756 .Lskipsquaringloop:
1757     mov     r2, r2
1758     add     r5, r3, #288
1759     add     r6, r3, #144
1760     vmov.i32    q0, #19
1761     vmov.i32    q1, #0
1762     vmov.i32    q2, #1
1763     vzip.i32    q1, q2
1764     vld1.8      {d4-d5}, [r5, : 128]!
1765     vld1.8      {d6-d7}, [r5, : 128]!
1766     vld1.8      {d9}, [r5, : 64]
1767     vld1.8      {d10-d11}, [r2, : 128]!
1768     add     r5, sp, #384
1769     vld1.8      {d12-d13}, [r2, : 128]!
1770     vmul.i32    q7, q2, q0
1771     vld1.8      {d8}, [r2, : 64]
1772     vext.32     d17, d11, d10, #1
1773     vmul.i32    q9, q3, q0
1774     vext.32     d16, d10, d8, #1
1775     vshl.u32    q10, q5, q1
1776     vext.32     d22, d14, d4, #1
1777     vext.32     d24, d18, d6, #1
1778     vshl.u32    q13, q6, q1
1779     vshl.u32    d28, d8, d2
1780     vrev64.i32  d22, d22
1781     vmul.i32    d1, d9, d1
1782     vrev64.i32  d24, d24
1783     vext.32     d29, d8, d13, #1
1784     vext.32     d0, d1, d9, #1
1785     vrev64.i32  d0, d0
1786     vext.32     d2, d9, d1, #1
1787     vext.32     d23, d15, d5, #1
1788     vmull.s32   q4, d20, d4
1789     vrev64.i32  d23, d23
1790     vmlal.s32   q4, d21, d1
1791     vrev64.i32  d2, d2
1792     vmlal.s32   q4, d26, d19
1793     vext.32     d3, d5, d15, #1
1794     vmlal.s32   q4, d27, d18
1795     vrev64.i32  d3, d3
1796     vmlal.s32   q4, d28, d15
1797     vext.32     d14, d12, d11, #1
1798     vmull.s32   q5, d16, d23
1799     vext.32     d15, d13, d12, #1
1800     vmlal.s32   q5, d17, d4
1801     vst1.8      d8, [r5, : 64]!
1802     vmlal.s32   q5, d14, d1
1803     vext.32     d12, d9, d8, #0
1804     vmlal.s32   q5, d15, d19
1805     vmov.i64    d13, #0
1806     vmlal.s32   q5, d29, d18
1807     vext.32     d25, d19, d7, #1
1808     vmlal.s32   q6, d20, d5
1809     vrev64.i32  d25, d25
1810     vmlal.s32   q6, d21, d4
1811     vst1.8      d11, [r5, : 64]!
1812     vmlal.s32   q6, d26, d1
1813     vext.32     d9, d10, d10, #0
1814     vmlal.s32   q6, d27, d19
1815     vmov.i64    d8, #0
1816     vmlal.s32   q6, d28, d18
1817     vmlal.s32   q4, d16, d24
1818     vmlal.s32   q4, d17, d5
1819     vmlal.s32   q4, d14, d4
1820     vst1.8      d12, [r5, : 64]!
1821     vmlal.s32   q4, d15, d1
1822     vext.32     d10, d13, d12, #0
1823     vmlal.s32   q4, d29, d19
1824     vmov.i64    d11, #0
1825     vmlal.s32   q5, d20, d6
1826     vmlal.s32   q5, d21, d5
1827     vmlal.s32   q5, d26, d4
1828     vext.32     d13, d8, d8, #0
1829     vmlal.s32   q5, d27, d1
1830     vmov.i64    d12, #0
1831     vmlal.s32   q5, d28, d19
1832     vst1.8      d9, [r5, : 64]!
1833     vmlal.s32   q6, d16, d25
1834     vmlal.s32   q6, d17, d6
1835     vst1.8      d10, [r5, : 64]
1836     vmlal.s32   q6, d14, d5
1837     vext.32     d8, d11, d10, #0
1838     vmlal.s32   q6, d15, d4
1839     vmov.i64    d9, #0
1840     vmlal.s32   q6, d29, d1
1841     vmlal.s32   q4, d20, d7
1842     vmlal.s32   q4, d21, d6
1843     vmlal.s32   q4, d26, d5
1844     vext.32     d11, d12, d12, #0
1845     vmlal.s32   q4, d27, d4
1846     vmov.i64    d10, #0
1847     vmlal.s32   q4, d28, d1
1848     vmlal.s32   q5, d16, d0
1849     sub     r2, r5, #32
1850     vmlal.s32   q5, d17, d7
1851     vmlal.s32   q5, d14, d6
1852     vext.32     d30, d9, d8, #0
1853     vmlal.s32   q5, d15, d5
1854     vld1.8      {d31}, [r2, : 64]!
1855     vmlal.s32   q5, d29, d4
1856     vmlal.s32   q15, d20, d0
1857     vext.32     d0, d6, d18, #1
1858     vmlal.s32   q15, d21, d25
1859     vrev64.i32  d0, d0
1860     vmlal.s32   q15, d26, d24
1861     vext.32     d1, d7, d19, #1
1862     vext.32     d7, d10, d10, #0
1863     vmlal.s32   q15, d27, d23
1864     vrev64.i32  d1, d1
1865     vld1.8      {d6}, [r2, : 64]
1866     vmlal.s32   q15, d28, d22
1867     vmlal.s32   q3, d16, d4
1868     add     r2, r2, #24
1869     vmlal.s32   q3, d17, d2
1870     vext.32     d4, d31, d30, #0
1871     vmov        d17, d11
1872     vmlal.s32   q3, d14, d1
1873     vext.32     d11, d13, d13, #0
1874     vext.32     d13, d30, d30, #0
1875     vmlal.s32   q3, d15, d0
1876     vext.32     d1, d8, d8, #0
1877     vmlal.s32   q3, d29, d3
1878     vld1.8      {d5}, [r2, : 64]
1879     sub     r2, r2, #16
1880     vext.32     d10, d6, d6, #0
1881     vmov.i32    q1, #0xffffffff
1882     vshl.i64    q4, q1, #25
1883     add     r5, sp, #480
1884     vld1.8      {d14-d15}, [r5, : 128]
1885     vadd.i64    q9, q2, q7
1886     vshl.i64    q1, q1, #26
1887     vshr.s64    q10, q9, #26
1888     vld1.8      {d0}, [r2, : 64]!
1889     vadd.i64    q5, q5, q10
1890     vand        q9, q9, q1
1891     vld1.8      {d16}, [r2, : 64]!
1892     add     r2, sp, #496
1893     vld1.8      {d20-d21}, [r2, : 128]
1894     vadd.i64    q11, q5, q10
1895     vsub.i64    q2, q2, q9
1896     vshr.s64    q9, q11, #25
1897     vext.32     d12, d5, d4, #0
1898     vand        q11, q11, q4
1899     vadd.i64    q0, q0, q9
1900     vmov        d19, d7
1901     vadd.i64    q3, q0, q7
1902     vsub.i64    q5, q5, q11
1903     vshr.s64    q11, q3, #26
1904     vext.32     d18, d11, d10, #0
1905     vand        q3, q3, q1
1906     vadd.i64    q8, q8, q11
1907     vadd.i64    q11, q8, q10
1908     vsub.i64    q0, q0, q3
1909     vshr.s64    q3, q11, #25
1910     vand        q11, q11, q4
1911     vadd.i64    q3, q6, q3
1912     vadd.i64    q6, q3, q7
1913     vsub.i64    q8, q8, q11
1914     vshr.s64    q11, q6, #26
1915     vand        q6, q6, q1
1916     vadd.i64    q9, q9, q11
1917     vadd.i64    d25, d19, d21
1918     vsub.i64    q3, q3, q6
1919     vshr.s64    d23, d25, #25
1920     vand        q4, q12, q4
1921     vadd.i64    d21, d23, d23
1922     vshl.i64    d25, d23, #4
1923     vadd.i64    d21, d21, d23
1924     vadd.i64    d25, d25, d21
1925     vadd.i64    d4, d4, d25
1926     vzip.i32    q0, q8
1927     vadd.i64    d12, d4, d14
1928     add     r2, r6, #8
1929     vst1.8      d0, [r2, : 64]
1930     vsub.i64    d19, d19, d9
1931     add     r2, r2, #16
1932     vst1.8      d16, [r2, : 64]
1933     vshr.s64    d22, d12, #26
1934     vand        q0, q6, q1
1935     vadd.i64    d10, d10, d22
1936     vzip.i32    q3, q9
1937     vsub.i64    d4, d4, d0
1938     sub     r2, r2, #8
1939     vst1.8      d6, [r2, : 64]
1940     add     r2, r2, #16
1941     vst1.8      d18, [r2, : 64]
1942     vzip.i32    q2, q5
1943     sub     r2, r2, #32
1944     vst1.8      d4, [r2, : 64]
1945     cmp     r4, #0
1946     beq     .Lskippostcopy
1947     add     r2, r3, #144
1948     mov     r4, r4
1949     vld1.8      {d0-d1}, [r2, : 128]!
1950     vld1.8      {d2-d3}, [r2, : 128]!
1951     vld1.8      {d4}, [r2, : 64]
1952     vst1.8      {d0-d1}, [r4, : 128]!
1953     vst1.8      {d2-d3}, [r4, : 128]!
1954     vst1.8      d4, [r4, : 64]
1955 .Lskippostcopy:
1956     cmp     r1, #1
1957     bne     .Lskipfinalcopy
1958     add     r2, r3, #288
1959     add     r4, r3, #144
1960     vld1.8      {d0-d1}, [r2, : 128]!
1961     vld1.8      {d2-d3}, [r2, : 128]!
1962     vld1.8      {d4}, [r2, : 64]
1963     vst1.8      {d0-d1}, [r4, : 128]!
1964     vst1.8      {d2-d3}, [r4, : 128]!
1965     vst1.8      d4, [r4, : 64]
1966 .Lskipfinalcopy:
1967     add     r1, r1, #1
1968     cmp     r1, #12
1969     blo     .Linvertloop
1970     add     r1, r3, #144
1971     ldr     r2, [r1], #4
1972     ldr     r3, [r1], #4
1973     ldr     r4, [r1], #4
1974     ldr     r5, [r1], #4
1975     ldr     r6, [r1], #4
1976     ldr     r7, [r1], #4
1977     ldr     r8, [r1], #4
1978     ldr     r9, [r1], #4
1979     ldr     r10, [r1], #4
1980     ldr     r1, [r1]
1981     add     r11, r1, r1, LSL #4
1982     add     r11, r11, r1, LSL #1
1983     add     r11, r11, #16777216
1984     mov     r11, r11, ASR #25
1985     add     r11, r11, r2
1986     mov     r11, r11, ASR #26
1987     add     r11, r11, r3
1988     mov     r11, r11, ASR #25
1989     add     r11, r11, r4
1990     mov     r11, r11, ASR #26
1991     add     r11, r11, r5
1992     mov     r11, r11, ASR #25
1993     add     r11, r11, r6
1994     mov     r11, r11, ASR #26
1995     add     r11, r11, r7
1996     mov     r11, r11, ASR #25
1997     add     r11, r11, r8
1998     mov     r11, r11, ASR #26
1999     add     r11, r11, r9
2000     mov     r11, r11, ASR #25
2001     add     r11, r11, r10
2002     mov     r11, r11, ASR #26
2003     add     r11, r11, r1
2004     mov     r11, r11, ASR #25
2005     add     r2, r2, r11
2006     add     r2, r2, r11, LSL #1
2007     add     r2, r2, r11, LSL #4
2008     mov     r11, r2, ASR #26
2009     add     r3, r3, r11
2010     sub     r2, r2, r11, LSL #26
2011     mov     r11, r3, ASR #25
2012     add     r4, r4, r11
2013     sub     r3, r3, r11, LSL #25
2014     mov     r11, r4, ASR #26
2015     add     r5, r5, r11
2016     sub     r4, r4, r11, LSL #26
2017     mov     r11, r5, ASR #25
2018     add     r6, r6, r11
2019     sub     r5, r5, r11, LSL #25
2020     mov     r11, r6, ASR #26
2021     add     r7, r7, r11
2022     sub     r6, r6, r11, LSL #26
2023     mov     r11, r7, ASR #25
2024     add     r8, r8, r11
2025     sub     r7, r7, r11, LSL #25
2026     mov     r11, r8, ASR #26
2027     add     r9, r9, r11
2028     sub     r8, r8, r11, LSL #26
2029     mov     r11, r9, ASR #25
2030     add     r10, r10, r11
2031     sub     r9, r9, r11, LSL #25
2032     mov     r11, r10, ASR #26
2033     add     r1, r1, r11
2034     sub     r10, r10, r11, LSL #26
2035     mov     r11, r1, ASR #25
2036     sub     r1, r1, r11, LSL #25
2037     add     r2, r2, r3, LSL #26
2038     mov     r3, r3, LSR #6
2039     add     r3, r3, r4, LSL #19
2040     mov     r4, r4, LSR #13
2041     add     r4, r4, r5, LSL #13
2042     mov     r5, r5, LSR #19
2043     add     r5, r5, r6, LSL #6
2044     add     r6, r7, r8, LSL #25
2045     mov     r7, r8, LSR #7
2046     add     r7, r7, r9, LSL #19
2047     mov     r8, r9, LSR #13
2048     add     r8, r8, r10, LSL #12
2049     mov     r9, r10, LSR #20
2050     add     r1, r9, r1, LSL #6
2051     str     r2, [r0]
2052     str     r3, [r0, #4]
2053     str     r4, [r0, #8]
2054     str     r5, [r0, #12]
2055     str     r6, [r0, #16]
2056     str     r7, [r0, #20]
2057     str     r8, [r0, #24]
2058     str     r1, [r0, #28]
2059     movw        r0, #0
2060     mov     sp, ip
2061     pop     {r4-r11, pc}
2062 ENDPROC(curve25519_neon)