| 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 |