| 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_sse_DEFINED | 8 #ifndef SkNx_sse_DEFINED |
| 9 #define SkNx_sse_DEFINED | 9 #define SkNx_sse_DEFINED |
| 10 | 10 |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 | 113 |
| 114 SkNx thenElse(const SkNx& t, const SkNx& e) const { | 114 SkNx thenElse(const SkNx& t, const SkNx& e) const { |
| 115 return _mm_or_ps(_mm_and_ps (fVec, t.fVec), | 115 return _mm_or_ps(_mm_and_ps (fVec, t.fVec), |
| 116 _mm_andnot_ps(fVec, e.fVec)); | 116 _mm_andnot_ps(fVec, e.fVec)); |
| 117 } | 117 } |
| 118 | 118 |
| 119 __m128 fVec; | 119 __m128 fVec; |
| 120 }; | 120 }; |
| 121 | 121 |
| 122 template <> | 122 template <> |
| 123 class SkNx<4, int> { |
| 124 public: |
| 125 SkNx(const __m128i& vec) : fVec(vec) {} |
| 126 |
| 127 SkNx() {} |
| 128 SkNx(int val) : fVec(_mm_set1_epi32(val)) {} |
| 129 static SkNx Load(const void* ptr) { return _mm_loadu_si128((const __m128i*)p
tr); } |
| 130 SkNx(int a, int b, int c, int d) : fVec(_mm_setr_epi32(a,b,c,d)) {} |
| 131 |
| 132 void store(void* ptr) const { _mm_storeu_si128((__m128i*)ptr, fVec); } |
| 133 |
| 134 SkNx operator + (const SkNx& o) const { return _mm_add_epi32(fVec, o.fVec);
} |
| 135 SkNx operator - (const SkNx& o) const { return _mm_sub_epi32(fVec, o.fVec);
} |
| 136 SkNx operator * (const SkNx& o) const { |
| 137 __m128i mul20 = _mm_mul_epu32(fVec, o.fVec), |
| 138 mul31 = _mm_mul_epu32(_mm_srli_si128(fVec, 4), _mm_srli_si128(o.
fVec, 4)); |
| 139 return _mm_unpacklo_epi32(_mm_shuffle_epi32(mul20, _MM_SHUFFLE(0,0,2,0))
, |
| 140 _mm_shuffle_epi32(mul31, _MM_SHUFFLE(0,0,2,0))
); |
| 141 } |
| 142 |
| 143 SkNx operator << (int bits) const { return _mm_slli_epi32(fVec, bits); } |
| 144 SkNx operator >> (int bits) const { return _mm_srai_epi32(fVec, bits); } |
| 145 |
| 146 int operator[](int k) const { |
| 147 SkASSERT(0 <= k && k < 4); |
| 148 union { __m128i v; int is[4]; } pun = {fVec}; |
| 149 return pun.is[k&3]; |
| 150 } |
| 151 template <int k> int kth() const { return (*this)[k]; } |
| 152 |
| 153 __m128i fVec; |
| 154 }; |
| 155 |
| 156 template <> |
| 123 class SkNx<4, uint16_t> { | 157 class SkNx<4, uint16_t> { |
| 124 public: | 158 public: |
| 125 SkNx(const __m128i& vec) : fVec(vec) {} | 159 SkNx(const __m128i& vec) : fVec(vec) {} |
| 126 | 160 |
| 127 SkNx() {} | 161 SkNx() {} |
| 128 SkNx(uint16_t val) : fVec(_mm_set1_epi16(val)) {} | 162 SkNx(uint16_t val) : fVec(_mm_set1_epi16(val)) {} |
| 129 static SkNx Load(const void* ptr) { return _mm_loadl_epi64((const __m128i*)p
tr); } | 163 static SkNx Load(const void* ptr) { return _mm_loadl_epi64((const __m128i*)p
tr); } |
| 130 SkNx(uint16_t a, uint16_t b, uint16_t c, uint16_t d) : fVec(_mm_setr_epi16(a
,b,c,d,0,0,0,0)) {} | 164 SkNx(uint16_t a, uint16_t b, uint16_t c, uint16_t d) : fVec(_mm_setr_epi16(a
,b,c,d,0,0,0,0)) {} |
| 131 | 165 |
| 132 void store(void* ptr) const { _mm_storel_epi64((__m128i*)ptr, fVec); } | 166 void store(void* ptr) const { _mm_storel_epi64((__m128i*)ptr, fVec); } |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 302 | 336 |
| 303 template<> /*static*/ inline Sk4h SkNx_cast<uint16_t, uint8_t>(const Sk4b& src)
{ | 337 template<> /*static*/ inline Sk4h SkNx_cast<uint16_t, uint8_t>(const Sk4b& src)
{ |
| 304 return _mm_unpacklo_epi8(src.fVec, _mm_setzero_si128()); | 338 return _mm_unpacklo_epi8(src.fVec, _mm_setzero_si128()); |
| 305 } | 339 } |
| 306 | 340 |
| 307 template<> /*static*/ inline Sk4b SkNx_cast<uint8_t, uint16_t>(const Sk4h& src)
{ | 341 template<> /*static*/ inline Sk4b SkNx_cast<uint8_t, uint16_t>(const Sk4h& src)
{ |
| 308 return _mm_packus_epi16(src.fVec, src.fVec); | 342 return _mm_packus_epi16(src.fVec, src.fVec); |
| 309 } | 343 } |
| 310 | 344 |
| 311 #endif//SkNx_sse_DEFINED | 345 #endif//SkNx_sse_DEFINED |
| OLD | NEW |