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