Changeset 5699 for pjproject/trunk/third_party/yuv/source/row_neon.cc
- Timestamp:
- Nov 21, 2017 9:25:11 AM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/third_party/yuv/source/row_neon.cc
r5633 r5699 116 116 YUVTORGB_SETUP 117 117 "vmov.u8 d23, #255 \n" 118 "1: 118 "1: \n" READYUV444 YUVTORGB 119 119 "subs %4, %4, #8 \n" 120 120 "vst4.8 {d20, d21, d22, d23}, [%3]! \n" … … 142 142 YUVTORGB_SETUP 143 143 "vmov.u8 d23, #255 \n" 144 "1: 144 "1: \n" READYUV422 YUVTORGB 145 145 "subs %4, %4, #8 \n" 146 146 "vst4.8 {d20, d21, d22, d23}, [%3]! \n" … … 168 168 asm volatile( 169 169 YUVTORGB_SETUP 170 "1: 170 "1: \n" READYUV422 YUVTORGB 171 171 "subs %5, %5, #8 \n" 172 172 "vld1.8 {d23}, [%3]! \n" … … 195 195 asm volatile( 196 196 YUVTORGB_SETUP 197 "1: 197 "1: \n" READYUV422 YUVTORGB 198 198 "subs %4, %4, #8 \n" 199 199 "vmov.u8 d19, #255 \n" // d19 modified by … … 222 222 asm volatile( 223 223 YUVTORGB_SETUP 224 "1: 224 "1: \n" READYUV422 YUVTORGB 225 225 "subs %4, %4, #8 \n" 226 226 "vst3.8 {d20, d21, d22}, [%3]! \n" … … 254 254 asm volatile( 255 255 YUVTORGB_SETUP 256 "1: 256 "1: \n" READYUV422 YUVTORGB 257 257 "subs %4, %4, #8 \n" ARGBTORGB565 258 258 "vst1.8 {q0}, [%3]! \n" // store 8 pixels RGB565. … … 288 288 asm volatile( 289 289 YUVTORGB_SETUP 290 "1: 290 "1: \n" READYUV422 YUVTORGB 291 291 "subs %4, %4, #8 \n" 292 292 "vmov.u8 d23, #255 \n" ARGBTOARGB1555 … … 326 326 "vmov.u8 d4, #0x0f \n" // bits to clear with 327 327 // vbic. 328 "1: 328 "1: \n" READYUV422 YUVTORGB 329 329 "subs %4, %4, #8 \n" 330 330 "vmov.u8 d23, #255 \n" ARGBTOARGB4444 … … 349 349 YUVTORGB_SETUP 350 350 "vmov.u8 d23, #255 \n" 351 "1: 351 "1: \n" READYUV400 YUVTORGB 352 352 "subs %2, %2, #8 \n" 353 353 "vst4.8 {d20, d21, d22, d23}, [%1]! \n" … … 367 367 asm volatile( 368 368 "vmov.u8 d23, #255 \n" 369 "1: 369 "1: \n" 370 370 "vld1.8 {d20}, [%0]! \n" 371 371 "vmov d21, d20 \n" … … 386 386 const struct YuvConstants* yuvconstants, 387 387 int width) { 388 asm volatile( 389 YUVTORGB_SETUP 390 "vmov.u8 d23, #255 \n" 391 "1: \n" READNV12 YUVTORGB 392 "subs %3, %3, #8 \n" 393 "vst4.8 {d20, d21, d22, d23}, [%2]! \n" 394 "bgt 1b \n" 395 : "+r"(src_y), // %0 396 "+r"(src_uv), // %1 397 "+r"(dst_argb), // %2 398 "+r"(width) // %3 399 : [kUVToRB] "r"(&yuvconstants->kUVToRB), 400 [kUVToG] "r"(&yuvconstants->kUVToG), 401 [kUVBiasBGR] "r"(&yuvconstants->kUVBiasBGR), 402 [kYToRgb] "r"(&yuvconstants->kYToRgb) 403 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q8", "q9", "q10", "q11", 404 "q12", "q13", "q14", "q15"); 388 asm volatile(YUVTORGB_SETUP 389 "vmov.u8 d23, #255 \n" 390 "1: \n" READNV12 YUVTORGB 391 "subs %3, %3, #8 \n" 392 "vst4.8 {d20, d21, d22, d23}, [%2]! \n" 393 "bgt 1b \n" 394 : "+r"(src_y), // %0 395 "+r"(src_uv), // %1 396 "+r"(dst_argb), // %2 397 "+r"(width) // %3 398 : [kUVToRB] "r"(&yuvconstants->kUVToRB), 399 [kUVToG] "r"(&yuvconstants->kUVToG), 400 [kUVBiasBGR] "r"(&yuvconstants->kUVBiasBGR), 401 [kYToRgb] "r"(&yuvconstants->kYToRgb) 402 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q8", "q9", 403 "q10", "q11", "q12", "q13", "q14", "q15"); 405 404 } 406 405 … … 410 409 const struct YuvConstants* yuvconstants, 411 410 int width) { 412 asm volatile( 413 YUVTORGB_SETUP 414 "vmov.u8 d23, #255 \n" 415 "1: \n" READNV21 YUVTORGB 416 "subs %3, %3, #8 \n" 417 "vst4.8 {d20, d21, d22, d23}, [%2]! \n" 418 "bgt 1b \n" 419 : "+r"(src_y), // %0 420 "+r"(src_vu), // %1 421 "+r"(dst_argb), // %2 422 "+r"(width) // %3 423 : [kUVToRB] "r"(&yuvconstants->kUVToRB), 424 [kUVToG] "r"(&yuvconstants->kUVToG), 425 [kUVBiasBGR] "r"(&yuvconstants->kUVBiasBGR), 426 [kYToRgb] "r"(&yuvconstants->kYToRgb) 427 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q8", "q9", "q10", "q11", 428 "q12", "q13", "q14", "q15"); 411 asm volatile(YUVTORGB_SETUP 412 "vmov.u8 d23, #255 \n" 413 "1: \n" READNV21 YUVTORGB 414 "subs %3, %3, #8 \n" 415 "vst4.8 {d20, d21, d22, d23}, [%2]! \n" 416 "bgt 1b \n" 417 : "+r"(src_y), // %0 418 "+r"(src_vu), // %1 419 "+r"(dst_argb), // %2 420 "+r"(width) // %3 421 : [kUVToRB] "r"(&yuvconstants->kUVToRB), 422 [kUVToG] "r"(&yuvconstants->kUVToG), 423 [kUVBiasBGR] "r"(&yuvconstants->kUVBiasBGR), 424 [kYToRgb] "r"(&yuvconstants->kYToRgb) 425 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q8", "q9", 426 "q10", "q11", "q12", "q13", "q14", "q15"); 429 427 } 430 428 … … 436 434 asm volatile( 437 435 YUVTORGB_SETUP 438 "1: 436 "1: \n" READNV12 YUVTORGB 439 437 "subs %3, %3, #8 \n" ARGBTORGB565 440 438 "vst1.8 {q0}, [%2]! \n" // store 8 pixels RGB565. … … 456 454 const struct YuvConstants* yuvconstants, 457 455 int width) { 458 asm volatile( 459 YUVTORGB_SETUP 460 "vmov.u8 d23, #255 \n" 461 "1: \n" READYUY2 YUVTORGB 462 "subs %2, %2, #8 \n" 463 "vst4.8 {d20, d21, d22, d23}, [%1]! \n" 464 "bgt 1b \n" 465 : "+r"(src_yuy2), // %0 466 "+r"(dst_argb), // %1 467 "+r"(width) // %2 468 : [kUVToRB] "r"(&yuvconstants->kUVToRB), 469 [kUVToG] "r"(&yuvconstants->kUVToG), 470 [kUVBiasBGR] "r"(&yuvconstants->kUVBiasBGR), 471 [kYToRgb] "r"(&yuvconstants->kYToRgb) 472 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q8", "q9", "q10", "q11", 473 "q12", "q13", "q14", "q15"); 456 asm volatile(YUVTORGB_SETUP 457 "vmov.u8 d23, #255 \n" 458 "1: \n" READYUY2 YUVTORGB 459 "subs %2, %2, #8 \n" 460 "vst4.8 {d20, d21, d22, d23}, [%1]! \n" 461 "bgt 1b \n" 462 : "+r"(src_yuy2), // %0 463 "+r"(dst_argb), // %1 464 "+r"(width) // %2 465 : [kUVToRB] "r"(&yuvconstants->kUVToRB), 466 [kUVToG] "r"(&yuvconstants->kUVToG), 467 [kUVBiasBGR] "r"(&yuvconstants->kUVBiasBGR), 468 [kYToRgb] "r"(&yuvconstants->kYToRgb) 469 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q8", "q9", 470 "q10", "q11", "q12", "q13", "q14", "q15"); 474 471 } 475 472 … … 478 475 const struct YuvConstants* yuvconstants, 479 476 int width) { 480 asm volatile( 481 YUVTORGB_SETUP 482 "vmov.u8 d23, #255 \n" 483 "1: \n" READUYVY YUVTORGB 484 "subs %2, %2, #8 \n" 485 "vst4.8 {d20, d21, d22, d23}, [%1]! \n" 486 "bgt 1b \n" 487 : "+r"(src_uyvy), // %0 488 "+r"(dst_argb), // %1 489 "+r"(width) // %2 490 : [kUVToRB] "r"(&yuvconstants->kUVToRB), 491 [kUVToG] "r"(&yuvconstants->kUVToG), 492 [kUVBiasBGR] "r"(&yuvconstants->kUVBiasBGR), 493 [kYToRgb] "r"(&yuvconstants->kYToRgb) 494 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q8", "q9", "q10", "q11", 495 "q12", "q13", "q14", "q15"); 477 asm volatile(YUVTORGB_SETUP 478 "vmov.u8 d23, #255 \n" 479 "1: \n" READUYVY YUVTORGB 480 "subs %2, %2, #8 \n" 481 "vst4.8 {d20, d21, d22, d23}, [%1]! \n" 482 "bgt 1b \n" 483 : "+r"(src_uyvy), // %0 484 "+r"(dst_argb), // %1 485 "+r"(width) // %2 486 : [kUVToRB] "r"(&yuvconstants->kUVToRB), 487 [kUVToG] "r"(&yuvconstants->kUVToG), 488 [kUVBiasBGR] "r"(&yuvconstants->kUVBiasBGR), 489 [kYToRgb] "r"(&yuvconstants->kYToRgb) 490 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q8", "q9", 491 "q10", "q11", "q12", "q13", "q14", "q15"); 496 492 } 497 493 … … 502 498 int width) { 503 499 asm volatile( 504 "1: 500 "1: \n" 505 501 "vld2.8 {q0, q1}, [%0]! \n" // load 16 pairs of UV 506 502 "subs %3, %3, #16 \n" // 16 processed per loop … … 523 519 int width) { 524 520 asm volatile( 525 "1: 521 "1: \n" 526 522 "vld1.8 {q0}, [%0]! \n" // load U 527 523 "vld1.8 {q1}, [%1]! \n" // load V 528 524 "subs %3, %3, #16 \n" // 16 processed per loop 529 "vst2. u8{q0, q1}, [%2]! \n" // store 16 pairs of UV525 "vst2.8 {q0, q1}, [%2]! \n" // store 16 pairs of UV 530 526 "bgt 1b \n" 531 527 : "+r"(src_u), // %0 … … 538 534 } 539 535 536 // Reads 16 packed RGB and write to planar dst_r, dst_g, dst_b. 537 void SplitRGBRow_NEON(const uint8* src_rgb, 538 uint8* dst_r, 539 uint8* dst_g, 540 uint8* dst_b, 541 int width) { 542 asm volatile( 543 "1: \n" 544 "vld3.8 {d0, d2, d4}, [%0]! \n" // load 8 RGB 545 "vld3.8 {d1, d3, d5}, [%0]! \n" // next 8 RGB 546 "subs %4, %4, #16 \n" // 16 processed per loop 547 "vst1.8 {q0}, [%1]! \n" // store R 548 "vst1.8 {q1}, [%2]! \n" // store G 549 "vst1.8 {q2}, [%3]! \n" // store B 550 "bgt 1b \n" 551 : "+r"(src_rgb), // %0 552 "+r"(dst_r), // %1 553 "+r"(dst_g), // %2 554 "+r"(dst_b), // %3 555 "+r"(width) // %4 556 : // Input registers 557 : "cc", "memory", "d0", "d1", "d2" // Clobber List 558 ); 559 } 560 561 // Reads 16 planar R's, G's and B's and writes out 16 packed RGB at a time 562 void MergeRGBRow_NEON(const uint8* src_r, 563 const uint8* src_g, 564 const uint8* src_b, 565 uint8* dst_rgb, 566 int width) { 567 asm volatile( 568 "1: \n" 569 "vld1.8 {q0}, [%0]! \n" // load R 570 "vld1.8 {q1}, [%1]! \n" // load G 571 "vld1.8 {q2}, [%2]! \n" // load B 572 "subs %4, %4, #16 \n" // 16 processed per loop 573 "vst3.8 {d0, d2, d4}, [%3]! \n" // store 8 RGB 574 "vst3.8 {d1, d3, d5}, [%3]! \n" // next 8 RGB 575 "bgt 1b \n" 576 : "+r"(src_r), // %0 577 "+r"(src_g), // %1 578 "+r"(src_b), // %2 579 "+r"(dst_rgb), // %3 580 "+r"(width) // %4 581 : // Input registers 582 : "cc", "memory", "q0", "q1", "q2" // Clobber List 583 ); 584 } 585 540 586 // Copy multiple of 32. vld4.8 allow unaligned and is fastest on a15. 541 587 void CopyRow_NEON(const uint8* src, uint8* dst, int count) { 542 588 asm volatile( 543 "1: 589 "1: \n" 544 590 "vld1.8 {d0, d1, d2, d3}, [%0]! \n" // load 32 545 591 "subs %2, %2, #32 \n" // 32 processed per loop … … 558 604 asm volatile( 559 605 "vdup.8 q0, %2 \n" // duplicate 16 bytes 560 "1: 606 "1: \n" 561 607 "subs %1, %1, #16 \n" // 16 bytes per loop 562 608 "vst1.8 {q0}, [%0]! \n" // store … … 572 618 asm volatile( 573 619 "vdup.u32 q0, %2 \n" // duplicate 4 ints 574 "1: 620 "1: \n" 575 621 "subs %1, %1, #4 \n" // 4 pixels per loop 576 622 "vst1.8 {q0}, [%0]! \n" // store … … 589 635 "sub %0, #16 \n" 590 636 591 "1: 637 "1: \n" 592 638 "vld1.8 {q0}, [%0], r3 \n" // src -= 16 593 639 "subs %2, #16 \n" // 16 pixels per loop. … … 613 659 "sub %0, #16 \n" 614 660 615 "1: 661 "1: \n" 616 662 "vld2.8 {d0, d1}, [%0], r12 \n" // src -= 16 617 663 "subs %3, #8 \n" // 8 pixels per loop. … … 635 681 "sub %0, #16 \n" 636 682 637 "1: 683 "1: \n" 638 684 "vld1.8 {q0}, [%0], r3 \n" // src -= 16 639 685 "subs %2, #4 \n" // 4 pixels per loop. … … 652 698 asm volatile( 653 699 "vmov.u8 d4, #255 \n" // Alpha 654 "1: 700 "1: \n" 655 701 "vld3.8 {d1, d2, d3}, [%0]! \n" // load 8 pixels of RGB24. 656 702 "subs %2, %2, #8 \n" // 8 processed per loop. … … 668 714 asm volatile( 669 715 "vmov.u8 d4, #255 \n" // Alpha 670 "1: 716 "1: \n" 671 717 "vld3.8 {d1, d2, d3}, [%0]! \n" // load 8 pixels of RAW. 672 718 "subs %2, %2, #8 \n" // 8 processed per loop. … … 684 730 void RAWToRGB24Row_NEON(const uint8* src_raw, uint8* dst_rgb24, int width) { 685 731 asm volatile( 686 "1: 732 "1: \n" 687 733 "vld3.8 {d1, d2, d3}, [%0]! \n" // load 8 pixels of RAW. 688 734 "subs %2, %2, #8 \n" // 8 processed per loop. … … 714 760 asm volatile( 715 761 "vmov.u8 d3, #255 \n" // Alpha 716 "1: 762 "1: \n" 717 763 "vld1.8 {q0}, [%0]! \n" // load 8 RGB565 pixels. 718 764 "subs %2, %2, #8 \n" // 8 processed per loop. … … 760 806 asm volatile( 761 807 "vmov.u8 d3, #255 \n" // Alpha 762 "1: 808 "1: \n" 763 809 "vld1.8 {q0}, [%0]! \n" // load 8 ARGB1555 pixels. 764 810 "subs %2, %2, #8 \n" // 8 processed per loop. … … 789 835 asm volatile( 790 836 "vmov.u8 d3, #255 \n" // Alpha 791 "1: 837 "1: \n" 792 838 "vld1.8 {q0}, [%0]! \n" // load 8 ARGB4444 pixels. 793 839 "subs %2, %2, #8 \n" // 8 processed per loop. … … 805 851 void ARGBToRGB24Row_NEON(const uint8* src_argb, uint8* dst_rgb24, int width) { 806 852 asm volatile( 807 "1: 853 "1: \n" 808 854 "vld4.8 {d1, d2, d3, d4}, [%0]! \n" // load 8 pixels of ARGB. 809 855 "subs %2, %2, #8 \n" // 8 processed per loop. … … 821 867 void ARGBToRAWRow_NEON(const uint8* src_argb, uint8* dst_raw, int width) { 822 868 asm volatile( 823 "1: 869 "1: \n" 824 870 "vld4.8 {d1, d2, d3, d4}, [%0]! \n" // load 8 pixels of ARGB. 825 871 "subs %2, %2, #8 \n" // 8 processed per loop. … … 837 883 void YUY2ToYRow_NEON(const uint8* src_yuy2, uint8* dst_y, int width) { 838 884 asm volatile( 839 "1: 885 "1: \n" 840 886 "vld2.8 {q0, q1}, [%0]! \n" // load 16 pixels of YUY2. 841 887 "subs %2, %2, #16 \n" // 16 processed per loop. … … 852 898 void UYVYToYRow_NEON(const uint8* src_uyvy, uint8* dst_y, int width) { 853 899 asm volatile( 854 "1: 900 "1: \n" 855 901 "vld2.8 {q0, q1}, [%0]! \n" // load 16 pixels of UYVY. 856 902 "subs %2, %2, #16 \n" // 16 processed per loop. … … 870 916 int width) { 871 917 asm volatile( 872 "1: 918 "1: \n" 873 919 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 16 pixels of YUY2. 874 920 "subs %3, %3, #16 \n" // 16 pixels = 8 UVs. … … 890 936 int width) { 891 937 asm volatile( 892 "1: 938 "1: \n" 893 939 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 16 pixels of UYVY. 894 940 "subs %3, %3, #16 \n" // 16 pixels = 8 UVs. … … 912 958 asm volatile( 913 959 "add %1, %0, %1 \n" // stride + src_yuy2 914 "1: 960 "1: \n" 915 961 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 16 pixels of YUY2. 916 962 "subs %4, %4, #16 \n" // 16 pixels = 8 UVs. … … 939 985 asm volatile( 940 986 "add %1, %0, %1 \n" // stride + src_uyvy 941 "1: 987 "1: \n" 942 988 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 16 pixels of UYVY. 943 989 "subs %4, %4, #16 \n" // 16 pixels = 8 UVs. … … 966 1012 asm volatile( 967 1013 "vld1.8 {q2}, [%3] \n" // shuffler 968 "1: 1014 "1: \n" 969 1015 "vld1.8 {q0}, [%0]! \n" // load 4 pixels. 970 1016 "subs %2, %2, #4 \n" // 4 processed per loop … … 987 1033 int width) { 988 1034 asm volatile( 989 "1: 1035 "1: \n" 990 1036 "vld2.8 {d0, d2}, [%0]! \n" // load 16 Ys 991 1037 "vld1.8 {d1}, [%1]! \n" // load 8 Us … … 1009 1055 int width) { 1010 1056 asm volatile( 1011 "1: 1057 "1: \n" 1012 1058 "vld2.8 {d1, d3}, [%0]! \n" // load 16 Ys 1013 1059 "vld1.8 {d0}, [%1]! \n" // load 8 Us … … 1027 1073 void ARGBToRGB565Row_NEON(const uint8* src_argb, uint8* dst_rgb565, int width) { 1028 1074 asm volatile( 1029 "1: 1075 "1: \n" 1030 1076 "vld4.8 {d20, d21, d22, d23}, [%0]! \n" // load 8 pixels of ARGB. 1031 1077 "subs %2, %2, #8 \n" // 8 processed per loop. … … 1046 1092 asm volatile( 1047 1093 "vdup.32 d2, %2 \n" // dither4 1048 "1: 1094 "1: \n" 1049 1095 "vld4.8 {d20, d21, d22, d23}, [%1]! \n" // load 8 pixels of ARGB. 1050 1096 "subs %3, %3, #8 \n" // 8 processed per loop. 1051 1097 "vqadd.u8 d20, d20, d2 \n" 1052 1098 "vqadd.u8 d21, d21, d2 \n" 1053 "vqadd.u8 d22, d22, d2 \n" ARGBTORGB565 1054 "vst1.8 {q0}, [%0]! \n" // store 8 pixels RGB565. 1099 "vqadd.u8 d22, d22, d2 \n" // add for dither 1100 ARGBTORGB565 1101 "vst1.8 {q0}, [%0]! \n" // store 8 RGB565. 1055 1102 "bgt 1b \n" 1056 1103 : "+r"(dst_rgb) // %0 … … 1065 1112 int width) { 1066 1113 asm volatile( 1067 "1: 1114 "1: \n" 1068 1115 "vld4.8 {d20, d21, d22, d23}, [%0]! \n" // load 8 pixels of ARGB. 1069 1116 "subs %2, %2, #8 \n" // 8 processed per loop. 1070 1117 ARGBTOARGB1555 1071 "vst1.8 {q0}, [%1]! \n" // store 8 pixels 1072 // ARGB1555. 1118 "vst1.8 {q0}, [%1]! \n" // store 8 ARGB1555. 1073 1119 "bgt 1b \n" 1074 1120 : "+r"(src_argb), // %0 … … 1085 1131 "vmov.u8 d4, #0x0f \n" // bits to clear with 1086 1132 // vbic. 1087 "1: 1133 "1: \n" 1088 1134 "vld4.8 {d20, d21, d22, d23}, [%0]! \n" // load 8 pixels of ARGB. 1089 1135 "subs %2, %2, #8 \n" // 8 processed per loop. 1090 1136 ARGBTOARGB4444 1091 "vst1.8 {q0}, [%1]! \n" // store 8 pixels 1092 // ARGB4444. 1137 "vst1.8 {q0}, [%1]! \n" // store 8 ARGB4444. 1093 1138 "bgt 1b \n" 1094 1139 : "+r"(src_argb), // %0 … … 1105 1150 "vmov.u8 d26, #33 \n" // R * 0.2578 coefficient 1106 1151 "vmov.u8 d27, #16 \n" // Add 16 constant 1107 "1: 1152 "1: \n" 1108 1153 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 ARGB pixels. 1109 1154 "subs %2, %2, #8 \n" // 8 processed per loop. … … 1124 1169 void ARGBExtractAlphaRow_NEON(const uint8* src_argb, uint8* dst_a, int width) { 1125 1170 asm volatile( 1126 "1: 1171 "1: \n" 1127 1172 "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 ARGB pixels 1128 1173 "vld4.8 {d1, d3, d5, d7}, [%0]! \n" // load next 8 ARGB pixels … … 1143 1188 "vmov.u8 d25, #75 \n" // G * 0.58700 coefficient 1144 1189 "vmov.u8 d26, #38 \n" // R * 0.29900 coefficient 1145 "1: 1190 "1: \n" 1146 1191 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 ARGB pixels. 1147 1192 "subs %2, %2, #8 \n" // 8 processed per loop. … … 1172 1217 "vmov.u8 d28, #94 \n" // VG -0.7344 coefficient 1173 1218 "vmov.u16 q15, #0x8080 \n" // 128.5 1174 "1: 1219 "1: \n" 1175 1220 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 ARGB pixels. 1176 1221 "subs %3, %3, #8 \n" // 8 processed per loop. … … 1200 1245 } 1201 1246 1247 // clang-format off 1202 1248 // 16x2 pixels -> 8x1. width is number of argb pixels. e.g. 16. 1203 1249 #define RGBTOUV(QB, QG, QR) \ 1204 "vmul.s16 q8, " #QB \ 1205 ", q10 \n" /* B */ \ 1206 "vmls.s16 q8, " #QG \ 1207 ", q11 \n" /* G */ \ 1208 "vmls.s16 q8, " #QR \ 1209 ", q12 \n" /* R */ \ 1250 "vmul.s16 q8, " #QB ", q10 \n" /* B */ \ 1251 "vmls.s16 q8, " #QG ", q11 \n" /* G */ \ 1252 "vmls.s16 q8, " #QR ", q12 \n" /* R */ \ 1210 1253 "vadd.u16 q8, q8, q15 \n" /* +128 -> unsigned */ \ 1211 "vmul.s16 q9, " #QR \ 1212 ", q10 \n" /* R */ \ 1213 "vmls.s16 q9, " #QG \ 1214 ", q14 \n" /* G */ \ 1215 "vmls.s16 q9, " #QB \ 1216 ", q13 \n" /* B */ \ 1254 "vmul.s16 q9, " #QR ", q10 \n" /* R */ \ 1255 "vmls.s16 q9, " #QG ", q14 \n" /* G */ \ 1256 "vmls.s16 q9, " #QB ", q13 \n" /* B */ \ 1217 1257 "vadd.u16 q9, q9, q15 \n" /* +128 -> unsigned */ \ 1218 1258 "vqshrn.u16 d0, q8, #8 \n" /* 16 bit to 8 bit U */ \ 1219 1259 "vqshrn.u16 d1, q9, #8 \n" /* 16 bit to 8 bit V */ 1260 // clang-format on 1220 1261 1221 1262 // TODO(fbarchard): Consider vhadd vertical, then vpaddl horizontal, avoid shr. … … 1233 1274 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient 1234 1275 "vmov.u16 q15, #0x8080 \n" // 128.5 1235 "1:\n"1276 "1: \n" 1236 1277 "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 ARGB pixels. 1237 1278 "vld4.8 {d1, d3, d5, d7}, [%0]! \n" // load next 8 ARGB pixels. … … 1279 1320 "vmov.s16 q14, #107 / 2 \n" // VG -0.41869 coefficient 1280 1321 "vmov.u16 q15, #0x8080 \n" // 128.5 1281 "1:\n"1322 "1: \n" 1282 1323 "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 ARGB pixels. 1283 1324 "vld4.8 {d1, d3, d5, d7}, [%0]! \n" // load next 8 ARGB pixels. … … 1324 1365 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient 1325 1366 "vmov.u16 q15, #0x8080 \n" // 128.5 1326 "1:\n"1367 "1: \n" 1327 1368 "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 BGRA pixels. 1328 1369 "vld4.8 {d1, d3, d5, d7}, [%0]! \n" // load next 8 BGRA pixels. … … 1369 1410 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient 1370 1411 "vmov.u16 q15, #0x8080 \n" // 128.5 1371 "1:\n"1412 "1: \n" 1372 1413 "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 ABGR pixels. 1373 1414 "vld4.8 {d1, d3, d5, d7}, [%0]! \n" // load next 8 ABGR pixels. … … 1414 1455 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient 1415 1456 "vmov.u16 q15, #0x8080 \n" // 128.5 1416 "1:\n"1457 "1: \n" 1417 1458 "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 RGBA pixels. 1418 1459 "vld4.8 {d1, d3, d5, d7}, [%0]! \n" // load next 8 RGBA pixels. … … 1459 1500 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient 1460 1501 "vmov.u16 q15, #0x8080 \n" // 128.5 1461 "1:\n"1502 "1: \n" 1462 1503 "vld3.8 {d0, d2, d4}, [%0]! \n" // load 8 RGB24 pixels. 1463 1504 "vld3.8 {d1, d3, d5}, [%0]! \n" // load next 8 RGB24 pixels. … … 1504 1545 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient 1505 1546 "vmov.u16 q15, #0x8080 \n" // 128.5 1506 "1:\n"1547 "1: \n" 1507 1548 "vld3.8 {d0, d2, d4}, [%0]! \n" // load 8 RAW pixels. 1508 1549 "vld3.8 {d1, d3, d5}, [%0]! \n" // load next 8 RAW pixels. … … 1551 1592 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient 1552 1593 "vmov.u16 q15, #0x8080 \n" // 128.5 1553 "1: 1594 "1: \n" 1554 1595 "vld1.8 {q0}, [%0]! \n" // load 8 RGB565 pixels. 1555 1596 RGB565TOARGB … … 1617 1658 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient 1618 1659 "vmov.u16 q15, #0x8080 \n" // 128.5 1619 "1: 1660 "1: \n" 1620 1661 "vld1.8 {q0}, [%0]! \n" // load 8 ARGB1555 pixels. 1621 1662 RGB555TOARGB … … 1683 1724 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient 1684 1725 "vmov.u16 q15, #0x8080 \n" // 128.5 1685 "1: 1726 "1: \n" 1686 1727 "vld1.8 {q0}, [%0]! \n" // load 8 ARGB4444 pixels. 1687 1728 ARGB4444TOARGB … … 1740 1781 "vmov.u8 d26, #33 \n" // R * 0.2578 coefficient 1741 1782 "vmov.u8 d27, #16 \n" // Add 16 constant 1742 "1: 1783 "1: \n" 1743 1784 "vld1.8 {q0}, [%0]! \n" // load 8 RGB565 pixels. 1744 1785 "subs %2, %2, #8 \n" // 8 processed per loop. … … 1764 1805 "vmov.u8 d26, #33 \n" // R * 0.2578 coefficient 1765 1806 "vmov.u8 d27, #16 \n" // Add 16 constant 1766 "1: 1807 "1: \n" 1767 1808 "vld1.8 {q0}, [%0]! \n" // load 8 ARGB1555 pixels. 1768 1809 "subs %2, %2, #8 \n" // 8 processed per loop. … … 1788 1829 "vmov.u8 d26, #33 \n" // R * 0.2578 coefficient 1789 1830 "vmov.u8 d27, #16 \n" // Add 16 constant 1790 "1: 1831 "1: \n" 1791 1832 "vld1.8 {q0}, [%0]! \n" // load 8 ARGB4444 pixels. 1792 1833 "subs %2, %2, #8 \n" // 8 processed per loop. … … 1812 1853 "vmov.u8 d6, #13 \n" // B * 0.1016 coefficient 1813 1854 "vmov.u8 d7, #16 \n" // Add 16 constant 1814 "1: 1855 "1: \n" 1815 1856 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 pixels of BGRA. 1816 1857 "subs %2, %2, #8 \n" // 8 processed per loop. … … 1835 1876 "vmov.u8 d6, #13 \n" // B * 0.1016 coefficient 1836 1877 "vmov.u8 d7, #16 \n" // Add 16 constant 1837 "1: 1878 "1: \n" 1838 1879 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 pixels of ABGR. 1839 1880 "subs %2, %2, #8 \n" // 8 processed per loop. … … 1858 1899 "vmov.u8 d6, #33 \n" // R * 0.2578 coefficient 1859 1900 "vmov.u8 d7, #16 \n" // Add 16 constant 1860 "1: 1901 "1: \n" 1861 1902 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 pixels of RGBA. 1862 1903 "subs %2, %2, #8 \n" // 8 processed per loop. … … 1881 1922 "vmov.u8 d6, #33 \n" // R * 0.2578 coefficient 1882 1923 "vmov.u8 d7, #16 \n" // Add 16 constant 1883 "1: 1924 "1: \n" 1884 1925 "vld3.8 {d0, d1, d2}, [%0]! \n" // load 8 pixels of RGB24. 1885 1926 "subs %2, %2, #8 \n" // 8 processed per loop. … … 1904 1945 "vmov.u8 d6, #13 \n" // B * 0.1016 coefficient 1905 1946 "vmov.u8 d7, #16 \n" // Add 16 constant 1906 "1: 1947 "1: \n" 1907 1948 "vld3.8 {d0, d1, d2}, [%0]! \n" // load 8 pixels of RAW. 1908 1949 "subs %2, %2, #8 \n" // 8 processed per loop. … … 1939 1980 "vdup.8 d4, %4 \n" 1940 1981 // General purpose row blend. 1941 "1: 1982 "1: \n" 1942 1983 "vld1.8 {q0}, [%1]! \n" 1943 1984 "vld1.8 {q1}, [%2]! \n" … … 1954 1995 1955 1996 // Blend 50 / 50. 1956 "50: 1997 "50: \n" 1957 1998 "vld1.8 {q0}, [%1]! \n" 1958 1999 "vld1.8 {q1}, [%2]! \n" … … 1964 2005 1965 2006 // Blend 100 / 0 - Copy row unchanged. 1966 "100: 2007 "100: \n" 1967 2008 "vld1.8 {q0}, [%1]! \n" 1968 2009 "subs %3, %3, #16 \n" … … 1970 2011 "bgt 100b \n" 1971 2012 1972 "99: 2013 "99: \n" 1973 2014 : "+r"(dst_ptr), // %0 1974 2015 "+r"(src_ptr), // %1 … … 1989 2030 "blt 89f \n" 1990 2031 // Blend 8 pixels. 1991 "8: 2032 "8: \n" 1992 2033 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 pixels of ARGB0. 1993 2034 "vld4.8 {d4, d5, d6, d7}, [%1]! \n" // load 8 pixels of ARGB1. … … 2007 2048 "bge 8b \n" 2008 2049 2009 "89: 2050 "89: \n" 2010 2051 "adds %3, #8-1 \n" 2011 2052 "blt 99f \n" 2012 2053 2013 2054 // Blend 1 pixels. 2014 "1: 2055 "1: \n" 2015 2056 "vld4.8 {d0[0],d1[0],d2[0],d3[0]}, [%0]! \n" // load 1 pixel ARGB0. 2016 2057 "vld4.8 {d4[0],d5[0],d6[0],d7[0]}, [%1]! \n" // load 1 pixel ARGB1. … … 2044 2085 asm volatile( 2045 2086 // Attenuate 8 pixels. 2046 "1: 2087 "1: \n" 2047 2088 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 pixels of ARGB. 2048 2089 "subs %2, %2, #8 \n" // 8 processed per loop. … … 2076 2117 2077 2118 // 8 pixel loop. 2078 "1: 2119 "1: \n" 2079 2120 "vld4.8 {d0, d2, d4, d6}, [%0] \n" // load 8 pixels of ARGB. 2080 2121 "subs %1, %1, #8 \n" // 8 processed per loop. … … 2117 2158 2118 2159 // 8 pixel loop. 2119 "1: 2160 "1: \n" 2120 2161 "vld4.8 {d20, d22, d24, d26}, [%0]! \n" // load 8 pixels of ARGB. 2121 2162 "subs %2, %2, #8 \n" // 8 processed per loop. … … 2149 2190 "vmov.u8 d25, #75 \n" // G * 0.58700 coefficient 2150 2191 "vmov.u8 d26, #38 \n" // R * 0.29900 coefficient 2151 "1: 2192 "1: \n" 2152 2193 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 ARGB pixels. 2153 2194 "subs %2, %2, #8 \n" // 8 processed per loop. … … 2182 2223 "vmov.u8 d29, #98 \n" // BG coefficient 2183 2224 "vmov.u8 d30, #50 \n" // BR coefficient 2184 "1: 2225 "1: \n" 2185 2226 "vld4.8 {d0, d1, d2, d3}, [%0] \n" // load 8 ARGB pixels. 2186 2227 "subs %1, %1, #8 \n" // 8 processed per loop. … … 2218 2259 "vmovl.s8 q1, d5 \n" // R,A coefficients s16. 2219 2260 2220 "1: 2261 "1: \n" 2221 2262 "vld4.8 {d16, d18, d20, d22}, [%0]! \n" // load 8 ARGB pixels. 2222 2263 "subs %2, %2, #8 \n" // 8 processed per loop. … … 2274 2315 asm volatile( 2275 2316 // 8 pixel loop. 2276 "1: 2317 "1: \n" 2277 2318 "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 ARGB pixels. 2278 2319 "vld4.8 {d1, d3, d5, d7}, [%1]! \n" // load 8 more ARGB 2279 // pixels.2280 2320 "subs %3, %3, #8 \n" // 8 processed per loop. 2281 2321 "vmull.u8 q0, d0, d1 \n" // multiply B … … 2289 2329 "vst4.8 {d0, d1, d2, d3}, [%2]! \n" // store 8 ARGB pixels. 2290 2330 "bgt 1b \n" 2291 2292 2331 : "+r"(src_argb0), // %0 2293 2332 "+r"(src_argb1), // %1 … … 2305 2344 asm volatile( 2306 2345 // 8 pixel loop. 2307 "1: 2346 "1: \n" 2308 2347 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 ARGB pixels. 2309 2348 "vld4.8 {d4, d5, d6, d7}, [%1]! \n" // load 8 more ARGB 2310 // pixels.2311 2349 "subs %3, %3, #8 \n" // 8 processed per loop. 2312 2350 "vqadd.u8 q0, q0, q2 \n" // add B, G … … 2314 2352 "vst4.8 {d0, d1, d2, d3}, [%2]! \n" // store 8 ARGB pixels. 2315 2353 "bgt 1b \n" 2316 2317 2354 : "+r"(src_argb0), // %0 2318 2355 "+r"(src_argb1), // %1 … … 2330 2367 asm volatile( 2331 2368 // 8 pixel loop. 2332 "1: 2369 "1: \n" 2333 2370 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 ARGB pixels. 2334 2371 "vld4.8 {d4, d5, d6, d7}, [%1]! \n" // load 8 more ARGB 2335 // pixels.2336 2372 "subs %3, %3, #8 \n" // 8 processed per loop. 2337 2373 "vqsub.u8 q0, q0, q2 \n" // subtract B, G … … 2339 2375 "vst4.8 {d0, d1, d2, d3}, [%2]! \n" // store 8 ARGB pixels. 2340 2376 "bgt 1b \n" 2341 2342 2377 : "+r"(src_argb0), // %0 2343 2378 "+r"(src_argb1), // %1 … … 2360 2395 "vmov.u8 d3, #255 \n" // alpha 2361 2396 // 8 pixel loop. 2362 "1: 2397 "1: \n" 2363 2398 "vld1.8 {d0}, [%0]! \n" // load 8 sobelx. 2364 2399 "vld1.8 {d1}, [%1]! \n" // load 8 sobely. … … 2384 2419 asm volatile( 2385 2420 // 16 pixel loop. 2386 "1: 2421 "1: \n" 2387 2422 "vld1.8 {q0}, [%0]! \n" // load 16 sobelx. 2388 2423 "vld1.8 {q1}, [%1]! \n" // load 16 sobely. … … 2411 2446 "vmov.u8 d3, #255 \n" // alpha 2412 2447 // 8 pixel loop. 2413 "1: 2448 "1: \n" 2414 2449 "vld1.8 {d2}, [%0]! \n" // load 8 sobelx. 2415 2450 "vld1.8 {d0}, [%1]! \n" // load 8 sobely. … … 2436 2471 int width) { 2437 2472 asm volatile( 2438 "1: 2473 "1: \n" 2439 2474 "vld1.8 {d0}, [%0],%5 \n" // top 2440 2475 "vld1.8 {d1}, [%0],%6 \n" … … 2474 2509 int width) { 2475 2510 asm volatile( 2476 "1: 2511 "1: \n" 2477 2512 "vld1.8 {d0}, [%0],%4 \n" // left 2478 2513 "vld1.8 {d1}, [%1],%4 \n" … … 2506 2541 "vdup.32 q0, %3 \n" 2507 2542 2508 "1: 2543 "1: \n" 2509 2544 "vld1.8 {q1}, [%0]! \n" // load 8 shorts 2510 2545 "subs %2, %2, #8 \n" // 8 pixels per loop … … 2531 2566 "vdup.32 q0, %3 \n" 2532 2567 2533 "1: 2568 "1: \n" 2534 2569 "vld1.8 {q1}, [%0]! \n" // load 8 shorts 2535 2570 "subs %2, %2, #8 \n" // 8 pixels per loop
Note: See TracChangeset
for help on using the changeset viewer.