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 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
304 uint8_t m, uint8_t n, uint8_t o, uint8_t p) | 304 uint8_t m, uint8_t n, uint8_t o, uint8_t p) |
305 : fVec(_mm_setr_epi8(a,b,c,d, e,f,g,h, i,j,k,l, m,n,o,p)) {} | 305 : fVec(_mm_setr_epi8(a,b,c,d, e,f,g,h, i,j,k,l, m,n,o,p)) {} |
306 | 306 |
307 void store(uint8_t vals[16]) const { _mm_storeu_si128((__m128i*)vals, fVec);
} | 307 void store(uint8_t vals[16]) const { _mm_storeu_si128((__m128i*)vals, fVec);
} |
308 | 308 |
309 SkNi saturatedAdd(const SkNi& o) const { return _mm_adds_epu8(fVec, o.fVec);
} | 309 SkNi saturatedAdd(const SkNi& o) const { return _mm_adds_epu8(fVec, o.fVec);
} |
310 | 310 |
311 SkNi operator + (const SkNi& o) const { return _mm_add_epi8(fVec, o.fVec); } | 311 SkNi operator + (const SkNi& o) const { return _mm_add_epi8(fVec, o.fVec); } |
312 SkNi operator - (const SkNi& o) const { return _mm_sub_epi8(fVec, o.fVec); } | 312 SkNi operator - (const SkNi& o) const { return _mm_sub_epi8(fVec, o.fVec); } |
313 | 313 |
314 // SSE cannot multiply or shift vectors of uint8_t. | |
315 SkNi operator * (const SkNi& o) const { SkASSERT(false); return fVec; } | |
316 SkNi operator << (int bits) const { SkASSERT(false); return fVec; } | |
317 SkNi operator >> (int bits) const { SkASSERT(false); return fVec; } | |
318 | |
319 static SkNi Min(const SkNi& a, const SkNi& b) { return _mm_min_epu8(a.fVec,
b.fVec); } | 314 static SkNi Min(const SkNi& a, const SkNi& b) { return _mm_min_epu8(a.fVec,
b.fVec); } |
320 | 315 |
321 template <int k> uint8_t kth() const { | 316 template <int k> uint8_t kth() const { |
322 SkASSERT(0 <= k && k < 16); | 317 SkASSERT(0 <= k && k < 16); |
323 // SSE4.1 would just `return _mm_extract_epi8(fVec, k)`. We have to rea
d 16-bits instead. | 318 // SSE4.1 would just `return _mm_extract_epi8(fVec, k)`. We have to rea
d 16-bits instead. |
324 int pair = _mm_extract_epi16(fVec, k/2); | 319 int pair = _mm_extract_epi16(fVec, k/2); |
325 return k % 2 == 0 ? pair : (pair >> 8); | 320 return k % 2 == 0 ? pair : (pair >> 8); |
326 } | 321 } |
327 | 322 |
328 __m128i fVec; | 323 __m128i fVec; |
329 }; | 324 }; |
330 | 325 |
331 } // namespace | 326 } // namespace |
332 | 327 |
333 #endif//SkNx_sse_DEFINED | 328 #endif//SkNx_sse_DEFINED |
OLD | NEW |