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 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
178 template <int k> float kth() const { | 178 template <int k> float kth() const { |
179 SkASSERT(0 <= k && k < 4); | 179 SkASSERT(0 <= k && k < 4); |
180 union { __m128 v; float fs[4]; } pun = {fVec}; | 180 union { __m128 v; float fs[4]; } pun = {fVec}; |
181 return pun.fs[k&3]; | 181 return pun.fs[k&3]; |
182 } | 182 } |
183 | 183 |
184 protected: | 184 protected: |
185 __m128 fVec; | 185 __m128 fVec; |
186 }; | 186 }; |
187 | 187 |
| 188 template <> |
| 189 class SkNi<4, uint16_t> { |
| 190 public: |
| 191 SkNi(const __m128i& vec) : fVec(vec) {} |
| 192 |
| 193 SkNi() {} |
| 194 explicit SkNi(uint16_t val) : fVec(_mm_set1_epi16(val)) {} |
| 195 static SkNi Load(const uint16_t vals[4]) { return _mm_loadl_epi64((const __m
128i*)vals); } |
| 196 SkNi(uint16_t a, uint16_t b, uint16_t c, uint16_t d) : fVec(_mm_setr_epi16(a
,b,c,d,0,0,0,0)) {} |
| 197 |
| 198 void store(uint16_t vals[4]) const { _mm_storel_epi64((__m128i*)vals, fVec);
} |
| 199 |
| 200 SkNi operator + (const SkNi& o) const { return _mm_add_epi16(fVec, o.fVec);
} |
| 201 SkNi operator - (const SkNi& o) const { return _mm_sub_epi16(fVec, o.fVec);
} |
| 202 SkNi operator * (const SkNi& o) const { return _mm_mullo_epi16(fVec, o.fVec)
; } |
| 203 |
| 204 SkNi operator << (int bits) const { return _mm_slli_epi16(fVec, bits); } |
| 205 SkNi operator >> (int bits) const { return _mm_srli_epi16(fVec, bits); } |
| 206 |
| 207 template <int k> uint16_t kth() const { |
| 208 SkASSERT(0 <= k && k < 4); |
| 209 return _mm_extract_epi16(fVec, k); |
| 210 } |
| 211 protected: |
| 212 __m128i fVec; |
| 213 }; |
| 214 |
| 215 template <> |
| 216 class SkNi<8, uint16_t> { |
| 217 public: |
| 218 SkNi(const __m128i& vec) : fVec(vec) {} |
| 219 |
| 220 SkNi() {} |
| 221 explicit SkNi(uint16_t val) : fVec(_mm_set1_epi16(val)) {} |
| 222 static SkNi Load(const uint16_t vals[8]) { return _mm_loadu_si128((const __m
128i*)vals); } |
| 223 SkNi(uint16_t a, uint16_t b, uint16_t c, uint16_t d, |
| 224 uint16_t e, uint16_t f, uint16_t g, uint16_t h) : fVec(_mm_setr_epi16(a
,b,c,d,e,f,g,h)) {} |
| 225 |
| 226 void store(uint16_t vals[8]) const { _mm_storeu_si128((__m128i*)vals, fVec);
} |
| 227 |
| 228 SkNi operator + (const SkNi& o) const { return _mm_add_epi16(fVec, o.fVec);
} |
| 229 SkNi operator - (const SkNi& o) const { return _mm_sub_epi16(fVec, o.fVec);
} |
| 230 SkNi operator * (const SkNi& o) const { return _mm_mullo_epi16(fVec, o.fVec)
; } |
| 231 |
| 232 SkNi operator << (int bits) const { return _mm_slli_epi16(fVec, bits); } |
| 233 SkNi operator >> (int bits) const { return _mm_srli_epi16(fVec, bits); } |
| 234 |
| 235 template <int k> uint16_t kth() const { |
| 236 SkASSERT(0 <= k && k < 8); |
| 237 return _mm_extract_epi16(fVec, k); |
| 238 } |
| 239 protected: |
| 240 __m128i fVec; |
| 241 }; |
188 | 242 |
189 #endif//SkNx_sse_DEFINED | 243 #endif//SkNx_sse_DEFINED |
OLD | NEW |