1 ; 2 ; Copyright (c) 2014 The WebM project authors. All Rights Reserved. 3 ; 4 ; Use of this source code is governed by a BSD-style license 5 ; that can be found in the LICENSE file in the root of the source 6 ; tree. An additional intellectual property rights grant can be found 7 ; in the file PATENTS. All contributing project authors may 8 ; be found in the AUTHORS file in the root of the source tree. 9 ; 10 11 EXPORT |vpx_v_predictor_4x4_neon| 12 EXPORT |vpx_v_predictor_8x8_neon| 13 EXPORT |vpx_v_predictor_16x16_neon| 14 EXPORT |vpx_v_predictor_32x32_neon| 15 EXPORT |vpx_h_predictor_4x4_neon| 16 EXPORT |vpx_h_predictor_8x8_neon| 17 EXPORT |vpx_h_predictor_16x16_neon| 18 EXPORT |vpx_h_predictor_32x32_neon| 19 EXPORT |vpx_tm_predictor_4x4_neon| 20 EXPORT |vpx_tm_predictor_8x8_neon| 21 EXPORT |vpx_tm_predictor_16x16_neon| 22 EXPORT |vpx_tm_predictor_32x32_neon| 23 ARM 24 REQUIRE8 25 PRESERVE8 26 27 AREA ||.text||, CODE, READONLY, ALIGN=2 28 29 ;void vpx_v_predictor_4x4_neon(uint8_t *dst, ptrdiff_t y_stride, 30 ; const uint8_t *above, 31 ; const uint8_t *left) 32 ; r0 uint8_t *dst 33 ; r1 ptrdiff_t y_stride 34 ; r2 const uint8_t *above 35 ; r3 const uint8_t *left 36 37 |vpx_v_predictor_4x4_neon| PROC 38 vld1.32 {d0[0]}, [r2] 39 vst1.32 {d0[0]}, [r0], r1 40 vst1.32 {d0[0]}, [r0], r1 41 vst1.32 {d0[0]}, [r0], r1 42 vst1.32 {d0[0]}, [r0], r1 43 bx lr 44 ENDP ; |vpx_v_predictor_4x4_neon| 45 46 ;void vpx_v_predictor_8x8_neon(uint8_t *dst, ptrdiff_t y_stride, 47 ; const uint8_t *above, 48 ; const uint8_t *left) 49 ; r0 uint8_t *dst 50 ; r1 ptrdiff_t y_stride 51 ; r2 const uint8_t *above 52 ; r3 const uint8_t *left 53 54 |vpx_v_predictor_8x8_neon| PROC 55 vld1.8 {d0}, [r2] 56 vst1.8 {d0}, [r0], r1 57 vst1.8 {d0}, [r0], r1 58 vst1.8 {d0}, [r0], r1 59 vst1.8 {d0}, [r0], r1 60 vst1.8 {d0}, [r0], r1 61 vst1.8 {d0}, [r0], r1 62 vst1.8 {d0}, [r0], r1 63 vst1.8 {d0}, [r0], r1 64 bx lr 65 ENDP ; |vpx_v_predictor_8x8_neon| 66 67 ;void vpx_v_predictor_16x16_neon(uint8_t *dst, ptrdiff_t y_stride, 68 ; const uint8_t *above, 69 ; const uint8_t *left) 70 ; r0 uint8_t *dst 71 ; r1 ptrdiff_t y_stride 72 ; r2 const uint8_t *above 73 ; r3 const uint8_t *left 74 75 |vpx_v_predictor_16x16_neon| PROC 76 vld1.8 {q0}, [r2] 77 vst1.8 {q0}, [r0], r1 78 vst1.8 {q0}, [r0], r1 79 vst1.8 {q0}, [r0], r1 80 vst1.8 {q0}, [r0], r1 81 vst1.8 {q0}, [r0], r1 82 vst1.8 {q0}, [r0], r1 83 vst1.8 {q0}, [r0], r1 84 vst1.8 {q0}, [r0], r1 85 vst1.8 {q0}, [r0], r1 86 vst1.8 {q0}, [r0], r1 87 vst1.8 {q0}, [r0], r1 88 vst1.8 {q0}, [r0], r1 89 vst1.8 {q0}, [r0], r1 90 vst1.8 {q0}, [r0], r1 91 vst1.8 {q0}, [r0], r1 92 vst1.8 {q0}, [r0], r1 93 bx lr 94 ENDP ; |vpx_v_predictor_16x16_neon| 95 96 ;void vpx_v_predictor_32x32_neon(uint8_t *dst, ptrdiff_t y_stride, 97 ; const uint8_t *above, 98 ; const uint8_t *left) 99 ; r0 uint8_t *dst 100 ; r1 ptrdiff_t y_stride 101 ; r2 const uint8_t *above 102 ; r3 const uint8_t *left 103 104 |vpx_v_predictor_32x32_neon| PROC 105 vld1.8 {q0, q1}, [r2] 106 mov r2, #2 107 loop_v 108 vst1.8 {q0, q1}, [r0], r1 109 vst1.8 {q0, q1}, [r0], r1 110 vst1.8 {q0, q1}, [r0], r1 111 vst1.8 {q0, q1}, [r0], r1 112 vst1.8 {q0, q1}, [r0], r1 113 vst1.8 {q0, q1}, [r0], r1 114 vst1.8 {q0, q1}, [r0], r1 115 vst1.8 {q0, q1}, [r0], r1 116 vst1.8 {q0, q1}, [r0], r1 117 vst1.8 {q0, q1}, [r0], r1 118 vst1.8 {q0, q1}, [r0], r1 119 vst1.8 {q0, q1}, [r0], r1 120 vst1.8 {q0, q1}, [r0], r1 121 vst1.8 {q0, q1}, [r0], r1 122 vst1.8 {q0, q1}, [r0], r1 123 vst1.8 {q0, q1}, [r0], r1 124 subs r2, r2, #1 125 bgt loop_v 126 bx lr 127 ENDP ; |vpx_v_predictor_32x32_neon| 128 129 ;void vpx_h_predictor_4x4_neon(uint8_t *dst, ptrdiff_t y_stride, 130 ; const uint8_t *above, 131 ; const uint8_t *left) 132 ; r0 uint8_t *dst 133 ; r1 ptrdiff_t y_stride 134 ; r2 const uint8_t *above 135 ; r3 const uint8_t *left 136 137 |vpx_h_predictor_4x4_neon| PROC 138 vld1.32 {d1[0]}, [r3] 139 vdup.8 d0, d1[0] 140 vst1.32 {d0[0]}, [r0], r1 141 vdup.8 d0, d1[1] 142 vst1.32 {d0[0]}, [r0], r1 143 vdup.8 d0, d1[2] 144 vst1.32 {d0[0]}, [r0], r1 145 vdup.8 d0, d1[3] 146 vst1.32 {d0[0]}, [r0], r1 147 bx lr 148 ENDP ; |vpx_h_predictor_4x4_neon| 149 150 ;void vpx_h_predictor_8x8_neon(uint8_t *dst, ptrdiff_t y_stride, 151 ; const uint8_t *above, 152 ; const uint8_t *left) 153 ; r0 uint8_t *dst 154 ; r1 ptrdiff_t y_stride 155 ; r2 const uint8_t *above 156 ; r3 const uint8_t *left 157 158 |vpx_h_predictor_8x8_neon| PROC 159 vld1.64 {d1}, [r3] 160 vdup.8 d0, d1[0] 161 vst1.64 {d0}, [r0], r1 162 vdup.8 d0, d1[1] 163 vst1.64 {d0}, [r0], r1 164 vdup.8 d0, d1[2] 165 vst1.64 {d0}, [r0], r1 166 vdup.8 d0, d1[3] 167 vst1.64 {d0}, [r0], r1 168 vdup.8 d0, d1[4] 169 vst1.64 {d0}, [r0], r1 170 vdup.8 d0, d1[5] 171 vst1.64 {d0}, [r0], r1 172 vdup.8 d0, d1[6] 173 vst1.64 {d0}, [r0], r1 174 vdup.8 d0, d1[7] 175 vst1.64 {d0}, [r0], r1 176 bx lr 177 ENDP ; |vpx_h_predictor_8x8_neon| 178 179 ;void vpx_h_predictor_16x16_neon(uint8_t *dst, ptrdiff_t y_stride, 180 ; const uint8_t *above, 181 ; const uint8_t *left) 182 ; r0 uint8_t *dst 183 ; r1 ptrdiff_t y_stride 184 ; r2 const uint8_t *above 185 ; r3 const uint8_t *left 186 187 |vpx_h_predictor_16x16_neon| PROC 188 vld1.8 {q1}, [r3] 189 vdup.8 q0, d2[0] 190 vst1.8 {q0}, [r0], r1 191 vdup.8 q0, d2[1] 192 vst1.8 {q0}, [r0], r1 193 vdup.8 q0, d2[2] 194 vst1.8 {q0}, [r0], r1 195 vdup.8 q0, d2[3] 196 vst1.8 {q0}, [r0], r1 197 vdup.8 q0, d2[4] 198 vst1.8 {q0}, [r0], r1 199 vdup.8 q0, d2[5] 200 vst1.8 {q0}, [r0], r1 201 vdup.8 q0, d2[6] 202 vst1.8 {q0}, [r0], r1 203 vdup.8 q0, d2[7] 204 vst1.8 {q0}, [r0], r1 205 vdup.8 q0, d3[0] 206 vst1.8 {q0}, [r0], r1 207 vdup.8 q0, d3[1] 208 vst1.8 {q0}, [r0], r1 209 vdup.8 q0, d3[2] 210 vst1.8 {q0}, [r0], r1 211 vdup.8 q0, d3[3] 212 vst1.8 {q0}, [r0], r1 213 vdup.8 q0, d3[4] 214 vst1.8 {q0}, [r0], r1 215 vdup.8 q0, d3[5] 216 vst1.8 {q0}, [r0], r1 217 vdup.8 q0, d3[6] 218 vst1.8 {q0}, [r0], r1 219 vdup.8 q0, d3[7] 220 vst1.8 {q0}, [r0], r1 221 bx lr 222 ENDP ; |vpx_h_predictor_16x16_neon| 223 224 ;void vpx_h_predictor_32x32_neon(uint8_t *dst, ptrdiff_t y_stride, 225 ; const uint8_t *above, 226 ; const uint8_t *left) 227 ; r0 uint8_t *dst 228 ; r1 ptrdiff_t y_stride 229 ; r2 const uint8_t *above 230 ; r3 const uint8_t *left 231 232 |vpx_h_predictor_32x32_neon| PROC 233 sub r1, r1, #16 234 mov r2, #2 235 loop_h 236 vld1.8 {q1}, [r3]! 237 vdup.8 q0, d2[0] 238 vst1.8 {q0}, [r0]! 239 vst1.8 {q0}, [r0], r1 240 vdup.8 q0, d2[1] 241 vst1.8 {q0}, [r0]! 242 vst1.8 {q0}, [r0], r1 243 vdup.8 q0, d2[2] 244 vst1.8 {q0}, [r0]! 245 vst1.8 {q0}, [r0], r1 246 vdup.8 q0, d2[3] 247 vst1.8 {q0}, [r0]! 248 vst1.8 {q0}, [r0], r1 249 vdup.8 q0, d2[4] 250 vst1.8 {q0}, [r0]! 251 vst1.8 {q0}, [r0], r1 252 vdup.8 q0, d2[5] 253 vst1.8 {q0}, [r0]! 254 vst1.8 {q0}, [r0], r1 255 vdup.8 q0, d2[6] 256 vst1.8 {q0}, [r0]! 257 vst1.8 {q0}, [r0], r1 258 vdup.8 q0, d2[7] 259 vst1.8 {q0}, [r0]! 260 vst1.8 {q0}, [r0], r1 261 vdup.8 q0, d3[0] 262 vst1.8 {q0}, [r0]! 263 vst1.8 {q0}, [r0], r1 264 vdup.8 q0, d3[1] 265 vst1.8 {q0}, [r0]! 266 vst1.8 {q0}, [r0], r1 267 vdup.8 q0, d3[2] 268 vst1.8 {q0}, [r0]! 269 vst1.8 {q0}, [r0], r1 270 vdup.8 q0, d3[3] 271 vst1.8 {q0}, [r0]! 272 vst1.8 {q0}, [r0], r1 273 vdup.8 q0, d3[4] 274 vst1.8 {q0}, [r0]! 275 vst1.8 {q0}, [r0], r1 276 vdup.8 q0, d3[5] 277 vst1.8 {q0}, [r0]! 278 vst1.8 {q0}, [r0], r1 279 vdup.8 q0, d3[6] 280 vst1.8 {q0}, [r0]! 281 vst1.8 {q0}, [r0], r1 282 vdup.8 q0, d3[7] 283 vst1.8 {q0}, [r0]! 284 vst1.8 {q0}, [r0], r1 285 subs r2, r2, #1 286 bgt loop_h 287 bx lr 288 ENDP ; |vpx_h_predictor_32x32_neon| 289 290 ;void vpx_tm_predictor_4x4_neon (uint8_t *dst, ptrdiff_t y_stride, 291 ; const uint8_t *above, 292 ; const uint8_t *left) 293 ; r0 uint8_t *dst 294 ; r1 ptrdiff_t y_stride 295 ; r2 const uint8_t *above 296 ; r3 const uint8_t *left 297 298 |vpx_tm_predictor_4x4_neon| PROC 299 ; Load ytop_left = above[-1]; 300 sub r12, r2, #1 301 vld1.u8 {d0[]}, [r12] 302 303 ; Load above 4 pixels 304 vld1.32 {d2[0]}, [r2] 305 306 ; Compute above - ytop_left 307 vsubl.u8 q3, d2, d0 308 309 ; Load left row by row and compute left + (above - ytop_left) 310 ; 1st row and 2nd row 311 vld1.u8 {d2[]}, [r3]! 312 vld1.u8 {d4[]}, [r3]! 313 vmovl.u8 q1, d2 314 vmovl.u8 q2, d4 315 vadd.s16 q1, q1, q3 316 vadd.s16 q2, q2, q3 317 vqmovun.s16 d0, q1 318 vqmovun.s16 d1, q2 319 vst1.32 {d0[0]}, [r0], r1 320 vst1.32 {d1[0]}, [r0], r1 321 322 ; 3rd row and 4th row 323 vld1.u8 {d2[]}, [r3]! 324 vld1.u8 {d4[]}, [r3] 325 vmovl.u8 q1, d2 326 vmovl.u8 q2, d4 327 vadd.s16 q1, q1, q3 328 vadd.s16 q2, q2, q3 329 vqmovun.s16 d0, q1 330 vqmovun.s16 d1, q2 331 vst1.32 {d0[0]}, [r0], r1 332 vst1.32 {d1[0]}, [r0], r1 333 bx lr 334 ENDP ; |vpx_tm_predictor_4x4_neon| 335 336 ;void vpx_tm_predictor_8x8_neon (uint8_t *dst, ptrdiff_t y_stride, 337 ; const uint8_t *above, 338 ; const uint8_t *left) 339 ; r0 uint8_t *dst 340 ; r1 ptrdiff_t y_stride 341 ; r2 const uint8_t *above 342 ; r3 const uint8_t *left 343 344 |vpx_tm_predictor_8x8_neon| PROC 345 ; Load ytop_left = above[-1]; 346 sub r12, r2, #1 347 vld1.8 {d0[]}, [r12] 348 349 ; preload 8 left 350 vld1.8 {d30}, [r3] 351 352 ; Load above 8 pixels 353 vld1.64 {d2}, [r2] 354 355 vmovl.u8 q10, d30 356 357 ; Compute above - ytop_left 358 vsubl.u8 q3, d2, d0 359 360 ; Load left row by row and compute left + (above - ytop_left) 361 ; 1st row and 2nd row 362 vdup.16 q0, d20[0] 363 vdup.16 q1, d20[1] 364 vadd.s16 q0, q3, q0 365 vadd.s16 q1, q3, q1 366 367 ; 3rd row and 4th row 368 vdup.16 q8, d20[2] 369 vdup.16 q9, d20[3] 370 vadd.s16 q8, q3, q8 371 vadd.s16 q9, q3, q9 372 373 vqmovun.s16 d0, q0 374 vqmovun.s16 d1, q1 375 vqmovun.s16 d2, q8 376 vqmovun.s16 d3, q9 377 378 vst1.64 {d0}, [r0], r1 379 vst1.64 {d1}, [r0], r1 380 vst1.64 {d2}, [r0], r1 381 vst1.64 {d3}, [r0], r1 382 383 ; 5th row and 6th row 384 vdup.16 q0, d21[0] 385 vdup.16 q1, d21[1] 386 vadd.s16 q0, q3, q0 387 vadd.s16 q1, q3, q1 388 389 ; 7th row and 8th row 390 vdup.16 q8, d21[2] 391 vdup.16 q9, d21[3] 392 vadd.s16 q8, q3, q8 393 vadd.s16 q9, q3, q9 394 395 vqmovun.s16 d0, q0 396 vqmovun.s16 d1, q1 397 vqmovun.s16 d2, q8 398 vqmovun.s16 d3, q9 399 400 vst1.64 {d0}, [r0], r1 401 vst1.64 {d1}, [r0], r1 402 vst1.64 {d2}, [r0], r1 403 vst1.64 {d3}, [r0], r1 404 405 bx lr 406 ENDP ; |vpx_tm_predictor_8x8_neon| 407 408 ;void vpx_tm_predictor_16x16_neon (uint8_t *dst, ptrdiff_t y_stride, 409 ; const uint8_t *above, 410 ; const uint8_t *left) 411 ; r0 uint8_t *dst 412 ; r1 ptrdiff_t y_stride 413 ; r2 const uint8_t *above 414 ; r3 const uint8_t *left 415 416 |vpx_tm_predictor_16x16_neon| PROC 417 ; Load ytop_left = above[-1]; 418 sub r12, r2, #1 419 vld1.8 {d0[]}, [r12] 420 421 ; Load above 8 pixels 422 vld1.8 {q1}, [r2] 423 424 ; preload 8 left into r12 425 vld1.8 {d18}, [r3]! 426 427 ; Compute above - ytop_left 428 vsubl.u8 q2, d2, d0 429 vsubl.u8 q3, d3, d0 430 431 vmovl.u8 q10, d18 432 433 ; Load left row by row and compute left + (above - ytop_left) 434 ; Process 8 rows in each single loop and loop 2 times to process 16 rows. 435 mov r2, #2 436 437 loop_16x16_neon 438 ; Process two rows. 439 vdup.16 q0, d20[0] 440 vdup.16 q8, d20[1] 441 vadd.s16 q1, q0, q2 442 vadd.s16 q0, q0, q3 443 vadd.s16 q11, q8, q2 444 vadd.s16 q8, q8, q3 445 vqmovun.s16 d2, q1 446 vqmovun.s16 d3, q0 447 vqmovun.s16 d22, q11 448 vqmovun.s16 d23, q8 449 vdup.16 q0, d20[2] ; proload next 2 rows data 450 vdup.16 q8, d20[3] 451 vst1.64 {d2,d3}, [r0], r1 452 vst1.64 {d22,d23}, [r0], r1 453 454 ; Process two rows. 455 vadd.s16 q1, q0, q2 456 vadd.s16 q0, q0, q3 457 vadd.s16 q11, q8, q2 458 vadd.s16 q8, q8, q3 459 vqmovun.s16 d2, q1 460 vqmovun.s16 d3, q0 461 vqmovun.s16 d22, q11 462 vqmovun.s16 d23, q8 463 vdup.16 q0, d21[0] ; proload next 2 rows data 464 vdup.16 q8, d21[1] 465 vst1.64 {d2,d3}, [r0], r1 466 vst1.64 {d22,d23}, [r0], r1 467 468 vadd.s16 q1, q0, q2 469 vadd.s16 q0, q0, q3 470 vadd.s16 q11, q8, q2 471 vadd.s16 q8, q8, q3 472 vqmovun.s16 d2, q1 473 vqmovun.s16 d3, q0 474 vqmovun.s16 d22, q11 475 vqmovun.s16 d23, q8 476 vdup.16 q0, d21[2] ; proload next 2 rows data 477 vdup.16 q8, d21[3] 478 vst1.64 {d2,d3}, [r0], r1 479 vst1.64 {d22,d23}, [r0], r1 480 481 482 vadd.s16 q1, q0, q2 483 vadd.s16 q0, q0, q3 484 vadd.s16 q11, q8, q2 485 vadd.s16 q8, q8, q3 486 vqmovun.s16 d2, q1 487 vqmovun.s16 d3, q0 488 vqmovun.s16 d22, q11 489 vqmovun.s16 d23, q8 490 vld1.8 {d18}, [r3]! ; preload 8 left into r12 491 vmovl.u8 q10, d18 492 vst1.64 {d2,d3}, [r0], r1 493 vst1.64 {d22,d23}, [r0], r1 494 495 subs r2, r2, #1 496 bgt loop_16x16_neon 497 498 bx lr 499 ENDP ; |vpx_tm_predictor_16x16_neon| 500 501 ;void vpx_tm_predictor_32x32_neon (uint8_t *dst, ptrdiff_t y_stride, 502 ; const uint8_t *above, 503 ; const uint8_t *left) 504 ; r0 uint8_t *dst 505 ; r1 ptrdiff_t y_stride 506 ; r2 const uint8_t *above 507 ; r3 const uint8_t *left 508 509 |vpx_tm_predictor_32x32_neon| PROC 510 ; Load ytop_left = above[-1]; 511 sub r12, r2, #1 512 vld1.8 {d0[]}, [r12] 513 514 ; Load above 32 pixels 515 vld1.8 {q1}, [r2]! 516 vld1.8 {q2}, [r2] 517 518 ; preload 8 left pixels 519 vld1.8 {d26}, [r3]! 520 521 ; Compute above - ytop_left 522 vsubl.u8 q8, d2, d0 523 vsubl.u8 q9, d3, d0 524 vsubl.u8 q10, d4, d0 525 vsubl.u8 q11, d5, d0 526 527 vmovl.u8 q3, d26 528 529 ; Load left row by row and compute left + (above - ytop_left) 530 ; Process 8 rows in each single loop and loop 4 times to process 32 rows. 531 mov r2, #4 532 533 loop_32x32_neon 534 ; Process two rows. 535 vdup.16 q0, d6[0] 536 vdup.16 q2, d6[1] 537 vadd.s16 q12, q0, q8 538 vadd.s16 q13, q0, q9 539 vadd.s16 q14, q0, q10 540 vadd.s16 q15, q0, q11 541 vqmovun.s16 d0, q12 542 vqmovun.s16 d1, q13 543 vadd.s16 q12, q2, q8 544 vadd.s16 q13, q2, q9 545 vqmovun.s16 d2, q14 546 vqmovun.s16 d3, q15 547 vadd.s16 q14, q2, q10 548 vadd.s16 q15, q2, q11 549 vst1.64 {d0-d3}, [r0], r1 550 vqmovun.s16 d24, q12 551 vqmovun.s16 d25, q13 552 vqmovun.s16 d26, q14 553 vqmovun.s16 d27, q15 554 vdup.16 q1, d6[2] 555 vdup.16 q2, d6[3] 556 vst1.64 {d24-d27}, [r0], r1 557 558 ; Process two rows. 559 vadd.s16 q12, q1, q8 560 vadd.s16 q13, q1, q9 561 vadd.s16 q14, q1, q10 562 vadd.s16 q15, q1, q11 563 vqmovun.s16 d0, q12 564 vqmovun.s16 d1, q13 565 vadd.s16 q12, q2, q8 566 vadd.s16 q13, q2, q9 567 vqmovun.s16 d2, q14 568 vqmovun.s16 d3, q15 569 vadd.s16 q14, q2, q10 570 vadd.s16 q15, q2, q11 571 vst1.64 {d0-d3}, [r0], r1 572 vqmovun.s16 d24, q12 573 vqmovun.s16 d25, q13 574 vqmovun.s16 d26, q14 575 vqmovun.s16 d27, q15 576 vdup.16 q0, d7[0] 577 vdup.16 q2, d7[1] 578 vst1.64 {d24-d27}, [r0], r1 579 580 ; Process two rows. 581 vadd.s16 q12, q0, q8 582 vadd.s16 q13, q0, q9 583 vadd.s16 q14, q0, q10 584 vadd.s16 q15, q0, q11 585 vqmovun.s16 d0, q12 586 vqmovun.s16 d1, q13 587 vadd.s16 q12, q2, q8 588 vadd.s16 q13, q2, q9 589 vqmovun.s16 d2, q14 590 vqmovun.s16 d3, q15 591 vadd.s16 q14, q2, q10 592 vadd.s16 q15, q2, q11 593 vst1.64 {d0-d3}, [r0], r1 594 vqmovun.s16 d24, q12 595 vqmovun.s16 d25, q13 596 vqmovun.s16 d26, q14 597 vqmovun.s16 d27, q15 598 vdup.16 q0, d7[2] 599 vdup.16 q2, d7[3] 600 vst1.64 {d24-d27}, [r0], r1 601 602 ; Process two rows. 603 vadd.s16 q12, q0, q8 604 vadd.s16 q13, q0, q9 605 vadd.s16 q14, q0, q10 606 vadd.s16 q15, q0, q11 607 vqmovun.s16 d0, q12 608 vqmovun.s16 d1, q13 609 vadd.s16 q12, q2, q8 610 vadd.s16 q13, q2, q9 611 vqmovun.s16 d2, q14 612 vqmovun.s16 d3, q15 613 vadd.s16 q14, q2, q10 614 vadd.s16 q15, q2, q11 615 vst1.64 {d0-d3}, [r0], r1 616 vqmovun.s16 d24, q12 617 vqmovun.s16 d25, q13 618 vld1.8 {d0}, [r3]! ; preload 8 left pixels 619 vqmovun.s16 d26, q14 620 vqmovun.s16 d27, q15 621 vmovl.u8 q3, d0 622 vst1.64 {d24-d27}, [r0], r1 623 624 subs r2, r2, #1 625 bgt loop_32x32_neon 626 627 bx lr 628 ENDP ; |vpx_tm_predictor_32x32_neon| 629 630 END 631