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 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |