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 |