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

Side by Side Diff: source/row_neon.cc

Issue 1345623003: use struct instead of vectors (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 | « no previous file | 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 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
156 #define BG (UG * 128 + VG * 128 + YGB) 156 #define BG (UG * 128 + VG * 128 + YGB)
157 #define BR (VR * 128 + YGB) 157 #define BR (VR * 128 + YGB)
158 158
159 YuvConstantsNEON SIMD_ALIGNED(kYuvConstantsNEON) = { 159 YuvConstantsNEON SIMD_ALIGNED(kYuvConstantsNEON) = {
160 { -UB, -UB, -UB, -UB, -VR, -VR, -VR, -VR, 0, 0, 0, 0, 0, 0, 0, 0 }, 160 { -UB, -UB, -UB, -UB, -VR, -VR, -VR, -VR, 0, 0, 0, 0, 0, 0, 0, 0 },
161 { UG, UG, UG, UG, VG, VG, VG, VG, 0, 0, 0, 0, 0, 0, 0, 0 }, 161 { UG, UG, UG, UG, VG, VG, VG, VG, 0, 0, 0, 0, 0, 0, 0, 0 },
162 { BB, BG, BR, 0, 0, 0, 0, 0 }, 162 { BB, BG, BR, 0, 0, 0, 0, 0 },
163 { 0x0101 * YG, 0, 0, 0 } 163 { 0x0101 * YG, 0, 0, 0 }
164 }; 164 };
165 165
166 // TODO(fbarchard): replace these with structure.
167 static uvec8 kUVToRB = { -UB, -UB, -UB, -UB, -VR, -VR, -VR, -VR,
168 0, 0, 0, 0, 0, 0, 0, 0 },
169 static uvec8 kUVToG = { UG, UG, UG, UG, VG, VG, VG, VG,
170 0, 0, 0, 0, 0, 0, 0, 0 };
171 static vec16 kUVBiasBGR = { BB, BG, BR, 0, 0, 0, 0, 0 };
172 static vec32 kYToRgb = { 0x0101 * YG, 0, 0, 0 };
173
174 #undef YG 166 #undef YG
175 #undef YGB 167 #undef YGB
176 #undef UB 168 #undef UB
177 #undef UG 169 #undef UG
178 #undef VG 170 #undef VG
179 #undef VR 171 #undef VR
180 #undef BB 172 #undef BB
181 #undef BG 173 #undef BG
182 #undef BR 174 #undef BR
183 175
(...skipping 10 matching lines...) Expand all
194 "subs %4, %4, #8 \n" 186 "subs %4, %4, #8 \n"
195 "vmov.u8 d23, #255 \n" 187 "vmov.u8 d23, #255 \n"
196 MEMACCESS(3) 188 MEMACCESS(3)
197 "vst4.8 {d20, d21, d22, d23}, [%3]! \n" 189 "vst4.8 {d20, d21, d22, d23}, [%3]! \n"
198 "bgt 1b \n" 190 "bgt 1b \n"
199 : "+r"(src_y), // %0 191 : "+r"(src_y), // %0
200 "+r"(src_u), // %1 192 "+r"(src_u), // %1
201 "+r"(src_v), // %2 193 "+r"(src_v), // %2
202 "+r"(dst_argb), // %3 194 "+r"(dst_argb), // %3
203 "+r"(width) // %4 195 "+r"(width) // %4
204 : [kUVToRB]"r"(&kUVToRB), // %5 196 : [kUVToRB]"r"(&kYuvConstantsNEON.kUVToRB), // %5
205 [kUVToG]"r"(&kUVToG), // %6 197 [kUVToG]"r"(&kYuvConstantsNEON.kUVToG), // %6
206 [kUVBiasBGR]"r"(&kUVBiasBGR), 198 [kUVBiasBGR]"r"(&kYuvConstantsNEON.kUVBiasBGR),
207 [kYToRgb]"r"(&kYToRgb) 199 [kYToRgb]"r"(&kYuvConstantsNEON.kYToRgb)
208 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", 200 : "cc", "memory", "q0", "q1", "q2", "q3", "q4",
209 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 201 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
210 ); 202 );
211 } 203 }
212 204
213 void I422ToARGBMatrixRow_NEON(const uint8* src_y, 205 void I422ToARGBMatrixRow_NEON(const uint8* src_y,
214 const uint8* src_u, 206 const uint8* src_u,
215 const uint8* src_v, 207 const uint8* src_v,
216 uint8* dst_argb, 208 uint8* dst_argb,
217 struct YuvConstantsNEON* YuvConstants, 209 struct YuvConstantsNEON* YuvConstants,
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
253 "subs %4, %4, #8 \n" 245 "subs %4, %4, #8 \n"
254 "vmov.u8 d23, #255 \n" 246 "vmov.u8 d23, #255 \n"
255 MEMACCESS(3) 247 MEMACCESS(3)
256 "vst4.8 {d20, d21, d22, d23}, [%3]! \n" 248 "vst4.8 {d20, d21, d22, d23}, [%3]! \n"
257 "bgt 1b \n" 249 "bgt 1b \n"
258 : "+r"(src_y), // %0 250 : "+r"(src_y), // %0
259 "+r"(src_u), // %1 251 "+r"(src_u), // %1
260 "+r"(src_v), // %2 252 "+r"(src_v), // %2
261 "+r"(dst_argb), // %3 253 "+r"(dst_argb), // %3
262 "+r"(width) // %4 254 "+r"(width) // %4
263 : [kUVToRB]"r"(&kUVToRB), // %5 255 : [kUVToRB]"r"(&kYuvConstantsNEON.kUVToRB), // %5
264 [kUVToG]"r"(&kUVToG), // %6 256 [kUVToG]"r"(&kYuvConstantsNEON.kUVToG), // %6
265 [kUVBiasBGR]"r"(&kUVBiasBGR), 257 [kUVBiasBGR]"r"(&kYuvConstantsNEON.kUVBiasBGR),
266 [kYToRgb]"r"(&kYToRgb) 258 [kYToRgb]"r"(&kYuvConstantsNEON.kYToRgb)
267 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", 259 : "cc", "memory", "q0", "q1", "q2", "q3", "q4",
268 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 260 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
269 ); 261 );
270 } 262 }
271 263
272 void I422ToBGRARow_NEON(const uint8* src_y, 264 void I422ToBGRARow_NEON(const uint8* src_y,
273 const uint8* src_u, 265 const uint8* src_u,
274 const uint8* src_v, 266 const uint8* src_v,
275 uint8* dst_bgra, 267 uint8* dst_bgra,
276 int width) { 268 int width) {
277 asm volatile ( 269 asm volatile (
278 YUV422TORGB_SETUP_REG 270 YUV422TORGB_SETUP_REG
279 "1: \n" 271 "1: \n"
280 READYUV422 272 READYUV422
281 YUV422TORGB 273 YUV422TORGB
282 "subs %4, %4, #8 \n" 274 "subs %4, %4, #8 \n"
283 "vswp.u8 d20, d22 \n" 275 "vswp.u8 d20, d22 \n"
284 "vmov.u8 d19, #255 \n" 276 "vmov.u8 d19, #255 \n"
285 MEMACCESS(3) 277 MEMACCESS(3)
286 "vst4.8 {d19, d20, d21, d22}, [%3]! \n" 278 "vst4.8 {d19, d20, d21, d22}, [%3]! \n"
287 "bgt 1b \n" 279 "bgt 1b \n"
288 : "+r"(src_y), // %0 280 : "+r"(src_y), // %0
289 "+r"(src_u), // %1 281 "+r"(src_u), // %1
290 "+r"(src_v), // %2 282 "+r"(src_v), // %2
291 "+r"(dst_bgra), // %3 283 "+r"(dst_bgra), // %3
292 "+r"(width) // %4 284 "+r"(width) // %4
293 : [kUVToRB]"r"(&kUVToRB), // %5 285 : [kUVToRB]"r"(&kYuvConstantsNEON.kUVToRB), // %5
294 [kUVToG]"r"(&kUVToG), // %6 286 [kUVToG]"r"(&kYuvConstantsNEON.kUVToG), // %6
295 [kUVBiasBGR]"r"(&kUVBiasBGR), 287 [kUVBiasBGR]"r"(&kYuvConstantsNEON.kUVBiasBGR),
296 [kYToRgb]"r"(&kYToRgb) 288 [kYToRgb]"r"(&kYuvConstantsNEON.kYToRgb)
297 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", 289 : "cc", "memory", "q0", "q1", "q2", "q3", "q4",
298 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 290 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
299 ); 291 );
300 } 292 }
301 293
302 void I422ToABGRRow_NEON(const uint8* src_y, 294 void I422ToABGRRow_NEON(const uint8* src_y,
303 const uint8* src_u, 295 const uint8* src_u,
304 const uint8* src_v, 296 const uint8* src_v,
305 uint8* dst_abgr, 297 uint8* dst_abgr,
306 int width) { 298 int width) {
307 asm volatile ( 299 asm volatile (
308 YUV422TORGB_SETUP_REG 300 YUV422TORGB_SETUP_REG
309 "1: \n" 301 "1: \n"
310 READYUV422 302 READYUV422
311 YUV422TORGB 303 YUV422TORGB
312 "subs %4, %4, #8 \n" 304 "subs %4, %4, #8 \n"
313 "vswp.u8 d20, d22 \n" 305 "vswp.u8 d20, d22 \n"
314 "vmov.u8 d23, #255 \n" 306 "vmov.u8 d23, #255 \n"
315 MEMACCESS(3) 307 MEMACCESS(3)
316 "vst4.8 {d20, d21, d22, d23}, [%3]! \n" 308 "vst4.8 {d20, d21, d22, d23}, [%3]! \n"
317 "bgt 1b \n" 309 "bgt 1b \n"
318 : "+r"(src_y), // %0 310 : "+r"(src_y), // %0
319 "+r"(src_u), // %1 311 "+r"(src_u), // %1
320 "+r"(src_v), // %2 312 "+r"(src_v), // %2
321 "+r"(dst_abgr), // %3 313 "+r"(dst_abgr), // %3
322 "+r"(width) // %4 314 "+r"(width) // %4
323 : [kUVToRB]"r"(&kUVToRB), // %5 315 : [kUVToRB]"r"(&kYuvConstantsNEON.kUVToRB), // %5
324 [kUVToG]"r"(&kUVToG), // %6 316 [kUVToG]"r"(&kYuvConstantsNEON.kUVToG), // %6
325 [kUVBiasBGR]"r"(&kUVBiasBGR), 317 [kUVBiasBGR]"r"(&kYuvConstantsNEON.kUVBiasBGR),
326 [kYToRgb]"r"(&kYToRgb) 318 [kYToRgb]"r"(&kYuvConstantsNEON.kYToRgb)
327 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", 319 : "cc", "memory", "q0", "q1", "q2", "q3", "q4",
328 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 320 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
329 ); 321 );
330 } 322 }
331 323
332 void I422ToRGBARow_NEON(const uint8* src_y, 324 void I422ToRGBARow_NEON(const uint8* src_y,
333 const uint8* src_u, 325 const uint8* src_u,
334 const uint8* src_v, 326 const uint8* src_v,
335 uint8* dst_rgba, 327 uint8* dst_rgba,
336 int width) { 328 int width) {
337 asm volatile ( 329 asm volatile (
338 YUV422TORGB_SETUP_REG 330 YUV422TORGB_SETUP_REG
339 "1: \n" 331 "1: \n"
340 READYUV422 332 READYUV422
341 YUV422TORGB 333 YUV422TORGB
342 "subs %4, %4, #8 \n" 334 "subs %4, %4, #8 \n"
343 "vmov.u8 d19, #255 \n" 335 "vmov.u8 d19, #255 \n"
344 MEMACCESS(3) 336 MEMACCESS(3)
345 "vst4.8 {d19, d20, d21, d22}, [%3]! \n" 337 "vst4.8 {d19, d20, d21, d22}, [%3]! \n"
346 "bgt 1b \n" 338 "bgt 1b \n"
347 : "+r"(src_y), // %0 339 : "+r"(src_y), // %0
348 "+r"(src_u), // %1 340 "+r"(src_u), // %1
349 "+r"(src_v), // %2 341 "+r"(src_v), // %2
350 "+r"(dst_rgba), // %3 342 "+r"(dst_rgba), // %3
351 "+r"(width) // %4 343 "+r"(width) // %4
352 : [kUVToRB]"r"(&kUVToRB), // %5 344 : [kUVToRB]"r"(&kYuvConstantsNEON.kUVToRB), // %5
353 [kUVToG]"r"(&kUVToG), // %6 345 [kUVToG]"r"(&kYuvConstantsNEON.kUVToG), // %6
354 [kUVBiasBGR]"r"(&kUVBiasBGR), 346 [kUVBiasBGR]"r"(&kYuvConstantsNEON.kUVBiasBGR),
355 [kYToRgb]"r"(&kYToRgb) 347 [kYToRgb]"r"(&kYuvConstantsNEON.kYToRgb)
356 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", 348 : "cc", "memory", "q0", "q1", "q2", "q3", "q4",
357 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 349 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
358 ); 350 );
359 } 351 }
360 352
361 void I422ToRGB24Row_NEON(const uint8* src_y, 353 void I422ToRGB24Row_NEON(const uint8* src_y,
362 const uint8* src_u, 354 const uint8* src_u,
363 const uint8* src_v, 355 const uint8* src_v,
364 uint8* dst_rgb24, 356 uint8* dst_rgb24,
365 int width) { 357 int width) {
366 asm volatile ( 358 asm volatile (
367 YUV422TORGB_SETUP_REG 359 YUV422TORGB_SETUP_REG
368 "1: \n" 360 "1: \n"
369 READYUV422 361 READYUV422
370 YUV422TORGB 362 YUV422TORGB
371 "subs %4, %4, #8 \n" 363 "subs %4, %4, #8 \n"
372 MEMACCESS(3) 364 MEMACCESS(3)
373 "vst3.8 {d20, d21, d22}, [%3]! \n" 365 "vst3.8 {d20, d21, d22}, [%3]! \n"
374 "bgt 1b \n" 366 "bgt 1b \n"
375 : "+r"(src_y), // %0 367 : "+r"(src_y), // %0
376 "+r"(src_u), // %1 368 "+r"(src_u), // %1
377 "+r"(src_v), // %2 369 "+r"(src_v), // %2
378 "+r"(dst_rgb24), // %3 370 "+r"(dst_rgb24), // %3
379 "+r"(width) // %4 371 "+r"(width) // %4
380 : [kUVToRB]"r"(&kUVToRB), // %5 372 : [kUVToRB]"r"(&kYuvConstantsNEON.kUVToRB), // %5
381 [kUVToG]"r"(&kUVToG), // %6 373 [kUVToG]"r"(&kYuvConstantsNEON.kUVToG), // %6
382 [kUVBiasBGR]"r"(&kUVBiasBGR), 374 [kUVBiasBGR]"r"(&kYuvConstantsNEON.kUVBiasBGR),
383 [kYToRgb]"r"(&kYToRgb) 375 [kYToRgb]"r"(&kYuvConstantsNEON.kYToRgb)
384 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", 376 : "cc", "memory", "q0", "q1", "q2", "q3", "q4",
385 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 377 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
386 ); 378 );
387 } 379 }
388 380
389 void I422ToRAWRow_NEON(const uint8* src_y, 381 void I422ToRAWRow_NEON(const uint8* src_y,
390 const uint8* src_u, 382 const uint8* src_u,
391 const uint8* src_v, 383 const uint8* src_v,
392 uint8* dst_raw, 384 uint8* dst_raw,
393 int width) { 385 int width) {
394 asm volatile ( 386 asm volatile (
395 YUV422TORGB_SETUP_REG 387 YUV422TORGB_SETUP_REG
396 "1: \n" 388 "1: \n"
397 READYUV422 389 READYUV422
398 YUV422TORGB 390 YUV422TORGB
399 "subs %4, %4, #8 \n" 391 "subs %4, %4, #8 \n"
400 "vswp.u8 d20, d22 \n" 392 "vswp.u8 d20, d22 \n"
401 MEMACCESS(3) 393 MEMACCESS(3)
402 "vst3.8 {d20, d21, d22}, [%3]! \n" 394 "vst3.8 {d20, d21, d22}, [%3]! \n"
403 "bgt 1b \n" 395 "bgt 1b \n"
404 : "+r"(src_y), // %0 396 : "+r"(src_y), // %0
405 "+r"(src_u), // %1 397 "+r"(src_u), // %1
406 "+r"(src_v), // %2 398 "+r"(src_v), // %2
407 "+r"(dst_raw), // %3 399 "+r"(dst_raw), // %3
408 "+r"(width) // %4 400 "+r"(width) // %4
409 : [kUVToRB]"r"(&kUVToRB), // %5 401 : [kUVToRB]"r"(&kYuvConstantsNEON.kUVToRB), // %5
410 [kUVToG]"r"(&kUVToG), // %6 402 [kUVToG]"r"(&kYuvConstantsNEON.kUVToG), // %6
411 [kUVBiasBGR]"r"(&kUVBiasBGR), 403 [kUVBiasBGR]"r"(&kYuvConstantsNEON.kUVBiasBGR),
412 [kYToRgb]"r"(&kYToRgb) 404 [kYToRgb]"r"(&kYuvConstantsNEON.kYToRgb)
413 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", 405 : "cc", "memory", "q0", "q1", "q2", "q3", "q4",
414 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 406 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
415 ); 407 );
416 } 408 }
417 409
418 #define ARGBTORGB565 \ 410 #define ARGBTORGB565 \
419 "vshr.u8 d20, d20, #3 \n" /* B */ \ 411 "vshr.u8 d20, d20, #3 \n" /* B */ \
420 "vshr.u8 d21, d21, #2 \n" /* G */ \ 412 "vshr.u8 d21, d21, #2 \n" /* G */ \
421 "vshr.u8 d22, d22, #3 \n" /* R */ \ 413 "vshr.u8 d22, d22, #3 \n" /* R */ \
422 "vmovl.u8 q8, d20 \n" /* B */ \ 414 "vmovl.u8 q8, d20 \n" /* B */ \
(...skipping 17 matching lines...) Expand all
440 "subs %4, %4, #8 \n" 432 "subs %4, %4, #8 \n"
441 ARGBTORGB565 433 ARGBTORGB565
442 MEMACCESS(3) 434 MEMACCESS(3)
443 "vst1.8 {q0}, [%3]! \n" // store 8 pixels RGB565. 435 "vst1.8 {q0}, [%3]! \n" // store 8 pixels RGB565.
444 "bgt 1b \n" 436 "bgt 1b \n"
445 : "+r"(src_y), // %0 437 : "+r"(src_y), // %0
446 "+r"(src_u), // %1 438 "+r"(src_u), // %1
447 "+r"(src_v), // %2 439 "+r"(src_v), // %2
448 "+r"(dst_rgb565), // %3 440 "+r"(dst_rgb565), // %3
449 "+r"(width) // %4 441 "+r"(width) // %4
450 : [kUVToRB]"r"(&kUVToRB), // %5 442 : [kUVToRB]"r"(&kYuvConstantsNEON.kUVToRB), // %5
451 [kUVToG]"r"(&kUVToG), // %6 443 [kUVToG]"r"(&kYuvConstantsNEON.kUVToG), // %6
452 [kUVBiasBGR]"r"(&kUVBiasBGR), 444 [kUVBiasBGR]"r"(&kYuvConstantsNEON.kUVBiasBGR),
453 [kYToRgb]"r"(&kYToRgb) 445 [kYToRgb]"r"(&kYuvConstantsNEON.kYToRgb)
454 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", 446 : "cc", "memory", "q0", "q1", "q2", "q3", "q4",
455 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 447 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
456 ); 448 );
457 } 449 }
458 450
459 #define ARGBTOARGB1555 \ 451 #define ARGBTOARGB1555 \
460 "vshr.u8 q10, q10, #3 \n" /* B */ \ 452 "vshr.u8 q10, q10, #3 \n" /* B */ \
461 "vshr.u8 d22, d22, #3 \n" /* R */ \ 453 "vshr.u8 d22, d22, #3 \n" /* R */ \
462 "vshr.u8 d23, d23, #7 \n" /* A */ \ 454 "vshr.u8 d23, d23, #7 \n" /* A */ \
463 "vmovl.u8 q8, d20 \n" /* B */ \ 455 "vmovl.u8 q8, d20 \n" /* B */ \
(...skipping 21 matching lines...) Expand all
485 "vmov.u8 d23, #255 \n" 477 "vmov.u8 d23, #255 \n"
486 ARGBTOARGB1555 478 ARGBTOARGB1555
487 MEMACCESS(3) 479 MEMACCESS(3)
488 "vst1.8 {q0}, [%3]! \n" // store 8 pixels ARGB1555. 480 "vst1.8 {q0}, [%3]! \n" // store 8 pixels ARGB1555.
489 "bgt 1b \n" 481 "bgt 1b \n"
490 : "+r"(src_y), // %0 482 : "+r"(src_y), // %0
491 "+r"(src_u), // %1 483 "+r"(src_u), // %1
492 "+r"(src_v), // %2 484 "+r"(src_v), // %2
493 "+r"(dst_argb1555), // %3 485 "+r"(dst_argb1555), // %3
494 "+r"(width) // %4 486 "+r"(width) // %4
495 : [kUVToRB]"r"(&kUVToRB), // %5 487 : [kUVToRB]"r"(&kYuvConstantsNEON.kUVToRB), // %5
496 [kUVToG]"r"(&kUVToG), // %6 488 [kUVToG]"r"(&kYuvConstantsNEON.kUVToG), // %6
497 [kUVBiasBGR]"r"(&kUVBiasBGR), 489 [kUVBiasBGR]"r"(&kYuvConstantsNEON.kUVBiasBGR),
498 [kYToRgb]"r"(&kYToRgb) 490 [kYToRgb]"r"(&kYuvConstantsNEON.kYToRgb)
499 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", 491 : "cc", "memory", "q0", "q1", "q2", "q3", "q4",
500 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 492 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
501 ); 493 );
502 } 494 }
503 495
504 #define ARGBTOARGB4444 \ 496 #define ARGBTOARGB4444 \
505 "vshr.u8 d20, d20, #4 \n" /* B */ \ 497 "vshr.u8 d20, d20, #4 \n" /* B */ \
506 "vbic.32 d21, d21, d4 \n" /* G */ \ 498 "vbic.32 d21, d21, d4 \n" /* G */ \
507 "vshr.u8 d22, d22, #4 \n" /* R */ \ 499 "vshr.u8 d22, d22, #4 \n" /* R */ \
508 "vbic.32 d23, d23, d4 \n" /* A */ \ 500 "vbic.32 d23, d23, d4 \n" /* A */ \
(...skipping 16 matching lines...) Expand all
525 "vmov.u8 d23, #255 \n" 517 "vmov.u8 d23, #255 \n"
526 ARGBTOARGB4444 518 ARGBTOARGB4444
527 MEMACCESS(3) 519 MEMACCESS(3)
528 "vst1.8 {q0}, [%3]! \n" // store 8 pixels ARGB4444. 520 "vst1.8 {q0}, [%3]! \n" // store 8 pixels ARGB4444.
529 "bgt 1b \n" 521 "bgt 1b \n"
530 : "+r"(src_y), // %0 522 : "+r"(src_y), // %0
531 "+r"(src_u), // %1 523 "+r"(src_u), // %1
532 "+r"(src_v), // %2 524 "+r"(src_v), // %2
533 "+r"(dst_argb4444), // %3 525 "+r"(dst_argb4444), // %3
534 "+r"(width) // %4 526 "+r"(width) // %4
535 : [kUVToRB]"r"(&kUVToRB), // %5 527 : [kUVToRB]"r"(&kYuvConstantsNEON.kUVToRB), // %5
536 [kUVToG]"r"(&kUVToG), // %6 528 [kUVToG]"r"(&kYuvConstantsNEON.kUVToG), // %6
537 [kUVBiasBGR]"r"(&kUVBiasBGR), 529 [kUVBiasBGR]"r"(&kYuvConstantsNEON.kUVBiasBGR),
538 [kYToRgb]"r"(&kYToRgb) 530 [kYToRgb]"r"(&kYuvConstantsNEON.kYToRgb)
539 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", 531 : "cc", "memory", "q0", "q1", "q2", "q3", "q4",
540 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 532 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
541 ); 533 );
542 } 534 }
543 535
544 void I400ToARGBRow_NEON(const uint8* src_y, 536 void I400ToARGBRow_NEON(const uint8* src_y,
545 uint8* dst_argb, 537 uint8* dst_argb,
546 int width) { 538 int width) {
547 asm volatile ( 539 asm volatile (
548 YUV422TORGB_SETUP_REG 540 YUV422TORGB_SETUP_REG
549 "1: \n" 541 "1: \n"
550 READYUV400 542 READYUV400
551 YUV422TORGB 543 YUV422TORGB
552 "subs %2, %2, #8 \n" 544 "subs %2, %2, #8 \n"
553 "vmov.u8 d23, #255 \n" 545 "vmov.u8 d23, #255 \n"
554 MEMACCESS(1) 546 MEMACCESS(1)
555 "vst4.8 {d20, d21, d22, d23}, [%1]! \n" 547 "vst4.8 {d20, d21, d22, d23}, [%1]! \n"
556 "bgt 1b \n" 548 "bgt 1b \n"
557 : "+r"(src_y), // %0 549 : "+r"(src_y), // %0
558 "+r"(dst_argb), // %1 550 "+r"(dst_argb), // %1
559 "+r"(width) // %2 551 "+r"(width) // %2
560 : [kUVToRB]"r"(&kUVToRB), // %3 552 : [kUVToRB]"r"(&kYuvConstantsNEON.kUVToRB), // %3
561 [kUVToG]"r"(&kUVToG), // %4 553 [kUVToG]"r"(&kYuvConstantsNEON.kUVToG), // %4
562 [kUVBiasBGR]"r"(&kUVBiasBGR), 554 [kUVBiasBGR]"r"(&kYuvConstantsNEON.kUVBiasBGR),
563 [kYToRgb]"r"(&kYToRgb) 555 [kYToRgb]"r"(&kYuvConstantsNEON.kYToRgb)
564 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", 556 : "cc", "memory", "q0", "q1", "q2", "q3", "q4",
565 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 557 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
566 ); 558 );
567 } 559 }
568 560
569 void J400ToARGBRow_NEON(const uint8* src_y, 561 void J400ToARGBRow_NEON(const uint8* src_y,
570 uint8* dst_argb, 562 uint8* dst_argb,
571 int width) { 563 int width) {
572 asm volatile ( 564 asm volatile (
573 "vmov.u8 d23, #255 \n" 565 "vmov.u8 d23, #255 \n"
(...skipping 25 matching lines...) Expand all
599 YUV422TORGB 591 YUV422TORGB
600 "subs %3, %3, #8 \n" 592 "subs %3, %3, #8 \n"
601 "vmov.u8 d23, #255 \n" 593 "vmov.u8 d23, #255 \n"
602 MEMACCESS(2) 594 MEMACCESS(2)
603 "vst4.8 {d20, d21, d22, d23}, [%2]! \n" 595 "vst4.8 {d20, d21, d22, d23}, [%2]! \n"
604 "bgt 1b \n" 596 "bgt 1b \n"
605 : "+r"(src_y), // %0 597 : "+r"(src_y), // %0
606 "+r"(src_uv), // %1 598 "+r"(src_uv), // %1
607 "+r"(dst_argb), // %2 599 "+r"(dst_argb), // %2
608 "+r"(width) // %3 600 "+r"(width) // %3
609 : [kUVToRB]"r"(&kUVToRB), // %4 601 : [kUVToRB]"r"(&kYuvConstantsNEON.kUVToRB), // %4
610 [kUVToG]"r"(&kUVToG), // %5 602 [kUVToG]"r"(&kYuvConstantsNEON.kUVToG), // %5
611 [kUVBiasBGR]"r"(&kUVBiasBGR), 603 [kUVBiasBGR]"r"(&kYuvConstantsNEON.kUVBiasBGR),
612 [kYToRgb]"r"(&kYToRgb) 604 [kYToRgb]"r"(&kYuvConstantsNEON.kYToRgb)
613 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", 605 : "cc", "memory", "q0", "q1", "q2", "q3", "q4",
614 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 606 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
615 ); 607 );
616 } 608 }
617 609
618 void NV21ToARGBRow_NEON(const uint8* src_y, 610 void NV21ToARGBRow_NEON(const uint8* src_y,
619 const uint8* src_uv, 611 const uint8* src_uv,
620 uint8* dst_argb, 612 uint8* dst_argb,
621 int width) { 613 int width) {
622 asm volatile ( 614 asm volatile (
623 YUV422TORGB_SETUP_REG 615 YUV422TORGB_SETUP_REG
624 "1: \n" 616 "1: \n"
625 READNV21 617 READNV21
626 YUV422TORGB 618 YUV422TORGB
627 "subs %3, %3, #8 \n" 619 "subs %3, %3, #8 \n"
628 "vmov.u8 d23, #255 \n" 620 "vmov.u8 d23, #255 \n"
629 MEMACCESS(2) 621 MEMACCESS(2)
630 "vst4.8 {d20, d21, d22, d23}, [%2]! \n" 622 "vst4.8 {d20, d21, d22, d23}, [%2]! \n"
631 "bgt 1b \n" 623 "bgt 1b \n"
632 : "+r"(src_y), // %0 624 : "+r"(src_y), // %0
633 "+r"(src_uv), // %1 625 "+r"(src_uv), // %1
634 "+r"(dst_argb), // %2 626 "+r"(dst_argb), // %2
635 "+r"(width) // %3 627 "+r"(width) // %3
636 : [kUVToRB]"r"(&kUVToRB), // %4 628 : [kUVToRB]"r"(&kYuvConstantsNEON.kUVToRB), // %4
637 [kUVToG]"r"(&kUVToG), // %5 629 [kUVToG]"r"(&kYuvConstantsNEON.kUVToG), // %5
638 [kUVBiasBGR]"r"(&kUVBiasBGR), 630 [kUVBiasBGR]"r"(&kYuvConstantsNEON.kUVBiasBGR),
639 [kYToRgb]"r"(&kYToRgb) 631 [kYToRgb]"r"(&kYuvConstantsNEON.kYToRgb)
640 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", 632 : "cc", "memory", "q0", "q1", "q2", "q3", "q4",
641 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 633 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
642 ); 634 );
643 } 635 }
644 636
645 void NV12ToRGB565Row_NEON(const uint8* src_y, 637 void NV12ToRGB565Row_NEON(const uint8* src_y,
646 const uint8* src_uv, 638 const uint8* src_uv,
647 uint8* dst_rgb565, 639 uint8* dst_rgb565,
648 int width) { 640 int width) {
649 asm volatile ( 641 asm volatile (
650 YUV422TORGB_SETUP_REG 642 YUV422TORGB_SETUP_REG
651 "1: \n" 643 "1: \n"
652 READNV12 644 READNV12
653 YUV422TORGB 645 YUV422TORGB
654 "subs %3, %3, #8 \n" 646 "subs %3, %3, #8 \n"
655 ARGBTORGB565 647 ARGBTORGB565
656 MEMACCESS(2) 648 MEMACCESS(2)
657 "vst1.8 {q0}, [%2]! \n" // store 8 pixels RGB565. 649 "vst1.8 {q0}, [%2]! \n" // store 8 pixels RGB565.
658 "bgt 1b \n" 650 "bgt 1b \n"
659 : "+r"(src_y), // %0 651 : "+r"(src_y), // %0
660 "+r"(src_uv), // %1 652 "+r"(src_uv), // %1
661 "+r"(dst_rgb565), // %2 653 "+r"(dst_rgb565), // %2
662 "+r"(width) // %3 654 "+r"(width) // %3
663 : [kUVToRB]"r"(&kUVToRB), // %4 655 : [kUVToRB]"r"(&kYuvConstantsNEON.kUVToRB), // %4
664 [kUVToG]"r"(&kUVToG), // %5 656 [kUVToG]"r"(&kYuvConstantsNEON.kUVToG), // %5
665 [kUVBiasBGR]"r"(&kUVBiasBGR), 657 [kUVBiasBGR]"r"(&kYuvConstantsNEON.kUVBiasBGR),
666 [kYToRgb]"r"(&kYToRgb) 658 [kYToRgb]"r"(&kYuvConstantsNEON.kYToRgb)
667 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", 659 : "cc", "memory", "q0", "q1", "q2", "q3", "q4",
668 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 660 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
669 ); 661 );
670 } 662 }
671 663
672 void NV21ToRGB565Row_NEON(const uint8* src_y, 664 void NV21ToRGB565Row_NEON(const uint8* src_y,
673 const uint8* src_uv, 665 const uint8* src_uv,
674 uint8* dst_rgb565, 666 uint8* dst_rgb565,
675 int width) { 667 int width) {
676 asm volatile ( 668 asm volatile (
677 YUV422TORGB_SETUP_REG 669 YUV422TORGB_SETUP_REG
678 "1: \n" 670 "1: \n"
679 READNV21 671 READNV21
680 YUV422TORGB 672 YUV422TORGB
681 "subs %3, %3, #8 \n" 673 "subs %3, %3, #8 \n"
682 ARGBTORGB565 674 ARGBTORGB565
683 MEMACCESS(2) 675 MEMACCESS(2)
684 "vst1.8 {q0}, [%2]! \n" // store 8 pixels RGB565. 676 "vst1.8 {q0}, [%2]! \n" // store 8 pixels RGB565.
685 "bgt 1b \n" 677 "bgt 1b \n"
686 : "+r"(src_y), // %0 678 : "+r"(src_y), // %0
687 "+r"(src_uv), // %1 679 "+r"(src_uv), // %1
688 "+r"(dst_rgb565), // %2 680 "+r"(dst_rgb565), // %2
689 "+r"(width) // %3 681 "+r"(width) // %3
690 : [kUVToRB]"r"(&kUVToRB), // %4 682 : [kUVToRB]"r"(&kYuvConstantsNEON.kUVToRB), // %4
691 [kUVToG]"r"(&kUVToG), // %5 683 [kUVToG]"r"(&kYuvConstantsNEON.kUVToG), // %5
692 [kUVBiasBGR]"r"(&kUVBiasBGR), 684 [kUVBiasBGR]"r"(&kYuvConstantsNEON.kUVBiasBGR),
693 [kYToRgb]"r"(&kYToRgb) 685 [kYToRgb]"r"(&kYuvConstantsNEON.kYToRgb)
694 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", 686 : "cc", "memory", "q0", "q1", "q2", "q3", "q4",
695 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 687 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
696 ); 688 );
697 } 689 }
698 690
699 void YUY2ToARGBRow_NEON(const uint8* src_yuy2, 691 void YUY2ToARGBRow_NEON(const uint8* src_yuy2,
700 uint8* dst_argb, 692 uint8* dst_argb,
701 int width) { 693 int width) {
702 asm volatile ( 694 asm volatile (
703 YUV422TORGB_SETUP_REG 695 YUV422TORGB_SETUP_REG
704 "1: \n" 696 "1: \n"
705 READYUY2 697 READYUY2
706 YUV422TORGB 698 YUV422TORGB
707 "subs %2, %2, #8 \n" 699 "subs %2, %2, #8 \n"
708 "vmov.u8 d23, #255 \n" 700 "vmov.u8 d23, #255 \n"
709 MEMACCESS(1) 701 MEMACCESS(1)
710 "vst4.8 {d20, d21, d22, d23}, [%1]! \n" 702 "vst4.8 {d20, d21, d22, d23}, [%1]! \n"
711 "bgt 1b \n" 703 "bgt 1b \n"
712 : "+r"(src_yuy2), // %0 704 : "+r"(src_yuy2), // %0
713 "+r"(dst_argb), // %1 705 "+r"(dst_argb), // %1
714 "+r"(width) // %2 706 "+r"(width) // %2
715 : [kUVToRB]"r"(&kUVToRB), // %3 707 : [kUVToRB]"r"(&kYuvConstantsNEON.kUVToRB), // %3
716 [kUVToG]"r"(&kUVToG), // %4 708 [kUVToG]"r"(&kYuvConstantsNEON.kUVToG), // %4
717 [kUVBiasBGR]"r"(&kUVBiasBGR), 709 [kUVBiasBGR]"r"(&kYuvConstantsNEON.kUVBiasBGR),
718 [kYToRgb]"r"(&kYToRgb) 710 [kYToRgb]"r"(&kYuvConstantsNEON.kYToRgb)
719 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", 711 : "cc", "memory", "q0", "q1", "q2", "q3", "q4",
720 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 712 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
721 ); 713 );
722 } 714 }
723 715
724 void UYVYToARGBRow_NEON(const uint8* src_uyvy, 716 void UYVYToARGBRow_NEON(const uint8* src_uyvy,
725 uint8* dst_argb, 717 uint8* dst_argb,
726 int width) { 718 int width) {
727 asm volatile ( 719 asm volatile (
728 YUV422TORGB_SETUP_REG 720 YUV422TORGB_SETUP_REG
729 "1: \n" 721 "1: \n"
730 READUYVY 722 READUYVY
731 YUV422TORGB 723 YUV422TORGB
732 "subs %2, %2, #8 \n" 724 "subs %2, %2, #8 \n"
733 "vmov.u8 d23, #255 \n" 725 "vmov.u8 d23, #255 \n"
734 MEMACCESS(1) 726 MEMACCESS(1)
735 "vst4.8 {d20, d21, d22, d23}, [%1]! \n" 727 "vst4.8 {d20, d21, d22, d23}, [%1]! \n"
736 "bgt 1b \n" 728 "bgt 1b \n"
737 : "+r"(src_uyvy), // %0 729 : "+r"(src_uyvy), // %0
738 "+r"(dst_argb), // %1 730 "+r"(dst_argb), // %1
739 "+r"(width) // %2 731 "+r"(width) // %2
740 : [kUVToRB]"r"(&kUVToRB), // %3 732 : [kUVToRB]"r"(&kYuvConstantsNEON.kUVToRB), // %3
741 [kUVToG]"r"(&kUVToG), // %4 733 [kUVToG]"r"(&kYuvConstantsNEON.kUVToG), // %4
742 [kUVBiasBGR]"r"(&kUVBiasBGR), 734 [kUVBiasBGR]"r"(&kYuvConstantsNEON.kUVBiasBGR),
743 [kYToRgb]"r"(&kYToRgb) 735 [kYToRgb]"r"(&kYuvConstantsNEON.kYToRgb)
744 : "cc", "memory", "q0", "q1", "q2", "q3", "q4", 736 : "cc", "memory", "q0", "q1", "q2", "q3", "q4",
745 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" 737 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
746 ); 738 );
747 } 739 }
748 740
749 // Reads 16 pairs of UV and write even values to dst_u and odd to dst_v. 741 // Reads 16 pairs of UV and write even values to dst_u and odd to dst_v.
750 void SplitUVRow_NEON(const uint8* src_uv, uint8* dst_u, uint8* dst_v, 742 void SplitUVRow_NEON(const uint8* src_uv, uint8* dst_u, uint8* dst_v,
751 int width) { 743 int width) {
752 asm volatile ( 744 asm volatile (
753 "1: \n" 745 "1: \n"
(...skipping 2256 matching lines...) Expand 10 before | Expand all | Expand 10 after
3010 "r"(6) // %5 3002 "r"(6) // %5
3011 : "cc", "memory", "q0", "q1" // Clobber List 3003 : "cc", "memory", "q0", "q1" // Clobber List
3012 ); 3004 );
3013 } 3005 }
3014 #endif // defined(__ARM_NEON__) && !defined(__aarch64__) 3006 #endif // defined(__ARM_NEON__) && !defined(__aarch64__)
3015 3007
3016 #ifdef __cplusplus 3008 #ifdef __cplusplus
3017 } // extern "C" 3009 } // extern "C"
3018 } // namespace libyuv 3010 } // namespace libyuv
3019 #endif 3011 #endif
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698