OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |