1 ; 2 ; Copyright (c) 2013 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 |vp9_lpf_horizontal_16_neon| 12 EXPORT |vp9_lpf_vertical_16_neon| 13 ARM 14 15 AREA ||.text||, CODE, READONLY, ALIGN=2 16 17 ; void vp9_lpf_horizontal_16_neon(uint8_t *s, int p, 18 ; const uint8_t *blimit, 19 ; const uint8_t *limit, 20 ; const uint8_t *thresh 21 ; int count) 22 ; r0 uint8_t *s, 23 ; r1 int p, /* pitch */ 24 ; r2 const uint8_t *blimit, 25 ; r3 const uint8_t *limit, 26 ; sp const uint8_t *thresh, 27 |vp9_lpf_horizontal_16_neon| PROC 28 push {r4-r8, lr} 29 vpush {d8-d15} 30 ldr r4, [sp, #88] ; load thresh 31 ldr r12, [sp, #92] ; load count 32 33 h_count 34 vld1.8 {d16[]}, [r2] ; load *blimit 35 vld1.8 {d17[]}, [r3] ; load *limit 36 vld1.8 {d18[]}, [r4] ; load *thresh 37 38 sub r8, r0, r1, lsl #3 ; move src pointer down by 8 lines 39 40 vld1.u8 {d0}, [r8@64], r1 ; p7 41 vld1.u8 {d1}, [r8@64], r1 ; p6 42 vld1.u8 {d2}, [r8@64], r1 ; p5 43 vld1.u8 {d3}, [r8@64], r1 ; p4 44 vld1.u8 {d4}, [r8@64], r1 ; p3 45 vld1.u8 {d5}, [r8@64], r1 ; p2 46 vld1.u8 {d6}, [r8@64], r1 ; p1 47 vld1.u8 {d7}, [r8@64], r1 ; p0 48 vld1.u8 {d8}, [r8@64], r1 ; q0 49 vld1.u8 {d9}, [r8@64], r1 ; q1 50 vld1.u8 {d10}, [r8@64], r1 ; q2 51 vld1.u8 {d11}, [r8@64], r1 ; q3 52 vld1.u8 {d12}, [r8@64], r1 ; q4 53 vld1.u8 {d13}, [r8@64], r1 ; q5 54 vld1.u8 {d14}, [r8@64], r1 ; q6 55 vld1.u8 {d15}, [r8@64], r1 ; q7 56 57 bl vp9_wide_mbfilter_neon 58 59 tst r7, #1 60 beq h_mbfilter 61 62 ; flat && mask were not set for any of the channels. Just store the values 63 ; from filter. 64 sub r8, r0, r1, lsl #1 65 66 vst1.u8 {d25}, [r8@64], r1 ; store op1 67 vst1.u8 {d24}, [r8@64], r1 ; store op0 68 vst1.u8 {d23}, [r8@64], r1 ; store oq0 69 vst1.u8 {d26}, [r8@64], r1 ; store oq1 70 71 b h_next 72 73 h_mbfilter 74 tst r7, #2 75 beq h_wide_mbfilter 76 77 ; flat2 was not set for any of the channels. Just store the values from 78 ; mbfilter. 79 sub r8, r0, r1, lsl #1 80 sub r8, r8, r1 81 82 vst1.u8 {d18}, [r8@64], r1 ; store op2 83 vst1.u8 {d19}, [r8@64], r1 ; store op1 84 vst1.u8 {d20}, [r8@64], r1 ; store op0 85 vst1.u8 {d21}, [r8@64], r1 ; store oq0 86 vst1.u8 {d22}, [r8@64], r1 ; store oq1 87 vst1.u8 {d23}, [r8@64], r1 ; store oq2 88 89 b h_next 90 91 h_wide_mbfilter 92 sub r8, r0, r1, lsl #3 93 add r8, r8, r1 94 95 vst1.u8 {d16}, [r8@64], r1 ; store op6 96 vst1.u8 {d24}, [r8@64], r1 ; store op5 97 vst1.u8 {d25}, [r8@64], r1 ; store op4 98 vst1.u8 {d26}, [r8@64], r1 ; store op3 99 vst1.u8 {d27}, [r8@64], r1 ; store op2 100 vst1.u8 {d18}, [r8@64], r1 ; store op1 101 vst1.u8 {d19}, [r8@64], r1 ; store op0 102 vst1.u8 {d20}, [r8@64], r1 ; store oq0 103 vst1.u8 {d21}, [r8@64], r1 ; store oq1 104 vst1.u8 {d22}, [r8@64], r1 ; store oq2 105 vst1.u8 {d23}, [r8@64], r1 ; store oq3 106 vst1.u8 {d1}, [r8@64], r1 ; store oq4 107 vst1.u8 {d2}, [r8@64], r1 ; store oq5 108 vst1.u8 {d3}, [r8@64], r1 ; store oq6 109 110 h_next 111 add r0, r0, #8 112 subs r12, r12, #1 113 bne h_count 114 115 vpop {d8-d15} 116 pop {r4-r8, pc} 117 118 ENDP ; |vp9_lpf_horizontal_16_neon| 119 120 ; void vp9_lpf_vertical_16_neon(uint8_t *s, int p, 121 ; const uint8_t *blimit, 122 ; const uint8_t *limit, 123 ; const uint8_t *thresh) 124 ; r0 uint8_t *s, 125 ; r1 int p, /* pitch */ 126 ; r2 const uint8_t *blimit, 127 ; r3 const uint8_t *limit, 128 ; sp const uint8_t *thresh, 129 |vp9_lpf_vertical_16_neon| PROC 130 push {r4-r8, lr} 131 vpush {d8-d15} 132 ldr r4, [sp, #88] ; load thresh 133 134 vld1.8 {d16[]}, [r2] ; load *blimit 135 vld1.8 {d17[]}, [r3] ; load *limit 136 vld1.8 {d18[]}, [r4] ; load *thresh 137 138 sub r8, r0, #8 139 140 vld1.8 {d0}, [r8@64], r1 141 vld1.8 {d8}, [r0@64], r1 142 vld1.8 {d1}, [r8@64], r1 143 vld1.8 {d9}, [r0@64], r1 144 vld1.8 {d2}, [r8@64], r1 145 vld1.8 {d10}, [r0@64], r1 146 vld1.8 {d3}, [r8@64], r1 147 vld1.8 {d11}, [r0@64], r1 148 vld1.8 {d4}, [r8@64], r1 149 vld1.8 {d12}, [r0@64], r1 150 vld1.8 {d5}, [r8@64], r1 151 vld1.8 {d13}, [r0@64], r1 152 vld1.8 {d6}, [r8@64], r1 153 vld1.8 {d14}, [r0@64], r1 154 vld1.8 {d7}, [r8@64], r1 155 vld1.8 {d15}, [r0@64], r1 156 157 sub r0, r0, r1, lsl #3 158 159 vtrn.32 q0, q2 160 vtrn.32 q1, q3 161 vtrn.32 q4, q6 162 vtrn.32 q5, q7 163 164 vtrn.16 q0, q1 165 vtrn.16 q2, q3 166 vtrn.16 q4, q5 167 vtrn.16 q6, q7 168 169 vtrn.8 d0, d1 170 vtrn.8 d2, d3 171 vtrn.8 d4, d5 172 vtrn.8 d6, d7 173 174 vtrn.8 d8, d9 175 vtrn.8 d10, d11 176 vtrn.8 d12, d13 177 vtrn.8 d14, d15 178 179 bl vp9_wide_mbfilter_neon 180 181 tst r7, #1 182 beq v_mbfilter 183 184 ; flat && mask were not set for any of the channels. Just store the values 185 ; from filter. 186 sub r8, r0, #2 187 188 vswp d23, d25 189 190 vst4.8 {d23[0], d24[0], d25[0], d26[0]}, [r8], r1 191 vst4.8 {d23[1], d24[1], d25[1], d26[1]}, [r8], r1 192 vst4.8 {d23[2], d24[2], d25[2], d26[2]}, [r8], r1 193 vst4.8 {d23[3], d24[3], d25[3], d26[3]}, [r8], r1 194 vst4.8 {d23[4], d24[4], d25[4], d26[4]}, [r8], r1 195 vst4.8 {d23[5], d24[5], d25[5], d26[5]}, [r8], r1 196 vst4.8 {d23[6], d24[6], d25[6], d26[6]}, [r8], r1 197 vst4.8 {d23[7], d24[7], d25[7], d26[7]}, [r8], r1 198 199 b v_end 200 201 v_mbfilter 202 tst r7, #2 203 beq v_wide_mbfilter 204 205 ; flat2 was not set for any of the channels. Just store the values from 206 ; mbfilter. 207 sub r8, r0, #3 208 209 vst3.8 {d18[0], d19[0], d20[0]}, [r8], r1 210 vst3.8 {d21[0], d22[0], d23[0]}, [r0], r1 211 vst3.8 {d18[1], d19[1], d20[1]}, [r8], r1 212 vst3.8 {d21[1], d22[1], d23[1]}, [r0], r1 213 vst3.8 {d18[2], d19[2], d20[2]}, [r8], r1 214 vst3.8 {d21[2], d22[2], d23[2]}, [r0], r1 215 vst3.8 {d18[3], d19[3], d20[3]}, [r8], r1 216 vst3.8 {d21[3], d22[3], d23[3]}, [r0], r1 217 vst3.8 {d18[4], d19[4], d20[4]}, [r8], r1 218 vst3.8 {d21[4], d22[4], d23[4]}, [r0], r1 219 vst3.8 {d18[5], d19[5], d20[5]}, [r8], r1 220 vst3.8 {d21[5], d22[5], d23[5]}, [r0], r1 221 vst3.8 {d18[6], d19[6], d20[6]}, [r8], r1 222 vst3.8 {d21[6], d22[6], d23[6]}, [r0], r1 223 vst3.8 {d18[7], d19[7], d20[7]}, [r8], r1 224 vst3.8 {d21[7], d22[7], d23[7]}, [r0], r1 225 226 b v_end 227 228 v_wide_mbfilter 229 sub r8, r0, #8 230 231 vtrn.32 d0, d26 232 vtrn.32 d16, d27 233 vtrn.32 d24, d18 234 vtrn.32 d25, d19 235 236 vtrn.16 d0, d24 237 vtrn.16 d16, d25 238 vtrn.16 d26, d18 239 vtrn.16 d27, d19 240 241 vtrn.8 d0, d16 242 vtrn.8 d24, d25 243 vtrn.8 d26, d27 244 vtrn.8 d18, d19 245 246 vtrn.32 d20, d1 247 vtrn.32 d21, d2 248 vtrn.32 d22, d3 249 vtrn.32 d23, d15 250 251 vtrn.16 d20, d22 252 vtrn.16 d21, d23 253 vtrn.16 d1, d3 254 vtrn.16 d2, d15 255 256 vtrn.8 d20, d21 257 vtrn.8 d22, d23 258 vtrn.8 d1, d2 259 vtrn.8 d3, d15 260 261 vst1.8 {d0}, [r8@64], r1 262 vst1.8 {d20}, [r0@64], r1 263 vst1.8 {d16}, [r8@64], r1 264 vst1.8 {d21}, [r0@64], r1 265 vst1.8 {d24}, [r8@64], r1 266 vst1.8 {d22}, [r0@64], r1 267 vst1.8 {d25}, [r8@64], r1 268 vst1.8 {d23}, [r0@64], r1 269 vst1.8 {d26}, [r8@64], r1 270 vst1.8 {d1}, [r0@64], r1 271 vst1.8 {d27}, [r8@64], r1 272 vst1.8 {d2}, [r0@64], r1 273 vst1.8 {d18}, [r8@64], r1 274 vst1.8 {d3}, [r0@64], r1 275 vst1.8 {d19}, [r8@64], r1 276 vst1.8 {d15}, [r0@64], r1 277 278 v_end 279 vpop {d8-d15} 280 pop {r4-r8, pc} 281 282 ENDP ; |vp9_lpf_vertical_16_neon| 283 284 ; void vp9_wide_mbfilter_neon(); 285 ; This is a helper function for the loopfilters. The invidual functions do the 286 ; necessary load, transpose (if necessary) and store. 287 ; 288 ; r0-r3 PRESERVE 289 ; d16 blimit 290 ; d17 limit 291 ; d18 thresh 292 ; d0 p7 293 ; d1 p6 294 ; d2 p5 295 ; d3 p4 296 ; d4 p3 297 ; d5 p2 298 ; d6 p1 299 ; d7 p0 300 ; d8 q0 301 ; d9 q1 302 ; d10 q2 303 ; d11 q3 304 ; d12 q4 305 ; d13 q5 306 ; d14 q6 307 ; d15 q7 308 |vp9_wide_mbfilter_neon| PROC 309 mov r7, #0 310 311 ; filter_mask 312 vabd.u8 d19, d4, d5 ; abs(p3 - p2) 313 vabd.u8 d20, d5, d6 ; abs(p2 - p1) 314 vabd.u8 d21, d6, d7 ; abs(p1 - p0) 315 vabd.u8 d22, d9, d8 ; abs(q1 - q0) 316 vabd.u8 d23, d10, d9 ; abs(q2 - q1) 317 vabd.u8 d24, d11, d10 ; abs(q3 - q2) 318 319 ; only compare the largest value to limit 320 vmax.u8 d19, d19, d20 ; max(abs(p3 - p2), abs(p2 - p1)) 321 vmax.u8 d20, d21, d22 ; max(abs(p1 - p0), abs(q1 - q0)) 322 vmax.u8 d23, d23, d24 ; max(abs(q2 - q1), abs(q3 - q2)) 323 vmax.u8 d19, d19, d20 324 325 vabd.u8 d24, d7, d8 ; abs(p0 - q0) 326 327 vmax.u8 d19, d19, d23 328 329 vabd.u8 d23, d6, d9 ; a = abs(p1 - q1) 330 vqadd.u8 d24, d24, d24 ; b = abs(p0 - q0) * 2 331 332 ; abs () > limit 333 vcge.u8 d19, d17, d19 334 335 ; flatmask4 336 vabd.u8 d25, d7, d5 ; abs(p0 - p2) 337 vabd.u8 d26, d8, d10 ; abs(q0 - q2) 338 vabd.u8 d27, d4, d7 ; abs(p3 - p0) 339 vabd.u8 d28, d11, d8 ; abs(q3 - q0) 340 341 ; only compare the largest value to thresh 342 vmax.u8 d25, d25, d26 ; max(abs(p0 - p2), abs(q0 - q2)) 343 vmax.u8 d26, d27, d28 ; max(abs(p3 - p0), abs(q3 - q0)) 344 vmax.u8 d25, d25, d26 345 vmax.u8 d20, d20, d25 346 347 vshr.u8 d23, d23, #1 ; a = a / 2 348 vqadd.u8 d24, d24, d23 ; a = b + a 349 350 vmov.u8 d30, #1 351 vcge.u8 d24, d16, d24 ; (a > blimit * 2 + limit) * -1 352 353 vcge.u8 d20, d30, d20 ; flat 354 355 vand d19, d19, d24 ; mask 356 357 ; hevmask 358 vcgt.u8 d21, d21, d18 ; (abs(p1 - p0) > thresh)*-1 359 vcgt.u8 d22, d22, d18 ; (abs(q1 - q0) > thresh)*-1 360 vorr d21, d21, d22 ; hev 361 362 vand d16, d20, d19 ; flat && mask 363 vmov r5, r6, d16 364 365 ; flatmask5(1, p7, p6, p5, p4, p0, q0, q4, q5, q6, q7) 366 vabd.u8 d22, d3, d7 ; abs(p4 - p0) 367 vabd.u8 d23, d12, d8 ; abs(q4 - q0) 368 vabd.u8 d24, d7, d2 ; abs(p0 - p5) 369 vabd.u8 d25, d8, d13 ; abs(q0 - q5) 370 vabd.u8 d26, d1, d7 ; abs(p6 - p0) 371 vabd.u8 d27, d14, d8 ; abs(q6 - q0) 372 vabd.u8 d28, d0, d7 ; abs(p7 - p0) 373 vabd.u8 d29, d15, d8 ; abs(q7 - q0) 374 375 ; only compare the largest value to thresh 376 vmax.u8 d22, d22, d23 ; max(abs(p4 - p0), abs(q4 - q0)) 377 vmax.u8 d23, d24, d25 ; max(abs(p0 - p5), abs(q0 - q5)) 378 vmax.u8 d24, d26, d27 ; max(abs(p6 - p0), abs(q6 - q0)) 379 vmax.u8 d25, d28, d29 ; max(abs(p7 - p0), abs(q7 - q0)) 380 381 vmax.u8 d26, d22, d23 382 vmax.u8 d27, d24, d25 383 vmax.u8 d23, d26, d27 384 385 vcge.u8 d18, d30, d23 ; flat2 386 387 vmov.u8 d22, #0x80 388 389 orrs r5, r5, r6 ; Check for 0 390 orreq r7, r7, #1 ; Only do filter branch 391 392 vand d17, d18, d16 ; flat2 && flat && mask 393 vmov r5, r6, d17 394 395 ; mbfilter() function 396 397 ; filter() function 398 ; convert to signed 399 veor d23, d8, d22 ; qs0 400 veor d24, d7, d22 ; ps0 401 veor d25, d6, d22 ; ps1 402 veor d26, d9, d22 ; qs1 403 404 vmov.u8 d27, #3 405 406 vsub.s8 d28, d23, d24 ; ( qs0 - ps0) 407 vqsub.s8 d29, d25, d26 ; filter = clamp(ps1-qs1) 408 vmull.s8 q15, d28, d27 ; 3 * ( qs0 - ps0) 409 vand d29, d29, d21 ; filter &= hev 410 vaddw.s8 q15, q15, d29 ; filter + 3 * (qs0 - ps0) 411 vmov.u8 d29, #4 412 413 ; filter = clamp(filter + 3 * ( qs0 - ps0)) 414 vqmovn.s16 d28, q15 415 416 vand d28, d28, d19 ; filter &= mask 417 418 vqadd.s8 d30, d28, d27 ; filter2 = clamp(filter+3) 419 vqadd.s8 d29, d28, d29 ; filter1 = clamp(filter+4) 420 vshr.s8 d30, d30, #3 ; filter2 >>= 3 421 vshr.s8 d29, d29, #3 ; filter1 >>= 3 422 423 424 vqadd.s8 d24, d24, d30 ; op0 = clamp(ps0 + filter2) 425 vqsub.s8 d23, d23, d29 ; oq0 = clamp(qs0 - filter1) 426 427 ; outer tap adjustments: ++filter1 >> 1 428 vrshr.s8 d29, d29, #1 429 vbic d29, d29, d21 ; filter &= ~hev 430 431 vqadd.s8 d25, d25, d29 ; op1 = clamp(ps1 + filter) 432 vqsub.s8 d26, d26, d29 ; oq1 = clamp(qs1 - filter) 433 434 veor d24, d24, d22 ; *f_op0 = u^0x80 435 veor d23, d23, d22 ; *f_oq0 = u^0x80 436 veor d25, d25, d22 ; *f_op1 = u^0x80 437 veor d26, d26, d22 ; *f_oq1 = u^0x80 438 439 tst r7, #1 440 bxne lr 441 442 orrs r5, r5, r6 ; Check for 0 443 orreq r7, r7, #2 ; Only do mbfilter branch 444 445 ; mbfilter flat && mask branch 446 ; TODO(fgalligan): Can I decrease the cycles shifting to consective d's 447 ; and using vibt on the q's? 448 vmov.u8 d29, #2 449 vaddl.u8 q15, d7, d8 ; op2 = p0 + q0 450 vmlal.u8 q15, d4, d27 ; op2 = p0 + q0 + p3 * 3 451 vmlal.u8 q15, d5, d29 ; op2 = p0 + q0 + p3 * 3 + p2 * 2 452 vaddl.u8 q10, d4, d5 453 vaddw.u8 q15, d6 ; op2=p1 + p0 + q0 + p3 * 3 + p2 *2 454 vaddl.u8 q14, d6, d9 455 vqrshrn.u16 d18, q15, #3 ; r_op2 456 457 vsub.i16 q15, q10 458 vaddl.u8 q10, d4, d6 459 vadd.i16 q15, q14 460 vaddl.u8 q14, d7, d10 461 vqrshrn.u16 d19, q15, #3 ; r_op1 462 463 vsub.i16 q15, q10 464 vadd.i16 q15, q14 465 vaddl.u8 q14, d8, d11 466 vqrshrn.u16 d20, q15, #3 ; r_op0 467 468 vsubw.u8 q15, d4 ; oq0 = op0 - p3 469 vsubw.u8 q15, d7 ; oq0 -= p0 470 vadd.i16 q15, q14 471 vaddl.u8 q14, d9, d11 472 vqrshrn.u16 d21, q15, #3 ; r_oq0 473 474 vsubw.u8 q15, d5 ; oq1 = oq0 - p2 475 vsubw.u8 q15, d8 ; oq1 -= q0 476 vadd.i16 q15, q14 477 vaddl.u8 q14, d10, d11 478 vqrshrn.u16 d22, q15, #3 ; r_oq1 479 480 vsubw.u8 q15, d6 ; oq2 = oq0 - p1 481 vsubw.u8 q15, d9 ; oq2 -= q1 482 vadd.i16 q15, q14 483 vqrshrn.u16 d27, q15, #3 ; r_oq2 484 485 ; Filter does not set op2 or oq2, so use p2 and q2. 486 vbif d18, d5, d16 ; t_op2 |= p2 & ~(flat & mask) 487 vbif d19, d25, d16 ; t_op1 |= f_op1 & ~(flat & mask) 488 vbif d20, d24, d16 ; t_op0 |= f_op0 & ~(flat & mask) 489 vbif d21, d23, d16 ; t_oq0 |= f_oq0 & ~(flat & mask) 490 vbif d22, d26, d16 ; t_oq1 |= f_oq1 & ~(flat & mask) 491 492 vbit d23, d27, d16 ; t_oq2 |= r_oq2 & (flat & mask) 493 vbif d23, d10, d16 ; t_oq2 |= q2 & ~(flat & mask) 494 495 tst r7, #2 496 bxne lr 497 498 ; wide_mbfilter flat2 && flat && mask branch 499 vmov.u8 d16, #7 500 vaddl.u8 q15, d7, d8 ; op6 = p0 + q0 501 vaddl.u8 q12, d2, d3 502 vaddl.u8 q13, d4, d5 503 vaddl.u8 q14, d1, d6 504 vmlal.u8 q15, d0, d16 ; op6 += p7 * 3 505 vadd.i16 q12, q13 506 vadd.i16 q15, q14 507 vaddl.u8 q14, d2, d9 508 vadd.i16 q15, q12 509 vaddl.u8 q12, d0, d1 510 vaddw.u8 q15, d1 511 vaddl.u8 q13, d0, d2 512 vadd.i16 q14, q15, q14 513 vqrshrn.u16 d16, q15, #4 ; w_op6 514 515 vsub.i16 q15, q14, q12 516 vaddl.u8 q14, d3, d10 517 vqrshrn.u16 d24, q15, #4 ; w_op5 518 519 vsub.i16 q15, q13 520 vaddl.u8 q13, d0, d3 521 vadd.i16 q15, q14 522 vaddl.u8 q14, d4, d11 523 vqrshrn.u16 d25, q15, #4 ; w_op4 524 525 vadd.i16 q15, q14 526 vaddl.u8 q14, d0, d4 527 vsub.i16 q15, q13 528 vsub.i16 q14, q15, q14 529 vqrshrn.u16 d26, q15, #4 ; w_op3 530 531 vaddw.u8 q15, q14, d5 ; op2 += p2 532 vaddl.u8 q14, d0, d5 533 vaddw.u8 q15, d12 ; op2 += q4 534 vbif d26, d4, d17 ; op3 |= p3 & ~(f2 & f & m) 535 vqrshrn.u16 d27, q15, #4 ; w_op2 536 537 vsub.i16 q15, q14 538 vaddl.u8 q14, d0, d6 539 vaddw.u8 q15, d6 ; op1 += p1 540 vaddw.u8 q15, d13 ; op1 += q5 541 vbif d27, d18, d17 ; op2 |= t_op2 & ~(f2 & f & m) 542 vqrshrn.u16 d18, q15, #4 ; w_op1 543 544 vsub.i16 q15, q14 545 vaddl.u8 q14, d0, d7 546 vaddw.u8 q15, d7 ; op0 += p0 547 vaddw.u8 q15, d14 ; op0 += q6 548 vbif d18, d19, d17 ; op1 |= t_op1 & ~(f2 & f & m) 549 vqrshrn.u16 d19, q15, #4 ; w_op0 550 551 vsub.i16 q15, q14 552 vaddl.u8 q14, d1, d8 553 vaddw.u8 q15, d8 ; oq0 += q0 554 vaddw.u8 q15, d15 ; oq0 += q7 555 vbif d19, d20, d17 ; op0 |= t_op0 & ~(f2 & f & m) 556 vqrshrn.u16 d20, q15, #4 ; w_oq0 557 558 vsub.i16 q15, q14 559 vaddl.u8 q14, d2, d9 560 vaddw.u8 q15, d9 ; oq1 += q1 561 vaddl.u8 q4, d10, d15 562 vaddw.u8 q15, d15 ; oq1 += q7 563 vbif d20, d21, d17 ; oq0 |= t_oq0 & ~(f2 & f & m) 564 vqrshrn.u16 d21, q15, #4 ; w_oq1 565 566 vsub.i16 q15, q14 567 vaddl.u8 q14, d3, d10 568 vadd.i16 q15, q4 569 vaddl.u8 q4, d11, d15 570 vbif d21, d22, d17 ; oq1 |= t_oq1 & ~(f2 & f & m) 571 vqrshrn.u16 d22, q15, #4 ; w_oq2 572 573 vsub.i16 q15, q14 574 vaddl.u8 q14, d4, d11 575 vadd.i16 q15, q4 576 vaddl.u8 q4, d12, d15 577 vbif d22, d23, d17 ; oq2 |= t_oq2 & ~(f2 & f & m) 578 vqrshrn.u16 d23, q15, #4 ; w_oq3 579 580 vsub.i16 q15, q14 581 vaddl.u8 q14, d5, d12 582 vadd.i16 q15, q4 583 vaddl.u8 q4, d13, d15 584 vbif d16, d1, d17 ; op6 |= p6 & ~(f2 & f & m) 585 vqrshrn.u16 d1, q15, #4 ; w_oq4 586 587 vsub.i16 q15, q14 588 vaddl.u8 q14, d6, d13 589 vadd.i16 q15, q4 590 vaddl.u8 q4, d14, d15 591 vbif d24, d2, d17 ; op5 |= p5 & ~(f2 & f & m) 592 vqrshrn.u16 d2, q15, #4 ; w_oq5 593 594 vsub.i16 q15, q14 595 vbif d25, d3, d17 ; op4 |= p4 & ~(f2 & f & m) 596 vadd.i16 q15, q4 597 vbif d23, d11, d17 ; oq3 |= q3 & ~(f2 & f & m) 598 vqrshrn.u16 d3, q15, #4 ; w_oq6 599 vbif d1, d12, d17 ; oq4 |= q4 & ~(f2 & f & m) 600 vbif d2, d13, d17 ; oq5 |= q5 & ~(f2 & f & m) 601 vbif d3, d14, d17 ; oq6 |= q6 & ~(f2 & f & m) 602 603 bx lr 604 ENDP ; |vp9_wide_mbfilter_neon| 605 606 END 607