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