1 /* 2 * Copyright 2015 The LibYuv 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 #include <string.h> // For memset/memcpy 12 13 #include "libyuv/scale.h" 14 #include "libyuv/scale_row.h" 15 16 #include "libyuv/basic_types.h" 17 18 #ifdef __cplusplus 19 namespace libyuv { 20 extern "C" { 21 #endif 22 23 // Fixed scale down. 24 // Mask may be non-power of 2, so use MOD 25 #define SDANY(NAMEANY, SCALEROWDOWN_SIMD, SCALEROWDOWN_C, FACTOR, BPP, MASK) \ 26 void NAMEANY(const uint8_t* src_ptr, ptrdiff_t src_stride, uint8_t* dst_ptr, \ 27 int dst_width) { \ 28 int r = (int)((unsigned int)dst_width % (MASK + 1)); /* NOLINT */ \ 29 int n = dst_width - r; \ 30 if (n > 0) { \ 31 SCALEROWDOWN_SIMD(src_ptr, src_stride, dst_ptr, n); \ 32 } \ 33 SCALEROWDOWN_C(src_ptr + (n * FACTOR) * BPP, src_stride, \ 34 dst_ptr + n * BPP, r); \ 35 } 36 37 // Fixed scale down for odd source width. Used by I420Blend subsampling. 38 // Since dst_width is (width + 1) / 2, this function scales one less pixel 39 // and copies the last pixel. 40 #define SDODD(NAMEANY, SCALEROWDOWN_SIMD, SCALEROWDOWN_C, FACTOR, BPP, MASK) \ 41 void NAMEANY(const uint8_t* src_ptr, ptrdiff_t src_stride, uint8_t* dst_ptr, \ 42 int dst_width) { \ 43 int r = (int)((unsigned int)(dst_width - 1) % (MASK + 1)); /* NOLINT */ \ 44 int n = (dst_width - 1) - r; \ 45 if (n > 0) { \ 46 SCALEROWDOWN_SIMD(src_ptr, src_stride, dst_ptr, n); \ 47 } \ 48 SCALEROWDOWN_C(src_ptr + (n * FACTOR) * BPP, src_stride, \ 49 dst_ptr + n * BPP, r + 1); \ 50 } 51 52 #ifdef HAS_SCALEROWDOWN2_SSSE3 53 SDANY(ScaleRowDown2_Any_SSSE3, ScaleRowDown2_SSSE3, ScaleRowDown2_C, 2, 1, 15) 54 SDANY(ScaleRowDown2Linear_Any_SSSE3, 55 ScaleRowDown2Linear_SSSE3, 56 ScaleRowDown2Linear_C, 57 2, 58 1, 59 15) 60 SDANY(ScaleRowDown2Box_Any_SSSE3, 61 ScaleRowDown2Box_SSSE3, 62 ScaleRowDown2Box_C, 63 2, 64 1, 65 15) 66 SDODD(ScaleRowDown2Box_Odd_SSSE3, 67 ScaleRowDown2Box_SSSE3, 68 ScaleRowDown2Box_Odd_C, 69 2, 70 1, 71 15) 72 #endif 73 #ifdef HAS_SCALEUVROWDOWN2BOX_SSSE3 74 SDANY(ScaleUVRowDown2Box_Any_SSSE3, 75 ScaleUVRowDown2Box_SSSE3, 76 ScaleUVRowDown2Box_C, 77 2, 78 2, 79 4) 80 #endif 81 #ifdef HAS_SCALEUVROWDOWN2BOX_AVX2 82 SDANY(ScaleUVRowDown2Box_Any_AVX2, 83 ScaleUVRowDown2Box_AVX2, 84 ScaleUVRowDown2Box_C, 85 2, 86 2, 87 8) 88 #endif 89 #ifdef HAS_SCALEROWDOWN2_AVX2 90 SDANY(ScaleRowDown2_Any_AVX2, ScaleRowDown2_AVX2, ScaleRowDown2_C, 2, 1, 31) 91 SDANY(ScaleRowDown2Linear_Any_AVX2, 92 ScaleRowDown2Linear_AVX2, 93 ScaleRowDown2Linear_C, 94 2, 95 1, 96 31) 97 SDANY(ScaleRowDown2Box_Any_AVX2, 98 ScaleRowDown2Box_AVX2, 99 ScaleRowDown2Box_C, 100 2, 101 1, 102 31) 103 SDODD(ScaleRowDown2Box_Odd_AVX2, 104 ScaleRowDown2Box_AVX2, 105 ScaleRowDown2Box_Odd_C, 106 2, 107 1, 108 31) 109 #endif 110 #ifdef HAS_SCALEROWDOWN2_NEON 111 SDANY(ScaleRowDown2_Any_NEON, ScaleRowDown2_NEON, ScaleRowDown2_C, 2, 1, 15) 112 SDANY(ScaleRowDown2Linear_Any_NEON, 113 ScaleRowDown2Linear_NEON, 114 ScaleRowDown2Linear_C, 115 2, 116 1, 117 15) 118 SDANY(ScaleRowDown2Box_Any_NEON, 119 ScaleRowDown2Box_NEON, 120 ScaleRowDown2Box_C, 121 2, 122 1, 123 15) 124 SDODD(ScaleRowDown2Box_Odd_NEON, 125 ScaleRowDown2Box_NEON, 126 ScaleRowDown2Box_Odd_C, 127 2, 128 1, 129 15) 130 #endif 131 #ifdef HAS_SCALEUVROWDOWN2BOX_NEON 132 SDANY(ScaleUVRowDown2Box_Any_NEON, 133 ScaleUVRowDown2Box_NEON, 134 ScaleUVRowDown2Box_C, 135 2, 136 2, 137 8) 138 #endif 139 140 #ifdef HAS_SCALEROWDOWN2_MSA 141 SDANY(ScaleRowDown2_Any_MSA, ScaleRowDown2_MSA, ScaleRowDown2_C, 2, 1, 31) 142 SDANY(ScaleRowDown2Linear_Any_MSA, 143 ScaleRowDown2Linear_MSA, 144 ScaleRowDown2Linear_C, 145 2, 146 1, 147 31) 148 SDANY(ScaleRowDown2Box_Any_MSA, 149 ScaleRowDown2Box_MSA, 150 ScaleRowDown2Box_C, 151 2, 152 1, 153 31) 154 #endif 155 #ifdef HAS_SCALEROWDOWN2_MMI 156 SDANY(ScaleRowDown2_Any_MMI, ScaleRowDown2_MMI, ScaleRowDown2_C, 2, 1, 7) 157 SDANY(ScaleRowDown2Linear_Any_MMI, 158 ScaleRowDown2Linear_MMI, 159 ScaleRowDown2Linear_C, 160 2, 161 1, 162 7) 163 SDANY(ScaleRowDown2Box_Any_MMI, 164 ScaleRowDown2Box_MMI, 165 ScaleRowDown2Box_C, 166 2, 167 1, 168 7) 169 SDODD(ScaleRowDown2Box_Odd_MMI, 170 ScaleRowDown2Box_MMI, 171 ScaleRowDown2Box_Odd_C, 172 2, 173 1, 174 7) 175 #endif 176 #ifdef HAS_SCALEROWDOWN4_SSSE3 177 SDANY(ScaleRowDown4_Any_SSSE3, ScaleRowDown4_SSSE3, ScaleRowDown4_C, 4, 1, 7) 178 SDANY(ScaleRowDown4Box_Any_SSSE3, 179 ScaleRowDown4Box_SSSE3, 180 ScaleRowDown4Box_C, 181 4, 182 1, 183 7) 184 #endif 185 #ifdef HAS_SCALEROWDOWN4_AVX2 186 SDANY(ScaleRowDown4_Any_AVX2, ScaleRowDown4_AVX2, ScaleRowDown4_C, 4, 1, 15) 187 SDANY(ScaleRowDown4Box_Any_AVX2, 188 ScaleRowDown4Box_AVX2, 189 ScaleRowDown4Box_C, 190 4, 191 1, 192 15) 193 #endif 194 #ifdef HAS_SCALEROWDOWN4_NEON 195 SDANY(ScaleRowDown4_Any_NEON, ScaleRowDown4_NEON, ScaleRowDown4_C, 4, 1, 7) 196 SDANY(ScaleRowDown4Box_Any_NEON, 197 ScaleRowDown4Box_NEON, 198 ScaleRowDown4Box_C, 199 4, 200 1, 201 7) 202 #endif 203 #ifdef HAS_SCALEROWDOWN4_MSA 204 SDANY(ScaleRowDown4_Any_MSA, ScaleRowDown4_MSA, ScaleRowDown4_C, 4, 1, 15) 205 SDANY(ScaleRowDown4Box_Any_MSA, 206 ScaleRowDown4Box_MSA, 207 ScaleRowDown4Box_C, 208 4, 209 1, 210 15) 211 #endif 212 #ifdef HAS_SCALEROWDOWN4_MMI 213 SDANY(ScaleRowDown4_Any_MMI, ScaleRowDown4_MMI, ScaleRowDown4_C, 4, 1, 7) 214 SDANY(ScaleRowDown4Box_Any_MMI, 215 ScaleRowDown4Box_MMI, 216 ScaleRowDown4Box_C, 217 4, 218 1, 219 7) 220 #endif 221 #ifdef HAS_SCALEROWDOWN34_SSSE3 222 SDANY(ScaleRowDown34_Any_SSSE3, 223 ScaleRowDown34_SSSE3, 224 ScaleRowDown34_C, 225 4 / 3, 226 1, 227 23) 228 SDANY(ScaleRowDown34_0_Box_Any_SSSE3, 229 ScaleRowDown34_0_Box_SSSE3, 230 ScaleRowDown34_0_Box_C, 231 4 / 3, 232 1, 233 23) 234 SDANY(ScaleRowDown34_1_Box_Any_SSSE3, 235 ScaleRowDown34_1_Box_SSSE3, 236 ScaleRowDown34_1_Box_C, 237 4 / 3, 238 1, 239 23) 240 #endif 241 #ifdef HAS_SCALEROWDOWN34_NEON 242 SDANY(ScaleRowDown34_Any_NEON, 243 ScaleRowDown34_NEON, 244 ScaleRowDown34_C, 245 4 / 3, 246 1, 247 23) 248 SDANY(ScaleRowDown34_0_Box_Any_NEON, 249 ScaleRowDown34_0_Box_NEON, 250 ScaleRowDown34_0_Box_C, 251 4 / 3, 252 1, 253 23) 254 SDANY(ScaleRowDown34_1_Box_Any_NEON, 255 ScaleRowDown34_1_Box_NEON, 256 ScaleRowDown34_1_Box_C, 257 4 / 3, 258 1, 259 23) 260 #endif 261 #ifdef HAS_SCALEROWDOWN34_MSA 262 SDANY(ScaleRowDown34_Any_MSA, 263 ScaleRowDown34_MSA, 264 ScaleRowDown34_C, 265 4 / 3, 266 1, 267 47) 268 SDANY(ScaleRowDown34_0_Box_Any_MSA, 269 ScaleRowDown34_0_Box_MSA, 270 ScaleRowDown34_0_Box_C, 271 4 / 3, 272 1, 273 47) 274 SDANY(ScaleRowDown34_1_Box_Any_MSA, 275 ScaleRowDown34_1_Box_MSA, 276 ScaleRowDown34_1_Box_C, 277 4 / 3, 278 1, 279 47) 280 #endif 281 #ifdef HAS_SCALEROWDOWN34_MMI 282 SDANY(ScaleRowDown34_Any_MMI, 283 ScaleRowDown34_MMI, 284 ScaleRowDown34_C, 285 4 / 3, 286 1, 287 23) 288 #endif 289 #ifdef HAS_SCALEROWDOWN38_SSSE3 290 SDANY(ScaleRowDown38_Any_SSSE3, 291 ScaleRowDown38_SSSE3, 292 ScaleRowDown38_C, 293 8 / 3, 294 1, 295 11) 296 SDANY(ScaleRowDown38_3_Box_Any_SSSE3, 297 ScaleRowDown38_3_Box_SSSE3, 298 ScaleRowDown38_3_Box_C, 299 8 / 3, 300 1, 301 5) 302 SDANY(ScaleRowDown38_2_Box_Any_SSSE3, 303 ScaleRowDown38_2_Box_SSSE3, 304 ScaleRowDown38_2_Box_C, 305 8 / 3, 306 1, 307 5) 308 #endif 309 #ifdef HAS_SCALEROWDOWN38_NEON 310 SDANY(ScaleRowDown38_Any_NEON, 311 ScaleRowDown38_NEON, 312 ScaleRowDown38_C, 313 8 / 3, 314 1, 315 11) 316 SDANY(ScaleRowDown38_3_Box_Any_NEON, 317 ScaleRowDown38_3_Box_NEON, 318 ScaleRowDown38_3_Box_C, 319 8 / 3, 320 1, 321 11) 322 SDANY(ScaleRowDown38_2_Box_Any_NEON, 323 ScaleRowDown38_2_Box_NEON, 324 ScaleRowDown38_2_Box_C, 325 8 / 3, 326 1, 327 11) 328 #endif 329 #ifdef HAS_SCALEROWDOWN38_MSA 330 SDANY(ScaleRowDown38_Any_MSA, 331 ScaleRowDown38_MSA, 332 ScaleRowDown38_C, 333 8 / 3, 334 1, 335 11) 336 SDANY(ScaleRowDown38_3_Box_Any_MSA, 337 ScaleRowDown38_3_Box_MSA, 338 ScaleRowDown38_3_Box_C, 339 8 / 3, 340 1, 341 11) 342 SDANY(ScaleRowDown38_2_Box_Any_MSA, 343 ScaleRowDown38_2_Box_MSA, 344 ScaleRowDown38_2_Box_C, 345 8 / 3, 346 1, 347 11) 348 #endif 349 350 #ifdef HAS_SCALEARGBROWDOWN2_SSE2 351 SDANY(ScaleARGBRowDown2_Any_SSE2, 352 ScaleARGBRowDown2_SSE2, 353 ScaleARGBRowDown2_C, 354 2, 355 4, 356 3) 357 SDANY(ScaleARGBRowDown2Linear_Any_SSE2, 358 ScaleARGBRowDown2Linear_SSE2, 359 ScaleARGBRowDown2Linear_C, 360 2, 361 4, 362 3) 363 SDANY(ScaleARGBRowDown2Box_Any_SSE2, 364 ScaleARGBRowDown2Box_SSE2, 365 ScaleARGBRowDown2Box_C, 366 2, 367 4, 368 3) 369 #endif 370 #ifdef HAS_SCALEARGBROWDOWN2_NEON 371 SDANY(ScaleARGBRowDown2_Any_NEON, 372 ScaleARGBRowDown2_NEON, 373 ScaleARGBRowDown2_C, 374 2, 375 4, 376 7) 377 SDANY(ScaleARGBRowDown2Linear_Any_NEON, 378 ScaleARGBRowDown2Linear_NEON, 379 ScaleARGBRowDown2Linear_C, 380 2, 381 4, 382 7) 383 SDANY(ScaleARGBRowDown2Box_Any_NEON, 384 ScaleARGBRowDown2Box_NEON, 385 ScaleARGBRowDown2Box_C, 386 2, 387 4, 388 7) 389 #endif 390 #ifdef HAS_SCALEARGBROWDOWN2_MSA 391 SDANY(ScaleARGBRowDown2_Any_MSA, 392 ScaleARGBRowDown2_MSA, 393 ScaleARGBRowDown2_C, 394 2, 395 4, 396 3) 397 SDANY(ScaleARGBRowDown2Linear_Any_MSA, 398 ScaleARGBRowDown2Linear_MSA, 399 ScaleARGBRowDown2Linear_C, 400 2, 401 4, 402 3) 403 SDANY(ScaleARGBRowDown2Box_Any_MSA, 404 ScaleARGBRowDown2Box_MSA, 405 ScaleARGBRowDown2Box_C, 406 2, 407 4, 408 3) 409 #endif 410 #ifdef HAS_SCALEARGBROWDOWN2_MMI 411 SDANY(ScaleARGBRowDown2_Any_MMI, 412 ScaleARGBRowDown2_MMI, 413 ScaleARGBRowDown2_C, 414 2, 415 4, 416 1) 417 SDANY(ScaleARGBRowDown2Linear_Any_MMI, 418 ScaleARGBRowDown2Linear_MMI, 419 ScaleARGBRowDown2Linear_C, 420 2, 421 4, 422 1) 423 SDANY(ScaleARGBRowDown2Box_Any_MMI, 424 ScaleARGBRowDown2Box_MMI, 425 ScaleARGBRowDown2Box_C, 426 2, 427 4, 428 1) 429 #endif 430 #undef SDANY 431 432 // Scale down by even scale factor. 433 #define SDAANY(NAMEANY, SCALEROWDOWN_SIMD, SCALEROWDOWN_C, BPP, MASK) \ 434 void NAMEANY(const uint8_t* src_ptr, ptrdiff_t src_stride, int src_stepx, \ 435 uint8_t* dst_ptr, int dst_width) { \ 436 int r = dst_width & MASK; \ 437 int n = dst_width & ~MASK; \ 438 if (n > 0) { \ 439 SCALEROWDOWN_SIMD(src_ptr, src_stride, src_stepx, dst_ptr, n); \ 440 } \ 441 SCALEROWDOWN_C(src_ptr + (n * src_stepx) * BPP, src_stride, src_stepx, \ 442 dst_ptr + n * BPP, r); \ 443 } 444 445 #ifdef HAS_SCALEARGBROWDOWNEVEN_SSE2 446 SDAANY(ScaleARGBRowDownEven_Any_SSE2, 447 ScaleARGBRowDownEven_SSE2, 448 ScaleARGBRowDownEven_C, 449 4, 450 3) 451 SDAANY(ScaleARGBRowDownEvenBox_Any_SSE2, 452 ScaleARGBRowDownEvenBox_SSE2, 453 ScaleARGBRowDownEvenBox_C, 454 4, 455 3) 456 #endif 457 #ifdef HAS_SCALEARGBROWDOWNEVEN_NEON 458 SDAANY(ScaleARGBRowDownEven_Any_NEON, 459 ScaleARGBRowDownEven_NEON, 460 ScaleARGBRowDownEven_C, 461 4, 462 3) 463 SDAANY(ScaleARGBRowDownEvenBox_Any_NEON, 464 ScaleARGBRowDownEvenBox_NEON, 465 ScaleARGBRowDownEvenBox_C, 466 4, 467 3) 468 #endif 469 #ifdef HAS_SCALEARGBROWDOWNEVEN_MSA 470 SDAANY(ScaleARGBRowDownEven_Any_MSA, 471 ScaleARGBRowDownEven_MSA, 472 ScaleARGBRowDownEven_C, 473 4, 474 3) 475 SDAANY(ScaleARGBRowDownEvenBox_Any_MSA, 476 ScaleARGBRowDownEvenBox_MSA, 477 ScaleARGBRowDownEvenBox_C, 478 4, 479 3) 480 #endif 481 #ifdef HAS_SCALEARGBROWDOWNEVEN_MMI 482 SDAANY(ScaleARGBRowDownEven_Any_MMI, 483 ScaleARGBRowDownEven_MMI, 484 ScaleARGBRowDownEven_C, 485 4, 486 1) 487 SDAANY(ScaleARGBRowDownEvenBox_Any_MMI, 488 ScaleARGBRowDownEvenBox_MMI, 489 ScaleARGBRowDownEvenBox_C, 490 4, 491 1) 492 #endif 493 #ifdef HAS_SCALEUVROWDOWNEVEN_NEON 494 SDAANY(ScaleUVRowDownEven_Any_NEON, 495 ScaleUVRowDownEven_NEON, 496 ScaleUVRowDownEven_C, 497 2, 498 3) 499 #endif 500 501 #ifdef SASIMDONLY 502 // This also works and uses memcpy and SIMD instead of C, but is slower on ARM 503 504 // Add rows box filter scale down. Using macro from row_any 505 #define SAROW(NAMEANY, ANY_SIMD, SBPP, BPP, MASK) \ 506 void NAMEANY(const uint8_t* src_ptr, uint16_t* dst_ptr, int width) { \ 507 SIMD_ALIGNED(uint16_t dst_temp[32]); \ 508 SIMD_ALIGNED(uint8_t src_temp[32]); \ 509 memset(dst_temp, 0, 32 * 2); /* for msan */ \ 510 int r = width & MASK; \ 511 int n = width & ~MASK; \ 512 if (n > 0) { \ 513 ANY_SIMD(src_ptr, dst_ptr, n); \ 514 } \ 515 memcpy(src_temp, src_ptr + n * SBPP, r * SBPP); \ 516 memcpy(dst_temp, dst_ptr + n * BPP, r * BPP); \ 517 ANY_SIMD(src_temp, dst_temp, MASK + 1); \ 518 memcpy(dst_ptr + n * BPP, dst_temp, r * BPP); \ 519 } 520 521 #ifdef HAS_SCALEADDROW_SSE2 522 SAROW(ScaleAddRow_Any_SSE2, ScaleAddRow_SSE2, 1, 2, 15) 523 #endif 524 #ifdef HAS_SCALEADDROW_AVX2 525 SAROW(ScaleAddRow_Any_AVX2, ScaleAddRow_AVX2, 1, 2, 31) 526 #endif 527 #ifdef HAS_SCALEADDROW_NEON 528 SAROW(ScaleAddRow_Any_NEON, ScaleAddRow_NEON, 1, 2, 15) 529 #endif 530 #ifdef HAS_SCALEADDROW_MSA 531 SAROW(ScaleAddRow_Any_MSA, ScaleAddRow_MSA, 1, 2, 15) 532 #endif 533 #ifdef HAS_SCALEADDROW_MMI 534 SAROW(ScaleAddRow_Any_MMI, ScaleAddRow_MMI, 1, 2, 7) 535 #endif 536 #undef SAANY 537 538 #else 539 540 // Add rows box filter scale down. 541 #define SAANY(NAMEANY, SCALEADDROW_SIMD, SCALEADDROW_C, MASK) \ 542 void NAMEANY(const uint8_t* src_ptr, uint16_t* dst_ptr, int src_width) { \ 543 int n = src_width & ~MASK; \ 544 if (n > 0) { \ 545 SCALEADDROW_SIMD(src_ptr, dst_ptr, n); \ 546 } \ 547 SCALEADDROW_C(src_ptr + n, dst_ptr + n, src_width & MASK); \ 548 } 549 550 #ifdef HAS_SCALEADDROW_SSE2 551 SAANY(ScaleAddRow_Any_SSE2, ScaleAddRow_SSE2, ScaleAddRow_C, 15) 552 #endif 553 #ifdef HAS_SCALEADDROW_AVX2 554 SAANY(ScaleAddRow_Any_AVX2, ScaleAddRow_AVX2, ScaleAddRow_C, 31) 555 #endif 556 #ifdef HAS_SCALEADDROW_NEON 557 SAANY(ScaleAddRow_Any_NEON, ScaleAddRow_NEON, ScaleAddRow_C, 15) 558 #endif 559 #ifdef HAS_SCALEADDROW_MSA 560 SAANY(ScaleAddRow_Any_MSA, ScaleAddRow_MSA, ScaleAddRow_C, 15) 561 #endif 562 #ifdef HAS_SCALEADDROW_MMI 563 SAANY(ScaleAddRow_Any_MMI, ScaleAddRow_MMI, ScaleAddRow_C, 7) 564 #endif 565 #undef SAANY 566 567 #endif // SASIMDONLY 568 569 // Definition for ScaleFilterCols, ScaleARGBCols and ScaleARGBFilterCols 570 #define CANY(NAMEANY, TERP_SIMD, TERP_C, BPP, MASK) \ 571 void NAMEANY(uint8_t* dst_ptr, const uint8_t* src_ptr, int dst_width, int x, \ 572 int dx) { \ 573 int r = dst_width & MASK; \ 574 int n = dst_width & ~MASK; \ 575 if (n > 0) { \ 576 TERP_SIMD(dst_ptr, src_ptr, n, x, dx); \ 577 } \ 578 TERP_C(dst_ptr + n * BPP, src_ptr, r, x + n * dx, dx); \ 579 } 580 581 #ifdef HAS_SCALEFILTERCOLS_NEON 582 CANY(ScaleFilterCols_Any_NEON, ScaleFilterCols_NEON, ScaleFilterCols_C, 1, 7) 583 #endif 584 #ifdef HAS_SCALEFILTERCOLS_MSA 585 CANY(ScaleFilterCols_Any_MSA, ScaleFilterCols_MSA, ScaleFilterCols_C, 1, 15) 586 #endif 587 #ifdef HAS_SCALEARGBCOLS_NEON 588 CANY(ScaleARGBCols_Any_NEON, ScaleARGBCols_NEON, ScaleARGBCols_C, 4, 7) 589 #endif 590 #ifdef HAS_SCALEARGBCOLS_MSA 591 CANY(ScaleARGBCols_Any_MSA, ScaleARGBCols_MSA, ScaleARGBCols_C, 4, 3) 592 #endif 593 #ifdef HAS_SCALEARGBCOLS_MMI 594 CANY(ScaleARGBCols_Any_MMI, ScaleARGBCols_MMI, ScaleARGBCols_C, 4, 0) 595 #endif 596 #ifdef HAS_SCALEARGBFILTERCOLS_NEON 597 CANY(ScaleARGBFilterCols_Any_NEON, 598 ScaleARGBFilterCols_NEON, 599 ScaleARGBFilterCols_C, 600 4, 601 3) 602 #endif 603 #ifdef HAS_SCALEARGBFILTERCOLS_MSA 604 CANY(ScaleARGBFilterCols_Any_MSA, 605 ScaleARGBFilterCols_MSA, 606 ScaleARGBFilterCols_C, 607 4, 608 7) 609 #endif 610 #undef CANY 611 612 #ifdef __cplusplus 613 } // extern "C" 614 } // namespace libyuv 615 #endif 616