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

Side by Side Diff: source/row_neon.cc

Issue 1337973002: neon yuv matrix function (Closed) Base URL: https://chromium.googlesource.com/libyuv/libyuv@master
Patch Set: Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « source/row_common.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2011 The LibYuv Project Authors. All rights reserved. 2 * Copyright 2011 The LibYuv Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 #define UB -128 /* -min(128, round(2.018 * 64)) */ 143 #define UB -128 /* -min(128, round(2.018 * 64)) */
144 #define UG 25 /* -round(-0.391 * 64) */ 144 #define UG 25 /* -round(-0.391 * 64) */
145 #define VG 52 /* -round(-0.813 * 64) */ 145 #define VG 52 /* -round(-0.813 * 64) */
146 #define VR -102 /* -round(1.596 * 64) */ 146 #define VR -102 /* -round(1.596 * 64) */
147 147
148 // Bias values to subtract 16 from Y and 128 from U and V. 148 // Bias values to subtract 16 from Y and 128 from U and V.
149 #define BB (UB * 128 - YGB) 149 #define BB (UB * 128 - YGB)
150 #define BG (UG * 128 + VG * 128 - YGB) 150 #define BG (UG * 128 + VG * 128 - YGB)
151 #define BR (VR * 128 - YGB) 151 #define BR (VR * 128 - YGB)
152 152
153 YuvConstantsNEON SIMD_ALIGNED(kYuvConstantsNEON) = {
154 { 128, 128, 128, 128, 102, 102, 102, 102, 0, 0, 0, 0, 0, 0, 0, 0 },
155 { 25, 25, 25, 25, 52, 52, 52, 52, 0, 0, 0, 0, 0, 0, 0, 0 },
156 { BB, BG, BR, 0, 0, 0, 0, 0 },
157 { 0x0101 * YG, 0, 0, 0 }
158 };
159
153 static uvec8 kUVToRB = { 128, 128, 128, 128, 102, 102, 102, 102, 160 static uvec8 kUVToRB = { 128, 128, 128, 128, 102, 102, 102, 102,
154 0, 0, 0, 0, 0, 0, 0, 0 }; 161 0, 0, 0, 0, 0, 0, 0, 0 };
155 static uvec8 kUVToG = { 25, 25, 25, 25, 52, 52, 52, 52, 162 static uvec8 kUVToG = { 25, 25, 25, 25, 52, 52, 52, 52,
156 0, 0, 0, 0, 0, 0, 0, 0 }; 163 0, 0, 0, 0, 0, 0, 0, 0 };
157 static vec16 kUVBiasBGR = { BB, BG, BR, 0, 0, 0, 0, 0 }; 164 static vec16 kUVBiasBGR = { BB, BG, BR, 0, 0, 0, 0, 0 };
158 static vec32 kYToRgb = { 0x0101 * YG, 0, 0, 0 }; 165 static vec32 kYToRgb = { 0x0101 * YG, 0, 0, 0 };
159 166
160 #undef YG 167 #undef YG
161 #undef YGB 168 #undef YGB
162 #undef UB 169 #undef UB
(...skipping 26 matching lines...) Expand all
189 "+r"(width) // %4 196 "+r"(width) // %4
190 : [kUVToRB]"r"(&kUVToRB), // %5 197 : [kUVToRB]"r"(&kUVToRB), // %5
191 [kUVToG]"r"(&kUVToG), // %6 198 [kUVToG]"r"(&kUVToG), // %6
192 [kUVBiasBGR]"r"(&kUVBiasBGR), 199 [kUVBiasBGR]"r"(&kUVBiasBGR),
193 [kYToRgb]"r"(&kYToRgb) 200 [kYToRgb]"r"(&kYToRgb)
194 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", 201 : "cc", "memory", "q0", "q1", "q2", "q3", "q4",
195 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 202 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
196 ); 203 );
197 } 204 }
198 205
199 void I422ToARGBRow_NEON(const uint8* src_y, 206 void I422ToARGBMatrixRow_NEON(const uint8* src_y,
200 const uint8* src_u, 207 const uint8* src_u,
201 const uint8* src_v, 208 const uint8* src_v,
202 uint8* dst_argb, 209 uint8* dst_argb,
203 int width) { 210 struct YuvConstantsNEON* YuvConstants,
211 int width) {
204 asm volatile ( 212 asm volatile (
205 YUV422TORGB_SETUP_REG 213 YUV422TORGB_SETUP_REG
206 "1: \n" 214 "1: \n"
207 READYUV422 215 READYUV422
208 YUV422TORGB 216 YUV422TORGB
209 "subs %4, %4, #8 \n" 217 "subs %4, %4, #8 \n"
210 "vmov.u8 d23, #255 \n" 218 "vmov.u8 d23, #255 \n"
211 MEMACCESS(3) 219 MEMACCESS(3)
212 "vst4.8 {d20, d21, d22, d23}, [%3]! \n" 220 "vst4.8 {d20, d21, d22, d23}, [%3]! \n"
213 "bgt 1b \n" 221 "bgt 1b \n"
214 : "+r"(src_y), // %0 222 : "+r"(src_y), // %0
215 "+r"(src_u), // %1 223 "+r"(src_u), // %1
216 "+r"(src_v), // %2 224 "+r"(src_v), // %2
217 "+r"(dst_argb), // %3 225 "+r"(dst_argb), // %3
218 "+r"(width) // %4 226 "+r"(width) // %4
219 : [kUVToRB]"r"(&kUVToRB), // %5 227 : [kUVToRB]"r"(&YuvConstants->kUVToRB), // %5
220 [kUVToG]"r"(&kUVToG), // %6 228 [kUVToG]"r"(&YuvConstants->kUVToG), // %6
221 [kUVBiasBGR]"r"(&kUVBiasBGR), 229 [kUVBiasBGR]"r"(&YuvConstants->kUVBiasBGR),
222 [kYToRgb]"r"(&kYToRgb) 230 [kYToRgb]"r"(&YuvConstants->kYToRgb)
223 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", 231 : "cc", "memory", "q0", "q1", "q2", "q3", "q4",
224 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 232 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
225 ); 233 );
226 } 234 }
227 235
228 void I411ToARGBRow_NEON(const uint8* src_y, 236 void I411ToARGBRow_NEON(const uint8* src_y,
229 const uint8* src_u, 237 const uint8* src_u,
230 const uint8* src_v, 238 const uint8* src_v,
231 uint8* dst_argb, 239 uint8* dst_argb,
232 int width) { 240 int width) {
(...skipping 2762 matching lines...) Expand 10 before | Expand all | Expand 10 after
2995 "r"(6) // %5 3003 "r"(6) // %5
2996 : "cc", "memory", "q0", "q1" // Clobber List 3004 : "cc", "memory", "q0", "q1" // Clobber List
2997 ); 3005 );
2998 } 3006 }
2999 #endif // defined(__ARM_NEON__) && !defined(__aarch64__) 3007 #endif // defined(__ARM_NEON__) && !defined(__aarch64__)
3000 3008
3001 #ifdef __cplusplus 3009 #ifdef __cplusplus
3002 } // extern "C" 3010 } // extern "C"
3003 } // namespace libyuv 3011 } // namespace libyuv
3004 #endif 3012 #endif
OLDNEW
« no previous file with comments | « source/row_common.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698