1/*! 2 * \copy 3 * Copyright (c) 2013, Cisco Systems 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 10 * * Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 13 * * Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in 15 * the documentation and/or other materials provided with the 16 * distribution. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 21 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 22 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 24 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 26 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 28 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 * 31 */ 32 33#ifdef HAVE_NEON 34#include "arm_arch_common_macro.S" 35 36.macro SATD_16x4 37 vld1.64 {q0}, [r0,:128], r1 38 vld1.64 {q1}, [r2], r3 39 40 vsubl.u8 q8, d0, d2 41 vld1.64 {q2}, [r0,:128], r1 42 43 vsubl.u8 q10, d1, d3 44 vld1.64 {q3}, [r2], r3 45 46 vsubl.u8 q9, d4, d6 47 vld1.64 {q0}, [r0,:128], r1 48 49 vsubl.u8 q11, d5, d7 50 vld1.64 {q1}, [r2], r3 51 52 vsubl.u8 q12, d0, d2 53 vld1.64 {q2}, [r0,:128], r1 54 55 vsubl.u8 q14, d1, d3 56 vadd.s16 q0, q8, q9 57 58 vld1.64 {q3}, [r2], r3 59 vsub.s16 q1, q8, q9 60 61 vsubl.u8 q13, d4, d6 62 vsubl.u8 q15, d5, d7 63 64 vadd.s16 q2, q12, q13 65 vsub.s16 q3, q12, q13 66 67 vadd.s16 q8, q10, q11 68 vsub.s16 q9, q10, q11 69 70 vadd.s16 q10, q14, q15 71 vsub.s16 q11, q14, q15 72 73 vadd.s16 q12, q0, q2 74 vsub.s16 q14, q0, q2 75 76 vadd.s16 q13, q8, q10 77 vsub.s16 q15, q8, q10 78 79 vsub.s16 q0, q1, q3 80 vadd.s16 q2, q1, q3 81 82 vsub.s16 q1, q9, q11 83 vadd.s16 q3, q9, q11 84 85 vtrn.16 q12, q14 86 vtrn.16 q13, q15 87 88 vadd.s16 q8, q12, q14 89 vabd.s16 q10, q12, q14 90 91 vadd.s16 q9, q13, q15 92 vabd.s16 q11, q13, q15 93 94 vabs.s16 q8, q8 95 vabs.s16 q9, q9 96 97 vtrn.16 q0, q2 98 vtrn.16 q1, q3 99 100 vadd.s16 q12, q0, q2 101 vabd.s16 q14, q0, q2 102 103 vadd.s16 q13, q1, q3 104 vabd.s16 q15, q1, q3 105 106 vabs.s16 q12, q12 107 vabs.s16 q13, q13 108 109 vtrn.32 q8, q10 110 vtrn.32 q9, q11 111 112 vtrn.32 q12, q14 113 vtrn.32 q13, q15 114 115 vmax.s16 q0, q8, q10 116 vmax.s16 q1, q9, q11 117 vmax.s16 q2, q12, q14 118 vmax.s16 q3, q13, q15 119 120 vadd.u16 q0, q0, q1 121 vadd.u16 q2, q2, q3 122.endm 123 124.macro SATD_8x4 125 126 vld1.64 {d0}, [r0,:64], r1 127 vld1.64 {d1}, [r2], r3 128 129 vld1.64 {d2}, [r0,:64], r1 130 vsubl.u8 q8, d0, d1 131 132 vld1.64 {d3}, [r2], r3 133 vsubl.u8 q9, d2, d3 134 135 vld1.64 {d4}, [r0,:64], r1 136 vld1.64 {d5}, [r2], r3 137 138 vadd.s16 q12, q8, q9 139 vsubl.u8 q10, d4, d5 140 141 vld1.64 {d6}, [r0,:64], r1 142 vld1.64 {d7}, [r2], r3 143 144 vsubl.u8 q11, d6, d7 145 vsub.s16 q13, q8, q9 146 147 vadd.s16 q14, q10, q11 148 vsub.s16 q15, q10, q11 149 150 vadd.s16 q0, q12, q14 151 vsub.s16 q1, q12, q14 152 153 vsub.s16 q2, q13, q15 154 vadd.s16 q3, q13, q15 155 156 vtrn.16 q0, q1 157 vtrn.16 q2, q3 158 159 vadd.s16 q8, q0, q1 160 vabd.s16 q9, q0, q1 161 162 vabs.s16 q8, q8 163 vadd.s16 q10, q2, q3 164 165 vabd.s16 q11, q2, q3 166 vabs.s16 q10, q10 167 168 vtrn.32 q8, q9 169 vtrn.32 q10, q11 170 171 vmax.s16 q0, q8, q9 172 vmax.s16 q1, q10, q11 173.endm 174 175.macro SAD_16x4 176 vld1.64 {q6}, [r0, :128], r1 177 vabal.u8 q10, d8, d10 178 179 vld1.64 {q7}, [r2], r3 180 vabal.u8 q11, d9, d11 181 182 vld1.64 {q0}, [r0, :128], r1 183 vabal.u8 q12, d12, d14 184 185 vld1.64 {q1}, [r2], r3 186 vabal.u8 q13, d13, d15 187 188 vld1.64 {q2}, [r0, :128], r1 189 vabal.u8 q10, d0, d2 190 191 vld1.64 {q3}, [r2], r3 192 vabal.u8 q11, d1, d3 193 194 vld1.64 {q4}, [r0, :128], r1 195 vabal.u8 q12, d4, d6 196 197 vld1.64 {q5}, [r2], r3 198 vabal.u8 q13, d5, d7 199.endm 200 201.macro SAD_8x4 202 vld1.64 {d0}, [r0, :64], r1 203 vld1.64 {d1}, [r2], r3 204 205 vabal.u8 q10, d0, d1 206 vld1.64 {d2}, [r0, :64], r1 207 208 vld1.64 {d3}, [r2], r3 209 vabal.u8 q11, d2, d3 210 211 vld1.64 {d4}, [r0, :64], r1 212 vld1.64 {d5}, [r2], r3 213 214 vabal.u8 q12, d4, d5 215 vld1.64 {d6}, [r0, :64], r1 216 217 vld1.64 {d7}, [r2], r3 218 vabal.u8 q13, d6, d7 219.endm 220 221 222WELS_ASM_FUNC_BEGIN WelsSampleSad16x16_neon 223 vpush {q4-q7} 224 225 vld1.64 {q0}, [r0, :128], r1 226 vld1.64 {q1}, [r2], r3 227 228 vabdl.u8 q10, d0, d2 229 vld1.64 {q2}, [r0, :128], r1 230 231 vabdl.u8 q11, d1, d3 232 vld1.64 {q3}, [r2], r3 233 234 vld1.64 {q4}, [r0, :128], r1 235 vabdl.u8 q12, d4, d6 236 vld1.64 {q5}, [r2], r3 237 vabdl.u8 q13, d5, d7 238 239 SAD_16x4 240 SAD_16x4 241 SAD_16x4 242 243 vld1.64 {q6}, [r0, :128], r1 244 vabal.u8 q10, d8, d10 245 246 vld1.64 {q7}, [r2], r3 247 vabal.u8 q11, d9, d11 248 249 vabal.u8 q12, d12, d14 250 vabal.u8 q13, d13, d15 251 252 vadd.u16 q14, q10, q11 253 vadd.u16 q15, q12, q13 254 255 vadd.u16 q15, q14, q15 256 vadd.u16 d0, d30, d31 257 vpaddl.u16 d0, d0 258 vpaddl.u32 d0, d0 259 vmov.u32 r0, d0[0] 260 261 vpop {q4-q7} 262WELS_ASM_FUNC_END 263 264 265WELS_ASM_FUNC_BEGIN WelsSampleSad16x8_neon 266 vpush {q4-q7} 267 268 vld1.64 {q0}, [r0, :128], r1 269 vld1.64 {q1}, [r2], r3 270 271 vabdl.u8 q10, d0, d2 272 vld1.64 {q2}, [r0, :128], r1 273 274 vabdl.u8 q11, d1, d3 275 vld1.64 {q3}, [r2], r3 276 277 vld1.64 {q4}, [r0, :128], r1 278 vabdl.u8 q12, d4, d6 279 vld1.64 {q5}, [r2], r3 280 vabdl.u8 q13, d5, d7 281 282 SAD_16x4 283 284 vld1.64 {q6}, [r0, :128], r1 285 vabal.u8 q10, d8, d10 286 287 vld1.64 {q7}, [r2], r3 288 vabal.u8 q11, d9, d11 289 290 vabal.u8 q12, d12, d14 291 vabal.u8 q13, d13, d15 292 293 vadd.u16 q14, q10, q11 294 vadd.u16 q15, q12, q13 295 296 vadd.u16 q15, q14, q15 297 vadd.u16 d0, d30, d31 298 vpaddl.u16 d0, d0 299 vpaddl.u32 d0, d0 300 vmov.u32 r0, d0[0] 301 vpop {q4-q7} 302WELS_ASM_FUNC_END 303 304 305WELS_ASM_FUNC_BEGIN WelsSampleSad8x16_neon 306 307 vld1.64 {d0}, [r0, :64], r1 308 vld1.64 {d1}, [r2], r3 309 310 vabdl.u8 q10, d0, d1 311 vld1.64 {d2}, [r0, :64], r1 312 313 vld1.64 {d3}, [r2], r3 314 vabdl.u8 q11, d2, d3 315 316 vld1.64 {d4}, [r0, :64], r1 317 vld1.64 {d5}, [r2], r3 318 319 vabdl.u8 q12, d4, d5 320 vld1.64 {d6}, [r0, :64], r1 321 322 vld1.64 {d7}, [r2], r3 323 vabdl.u8 q13, d6, d7 324 325 SAD_8x4 326 SAD_8x4 327 SAD_8x4 328 329 vadd.u16 q14, q10, q11 330 vadd.u16 q15, q12, q13 331 vadd.u16 q15, q15, q14 332 vadd.u16 d0, d30, d31 333 vpaddl.u16 d0, d0 334 vpaddl.u32 d0, d0 335 vmov.u32 r0, d0[0] 336WELS_ASM_FUNC_END 337 338 339WELS_ASM_FUNC_BEGIN WelsSampleSad8x8_neon 340 341 vld1.64 {d0}, [r0, :64], r1 342 vld1.64 {d1}, [r2], r3 343 344 vabdl.u8 q10, d0, d1 345 vld1.64 {d2}, [r0, :64], r1 346 347 vld1.64 {d3}, [r2], r3 348 vabdl.u8 q11, d2, d3 349 350 vld1.64 {d4}, [r0, :64], r1 351 vld1.64 {d5}, [r2], r3 352 353 vabdl.u8 q12, d4, d5 354 vld1.64 {d6}, [r0, :64], r1 355 356 vld1.64 {d7}, [r2], r3 357 vabdl.u8 q13, d6, d7 358 359 SAD_8x4 360 361 vadd.u16 q14, q10, q11 362 vadd.u16 q15, q12, q13 363 vadd.u16 q15, q15, q14 364 vadd.u16 d0, d30, d31 365 vpaddl.u16 d0, d0 366 vpaddl.u32 d0, d0 367 vmov.u32 r0, d0[0] 368WELS_ASM_FUNC_END 369 370 371WELS_ASM_FUNC_BEGIN WelsSampleSad4x4_neon 372 stmdb sp!, {r4-r5, lr} 373 374 //Loading a horizontal line data (4 bytes) 375 //line 0 376 ldr r4, [r0], r1 377 ldr r5, [r2], r3 378 usad8 lr, r4, r5 379 380 //line 1 381 ldr r4, [r0], r1 382 ldr r5, [r2], r3 383 usada8 lr, r4, r5, lr 384 385 //line 2 386 ldr r4, [r0], r1 387 ldr r5, [r2], r3 388 usada8 lr, r4, r5, lr 389 390 //line 3 391 ldr r4, [r0] 392 ldr r5, [r2] 393 usada8 r0, r4, r5, lr 394 395 ldmia sp!, {r4-r5, lr} 396WELS_ASM_FUNC_END 397 398 399WELS_ASM_FUNC_BEGIN WelsSampleSadFour16x16_neon 400 401 stmdb sp!, {r4-r5, lr} 402 403 //Generate the pix2 start addr 404 sub r4, r2, #1 405 add r5, r2, #1 406 sub r2, r3 407 408 //Loading a horizontal line data (16 bytes) 409 vld1.8 {q0}, [r0], r1 //save pix1 410 411 vld1.8 {q1}, [r2], r3 //save pix2 - stride 412 vld1.8 {q10}, [r2], r3 //save pix2 413 vld1.8 {q2}, [r2], r3 //save pix2 + stride 414 415 vld1.8 {q3}, [r4], r3 //save pix2 - 1 416 vld1.8 {q8}, [r5], r3 //save pix2 + 1 417 418 //Do the SAD for 16 bytes 419 vabdl.u8 q15, d0, d2 420 vabal.u8 q15, d1, d3 421 422 vabdl.u8 q13, d0, d4 423 vabal.u8 q13, d1, d5 424 425 vabdl.u8 q11, d0, d6 426 vabal.u8 q11, d1, d7 427 428 vabdl.u8 q9, d0, d16 429 vabal.u8 q9, d1, d17 430 431 mov lr, #15 432pixel_sad_4_16x16_loop_0: 433 434 //Loading a horizontal line data (16 bytes) 435 vld1.8 {q0}, [r0], r1 //save pix1 436 vmov.8 q1, q10 //save pix2 - stride 437 vmov.8 q10, q2 438 vabal.u8 q15, d0, d2 439 vld1.8 {q2}, [r2], r3 //save pix2 + stride 440 vabal.u8 q15, d1, d3 441 vld1.8 {q3}, [r4], r3 //save pix2 - 1 442 vabal.u8 q13, d0, d4 443 vld1.8 {q8}, [r5], r3 //save pix2 + 1 444 vabal.u8 q13, d1, d5 445 subs lr, #1 446 447 vabal.u8 q11, d0, d6 448 vabal.u8 q11, d1, d7 449 450 vabal.u8 q9, d0, d16 451 vabal.u8 q9, d1, d17 452 453 bne pixel_sad_4_16x16_loop_0 454 455 456 //Save SAD to 'r0' 457 ldr r0, [sp, #12] 458 459 vadd.u16 d0, d30, d31 460 vadd.u16 d1, d26, d27 461 vadd.u16 d2, d22, d23 462 vadd.u16 d3, d18, d19 463 464 vpaddl.u16 q0, q0 465 vpaddl.u16 q1, q1 466 467 vpaddl.u32 q0, q0 468 vpaddl.u32 q1, q1 469 470 vst4.32 {d0[0],d1[0],d2[0],d3[0]}, [r0] 471 472 ldmia sp!, {r4-r5, lr} 473WELS_ASM_FUNC_END 474 475 476WELS_ASM_FUNC_BEGIN WelsSampleSadFour16x8_neon 477 stmdb sp!, {r4-r5, lr} 478 479 //Generate the pix2 start addr 480 sub r4, r2, #1 481 add r5, r2, #1 482 sub r2, r3 483 484 //Loading a horizontal line data (16 bytes) 485 vld1.8 {q0}, [r0], r1 //save pix1 486 487 vld1.8 {q1}, [r2], r3 //save pix2 - stride 488 vld1.8 {q10}, [r2], r3 //save pix2 489 vld1.8 {q2}, [r2], r3 //save pix2 + stride 490 491 vld1.8 {q3}, [r4], r3 //save pix2 - 1 492 vld1.8 {q8}, [r5], r3 //save pix2 + 1 493 494 //Do the SAD for 16 bytes 495 vabdl.u8 q15, d0, d2 496 vabal.u8 q15, d1, d3 497 498 vabdl.u8 q13, d0, d4 499 vabal.u8 q13, d1, d5 500 501 vabdl.u8 q11, d0, d6 502 vabal.u8 q11, d1, d7 503 504 vabdl.u8 q9, d0, d16 505 vabal.u8 q9, d1, d17 506 507 mov lr, #7 508pixel_sad_4_16x8_loop_0: 509 510 //Loading a horizontal line data (16 bytes) 511 vld1.8 {q0}, [r0], r1 //save pix1 512 vmov.8 q1, q10 //save pix2 - stride 513 vmov.8 q10, q2 514 vabal.u8 q15, d0, d2 515 vld1.8 {q2}, [r2], r3 //save pix2 + stride 516 vabal.u8 q15, d1, d3 517 vld1.8 {q3}, [r4], r3 //save pix2 - 1 518 vabal.u8 q13, d0, d4 519 vld1.8 {q8}, [r5], r3 //save pix2 + 1 520 vabal.u8 q13, d1, d5 521 subs lr, #1 522 523 vabal.u8 q11, d0, d6 524 vabal.u8 q11, d1, d7 525 526 vabal.u8 q9, d0, d16 527 vabal.u8 q9, d1, d17 528 529 bne pixel_sad_4_16x8_loop_0 530 531 //Save SAD to 'r0' 532 ldr r0, [sp, #12] 533 534 vadd.u16 d0, d30, d31 535 vadd.u16 d1, d26, d27 536 vadd.u16 d2, d22, d23 537 vadd.u16 d3, d18, d19 538 539 vpaddl.u16 q0, q0 540 vpaddl.u16 q1, q1 541 542 vpaddl.u32 q0, q0 543 vpaddl.u32 q1, q1 544 545 vst4.32 {d0[0],d1[0],d2[0],d3[0]}, [r0] 546 547 ldmia sp!, {r4-r5, lr} 548WELS_ASM_FUNC_END 549 550 551WELS_ASM_FUNC_BEGIN WelsSampleSadFour8x16_neon 552 stmdb sp!, {r4-r5, lr} 553 554 //Generate the pix2 start addr 555 sub r4, r2, #1 556 add r5, r2, #1 557 sub r2, r3 558 559 //Loading a horizontal line data (8 bytes) 560 vld1.8 {d0}, [r0], r1 //save pix1 561 562 vld1.8 {d1}, [r2], r3 //save pix2 - stride 563 vld1.8 {d6}, [r2], r3 //save pix2 564 vld1.8 {d2}, [r2], r3 //save pix2 + stride 565 566 vld1.8 {d3}, [r4], r3 //save pix2 - 1 567 vld1.8 {d4}, [r5], r3 //save pix2 + 1 568 569 //Do the SAD for 8 bytes 570 vabdl.u8 q15, d0, d1 571 vabdl.u8 q14, d0, d2 572 vabdl.u8 q13, d0, d3 573 vabdl.u8 q12, d0, d4 574 575 mov lr, #15 576pixel_sad_4_8x16_loop_0: 577 578 //Loading a horizontal line data (8 bytes) 579 vld1.8 {d0}, [r0], r1 //save pix1 580 vmov.8 d1, d6 //save pix2 - stride 581 vmov.8 d6, d2 582 vld1.8 {d2}, [r2], r3 //save pix2 + stride 583 vld1.8 {d3}, [r4], r3 //save pix2 - 1 584 vabal.u8 q15, d0, d1 585 586 vld1.8 {d4}, [r5], r3 //save pix2 + 1 587 //Do the SAD for 8 bytes 588 vabal.u8 q14, d0, d2 589 vabal.u8 q13, d0, d3 590 vabal.u8 q12, d0, d4 591 subs lr, #1 592 593 bne pixel_sad_4_8x16_loop_0 594 595 //Save SAD to 'r0' 596 ldr r0, [sp, #12] 597 598 vadd.u16 d0, d30, d31 599 vadd.u16 d1, d28, d29 600 vadd.u16 d2, d26, d27 601 vadd.u16 d3, d24, d25 602 603 vpaddl.u16 q0, q0 604 vpaddl.u16 q1, q1 605 606 vpaddl.u32 q0, q0 607 vpaddl.u32 q1, q1 608 609 vst4.32 {d0[0],d1[0],d2[0],d3[0]}, [r0] 610 611 ldmia sp!, {r4-r5, lr} 612WELS_ASM_FUNC_END 613 614 615WELS_ASM_FUNC_BEGIN WelsSampleSadFour8x8_neon 616 stmdb sp!, {r4-r5, lr} 617 618 //Generate the pix2 start addr 619 sub r4, r2, #1 620 add r5, r2, #1 621 sub r2, r3 622 623 //Loading a horizontal line data (8 bytes) 624 vld1.8 {d0}, [r0], r1 //save pix1 625 626 vld1.8 {d1}, [r2], r3 //save pix2 - stride 627 vld1.8 {d6}, [r2], r3 //save pix2 628 vld1.8 {d2}, [r2], r3 //save pix2 + stride 629 630 vld1.8 {d3}, [r4], r3 //save pix2 - 1 631 vld1.8 {d4}, [r5], r3 //save pix2 + 1 632 633 //Do the SAD for 8 bytes 634 vabdl.u8 q15, d0, d1 635 vabdl.u8 q14, d0, d2 636 vabdl.u8 q13, d0, d3 637 vabdl.u8 q12, d0, d4 638 639 mov lr, #7 640pixel_sad_4_8x8_loop_0: 641 642 //Loading a horizontal line data (8 bytes) 643 vld1.8 {d0}, [r0], r1 //save pix1 644 vmov.8 d1, d6 //save pix2 - stride 645 vmov.8 d6, d2 646 vld1.8 {d2}, [r2], r3 //save pix2 + stride 647 vld1.8 {d3}, [r4], r3 //save pix2 - 1 648 vabal.u8 q15, d0, d1 649 650 vld1.8 {d4}, [r5], r3 //save pix2 + 1 651 //Do the SAD for 8 bytes 652 vabal.u8 q14, d0, d2 653 vabal.u8 q13, d0, d3 654 vabal.u8 q12, d0, d4 655 subs lr, #1 656 bne pixel_sad_4_8x8_loop_0 657 658 //Save SAD to 'r0' 659 ldr r0, [sp, #12] 660 661 vadd.u16 d0, d30, d31 662 vadd.u16 d1, d28, d29 663 vadd.u16 d2, d26, d27 664 vadd.u16 d3, d24, d25 665 666 vpaddl.u16 q0, q0 667 vpaddl.u16 q1, q1 668 669 vpaddl.u32 q0, q0 670 vpaddl.u32 q1, q1 671 672 vst4.32 {d0[0],d1[0],d2[0],d3[0]}, [r0] 673 674 ldmia sp!, {r4-r5, lr} 675WELS_ASM_FUNC_END 676 677 678WELS_ASM_FUNC_BEGIN WelsSampleSadFour4x4_neon 679 680 vld1.32 {d0[0]}, [r0], r1 681 vld1.32 {d0[1]}, [r0], r1 682 vld1.32 {d1[0]}, [r0], r1 683 vld1.32 {d1[1]}, [r0] 684 685 686 sub r0, r2, r3 687 vld1.32 {d2[0]}, [r0], r3 688 vld1.32 {d2[1]}, [r0], r3 689 vld1.32 {d3[0]}, [r0], r3 690 vld1.32 {d3[1]}, [r0], r3 691 vld1.32 {d4[0]}, [r0], r3 692 vld1.32 {d4[1]}, [r0] 693 694 sub r0, r2, #1 695 vld1.32 {d5[0]}, [r0], r3 696 vld1.32 {d5[1]}, [r0], r3 697 vld1.32 {d6[0]}, [r0], r3 698 vld1.32 {d6[1]}, [r0] 699 700 add r0, r2, #1 701 vld1.32 {d7[0]}, [r0], r3 702 vld1.32 {d7[1]}, [r0], r3 703 vld1.32 {d8[0]}, [r0], r3 704 vld1.32 {d8[1]}, [r0] 705 706 vabdl.u8 q15, d0, d2 707 vabdl.u8 q14, d1, d3 708 709 vabdl.u8 q13, d0, d3 710 vabdl.u8 q12, d1, d4 711 712 vabdl.u8 q11, d0, d5 713 vabdl.u8 q10, d1, d6 714 715 vabdl.u8 q9, d0, d7 716 vabdl.u8 q8, d1, d8 717 718 //Save SAD to 'r4' 719 ldr r0, [sp] 720 vadd.u16 q0, q14, q15 721 vadd.u16 q1, q12, q13 722 vadd.u16 q2, q10, q11 723 vadd.u16 q3, q8 , q9 724 725 vadd.u16 d0, d1 726 vadd.u16 d1, d2, d3 727 vadd.u16 d2, d4, d5 728 vadd.u16 d3, d6, d7 729 730 vpaddl.u16 q0, q0 731 vpaddl.u16 q1, q1 732 733 vpaddl.u32 q0, q0 734 vpaddl.u32 q1, q1 735 736 vst4.32 {d0[0],d1[0],d2[0],d3[0]}, [r0] 737 738WELS_ASM_FUNC_END 739 740 741WELS_ASM_FUNC_BEGIN WelsSampleSatd16x16_neon 742 vpush {q7} 743 744 SATD_16x4 745 vadd.u16 q7, q0, q2 746 747 SATD_16x4 748 vadd.u16 q7, q7, q0 749 vadd.u16 q7, q7, q2 750 751 SATD_16x4 752 vadd.u16 q7, q7, q0 753 vadd.u16 q7, q7, q2 754 755 SATD_16x4 756 vadd.u16 q7, q7, q0 757 vadd.u16 q7, q7, q2 758 759 vadd.u16 d0, d14, d15 760 vpaddl.u16 d0, d0 761 vpaddl.u32 d0, d0 762 763 vmov.32 r0, d0[0] 764 vpop {q7} 765WELS_ASM_FUNC_END 766 767 768WELS_ASM_FUNC_BEGIN WelsSampleSatd16x8_neon 769 vpush {q7} 770 771 SATD_16x4 772 vadd.u16 q7, q0, q2 773 774 SATD_16x4 775 vadd.u16 q7, q7, q0 776 vadd.u16 q7, q7, q2 777 778 vadd.u16 d0, d14, d15 779 vpaddl.u16 d0, d0 780 vpaddl.u32 d0, d0 781 782 vmov.32 r0, d0[0] 783 vpop {q7} 784WELS_ASM_FUNC_END 785 786 787WELS_ASM_FUNC_BEGIN WelsSampleSatd8x16_neon 788 vpush {q7} 789 790 SATD_8x4 791 vadd.u16 q7, q0, q1 792 793 SATD_8x4 794 vadd.u16 q7, q7, q0 795 vadd.u16 q7, q7, q1 796 797 SATD_8x4 798 vadd.u16 q7, q7, q0 799 vadd.u16 q7, q7, q1 800 801 SATD_8x4 802 vadd.u16 q7, q7, q0 803 vadd.u16 q7, q7, q1 804 805 vadd.u16 d0, d14, d15 806 vpaddl.u16 d0, d0 807 vpaddl.u32 d0, d0 808 809 vmov.32 r0, d0[0] 810 vpop {q7} 811WELS_ASM_FUNC_END 812 813 814WELS_ASM_FUNC_BEGIN WelsSampleSatd8x8_neon 815 vpush {q7} 816 817 SATD_8x4 818 vadd.u16 q7, q0, q1 819 820 SATD_8x4 821 vadd.u16 q7, q7, q0 822 vadd.u16 q7, q7, q1 823 824 vadd.u16 d0, d14, d15 825 vpaddl.u16 d0, d0 826 vpaddl.u32 d0, d0 827 828 vmov.32 r0, d0[0] 829 vpop {q7} 830WELS_ASM_FUNC_END 831 832 833WELS_ASM_FUNC_BEGIN WelsSampleSatd4x4_neon 834 835 //Load the pix1 data --- 16 bytes 836 vld1.32 {d0[0]}, [r0], r1 837 vld1.32 {d0[1]}, [r0], r1 838 vld1.32 {d1[0]}, [r0], r1 839 vld1.32 {d1[1]}, [r0] 840 841 //Load the pix2 data --- 16 bytes 842 vld1.32 {d2[0]}, [r2], r3 843 vld1.32 {d2[1]}, [r2], r3 844 vld1.32 {d3[0]}, [r2], r3 845 vld1.32 {d3[1]}, [r2] 846 847 //Get the difference 848 vsubl.u8 q15, d0, d2 //{0,1,2,3,4,5,6,7} 849 vsubl.u8 q14, d1, d3 //{8,9,10,11,12,13,14,15} 850 851 //Do the vertical transform 852 vadd.s16 q13, q15, q14 //{0,4,8,12,1,5,9,13} 853 vsub.s16 q12, q15, q14 //{2,6,10,14,3,7,11,15} 854 vswp d27, d24 855 vadd.s16 q15, q13, q12 //{0,1,2,3,4,5,6,7} 856 vsub.s16 q14, q13, q12 //{12,13,14,15,8,9,10,11} 857 858 //Do the horizontal transform 859 vtrn.32 q15, q14 860 vadd.s16 q13, q15, q14 861 vsub.s16 q12, q15, q14 862 863 vtrn.16 q13, q12 864 vadd.s16 q15, q13, q12 865 866 //Do the SAD 867 vabs.s16 q15, q15 868 vabd.s16 q14, q13, q12 869 870 vadd.u16 q0, q15, q14 871 872 vrhadd.u16 d0, d1 873 vpaddl.u16 d0, d0 874 vpaddl.u32 d0, d0 875 876 vmov.u32 r0, d0[0] 877 878WELS_ASM_FUNC_END 879 880#endif 881 882 883