Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Side by Side Diff: src/opts/SkNx_sse.h

Issue 1679343003: restore sk4i SSE specialization (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698