Lines Matching refs:SkNx
38 class SkNx<2, float> {
40 AI SkNx(const __m128& vec) : fVec(vec) {}
42 AI SkNx() {}
43 AI SkNx(float val) : fVec(_mm_set1_ps(val)) {}
44 AI static SkNx Load(const void* ptr) {
47 AI SkNx(float a, float b) : fVec(_mm_setr_ps(a,b,0,0)) {}
51 AI static void Load2(const void* ptr, SkNx* x, SkNx* y) {
53 *x = SkNx{m[0], m[2]};
54 *y = SkNx{m[1], m[3]};
57 AI static void Store2(void* dst, const SkNx& a, const SkNx& b) {
62 AI static void Store3(void* dst, const SkNx& a, const SkNx& b, const SkNx& c) {
69 AI static void Store4(void* dst, const SkNx& a, const SkNx& b, const SkNx& c, const SkNx& d) {
76 AI SkNx operator - () const { return _mm_xor_ps(_mm_set1_ps(-0.0f), fVec); }
78 AI SkNx operator + (const SkNx& o) const { return _mm_add_ps(fVec, o.fVec); }
79 AI SkNx operator - (const SkNx& o) const { return _mm_sub_ps(fVec, o.fVec); }
80 AI SkNx operator * (const SkNx& o) const { return _mm_mul_ps(fVec, o.fVec); }
81 AI SkNx operator / (const SkNx& o) const { return _mm_div_ps(fVec, o.fVec); }
83 AI SkNx operator == (const SkNx& o) const { return _mm_cmpeq_ps (fVec, o.fVec); }
84 AI SkNx operator != (const SkNx& o) const { return _mm_cmpneq_ps(fVec, o.fVec); }
85 AI SkNx operator < (const SkNx& o) const { return _mm_cmplt_ps (fVec, o.fVec); }
86 AI SkNx operator > (const SkNx& o) const { return _mm_cmpgt_ps (fVec, o.fVec); }
87 AI SkNx operator <= (const SkNx& o) const { return _mm_cmple_ps (fVec, o.fVec); }
88 AI SkNx operator >= (const SkNx& o) const { return _mm_cmpge_ps (fVec, o.fVec); }
90 AI static SkNx Min(const SkNx& l, const SkNx& r) { return _mm_min_ps(l.fVec, r.fVec); }
91 AI static SkNx Max(const SkNx& l, const SkNx& r) { return _mm_max_ps(l.fVec, r.fVec); }
93 AI SkNx abs() const { return _mm_andnot_ps(_mm_set1_ps(-0.0f), fVec); }
94 AI SkNx floor() const {
102 AI SkNx sqrt() const { return _mm_sqrt_ps (fVec); }
113 AI SkNx thenElse(const SkNx& t, const SkNx& e) const {
126 class SkNx<4, float> {
128 AI SkNx(const __m128& vec) : fVec(vec) {}
130 AI SkNx() {}
131 AI SkNx(float val) : fVec( _mm_set1_ps(val) ) {}
132 AI SkNx(float a, float b, float c, float d) : fVec(_mm_setr_ps(a,b,c,d)) {}
134 AI static SkNx Load(const void* ptr) { return _mm_loadu_ps((const float*)ptr); }
137 AI static void Load2(const void* ptr, SkNx* x, SkNx* y) {
138 SkNx lo = SkNx::Load((const float*)ptr+0),
139 hi = SkNx::Load((const float*)ptr+4);
140 *x = SkNx{lo[0], lo[2], hi[0], hi[2]};
141 *y = SkNx{lo[1], lo[3], hi[1], hi[3]};
144 AI static void Load4(const void* ptr, SkNx* r, SkNx* g, SkNx* b, SkNx* a) {
155 AI static void Store4(void* dst, const SkNx& r, const SkNx& g, const SkNx& b, const SkNx& a) {
167 AI SkNx operator - () const { return _mm_xor_ps(_mm_set1_ps(-0.0f), fVec); }
169 AI SkNx operator + (const SkNx& o) const { return _mm_add_ps(fVec, o.fVec); }
170 AI SkNx operator - (const SkNx& o) const { return _mm_sub_ps(fVec, o.fVec); }
171 AI SkNx operator * (const SkNx& o) const { return _mm_mul_ps(fVec, o.fVec); }
172 AI SkNx operator / (const SkNx& o) const { return _mm_div_ps(fVec, o.fVec); }
174 AI SkNx operator == (const SkNx& o) const { return _mm_cmpeq_ps (fVec, o.fVec); }
175 AI SkNx operator != (const SkNx& o) const { return _mm_cmpneq_ps(fVec, o.fVec); }
176 AI SkNx operator < (const SkNx& o) const { return _mm_cmplt_ps (fVec, o.fVec); }
177 AI SkNx operator > (const SkNx& o) const { return _mm_cmpgt_ps (fVec, o.fVec); }
178 AI SkNx operator <= (const SkNx& o) const { return _mm_cmple_ps (fVec, o.fVec); }
179 AI SkNx operator >= (const SkNx& o) const { return _mm_cmpge_ps (fVec, o.fVec); }
181 AI static SkNx Min(const SkNx& l, const SkNx& r) { return _mm_min_ps(l.fVec, r.fVec); }
182 AI static SkNx Max(const SkNx& l, const SkNx& r) { return _mm_max_ps(l.fVec, r.fVec); }
184 AI SkNx abs() const { return _mm_andnot_ps(_mm_set1_ps(-0.0f), fVec); }
185 AI SkNx floor() const {
193 AI SkNx sqrt() const { return _mm_sqrt_ps (fVec); }
202 SkNx min = Min(*this, _mm_shuffle_ps(fVec, fVec, _MM_SHUFFLE(2,3,0,1)));
208 SkNx max = Max(*this, _mm_shuffle_ps(fVec, fVec, _MM_SHUFFLE(2,3,0,1)));
216 AI SkNx thenElse(const SkNx& t, const SkNx& e) const {
240 class SkNx<4, int32_t> {
242 AI SkNx(const __m128i& vec) : fVec(vec) {}
244 AI SkNx() {}
245 AI SkNx(int32_t val) : fVec(_mm_set1_epi32(val)) {}
246 AI static SkNx Load(const void* ptr) { return _mm_loadu_si128((const __m128i*)ptr); }
247 AI SkNx(int32_t a, int32_t b, int32_t c, int32_t d) : fVec(_mm_setr_epi32(a,b,c,d)) {}
251 AI SkNx operator + (const SkNx& o) const { return _mm_add_epi32(fVec, o.fVec); }
252 AI SkNx operator - (const SkNx& o) const { return _mm_sub_epi32(fVec, o.fVec); }
253 AI SkNx operator * (const SkNx& o) const { return mullo32(fVec, o.fVec); }
255 AI SkNx operator & (const SkNx& o) const { return _mm_and_si128(fVec, o.fVec); }
256 AI SkNx operator | (const SkNx& o) const { return _mm_or_si128(fVec, o.fVec); }
257 AI SkNx operator ^ (const SkNx& o) const { return _mm_xor_si128(fVec, o.fVec); }
259 AI SkNx operator << (int bits) const { return _mm_slli_epi32(fVec, bits); }
260 AI SkNx operator >> (int bits) const { return _mm_srai_epi32(fVec, bits); }
262 AI SkNx operator == (const SkNx& o) const { return _mm_cmpeq_epi32 (fVec, o.fVec); }
263 AI SkNx operator < (const SkNx& o) const { return _mm_cmplt_epi32 (fVec, o.fVec); }
264 AI SkNx operator > (const SkNx& o) const { return _mm_cmpgt_epi32 (fVec, o.fVec); }
272 AI SkNx thenElse(const SkNx& t, const SkNx& e) const {
281 AI SkNx abs() const {
285 SkNx mask = (*this) >> 31;
290 AI static SkNx Min(const SkNx& x, const SkNx& y) {
298 AI static SkNx Max(const SkNx& x, const SkNx& y) {
310 class SkNx<2, uint32_t> {
312 AI SkNx(const __m128i& vec) : fVec(vec) {}
314 AI SkNx() {}
315 AI SkNx(uint32_t val) : fVec(_mm_set1_epi32((int)val)) {}
316 AI static SkNx Load(const void* ptr) { return _mm_loadl_epi64((const __m128i*)ptr); }
317 AI SkNx(uint32_t a, uint32_t b) : fVec(_mm_setr_epi32((int)a,(int)b,0,0)) {}
321 AI SkNx operator + (const SkNx& o) const { return _mm_add_epi32(fVec, o.fVec); }
322 AI SkNx operator - (const SkNx& o) const { return _mm_sub_epi32(fVec, o.fVec); }
323 AI SkNx operator * (const SkNx& o) const { return mullo32(fVec, o.fVec); }
325 AI SkNx operator & (const SkNx& o) const { return _mm_and_si128(fVec, o.fVec); }
326 AI SkNx operator | (const SkNx& o) const { return _mm_or_si128(fVec, o.fVec); }
327 AI SkNx operator ^ (const SkNx& o) const { return _mm_xor_si128(fVec, o.fVec); }
329 AI SkNx operator << (int bits) const { return _mm_slli_epi32(fVec, bits); }
330 AI SkNx operator >> (int bits) const { return _mm_srli_epi32(fVec, bits); }
332 AI SkNx operator == (const SkNx& o) const { return _mm_cmpeq_epi32 (fVec, o.fVec); }
333 AI SkNx operator != (const SkNx& o) const { return (*this == o) ^ 0xffffffff; }
342 AI SkNx thenElse(const SkNx& t, const SkNx& e) const {
357 class SkNx<4, uint32_t> {
359 AI SkNx(const __m128i& vec) : fVec(vec) {}
361 AI SkNx() {}
362 AI SkNx(uint32_t val) : fVec(_mm_set1_epi32((int)val)) {}
363 AI static SkNx Load(const void* ptr) { return _mm_loadu_si128((const __m128i*)ptr); }
364 AI SkNx(uint32_t a, uint32_t b, uint32_t c, uint32_t d)
369 AI SkNx operator + (const SkNx& o) const { return _mm_add_epi32(fVec, o.fVec); }
370 AI SkNx operator - (const SkNx& o) const { return _mm_sub_epi32(fVec, o.fVec); }
371 AI SkNx operator * (const SkNx& o) const { return mullo32(fVec, o.fVec); }
373 AI SkNx operator & (const SkNx& o) const { return _mm_and_si128(fVec, o.fVec); }
374 AI SkNx operator | (const SkNx& o) const { return _mm_or_si128(fVec, o.fVec); }
375 AI SkNx operator ^ (const SkNx& o) const { return _mm_xor_si128(fVec, o.fVec); }
377 AI SkNx operator << (int bits) const { return _mm_slli_epi32(fVec, bits); }
378 AI SkNx operator >> (int bits) const { return _mm_srli_epi32(fVec, bits); }
380 AI SkNx operator == (const SkNx& o) const { return _mm_cmpeq_epi32 (fVec, o.fVec); }
381 AI SkNx operator != (const SkNx& o) const { return (*this == o) ^ 0xffffffff; }
391 AI SkNx thenElse(const SkNx& t, const SkNx& e) const {
400 AI SkNx mulHi(SkNx m) const {
401 SkNx v20{_mm_mul_epu32(m.fVec, fVec)};
402 SkNx v31{_mm_mul_epu32(_mm_srli_si128(m.fVec, 4), _mm_srli_si128(fVec, 4))};
404 return SkNx{v20[1], v31[1], v20[3], v31[3]};
411 class SkNx<4, uint16_t> {
413 AI SkNx(const __m128i& vec) : fVec(vec) {}
415 AI SkNx() {}
416 AI SkNx(uint16_t val) : fVec(_mm_set1_epi16((short)val)) {}
417 AI SkNx(uint16_t a, uint16_t b, uint16_t c, uint16_t d)
420 AI static SkNx Load(const void* ptr) { return _mm_loadl_epi64((const __m128i*)ptr); }
423 AI static void Load4(const void* ptr, SkNx* r, SkNx* g, SkNx* b, SkNx* a) {
435 AI static void Load3(const void* ptr, SkNx* r, SkNx* g, SkNx* b) {
451 AI static void Store4(void* dst, const SkNx& r, const SkNx& g, const SkNx& b, const SkNx& a) {
460 AI SkNx operator + (const SkNx& o) const { return _mm_add_epi16(fVec, o.fVec); }
461 AI SkNx operator - (const SkNx& o) const { return _mm_sub_epi16(fVec, o.fVec); }
462 AI SkNx operator * (const SkNx& o) const { return _mm_mullo_epi16(fVec, o.fVec); }
463 AI SkNx operator & (const SkNx& o) const { return _mm_and_si128(fVec, o.fVec); }
464 AI SkNx operator | (const SkNx& o) const { return _mm_or_si128(fVec, o.fVec); }
466 AI SkNx operator << (int bits) const { return _mm_slli_epi16(fVec, bits); }
467 AI SkNx operator >> (int bits) const { return _mm_srli_epi16(fVec, bits); }
479 class SkNx<8, uint16_t> {
481 AI SkNx(const __m128i& vec) : fVec(vec) {}
483 AI SkNx() {}
484 AI SkNx(uint16_t val) : fVec(_mm_set1_epi16((short)val)) {}
485 AI SkNx(uint16_t a, uint16_t b, uint16_t c, uint16_t d,
490 AI static SkNx Load(const void* ptr) { return _mm_loadu_si128((const __m128i*)ptr); }
493 AI static void Load4(const void* ptr, SkNx* r, SkNx* g, SkNx* b, SkNx* a) {
514 AI static void Load3(const void* ptr, SkNx* r, SkNx* g, SkNx* b) {
539 AI static void Store4(void* ptr, const SkNx& r, const SkNx& g, const SkNx& b, const SkNx& a) {
551 AI SkNx operator + (const SkNx& o) const { return _mm_add_epi16(fVec, o.fVec); }
552 AI SkNx operator - (const SkNx& o) const { return _mm_sub_epi16(fVec, o.fVec); }
553 AI SkNx operator * (const SkNx& o) const { return _mm_mullo_epi16(fVec, o.fVec); }
554 AI SkNx operator & (const SkNx& o) const { return _mm_and_si128(fVec, o.fVec); }
555 AI SkNx operator | (const SkNx& o) const { return _mm_or_si128(fVec, o.fVec); }
557 AI SkNx operator << (int bits) const { return _mm_slli_epi16(fVec, bits); }
558 AI SkNx operator >> (int bits) const { return _mm_srli_epi16(fVec, bits); }
560 AI static SkNx Min(const SkNx& a, const SkNx& b) {
569 AI SkNx mulHi(const SkNx& m) const {
573 AI SkNx thenElse(const SkNx& t, const SkNx& e) const {
588 class SkNx<4, uint8_t> {
590 AI SkNx() {}
591 AI SkNx(const __m128i& vec) : fVec(vec) {}
592 AI SkNx(uint8_t a, uint8_t b, uint8_t c, uint8_t d)
595 AI static SkNx Load(const void* ptr) { return _mm_cvtsi32_si128(*(const int*)ptr); }
610 class SkNx<8, uint8_t> {
612 AI SkNx(const __m128i& vec) : fVec(vec) {}
614 AI SkNx() {}
615 AI SkNx(uint8_t val) : fVec(_mm_set1_epi8((char)val)) {}
616 AI static SkNx Load(const void* ptr) { return _mm_loadl_epi64((const __m128i*)ptr); }
617 AI SkNx(uint8_t a, uint8_t b, uint8_t c, uint8_t d,
625 AI SkNx saturatedAdd(const SkNx& o) const { return _mm_adds_epu8(fVec, o.fVec); }
627 AI SkNx operator + (const SkNx& o) const { return _mm_add_epi8(fVec, o.fVec); }
628 AI SkNx operator - (const SkNx& o) const { return _mm_sub_epi8(fVec, o.fVec); }
630 AI static SkNx Min(const SkNx& a, const SkNx& b) { return _mm_min_epu8(a.fVec, b.fVec); }
631 AI SkNx operator < (const SkNx& o) const {
643 AI SkNx thenElse(const SkNx& t, const SkNx& e) const {
652 class SkNx<16, uint8_t> {
654 AI SkNx(const __m128i& vec) : fVec(vec) {}
656 AI SkNx() {}
657 AI SkNx(uint8_t val) : fVec(_mm_set1_epi8((char)val)) {}
658 AI static SkNx Load(const void* ptr) { return _mm_loadu_si128((const __m128i*)ptr); }
659 AI SkNx(uint8_t a, uint8_t b, uint8_t c, uint8_t d,
670 AI SkNx saturatedAdd(const SkNx& o) const { return _mm_adds_epu8(fVec, o.fVec); }
672 AI SkNx operator + (const SkNx& o) const { return _mm_add_epi8(fVec, o.fVec); }
673 AI SkNx operator - (const SkNx& o) const { return _mm_sub_epi8(fVec, o.fVec); }
674 AI SkNx operator & (const SkNx& o) const { return _mm_and_si128(fVec, o.fVec); }
676 AI static SkNx Min(const SkNx& a, const SkNx& b) { return _mm_min_epu8(a.fVec, b.fVec); }
677 AI SkNx operator < (const SkNx& o) const {
689 AI SkNx thenElse(const SkNx& t, const SkNx& e) const {