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

Side by Side Diff: source/row_neon64.cc

Issue 1384323002: Pass yuvconstants to YUV conversions for neon 64 bit (Closed) Base URL: https://chromium.googlesource.com/libyuv/libyuv@master
Patch Set: bump version Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « source/row_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 2014 The LibYuv Project Authors. All rights reserved. 2 * Copyright 2014 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 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 84
85 // Read 8 UYVY 85 // Read 8 UYVY
86 #define READUYVY \ 86 #define READUYVY \
87 MEMACCESS(0) \ 87 MEMACCESS(0) \
88 "ld2 {v2.8b, v3.8b}, [%0], #16 \n" \ 88 "ld2 {v2.8b, v3.8b}, [%0], #16 \n" \
89 "orr v0.8b, v3.8b, v3.8b \n" \ 89 "orr v0.8b, v3.8b, v3.8b \n" \
90 "uzp1 v1.8b, v2.8b, v2.8b \n" \ 90 "uzp1 v1.8b, v2.8b, v2.8b \n" \
91 "uzp2 v3.8b, v2.8b, v2.8b \n" \ 91 "uzp2 v3.8b, v2.8b, v2.8b \n" \
92 "ins v1.s[1], v3.s[0] \n" 92 "ins v1.s[1], v3.s[0] \n"
93 93
94 // TODO(fbarchard): replace movi with constants from struct.
95 #define YUVTORGB_SETUP \ 94 #define YUVTORGB_SETUP \
96 "ld1r {v24.8h}, [%[kUVBiasBGR]], #2 \n" \ 95 "ld1r {v24.8h}, [%[kUVBiasBGR]], #2 \n" \
97 "ld1r {v25.8h}, [%[kUVBiasBGR]], #2 \n" \ 96 "ld1r {v25.8h}, [%[kUVBiasBGR]], #2 \n" \
98 "ld1r {v26.8h}, [%[kUVBiasBGR]] \n" \ 97 "ld1r {v26.8h}, [%[kUVBiasBGR]] \n" \
99 "ld1r {v31.4s}, [%[kYToRgb]] \n" \ 98 "ld1r {v31.4s}, [%[kYToRgb]] \n" \
100 "movi v27.8h, #128 \n" \ 99 "ld1 {v27.8h, v28.8h}, [%[kUVToRB]] \n" \
101 "movi v28.8h, #102 \n" \ 100 "ld1 {v29.8h, v30.8h}, [%[kUVToG]] \n"
102 "movi v29.8h, #25 \n" \
103 "movi v30.8h, #52 \n"
104 101
105 #define YUVTORGB(vR, vG, vB) \ 102 #define YUVTORGB(vR, vG, vB) \
106 "uxtl v0.8h, v0.8b \n" /* Extract Y */ \ 103 "uxtl v0.8h, v0.8b \n" /* Extract Y */ \
107 "shll v2.8h, v1.8b, #8 \n" /* Replicate UV */ \ 104 "shll v2.8h, v1.8b, #8 \n" /* Replicate UV */ \
108 "ushll2 v3.4s, v0.8h, #0 \n" /* Y */ \ 105 "ushll2 v3.4s, v0.8h, #0 \n" /* Y */ \
109 "ushll v0.4s, v0.4h, #0 \n" \ 106 "ushll v0.4s, v0.4h, #0 \n" \
110 "mul v3.4s, v3.4s, v31.4s \n" \ 107 "mul v3.4s, v3.4s, v31.4s \n" \
111 "mul v0.4s, v0.4s, v31.4s \n" \ 108 "mul v0.4s, v0.4s, v31.4s \n" \
112 "sqshrun v0.4h, v0.4s, #16 \n" \ 109 "sqshrun v0.4h, v0.4s, #16 \n" \
113 "sqshrun2 v0.8h, v3.4s, #16 \n" /* Y */ \ 110 "sqshrun2 v0.8h, v3.4s, #16 \n" /* Y */ \
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 "subs %w4, %w4, #8 \n" 151 "subs %w4, %w4, #8 \n"
155 "movi v23.8b, #255 \n" /* A */ 152 "movi v23.8b, #255 \n" /* A */
156 MEMACCESS(3) 153 MEMACCESS(3)
157 "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%3], #32 \n" 154 "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%3], #32 \n"
158 "b.gt 1b \n" 155 "b.gt 1b \n"
159 : "+r"(src_y), // %0 156 : "+r"(src_y), // %0
160 "+r"(src_u), // %1 157 "+r"(src_u), // %1
161 "+r"(src_v), // %2 158 "+r"(src_v), // %2
162 "+r"(dst_argb), // %3 159 "+r"(dst_argb), // %3
163 "+r"(width) // %4 160 "+r"(width) // %4
164 : [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), 161 : [kUVToRB]"r"(&yuvconstants->kUVToRB),
162 [kUVToG]"r"(&yuvconstants->kUVToG),
163 [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR),
165 [kYToRgb]"r"(&yuvconstants->kYToRgb) 164 [kYToRgb]"r"(&yuvconstants->kYToRgb)
166 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", 165 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20",
167 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" 166 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30"
168 ); 167 );
169 } 168 }
170 #endif // HAS_I444TOARGBROW_NEON 169 #endif // HAS_I444TOARGBROW_NEON
171 170
172 // TODO(fbarchard): Switch to Matrix version of this function. 171 // TODO(fbarchard): Switch to Matrix version of this function.
173 #ifdef HAS_I422TOARGBROW_NEON 172 #ifdef HAS_I422TOARGBROW_NEON
174 void I422ToARGBRow_NEON(const uint8* src_y, 173 void I422ToARGBRow_NEON(const uint8* src_y,
(...skipping 10 matching lines...) Expand all
185 "subs %w4, %w4, #8 \n" 184 "subs %w4, %w4, #8 \n"
186 "movi v23.8b, #255 \n" /* A */ 185 "movi v23.8b, #255 \n" /* A */
187 MEMACCESS(3) 186 MEMACCESS(3)
188 "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%3], #32 \n" 187 "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%3], #32 \n"
189 "b.gt 1b \n" 188 "b.gt 1b \n"
190 : "+r"(src_y), // %0 189 : "+r"(src_y), // %0
191 "+r"(src_u), // %1 190 "+r"(src_u), // %1
192 "+r"(src_v), // %2 191 "+r"(src_v), // %2
193 "+r"(dst_argb), // %3 192 "+r"(dst_argb), // %3
194 "+r"(width) // %4 193 "+r"(width) // %4
195 : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), 194 : [kUVToRB]"r"(&yuvconstants->kUVToRB),
196 [kYToRgb]"r"(&kYuvConstants.kYToRgb) 195 [kUVToG]"r"(&yuvconstants->kUVToG),
196 [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR),
197 [kYToRgb]"r"(&yuvconstants->kYToRgb)
197 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", 198 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20",
198 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" 199 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30"
199 ); 200 );
200 } 201 }
201 #endif // HAS_I422TOARGBROW_NEON 202 #endif // HAS_I422TOARGBROW_NEON
202 203
203 #ifdef HAS_I411TOARGBROW_NEON 204 #ifdef HAS_I411TOARGBROW_NEON
204 void I411ToARGBRow_NEON(const uint8* src_y, 205 void I411ToARGBRow_NEON(const uint8* src_y,
205 const uint8* src_u, 206 const uint8* src_u,
206 const uint8* src_v, 207 const uint8* src_v,
207 uint8* dst_argb, 208 uint8* dst_argb,
208 struct YuvConstants* yuvconstants, 209 struct YuvConstants* yuvconstants,
209 int width) { 210 int width) {
210 asm volatile ( 211 asm volatile (
211 YUVTORGB_SETUP 212 YUVTORGB_SETUP
212 "1: \n" 213 "1: \n"
213 READYUV411 214 READYUV411
214 YUVTORGB(v22, v21, v20) 215 YUVTORGB(v22, v21, v20)
215 "subs %w4, %w4, #8 \n" 216 "subs %w4, %w4, #8 \n"
216 "movi v23.8b, #255 \n" /* A */ 217 "movi v23.8b, #255 \n" /* A */
217 MEMACCESS(3) 218 MEMACCESS(3)
218 "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%3], #32 \n" 219 "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%3], #32 \n"
219 "b.gt 1b \n" 220 "b.gt 1b \n"
220 : "+r"(src_y), // %0 221 : "+r"(src_y), // %0
221 "+r"(src_u), // %1 222 "+r"(src_u), // %1
222 "+r"(src_v), // %2 223 "+r"(src_v), // %2
223 "+r"(dst_argb), // %3 224 "+r"(dst_argb), // %3
224 "+r"(width) // %4 225 "+r"(width) // %4
225 : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), 226 : [kUVToRB]"r"(&yuvconstants->kUVToRB),
226 [kYToRgb]"r"(&kYuvConstants.kYToRgb) 227 [kUVToG]"r"(&yuvconstants->kUVToG),
228 [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR),
229 [kYToRgb]"r"(&yuvconstants->kYToRgb)
227 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", 230 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20",
228 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" 231 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30"
229 ); 232 );
230 } 233 }
231 #endif // HAS_I411TOARGBROW_NEON 234 #endif // HAS_I411TOARGBROW_NEON
232 235
233 #ifdef HAS_I422TOBGRAROW_NEON 236 #ifdef HAS_I422TOBGRAROW_NEON
234 void I422ToBGRARow_NEON(const uint8* src_y, 237 void I422ToBGRARow_NEON(const uint8* src_y,
235 const uint8* src_u, 238 const uint8* src_u,
236 const uint8* src_v, 239 const uint8* src_v,
237 uint8* dst_bgra, 240 uint8* dst_bgra,
238 struct YuvConstants* yuvconstants, 241 struct YuvConstants* yuvconstants,
239 int width) { 242 int width) {
240 asm volatile ( 243 asm volatile (
241 YUVTORGB_SETUP 244 YUVTORGB_SETUP
242 "1: \n" 245 "1: \n"
243 READYUV422 246 READYUV422
244 YUVTORGB(v21, v22, v23) 247 YUVTORGB(v21, v22, v23)
245 "subs %w4, %w4, #8 \n" 248 "subs %w4, %w4, #8 \n"
246 "movi v20.8b, #255 \n" /* A */ 249 "movi v20.8b, #255 \n" /* A */
247 MEMACCESS(3) 250 MEMACCESS(3)
248 "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%3], #32 \n" 251 "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%3], #32 \n"
249 "b.gt 1b \n" 252 "b.gt 1b \n"
250 : "+r"(src_y), // %0 253 : "+r"(src_y), // %0
251 "+r"(src_u), // %1 254 "+r"(src_u), // %1
252 "+r"(src_v), // %2 255 "+r"(src_v), // %2
253 "+r"(dst_bgra), // %3 256 "+r"(dst_bgra), // %3
254 "+r"(width) // %4 257 "+r"(width) // %4
255 : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), 258 : [kUVToRB]"r"(&yuvconstants->kUVToRB),
256 [kYToRgb]"r"(&kYuvConstants.kYToRgb) 259 [kUVToG]"r"(&yuvconstants->kUVToG),
260 [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR),
261 [kYToRgb]"r"(&yuvconstants->kYToRgb)
257 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", 262 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20",
258 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" 263 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30"
259 ); 264 );
260 } 265 }
261 #endif // HAS_I422TOBGRAROW_NEON 266 #endif // HAS_I422TOBGRAROW_NEON
262 267
263 // TODO(fbarchard): Switch to Matrix version of this function. 268 // TODO(fbarchard): Switch to Matrix version of this function.
264 #ifdef HAS_I422TOABGRROW_NEON 269 #ifdef HAS_I422TOABGRROW_NEON
265 void I422ToABGRRow_NEON(const uint8* src_y, 270 void I422ToABGRRow_NEON(const uint8* src_y,
266 const uint8* src_u, 271 const uint8* src_u,
267 const uint8* src_v, 272 const uint8* src_v,
268 uint8* dst_abgr, 273 uint8* dst_abgr,
269 struct YuvConstants* yuvconstants, 274 struct YuvConstants* yuvconstants,
270 int width) { 275 int width) {
271 asm volatile ( 276 asm volatile (
272 YUVTORGB_SETUP 277 YUVTORGB_SETUP
273 "1: \n" 278 "1: \n"
274 READYUV422 279 READYUV422
275 YUVTORGB(v20, v21, v22) 280 YUVTORGB(v20, v21, v22)
276 "subs %w4, %w4, #8 \n" 281 "subs %w4, %w4, #8 \n"
277 "movi v23.8b, #255 \n" /* A */ 282 "movi v23.8b, #255 \n" /* A */
278 MEMACCESS(3) 283 MEMACCESS(3)
279 "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%3], #32 \n" 284 "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%3], #32 \n"
280 "b.gt 1b \n" 285 "b.gt 1b \n"
281 : "+r"(src_y), // %0 286 : "+r"(src_y), // %0
282 "+r"(src_u), // %1 287 "+r"(src_u), // %1
283 "+r"(src_v), // %2 288 "+r"(src_v), // %2
284 "+r"(dst_abgr), // %3 289 "+r"(dst_abgr), // %3
285 "+r"(width) // %4 290 "+r"(width) // %4
286 : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), 291 : [kUVToRB]"r"(&yuvconstants->kUVToRB),
287 [kYToRgb]"r"(&kYuvConstants.kYToRgb) 292 [kUVToG]"r"(&yuvconstants->kUVToG),
293 [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR),
294 [kYToRgb]"r"(&yuvconstants->kYToRgb)
288 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", 295 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20",
289 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" 296 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30"
290 ); 297 );
291 } 298 }
292 #endif // HAS_I422TOABGRROW_NEON 299 #endif // HAS_I422TOABGRROW_NEON
293 300
294 #ifdef HAS_I422TORGBAROW_NEON 301 #ifdef HAS_I422TORGBAROW_NEON
295 void I422ToRGBARow_NEON(const uint8* src_y, 302 void I422ToRGBARow_NEON(const uint8* src_y,
296 const uint8* src_u, 303 const uint8* src_u,
297 const uint8* src_v, 304 const uint8* src_v,
298 uint8* dst_rgba, 305 uint8* dst_rgba,
299 struct YuvConstants* yuvconstants, 306 struct YuvConstants* yuvconstants,
300 int width) { 307 int width) {
301 asm volatile ( 308 asm volatile (
302 YUVTORGB_SETUP 309 YUVTORGB_SETUP
303 "1: \n" 310 "1: \n"
304 READYUV422 311 READYUV422
305 YUVTORGB(v23, v22, v21) 312 YUVTORGB(v23, v22, v21)
306 "subs %w4, %w4, #8 \n" 313 "subs %w4, %w4, #8 \n"
307 "movi v20.8b, #255 \n" /* A */ 314 "movi v20.8b, #255 \n" /* A */
308 MEMACCESS(3) 315 MEMACCESS(3)
309 "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%3], #32 \n" 316 "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%3], #32 \n"
310 "b.gt 1b \n" 317 "b.gt 1b \n"
311 : "+r"(src_y), // %0 318 : "+r"(src_y), // %0
312 "+r"(src_u), // %1 319 "+r"(src_u), // %1
313 "+r"(src_v), // %2 320 "+r"(src_v), // %2
314 "+r"(dst_rgba), // %3 321 "+r"(dst_rgba), // %3
315 "+r"(width) // %4 322 "+r"(width) // %4
316 : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), 323 : [kUVToRB]"r"(&yuvconstants->kUVToRB),
317 [kYToRgb]"r"(&kYuvConstants.kYToRgb) 324 [kUVToG]"r"(&yuvconstants->kUVToG),
325 [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR),
326 [kYToRgb]"r"(&yuvconstants->kYToRgb)
318 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", 327 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20",
319 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" 328 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30"
320 ); 329 );
321 } 330 }
322 #endif // HAS_I422TORGBAROW_NEON 331 #endif // HAS_I422TORGBAROW_NEON
323 332
324 #ifdef HAS_I422TORGB24ROW_NEON 333 #ifdef HAS_I422TORGB24ROW_NEON
325 void I422ToRGB24Row_NEON(const uint8* src_y, 334 void I422ToRGB24Row_NEON(const uint8* src_y,
326 const uint8* src_u, 335 const uint8* src_u,
327 const uint8* src_v, 336 const uint8* src_v,
328 uint8* dst_rgb24, 337 uint8* dst_rgb24,
329 struct YuvConstants* yuvconstants, 338 struct YuvConstants* yuvconstants,
330 int width) { 339 int width) {
331 asm volatile ( 340 asm volatile (
332 YUVTORGB_SETUP 341 YUVTORGB_SETUP
333 "1: \n" 342 "1: \n"
334 READYUV422 343 READYUV422
335 YUVTORGB(v22, v21, v20) 344 YUVTORGB(v22, v21, v20)
336 "subs %w4, %w4, #8 \n" 345 "subs %w4, %w4, #8 \n"
337 MEMACCESS(3) 346 MEMACCESS(3)
338 "st3 {v20.8b,v21.8b,v22.8b}, [%3], #24 \n" 347 "st3 {v20.8b,v21.8b,v22.8b}, [%3], #24 \n"
339 "b.gt 1b \n" 348 "b.gt 1b \n"
340 : "+r"(src_y), // %0 349 : "+r"(src_y), // %0
341 "+r"(src_u), // %1 350 "+r"(src_u), // %1
342 "+r"(src_v), // %2 351 "+r"(src_v), // %2
343 "+r"(dst_rgb24), // %3 352 "+r"(dst_rgb24), // %3
344 "+r"(width) // %4 353 "+r"(width) // %4
345 : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), 354 : [kUVToRB]"r"(&yuvconstants->kUVToRB),
346 [kYToRgb]"r"(&kYuvConstants.kYToRgb) 355 [kUVToG]"r"(&yuvconstants->kUVToG),
356 [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR),
357 [kYToRgb]"r"(&yuvconstants->kYToRgb)
347 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", 358 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20",
348 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" 359 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30"
349 ); 360 );
350 } 361 }
351 #endif // HAS_I422TORGB24ROW_NEON 362 #endif // HAS_I422TORGB24ROW_NEON
352 363
353 #ifdef HAS_I422TORAWROW_NEON 364 #ifdef HAS_I422TORAWROW_NEON
354 void I422ToRAWRow_NEON(const uint8* src_y, 365 void I422ToRAWRow_NEON(const uint8* src_y,
355 const uint8* src_u, 366 const uint8* src_u,
356 const uint8* src_v, 367 const uint8* src_v,
357 uint8* dst_raw, 368 uint8* dst_raw,
358 struct YuvConstants* yuvconstants, 369 struct YuvConstants* yuvconstants,
359 int width) { 370 int width) {
360 asm volatile ( 371 asm volatile (
361 YUVTORGB_SETUP 372 YUVTORGB_SETUP
362 "1: \n" 373 "1: \n"
363 READYUV422 374 READYUV422
364 YUVTORGB(v20, v21, v22) 375 YUVTORGB(v20, v21, v22)
365 "subs %w4, %w4, #8 \n" 376 "subs %w4, %w4, #8 \n"
366 MEMACCESS(3) 377 MEMACCESS(3)
367 "st3 {v20.8b,v21.8b,v22.8b}, [%3], #24 \n" 378 "st3 {v20.8b,v21.8b,v22.8b}, [%3], #24 \n"
368 "b.gt 1b \n" 379 "b.gt 1b \n"
369 : "+r"(src_y), // %0 380 : "+r"(src_y), // %0
370 "+r"(src_u), // %1 381 "+r"(src_u), // %1
371 "+r"(src_v), // %2 382 "+r"(src_v), // %2
372 "+r"(dst_raw), // %3 383 "+r"(dst_raw), // %3
373 "+r"(width) // %4 384 "+r"(width) // %4
374 : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), 385 : [kUVToRB]"r"(&yuvconstants->kUVToRB),
375 [kYToRgb]"r"(&kYuvConstants.kYToRgb) 386 [kUVToG]"r"(&yuvconstants->kUVToG),
387 [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR),
388 [kYToRgb]"r"(&yuvconstants->kYToRgb)
376 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", 389 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20",
377 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" 390 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30"
378 ); 391 );
379 } 392 }
380 #endif // HAS_I422TORAWROW_NEON 393 #endif // HAS_I422TORAWROW_NEON
381 394
382 #define ARGBTORGB565 \ 395 #define ARGBTORGB565 \
383 "shll v0.8h, v22.8b, #8 \n" /* R */ \ 396 "shll v0.8h, v22.8b, #8 \n" /* R */ \
384 "shll v20.8h, v20.8b, #8 \n" /* B */ \ 397 "shll v20.8h, v20.8b, #8 \n" /* B */ \
385 "shll v21.8h, v21.8b, #8 \n" /* G */ \ 398 "shll v21.8h, v21.8b, #8 \n" /* G */ \
(...skipping 15 matching lines...) Expand all
401 "subs %w4, %w4, #8 \n" 414 "subs %w4, %w4, #8 \n"
402 ARGBTORGB565 415 ARGBTORGB565
403 MEMACCESS(3) 416 MEMACCESS(3)
404 "st1 {v0.8h}, [%3], #16 \n" // store 8 pixels RGB565. 417 "st1 {v0.8h}, [%3], #16 \n" // store 8 pixels RGB565.
405 "b.gt 1b \n" 418 "b.gt 1b \n"
406 : "+r"(src_y), // %0 419 : "+r"(src_y), // %0
407 "+r"(src_u), // %1 420 "+r"(src_u), // %1
408 "+r"(src_v), // %2 421 "+r"(src_v), // %2
409 "+r"(dst_rgb565), // %3 422 "+r"(dst_rgb565), // %3
410 "+r"(width) // %4 423 "+r"(width) // %4
411 : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), 424 : [kUVToRB]"r"(&yuvconstants->kUVToRB),
412 [kYToRgb]"r"(&kYuvConstants.kYToRgb) 425 [kUVToG]"r"(&yuvconstants->kUVToG),
426 [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR),
427 [kYToRgb]"r"(&yuvconstants->kYToRgb)
413 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", 428 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20",
414 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" 429 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30"
415 ); 430 );
416 } 431 }
417 #endif // HAS_I422TORGB565ROW_NEON 432 #endif // HAS_I422TORGB565ROW_NEON
418 433
419 #define ARGBTOARGB1555 \ 434 #define ARGBTOARGB1555 \
420 "shll v0.8h, v23.8b, #8 \n" /* A */ \ 435 "shll v0.8h, v23.8b, #8 \n" /* A */ \
421 "shll v22.8h, v22.8b, #8 \n" /* R */ \ 436 "shll v22.8h, v22.8b, #8 \n" /* R */ \
422 "shll v20.8h, v20.8b, #8 \n" /* B */ \ 437 "shll v20.8h, v20.8b, #8 \n" /* B */ \
(...skipping 18 matching lines...) Expand all
441 "movi v23.8b, #255 \n" 456 "movi v23.8b, #255 \n"
442 ARGBTOARGB1555 457 ARGBTOARGB1555
443 MEMACCESS(3) 458 MEMACCESS(3)
444 "st1 {v0.8h}, [%3], #16 \n" // store 8 pixels RGB565. 459 "st1 {v0.8h}, [%3], #16 \n" // store 8 pixels RGB565.
445 "b.gt 1b \n" 460 "b.gt 1b \n"
446 : "+r"(src_y), // %0 461 : "+r"(src_y), // %0
447 "+r"(src_u), // %1 462 "+r"(src_u), // %1
448 "+r"(src_v), // %2 463 "+r"(src_v), // %2
449 "+r"(dst_argb1555), // %3 464 "+r"(dst_argb1555), // %3
450 "+r"(width) // %4 465 "+r"(width) // %4
451 : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), 466 : [kUVToRB]"r"(&yuvconstants->kUVToRB),
452 [kYToRgb]"r"(&kYuvConstants.kYToRgb) 467 [kUVToG]"r"(&yuvconstants->kUVToG),
468 [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR),
469 [kYToRgb]"r"(&yuvconstants->kYToRgb)
453 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", 470 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20",
454 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" 471 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30"
455 ); 472 );
456 } 473 }
457 #endif // HAS_I422TOARGB1555ROW_NEON 474 #endif // HAS_I422TOARGB1555ROW_NEON
458 475
459 #define ARGBTOARGB4444 \ 476 #define ARGBTOARGB4444 \
460 /* Input v20.8b<=B, v21.8b<=G, v22.8b<=R, v23.8b<=A, v4.8b<=0x0f */ \ 477 /* Input v20.8b<=B, v21.8b<=G, v22.8b<=R, v23.8b<=A, v4.8b<=0x0f */ \
461 "ushr v20.8b, v20.8b, #4 \n" /* B */ \ 478 "ushr v20.8b, v20.8b, #4 \n" /* B */ \
462 "bic v21.8b, v21.8b, v4.8b \n" /* G */ \ 479 "bic v21.8b, v21.8b, v4.8b \n" /* G */ \
(...skipping 20 matching lines...) Expand all
483 "movi v23.8b, #255 \n" 500 "movi v23.8b, #255 \n"
484 ARGBTOARGB4444 501 ARGBTOARGB4444
485 MEMACCESS(3) 502 MEMACCESS(3)
486 "st1 {v0.8h}, [%3], #16 \n" // store 8 pixels ARGB4444. 503 "st1 {v0.8h}, [%3], #16 \n" // store 8 pixels ARGB4444.
487 "b.gt 1b \n" 504 "b.gt 1b \n"
488 : "+r"(src_y), // %0 505 : "+r"(src_y), // %0
489 "+r"(src_u), // %1 506 "+r"(src_u), // %1
490 "+r"(src_v), // %2 507 "+r"(src_v), // %2
491 "+r"(dst_argb4444), // %3 508 "+r"(dst_argb4444), // %3
492 "+r"(width) // %4 509 "+r"(width) // %4
493 : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), 510 : [kUVToRB]"r"(&yuvconstants->kUVToRB),
494 [kYToRgb]"r"(&kYuvConstants.kYToRgb) 511 [kUVToG]"r"(&yuvconstants->kUVToG),
512 [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR),
513 [kYToRgb]"r"(&yuvconstants->kYToRgb)
495 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", 514 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20",
496 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" 515 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30"
497 ); 516 );
498 } 517 }
499 #endif // HAS_I422TOARGB4444ROW_NEON 518 #endif // HAS_I422TOARGB4444ROW_NEON
500 519
501 #ifdef HAS_I400TOARGBROW_NEON 520 #ifdef HAS_I400TOARGBROW_NEON
502 void I400ToARGBRow_NEON(const uint8* src_y, 521 void I400ToARGBRow_NEON(const uint8* src_y,
503 uint8* dst_argb, 522 uint8* dst_argb,
504 int width) { 523 int width) {
505 int64 width64 = (int64)(width); 524 int64 width64 = (int64)(width);
506 asm volatile ( 525 asm volatile (
507 YUVTORGB_SETUP 526 YUVTORGB_SETUP
508 "1: \n" 527 "1: \n"
509 READYUV400 528 READYUV400
510 YUVTORGB(v22, v21, v20) 529 YUVTORGB(v22, v21, v20)
511 "subs %w2, %w2, #8 \n" 530 "subs %w2, %w2, #8 \n"
512 "movi v23.8b, #255 \n" 531 "movi v23.8b, #255 \n"
513 MEMACCESS(1) 532 MEMACCESS(1)
514 "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%1], #32 \n" 533 "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%1], #32 \n"
515 "b.gt 1b \n" 534 "b.gt 1b \n"
516 : "+r"(src_y), // %0 535 : "+r"(src_y), // %0
517 "+r"(dst_argb), // %1 536 "+r"(dst_argb), // %1
518 "+r"(width64) // %2 537 "+r"(width64) // %2
519 : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), 538 : [kUVToRB]"r"(&kYuvConstants.kUVToRB),
539 [kUVToG]"r"(&kYuvConstants.kUVToG),
540 [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR),
520 [kYToRgb]"r"(&kYuvConstants.kYToRgb) 541 [kYToRgb]"r"(&kYuvConstants.kYToRgb)
521 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", 542 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20",
522 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" 543 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30"
523 ); 544 );
524 } 545 }
525 #endif // HAS_I400TOARGBROW_NEON 546 #endif // HAS_I400TOARGBROW_NEON
526 547
527 #ifdef HAS_J400TOARGBROW_NEON 548 #ifdef HAS_J400TOARGBROW_NEON
528 void J400ToARGBRow_NEON(const uint8* src_y, 549 void J400ToARGBRow_NEON(const uint8* src_y,
529 uint8* dst_argb, 550 uint8* dst_argb,
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
561 YUVTORGB(v22, v21, v20) 582 YUVTORGB(v22, v21, v20)
562 "subs %w3, %w3, #8 \n" 583 "subs %w3, %w3, #8 \n"
563 "movi v23.8b, #255 \n" 584 "movi v23.8b, #255 \n"
564 MEMACCESS(2) 585 MEMACCESS(2)
565 "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%2], #32 \n" 586 "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%2], #32 \n"
566 "b.gt 1b \n" 587 "b.gt 1b \n"
567 : "+r"(src_y), // %0 588 : "+r"(src_y), // %0
568 "+r"(src_uv), // %1 589 "+r"(src_uv), // %1
569 "+r"(dst_argb), // %2 590 "+r"(dst_argb), // %2
570 "+r"(width) // %3 591 "+r"(width) // %3
571 : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), 592 : [kUVToRB]"r"(&yuvconstants->kUVToRB),
572 [kYToRgb]"r"(&kYuvConstants.kYToRgb) 593 [kUVToG]"r"(&yuvconstants->kUVToG),
594 [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR),
595 [kYToRgb]"r"(&yuvconstants->kYToRgb)
573 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", 596 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20",
574 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" 597 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30"
575 ); 598 );
576 } 599 }
577 #endif // HAS_NV12TOARGBROW_NEON 600 #endif // HAS_NV12TOARGBROW_NEON
578 601
579 #ifdef HAS_NV12TOARGBROW_NEON 602 #ifdef HAS_NV12TOARGBROW_NEON
580 void NV21ToARGBRow_NEON(const uint8* src_y, 603 void NV21ToARGBRow_NEON(const uint8* src_y,
581 const uint8* src_vu, 604 const uint8* src_vu,
582 uint8* dst_argb, 605 uint8* dst_argb,
583 struct YuvConstants* yuvconstants, 606 struct YuvConstants* yuvconstants,
584 int width) { 607 int width) {
585 asm volatile ( 608 asm volatile (
586 YUVTORGB_SETUP 609 YUVTORGB_SETUP
587 "1: \n" 610 "1: \n"
588 READNV21 611 READNV21
589 YUVTORGB(v22, v21, v20) 612 YUVTORGB(v22, v21, v20)
590 "subs %w3, %w3, #8 \n" 613 "subs %w3, %w3, #8 \n"
591 "movi v23.8b, #255 \n" 614 "movi v23.8b, #255 \n"
592 MEMACCESS(2) 615 MEMACCESS(2)
593 "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%2], #32 \n" 616 "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%2], #32 \n"
594 "b.gt 1b \n" 617 "b.gt 1b \n"
595 : "+r"(src_y), // %0 618 : "+r"(src_y), // %0
596 "+r"(src_vu), // %1 619 "+r"(src_vu), // %1
597 "+r"(dst_argb), // %2 620 "+r"(dst_argb), // %2
598 "+r"(width) // %3 621 "+r"(width) // %3
599 : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), 622 : [kUVToRB]"r"(&yuvconstants->kUVToRB),
600 [kYToRgb]"r"(&kYuvConstants.kYToRgb) 623 [kUVToG]"r"(&yuvconstants->kUVToG),
624 [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR),
625 [kYToRgb]"r"(&yuvconstants->kYToRgb)
601 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", 626 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20",
602 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" 627 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30"
603 ); 628 );
604 } 629 }
605 #endif // HAS_NV12TOARGBROW_NEON 630 #endif // HAS_NV12TOARGBROW_NEON
606 631
607 #ifdef HAS_NV12TORGB565ROW_NEON 632 #ifdef HAS_NV12TORGB565ROW_NEON
608 void NV12ToRGB565Row_NEON(const uint8* src_y, 633 void NV12ToRGB565Row_NEON(const uint8* src_y,
609 const uint8* src_uv, 634 const uint8* src_uv,
610 uint8* dst_rgb565, 635 uint8* dst_rgb565,
611 struct YuvConstants* yuvconstants, 636 struct YuvConstants* yuvconstants,
612 int width) { 637 int width) {
613 asm volatile ( 638 asm volatile (
614 YUVTORGB_SETUP 639 YUVTORGB_SETUP
615 "1: \n" 640 "1: \n"
616 READNV12 641 READNV12
617 YUVTORGB(v22, v21, v20) 642 YUVTORGB(v22, v21, v20)
618 "subs %w3, %w3, #8 \n" 643 "subs %w3, %w3, #8 \n"
619 ARGBTORGB565 644 ARGBTORGB565
620 MEMACCESS(2) 645 MEMACCESS(2)
621 "st1 {v0.8h}, [%2], 16 \n" // store 8 pixels RGB565. 646 "st1 {v0.8h}, [%2], 16 \n" // store 8 pixels RGB565.
622 "b.gt 1b \n" 647 "b.gt 1b \n"
623 : "+r"(src_y), // %0 648 : "+r"(src_y), // %0
624 "+r"(src_uv), // %1 649 "+r"(src_uv), // %1
625 "+r"(dst_rgb565), // %2 650 "+r"(dst_rgb565), // %2
626 "+r"(width) // %3 651 "+r"(width) // %3
627 : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), 652 : [kUVToRB]"r"(&yuvconstants->kUVToRB),
628 [kYToRgb]"r"(&kYuvConstants.kYToRgb) 653 [kUVToG]"r"(&yuvconstants->kUVToG),
654 [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR),
655 [kYToRgb]"r"(&yuvconstants->kYToRgb)
629 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", 656 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20",
630 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" 657 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30"
631 ); 658 );
632 } 659 }
633 #endif // HAS_NV12TORGB565ROW_NEON 660 #endif // HAS_NV12TORGB565ROW_NEON
634 661
635 #ifdef HAS_YUY2TOARGBROW_NEON 662 #ifdef HAS_YUY2TOARGBROW_NEON
636 void YUY2ToARGBRow_NEON(const uint8* src_yuy2, 663 void YUY2ToARGBRow_NEON(const uint8* src_yuy2,
637 uint8* dst_argb, 664 uint8* dst_argb,
638 struct YuvConstants* yuvconstants, 665 struct YuvConstants* yuvconstants,
639 int width) { 666 int width) {
640 int64 width64 = (int64)(width); 667 int64 width64 = (int64)(width);
641 asm volatile ( 668 asm volatile (
642 YUVTORGB_SETUP 669 YUVTORGB_SETUP
643 "1: \n" 670 "1: \n"
644 READYUY2 671 READYUY2
645 YUVTORGB(v22, v21, v20) 672 YUVTORGB(v22, v21, v20)
646 "subs %w2, %w2, #8 \n" 673 "subs %w2, %w2, #8 \n"
647 "movi v23.8b, #255 \n" 674 "movi v23.8b, #255 \n"
648 MEMACCESS(1) 675 MEMACCESS(1)
649 "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%1], #32 \n" 676 "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%1], #32 \n"
650 "b.gt 1b \n" 677 "b.gt 1b \n"
651 : "+r"(src_yuy2), // %0 678 : "+r"(src_yuy2), // %0
652 "+r"(dst_argb), // %1 679 "+r"(dst_argb), // %1
653 "+r"(width64) // %2 680 "+r"(width64) // %2
654 : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), 681 : [kUVToRB]"r"(&yuvconstants->kUVToRB),
655 [kYToRgb]"r"(&kYuvConstants.kYToRgb) 682 [kUVToG]"r"(&yuvconstants->kUVToG),
683 [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR),
684 [kYToRgb]"r"(&yuvconstants->kYToRgb)
656 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", 685 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20",
657 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" 686 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30"
658 ); 687 );
659 } 688 }
660 #endif // HAS_YUY2TOARGBROW_NEON 689 #endif // HAS_YUY2TOARGBROW_NEON
661 690
662 #ifdef HAS_UYVYTOARGBROW_NEON 691 #ifdef HAS_UYVYTOARGBROW_NEON
663 void UYVYToARGBRow_NEON(const uint8* src_uyvy, 692 void UYVYToARGBRow_NEON(const uint8* src_uyvy,
664 uint8* dst_argb, 693 uint8* dst_argb,
665 struct YuvConstants* yuvconstants, 694 struct YuvConstants* yuvconstants,
666 int width) { 695 int width) {
667 int64 width64 = (int64)(width); 696 int64 width64 = (int64)(width);
668 asm volatile ( 697 asm volatile (
669 YUVTORGB_SETUP 698 YUVTORGB_SETUP
670 "1: \n" 699 "1: \n"
671 READUYVY 700 READUYVY
672 YUVTORGB(v22, v21, v20) 701 YUVTORGB(v22, v21, v20)
673 "subs %w2, %w2, #8 \n" 702 "subs %w2, %w2, #8 \n"
674 "movi v23.8b, #255 \n" 703 "movi v23.8b, #255 \n"
675 MEMACCESS(1) 704 MEMACCESS(1)
676 "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%1], 32 \n" 705 "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%1], 32 \n"
677 "b.gt 1b \n" 706 "b.gt 1b \n"
678 : "+r"(src_uyvy), // %0 707 : "+r"(src_uyvy), // %0
679 "+r"(dst_argb), // %1 708 "+r"(dst_argb), // %1
680 "+r"(width64) // %2 709 "+r"(width64) // %2
681 : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), 710 : [kUVToRB]"r"(&yuvconstants->kUVToRB),
682 [kYToRgb]"r"(&kYuvConstants.kYToRgb) 711 [kUVToG]"r"(&yuvconstants->kUVToG),
712 [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR),
713 [kYToRgb]"r"(&yuvconstants->kYToRgb)
683 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", 714 : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20",
684 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" 715 "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30"
685 ); 716 );
686 } 717 }
687 #endif // HAS_UYVYTOARGBROW_NEON 718 #endif // HAS_UYVYTOARGBROW_NEON
688 719
689 // Reads 16 pairs of UV and write even values to dst_u and odd to dst_v. 720 // Reads 16 pairs of UV and write even values to dst_u and odd to dst_v.
690 #ifdef HAS_SPLITUVROW_NEON 721 #ifdef HAS_SPLITUVROW_NEON
691 void SplitUVRow_NEON(const uint8* src_uv, uint8* dst_u, uint8* dst_v, 722 void SplitUVRow_NEON(const uint8* src_uv, uint8* dst_u, uint8* dst_v,
692 int width) { 723 int width) {
(...skipping 2348 matching lines...) Expand 10 before | Expand all | Expand 10 after
3041 : "cc", "memory", "v0", "v1", "v2", "v3" // Clobber List 3072 : "cc", "memory", "v0", "v1", "v2", "v3" // Clobber List
3042 ); 3073 );
3043 } 3074 }
3044 #endif // HAS_SOBELYROW_NEON 3075 #endif // HAS_SOBELYROW_NEON
3045 #endif // !defined(LIBYUV_DISABLE_NEON) && defined(__aarch64__) 3076 #endif // !defined(LIBYUV_DISABLE_NEON) && defined(__aarch64__)
3046 3077
3047 #ifdef __cplusplus 3078 #ifdef __cplusplus
3048 } // extern "C" 3079 } // extern "C"
3049 } // namespace libyuv 3080 } // namespace libyuv
3050 #endif 3081 #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