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

Side by Side Diff: src/opts/SkNx_neon.h

Issue 1255913004: NEON has a ternary instruction. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 4 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 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
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
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
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
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