1/* 2 * Copyright (c) 2014 - 2015 Seppo Tomperi <seppo.tomperi@vtt.fi> 3 * 4 * This file is part of FFmpeg. 5 * 6 * FFmpeg is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * FFmpeg is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with FFmpeg; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 */ 20 21#include "libavutil/arm/asm.S" 22#include "neon.S" 23 24#define MAX_PB_SIZE #64 25 26.macro regshuffle_d8 27 vmov d16, d17 28 vmov d17, d18 29 vmov d18, d19 30 vmov d19, d20 31 vmov d20, d21 32 vmov d21, d22 33 vmov d22, d23 34.endm 35 36.macro regshuffle_q8 37 vmov q0, q1 38 vmov q1, q2 39 vmov q2, q3 40 vmov q3, q4 41 vmov q4, q5 42 vmov q5, q6 43 vmov q6, q7 44.endm 45 46.macro vextin8 47 pld [r2] 48 vld1.8 {q11}, [r2], r3 49 vext.8 d16, d22, d23, #1 50 vext.8 d17, d22, d23, #2 51 vext.8 d18, d22, d23, #3 52 vext.8 d19, d22, d23, #4 53 vext.8 d20, d22, d23, #5 54 vext.8 d21, d22, d23, #6 55 vext.8 d22, d22, d23, #7 56.endm 57 58.macro loadin8 59 pld [r2] 60 vld1.8 {d16}, [r2], r3 61 pld [r2] 62 vld1.8 {d17}, [r2], r3 63 pld [r2] 64 vld1.8 {d18}, [r2], r3 65 pld [r2] 66 vld1.8 {d19}, [r2], r3 67 pld [r2] 68 vld1.8 {d20}, [r2], r3 69 pld [r2] 70 vld1.8 {d21}, [r2], r3 71 pld [r2] 72 vld1.8 {d22}, [r2], r3 73 pld [r2] 74 vld1.8 {d23}, [r2], r3 75.endm 76 77.macro qpel_filter_1_32b 78 vmov.i16 d16, #58 79 vmov.i16 d17, #10 80 vmull.s16 q9, d6, d16 // 58 * d0 81 vmull.s16 q10, d7, d16 // 58 * d1 82 vmov.i16 d16, #17 83 vmull.s16 q11, d4, d17 // 10 * c0 84 vmull.s16 q12, d5, d17 // 10 * c1 85 vmov.i16 d17, #5 86 vmull.s16 q13, d8, d16 // 17 * e0 87 vmull.s16 q14, d9, d16 // 17 * e1 88 vmull.s16 q15, d10, d17 // 5 * f0 89 vmull.s16 q8, d11, d17 // 5 * f1 90 vsub.s32 q9, q11 // 58 * d0 - 10 * c0 91 vsub.s32 q10, q12 // 58 * d1 - 10 * c1 92 vshll.s16 q11, d2, #2 // 4 * b0 93 vshll.s16 q12, d3, #2 // 4 * b1 94 vadd.s32 q9, q13 // 58 * d0 - 10 * c0 + 17 * e0 95 vadd.s32 q10, q14 // 58 * d1 - 10 * c1 + 17 * e1 96 vsubl.s16 q13, d12, d0 // g0 - a0 97 vsubl.s16 q14, d13, d1 // g1 - a1 98 vadd.s32 q9, q11 // 58 * d0 - 10 * c0 + 17 * e0 + 4 * b0 99 vadd.s32 q10, q12 // 58 * d1 - 10 * c1 + 17 * e1 + 4 * b1 100 vsub.s32 q13, q15 // g0 - a0 - 5 * f0 101 vsub.s32 q14, q8 // g1 - a1 - 5 * f1 102 vadd.s32 q9, q13 // 58 * d0 - 10 * c0 + 17 * e0 + 4 * b0 + g0 - a0 - 5 * f0 103 vadd.s32 q10, q14 // 58 * d1 - 10 * c1 + 17 * e1 + 4 * b1 + g1 - a1 - 5 * f1 104 vqshrn.s32 d16, q9, #6 105 vqshrn.s32 d17, q10, #6 106.endm 107 108// input q0 - q7 109// output q8 110.macro qpel_filter_2_32b 111 vmov.i32 q8, #11 112 vaddl.s16 q9, d6, d8 // d0 + e0 113 vaddl.s16 q10, d7, d9 // d1 + e1 114 vaddl.s16 q11, d4, d10 // c0 + f0 115 vaddl.s16 q12, d5, d11 // c1 + f1 116 vmul.s32 q11, q8 // 11 * (c0 + f0) 117 vmul.s32 q12, q8 // 11 * (c1 + f1) 118 vmov.i32 q8, #40 119 vaddl.s16 q15, d2, d12 // b0 + g0 120 vmul.s32 q9, q8 // 40 * (d0 + e0) 121 vmul.s32 q10, q8 // 40 * (d1 + e1) 122 vaddl.s16 q8, d3, d13 // b1 + g1 123 vaddl.s16 q13, d0, d14 // a0 + h0 124 vaddl.s16 q14, d1, d15 // a1 + h1 125 vshl.s32 q15, #2 // 4*(b0+g0) 126 vshl.s32 q8, #2 // 4*(b1+g1) 127 vadd.s32 q11, q13 // 11 * (c0 + f0) + a0 + h0 128 vadd.s32 q12, q14 // 11 * (c1 + f1) + a1 + h1 129 vadd.s32 q9, q15 // 40 * (d0 + e0) + 4*(b0+g0) 130 vadd.s32 q10, q8 // 40 * (d1 + e1) + 4*(b1+g1) 131 vsub.s32 q9, q11 // 40 * (d0 + e0) + 4*(b0+g0) - (11 * (c0 + f0) + a0 + h0) 132 vsub.s32 q10, q12 // 40 * (d1 + e1) + 4*(b1+g1) - (11 * (c1 + f1) + a1 + h1) 133 vqshrn.s32 d16, q9, #6 134 vqshrn.s32 d17, q10, #6 135.endm 136 137.macro qpel_filter_3_32b 138 vmov.i16 d16, #58 139 vmov.i16 d17, #10 140 vmull.s16 q9, d8, d16 // 58 * d0 141 vmull.s16 q10, d9, d16 // 58 * d1 142 vmov.i16 d16, #17 143 vmull.s16 q11, d10, d17 // 10 * c0 144 vmull.s16 q12, d11, d17 // 10 * c1 145 vmov.i16 d17, #5 146 vmull.s16 q13, d6, d16 // 17 * e0 147 vmull.s16 q14, d7, d16 // 17 * e1 148 vmull.s16 q15, d4, d17 // 5 * f0 149 vmull.s16 q8, d5, d17 // 5 * f1 150 vsub.s32 q9, q11 // 58 * d0 - 10 * c0 151 vsub.s32 q10, q12 // 58 * d1 - 10 * c1 152 vshll.s16 q11, d12, #2 // 4 * b0 153 vshll.s16 q12, d13, #2 // 4 * b1 154 vadd.s32 q9, q13 // 58 * d0 - 10 * c0 + 17 * e0 155 vadd.s32 q10, q14 // 58 * d1 - 10 * c1 + 17 * e1 156 vsubl.s16 q13, d2, d14 // g0 - a0 157 vsubl.s16 q14, d3, d15 // g1 - a1 158 vadd.s32 q9, q11 // 58 * d0 - 10 * c0 + 17 * e0 + 4 * b0 159 vadd.s32 q10, q12 // 58 * d1 - 10 * c1 + 17 * e1 + 4 * b1 160 vsub.s32 q13, q15 // g0 - a0 - 5 * f0 161 vsub.s32 q14, q8 // g1 - a1 - 5 * f1 162 vadd.s32 q9, q13 // 58 * d0 - 10 * c0 + 17 * e0 + 4 * b0 + g0 - a0 - 5 * f0 163 vadd.s32 q10, q14 // 58 * d1 - 10 * c1 + 17 * e1 + 4 * b1 + g1 - a1 - 5 * f1 164 vqshrn.s32 d16, q9, #6 165 vqshrn.s32 d17, q10, #6 166.endm 167 168.macro qpel_filter_1 out=q7 169 vmov.u8 d24, #58 170 vmov.u8 d25, #10 171 vshll.u8 q13, d20, #4 // 16*e 172 vshll.u8 q14, d21, #2 // 4*f 173 vmull.u8 \out, d19, d24 // 58*d 174 vaddw.u8 q13, q13, d20 // 17*e 175 vmull.u8 q15, d18, d25 // 10*c 176 vaddw.u8 q14, q14, d21 // 5*f 177 vsubl.u8 q12, d22, d16 // g - a 178 vadd.u16 \out, q13 // 58d + 17e 179 vshll.u8 q13, d17, #2 // 4*b 180 vadd.u16 q15, q14 // 10*c + 5*f 181 vadd.s16 q13, q12 // - a + 4*b + g 182 vsub.s16 \out, q15 // -10*c + 58*d + 17*e -5*f 183 vadd.s16 \out, q13 // -a + 4*b -10*c + 58*d + 17*e -5*f 184.endm 185 186.macro qpel_filter_2 out=q7 187 vmov.i16 q12, #10 188 vmov.i16 q14, #11 189 vaddl.u8 q13, d19, d20 // d + e 190 vaddl.u8 q15, d18, d21 // c + f 191 vmul.u16 q13, q12 // 10 * (d+e) 192 vmul.u16 q15, q14 // 11 * ( c + f) 193 vaddl.u8 \out, d17, d22 // b + g 194 vaddl.u8 q12, d16, d23 // a + h 195 vadd.u16 \out, q13 // b + 10 * (d + e) + g 196 vadd.s16 q12, q15 197 vshl.u16 \out, #2 // 4 * (b + 10 * (d + e) + g) 198 vsub.s16 \out, q12 199.endm 200 201.macro qpel_filter_3 out=q7 202 vmov.u8 d24, #58 203 vmov.u8 d25, #10 204 vshll.u8 q13, d19, #4 // 16*e 205 vshll.u8 q14, d18, #2 // 4*f 206 vmull.u8 \out, d20, d24 // 58*d 207 vaddw.u8 q13, q13, d19 // 17*e 208 vmull.u8 q15, d21, d25 // 10*c 209 vaddw.u8 q14, q14, d18 // 5*f 210 vsubl.u8 q12, d17, d23 // g - a 211 vadd.u16 \out, q13 // 58d + 17e 212 vshll.u8 q13, d22, #2 // 4*b 213 vadd.u16 q15, q14 // 10*c + 5*f 214 vadd.s16 q13, q12 // - a + 4*b + g 215 vsub.s16 \out, q15 // -10*c + 58*d + 17*e -5*f 216 vadd.s16 \out, q13 // -a + 4*b -10*c + 58*d + 17*e -5*f 217.endm 218 219.macro hevc_put_qpel_vX_neon_8 filter 220 push {r4, r5, r6, r7} 221 ldr r4, [sp, #16] // height 222 ldr r5, [sp, #20] // width 223 vpush {d8-d15} 224 sub r2, r2, r3, lsl #1 225 sub r2, r3 226 mov r12, r4 227 mov r6, r0 228 mov r7, r2 229 lsl r1, #1 2300: loadin8 231 cmp r5, #4 232 beq 4f 2338: subs r4, #1 234 \filter 235 vst1.16 {q7}, [r0], r1 236 regshuffle_d8 237 vld1.8 {d23}, [r2], r3 238 bne 8b 239 subs r5, #8 240 beq 99f 241 mov r4, r12 242 add r6, #16 243 mov r0, r6 244 add r7, #8 245 mov r2, r7 246 b 0b 2474: subs r4, #1 248 \filter 249 vst1.16 d14, [r0], r1 250 regshuffle_d8 251 vld1.32 {d23[0]}, [r2], r3 252 bne 4b 25399: vpop {d8-d15} 254 pop {r4, r5, r6, r7} 255 bx lr 256.endm 257 258.macro hevc_put_qpel_uw_vX_neon_8 filter 259 push {r4-r10} 260 ldr r5, [sp, #28] // width 261 ldr r4, [sp, #32] // height 262 ldr r8, [sp, #36] // src2 263 ldr r9, [sp, #40] // src2stride 264 vpush {d8-d15} 265 sub r2, r2, r3, lsl #1 266 sub r2, r3 267 mov r12, r4 268 mov r6, r0 269 mov r7, r2 270 cmp r8, #0 271 bne .Lbi\@ 2720: loadin8 273 cmp r5, #4 274 beq 4f 2758: subs r4, #1 276 \filter 277 vqrshrun.s16 d0, q7, #6 278 vst1.8 d0, [r0], r1 279 regshuffle_d8 280 vld1.8 {d23}, [r2], r3 281 bne 8b 282 subs r5, #8 283 beq 99f 284 mov r4, r12 285 add r6, #8 286 mov r0, r6 287 add r7, #8 288 mov r2, r7 289 b 0b 2904: subs r4, #1 291 \filter 292 vqrshrun.s16 d0, q7, #6 293 vst1.32 d0[0], [r0], r1 294 regshuffle_d8 295 vld1.32 {d23[0]}, [r2], r3 296 bne 4b 297 b 99f 298.Lbi\@: lsl r9, #1 299 mov r10, r8 3000: loadin8 301 cmp r5, #4 302 beq 4f 3038: subs r4, #1 304 \filter 305 vld1.16 {q0}, [r8], r9 306 vqadd.s16 q0, q7 307 vqrshrun.s16 d0, q0, #7 308 vst1.8 d0, [r0], r1 309 regshuffle_d8 310 vld1.8 {d23}, [r2], r3 311 bne 8b 312 subs r5, #8 313 beq 99f 314 mov r4, r12 315 add r6, #8 316 mov r0, r6 317 add r10, #16 318 mov r8, r10 319 add r7, #8 320 mov r2, r7 321 b 0b 3224: subs r4, #1 323 \filter 324 vld1.16 d0, [r8], r9 325 vqadd.s16 d0, d14 326 vqrshrun.s16 d0, q0, #7 327 vst1.32 d0[0], [r0], r1 328 regshuffle_d8 329 vld1.32 {d23[0]}, [r2], r3 330 bne 4b 33199: vpop {d8-d15} 332 pop {r4-r10} 333 bx lr 334.endm 335 336function ff_hevc_put_qpel_v1_neon_8, export=1 337 hevc_put_qpel_vX_neon_8 qpel_filter_1 338endfunc 339 340function ff_hevc_put_qpel_v2_neon_8, export=1 341 hevc_put_qpel_vX_neon_8 qpel_filter_2 342endfunc 343 344function ff_hevc_put_qpel_v3_neon_8, export=1 345 hevc_put_qpel_vX_neon_8 qpel_filter_3 346endfunc 347 348 349function ff_hevc_put_qpel_uw_v1_neon_8, export=1 350 hevc_put_qpel_uw_vX_neon_8 qpel_filter_1 351endfunc 352 353function ff_hevc_put_qpel_uw_v2_neon_8, export=1 354 hevc_put_qpel_uw_vX_neon_8 qpel_filter_2 355endfunc 356 357function ff_hevc_put_qpel_uw_v3_neon_8, export=1 358 hevc_put_qpel_uw_vX_neon_8 qpel_filter_3 359endfunc 360 361.macro hevc_put_qpel_hX_neon_8 filter 362 push {r4, r5, r6, r7} 363 ldr r4, [sp, #16] // height 364 ldr r5, [sp, #20] // width 365 366 vpush {d8-d15} 367 sub r2, #4 368 lsl r1, #1 369 mov r12, r4 370 mov r6, r0 371 mov r7, r2 372 cmp r5, #4 373 beq 4f 3748: subs r4, #1 375 vextin8 376 \filter 377 vst1.16 {q7}, [r0], r1 378 bne 8b 379 subs r5, #8 380 beq 99f 381 mov r4, r12 382 add r6, #16 383 mov r0, r6 384 add r7, #8 385 mov r2, r7 386 cmp r5, #4 387 bne 8b 3884: subs r4, #1 389 vextin8 390 \filter 391 vst1.16 d14, [r0], r1 392 bne 4b 39399: vpop {d8-d15} 394 pop {r4, r5, r6, r7} 395 bx lr 396.endm 397 398.macro hevc_put_qpel_uw_hX_neon_8 filter 399 push {r4-r10} 400 ldr r5, [sp, #28] // width 401 ldr r4, [sp, #32] // height 402 ldr r8, [sp, #36] // src2 403 ldr r9, [sp, #40] // src2stride 404 vpush {d8-d15} 405 sub r2, #4 406 mov r12, r4 407 mov r6, r0 408 mov r7, r2 409 cmp r8, #0 410 bne .Lbi\@ 411 cmp r5, #4 412 beq 4f 4138: subs r4, #1 414 vextin8 415 \filter 416 vqrshrun.s16 d0, q7, #6 417 vst1.8 d0, [r0], r1 418 bne 8b 419 subs r5, #8 420 beq 99f 421 mov r4, r12 422 add r6, #8 423 mov r0, r6 424 add r7, #8 425 mov r2, r7 426 cmp r5, #4 427 bne 8b 4284: subs r4, #1 429 vextin8 430 \filter 431 vqrshrun.s16 d0, q7, #6 432 vst1.32 d0[0], [r0], r1 433 bne 4b 434 b 99f 435.Lbi\@: 436 lsl r9, #1 437 cmp r5, #4 438 beq 4f 439 mov r10, r8 4408: subs r4, #1 441 vextin8 442 \filter 443 vld1.16 {q0}, [r8], r9 444 vqadd.s16 q0, q7 445 vqrshrun.s16 d0, q0, #7 446 vst1.8 d0, [r0], r1 447 bne 8b 448 subs r5, #8 449 beq 99f 450 mov r4, r12 451 add r6, #8 452 add r10, #16 453 mov r8, r10 454 mov r0, r6 455 add r7, #8 456 mov r2, r7 457 cmp r5, #4 458 bne 8b 4594: subs r4, #1 460 vextin8 461 \filter 462 vld1.16 d0, [r8], r9 463 vqadd.s16 d0, d14 464 vqrshrun.s16 d0, q0, #7 465 vst1.32 d0[0], [r0], r1 466 bne 4b 46799: vpop {d8-d15} 468 pop {r4-r10} 469 bx lr 470.endm 471 472function ff_hevc_put_qpel_h1_neon_8, export=1 473 hevc_put_qpel_hX_neon_8 qpel_filter_1 474endfunc 475 476function ff_hevc_put_qpel_h2_neon_8, export=1 477 hevc_put_qpel_hX_neon_8 qpel_filter_2 478endfunc 479 480function ff_hevc_put_qpel_h3_neon_8, export=1 481 hevc_put_qpel_hX_neon_8 qpel_filter_3 482endfunc 483 484 485function ff_hevc_put_qpel_uw_h1_neon_8, export=1 486 hevc_put_qpel_uw_hX_neon_8 qpel_filter_1 487endfunc 488 489function ff_hevc_put_qpel_uw_h2_neon_8, export=1 490 hevc_put_qpel_uw_hX_neon_8 qpel_filter_2 491endfunc 492 493function ff_hevc_put_qpel_uw_h3_neon_8, export=1 494 hevc_put_qpel_uw_hX_neon_8 qpel_filter_3 495endfunc 496 497.macro hevc_put_qpel_hXvY_neon_8 filterh filterv 498 push {r4, r5, r6, r7} 499 ldr r4, [sp, #16] // height 500 ldr r5, [sp, #20] // width 501 502 vpush {d8-d15} 503 sub r2, #4 504 sub r2, r2, r3, lsl #1 505 sub r2, r3 // extra_before 3 506 lsl r1, #1 507 mov r12, r4 508 mov r6, r0 509 mov r7, r2 5100: vextin8 511 \filterh q0 512 vextin8 513 \filterh q1 514 vextin8 515 \filterh q2 516 vextin8 517 \filterh q3 518 vextin8 519 \filterh q4 520 vextin8 521 \filterh q5 522 vextin8 523 \filterh q6 524 vextin8 525 \filterh q7 526 cmp r5, #4 527 beq 4f 5288: subs r4, #1 529 \filterv 530 vst1.16 {q8}, [r0], r1 531 regshuffle_q8 532 vextin8 533 \filterh q7 534 bne 8b 535 subs r5, #8 536 beq 99f 537 mov r4, r12 538 add r6, #16 539 mov r0, r6 540 add r7, #8 541 mov r2, r7 542 b 0b 5434: subs r4, #1 544 \filterv 545 vst1.16 d16, [r0], r1 546 regshuffle_q8 547 vextin8 548 \filterh q7 549 bne 4b 55099: vpop {d8-d15} 551 pop {r4, r5, r6, r7} 552 bx lr 553.endm 554 555.macro hevc_put_qpel_uw_hXvY_neon_8 filterh filterv 556 push {r4-r10} 557 ldr r5, [sp, #28] // width 558 ldr r4, [sp, #32] // height 559 ldr r8, [sp, #36] // src2 560 ldr r9, [sp, #40] // src2stride 561 vpush {d8-d15} 562 sub r2, #4 563 sub r2, r2, r3, lsl #1 564 sub r2, r3 // extra_before 3 565 mov r12, r4 566 mov r6, r0 567 mov r7, r2 568 cmp r8, #0 569 bne .Lbi\@ 5700: vextin8 571 \filterh q0 572 vextin8 573 \filterh q1 574 vextin8 575 \filterh q2 576 vextin8 577 \filterh q3 578 vextin8 579 \filterh q4 580 vextin8 581 \filterh q5 582 vextin8 583 \filterh q6 584 vextin8 585 \filterh q7 586 cmp r5, #4 587 beq 4f 5888: subs r4, #1 589 \filterv 590 vqrshrun.s16 d0, q8, #6 591 vst1.8 d0, [r0], r1 592 regshuffle_q8 593 vextin8 594 \filterh q7 595 bne 8b 596 subs r5, #8 597 beq 99f 598 mov r4, r12 599 add r6, #8 600 mov r0, r6 601 add r7, #8 602 mov r2, r7 603 b 0b 6044: subs r4, #1 605 \filterv 606 vqrshrun.s16 d0, q8, #6 607 vst1.32 d0[0], [r0], r1 608 regshuffle_q8 609 vextin8 610 \filterh q7 611 bne 4b 612 b 99f 613.Lbi\@: lsl r9, #1 614 mov r10, r8 6150: vextin8 616 \filterh q0 617 vextin8 618 \filterh q1 619 vextin8 620 \filterh q2 621 vextin8 622 \filterh q3 623 vextin8 624 \filterh q4 625 vextin8 626 \filterh q5 627 vextin8 628 \filterh q6 629 vextin8 630 \filterh q7 631 cmp r5, #4 632 beq 4f 6338: subs r4, #1 634 \filterv 635 vld1.16 {q0}, [r8], r9 636 vqadd.s16 q0, q8 637 vqrshrun.s16 d0, q0, #7 638 vst1.8 d0, [r0], r1 639 regshuffle_q8 640 vextin8 641 \filterh q7 642 bne 8b 643 subs r5, #8 644 beq 99f 645 mov r4, r12 646 add r6, #8 647 mov r0, r6 648 add r10, #16 649 mov r8, r10 650 add r7, #8 651 mov r2, r7 652 b 0b 6534: subs r4, #1 654 \filterv 655 vld1.16 d0, [r8], r9 656 vqadd.s16 d0, d16 657 vqrshrun.s16 d0, q0, #7 658 vst1.32 d0[0], [r0], r1 659 regshuffle_q8 660 vextin8 661 \filterh q7 662 bne 4b 66399: vpop {d8-d15} 664 pop {r4-r10} 665 bx lr 666.endm 667 668 669function ff_hevc_put_qpel_h1v1_neon_8, export=1 670 hevc_put_qpel_hXvY_neon_8 qpel_filter_1, qpel_filter_1_32b 671endfunc 672 673function ff_hevc_put_qpel_h2v1_neon_8, export=1 674 hevc_put_qpel_hXvY_neon_8 qpel_filter_2, qpel_filter_1_32b 675endfunc 676 677function ff_hevc_put_qpel_h3v1_neon_8, export=1 678 hevc_put_qpel_hXvY_neon_8 qpel_filter_3, qpel_filter_1_32b 679endfunc 680 681function ff_hevc_put_qpel_h1v2_neon_8, export=1 682 hevc_put_qpel_hXvY_neon_8 qpel_filter_1, qpel_filter_2_32b 683endfunc 684 685function ff_hevc_put_qpel_h2v2_neon_8, export=1 686 hevc_put_qpel_hXvY_neon_8 qpel_filter_2, qpel_filter_2_32b 687endfunc 688 689function ff_hevc_put_qpel_h3v2_neon_8, export=1 690 hevc_put_qpel_hXvY_neon_8 qpel_filter_3, qpel_filter_2_32b 691endfunc 692 693function ff_hevc_put_qpel_h1v3_neon_8, export=1 694 hevc_put_qpel_hXvY_neon_8 qpel_filter_1, qpel_filter_3_32b 695endfunc 696 697function ff_hevc_put_qpel_h2v3_neon_8, export=1 698 hevc_put_qpel_hXvY_neon_8 qpel_filter_2, qpel_filter_3_32b 699endfunc 700 701function ff_hevc_put_qpel_h3v3_neon_8, export=1 702 hevc_put_qpel_hXvY_neon_8 qpel_filter_3, qpel_filter_3_32b 703endfunc 704 705 706function ff_hevc_put_qpel_uw_h1v1_neon_8, export=1 707 hevc_put_qpel_uw_hXvY_neon_8 qpel_filter_1, qpel_filter_1_32b 708endfunc 709 710function ff_hevc_put_qpel_uw_h2v1_neon_8, export=1 711 hevc_put_qpel_uw_hXvY_neon_8 qpel_filter_2, qpel_filter_1_32b 712endfunc 713 714function ff_hevc_put_qpel_uw_h3v1_neon_8, export=1 715 hevc_put_qpel_uw_hXvY_neon_8 qpel_filter_3, qpel_filter_1_32b 716endfunc 717 718function ff_hevc_put_qpel_uw_h1v2_neon_8, export=1 719 hevc_put_qpel_uw_hXvY_neon_8 qpel_filter_1, qpel_filter_2_32b 720endfunc 721 722function ff_hevc_put_qpel_uw_h2v2_neon_8, export=1 723 hevc_put_qpel_uw_hXvY_neon_8 qpel_filter_2, qpel_filter_2_32b 724endfunc 725 726function ff_hevc_put_qpel_uw_h3v2_neon_8, export=1 727 hevc_put_qpel_uw_hXvY_neon_8 qpel_filter_3, qpel_filter_2_32b 728endfunc 729 730function ff_hevc_put_qpel_uw_h1v3_neon_8, export=1 731 hevc_put_qpel_uw_hXvY_neon_8 qpel_filter_1, qpel_filter_3_32b 732endfunc 733 734function ff_hevc_put_qpel_uw_h2v3_neon_8, export=1 735 hevc_put_qpel_uw_hXvY_neon_8 qpel_filter_2, qpel_filter_3_32b 736endfunc 737 738function ff_hevc_put_qpel_uw_h3v3_neon_8, export=1 739 hevc_put_qpel_uw_hXvY_neon_8 qpel_filter_3, qpel_filter_3_32b 740endfunc 741 742.macro init_put_pixels 743 pld [r1] 744 pld [r1, r2] 745 mov r12, MAX_PB_SIZE 746 lsl r12, #1 747.endm 748 749function ff_hevc_put_pixels_w2_neon_8, export=1 750 init_put_pixels 751 vmov.u8 d5, #255 752 vshr.u64 d5, #32 7530: subs r3, #1 754 vld1.32 {d0[0]}, [r1], r2 755 pld [r1] 756 vld1.32 d6, [r0] 757 vshll.u8 q0, d0, #6 758 vbit d6, d0, d5 759 vst1.32 d6, [r0], r12 760 bne 0b 761 bx lr 762endfunc 763 764function ff_hevc_put_pixels_w4_neon_8, export=1 765 init_put_pixels 7660: subs r3, #2 767 vld1.32 {d0[0]}, [r1], r2 768 vld1.32 {d0[1]}, [r1], r2 769 pld [r1] 770 pld [r1, r2] 771 vshll.u8 q0, d0, #6 772 vst1.64 {d0}, [r0], r12 773 vst1.64 {d1}, [r0], r12 774 bne 0b 775 bx lr 776endfunc 777 778function ff_hevc_put_pixels_w6_neon_8, export=1 779 init_put_pixels 780 vmov.u8 q10, #255 781 vshr.u64 d21, #32 7820: subs r3, #1 783 vld1.16 {d0}, [r1], r2 784 pld [r1] 785 vshll.u8 q0, d0, #6 786 vld1.8 {q12}, [r0] 787 vbit q12, q0, q10 788 vst1.8 {q12}, [r0], r12 789 bne 0b 790 bx lr 791endfunc 792 793function ff_hevc_put_pixels_w8_neon_8, export=1 794 init_put_pixels 7950: subs r3, #2 796 vld1.8 {d0}, [r1], r2 797 vld1.8 {d2}, [r1], r2 798 pld [r1] 799 pld [r1, r2] 800 vshll.u8 q0, d0, #6 801 vshll.u8 q1, d2, #6 802 vst1.16 {q0}, [r0], r12 803 vst1.16 {q1}, [r0], r12 804 bne 0b 805 bx lr 806endfunc 807 808function ff_hevc_put_pixels_w12_neon_8, export=1 809 init_put_pixels 8100: subs r3, #2 811 vld1.64 {d0}, [r1] 812 add r1, #8 813 vld1.32 {d1[0]}, [r1], r2 814 sub r1, #8 815 vld1.64 {d2}, [r1] 816 add r1, #8 817 vld1.32 {d1[1]}, [r1], r2 818 sub r1, #8 819 pld [r1] 820 pld [r1, r2] 821 vshll.u8 q8, d0, #6 822 vshll.u8 q9, d1, #6 823 vshll.u8 q10, d2, #6 824 vmov d22, d19 825 vst1.64 {d16, d17, d18}, [r0], r12 826 vst1.64 {d20, d21, d22}, [r0], r12 827 bne 0b 828 bx lr 829endfunc 830 831function ff_hevc_put_pixels_w16_neon_8, export=1 832 init_put_pixels 8330: subs r3, #2 834 vld1.8 {q0}, [r1], r2 835 vld1.8 {q1}, [r1], r2 836 pld [r1] 837 pld [r1, r2] 838 vshll.u8 q8, d0, #6 839 vshll.u8 q9, d1, #6 840 vshll.u8 q10, d2, #6 841 vshll.u8 q11, d3, #6 842 vst1.8 {q8, q9}, [r0], r12 843 vst1.8 {q10, q11}, [r0], r12 844 bne 0b 845 bx lr 846endfunc 847 848function ff_hevc_put_pixels_w24_neon_8, export=1 849 init_put_pixels 8500: subs r3, #1 851 vld1.8 {d0, d1, d2}, [r1], r2 852 pld [r1] 853 vshll.u8 q10, d0, #6 854 vshll.u8 q11, d1, #6 855 vshll.u8 q12, d2, #6 856 vstm r0, {q10, q11, q12} 857 add r0, r12 858 bne 0b 859 bx lr 860endfunc 861 862function ff_hevc_put_pixels_w32_neon_8, export=1 863 init_put_pixels 8640: subs r3, #1 865 vld1.8 {q0, q1}, [r1], r2 866 pld [r1] 867 vshll.u8 q8, d0, #6 868 vshll.u8 q9, d1, #6 869 vshll.u8 q10, d2, #6 870 vshll.u8 q11, d3, #6 871 vstm r0, {q8, q9, q10, q11} 872 add r0, r12 873 bne 0b 874 bx lr 875endfunc 876 877function ff_hevc_put_pixels_w48_neon_8, export=1 878 init_put_pixels 8790: subs r3, #1 880 vld1.8 {q0, q1}, [r1] 881 add r1, #32 882 vld1.8 {q2}, [r1], r2 883 sub r1, #32 884 pld [r1] 885 vshll.u8 q8, d0, #6 886 vshll.u8 q9, d1, #6 887 vshll.u8 q10, d2, #6 888 vshll.u8 q11, d3, #6 889 vshll.u8 q12, d4, #6 890 vshll.u8 q13, d5, #6 891 vstm r0, {q8, q9, q10, q11, q12, q13} 892 add r0, r12 893 bne 0b 894 bx lr 895endfunc 896 897function ff_hevc_put_pixels_w64_neon_8, export=1 898 init_put_pixels 8990: subs r3, #1 900 vld1.8 {q0, q1}, [r1] 901 add r1, #32 902 vld1.8 {q2, q3}, [r1], r2 903 sub r1, #32 904 pld [r1] 905 vshll.u8 q8, d0, #6 906 vshll.u8 q9, d1, #6 907 vshll.u8 q10, d2, #6 908 vshll.u8 q11, d3, #6 909 vshll.u8 q12, d4, #6 910 vshll.u8 q13, d5, #6 911 vshll.u8 q14, d6, #6 912 vshll.u8 q15, d7, #6 913 vstm r0, {q8, q9, q10, q11, q12, q13, q14, q15} 914 add r0, r12 915 bne 0b 916 bx lr 917endfunc 918 919function ff_hevc_put_qpel_uw_pixels_neon_8, export=1 920 push {r4-r9} 921 ldr r5, [sp, #24] // width 922 ldr r4, [sp, #28] // height 923 ldr r8, [sp, #32] // src2 924 ldr r9, [sp, #36] // src2stride 925 vpush {d8-d15} 926 cmp r8, #0 927 bne 2f 9281: subs r4, #1 929 vld1.8 {d0}, [r2], r3 930 vst1.8 d0, [r0], r1 931 bne 1b 932 vpop {d8-d15} 933 pop {r4-r9} 934 bx lr 9352: subs r4, #1 936 vld1.8 {d0}, [r2], r3 937 vld1.16 {q1}, [r8], r9 938 vshll.u8 q0, d0, #6 939 vqadd.s16 q0, q1 940 vqrshrun.s16 d0, q0, #7 941 vst1.8 d0, [r0], r1 942 bne 2b 943 vpop {d8-d15} 944 pop {r4-r9} 945 bx lr 946endfunc 947 948.macro put_qpel_uw_pixels width, regs, regs2, regs3, regs4 949function ff_hevc_put_qpel_uw_pixels_w\width\()_neon_8, export=1 950 ldr r12, [sp] // height 9511: subs r12, #4 952 vld1.32 {\regs} , [r2], r3 953 vld1.32 {\regs2} , [r2], r3 954 vld1.32 {\regs3} , [r2], r3 955 vld1.32 {\regs4} , [r2], r3 956 vst1.32 {\regs} , [r0], r1 957 vst1.32 {\regs2} , [r0], r1 958 vst1.32 {\regs3} , [r0], r1 959 vst1.32 {\regs4} , [r0], r1 960 bne 1b 961 bx lr 962endfunc 963.endm 964 965.macro put_qpel_uw_pixels_m width, regs, regs2, regs3, regs4 966function ff_hevc_put_qpel_uw_pixels_w\width\()_neon_8, export=1 967 push {r4-r5} 968 ldr r12, [sp, #8] // height 9691: subs r12, #2 970 mov r4, r2 971 vld1.32 {\regs} , [r2]! 972 vld1.32 {\regs2} , [r2] 973 add r2, r4, r3 974 mov r4, r2 975 vld1.32 {\regs3} , [r2]! 976 vld1.32 {\regs4} , [r2] 977 add r2, r4, r3 978 mov r5, r0 979 vst1.32 {\regs} , [r0]! 980 vst1.32 {\regs2} , [r0] 981 add r0, r5, r1 982 mov r5, r0 983 vst1.32 {\regs3} , [r0]! 984 vst1.32 {\regs4} , [r0] 985 add r0, r5, r1 986 bne 1b 987 pop {r4-r5} 988 bx lr 989endfunc 990.endm 991 992put_qpel_uw_pixels 4, d0[0], d0[1], d1[0], d1[1] 993put_qpel_uw_pixels 8, d0, d1, d2, d3 994put_qpel_uw_pixels_m 12, d0, d1[0], d2, d3[0] 995put_qpel_uw_pixels 16, q0, q1, q2, q3 996put_qpel_uw_pixels 24, d0-d2, d3-d5, d16-d18, d19-d21 997put_qpel_uw_pixels 32, q0-q1, q2-q3, q8-q9, q10-q11 998put_qpel_uw_pixels_m 48, q0-q1, q2, q8-q9, q10 999put_qpel_uw_pixels_m 64, q0-q1, q2-q3, q8-q9, q10-q11 1000