OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #ifndef SkNx_neon_DEFINED | 8 #ifndef SkNx_neon_DEFINED |
9 #define SkNx_neon_DEFINED | 9 #define SkNx_neon_DEFINED |
10 | 10 |
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
291 return vgetq_lane_u32(v,0) && vgetq_lane_u32(v,1) | 291 return vgetq_lane_u32(v,0) && vgetq_lane_u32(v,1) |
292 && vgetq_lane_u32(v,2) && vgetq_lane_u32(v,3); | 292 && vgetq_lane_u32(v,2) && vgetq_lane_u32(v,3); |
293 } | 293 } |
294 bool anyTrue() const { | 294 bool anyTrue() const { |
295 auto v = vreinterpretq_u32_f32(fVec); | 295 auto v = vreinterpretq_u32_f32(fVec); |
296 return vgetq_lane_u32(v,0) || vgetq_lane_u32(v,1) | 296 return vgetq_lane_u32(v,0) || vgetq_lane_u32(v,1) |
297 || vgetq_lane_u32(v,2) || vgetq_lane_u32(v,3); | 297 || vgetq_lane_u32(v,2) || vgetq_lane_u32(v,3); |
298 } | 298 } |
299 | 299 |
300 SkNf thenElse(const SkNf& t, const SkNf& e) const { | 300 SkNf thenElse(const SkNf& t, const SkNf& e) const { |
301 uint32x4_t ci = vreinterpretq_u32_f32(fVec), | 301 return vbslq_f32(vreinterpretq_u32_f32(fVec), t.fVec, e.fVec); |
302 ti = vreinterpretq_u32_f32(t.fVec), | |
303 ei = vreinterpretq_u32_f32(e.fVec); | |
304 return vreinterpretq_f32_u32(vorrq_u32(vandq_u32(ti, ci), vbicq_u32(ei,
ci))); | |
305 } | 302 } |
306 | 303 |
307 float32x4_t fVec; | 304 float32x4_t fVec; |
308 }; | 305 }; |
309 | 306 |
310 template <> | 307 template <> |
311 class SkNi<8, uint16_t> { | 308 class SkNi<8, uint16_t> { |
312 public: | 309 public: |
313 SkNi(const uint16x8_t& vec) : fVec(vec) {} | 310 SkNi(const uint16x8_t& vec) : fVec(vec) {} |
314 | 311 |
(...skipping 16 matching lines...) Expand all Loading... |
331 SkNi operator >> (int bits) const { SHIFT16(vshrq_n_u16, fVec, bits); } | 328 SkNi operator >> (int bits) const { SHIFT16(vshrq_n_u16, fVec, bits); } |
332 | 329 |
333 static SkNi Min(const SkNi& a, const SkNi& b) { return vminq_u16(a.fVec, b.f
Vec); } | 330 static SkNi Min(const SkNi& a, const SkNi& b) { return vminq_u16(a.fVec, b.f
Vec); } |
334 | 331 |
335 template <int k> uint16_t kth() const { | 332 template <int k> uint16_t kth() const { |
336 SkASSERT(0 <= k && k < 8); | 333 SkASSERT(0 <= k && k < 8); |
337 return vgetq_lane_u16(fVec, k&7); | 334 return vgetq_lane_u16(fVec, k&7); |
338 } | 335 } |
339 | 336 |
340 SkNi thenElse(const SkNi& t, const SkNi& e) const { | 337 SkNi thenElse(const SkNi& t, const SkNi& e) const { |
341 return vorrq_u16(vandq_u16(t.fVec, fVec), | 338 return vbslq_u16(fVec, t.fVec, e.fVec); |
342 vbicq_u16(e.fVec, fVec)); | |
343 } | 339 } |
344 | 340 |
345 uint16x8_t fVec; | 341 uint16x8_t fVec; |
346 }; | 342 }; |
347 | 343 |
348 template <> | 344 template <> |
349 class SkNi<16, uint8_t> { | 345 class SkNi<16, uint8_t> { |
350 public: | 346 public: |
351 SkNi(const uint8x16_t& vec) : fVec(vec) {} | 347 SkNi(const uint8x16_t& vec) : fVec(vec) {} |
352 | 348 |
(...skipping 17 matching lines...) Expand all Loading... |
370 | 366 |
371 static SkNi Min(const SkNi& a, const SkNi& b) { return vminq_u8(a.fVec, b.fV
ec); } | 367 static SkNi Min(const SkNi& a, const SkNi& b) { return vminq_u8(a.fVec, b.fV
ec); } |
372 SkNi operator < (const SkNi& o) const { return vcltq_u8(fVec, o.fVec); } | 368 SkNi operator < (const SkNi& o) const { return vcltq_u8(fVec, o.fVec); } |
373 | 369 |
374 template <int k> uint8_t kth() const { | 370 template <int k> uint8_t kth() const { |
375 SkASSERT(0 <= k && k < 15); | 371 SkASSERT(0 <= k && k < 15); |
376 return vgetq_lane_u8(fVec, k&16); | 372 return vgetq_lane_u8(fVec, k&16); |
377 } | 373 } |
378 | 374 |
379 SkNi thenElse(const SkNi& t, const SkNi& e) const { | 375 SkNi thenElse(const SkNi& t, const SkNi& e) const { |
380 return vorrq_u8(vandq_u8(t.fVec, fVec), | 376 return vbslq_u8(fVec, t.fVec, e.fVec); |
381 vbicq_u8(e.fVec, fVec)); | |
382 } | 377 } |
383 | 378 |
384 uint8x16_t fVec; | 379 uint8x16_t fVec; |
385 }; | 380 }; |
386 | 381 |
387 #undef SHIFT32 | 382 #undef SHIFT32 |
388 #undef SHIFT16 | 383 #undef SHIFT16 |
389 #undef SHIFT8 | 384 #undef SHIFT8 |
390 | 385 |
391 } // namespace | 386 } // namespace |
392 | 387 |
393 #endif//SkNx_neon_DEFINED | 388 #endif//SkNx_neon_DEFINED |
OLD | NEW |