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 35#include "arm_arch_common_macro.S" 36 37.macro JMP_IF_128BITS_IS_ZERO arg0, arg1, arg2 38 vorr.s16 \arg2, \arg0, \arg1 39 vmov r3, r2, \arg2 40 orr r3, r3, r2 41 cmp r3, #0 42.endm 43 44.macro MASK_MATRIX arg0, arg1, arg2, arg3, arg4, arg5, arg6 45 vabd.u8 \arg6, \arg1, \arg2 46 vcgt.u8 \arg6, \arg4, \arg6 47 48 vabd.u8 \arg4, \arg0, \arg1 49 vclt.u8 \arg4, \arg4, \arg5 50 vand.u8 \arg6, \arg6, \arg4 51 52 vabd.u8 \arg4, \arg3, \arg2 53 vclt.u8 \arg4, \arg4, \arg5 54 vand.u8 \arg6, \arg6, \arg4 55.endm 56 57.macro DIFF_LUMA_LT4_P1_Q1 arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9 58 vmov.i8 \arg9, #128 59 vrhadd.u8 \arg8, \arg2, \arg3 60 vhadd.u8 \arg8, \arg0, \arg8 61 vsub.s8 \arg8, \arg8, \arg9 62 vsub.s8 \arg9, \arg1, \arg9 63 vqsub.s8 \arg8, \arg8, \arg9 64 vmax.s8 \arg8, \arg8, \arg5 65 vmin.s8 \arg8, \arg8, \arg6 66 vabd.u8 \arg9, \arg0, \arg2 67 vclt.u8 \arg9, \arg9, \arg4 68 vand.s8 \arg8, \arg8, \arg9 69 vand.s8 \arg8, \arg8, \arg7 70 vadd.u8 \arg8, \arg1, \arg8 71 vabs.s8 \arg9, \arg9 72.endm 73 74.macro DIFF_LUMA_LT4_P0_Q0 arg0, arg1, arg2, arg3, arg4, arg5, arg6 75 vsubl.u8 \arg5, \arg0, \arg3 76 vsubl.u8 \arg6, \arg2, \arg1 77 vshl.s16 \arg6, \arg6, #2 78 vadd.s16 \arg5, \arg5, \arg6 79 vqrshrn.s16 \arg4, \arg5, #3 80.endm 81 82 83.macro DIFF_LUMA_EQ4_P2P1P0 arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7 84 vaddl.u8 q4, \arg1, \arg2 85 vaddl.u8 q5, \arg3, \arg4 86 vadd.u16 q5, q4, q5 87 88 vaddl.u8 q4, \arg0, \arg1 89 vshl.u16 q4, q4, #1 90 vadd.u16 q4, q5, q4 91 92 vrshrn.u16 \arg0, q5, #2 93 vrshrn.u16 \arg7, q4, #3 94 95 vshl.u16 q5, q5, #1 96 vsubl.u8 q4, \arg5, \arg1 97 vadd.u16 q5, q4,q5 98 99 vaddl.u8 q4, \arg2, \arg5 100 vaddw.u8 q4, q4, \arg2 101 vaddw.u8 q4, q4, \arg3 102 103 vrshrn.u16 d10,q5, #3 104 vrshrn.u16 d8, q4, #2 105 vbsl.u8 \arg6, d10, d8 106.endm 107 108.macro DIFF_LUMA_EQ4_MASK arg0, arg1, arg2, arg3 109 vmov \arg3, \arg2 110 vbsl.u8 \arg3, \arg0, \arg1 111.endm 112 113.macro DIFF_CHROMA_EQ4_P0Q0 arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 114 vaddl.u8 \arg4, \arg0, \arg3 115 vaddw.u8 \arg5, \arg4, \arg1 116 vaddw.u8 \arg6, \arg4, \arg2 117 vaddw.u8 \arg5, \arg5, \arg0 118 vaddw.u8 \arg6, \arg6, \arg3 119 vrshrn.u16 \arg7, \arg5, #2 120 vrshrn.u16 \arg8, \arg6, #2 121.endm 122 123.macro LOAD_CHROMA_DATA_4 arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 124 vld4.u8 {\arg0[\arg8],\arg1[\arg8],\arg2[\arg8],\arg3[\arg8]}, [r0], r2 125 vld4.u8 {\arg4[\arg8],\arg5[\arg8],\arg6[\arg8],\arg7[\arg8]}, [r1], r2 126.endm 127 128.macro STORE_CHROMA_DATA_4 arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 129 vst4.u8 {\arg0[\arg8],\arg1[\arg8],\arg2[\arg8],\arg3[\arg8]}, [r0], r2 130 vst4.u8 {\arg4[\arg8],\arg5[\arg8],\arg6[\arg8],\arg7[\arg8]}, [r1], r2 131.endm 132 133.macro LOAD_LUMA_DATA_3 arg0, arg1, arg2, arg3, arg4, arg5, arg6 134 vld3.u8 {\arg0[\arg6],\arg1[\arg6],\arg2[\arg6]}, [r2], r1 135 vld3.u8 {\arg3[\arg6],\arg4[\arg6],\arg5[\arg6]}, [r0], r1 136.endm 137 138.macro STORE_LUMA_DATA_4 arg0, arg1, arg2, arg3, arg4, arg5 139 vst4.u8 {\arg0[\arg4],\arg1[\arg4],\arg2[\arg4],\arg3[\arg4]}, [r0], r1 140 vst4.u8 {\arg0[\arg5],\arg1[\arg5],\arg2[\arg5],\arg3[\arg5]}, [r2], r1 141.endm 142 143.macro STORE_LUMA_DATA_3 arg0, arg1, arg2, arg3, arg4, arg5, arg6 144 vst3.u8 {\arg0[\arg6],\arg1[\arg6],\arg2[\arg6]}, [r3], r1 145 vst3.u8 {\arg3[\arg6],\arg4[\arg6],\arg5[\arg6]}, [r0], r1 146.endm 147 148.macro EXTRACT_DELTA_INTO_TWO_PART arg0, arg1 149 vcge.s8 \arg1, \arg0, #0 150 vand \arg1, \arg0, \arg1 151 vsub.s8 \arg0, \arg1, \arg0 152.endm 153 154WELS_ASM_FUNC_BEGIN DeblockLumaLt4V_neon 155 vpush {q4-q7} 156 vdup.u8 q11, r2 157 vdup.u8 q9, r3 158 159 add r2, r1, r1, lsl #1 160 sub r2, r0, r2 161 vld1.u8 {q0}, [r2], r1 162 vld1.u8 {q3}, [r0], r1 163 vld1.u8 {q1}, [r2], r1 164 vld1.u8 {q4}, [r0], r1 165 vld1.u8 {q2}, [r2] 166 vld1.u8 {q5}, [r0] 167 sub r2, r2, r1 168 169 ldr r3, [sp, #64] 170 vld1.s8 {d31}, [r3] 171 vdup.s8 d28, d31[0] 172 vdup.s8 d30, d31[1] 173 vdup.s8 d29, d31[2] 174 vdup.s8 d31, d31[3] 175 vtrn.32 d28, d30 176 vtrn.32 d29, d31 177 vcge.s8 q10, q14, #0 178 179 MASK_MATRIX q1, q2, q3, q4, q11, q9, q15 180 vand.u8 q10, q10, q15 181 182 veor q15, q15 183 vsub.i8 q15,q15,q14 184 185 DIFF_LUMA_LT4_P1_Q1 q0, q1, q2, q3, q9, q15, q14, q10, q6, q12 186 vst1.u8 {q6}, [r2], r1 187 188 DIFF_LUMA_LT4_P1_Q1 q5, q4, q3, q2, q9, q15, q14, q10, q7, q13 189 190 vabs.s8 q12, q12 191 vabs.s8 q13, q13 192 vadd.u8 q14,q14,q12 193 vadd.u8 q14,q14,q13 194 veor q15, q15 195 vsub.i8 q15,q15,q14 196 197 DIFF_LUMA_LT4_P0_Q0 d2, d4, d6, d8, d16, q12, q13 198 DIFF_LUMA_LT4_P0_Q0 d3, d5, d7, d9, d17, q12, q13 199 vmax.s8 q8, q8, q15 200 vmin.s8 q8, q8, q14 201 vand.s8 q8, q8, q10 202 EXTRACT_DELTA_INTO_TWO_PART q8, q9 203 vqadd.u8 q2, q2, q9 204 vqsub.u8 q2, q2, q8 205 vst1.u8 {q2}, [r2], r1 206 vqsub.u8 q3, q3, q9 207 vqadd.u8 q3, q3, q8 208 vst1.u8 {q3}, [r2] , r1 209 vst1.u8 {q7}, [r2] 210 211 vpop {q4-q7} 212WELS_ASM_FUNC_END 213 214 215WELS_ASM_FUNC_BEGIN DeblockLumaEq4V_neon 216 vpush {q4-q7} 217 218 vdup.u8 q5, r2 219 vdup.u8 q4, r3 220 221 sub r3, r0, r1, lsl #2 222 vld1.u8 {q8}, [r3], r1 223 vld1.u8 {q12}, [r0], r1 224 vld1.u8 {q9}, [r3], r1 225 vld1.u8 {q13}, [r0], r1 226 vld1.u8 {q10}, [r3], r1 227 vld1.u8 {q14}, [r0], r1 228 vld1.u8 {q11}, [r3] 229 vld1.u8 {q15}, [r0] 230 sub r3, r3, r1 , lsl #1 231 232 MASK_MATRIX q10, q11, q12, q13, q5, q4, q6 233 234 mov r2, r2, lsr #2 235 add r2, r2, #2 236 vdup.u8 q5, r2 237 vabd.u8 q0, q11, q12 238 vclt.u8 q7, q0, q5 239 240 vabd.u8 q1, q9, q11 241 vclt.u8 q1, q1, q4 242 vand.s8 q1, q1, q7 243 244 vabd.u8 q2, q14,q12 245 vclt.u8 q2, q2, q4 246 vand.s8 q2, q2, q7 247 vand.u8 q7, q7, q6 248 249 vmov q3, q1 250 251 DIFF_LUMA_EQ4_P2P1P0 d16, d18, d20, d22, d24, d26, d2, d0 252 DIFF_LUMA_EQ4_P2P1P0 d17, d19, d21, d23, d25, d27, d3, d1 253 254 vand.u8 q3, q7, q3 255 DIFF_LUMA_EQ4_MASK q0, q9, q3, q4 256 vst1.u8 {q4}, [r3], r1 257 DIFF_LUMA_EQ4_MASK q8,q10, q3, q4 258 vst1.u8 {q4}, [r3], r1 259 DIFF_LUMA_EQ4_MASK q1,q11, q6, q4 260 vst1.u8 {q4}, [r3], r1 261 262 vmov q0, q2 263 DIFF_LUMA_EQ4_P2P1P0 d30, d28, d26, d24, d22, d20, d4, d6 264 DIFF_LUMA_EQ4_P2P1P0 d31, d29, d27, d25, d23, d21, d5, d7 265 266 vand.u8 q0, q7, q0 267 DIFF_LUMA_EQ4_MASK q2, q12, q6, q4 268 vst1.u8 {q4}, [r3], r1 269 DIFF_LUMA_EQ4_MASK q15, q13, q0, q4 270 vst1.u8 {q4}, [r3], r1 271 DIFF_LUMA_EQ4_MASK q3, q14, q0, q4 272 vst1.u8 {q4}, [r3], r1 273 274 vpop {q4-q7} 275WELS_ASM_FUNC_END 276 277 278WELS_ASM_FUNC_BEGIN DeblockLumaLt4H_neon 279 vpush {q4-q7} 280 281 vdup.u8 q11, r2 282 vdup.u8 q9, r3 283 284 sub r2, r0, #3 285 LOAD_LUMA_DATA_3 d0, d1, d2, d6, d7, d8, 0 286 LOAD_LUMA_DATA_3 d0, d1, d2, d6, d7, d8, 1 287 LOAD_LUMA_DATA_3 d0, d1, d2, d6, d7, d8, 2 288 LOAD_LUMA_DATA_3 d0, d1, d2, d6, d7, d8, 3 289 LOAD_LUMA_DATA_3 d0, d1, d2, d6, d7, d8, 4 290 LOAD_LUMA_DATA_3 d0, d1, d2, d6, d7, d8, 5 291 LOAD_LUMA_DATA_3 d0, d1, d2, d6, d7, d8, 6 292 LOAD_LUMA_DATA_3 d0, d1, d2, d6, d7, d8, 7 293 294 LOAD_LUMA_DATA_3 d3, d4, d5, d9, d10, d11, 0 295 LOAD_LUMA_DATA_3 d3, d4, d5, d9, d10, d11, 1 296 LOAD_LUMA_DATA_3 d3, d4, d5, d9, d10, d11, 2 297 LOAD_LUMA_DATA_3 d3, d4, d5, d9, d10, d11, 3 298 LOAD_LUMA_DATA_3 d3, d4, d5, d9, d10, d11, 4 299 LOAD_LUMA_DATA_3 d3, d4, d5, d9, d10, d11, 5 300 LOAD_LUMA_DATA_3 d3, d4, d5, d9, d10, d11, 6 301 LOAD_LUMA_DATA_3 d3, d4, d5, d9, d10, d11, 7 302 303 vswp d1, d2 304 vswp d3, d4 305 vswp d1, d4 306 vswp d7, d8 307 vswp d9, d10 308 vswp d7, d10 309 310 sub r0, r0, r1, lsl #4 311 312 ldr r3, [sp, #64] 313 vld1.s8 {d31}, [r3] 314 vdup.s8 d28, d31[0] 315 vdup.s8 d30, d31[1] 316 vdup.s8 d29, d31[2] 317 vdup.s8 d31, d31[3] 318 vtrn.32 d28, d30 319 vtrn.32 d29, d31 320 vcge.s8 q10, q14, #0 321 322 MASK_MATRIX q1, q2, q3, q4, q11, q9, q15 323 vand.u8 q10, q10, q15 324 325 veor q15, q15 326 vsub.i8 q15,q15,q14 327 328 DIFF_LUMA_LT4_P1_Q1 q0, q1, q2, q3, q9, q15, q14, q10, q6, q12 329 DIFF_LUMA_LT4_P1_Q1 q5, q4, q3, q2, q9, q15, q14, q10, q7, q13 330 331 vabs.s8 q12, q12 332 vabs.s8 q13, q13 333 vadd.u8 q14,q14,q12 334 vadd.u8 q14,q14,q13 335 veor q15, q15 336 vsub.i8 q15,q15,q14 337 338 DIFF_LUMA_LT4_P0_Q0 d2, d4, d6, d8, d16, q12, q13 339 DIFF_LUMA_LT4_P0_Q0 d3, d5, d7, d9, d17, q12, q13 340 vmax.s8 q8, q8, q15 341 vmin.s8 q8, q8, q14 342 vand.s8 q8, q8, q10 343 EXTRACT_DELTA_INTO_TWO_PART q8, q9 344 vqadd.u8 q2, q2, q9 345 vqsub.u8 q2, q2, q8 346 347 vqsub.u8 q3, q3, q9 348 vqadd.u8 q3, q3, q8 349 350 sub r0, #2 351 add r2, r0, r1 352 lsl r1, #1 353 354 vmov q1, q6 355 vmov q4, q7 356 357 vswp q2, q3 358 vswp d3, d6 359 vswp d5, d8 360 361 STORE_LUMA_DATA_4 d2, d3, d4, d5, 0, 1 362 STORE_LUMA_DATA_4 d2, d3, d4, d5, 2, 3 363 STORE_LUMA_DATA_4 d2, d3, d4, d5, 4, 5 364 STORE_LUMA_DATA_4 d2, d3, d4, d5, 6, 7 365 366 STORE_LUMA_DATA_4 d6, d7, d8, d9, 0, 1 367 STORE_LUMA_DATA_4 d6, d7, d8, d9, 2, 3 368 STORE_LUMA_DATA_4 d6, d7, d8, d9, 4, 5 369 STORE_LUMA_DATA_4 d6, d7, d8, d9, 6, 7 370 371 vpop {q4-q7} 372WELS_ASM_FUNC_END 373 374 375WELS_ASM_FUNC_BEGIN DeblockLumaEq4H_neon 376 vpush {q4-q7} 377 vdup.u8 q5, r2 378 vdup.u8 q4, r3 379 380 sub r3, r0, #4 // pix -= 4 381 382 vld1.u8 {d16}, [r3], r1 383 vld1.u8 {d17}, [r3], r1 384 vld1.u8 {d18}, [r3], r1 385 vld1.u8 {d19}, [r3], r1 386 vld1.u8 {d20}, [r3], r1 387 vld1.u8 {d21}, [r3], r1 388 vld1.u8 {d22}, [r3], r1 389 vld1.u8 {d23}, [r3], r1 390 vld1.u8 {d24}, [r3], r1 391 vld1.u8 {d25}, [r3], r1 392 vld1.u8 {d26}, [r3], r1 393 vld1.u8 {d27}, [r3], r1 394 vld1.u8 {d28}, [r3], r1 395 vld1.u8 {d29}, [r3], r1 396 vld1.u8 {d30}, [r3], r1 397 vld1.u8 {d31}, [r3], r1 398 399 vtrn.u32 d16, d20 400 vtrn.u32 d17, d21 401 vtrn.u32 d18, d22 402 vtrn.u32 d19, d23 403 vtrn.u32 d24, d28 404 vtrn.u32 d25, d29 405 vtrn.u32 d26, d30 406 vtrn.u32 d27, d31 407 408 vtrn.u16 d16, d18 409 vtrn.u16 d17, d19 410 vtrn.u16 d20, d22 411 vtrn.u16 d21, d23 412 vtrn.u16 d24, d26 413 vtrn.u16 d25, d27 414 vtrn.u16 d28, d30 415 vtrn.u16 d29, d31 416 417 vtrn.u8 d16, d17 418 vtrn.u8 d18, d19 419 vtrn.u8 d20, d21 420 vtrn.u8 d22, d23 421 vtrn.u8 d24, d25 422 vtrn.u8 d26, d27 423 vtrn.u8 d28, d29 424 vtrn.u8 d30, d31 425 426 vswp d17, d24 427 vswp d19, d26 428 vswp d21, d28 429 vswp d23, d30 430 431 vswp q12, q9 432 vswp q14, q11 433 434 vswp q12, q10 435 vswp q13, q11 436 437 MASK_MATRIX q10, q11, q12, q13, q5, q4, q6 438 439 mov r2, r2, lsr #2 440 add r2, r2, #2 441 vdup.u8 q5, r2 442 vabd.u8 q0, q11, q12 443 vclt.u8 q7, q0, q5 444 445 vabd.u8 q1, q9, q11 446 vclt.u8 q1, q1, q4 447 vand.s8 q1, q1, q7 448 449 vabd.u8 q2, q14,q12 450 vclt.u8 q2, q2, q4 451 vand.s8 q2, q2, q7 452 vand.u8 q7, q7, q6 453 454 vmov q3, q1 455 456 DIFF_LUMA_EQ4_P2P1P0 d16, d18, d20, d22, d24, d26, d2, d0 457 DIFF_LUMA_EQ4_P2P1P0 d17, d19, d21, d23, d25, d27, d3, d1 458 459 vand.u8 q3, q7, q3 460 DIFF_LUMA_EQ4_MASK q0, q9, q3, q4 461 vmov q9, q4 462 vbsl.u8 q3, q8, q10 463 DIFF_LUMA_EQ4_MASK q1,q11, q6, q8 464 465 vand.u8 q7, q7, q2 466 467 DIFF_LUMA_EQ4_P2P1P0 d30, d28, d26, d24, d22, d20, d4, d0 468 DIFF_LUMA_EQ4_P2P1P0 d31, d29, d27, d25, d23, d21, d5, d1 469 470 vbsl.u8 q6, q2, q12 471 DIFF_LUMA_EQ4_MASK q15, q13, q7, q4 472 473 vbsl.u8 q7, q0, q14 474 475 vmov q5, q6 476 vmov q2, q9 477 vmov q6, q4 478 vmov q4, q8 479 480 vswp d8, d6 481 vswp d5, d7 482 vswp d5, d8 483 vswp d14, d12 484 vswp d11, d13 485 vswp d11, d14 486 487 sub r3, r0, #3 488 STORE_LUMA_DATA_3 d4,d5,d6,d10,d11,d12,0 489 STORE_LUMA_DATA_3 d4,d5,d6,d10,d11,d12,1 490 STORE_LUMA_DATA_3 d4,d5,d6,d10,d11,d12,2 491 STORE_LUMA_DATA_3 d4,d5,d6,d10,d11,d12,3 492 STORE_LUMA_DATA_3 d4,d5,d6,d10,d11,d12,4 493 STORE_LUMA_DATA_3 d4,d5,d6,d10,d11,d12,5 494 STORE_LUMA_DATA_3 d4,d5,d6,d10,d11,d12,6 495 STORE_LUMA_DATA_3 d4,d5,d6,d10,d11,d12,7 496 497 STORE_LUMA_DATA_3 d7,d8,d9,d13,d14,d15,0 498 STORE_LUMA_DATA_3 d7,d8,d9,d13,d14,d15,1 499 STORE_LUMA_DATA_3 d7,d8,d9,d13,d14,d15,2 500 STORE_LUMA_DATA_3 d7,d8,d9,d13,d14,d15,3 501 STORE_LUMA_DATA_3 d7,d8,d9,d13,d14,d15,4 502 STORE_LUMA_DATA_3 d7,d8,d9,d13,d14,d15,5 503 STORE_LUMA_DATA_3 d7,d8,d9,d13,d14,d15,6 504 STORE_LUMA_DATA_3 d7,d8,d9,d13,d14,d15,7 505 506 vpop {q4-q7} 507WELS_ASM_FUNC_END 508 509 510WELS_ASM_FUNC_BEGIN DeblockChromaLt4V_neon 511 vdup.u8 q11, r3 512 ldr r3, [sp, #0] 513 514 sub r0, r0, r2 , lsl #1 515 sub r1, r1, r2, lsl #1 516 vdup.u8 q9, r3 517 ldr r3, [sp, #4] 518 519 vld1.u8 {d0}, [r0], r2 520 vld1.u8 {d1}, [r1], r2 521 vld1.u8 {d2}, [r0], r2 522 vld1.u8 {d3}, [r1], r2 523 vld1.u8 {d4}, [r0], r2 524 vld1.u8 {d5}, [r1], r2 525 vld1.u8 {d6}, [r0] 526 vld1.u8 {d7}, [r1] 527 528 sub r0, r0, r2, lsl #1 529 sub r1, r1, r2, lsl #1 530 531 vld1.s8 {d31}, [r3] 532 vmovl.u8 q14,d31 533 vshl.u64 d29,d28,#8 534 vorr d28,d29 535 vmov d29, d28 536 veor q15, q15 537 vsub.i8 q15,q15,q14 538 539 MASK_MATRIX q0, q1, q2, q3, q11, q9, q10 540 541 DIFF_LUMA_LT4_P0_Q0 d0, d2, d4, d6, d16, q12, q13 542 DIFF_LUMA_LT4_P0_Q0 d1, d3, d5, d7, d17, q12, q13 543 vmax.s8 q8, q8, q15 544 vmin.s8 q8, q8, q14 545 546 vand.s8 q8, q8, q10 547 vcge.s8 q14, q14, #0 548 vand.s8 q8, q8, q14 549 EXTRACT_DELTA_INTO_TWO_PART q8, q10 550 vqadd.u8 q1, q1, q10 551 vqsub.u8 q1, q1, q8 552 vst1.u8 {d2}, [r0], r2 553 vst1.u8 {d3}, [r1], r2 554 vqsub.u8 q2, q2, q10 555 vqadd.u8 q2, q2, q8 556 vst1.u8 {d4}, [r0] 557 vst1.u8 {d5}, [r1] 558 559WELS_ASM_FUNC_END 560 561 562WELS_ASM_FUNC_BEGIN DeblockChromaEq4V_neon 563 vpush {q4-q5} 564 565 vdup.u8 q11, r3 566 ldr r3, [sp, #32] 567 568 sub r0, r0, r2 , lsl #1 569 sub r1, r1, r2, lsl #1 570 vdup.u8 q9, r3 571 vld1.u8 {d0}, [r0], r2 // q0::p1 572 vld1.u8 {d1}, [r1], r2 573 vld1.u8 {d2}, [r0], r2 // q1::p0 574 vld1.u8 {d3}, [r1], r2 575 vld1.u8 {d4}, [r0], r2 // q2::q0 576 vld1.u8 {d5}, [r1], r2 577 vld1.u8 {d6}, [r0] // q3::q1 578 vld1.u8 {d7}, [r1] 579 580 sub r0, r0, r2, lsl #1 // pix = [-1*src_stride] 581 sub r1, r1, r2, lsl #1 582 583 MASK_MATRIX q0, q1, q2, q3, q11, q9, q10 584 585 vmov q11, q10 586 587 DIFF_CHROMA_EQ4_P0Q0 d0, d2, d4, d6, q4, q5, q8, d30, d0 // Cb::p0' q0' 588 DIFF_CHROMA_EQ4_P0Q0 d1, d3, d5, d7, q12, q13, q14, d31, d1 // Cr::p0' q0' 589 590 vbsl.u8 q10, q15, q1 591 vst1.u8 {d20}, [r0], r2 592 vst1.u8 {d21}, [r1], r2 593 594 vbsl.u8 q11, q0, q2 595 vst1.u8 {d22}, [r0] 596 vst1.u8 {d23}, [r1] 597 598 vpop {q4-q5} 599WELS_ASM_FUNC_END 600 601WELS_ASM_FUNC_BEGIN DeblockChromaLt4H_neon 602 603 vdup.u8 q11, r3 604 ldr r3, [sp, #0] 605 606 sub r0, r0, #2 607 vdup.u8 q9, r3 608 ldr r3, [sp, #4] 609 sub r1, r1, #2 610 vld1.s8 {d31}, [r3] 611 612 LOAD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 0 613 LOAD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 1 614 LOAD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 2 615 LOAD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 3 616 LOAD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 4 617 LOAD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 5 618 LOAD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 6 619 LOAD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 7 620 vswp q1, q2 621 vswp d1, d2 622 vswp d6, d5 623 624 vmovl.u8 q14, d31 625 vshl.u64 d29,d28,#8 626 vorr d28,d29 627 vmov d29, d28 628 veor q15, q15 629 vsub.i8 q15,q15,q14 630 631 MASK_MATRIX q0, q1, q2, q3, q11, q9, q10 632 633 DIFF_LUMA_LT4_P0_Q0 d0, d2, d4, d6, d16, q12, q13 634 DIFF_LUMA_LT4_P0_Q0 d1, d3, d5, d7, d17, q12, q13 635 vmax.s8 q8, q8, q15 636 vmin.s8 q8, q8, q14 637 638 vand.s8 q8, q8, q10 639 vcge.s8 q14, q14, #0 640 vand.s8 q8, q8, q14 641 EXTRACT_DELTA_INTO_TWO_PART q8, q10 642 vqadd.u8 q1, q1, q10 643 vqsub.u8 q1, q1, q8 644 vqsub.u8 q2, q2, q10 645 vqadd.u8 q2, q2, q8 646 647 sub r0, r0, r2, lsl #3 648 sub r1, r1, r2, lsl #3 649 vswp d1, d2 650 vswp d6, d5 651 vswp q1, q2 652 653 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 0 654 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 1 655 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 2 656 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 3 657 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 4 658 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 5 659 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 6 660 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 7 661 662WELS_ASM_FUNC_END 663 664WELS_ASM_FUNC_BEGIN DeblockChromaEq4H_neon 665 vpush {q4-q5} 666 vdup.u8 q11, r3 667 ldr r3, [sp, #32] 668 669 sub r0, r0, #2 670 sub r1, r1, #2 671 672 LOAD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 0 673 LOAD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 1 674 LOAD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 2 675 LOAD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 3 676 LOAD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 4 677 LOAD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 5 678 LOAD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 6 679 LOAD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 7 680 vswp q1, q2 681 vswp d1, d2 682 vswp d6, d5 683 684 vdup.u8 q9, r3 685 MASK_MATRIX q0, q1, q2, q3, q11, q9, q10 686 vmov q11, q10 687 688 DIFF_CHROMA_EQ4_P0Q0 d0, d2, d4, d6, q8, q9, q12, d8, d10 689 DIFF_CHROMA_EQ4_P0Q0 d1, d3, d5, d7, q13, q14, q15, d9, d11 690 691 vbsl.u8 q10, q4, q1 692 vbsl.u8 q11, q5, q2 693 sub r0, r0, r2, lsl #3 // pix: 0th row [-2] 694 sub r1, r1, r2, lsl #3 695 696 vmov q1, q10 697 vmov q2, q11 698 vswp d1, d2 699 vswp d6, d5 700 vswp q1, q2 701 // Cb:d0d1d2d3, Cr:d4d5d6d7 702 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 0 703 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 1 704 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 2 705 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 3 706 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 4 707 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 5 708 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 6 709 STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 7 710 711 vpop {q4-q5} 712WELS_ASM_FUNC_END 713 714 715WELS_ASM_FUNC_BEGIN WelsNonZeroCount_neon 716 mov r1, #1 717 vdup.8 q2, r1 718 vld1.64 {d0,d1,d2}, [r0] 719 vmin.s8 q0, q0, q2 720 vmin.s8 d2, d2, d4 721 vst1.64 {d0,d1,d2}, [r0] 722WELS_ASM_FUNC_END 723 724.macro BS_NZC_CHECK arg0, arg1, arg2, arg3, arg4 725 vld1.8 {d0,d1}, [\arg0] 726 /* Arrenge the input data --- TOP */ 727 ands r6, \arg1, #2 728 beq bs_nzc_check_jump0 729 730 sub r6, \arg0, \arg2, lsl #4 731 sub r6, r6, \arg2, lsl #3 732 add r6, #12 733 vld1.32 d3[1], [r6] 734 735bs_nzc_check_jump0: 736 vext.8 q1, q1, q0, #12 737 vadd.u8 \arg3, q0, q1 738 739 740 /* Arrenge the input data --- LEFT */ 741 ands r6, \arg1, #1 742 beq bs_nzc_check_jump1 743 744 sub r6, \arg0, #21 745 add r7, r6, #4 746 vld1.8 d3[4], [r6] 747 add r6, r7, #4 748 vld1.8 d3[5], [r7] 749 add r7, r6, #4 750 vld1.8 d3[6], [r6] 751 vld1.8 d3[7], [r7] 752 753bs_nzc_check_jump1: 754 vzip.8 d0, d1 755 vzip.8 d0, d1 756 vext.8 q1, q1, q0, #12 757 vadd.u8 \arg4, q0, q1 758.endm 759 760.macro BS_COMPARE_MV arg0, arg1, arg2, arg3, arg4, arg5, arg6 //in: $0,$1(const),$2(const),$3(const),$4(const); out:$5, $6 761 mov r6, #4 762 vabd.s16 q8, \arg0, \arg1 763 vabd.s16 q9, \arg1, \arg2 764 vdup.s16 \arg0, r6 765 vabd.s16 q10, \arg2, \arg3 766 vabd.s16 q11, \arg3, \arg4 767 768 vcge.s16 q8, \arg0 769 vcge.s16 q9, \arg0 770 vcge.s16 q10, \arg0 771 vcge.s16 q11, \arg0 772 773 vpadd.i16 d16, d16, d17 774 vpadd.i16 d17, d18, d19 775 vpadd.i16 d18, d20, d21 776 vpadd.i16 d19, d22, d23 777 778 vaddhn.i16 \arg5, q8, q8 779 vaddhn.i16 \arg6, q9, q9 780.endm 781 782.macro BS_MV_CHECK arg0, arg1, arg2, arg3, arg4, arg5, arg6 783 vldm \arg0, {q0,q1,q2,q3} 784 785 /* Arrenge the input data --- TOP */ 786 ands r6, \arg1, #2 787 beq bs_mv_check_jump0 788 789 sub r6, \arg0, \arg2, lsl #6 790 add r6, #48 791 vld1.8 {d8, d9}, [r6] 792 793bs_mv_check_jump0: 794 BS_COMPARE_MV q4, q0, q1, q2, q3, \arg3, \arg4 795 796 /* Arrenge the input data --- LEFT */ 797 ands r6, \arg1, #1 798 beq bs_mv_check_jump1 799 800 sub r6, \arg0, #52 801 add r7, r6, #16 802 vld1.32 d8[0], [r6] 803 add r6, r7, #16 804 vld1.32 d8[1], [r7] 805 add r7, r6, #16 806 vld1.32 d9[0], [r6] 807 vld1.32 d9[1], [r7] 808 809bs_mv_check_jump1: 810 vzip.32 q0, q2 811 vzip.32 q1, q3 812 vzip.32 q0, q1 813 vzip.32 q2, q3 814 BS_COMPARE_MV q4, q0, q1, q2, q3, \arg5, \arg6 815.endm 816 817 818WELS_ASM_FUNC_BEGIN DeblockingBSCalcEnc_neon 819 820 stmdb sp!, {r5-r7} 821 vpush {q4} 822 823 ldr r5, [sp, #28] //Save BS to r5 824 825 /* Checking the nzc status */ 826 BS_NZC_CHECK r0, r2, r3, q14, q15 //q14,q15 save the nzc status 827 828 /* For checking bS[I] = 2 */ 829 mov r6, #2 830 vcgt.s8 q14, q14, #0 831 vdup.u8 q0, r6 832 vcgt.s8 q15, q15, #0 833 834 vand.u8 q14, q14, q0 //q14 save the nzc check result all the time --- for dir is top 835 vand.u8 q15, q15, q0 //q15 save the nzc check result all the time --- for dir is left 836 837 /* Checking the mv status*/ 838 BS_MV_CHECK r1, r2, r3, d24, d25, d26, d27//q12, q13 save the mv status 839 840 /* For checking bS[I] = 1 */ 841 mov r6, #1 842 vdup.u8 q0, r6 843 844 vand.u8 q12, q12, q0 //q12 save the nzc check result all the time --- for dir is top 845 vand.u8 q13, q13, q0 //q13 save the nzc check result all the time --- for dir is left 846 847 848 /* Check bS[I] is '1' or '2' */ 849 vmax.u8 q1, q12, q14 850 vmax.u8 q0, q13, q15 851 852 //vstm r5, {q0, q1} 853 vst1.32 {q0, q1}, [r5] 854 vpop {q4} 855 ldmia sp!, {r5-r7} 856WELS_ASM_FUNC_END 857#endif 858