Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(593)

Side by Side Diff: source/row_neon.cc

Issue 1398633002: change all pix parameters to width for consistency (Closed) Base URL: https://chromium.googlesource.com/libyuv/libyuv@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « source/row_gcc.cc ('k') | source/row_neon64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2011 The LibYuv Project Authors. All rights reserved. 2 * Copyright 2011 The LibYuv Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 841 matching lines...) Expand 10 before | Expand all | Expand 10 after
852 "vst1.8 {d0}, [%1]! \n" 852 "vst1.8 {d0}, [%1]! \n"
853 "bgt 1b \n" 853 "bgt 1b \n"
854 : "+r"(src), // %0 854 : "+r"(src), // %0
855 "+r"(dst), // %1 855 "+r"(dst), // %1
856 "+r"(width) // %2 856 "+r"(width) // %2
857 : 857 :
858 : "cc", "memory", "r3", "q0" 858 : "cc", "memory", "r3", "q0"
859 ); 859 );
860 } 860 }
861 861
862 void RGB24ToARGBRow_NEON(const uint8* src_rgb24, uint8* dst_argb, int pix) { 862 void RGB24ToARGBRow_NEON(const uint8* src_rgb24, uint8* dst_argb, int width) {
863 asm volatile ( 863 asm volatile (
864 "vmov.u8 d4, #255 \n" // Alpha 864 "vmov.u8 d4, #255 \n" // Alpha
865 "1: \n" 865 "1: \n"
866 MEMACCESS(0) 866 MEMACCESS(0)
867 "vld3.8 {d1, d2, d3}, [%0]! \n" // load 8 pixels of RGB24. 867 "vld3.8 {d1, d2, d3}, [%0]! \n" // load 8 pixels of RGB24.
868 "subs %2, %2, #8 \n" // 8 processed per loop. 868 "subs %2, %2, #8 \n" // 8 processed per loop.
869 MEMACCESS(1) 869 MEMACCESS(1)
870 "vst4.8 {d1, d2, d3, d4}, [%1]! \n" // store 8 pixels of ARGB. 870 "vst4.8 {d1, d2, d3, d4}, [%1]! \n" // store 8 pixels of ARGB.
871 "bgt 1b \n" 871 "bgt 1b \n"
872 : "+r"(src_rgb24), // %0 872 : "+r"(src_rgb24), // %0
873 "+r"(dst_argb), // %1 873 "+r"(dst_argb), // %1
874 "+r"(pix) // %2 874 "+r"(width) // %2
875 : 875 :
876 : "cc", "memory", "d1", "d2", "d3", "d4" // Clobber List 876 : "cc", "memory", "d1", "d2", "d3", "d4" // Clobber List
877 ); 877 );
878 } 878 }
879 879
880 void RAWToARGBRow_NEON(const uint8* src_raw, uint8* dst_argb, int pix) { 880 void RAWToARGBRow_NEON(const uint8* src_raw, uint8* dst_argb, int width) {
881 asm volatile ( 881 asm volatile (
882 "vmov.u8 d4, #255 \n" // Alpha 882 "vmov.u8 d4, #255 \n" // Alpha
883 "1: \n" 883 "1: \n"
884 MEMACCESS(0) 884 MEMACCESS(0)
885 "vld3.8 {d1, d2, d3}, [%0]! \n" // load 8 pixels of RAW. 885 "vld3.8 {d1, d2, d3}, [%0]! \n" // load 8 pixels of RAW.
886 "subs %2, %2, #8 \n" // 8 processed per loop. 886 "subs %2, %2, #8 \n" // 8 processed per loop.
887 "vswp.u8 d1, d3 \n" // swap R, B 887 "vswp.u8 d1, d3 \n" // swap R, B
888 MEMACCESS(1) 888 MEMACCESS(1)
889 "vst4.8 {d1, d2, d3, d4}, [%1]! \n" // store 8 pixels of ARGB. 889 "vst4.8 {d1, d2, d3, d4}, [%1]! \n" // store 8 pixels of ARGB.
890 "bgt 1b \n" 890 "bgt 1b \n"
891 : "+r"(src_raw), // %0 891 : "+r"(src_raw), // %0
892 "+r"(dst_argb), // %1 892 "+r"(dst_argb), // %1
893 "+r"(pix) // %2 893 "+r"(width) // %2
894 : 894 :
895 : "cc", "memory", "d1", "d2", "d3", "d4" // Clobber List 895 : "cc", "memory", "d1", "d2", "d3", "d4" // Clobber List
896 ); 896 );
897 } 897 }
898 898
899 #define RGB565TOARGB \ 899 #define RGB565TOARGB \
900 "vshrn.u16 d6, q0, #5 \n" /* G xxGGGGGG */ \ 900 "vshrn.u16 d6, q0, #5 \n" /* G xxGGGGGG */ \
901 "vuzp.u8 d0, d1 \n" /* d0 xxxBBBBB RRRRRxxx */ \ 901 "vuzp.u8 d0, d1 \n" /* d0 xxxBBBBB RRRRRxxx */ \
902 "vshl.u8 d6, d6, #2 \n" /* G GGGGGG00 upper 6 */ \ 902 "vshl.u8 d6, d6, #2 \n" /* G GGGGGG00 upper 6 */ \
903 "vshr.u8 d1, d1, #3 \n" /* R 000RRRRR lower 5 */ \ 903 "vshr.u8 d1, d1, #3 \n" /* R 000RRRRR lower 5 */ \
904 "vshl.u8 q0, q0, #3 \n" /* B,R BBBBB000 upper 5 */ \ 904 "vshl.u8 q0, q0, #3 \n" /* B,R BBBBB000 upper 5 */ \
905 "vshr.u8 q2, q0, #5 \n" /* B,R 00000BBB lower 3 */ \ 905 "vshr.u8 q2, q0, #5 \n" /* B,R 00000BBB lower 3 */ \
906 "vorr.u8 d0, d0, d4 \n" /* B */ \ 906 "vorr.u8 d0, d0, d4 \n" /* B */ \
907 "vshr.u8 d4, d6, #6 \n" /* G 000000GG lower 2 */ \ 907 "vshr.u8 d4, d6, #6 \n" /* G 000000GG lower 2 */ \
908 "vorr.u8 d2, d1, d5 \n" /* R */ \ 908 "vorr.u8 d2, d1, d5 \n" /* R */ \
909 "vorr.u8 d1, d4, d6 \n" /* G */ 909 "vorr.u8 d1, d4, d6 \n" /* G */
910 910
911 void RGB565ToARGBRow_NEON(const uint8* src_rgb565, uint8* dst_argb, int pix) { 911 void RGB565ToARGBRow_NEON(const uint8* src_rgb565, uint8* dst_argb, int width) {
912 asm volatile ( 912 asm volatile (
913 "vmov.u8 d3, #255 \n" // Alpha 913 "vmov.u8 d3, #255 \n" // Alpha
914 "1: \n" 914 "1: \n"
915 MEMACCESS(0) 915 MEMACCESS(0)
916 "vld1.8 {q0}, [%0]! \n" // load 8 RGB565 pixels. 916 "vld1.8 {q0}, [%0]! \n" // load 8 RGB565 pixels.
917 "subs %2, %2, #8 \n" // 8 processed per loop. 917 "subs %2, %2, #8 \n" // 8 processed per loop.
918 RGB565TOARGB 918 RGB565TOARGB
919 MEMACCESS(1) 919 MEMACCESS(1)
920 "vst4.8 {d0, d1, d2, d3}, [%1]! \n" // store 8 pixels of ARGB. 920 "vst4.8 {d0, d1, d2, d3}, [%1]! \n" // store 8 pixels of ARGB.
921 "bgt 1b \n" 921 "bgt 1b \n"
922 : "+r"(src_rgb565), // %0 922 : "+r"(src_rgb565), // %0
923 "+r"(dst_argb), // %1 923 "+r"(dst_argb), // %1
924 "+r"(pix) // %2 924 "+r"(width) // %2
925 : 925 :
926 : "cc", "memory", "q0", "q1", "q2", "q3" // Clobber List 926 : "cc", "memory", "q0", "q1", "q2", "q3" // Clobber List
927 ); 927 );
928 } 928 }
929 929
930 #define ARGB1555TOARGB \ 930 #define ARGB1555TOARGB \
931 "vshrn.u16 d7, q0, #8 \n" /* A Arrrrrxx */ \ 931 "vshrn.u16 d7, q0, #8 \n" /* A Arrrrrxx */ \
932 "vshr.u8 d6, d7, #2 \n" /* R xxxRRRRR */ \ 932 "vshr.u8 d6, d7, #2 \n" /* R xxxRRRRR */ \
933 "vshrn.u16 d5, q0, #5 \n" /* G xxxGGGGG */ \ 933 "vshrn.u16 d5, q0, #5 \n" /* G xxxGGGGG */ \
934 "vmovn.u16 d4, q0 \n" /* B xxxBBBBB */ \ 934 "vmovn.u16 d4, q0 \n" /* B xxxBBBBB */ \
(...skipping 13 matching lines...) Expand all
948 "vshl.u8 d6, d6, #3 \n" /* G GGGGG000 upper 5 */ \ 948 "vshl.u8 d6, d6, #3 \n" /* G GGGGG000 upper 5 */ \
949 "vshr.u8 d1, d1, #2 \n" /* R 00xRRRRR lower 5 */ \ 949 "vshr.u8 d1, d1, #2 \n" /* R 00xRRRRR lower 5 */ \
950 "vshl.u8 q0, q0, #3 \n" /* B,R BBBBB000 upper 5 */ \ 950 "vshl.u8 q0, q0, #3 \n" /* B,R BBBBB000 upper 5 */ \
951 "vshr.u8 q2, q0, #5 \n" /* B,R 00000BBB lower 3 */ \ 951 "vshr.u8 q2, q0, #5 \n" /* B,R 00000BBB lower 3 */ \
952 "vorr.u8 d0, d0, d4 \n" /* B */ \ 952 "vorr.u8 d0, d0, d4 \n" /* B */ \
953 "vshr.u8 d4, d6, #5 \n" /* G 00000GGG lower 3 */ \ 953 "vshr.u8 d4, d6, #5 \n" /* G 00000GGG lower 3 */ \
954 "vorr.u8 d2, d1, d5 \n" /* R */ \ 954 "vorr.u8 d2, d1, d5 \n" /* R */ \
955 "vorr.u8 d1, d4, d6 \n" /* G */ 955 "vorr.u8 d1, d4, d6 \n" /* G */
956 956
957 void ARGB1555ToARGBRow_NEON(const uint8* src_argb1555, uint8* dst_argb, 957 void ARGB1555ToARGBRow_NEON(const uint8* src_argb1555, uint8* dst_argb,
958 int pix) { 958 int width) {
959 asm volatile ( 959 asm volatile (
960 "vmov.u8 d3, #255 \n" // Alpha 960 "vmov.u8 d3, #255 \n" // Alpha
961 "1: \n" 961 "1: \n"
962 MEMACCESS(0) 962 MEMACCESS(0)
963 "vld1.8 {q0}, [%0]! \n" // load 8 ARGB1555 pixels. 963 "vld1.8 {q0}, [%0]! \n" // load 8 ARGB1555 pixels.
964 "subs %2, %2, #8 \n" // 8 processed per loop. 964 "subs %2, %2, #8 \n" // 8 processed per loop.
965 ARGB1555TOARGB 965 ARGB1555TOARGB
966 MEMACCESS(1) 966 MEMACCESS(1)
967 "vst4.8 {d0, d1, d2, d3}, [%1]! \n" // store 8 pixels of ARGB. 967 "vst4.8 {d0, d1, d2, d3}, [%1]! \n" // store 8 pixels of ARGB.
968 "bgt 1b \n" 968 "bgt 1b \n"
969 : "+r"(src_argb1555), // %0 969 : "+r"(src_argb1555), // %0
970 "+r"(dst_argb), // %1 970 "+r"(dst_argb), // %1
971 "+r"(pix) // %2 971 "+r"(width) // %2
972 : 972 :
973 : "cc", "memory", "q0", "q1", "q2", "q3" // Clobber List 973 : "cc", "memory", "q0", "q1", "q2", "q3" // Clobber List
974 ); 974 );
975 } 975 }
976 976
977 #define ARGB4444TOARGB \ 977 #define ARGB4444TOARGB \
978 "vuzp.u8 d0, d1 \n" /* d0 BG, d1 RA */ \ 978 "vuzp.u8 d0, d1 \n" /* d0 BG, d1 RA */ \
979 "vshl.u8 q2, q0, #4 \n" /* B,R BBBB0000 */ \ 979 "vshl.u8 q2, q0, #4 \n" /* B,R BBBB0000 */ \
980 "vshr.u8 q1, q0, #4 \n" /* G,A 0000GGGG */ \ 980 "vshr.u8 q1, q0, #4 \n" /* G,A 0000GGGG */ \
981 "vshr.u8 q0, q2, #4 \n" /* B,R 0000BBBB */ \ 981 "vshr.u8 q0, q2, #4 \n" /* B,R 0000BBBB */ \
982 "vorr.u8 q0, q0, q2 \n" /* B,R BBBBBBBB */ \ 982 "vorr.u8 q0, q0, q2 \n" /* B,R BBBBBBBB */ \
983 "vshl.u8 q2, q1, #4 \n" /* G,A GGGG0000 */ \ 983 "vshl.u8 q2, q1, #4 \n" /* G,A GGGG0000 */ \
984 "vorr.u8 q1, q1, q2 \n" /* G,A GGGGGGGG */ \ 984 "vorr.u8 q1, q1, q2 \n" /* G,A GGGGGGGG */ \
985 "vswp.u8 d1, d2 \n" /* B,R,G,A -> B,G,R,A */ 985 "vswp.u8 d1, d2 \n" /* B,R,G,A -> B,G,R,A */
986 986
987 void ARGB4444ToARGBRow_NEON(const uint8* src_argb4444, uint8* dst_argb, 987 void ARGB4444ToARGBRow_NEON(const uint8* src_argb4444, uint8* dst_argb,
988 int pix) { 988 int width) {
989 asm volatile ( 989 asm volatile (
990 "vmov.u8 d3, #255 \n" // Alpha 990 "vmov.u8 d3, #255 \n" // Alpha
991 "1: \n" 991 "1: \n"
992 MEMACCESS(0) 992 MEMACCESS(0)
993 "vld1.8 {q0}, [%0]! \n" // load 8 ARGB4444 pixels. 993 "vld1.8 {q0}, [%0]! \n" // load 8 ARGB4444 pixels.
994 "subs %2, %2, #8 \n" // 8 processed per loop. 994 "subs %2, %2, #8 \n" // 8 processed per loop.
995 ARGB4444TOARGB 995 ARGB4444TOARGB
996 MEMACCESS(1) 996 MEMACCESS(1)
997 "vst4.8 {d0, d1, d2, d3}, [%1]! \n" // store 8 pixels of ARGB. 997 "vst4.8 {d0, d1, d2, d3}, [%1]! \n" // store 8 pixels of ARGB.
998 "bgt 1b \n" 998 "bgt 1b \n"
999 : "+r"(src_argb4444), // %0 999 : "+r"(src_argb4444), // %0
1000 "+r"(dst_argb), // %1 1000 "+r"(dst_argb), // %1
1001 "+r"(pix) // %2 1001 "+r"(width) // %2
1002 : 1002 :
1003 : "cc", "memory", "q0", "q1", "q2" // Clobber List 1003 : "cc", "memory", "q0", "q1", "q2" // Clobber List
1004 ); 1004 );
1005 } 1005 }
1006 1006
1007 void ARGBToRGB24Row_NEON(const uint8* src_argb, uint8* dst_rgb24, int pix) { 1007 void ARGBToRGB24Row_NEON(const uint8* src_argb, uint8* dst_rgb24, int width) {
1008 asm volatile ( 1008 asm volatile (
1009 "1: \n" 1009 "1: \n"
1010 MEMACCESS(0) 1010 MEMACCESS(0)
1011 "vld4.8 {d1, d2, d3, d4}, [%0]! \n" // load 8 pixels of ARGB. 1011 "vld4.8 {d1, d2, d3, d4}, [%0]! \n" // load 8 pixels of ARGB.
1012 "subs %2, %2, #8 \n" // 8 processed per loop. 1012 "subs %2, %2, #8 \n" // 8 processed per loop.
1013 MEMACCESS(1) 1013 MEMACCESS(1)
1014 "vst3.8 {d1, d2, d3}, [%1]! \n" // store 8 pixels of RGB24. 1014 "vst3.8 {d1, d2, d3}, [%1]! \n" // store 8 pixels of RGB24.
1015 "bgt 1b \n" 1015 "bgt 1b \n"
1016 : "+r"(src_argb), // %0 1016 : "+r"(src_argb), // %0
1017 "+r"(dst_rgb24), // %1 1017 "+r"(dst_rgb24), // %1
1018 "+r"(pix) // %2 1018 "+r"(width) // %2
1019 : 1019 :
1020 : "cc", "memory", "d1", "d2", "d3", "d4" // Clobber List 1020 : "cc", "memory", "d1", "d2", "d3", "d4" // Clobber List
1021 ); 1021 );
1022 } 1022 }
1023 1023
1024 void ARGBToRAWRow_NEON(const uint8* src_argb, uint8* dst_raw, int pix) { 1024 void ARGBToRAWRow_NEON(const uint8* src_argb, uint8* dst_raw, int width) {
1025 asm volatile ( 1025 asm volatile (
1026 "1: \n" 1026 "1: \n"
1027 MEMACCESS(0) 1027 MEMACCESS(0)
1028 "vld4.8 {d1, d2, d3, d4}, [%0]! \n" // load 8 pixels of ARGB. 1028 "vld4.8 {d1, d2, d3, d4}, [%0]! \n" // load 8 pixels of ARGB.
1029 "subs %2, %2, #8 \n" // 8 processed per loop. 1029 "subs %2, %2, #8 \n" // 8 processed per loop.
1030 "vswp.u8 d1, d3 \n" // swap R, B 1030 "vswp.u8 d1, d3 \n" // swap R, B
1031 MEMACCESS(1) 1031 MEMACCESS(1)
1032 "vst3.8 {d1, d2, d3}, [%1]! \n" // store 8 pixels of RAW. 1032 "vst3.8 {d1, d2, d3}, [%1]! \n" // store 8 pixels of RAW.
1033 "bgt 1b \n" 1033 "bgt 1b \n"
1034 : "+r"(src_argb), // %0 1034 : "+r"(src_argb), // %0
1035 "+r"(dst_raw), // %1 1035 "+r"(dst_raw), // %1
1036 "+r"(pix) // %2 1036 "+r"(width) // %2
1037 : 1037 :
1038 : "cc", "memory", "d1", "d2", "d3", "d4" // Clobber List 1038 : "cc", "memory", "d1", "d2", "d3", "d4" // Clobber List
1039 ); 1039 );
1040 } 1040 }
1041 1041
1042 void YUY2ToYRow_NEON(const uint8* src_yuy2, uint8* dst_y, int pix) { 1042 void YUY2ToYRow_NEON(const uint8* src_yuy2, uint8* dst_y, int width) {
1043 asm volatile ( 1043 asm volatile (
1044 "1: \n" 1044 "1: \n"
1045 MEMACCESS(0) 1045 MEMACCESS(0)
1046 "vld2.8 {q0, q1}, [%0]! \n" // load 16 pixels of YUY2. 1046 "vld2.8 {q0, q1}, [%0]! \n" // load 16 pixels of YUY2.
1047 "subs %2, %2, #16 \n" // 16 processed per loop. 1047 "subs %2, %2, #16 \n" // 16 processed per loop.
1048 MEMACCESS(1) 1048 MEMACCESS(1)
1049 "vst1.8 {q0}, [%1]! \n" // store 16 pixels of Y. 1049 "vst1.8 {q0}, [%1]! \n" // store 16 pixels of Y.
1050 "bgt 1b \n" 1050 "bgt 1b \n"
1051 : "+r"(src_yuy2), // %0 1051 : "+r"(src_yuy2), // %0
1052 "+r"(dst_y), // %1 1052 "+r"(dst_y), // %1
1053 "+r"(pix) // %2 1053 "+r"(width) // %2
1054 : 1054 :
1055 : "cc", "memory", "q0", "q1" // Clobber List 1055 : "cc", "memory", "q0", "q1" // Clobber List
1056 ); 1056 );
1057 } 1057 }
1058 1058
1059 void UYVYToYRow_NEON(const uint8* src_uyvy, uint8* dst_y, int pix) { 1059 void UYVYToYRow_NEON(const uint8* src_uyvy, uint8* dst_y, int width) {
1060 asm volatile ( 1060 asm volatile (
1061 "1: \n" 1061 "1: \n"
1062 MEMACCESS(0) 1062 MEMACCESS(0)
1063 "vld2.8 {q0, q1}, [%0]! \n" // load 16 pixels of UYVY. 1063 "vld2.8 {q0, q1}, [%0]! \n" // load 16 pixels of UYVY.
1064 "subs %2, %2, #16 \n" // 16 processed per loop. 1064 "subs %2, %2, #16 \n" // 16 processed per loop.
1065 MEMACCESS(1) 1065 MEMACCESS(1)
1066 "vst1.8 {q1}, [%1]! \n" // store 16 pixels of Y. 1066 "vst1.8 {q1}, [%1]! \n" // store 16 pixels of Y.
1067 "bgt 1b \n" 1067 "bgt 1b \n"
1068 : "+r"(src_uyvy), // %0 1068 : "+r"(src_uyvy), // %0
1069 "+r"(dst_y), // %1 1069 "+r"(dst_y), // %1
1070 "+r"(pix) // %2 1070 "+r"(width) // %2
1071 : 1071 :
1072 : "cc", "memory", "q0", "q1" // Clobber List 1072 : "cc", "memory", "q0", "q1" // Clobber List
1073 ); 1073 );
1074 } 1074 }
1075 1075
1076 void YUY2ToUV422Row_NEON(const uint8* src_yuy2, uint8* dst_u, uint8* dst_v, 1076 void YUY2ToUV422Row_NEON(const uint8* src_yuy2, uint8* dst_u, uint8* dst_v,
1077 int pix) { 1077 int width) {
1078 asm volatile ( 1078 asm volatile (
1079 "1: \n" 1079 "1: \n"
1080 MEMACCESS(0) 1080 MEMACCESS(0)
1081 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 16 pixels of YUY2. 1081 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 16 pixels of YUY2.
1082 "subs %3, %3, #16 \n" // 16 pixels = 8 UVs. 1082 "subs %3, %3, #16 \n" // 16 pixels = 8 UVs.
1083 MEMACCESS(1) 1083 MEMACCESS(1)
1084 "vst1.8 {d1}, [%1]! \n" // store 8 U. 1084 "vst1.8 {d1}, [%1]! \n" // store 8 U.
1085 MEMACCESS(2) 1085 MEMACCESS(2)
1086 "vst1.8 {d3}, [%2]! \n" // store 8 V. 1086 "vst1.8 {d3}, [%2]! \n" // store 8 V.
1087 "bgt 1b \n" 1087 "bgt 1b \n"
1088 : "+r"(src_yuy2), // %0 1088 : "+r"(src_yuy2), // %0
1089 "+r"(dst_u), // %1 1089 "+r"(dst_u), // %1
1090 "+r"(dst_v), // %2 1090 "+r"(dst_v), // %2
1091 "+r"(pix) // %3 1091 "+r"(width) // %3
1092 : 1092 :
1093 : "cc", "memory", "d0", "d1", "d2", "d3" // Clobber List 1093 : "cc", "memory", "d0", "d1", "d2", "d3" // Clobber List
1094 ); 1094 );
1095 } 1095 }
1096 1096
1097 void UYVYToUV422Row_NEON(const uint8* src_uyvy, uint8* dst_u, uint8* dst_v, 1097 void UYVYToUV422Row_NEON(const uint8* src_uyvy, uint8* dst_u, uint8* dst_v,
1098 int pix) { 1098 int width) {
1099 asm volatile ( 1099 asm volatile (
1100 "1: \n" 1100 "1: \n"
1101 MEMACCESS(0) 1101 MEMACCESS(0)
1102 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 16 pixels of UYVY. 1102 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 16 pixels of UYVY.
1103 "subs %3, %3, #16 \n" // 16 pixels = 8 UVs. 1103 "subs %3, %3, #16 \n" // 16 pixels = 8 UVs.
1104 MEMACCESS(1) 1104 MEMACCESS(1)
1105 "vst1.8 {d0}, [%1]! \n" // store 8 U. 1105 "vst1.8 {d0}, [%1]! \n" // store 8 U.
1106 MEMACCESS(2) 1106 MEMACCESS(2)
1107 "vst1.8 {d2}, [%2]! \n" // store 8 V. 1107 "vst1.8 {d2}, [%2]! \n" // store 8 V.
1108 "bgt 1b \n" 1108 "bgt 1b \n"
1109 : "+r"(src_uyvy), // %0 1109 : "+r"(src_uyvy), // %0
1110 "+r"(dst_u), // %1 1110 "+r"(dst_u), // %1
1111 "+r"(dst_v), // %2 1111 "+r"(dst_v), // %2
1112 "+r"(pix) // %3 1112 "+r"(width) // %3
1113 : 1113 :
1114 : "cc", "memory", "d0", "d1", "d2", "d3" // Clobber List 1114 : "cc", "memory", "d0", "d1", "d2", "d3" // Clobber List
1115 ); 1115 );
1116 } 1116 }
1117 1117
1118 void YUY2ToUVRow_NEON(const uint8* src_yuy2, int stride_yuy2, 1118 void YUY2ToUVRow_NEON(const uint8* src_yuy2, int stride_yuy2,
1119 uint8* dst_u, uint8* dst_v, int pix) { 1119 uint8* dst_u, uint8* dst_v, int width) {
1120 asm volatile ( 1120 asm volatile (
1121 "add %1, %0, %1 \n" // stride + src_yuy2 1121 "add %1, %0, %1 \n" // stride + src_yuy2
1122 "1: \n" 1122 "1: \n"
1123 MEMACCESS(0) 1123 MEMACCESS(0)
1124 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 16 pixels of YUY2. 1124 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 16 pixels of YUY2.
1125 "subs %4, %4, #16 \n" // 16 pixels = 8 UVs. 1125 "subs %4, %4, #16 \n" // 16 pixels = 8 UVs.
1126 MEMACCESS(1) 1126 MEMACCESS(1)
1127 "vld4.8 {d4, d5, d6, d7}, [%1]! \n" // load next row YUY2. 1127 "vld4.8 {d4, d5, d6, d7}, [%1]! \n" // load next row YUY2.
1128 "vrhadd.u8 d1, d1, d5 \n" // average rows of U 1128 "vrhadd.u8 d1, d1, d5 \n" // average rows of U
1129 "vrhadd.u8 d3, d3, d7 \n" // average rows of V 1129 "vrhadd.u8 d3, d3, d7 \n" // average rows of V
1130 MEMACCESS(2) 1130 MEMACCESS(2)
1131 "vst1.8 {d1}, [%2]! \n" // store 8 U. 1131 "vst1.8 {d1}, [%2]! \n" // store 8 U.
1132 MEMACCESS(3) 1132 MEMACCESS(3)
1133 "vst1.8 {d3}, [%3]! \n" // store 8 V. 1133 "vst1.8 {d3}, [%3]! \n" // store 8 V.
1134 "bgt 1b \n" 1134 "bgt 1b \n"
1135 : "+r"(src_yuy2), // %0 1135 : "+r"(src_yuy2), // %0
1136 "+r"(stride_yuy2), // %1 1136 "+r"(stride_yuy2), // %1
1137 "+r"(dst_u), // %2 1137 "+r"(dst_u), // %2
1138 "+r"(dst_v), // %3 1138 "+r"(dst_v), // %3
1139 "+r"(pix) // %4 1139 "+r"(width) // %4
1140 : 1140 :
1141 : "cc", "memory", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7" // Clobber L ist 1141 : "cc", "memory", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7" // Clobber L ist
1142 ); 1142 );
1143 } 1143 }
1144 1144
1145 void UYVYToUVRow_NEON(const uint8* src_uyvy, int stride_uyvy, 1145 void UYVYToUVRow_NEON(const uint8* src_uyvy, int stride_uyvy,
1146 uint8* dst_u, uint8* dst_v, int pix) { 1146 uint8* dst_u, uint8* dst_v, int width) {
1147 asm volatile ( 1147 asm volatile (
1148 "add %1, %0, %1 \n" // stride + src_uyvy 1148 "add %1, %0, %1 \n" // stride + src_uyvy
1149 "1: \n" 1149 "1: \n"
1150 MEMACCESS(0) 1150 MEMACCESS(0)
1151 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 16 pixels of UYVY. 1151 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 16 pixels of UYVY.
1152 "subs %4, %4, #16 \n" // 16 pixels = 8 UVs. 1152 "subs %4, %4, #16 \n" // 16 pixels = 8 UVs.
1153 MEMACCESS(1) 1153 MEMACCESS(1)
1154 "vld4.8 {d4, d5, d6, d7}, [%1]! \n" // load next row UYVY. 1154 "vld4.8 {d4, d5, d6, d7}, [%1]! \n" // load next row UYVY.
1155 "vrhadd.u8 d0, d0, d4 \n" // average rows of U 1155 "vrhadd.u8 d0, d0, d4 \n" // average rows of U
1156 "vrhadd.u8 d2, d2, d6 \n" // average rows of V 1156 "vrhadd.u8 d2, d2, d6 \n" // average rows of V
1157 MEMACCESS(2) 1157 MEMACCESS(2)
1158 "vst1.8 {d0}, [%2]! \n" // store 8 U. 1158 "vst1.8 {d0}, [%2]! \n" // store 8 U.
1159 MEMACCESS(3) 1159 MEMACCESS(3)
1160 "vst1.8 {d2}, [%3]! \n" // store 8 V. 1160 "vst1.8 {d2}, [%3]! \n" // store 8 V.
1161 "bgt 1b \n" 1161 "bgt 1b \n"
1162 : "+r"(src_uyvy), // %0 1162 : "+r"(src_uyvy), // %0
1163 "+r"(stride_uyvy), // %1 1163 "+r"(stride_uyvy), // %1
1164 "+r"(dst_u), // %2 1164 "+r"(dst_u), // %2
1165 "+r"(dst_v), // %3 1165 "+r"(dst_v), // %3
1166 "+r"(pix) // %4 1166 "+r"(width) // %4
1167 : 1167 :
1168 : "cc", "memory", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7" // Clobber L ist 1168 : "cc", "memory", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7" // Clobber L ist
1169 ); 1169 );
1170 } 1170 }
1171 1171
1172 // For BGRAToARGB, ABGRToARGB, RGBAToARGB, and ARGBToRGBA. 1172 // For BGRAToARGB, ABGRToARGB, RGBAToARGB, and ARGBToRGBA.
1173 void ARGBShuffleRow_NEON(const uint8* src_argb, uint8* dst_argb, 1173 void ARGBShuffleRow_NEON(const uint8* src_argb, uint8* dst_argb,
1174 const uint8* shuffler, int pix) { 1174 const uint8* shuffler, int width) {
1175 asm volatile ( 1175 asm volatile (
1176 MEMACCESS(3) 1176 MEMACCESS(3)
1177 "vld1.8 {q2}, [%3] \n" // shuffler 1177 "vld1.8 {q2}, [%3] \n" // shuffler
1178 "1: \n" 1178 "1: \n"
1179 MEMACCESS(0) 1179 MEMACCESS(0)
1180 "vld1.8 {q0}, [%0]! \n" // load 4 pixels. 1180 "vld1.8 {q0}, [%0]! \n" // load 4 pixels.
1181 "subs %2, %2, #4 \n" // 4 processed per loop 1181 "subs %2, %2, #4 \n" // 4 processed per loop
1182 "vtbl.8 d2, {d0, d1}, d4 \n" // look up 2 first pixels 1182 "vtbl.8 d2, {d0, d1}, d4 \n" // look up 2 first pixels
1183 "vtbl.8 d3, {d0, d1}, d5 \n" // look up 2 next pixels 1183 "vtbl.8 d3, {d0, d1}, d5 \n" // look up 2 next pixels
1184 MEMACCESS(1) 1184 MEMACCESS(1)
1185 "vst1.8 {q1}, [%1]! \n" // store 4. 1185 "vst1.8 {q1}, [%1]! \n" // store 4.
1186 "bgt 1b \n" 1186 "bgt 1b \n"
1187 : "+r"(src_argb), // %0 1187 : "+r"(src_argb), // %0
1188 "+r"(dst_argb), // %1 1188 "+r"(dst_argb), // %1
1189 "+r"(pix) // %2 1189 "+r"(width) // %2
1190 : "r"(shuffler) // %3 1190 : "r"(shuffler) // %3
1191 : "cc", "memory", "q0", "q1", "q2" // Clobber List 1191 : "cc", "memory", "q0", "q1", "q2" // Clobber List
1192 ); 1192 );
1193 } 1193 }
1194 1194
1195 void I422ToYUY2Row_NEON(const uint8* src_y, 1195 void I422ToYUY2Row_NEON(const uint8* src_y,
1196 const uint8* src_u, 1196 const uint8* src_u,
1197 const uint8* src_v, 1197 const uint8* src_v,
1198 uint8* dst_yuy2, int width) { 1198 uint8* dst_yuy2, int width) {
1199 asm volatile ( 1199 asm volatile (
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1237 : "+r"(src_y), // %0 1237 : "+r"(src_y), // %0
1238 "+r"(src_u), // %1 1238 "+r"(src_u), // %1
1239 "+r"(src_v), // %2 1239 "+r"(src_v), // %2
1240 "+r"(dst_uyvy), // %3 1240 "+r"(dst_uyvy), // %3
1241 "+r"(width) // %4 1241 "+r"(width) // %4
1242 : 1242 :
1243 : "cc", "memory", "d0", "d1", "d2", "d3" 1243 : "cc", "memory", "d0", "d1", "d2", "d3"
1244 ); 1244 );
1245 } 1245 }
1246 1246
1247 void ARGBToRGB565Row_NEON(const uint8* src_argb, uint8* dst_rgb565, int pix) { 1247 void ARGBToRGB565Row_NEON(const uint8* src_argb, uint8* dst_rgb565, int width) {
1248 asm volatile ( 1248 asm volatile (
1249 "1: \n" 1249 "1: \n"
1250 MEMACCESS(0) 1250 MEMACCESS(0)
1251 "vld4.8 {d20, d21, d22, d23}, [%0]! \n" // load 8 pixels of ARGB. 1251 "vld4.8 {d20, d21, d22, d23}, [%0]! \n" // load 8 pixels of ARGB.
1252 "subs %2, %2, #8 \n" // 8 processed per loop. 1252 "subs %2, %2, #8 \n" // 8 processed per loop.
1253 ARGBTORGB565 1253 ARGBTORGB565
1254 MEMACCESS(1) 1254 MEMACCESS(1)
1255 "vst1.8 {q0}, [%1]! \n" // store 8 pixels RGB565. 1255 "vst1.8 {q0}, [%1]! \n" // store 8 pixels RGB565.
1256 "bgt 1b \n" 1256 "bgt 1b \n"
1257 : "+r"(src_argb), // %0 1257 : "+r"(src_argb), // %0
1258 "+r"(dst_rgb565), // %1 1258 "+r"(dst_rgb565), // %1
1259 "+r"(pix) // %2 1259 "+r"(width) // %2
1260 : 1260 :
1261 : "cc", "memory", "q0", "q8", "q9", "q10", "q11" 1261 : "cc", "memory", "q0", "q8", "q9", "q10", "q11"
1262 ); 1262 );
1263 } 1263 }
1264 1264
1265 void ARGBToRGB565DitherRow_NEON(const uint8* src_argb, uint8* dst_rgb, 1265 void ARGBToRGB565DitherRow_NEON(const uint8* src_argb, uint8* dst_rgb,
1266 const uint32 dither4, int width) { 1266 const uint32 dither4, int width) {
1267 asm volatile ( 1267 asm volatile (
1268 "vdup.32 d2, %2 \n" // dither4 1268 "vdup.32 d2, %2 \n" // dither4
1269 "1: \n" 1269 "1: \n"
1270 MEMACCESS(1) 1270 MEMACCESS(1)
1271 "vld4.8 {d20, d21, d22, d23}, [%1]! \n" // load 8 pixels of ARGB. 1271 "vld4.8 {d20, d21, d22, d23}, [%1]! \n" // load 8 pixels of ARGB.
1272 "subs %3, %3, #8 \n" // 8 processed per loop. 1272 "subs %3, %3, #8 \n" // 8 processed per loop.
1273 "vqadd.u8 d20, d20, d2 \n" 1273 "vqadd.u8 d20, d20, d2 \n"
1274 "vqadd.u8 d21, d21, d2 \n" 1274 "vqadd.u8 d21, d21, d2 \n"
1275 "vqadd.u8 d22, d22, d2 \n" 1275 "vqadd.u8 d22, d22, d2 \n"
1276 ARGBTORGB565 1276 ARGBTORGB565
1277 MEMACCESS(0) 1277 MEMACCESS(0)
1278 "vst1.8 {q0}, [%0]! \n" // store 8 pixels RGB565. 1278 "vst1.8 {q0}, [%0]! \n" // store 8 pixels RGB565.
1279 "bgt 1b \n" 1279 "bgt 1b \n"
1280 : "+r"(dst_rgb) // %0 1280 : "+r"(dst_rgb) // %0
1281 : "r"(src_argb), // %1 1281 : "r"(src_argb), // %1
1282 "r"(dither4), // %2 1282 "r"(dither4), // %2
1283 "r"(width) // %3 1283 "r"(width) // %3
1284 : "cc", "memory", "q0", "q1", "q8", "q9", "q10", "q11" 1284 : "cc", "memory", "q0", "q1", "q8", "q9", "q10", "q11"
1285 ); 1285 );
1286 } 1286 }
1287 1287
1288 void ARGBToARGB1555Row_NEON(const uint8* src_argb, uint8* dst_argb1555, 1288 void ARGBToARGB1555Row_NEON(const uint8* src_argb, uint8* dst_argb1555,
1289 int pix) { 1289 int width) {
1290 asm volatile ( 1290 asm volatile (
1291 "1: \n" 1291 "1: \n"
1292 MEMACCESS(0) 1292 MEMACCESS(0)
1293 "vld4.8 {d20, d21, d22, d23}, [%0]! \n" // load 8 pixels of ARGB. 1293 "vld4.8 {d20, d21, d22, d23}, [%0]! \n" // load 8 pixels of ARGB.
1294 "subs %2, %2, #8 \n" // 8 processed per loop. 1294 "subs %2, %2, #8 \n" // 8 processed per loop.
1295 ARGBTOARGB1555 1295 ARGBTOARGB1555
1296 MEMACCESS(1) 1296 MEMACCESS(1)
1297 "vst1.8 {q0}, [%1]! \n" // store 8 pixels ARGB1555. 1297 "vst1.8 {q0}, [%1]! \n" // store 8 pixels ARGB1555.
1298 "bgt 1b \n" 1298 "bgt 1b \n"
1299 : "+r"(src_argb), // %0 1299 : "+r"(src_argb), // %0
1300 "+r"(dst_argb1555), // %1 1300 "+r"(dst_argb1555), // %1
1301 "+r"(pix) // %2 1301 "+r"(width) // %2
1302 : 1302 :
1303 : "cc", "memory", "q0", "q8", "q9", "q10", "q11" 1303 : "cc", "memory", "q0", "q8", "q9", "q10", "q11"
1304 ); 1304 );
1305 } 1305 }
1306 1306
1307 void ARGBToARGB4444Row_NEON(const uint8* src_argb, uint8* dst_argb4444, 1307 void ARGBToARGB4444Row_NEON(const uint8* src_argb, uint8* dst_argb4444,
1308 int pix) { 1308 int width) {
1309 asm volatile ( 1309 asm volatile (
1310 "vmov.u8 d4, #0x0f \n" // bits to clear with vbic. 1310 "vmov.u8 d4, #0x0f \n" // bits to clear with vbic.
1311 "1: \n" 1311 "1: \n"
1312 MEMACCESS(0) 1312 MEMACCESS(0)
1313 "vld4.8 {d20, d21, d22, d23}, [%0]! \n" // load 8 pixels of ARGB. 1313 "vld4.8 {d20, d21, d22, d23}, [%0]! \n" // load 8 pixels of ARGB.
1314 "subs %2, %2, #8 \n" // 8 processed per loop. 1314 "subs %2, %2, #8 \n" // 8 processed per loop.
1315 ARGBTOARGB4444 1315 ARGBTOARGB4444
1316 MEMACCESS(1) 1316 MEMACCESS(1)
1317 "vst1.8 {q0}, [%1]! \n" // store 8 pixels ARGB4444. 1317 "vst1.8 {q0}, [%1]! \n" // store 8 pixels ARGB4444.
1318 "bgt 1b \n" 1318 "bgt 1b \n"
1319 : "+r"(src_argb), // %0 1319 : "+r"(src_argb), // %0
1320 "+r"(dst_argb4444), // %1 1320 "+r"(dst_argb4444), // %1
1321 "+r"(pix) // %2 1321 "+r"(width) // %2
1322 : 1322 :
1323 : "cc", "memory", "q0", "q8", "q9", "q10", "q11" 1323 : "cc", "memory", "q0", "q8", "q9", "q10", "q11"
1324 ); 1324 );
1325 } 1325 }
1326 1326
1327 void ARGBToYRow_NEON(const uint8* src_argb, uint8* dst_y, int pix) { 1327 void ARGBToYRow_NEON(const uint8* src_argb, uint8* dst_y, int width) {
1328 asm volatile ( 1328 asm volatile (
1329 "vmov.u8 d24, #13 \n" // B * 0.1016 coefficient 1329 "vmov.u8 d24, #13 \n" // B * 0.1016 coefficient
1330 "vmov.u8 d25, #65 \n" // G * 0.5078 coefficient 1330 "vmov.u8 d25, #65 \n" // G * 0.5078 coefficient
1331 "vmov.u8 d26, #33 \n" // R * 0.2578 coefficient 1331 "vmov.u8 d26, #33 \n" // R * 0.2578 coefficient
1332 "vmov.u8 d27, #16 \n" // Add 16 constant 1332 "vmov.u8 d27, #16 \n" // Add 16 constant
1333 "1: \n" 1333 "1: \n"
1334 MEMACCESS(0) 1334 MEMACCESS(0)
1335 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 ARGB pixels. 1335 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 ARGB pixels.
1336 "subs %2, %2, #8 \n" // 8 processed per loop. 1336 "subs %2, %2, #8 \n" // 8 processed per loop.
1337 "vmull.u8 q2, d0, d24 \n" // B 1337 "vmull.u8 q2, d0, d24 \n" // B
1338 "vmlal.u8 q2, d1, d25 \n" // G 1338 "vmlal.u8 q2, d1, d25 \n" // G
1339 "vmlal.u8 q2, d2, d26 \n" // R 1339 "vmlal.u8 q2, d2, d26 \n" // R
1340 "vqrshrun.s16 d0, q2, #7 \n" // 16 bit to 8 bit Y 1340 "vqrshrun.s16 d0, q2, #7 \n" // 16 bit to 8 bit Y
1341 "vqadd.u8 d0, d27 \n" 1341 "vqadd.u8 d0, d27 \n"
1342 MEMACCESS(1) 1342 MEMACCESS(1)
1343 "vst1.8 {d0}, [%1]! \n" // store 8 pixels Y. 1343 "vst1.8 {d0}, [%1]! \n" // store 8 pixels Y.
1344 "bgt 1b \n" 1344 "bgt 1b \n"
1345 : "+r"(src_argb), // %0 1345 : "+r"(src_argb), // %0
1346 "+r"(dst_y), // %1 1346 "+r"(dst_y), // %1
1347 "+r"(pix) // %2 1347 "+r"(width) // %2
1348 : 1348 :
1349 : "cc", "memory", "q0", "q1", "q2", "q12", "q13" 1349 : "cc", "memory", "q0", "q1", "q2", "q12", "q13"
1350 ); 1350 );
1351 } 1351 }
1352 1352
1353 void ARGBToYJRow_NEON(const uint8* src_argb, uint8* dst_y, int pix) { 1353 void ARGBToYJRow_NEON(const uint8* src_argb, uint8* dst_y, int width) {
1354 asm volatile ( 1354 asm volatile (
1355 "vmov.u8 d24, #15 \n" // B * 0.11400 coefficient 1355 "vmov.u8 d24, #15 \n" // B * 0.11400 coefficient
1356 "vmov.u8 d25, #75 \n" // G * 0.58700 coefficient 1356 "vmov.u8 d25, #75 \n" // G * 0.58700 coefficient
1357 "vmov.u8 d26, #38 \n" // R * 0.29900 coefficient 1357 "vmov.u8 d26, #38 \n" // R * 0.29900 coefficient
1358 "1: \n" 1358 "1: \n"
1359 MEMACCESS(0) 1359 MEMACCESS(0)
1360 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 ARGB pixels. 1360 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 ARGB pixels.
1361 "subs %2, %2, #8 \n" // 8 processed per loop. 1361 "subs %2, %2, #8 \n" // 8 processed per loop.
1362 "vmull.u8 q2, d0, d24 \n" // B 1362 "vmull.u8 q2, d0, d24 \n" // B
1363 "vmlal.u8 q2, d1, d25 \n" // G 1363 "vmlal.u8 q2, d1, d25 \n" // G
1364 "vmlal.u8 q2, d2, d26 \n" // R 1364 "vmlal.u8 q2, d2, d26 \n" // R
1365 "vqrshrun.s16 d0, q2, #7 \n" // 15 bit to 8 bit Y 1365 "vqrshrun.s16 d0, q2, #7 \n" // 15 bit to 8 bit Y
1366 MEMACCESS(1) 1366 MEMACCESS(1)
1367 "vst1.8 {d0}, [%1]! \n" // store 8 pixels Y. 1367 "vst1.8 {d0}, [%1]! \n" // store 8 pixels Y.
1368 "bgt 1b \n" 1368 "bgt 1b \n"
1369 : "+r"(src_argb), // %0 1369 : "+r"(src_argb), // %0
1370 "+r"(dst_y), // %1 1370 "+r"(dst_y), // %1
1371 "+r"(pix) // %2 1371 "+r"(width) // %2
1372 : 1372 :
1373 : "cc", "memory", "q0", "q1", "q2", "q12", "q13" 1373 : "cc", "memory", "q0", "q1", "q2", "q12", "q13"
1374 ); 1374 );
1375 } 1375 }
1376 1376
1377 // 8x1 pixels. 1377 // 8x1 pixels.
1378 void ARGBToUV444Row_NEON(const uint8* src_argb, uint8* dst_u, uint8* dst_v, 1378 void ARGBToUV444Row_NEON(const uint8* src_argb, uint8* dst_u, uint8* dst_v,
1379 int pix) { 1379 int width) {
1380 asm volatile ( 1380 asm volatile (
1381 "vmov.u8 d24, #112 \n" // UB / VR 0.875 coefficient 1381 "vmov.u8 d24, #112 \n" // UB / VR 0.875 coefficient
1382 "vmov.u8 d25, #74 \n" // UG -0.5781 coefficient 1382 "vmov.u8 d25, #74 \n" // UG -0.5781 coefficient
1383 "vmov.u8 d26, #38 \n" // UR -0.2969 coefficient 1383 "vmov.u8 d26, #38 \n" // UR -0.2969 coefficient
1384 "vmov.u8 d27, #18 \n" // VB -0.1406 coefficient 1384 "vmov.u8 d27, #18 \n" // VB -0.1406 coefficient
1385 "vmov.u8 d28, #94 \n" // VG -0.7344 coefficient 1385 "vmov.u8 d28, #94 \n" // VG -0.7344 coefficient
1386 "vmov.u16 q15, #0x8080 \n" // 128.5 1386 "vmov.u16 q15, #0x8080 \n" // 128.5
1387 "1: \n" 1387 "1: \n"
1388 MEMACCESS(0) 1388 MEMACCESS(0)
1389 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 ARGB pixels. 1389 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 ARGB pixels.
(...skipping 12 matching lines...) Expand all
1402 "vqshrn.u16 d1, q3, #8 \n" // 16 bit to 8 bit V 1402 "vqshrn.u16 d1, q3, #8 \n" // 16 bit to 8 bit V
1403 1403
1404 MEMACCESS(1) 1404 MEMACCESS(1)
1405 "vst1.8 {d0}, [%1]! \n" // store 8 pixels U. 1405 "vst1.8 {d0}, [%1]! \n" // store 8 pixels U.
1406 MEMACCESS(2) 1406 MEMACCESS(2)
1407 "vst1.8 {d1}, [%2]! \n" // store 8 pixels V. 1407 "vst1.8 {d1}, [%2]! \n" // store 8 pixels V.
1408 "bgt 1b \n" 1408 "bgt 1b \n"
1409 : "+r"(src_argb), // %0 1409 : "+r"(src_argb), // %0
1410 "+r"(dst_u), // %1 1410 "+r"(dst_u), // %1
1411 "+r"(dst_v), // %2 1411 "+r"(dst_v), // %2
1412 "+r"(pix) // %3 1412 "+r"(width) // %3
1413 : 1413 :
1414 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q12", "q13", "q14", "q15" 1414 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q12", "q13", "q14", "q15"
1415 ); 1415 );
1416 } 1416 }
1417 1417
1418 // 16x1 pixels -> 8x1. pix is number of argb pixels. e.g. 16. 1418 // 16x1 pixels -> 8x1. width is number of argb pixels. e.g. 16.
1419 void ARGBToUV422Row_NEON(const uint8* src_argb, uint8* dst_u, uint8* dst_v, 1419 void ARGBToUV422Row_NEON(const uint8* src_argb, uint8* dst_u, uint8* dst_v,
1420 int pix) { 1420 int width) {
1421 asm volatile ( 1421 asm volatile (
1422 "vmov.s16 q10, #112 / 2 \n" // UB / VR 0.875 coefficient 1422 "vmov.s16 q10, #112 / 2 \n" // UB / VR 0.875 coefficient
1423 "vmov.s16 q11, #74 / 2 \n" // UG -0.5781 coefficient 1423 "vmov.s16 q11, #74 / 2 \n" // UG -0.5781 coefficient
1424 "vmov.s16 q12, #38 / 2 \n" // UR -0.2969 coefficient 1424 "vmov.s16 q12, #38 / 2 \n" // UR -0.2969 coefficient
1425 "vmov.s16 q13, #18 / 2 \n" // VB -0.1406 coefficient 1425 "vmov.s16 q13, #18 / 2 \n" // VB -0.1406 coefficient
1426 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient 1426 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient
1427 "vmov.u16 q15, #0x8080 \n" // 128.5 1427 "vmov.u16 q15, #0x8080 \n" // 128.5
1428 "1: \n" 1428 "1: \n"
1429 MEMACCESS(0) 1429 MEMACCESS(0)
1430 "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 ARGB pixels. 1430 "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 ARGB pixels.
(...skipping 19 matching lines...) Expand all
1450 "vqshrn.u16 d1, q9, #8 \n" // 16 bit to 8 bit V 1450 "vqshrn.u16 d1, q9, #8 \n" // 16 bit to 8 bit V
1451 1451
1452 MEMACCESS(1) 1452 MEMACCESS(1)
1453 "vst1.8 {d0}, [%1]! \n" // store 8 pixels U. 1453 "vst1.8 {d0}, [%1]! \n" // store 8 pixels U.
1454 MEMACCESS(2) 1454 MEMACCESS(2)
1455 "vst1.8 {d1}, [%2]! \n" // store 8 pixels V. 1455 "vst1.8 {d1}, [%2]! \n" // store 8 pixels V.
1456 "bgt 1b \n" 1456 "bgt 1b \n"
1457 : "+r"(src_argb), // %0 1457 : "+r"(src_argb), // %0
1458 "+r"(dst_u), // %1 1458 "+r"(dst_u), // %1
1459 "+r"(dst_v), // %2 1459 "+r"(dst_v), // %2
1460 "+r"(pix) // %3 1460 "+r"(width) // %3
1461 : 1461 :
1462 : "cc", "memory", "q0", "q1", "q2", "q3", 1462 : "cc", "memory", "q0", "q1", "q2", "q3",
1463 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 1463 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
1464 ); 1464 );
1465 } 1465 }
1466 1466
1467 // 32x1 pixels -> 8x1. pix is number of argb pixels. e.g. 32. 1467 // 32x1 pixels -> 8x1. width is number of argb pixels. e.g. 32.
1468 void ARGBToUV411Row_NEON(const uint8* src_argb, uint8* dst_u, uint8* dst_v, 1468 void ARGBToUV411Row_NEON(const uint8* src_argb, uint8* dst_u, uint8* dst_v,
1469 int pix) { 1469 int width) {
1470 asm volatile ( 1470 asm volatile (
1471 "vmov.s16 q10, #112 / 2 \n" // UB / VR 0.875 coefficient 1471 "vmov.s16 q10, #112 / 2 \n" // UB / VR 0.875 coefficient
1472 "vmov.s16 q11, #74 / 2 \n" // UG -0.5781 coefficient 1472 "vmov.s16 q11, #74 / 2 \n" // UG -0.5781 coefficient
1473 "vmov.s16 q12, #38 / 2 \n" // UR -0.2969 coefficient 1473 "vmov.s16 q12, #38 / 2 \n" // UR -0.2969 coefficient
1474 "vmov.s16 q13, #18 / 2 \n" // VB -0.1406 coefficient 1474 "vmov.s16 q13, #18 / 2 \n" // VB -0.1406 coefficient
1475 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient 1475 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient
1476 "vmov.u16 q15, #0x8080 \n" // 128.5 1476 "vmov.u16 q15, #0x8080 \n" // 128.5
1477 "1: \n" 1477 "1: \n"
1478 MEMACCESS(0) 1478 MEMACCESS(0)
1479 "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 ARGB pixels. 1479 "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 ARGB pixels.
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1513 "vqshrn.u16 d0, q8, #8 \n" // 16 bit to 8 bit U 1513 "vqshrn.u16 d0, q8, #8 \n" // 16 bit to 8 bit U
1514 "vqshrn.u16 d1, q9, #8 \n" // 16 bit to 8 bit V 1514 "vqshrn.u16 d1, q9, #8 \n" // 16 bit to 8 bit V
1515 MEMACCESS(1) 1515 MEMACCESS(1)
1516 "vst1.8 {d0}, [%1]! \n" // store 8 pixels U. 1516 "vst1.8 {d0}, [%1]! \n" // store 8 pixels U.
1517 MEMACCESS(2) 1517 MEMACCESS(2)
1518 "vst1.8 {d1}, [%2]! \n" // store 8 pixels V. 1518 "vst1.8 {d1}, [%2]! \n" // store 8 pixels V.
1519 "bgt 1b \n" 1519 "bgt 1b \n"
1520 : "+r"(src_argb), // %0 1520 : "+r"(src_argb), // %0
1521 "+r"(dst_u), // %1 1521 "+r"(dst_u), // %1
1522 "+r"(dst_v), // %2 1522 "+r"(dst_v), // %2
1523 "+r"(pix) // %3 1523 "+r"(width) // %3
1524 : 1524 :
1525 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", 1525 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
1526 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 1526 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
1527 ); 1527 );
1528 } 1528 }
1529 1529
1530 // 16x2 pixels -> 8x1. pix is number of argb pixels. e.g. 16. 1530 // 16x2 pixels -> 8x1. width is number of argb pixels. e.g. 16.
1531 #define RGBTOUV(QB, QG, QR) \ 1531 #define RGBTOUV(QB, QG, QR) \
1532 "vmul.s16 q8, " #QB ", q10 \n" /* B */ \ 1532 "vmul.s16 q8, " #QB ", q10 \n" /* B */ \
1533 "vmls.s16 q8, " #QG ", q11 \n" /* G */ \ 1533 "vmls.s16 q8, " #QG ", q11 \n" /* G */ \
1534 "vmls.s16 q8, " #QR ", q12 \n" /* R */ \ 1534 "vmls.s16 q8, " #QR ", q12 \n" /* R */ \
1535 "vadd.u16 q8, q8, q15 \n" /* +128 -> unsigned */ \ 1535 "vadd.u16 q8, q8, q15 \n" /* +128 -> unsigned */ \
1536 "vmul.s16 q9, " #QR ", q10 \n" /* R */ \ 1536 "vmul.s16 q9, " #QR ", q10 \n" /* R */ \
1537 "vmls.s16 q9, " #QG ", q14 \n" /* G */ \ 1537 "vmls.s16 q9, " #QG ", q14 \n" /* G */ \
1538 "vmls.s16 q9, " #QB ", q13 \n" /* B */ \ 1538 "vmls.s16 q9, " #QB ", q13 \n" /* B */ \
1539 "vadd.u16 q9, q9, q15 \n" /* +128 -> unsigned */ \ 1539 "vadd.u16 q9, q9, q15 \n" /* +128 -> unsigned */ \
1540 "vqshrn.u16 d0, q8, #8 \n" /* 16 bit to 8 bit U */ \ 1540 "vqshrn.u16 d0, q8, #8 \n" /* 16 bit to 8 bit U */ \
1541 "vqshrn.u16 d1, q9, #8 \n" /* 16 bit to 8 bit V */ 1541 "vqshrn.u16 d1, q9, #8 \n" /* 16 bit to 8 bit V */
1542 1542
1543 // TODO(fbarchard): Consider vhadd vertical, then vpaddl horizontal, avoid shr. 1543 // TODO(fbarchard): Consider vhadd vertical, then vpaddl horizontal, avoid shr.
1544 void ARGBToUVRow_NEON(const uint8* src_argb, int src_stride_argb, 1544 void ARGBToUVRow_NEON(const uint8* src_argb, int src_stride_argb,
1545 uint8* dst_u, uint8* dst_v, int pix) { 1545 uint8* dst_u, uint8* dst_v, int width) {
1546 asm volatile ( 1546 asm volatile (
1547 "add %1, %0, %1 \n" // src_stride + src_argb 1547 "add %1, %0, %1 \n" // src_stride + src_argb
1548 "vmov.s16 q10, #112 / 2 \n" // UB / VR 0.875 coefficient 1548 "vmov.s16 q10, #112 / 2 \n" // UB / VR 0.875 coefficient
1549 "vmov.s16 q11, #74 / 2 \n" // UG -0.5781 coefficient 1549 "vmov.s16 q11, #74 / 2 \n" // UG -0.5781 coefficient
1550 "vmov.s16 q12, #38 / 2 \n" // UR -0.2969 coefficient 1550 "vmov.s16 q12, #38 / 2 \n" // UR -0.2969 coefficient
1551 "vmov.s16 q13, #18 / 2 \n" // VB -0.1406 coefficient 1551 "vmov.s16 q13, #18 / 2 \n" // VB -0.1406 coefficient
1552 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient 1552 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient
1553 "vmov.u16 q15, #0x8080 \n" // 128.5 1553 "vmov.u16 q15, #0x8080 \n" // 128.5
1554 "1: \n" 1554 "1: \n"
1555 MEMACCESS(0) 1555 MEMACCESS(0)
(...skipping 19 matching lines...) Expand all
1575 RGBTOUV(q0, q1, q2) 1575 RGBTOUV(q0, q1, q2)
1576 MEMACCESS(2) 1576 MEMACCESS(2)
1577 "vst1.8 {d0}, [%2]! \n" // store 8 pixels U. 1577 "vst1.8 {d0}, [%2]! \n" // store 8 pixels U.
1578 MEMACCESS(3) 1578 MEMACCESS(3)
1579 "vst1.8 {d1}, [%3]! \n" // store 8 pixels V. 1579 "vst1.8 {d1}, [%3]! \n" // store 8 pixels V.
1580 "bgt 1b \n" 1580 "bgt 1b \n"
1581 : "+r"(src_argb), // %0 1581 : "+r"(src_argb), // %0
1582 "+r"(src_stride_argb), // %1 1582 "+r"(src_stride_argb), // %1
1583 "+r"(dst_u), // %2 1583 "+r"(dst_u), // %2
1584 "+r"(dst_v), // %3 1584 "+r"(dst_v), // %3
1585 "+r"(pix) // %4 1585 "+r"(width) // %4
1586 : 1586 :
1587 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", 1587 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
1588 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 1588 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
1589 ); 1589 );
1590 } 1590 }
1591 1591
1592 // TODO(fbarchard): Subsample match C code. 1592 // TODO(fbarchard): Subsample match C code.
1593 void ARGBToUVJRow_NEON(const uint8* src_argb, int src_stride_argb, 1593 void ARGBToUVJRow_NEON(const uint8* src_argb, int src_stride_argb,
1594 uint8* dst_u, uint8* dst_v, int pix) { 1594 uint8* dst_u, uint8* dst_v, int width) {
1595 asm volatile ( 1595 asm volatile (
1596 "add %1, %0, %1 \n" // src_stride + src_argb 1596 "add %1, %0, %1 \n" // src_stride + src_argb
1597 "vmov.s16 q10, #127 / 2 \n" // UB / VR 0.500 coefficient 1597 "vmov.s16 q10, #127 / 2 \n" // UB / VR 0.500 coefficient
1598 "vmov.s16 q11, #84 / 2 \n" // UG -0.33126 coefficient 1598 "vmov.s16 q11, #84 / 2 \n" // UG -0.33126 coefficient
1599 "vmov.s16 q12, #43 / 2 \n" // UR -0.16874 coefficient 1599 "vmov.s16 q12, #43 / 2 \n" // UR -0.16874 coefficient
1600 "vmov.s16 q13, #20 / 2 \n" // VB -0.08131 coefficient 1600 "vmov.s16 q13, #20 / 2 \n" // VB -0.08131 coefficient
1601 "vmov.s16 q14, #107 / 2 \n" // VG -0.41869 coefficient 1601 "vmov.s16 q14, #107 / 2 \n" // VG -0.41869 coefficient
1602 "vmov.u16 q15, #0x8080 \n" // 128.5 1602 "vmov.u16 q15, #0x8080 \n" // 128.5
1603 "1: \n" 1603 "1: \n"
1604 MEMACCESS(0) 1604 MEMACCESS(0)
(...skipping 19 matching lines...) Expand all
1624 RGBTOUV(q0, q1, q2) 1624 RGBTOUV(q0, q1, q2)
1625 MEMACCESS(2) 1625 MEMACCESS(2)
1626 "vst1.8 {d0}, [%2]! \n" // store 8 pixels U. 1626 "vst1.8 {d0}, [%2]! \n" // store 8 pixels U.
1627 MEMACCESS(3) 1627 MEMACCESS(3)
1628 "vst1.8 {d1}, [%3]! \n" // store 8 pixels V. 1628 "vst1.8 {d1}, [%3]! \n" // store 8 pixels V.
1629 "bgt 1b \n" 1629 "bgt 1b \n"
1630 : "+r"(src_argb), // %0 1630 : "+r"(src_argb), // %0
1631 "+r"(src_stride_argb), // %1 1631 "+r"(src_stride_argb), // %1
1632 "+r"(dst_u), // %2 1632 "+r"(dst_u), // %2
1633 "+r"(dst_v), // %3 1633 "+r"(dst_v), // %3
1634 "+r"(pix) // %4 1634 "+r"(width) // %4
1635 : 1635 :
1636 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", 1636 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
1637 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 1637 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
1638 ); 1638 );
1639 } 1639 }
1640 1640
1641 void BGRAToUVRow_NEON(const uint8* src_bgra, int src_stride_bgra, 1641 void BGRAToUVRow_NEON(const uint8* src_bgra, int src_stride_bgra,
1642 uint8* dst_u, uint8* dst_v, int pix) { 1642 uint8* dst_u, uint8* dst_v, int width) {
1643 asm volatile ( 1643 asm volatile (
1644 "add %1, %0, %1 \n" // src_stride + src_bgra 1644 "add %1, %0, %1 \n" // src_stride + src_bgra
1645 "vmov.s16 q10, #112 / 2 \n" // UB / VR 0.875 coefficient 1645 "vmov.s16 q10, #112 / 2 \n" // UB / VR 0.875 coefficient
1646 "vmov.s16 q11, #74 / 2 \n" // UG -0.5781 coefficient 1646 "vmov.s16 q11, #74 / 2 \n" // UG -0.5781 coefficient
1647 "vmov.s16 q12, #38 / 2 \n" // UR -0.2969 coefficient 1647 "vmov.s16 q12, #38 / 2 \n" // UR -0.2969 coefficient
1648 "vmov.s16 q13, #18 / 2 \n" // VB -0.1406 coefficient 1648 "vmov.s16 q13, #18 / 2 \n" // VB -0.1406 coefficient
1649 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient 1649 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient
1650 "vmov.u16 q15, #0x8080 \n" // 128.5 1650 "vmov.u16 q15, #0x8080 \n" // 128.5
1651 "1: \n" 1651 "1: \n"
1652 MEMACCESS(0) 1652 MEMACCESS(0)
(...skipping 19 matching lines...) Expand all
1672 RGBTOUV(q3, q2, q1) 1672 RGBTOUV(q3, q2, q1)
1673 MEMACCESS(2) 1673 MEMACCESS(2)
1674 "vst1.8 {d0}, [%2]! \n" // store 8 pixels U. 1674 "vst1.8 {d0}, [%2]! \n" // store 8 pixels U.
1675 MEMACCESS(3) 1675 MEMACCESS(3)
1676 "vst1.8 {d1}, [%3]! \n" // store 8 pixels V. 1676 "vst1.8 {d1}, [%3]! \n" // store 8 pixels V.
1677 "bgt 1b \n" 1677 "bgt 1b \n"
1678 : "+r"(src_bgra), // %0 1678 : "+r"(src_bgra), // %0
1679 "+r"(src_stride_bgra), // %1 1679 "+r"(src_stride_bgra), // %1
1680 "+r"(dst_u), // %2 1680 "+r"(dst_u), // %2
1681 "+r"(dst_v), // %3 1681 "+r"(dst_v), // %3
1682 "+r"(pix) // %4 1682 "+r"(width) // %4
1683 : 1683 :
1684 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", 1684 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
1685 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 1685 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
1686 ); 1686 );
1687 } 1687 }
1688 1688
1689 void ABGRToUVRow_NEON(const uint8* src_abgr, int src_stride_abgr, 1689 void ABGRToUVRow_NEON(const uint8* src_abgr, int src_stride_abgr,
1690 uint8* dst_u, uint8* dst_v, int pix) { 1690 uint8* dst_u, uint8* dst_v, int width) {
1691 asm volatile ( 1691 asm volatile (
1692 "add %1, %0, %1 \n" // src_stride + src_abgr 1692 "add %1, %0, %1 \n" // src_stride + src_abgr
1693 "vmov.s16 q10, #112 / 2 \n" // UB / VR 0.875 coefficient 1693 "vmov.s16 q10, #112 / 2 \n" // UB / VR 0.875 coefficient
1694 "vmov.s16 q11, #74 / 2 \n" // UG -0.5781 coefficient 1694 "vmov.s16 q11, #74 / 2 \n" // UG -0.5781 coefficient
1695 "vmov.s16 q12, #38 / 2 \n" // UR -0.2969 coefficient 1695 "vmov.s16 q12, #38 / 2 \n" // UR -0.2969 coefficient
1696 "vmov.s16 q13, #18 / 2 \n" // VB -0.1406 coefficient 1696 "vmov.s16 q13, #18 / 2 \n" // VB -0.1406 coefficient
1697 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient 1697 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient
1698 "vmov.u16 q15, #0x8080 \n" // 128.5 1698 "vmov.u16 q15, #0x8080 \n" // 128.5
1699 "1: \n" 1699 "1: \n"
1700 MEMACCESS(0) 1700 MEMACCESS(0)
(...skipping 19 matching lines...) Expand all
1720 RGBTOUV(q2, q1, q0) 1720 RGBTOUV(q2, q1, q0)
1721 MEMACCESS(2) 1721 MEMACCESS(2)
1722 "vst1.8 {d0}, [%2]! \n" // store 8 pixels U. 1722 "vst1.8 {d0}, [%2]! \n" // store 8 pixels U.
1723 MEMACCESS(3) 1723 MEMACCESS(3)
1724 "vst1.8 {d1}, [%3]! \n" // store 8 pixels V. 1724 "vst1.8 {d1}, [%3]! \n" // store 8 pixels V.
1725 "bgt 1b \n" 1725 "bgt 1b \n"
1726 : "+r"(src_abgr), // %0 1726 : "+r"(src_abgr), // %0
1727 "+r"(src_stride_abgr), // %1 1727 "+r"(src_stride_abgr), // %1
1728 "+r"(dst_u), // %2 1728 "+r"(dst_u), // %2
1729 "+r"(dst_v), // %3 1729 "+r"(dst_v), // %3
1730 "+r"(pix) // %4 1730 "+r"(width) // %4
1731 : 1731 :
1732 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", 1732 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
1733 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 1733 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
1734 ); 1734 );
1735 } 1735 }
1736 1736
1737 void RGBAToUVRow_NEON(const uint8* src_rgba, int src_stride_rgba, 1737 void RGBAToUVRow_NEON(const uint8* src_rgba, int src_stride_rgba,
1738 uint8* dst_u, uint8* dst_v, int pix) { 1738 uint8* dst_u, uint8* dst_v, int width) {
1739 asm volatile ( 1739 asm volatile (
1740 "add %1, %0, %1 \n" // src_stride + src_rgba 1740 "add %1, %0, %1 \n" // src_stride + src_rgba
1741 "vmov.s16 q10, #112 / 2 \n" // UB / VR 0.875 coefficient 1741 "vmov.s16 q10, #112 / 2 \n" // UB / VR 0.875 coefficient
1742 "vmov.s16 q11, #74 / 2 \n" // UG -0.5781 coefficient 1742 "vmov.s16 q11, #74 / 2 \n" // UG -0.5781 coefficient
1743 "vmov.s16 q12, #38 / 2 \n" // UR -0.2969 coefficient 1743 "vmov.s16 q12, #38 / 2 \n" // UR -0.2969 coefficient
1744 "vmov.s16 q13, #18 / 2 \n" // VB -0.1406 coefficient 1744 "vmov.s16 q13, #18 / 2 \n" // VB -0.1406 coefficient
1745 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient 1745 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient
1746 "vmov.u16 q15, #0x8080 \n" // 128.5 1746 "vmov.u16 q15, #0x8080 \n" // 128.5
1747 "1: \n" 1747 "1: \n"
1748 MEMACCESS(0) 1748 MEMACCESS(0)
(...skipping 19 matching lines...) Expand all
1768 RGBTOUV(q0, q1, q2) 1768 RGBTOUV(q0, q1, q2)
1769 MEMACCESS(2) 1769 MEMACCESS(2)
1770 "vst1.8 {d0}, [%2]! \n" // store 8 pixels U. 1770 "vst1.8 {d0}, [%2]! \n" // store 8 pixels U.
1771 MEMACCESS(3) 1771 MEMACCESS(3)
1772 "vst1.8 {d1}, [%3]! \n" // store 8 pixels V. 1772 "vst1.8 {d1}, [%3]! \n" // store 8 pixels V.
1773 "bgt 1b \n" 1773 "bgt 1b \n"
1774 : "+r"(src_rgba), // %0 1774 : "+r"(src_rgba), // %0
1775 "+r"(src_stride_rgba), // %1 1775 "+r"(src_stride_rgba), // %1
1776 "+r"(dst_u), // %2 1776 "+r"(dst_u), // %2
1777 "+r"(dst_v), // %3 1777 "+r"(dst_v), // %3
1778 "+r"(pix) // %4 1778 "+r"(width) // %4
1779 : 1779 :
1780 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", 1780 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
1781 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 1781 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
1782 ); 1782 );
1783 } 1783 }
1784 1784
1785 void RGB24ToUVRow_NEON(const uint8* src_rgb24, int src_stride_rgb24, 1785 void RGB24ToUVRow_NEON(const uint8* src_rgb24, int src_stride_rgb24,
1786 uint8* dst_u, uint8* dst_v, int pix) { 1786 uint8* dst_u, uint8* dst_v, int width) {
1787 asm volatile ( 1787 asm volatile (
1788 "add %1, %0, %1 \n" // src_stride + src_rgb24 1788 "add %1, %0, %1 \n" // src_stride + src_rgb24
1789 "vmov.s16 q10, #112 / 2 \n" // UB / VR 0.875 coefficient 1789 "vmov.s16 q10, #112 / 2 \n" // UB / VR 0.875 coefficient
1790 "vmov.s16 q11, #74 / 2 \n" // UG -0.5781 coefficient 1790 "vmov.s16 q11, #74 / 2 \n" // UG -0.5781 coefficient
1791 "vmov.s16 q12, #38 / 2 \n" // UR -0.2969 coefficient 1791 "vmov.s16 q12, #38 / 2 \n" // UR -0.2969 coefficient
1792 "vmov.s16 q13, #18 / 2 \n" // VB -0.1406 coefficient 1792 "vmov.s16 q13, #18 / 2 \n" // VB -0.1406 coefficient
1793 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient 1793 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient
1794 "vmov.u16 q15, #0x8080 \n" // 128.5 1794 "vmov.u16 q15, #0x8080 \n" // 128.5
1795 "1: \n" 1795 "1: \n"
1796 MEMACCESS(0) 1796 MEMACCESS(0)
(...skipping 19 matching lines...) Expand all
1816 RGBTOUV(q0, q1, q2) 1816 RGBTOUV(q0, q1, q2)
1817 MEMACCESS(2) 1817 MEMACCESS(2)
1818 "vst1.8 {d0}, [%2]! \n" // store 8 pixels U. 1818 "vst1.8 {d0}, [%2]! \n" // store 8 pixels U.
1819 MEMACCESS(3) 1819 MEMACCESS(3)
1820 "vst1.8 {d1}, [%3]! \n" // store 8 pixels V. 1820 "vst1.8 {d1}, [%3]! \n" // store 8 pixels V.
1821 "bgt 1b \n" 1821 "bgt 1b \n"
1822 : "+r"(src_rgb24), // %0 1822 : "+r"(src_rgb24), // %0
1823 "+r"(src_stride_rgb24), // %1 1823 "+r"(src_stride_rgb24), // %1
1824 "+r"(dst_u), // %2 1824 "+r"(dst_u), // %2
1825 "+r"(dst_v), // %3 1825 "+r"(dst_v), // %3
1826 "+r"(pix) // %4 1826 "+r"(width) // %4
1827 : 1827 :
1828 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", 1828 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
1829 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 1829 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
1830 ); 1830 );
1831 } 1831 }
1832 1832
1833 void RAWToUVRow_NEON(const uint8* src_raw, int src_stride_raw, 1833 void RAWToUVRow_NEON(const uint8* src_raw, int src_stride_raw,
1834 uint8* dst_u, uint8* dst_v, int pix) { 1834 uint8* dst_u, uint8* dst_v, int width) {
1835 asm volatile ( 1835 asm volatile (
1836 "add %1, %0, %1 \n" // src_stride + src_raw 1836 "add %1, %0, %1 \n" // src_stride + src_raw
1837 "vmov.s16 q10, #112 / 2 \n" // UB / VR 0.875 coefficient 1837 "vmov.s16 q10, #112 / 2 \n" // UB / VR 0.875 coefficient
1838 "vmov.s16 q11, #74 / 2 \n" // UG -0.5781 coefficient 1838 "vmov.s16 q11, #74 / 2 \n" // UG -0.5781 coefficient
1839 "vmov.s16 q12, #38 / 2 \n" // UR -0.2969 coefficient 1839 "vmov.s16 q12, #38 / 2 \n" // UR -0.2969 coefficient
1840 "vmov.s16 q13, #18 / 2 \n" // VB -0.1406 coefficient 1840 "vmov.s16 q13, #18 / 2 \n" // VB -0.1406 coefficient
1841 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient 1841 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient
1842 "vmov.u16 q15, #0x8080 \n" // 128.5 1842 "vmov.u16 q15, #0x8080 \n" // 128.5
1843 "1: \n" 1843 "1: \n"
1844 MEMACCESS(0) 1844 MEMACCESS(0)
(...skipping 19 matching lines...) Expand all
1864 RGBTOUV(q2, q1, q0) 1864 RGBTOUV(q2, q1, q0)
1865 MEMACCESS(2) 1865 MEMACCESS(2)
1866 "vst1.8 {d0}, [%2]! \n" // store 8 pixels U. 1866 "vst1.8 {d0}, [%2]! \n" // store 8 pixels U.
1867 MEMACCESS(3) 1867 MEMACCESS(3)
1868 "vst1.8 {d1}, [%3]! \n" // store 8 pixels V. 1868 "vst1.8 {d1}, [%3]! \n" // store 8 pixels V.
1869 "bgt 1b \n" 1869 "bgt 1b \n"
1870 : "+r"(src_raw), // %0 1870 : "+r"(src_raw), // %0
1871 "+r"(src_stride_raw), // %1 1871 "+r"(src_stride_raw), // %1
1872 "+r"(dst_u), // %2 1872 "+r"(dst_u), // %2
1873 "+r"(dst_v), // %3 1873 "+r"(dst_v), // %3
1874 "+r"(pix) // %4 1874 "+r"(width) // %4
1875 : 1875 :
1876 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", 1876 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
1877 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 1877 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
1878 ); 1878 );
1879 } 1879 }
1880 1880
1881 // 16x2 pixels -> 8x1. pix is number of argb pixels. e.g. 16. 1881 // 16x2 pixels -> 8x1. width is number of argb pixels. e.g. 16.
1882 void RGB565ToUVRow_NEON(const uint8* src_rgb565, int src_stride_rgb565, 1882 void RGB565ToUVRow_NEON(const uint8* src_rgb565, int src_stride_rgb565,
1883 uint8* dst_u, uint8* dst_v, int pix) { 1883 uint8* dst_u, uint8* dst_v, int width) {
1884 asm volatile ( 1884 asm volatile (
1885 "add %1, %0, %1 \n" // src_stride + src_argb 1885 "add %1, %0, %1 \n" // src_stride + src_argb
1886 "vmov.s16 q10, #112 / 2 \n" // UB / VR 0.875 coefficient 1886 "vmov.s16 q10, #112 / 2 \n" // UB / VR 0.875 coefficient
1887 "vmov.s16 q11, #74 / 2 \n" // UG -0.5781 coefficient 1887 "vmov.s16 q11, #74 / 2 \n" // UG -0.5781 coefficient
1888 "vmov.s16 q12, #38 / 2 \n" // UR -0.2969 coefficient 1888 "vmov.s16 q12, #38 / 2 \n" // UR -0.2969 coefficient
1889 "vmov.s16 q13, #18 / 2 \n" // VB -0.1406 coefficient 1889 "vmov.s16 q13, #18 / 2 \n" // VB -0.1406 coefficient
1890 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient 1890 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient
1891 "vmov.u16 q15, #0x8080 \n" // 128.5 1891 "vmov.u16 q15, #0x8080 \n" // 128.5
1892 "1: \n" 1892 "1: \n"
1893 MEMACCESS(0) 1893 MEMACCESS(0)
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1933 "vqshrn.u16 d1, q9, #8 \n" // 16 bit to 8 bit V 1933 "vqshrn.u16 d1, q9, #8 \n" // 16 bit to 8 bit V
1934 MEMACCESS(2) 1934 MEMACCESS(2)
1935 "vst1.8 {d0}, [%2]! \n" // store 8 pixels U. 1935 "vst1.8 {d0}, [%2]! \n" // store 8 pixels U.
1936 MEMACCESS(3) 1936 MEMACCESS(3)
1937 "vst1.8 {d1}, [%3]! \n" // store 8 pixels V. 1937 "vst1.8 {d1}, [%3]! \n" // store 8 pixels V.
1938 "bgt 1b \n" 1938 "bgt 1b \n"
1939 : "+r"(src_rgb565), // %0 1939 : "+r"(src_rgb565), // %0
1940 "+r"(src_stride_rgb565), // %1 1940 "+r"(src_stride_rgb565), // %1
1941 "+r"(dst_u), // %2 1941 "+r"(dst_u), // %2
1942 "+r"(dst_v), // %3 1942 "+r"(dst_v), // %3
1943 "+r"(pix) // %4 1943 "+r"(width) // %4
1944 : 1944 :
1945 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", 1945 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
1946 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 1946 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
1947 ); 1947 );
1948 } 1948 }
1949 1949
1950 // 16x2 pixels -> 8x1. pix is number of argb pixels. e.g. 16. 1950 // 16x2 pixels -> 8x1. width is number of argb pixels. e.g. 16.
1951 void ARGB1555ToUVRow_NEON(const uint8* src_argb1555, int src_stride_argb1555, 1951 void ARGB1555ToUVRow_NEON(const uint8* src_argb1555, int src_stride_argb1555,
1952 uint8* dst_u, uint8* dst_v, int pix) { 1952 uint8* dst_u, uint8* dst_v, int width) {
1953 asm volatile ( 1953 asm volatile (
1954 "add %1, %0, %1 \n" // src_stride + src_argb 1954 "add %1, %0, %1 \n" // src_stride + src_argb
1955 "vmov.s16 q10, #112 / 2 \n" // UB / VR 0.875 coefficient 1955 "vmov.s16 q10, #112 / 2 \n" // UB / VR 0.875 coefficient
1956 "vmov.s16 q11, #74 / 2 \n" // UG -0.5781 coefficient 1956 "vmov.s16 q11, #74 / 2 \n" // UG -0.5781 coefficient
1957 "vmov.s16 q12, #38 / 2 \n" // UR -0.2969 coefficient 1957 "vmov.s16 q12, #38 / 2 \n" // UR -0.2969 coefficient
1958 "vmov.s16 q13, #18 / 2 \n" // VB -0.1406 coefficient 1958 "vmov.s16 q13, #18 / 2 \n" // VB -0.1406 coefficient
1959 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient 1959 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient
1960 "vmov.u16 q15, #0x8080 \n" // 128.5 1960 "vmov.u16 q15, #0x8080 \n" // 128.5
1961 "1: \n" 1961 "1: \n"
1962 MEMACCESS(0) 1962 MEMACCESS(0)
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
2002 "vqshrn.u16 d1, q9, #8 \n" // 16 bit to 8 bit V 2002 "vqshrn.u16 d1, q9, #8 \n" // 16 bit to 8 bit V
2003 MEMACCESS(2) 2003 MEMACCESS(2)
2004 "vst1.8 {d0}, [%2]! \n" // store 8 pixels U. 2004 "vst1.8 {d0}, [%2]! \n" // store 8 pixels U.
2005 MEMACCESS(3) 2005 MEMACCESS(3)
2006 "vst1.8 {d1}, [%3]! \n" // store 8 pixels V. 2006 "vst1.8 {d1}, [%3]! \n" // store 8 pixels V.
2007 "bgt 1b \n" 2007 "bgt 1b \n"
2008 : "+r"(src_argb1555), // %0 2008 : "+r"(src_argb1555), // %0
2009 "+r"(src_stride_argb1555), // %1 2009 "+r"(src_stride_argb1555), // %1
2010 "+r"(dst_u), // %2 2010 "+r"(dst_u), // %2
2011 "+r"(dst_v), // %3 2011 "+r"(dst_v), // %3
2012 "+r"(pix) // %4 2012 "+r"(width) // %4
2013 : 2013 :
2014 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", 2014 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2015 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 2015 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
2016 ); 2016 );
2017 } 2017 }
2018 2018
2019 // 16x2 pixels -> 8x1. pix is number of argb pixels. e.g. 16. 2019 // 16x2 pixels -> 8x1. width is number of argb pixels. e.g. 16.
2020 void ARGB4444ToUVRow_NEON(const uint8* src_argb4444, int src_stride_argb4444, 2020 void ARGB4444ToUVRow_NEON(const uint8* src_argb4444, int src_stride_argb4444,
2021 uint8* dst_u, uint8* dst_v, int pix) { 2021 uint8* dst_u, uint8* dst_v, int width) {
2022 asm volatile ( 2022 asm volatile (
2023 "add %1, %0, %1 \n" // src_stride + src_argb 2023 "add %1, %0, %1 \n" // src_stride + src_argb
2024 "vmov.s16 q10, #112 / 2 \n" // UB / VR 0.875 coefficient 2024 "vmov.s16 q10, #112 / 2 \n" // UB / VR 0.875 coefficient
2025 "vmov.s16 q11, #74 / 2 \n" // UG -0.5781 coefficient 2025 "vmov.s16 q11, #74 / 2 \n" // UG -0.5781 coefficient
2026 "vmov.s16 q12, #38 / 2 \n" // UR -0.2969 coefficient 2026 "vmov.s16 q12, #38 / 2 \n" // UR -0.2969 coefficient
2027 "vmov.s16 q13, #18 / 2 \n" // VB -0.1406 coefficient 2027 "vmov.s16 q13, #18 / 2 \n" // VB -0.1406 coefficient
2028 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient 2028 "vmov.s16 q14, #94 / 2 \n" // VG -0.7344 coefficient
2029 "vmov.u16 q15, #0x8080 \n" // 128.5 2029 "vmov.u16 q15, #0x8080 \n" // 128.5
2030 "1: \n" 2030 "1: \n"
2031 MEMACCESS(0) 2031 MEMACCESS(0)
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
2071 "vqshrn.u16 d1, q9, #8 \n" // 16 bit to 8 bit V 2071 "vqshrn.u16 d1, q9, #8 \n" // 16 bit to 8 bit V
2072 MEMACCESS(2) 2072 MEMACCESS(2)
2073 "vst1.8 {d0}, [%2]! \n" // store 8 pixels U. 2073 "vst1.8 {d0}, [%2]! \n" // store 8 pixels U.
2074 MEMACCESS(3) 2074 MEMACCESS(3)
2075 "vst1.8 {d1}, [%3]! \n" // store 8 pixels V. 2075 "vst1.8 {d1}, [%3]! \n" // store 8 pixels V.
2076 "bgt 1b \n" 2076 "bgt 1b \n"
2077 : "+r"(src_argb4444), // %0 2077 : "+r"(src_argb4444), // %0
2078 "+r"(src_stride_argb4444), // %1 2078 "+r"(src_stride_argb4444), // %1
2079 "+r"(dst_u), // %2 2079 "+r"(dst_u), // %2
2080 "+r"(dst_v), // %3 2080 "+r"(dst_v), // %3
2081 "+r"(pix) // %4 2081 "+r"(width) // %4
2082 : 2082 :
2083 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", 2083 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2084 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 2084 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
2085 ); 2085 );
2086 } 2086 }
2087 2087
2088 void RGB565ToYRow_NEON(const uint8* src_rgb565, uint8* dst_y, int pix) { 2088 void RGB565ToYRow_NEON(const uint8* src_rgb565, uint8* dst_y, int width) {
2089 asm volatile ( 2089 asm volatile (
2090 "vmov.u8 d24, #13 \n" // B * 0.1016 coefficient 2090 "vmov.u8 d24, #13 \n" // B * 0.1016 coefficient
2091 "vmov.u8 d25, #65 \n" // G * 0.5078 coefficient 2091 "vmov.u8 d25, #65 \n" // G * 0.5078 coefficient
2092 "vmov.u8 d26, #33 \n" // R * 0.2578 coefficient 2092 "vmov.u8 d26, #33 \n" // R * 0.2578 coefficient
2093 "vmov.u8 d27, #16 \n" // Add 16 constant 2093 "vmov.u8 d27, #16 \n" // Add 16 constant
2094 "1: \n" 2094 "1: \n"
2095 MEMACCESS(0) 2095 MEMACCESS(0)
2096 "vld1.8 {q0}, [%0]! \n" // load 8 RGB565 pixels. 2096 "vld1.8 {q0}, [%0]! \n" // load 8 RGB565 pixels.
2097 "subs %2, %2, #8 \n" // 8 processed per loop. 2097 "subs %2, %2, #8 \n" // 8 processed per loop.
2098 RGB565TOARGB 2098 RGB565TOARGB
2099 "vmull.u8 q2, d0, d24 \n" // B 2099 "vmull.u8 q2, d0, d24 \n" // B
2100 "vmlal.u8 q2, d1, d25 \n" // G 2100 "vmlal.u8 q2, d1, d25 \n" // G
2101 "vmlal.u8 q2, d2, d26 \n" // R 2101 "vmlal.u8 q2, d2, d26 \n" // R
2102 "vqrshrun.s16 d0, q2, #7 \n" // 16 bit to 8 bit Y 2102 "vqrshrun.s16 d0, q2, #7 \n" // 16 bit to 8 bit Y
2103 "vqadd.u8 d0, d27 \n" 2103 "vqadd.u8 d0, d27 \n"
2104 MEMACCESS(1) 2104 MEMACCESS(1)
2105 "vst1.8 {d0}, [%1]! \n" // store 8 pixels Y. 2105 "vst1.8 {d0}, [%1]! \n" // store 8 pixels Y.
2106 "bgt 1b \n" 2106 "bgt 1b \n"
2107 : "+r"(src_rgb565), // %0 2107 : "+r"(src_rgb565), // %0
2108 "+r"(dst_y), // %1 2108 "+r"(dst_y), // %1
2109 "+r"(pix) // %2 2109 "+r"(width) // %2
2110 : 2110 :
2111 : "cc", "memory", "q0", "q1", "q2", "q3", "q12", "q13" 2111 : "cc", "memory", "q0", "q1", "q2", "q3", "q12", "q13"
2112 ); 2112 );
2113 } 2113 }
2114 2114
2115 void ARGB1555ToYRow_NEON(const uint8* src_argb1555, uint8* dst_y, int pix) { 2115 void ARGB1555ToYRow_NEON(const uint8* src_argb1555, uint8* dst_y, int width) {
2116 asm volatile ( 2116 asm volatile (
2117 "vmov.u8 d24, #13 \n" // B * 0.1016 coefficient 2117 "vmov.u8 d24, #13 \n" // B * 0.1016 coefficient
2118 "vmov.u8 d25, #65 \n" // G * 0.5078 coefficient 2118 "vmov.u8 d25, #65 \n" // G * 0.5078 coefficient
2119 "vmov.u8 d26, #33 \n" // R * 0.2578 coefficient 2119 "vmov.u8 d26, #33 \n" // R * 0.2578 coefficient
2120 "vmov.u8 d27, #16 \n" // Add 16 constant 2120 "vmov.u8 d27, #16 \n" // Add 16 constant
2121 "1: \n" 2121 "1: \n"
2122 MEMACCESS(0) 2122 MEMACCESS(0)
2123 "vld1.8 {q0}, [%0]! \n" // load 8 ARGB1555 pixels. 2123 "vld1.8 {q0}, [%0]! \n" // load 8 ARGB1555 pixels.
2124 "subs %2, %2, #8 \n" // 8 processed per loop. 2124 "subs %2, %2, #8 \n" // 8 processed per loop.
2125 ARGB1555TOARGB 2125 ARGB1555TOARGB
2126 "vmull.u8 q2, d0, d24 \n" // B 2126 "vmull.u8 q2, d0, d24 \n" // B
2127 "vmlal.u8 q2, d1, d25 \n" // G 2127 "vmlal.u8 q2, d1, d25 \n" // G
2128 "vmlal.u8 q2, d2, d26 \n" // R 2128 "vmlal.u8 q2, d2, d26 \n" // R
2129 "vqrshrun.s16 d0, q2, #7 \n" // 16 bit to 8 bit Y 2129 "vqrshrun.s16 d0, q2, #7 \n" // 16 bit to 8 bit Y
2130 "vqadd.u8 d0, d27 \n" 2130 "vqadd.u8 d0, d27 \n"
2131 MEMACCESS(1) 2131 MEMACCESS(1)
2132 "vst1.8 {d0}, [%1]! \n" // store 8 pixels Y. 2132 "vst1.8 {d0}, [%1]! \n" // store 8 pixels Y.
2133 "bgt 1b \n" 2133 "bgt 1b \n"
2134 : "+r"(src_argb1555), // %0 2134 : "+r"(src_argb1555), // %0
2135 "+r"(dst_y), // %1 2135 "+r"(dst_y), // %1
2136 "+r"(pix) // %2 2136 "+r"(width) // %2
2137 : 2137 :
2138 : "cc", "memory", "q0", "q1", "q2", "q3", "q12", "q13" 2138 : "cc", "memory", "q0", "q1", "q2", "q3", "q12", "q13"
2139 ); 2139 );
2140 } 2140 }
2141 2141
2142 void ARGB4444ToYRow_NEON(const uint8* src_argb4444, uint8* dst_y, int pix) { 2142 void ARGB4444ToYRow_NEON(const uint8* src_argb4444, uint8* dst_y, int width) {
2143 asm volatile ( 2143 asm volatile (
2144 "vmov.u8 d24, #13 \n" // B * 0.1016 coefficient 2144 "vmov.u8 d24, #13 \n" // B * 0.1016 coefficient
2145 "vmov.u8 d25, #65 \n" // G * 0.5078 coefficient 2145 "vmov.u8 d25, #65 \n" // G * 0.5078 coefficient
2146 "vmov.u8 d26, #33 \n" // R * 0.2578 coefficient 2146 "vmov.u8 d26, #33 \n" // R * 0.2578 coefficient
2147 "vmov.u8 d27, #16 \n" // Add 16 constant 2147 "vmov.u8 d27, #16 \n" // Add 16 constant
2148 "1: \n" 2148 "1: \n"
2149 MEMACCESS(0) 2149 MEMACCESS(0)
2150 "vld1.8 {q0}, [%0]! \n" // load 8 ARGB4444 pixels. 2150 "vld1.8 {q0}, [%0]! \n" // load 8 ARGB4444 pixels.
2151 "subs %2, %2, #8 \n" // 8 processed per loop. 2151 "subs %2, %2, #8 \n" // 8 processed per loop.
2152 ARGB4444TOARGB 2152 ARGB4444TOARGB
2153 "vmull.u8 q2, d0, d24 \n" // B 2153 "vmull.u8 q2, d0, d24 \n" // B
2154 "vmlal.u8 q2, d1, d25 \n" // G 2154 "vmlal.u8 q2, d1, d25 \n" // G
2155 "vmlal.u8 q2, d2, d26 \n" // R 2155 "vmlal.u8 q2, d2, d26 \n" // R
2156 "vqrshrun.s16 d0, q2, #7 \n" // 16 bit to 8 bit Y 2156 "vqrshrun.s16 d0, q2, #7 \n" // 16 bit to 8 bit Y
2157 "vqadd.u8 d0, d27 \n" 2157 "vqadd.u8 d0, d27 \n"
2158 MEMACCESS(1) 2158 MEMACCESS(1)
2159 "vst1.8 {d0}, [%1]! \n" // store 8 pixels Y. 2159 "vst1.8 {d0}, [%1]! \n" // store 8 pixels Y.
2160 "bgt 1b \n" 2160 "bgt 1b \n"
2161 : "+r"(src_argb4444), // %0 2161 : "+r"(src_argb4444), // %0
2162 "+r"(dst_y), // %1 2162 "+r"(dst_y), // %1
2163 "+r"(pix) // %2 2163 "+r"(width) // %2
2164 : 2164 :
2165 : "cc", "memory", "q0", "q1", "q2", "q3", "q12", "q13" 2165 : "cc", "memory", "q0", "q1", "q2", "q3", "q12", "q13"
2166 ); 2166 );
2167 } 2167 }
2168 2168
2169 void BGRAToYRow_NEON(const uint8* src_bgra, uint8* dst_y, int pix) { 2169 void BGRAToYRow_NEON(const uint8* src_bgra, uint8* dst_y, int width) {
2170 asm volatile ( 2170 asm volatile (
2171 "vmov.u8 d4, #33 \n" // R * 0.2578 coefficient 2171 "vmov.u8 d4, #33 \n" // R * 0.2578 coefficient
2172 "vmov.u8 d5, #65 \n" // G * 0.5078 coefficient 2172 "vmov.u8 d5, #65 \n" // G * 0.5078 coefficient
2173 "vmov.u8 d6, #13 \n" // B * 0.1016 coefficient 2173 "vmov.u8 d6, #13 \n" // B * 0.1016 coefficient
2174 "vmov.u8 d7, #16 \n" // Add 16 constant 2174 "vmov.u8 d7, #16 \n" // Add 16 constant
2175 "1: \n" 2175 "1: \n"
2176 MEMACCESS(0) 2176 MEMACCESS(0)
2177 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 pixels of BGRA. 2177 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 pixels of BGRA.
2178 "subs %2, %2, #8 \n" // 8 processed per loop. 2178 "subs %2, %2, #8 \n" // 8 processed per loop.
2179 "vmull.u8 q8, d1, d4 \n" // R 2179 "vmull.u8 q8, d1, d4 \n" // R
2180 "vmlal.u8 q8, d2, d5 \n" // G 2180 "vmlal.u8 q8, d2, d5 \n" // G
2181 "vmlal.u8 q8, d3, d6 \n" // B 2181 "vmlal.u8 q8, d3, d6 \n" // B
2182 "vqrshrun.s16 d0, q8, #7 \n" // 16 bit to 8 bit Y 2182 "vqrshrun.s16 d0, q8, #7 \n" // 16 bit to 8 bit Y
2183 "vqadd.u8 d0, d7 \n" 2183 "vqadd.u8 d0, d7 \n"
2184 MEMACCESS(1) 2184 MEMACCESS(1)
2185 "vst1.8 {d0}, [%1]! \n" // store 8 pixels Y. 2185 "vst1.8 {d0}, [%1]! \n" // store 8 pixels Y.
2186 "bgt 1b \n" 2186 "bgt 1b \n"
2187 : "+r"(src_bgra), // %0 2187 : "+r"(src_bgra), // %0
2188 "+r"(dst_y), // %1 2188 "+r"(dst_y), // %1
2189 "+r"(pix) // %2 2189 "+r"(width) // %2
2190 : 2190 :
2191 : "cc", "memory", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "q8" 2191 : "cc", "memory", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "q8"
2192 ); 2192 );
2193 } 2193 }
2194 2194
2195 void ABGRToYRow_NEON(const uint8* src_abgr, uint8* dst_y, int pix) { 2195 void ABGRToYRow_NEON(const uint8* src_abgr, uint8* dst_y, int width) {
2196 asm volatile ( 2196 asm volatile (
2197 "vmov.u8 d4, #33 \n" // R * 0.2578 coefficient 2197 "vmov.u8 d4, #33 \n" // R * 0.2578 coefficient
2198 "vmov.u8 d5, #65 \n" // G * 0.5078 coefficient 2198 "vmov.u8 d5, #65 \n" // G * 0.5078 coefficient
2199 "vmov.u8 d6, #13 \n" // B * 0.1016 coefficient 2199 "vmov.u8 d6, #13 \n" // B * 0.1016 coefficient
2200 "vmov.u8 d7, #16 \n" // Add 16 constant 2200 "vmov.u8 d7, #16 \n" // Add 16 constant
2201 "1: \n" 2201 "1: \n"
2202 MEMACCESS(0) 2202 MEMACCESS(0)
2203 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 pixels of ABGR. 2203 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 pixels of ABGR.
2204 "subs %2, %2, #8 \n" // 8 processed per loop. 2204 "subs %2, %2, #8 \n" // 8 processed per loop.
2205 "vmull.u8 q8, d0, d4 \n" // R 2205 "vmull.u8 q8, d0, d4 \n" // R
2206 "vmlal.u8 q8, d1, d5 \n" // G 2206 "vmlal.u8 q8, d1, d5 \n" // G
2207 "vmlal.u8 q8, d2, d6 \n" // B 2207 "vmlal.u8 q8, d2, d6 \n" // B
2208 "vqrshrun.s16 d0, q8, #7 \n" // 16 bit to 8 bit Y 2208 "vqrshrun.s16 d0, q8, #7 \n" // 16 bit to 8 bit Y
2209 "vqadd.u8 d0, d7 \n" 2209 "vqadd.u8 d0, d7 \n"
2210 MEMACCESS(1) 2210 MEMACCESS(1)
2211 "vst1.8 {d0}, [%1]! \n" // store 8 pixels Y. 2211 "vst1.8 {d0}, [%1]! \n" // store 8 pixels Y.
2212 "bgt 1b \n" 2212 "bgt 1b \n"
2213 : "+r"(src_abgr), // %0 2213 : "+r"(src_abgr), // %0
2214 "+r"(dst_y), // %1 2214 "+r"(dst_y), // %1
2215 "+r"(pix) // %2 2215 "+r"(width) // %2
2216 : 2216 :
2217 : "cc", "memory", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "q8" 2217 : "cc", "memory", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "q8"
2218 ); 2218 );
2219 } 2219 }
2220 2220
2221 void RGBAToYRow_NEON(const uint8* src_rgba, uint8* dst_y, int pix) { 2221 void RGBAToYRow_NEON(const uint8* src_rgba, uint8* dst_y, int width) {
2222 asm volatile ( 2222 asm volatile (
2223 "vmov.u8 d4, #13 \n" // B * 0.1016 coefficient 2223 "vmov.u8 d4, #13 \n" // B * 0.1016 coefficient
2224 "vmov.u8 d5, #65 \n" // G * 0.5078 coefficient 2224 "vmov.u8 d5, #65 \n" // G * 0.5078 coefficient
2225 "vmov.u8 d6, #33 \n" // R * 0.2578 coefficient 2225 "vmov.u8 d6, #33 \n" // R * 0.2578 coefficient
2226 "vmov.u8 d7, #16 \n" // Add 16 constant 2226 "vmov.u8 d7, #16 \n" // Add 16 constant
2227 "1: \n" 2227 "1: \n"
2228 MEMACCESS(0) 2228 MEMACCESS(0)
2229 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 pixels of RGBA. 2229 "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 pixels of RGBA.
2230 "subs %2, %2, #8 \n" // 8 processed per loop. 2230 "subs %2, %2, #8 \n" // 8 processed per loop.
2231 "vmull.u8 q8, d1, d4 \n" // B 2231 "vmull.u8 q8, d1, d4 \n" // B
2232 "vmlal.u8 q8, d2, d5 \n" // G 2232 "vmlal.u8 q8, d2, d5 \n" // G
2233 "vmlal.u8 q8, d3, d6 \n" // R 2233 "vmlal.u8 q8, d3, d6 \n" // R
2234 "vqrshrun.s16 d0, q8, #7 \n" // 16 bit to 8 bit Y 2234 "vqrshrun.s16 d0, q8, #7 \n" // 16 bit to 8 bit Y
2235 "vqadd.u8 d0, d7 \n" 2235 "vqadd.u8 d0, d7 \n"
2236 MEMACCESS(1) 2236 MEMACCESS(1)
2237 "vst1.8 {d0}, [%1]! \n" // store 8 pixels Y. 2237 "vst1.8 {d0}, [%1]! \n" // store 8 pixels Y.
2238 "bgt 1b \n" 2238 "bgt 1b \n"
2239 : "+r"(src_rgba), // %0 2239 : "+r"(src_rgba), // %0
2240 "+r"(dst_y), // %1 2240 "+r"(dst_y), // %1
2241 "+r"(pix) // %2 2241 "+r"(width) // %2
2242 : 2242 :
2243 : "cc", "memory", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "q8" 2243 : "cc", "memory", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "q8"
2244 ); 2244 );
2245 } 2245 }
2246 2246
2247 void RGB24ToYRow_NEON(const uint8* src_rgb24, uint8* dst_y, int pix) { 2247 void RGB24ToYRow_NEON(const uint8* src_rgb24, uint8* dst_y, int width) {
2248 asm volatile ( 2248 asm volatile (
2249 "vmov.u8 d4, #13 \n" // B * 0.1016 coefficient 2249 "vmov.u8 d4, #13 \n" // B * 0.1016 coefficient
2250 "vmov.u8 d5, #65 \n" // G * 0.5078 coefficient 2250 "vmov.u8 d5, #65 \n" // G * 0.5078 coefficient
2251 "vmov.u8 d6, #33 \n" // R * 0.2578 coefficient 2251 "vmov.u8 d6, #33 \n" // R * 0.2578 coefficient
2252 "vmov.u8 d7, #16 \n" // Add 16 constant 2252 "vmov.u8 d7, #16 \n" // Add 16 constant
2253 "1: \n" 2253 "1: \n"
2254 MEMACCESS(0) 2254 MEMACCESS(0)
2255 "vld3.8 {d0, d1, d2}, [%0]! \n" // load 8 pixels of RGB24. 2255 "vld3.8 {d0, d1, d2}, [%0]! \n" // load 8 pixels of RGB24.
2256 "subs %2, %2, #8 \n" // 8 processed per loop. 2256 "subs %2, %2, #8 \n" // 8 processed per loop.
2257 "vmull.u8 q8, d0, d4 \n" // B 2257 "vmull.u8 q8, d0, d4 \n" // B
2258 "vmlal.u8 q8, d1, d5 \n" // G 2258 "vmlal.u8 q8, d1, d5 \n" // G
2259 "vmlal.u8 q8, d2, d6 \n" // R 2259 "vmlal.u8 q8, d2, d6 \n" // R
2260 "vqrshrun.s16 d0, q8, #7 \n" // 16 bit to 8 bit Y 2260 "vqrshrun.s16 d0, q8, #7 \n" // 16 bit to 8 bit Y
2261 "vqadd.u8 d0, d7 \n" 2261 "vqadd.u8 d0, d7 \n"
2262 MEMACCESS(1) 2262 MEMACCESS(1)
2263 "vst1.8 {d0}, [%1]! \n" // store 8 pixels Y. 2263 "vst1.8 {d0}, [%1]! \n" // store 8 pixels Y.
2264 "bgt 1b \n" 2264 "bgt 1b \n"
2265 : "+r"(src_rgb24), // %0 2265 : "+r"(src_rgb24), // %0
2266 "+r"(dst_y), // %1 2266 "+r"(dst_y), // %1
2267 "+r"(pix) // %2 2267 "+r"(width) // %2
2268 : 2268 :
2269 : "cc", "memory", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "q8" 2269 : "cc", "memory", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "q8"
2270 ); 2270 );
2271 } 2271 }
2272 2272
2273 void RAWToYRow_NEON(const uint8* src_raw, uint8* dst_y, int pix) { 2273 void RAWToYRow_NEON(const uint8* src_raw, uint8* dst_y, int width) {
2274 asm volatile ( 2274 asm volatile (
2275 "vmov.u8 d4, #33 \n" // R * 0.2578 coefficient 2275 "vmov.u8 d4, #33 \n" // R * 0.2578 coefficient
2276 "vmov.u8 d5, #65 \n" // G * 0.5078 coefficient 2276 "vmov.u8 d5, #65 \n" // G * 0.5078 coefficient
2277 "vmov.u8 d6, #13 \n" // B * 0.1016 coefficient 2277 "vmov.u8 d6, #13 \n" // B * 0.1016 coefficient
2278 "vmov.u8 d7, #16 \n" // Add 16 constant 2278 "vmov.u8 d7, #16 \n" // Add 16 constant
2279 "1: \n" 2279 "1: \n"
2280 MEMACCESS(0) 2280 MEMACCESS(0)
2281 "vld3.8 {d0, d1, d2}, [%0]! \n" // load 8 pixels of RAW. 2281 "vld3.8 {d0, d1, d2}, [%0]! \n" // load 8 pixels of RAW.
2282 "subs %2, %2, #8 \n" // 8 processed per loop. 2282 "subs %2, %2, #8 \n" // 8 processed per loop.
2283 "vmull.u8 q8, d0, d4 \n" // B 2283 "vmull.u8 q8, d0, d4 \n" // B
2284 "vmlal.u8 q8, d1, d5 \n" // G 2284 "vmlal.u8 q8, d1, d5 \n" // G
2285 "vmlal.u8 q8, d2, d6 \n" // R 2285 "vmlal.u8 q8, d2, d6 \n" // R
2286 "vqrshrun.s16 d0, q8, #7 \n" // 16 bit to 8 bit Y 2286 "vqrshrun.s16 d0, q8, #7 \n" // 16 bit to 8 bit Y
2287 "vqadd.u8 d0, d7 \n" 2287 "vqadd.u8 d0, d7 \n"
2288 MEMACCESS(1) 2288 MEMACCESS(1)
2289 "vst1.8 {d0}, [%1]! \n" // store 8 pixels Y. 2289 "vst1.8 {d0}, [%1]! \n" // store 8 pixels Y.
2290 "bgt 1b \n" 2290 "bgt 1b \n"
2291 : "+r"(src_raw), // %0 2291 : "+r"(src_raw), // %0
2292 "+r"(dst_y), // %1 2292 "+r"(dst_y), // %1
2293 "+r"(pix) // %2 2293 "+r"(width) // %2
2294 : 2294 :
2295 : "cc", "memory", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "q8" 2295 : "cc", "memory", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "q8"
2296 ); 2296 );
2297 } 2297 }
2298 2298
2299 // Bilinear filter 16x2 -> 16x1 2299 // Bilinear filter 16x2 -> 16x1
2300 void InterpolateRow_NEON(uint8* dst_ptr, 2300 void InterpolateRow_NEON(uint8* dst_ptr,
2301 const uint8* src_ptr, ptrdiff_t src_stride, 2301 const uint8* src_ptr, ptrdiff_t src_stride,
2302 int dst_width, int source_y_fraction) { 2302 int dst_width, int source_y_fraction) {
2303 asm volatile ( 2303 asm volatile (
(...skipping 647 matching lines...) Expand 10 before | Expand all | Expand 10 after
2951 "r"(6) // %5 2951 "r"(6) // %5
2952 : "cc", "memory", "q0", "q1" // Clobber List 2952 : "cc", "memory", "q0", "q1" // Clobber List
2953 ); 2953 );
2954 } 2954 }
2955 #endif // defined(__ARM_NEON__) && !defined(__aarch64__) 2955 #endif // defined(__ARM_NEON__) && !defined(__aarch64__)
2956 2956
2957 #ifdef __cplusplus 2957 #ifdef __cplusplus
2958 } // extern "C" 2958 } // extern "C"
2959 } // namespace libyuv 2959 } // namespace libyuv
2960 #endif 2960 #endif
OLDNEW
« no previous file with comments | « source/row_gcc.cc ('k') | source/row_neon64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698