| 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 |