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

Side by Side Diff: src/core/SkNx.h

Issue 1088883005: Sk4h and Sk8h for SSE (Closed) Base URL: https://skia.googlesource.com/skia@master
Patch Set: Created 5 years, 8 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 | src/opts/SkNx_sse.h » ('j') | 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_DEFINED 8 #ifndef SkNx_DEFINED
9 #define SkNx_DEFINED 9 #define SkNx_DEFINED
10 10
(...skipping 18 matching lines...) Expand all
29 29
30 bool allTrue() const { return fLo.allTrue() && fHi.allTrue(); } 30 bool allTrue() const { return fLo.allTrue() && fHi.allTrue(); }
31 bool anyTrue() const { return fLo.anyTrue() || fHi.anyTrue(); } 31 bool anyTrue() const { return fLo.anyTrue() || fHi.anyTrue(); }
32 32
33 private: 33 private:
34 REQUIRE(0 == (N & (N-1))); 34 REQUIRE(0 == (N & (N-1)));
35 SkNb<N/2, Bytes> fLo, fHi; 35 SkNb<N/2, Bytes> fLo, fHi;
36 }; 36 };
37 37
38 template <int N, typename T> 38 template <int N, typename T>
39 class SkNi {
40 public:
41 SkNi() {}
42 explicit SkNi(T val) : fLo(val), fHi(val) {}
43 static SkNi Load(const T vals[N]) {
44 return SkNi(SkNi<N/2,T>::Load(vals), SkNi<N/2,T>::Load(vals+N/2));
45 }
46
47 SkNi(T a, T b) : fLo(a), fHi(b) { REQUIRE(N==2); }
48 SkNi(T a, T b, T c, T d) : fLo(a,b), fHi(c,d) { REQUIRE(N==4); }
49 SkNi(T a, T b, T c, T d, T e, T f, T g, T h) : fLo(a,b,c,d), fHi(e,f,g,h) { REQUIRE(N==8); }
50
51 void store(T vals[N]) const {
52 fLo.store(vals);
53 fHi.store(vals+N/2);
54 }
55
56 SkNi operator + (const SkNi& o) const { return SkNi(fLo + o.fLo, fHi + o.fHi ); }
57 SkNi operator - (const SkNi& o) const { return SkNi(fLo - o.fLo, fHi - o.fHi ); }
58 SkNi operator * (const SkNi& o) const { return SkNi(fLo * o.fLo, fHi * o.fHi ); }
59
60 SkNi operator << (int bits) const { return SkNi(fLo << bits, fHi << bits); }
61 SkNi operator >> (int bits) const { return SkNi(fLo >> bits, fHi >> bits); }
62
63 // TODO: comparisons, min, max?
64
65 template <int k> T kth() const {
66 SkASSERT(0 <= k && k < N);
67 return k < N/2 ? fLo.template kth<k>() : fHi.template kth<k-N/2>();
68 }
69
70 private:
71 REQUIRE(0 == (N & (N-1)));
72 SkNi(const SkNi<N/2, T>& lo, const SkNi<N/2, T>& hi) : fLo(lo), fHi(hi) {}
73
74 SkNi<N/2, T> fLo, fHi;
75 };
76
77 template <int N, typename T>
39 class SkNf { 78 class SkNf {
40 typedef SkNb<N, sizeof(T)> Nb; 79 typedef SkNb<N, sizeof(T)> Nb;
41 public: 80 public:
42 SkNf() {} 81 SkNf() {}
43 explicit SkNf(T val) : fLo(val), fHi(val) {} 82 explicit SkNf(T val) : fLo(val), fHi(val) {}
44 static SkNf Load(const T vals[N]) { 83 static SkNf Load(const T vals[N]) {
45 return SkNf(SkNf<N/2,T>::Load(vals), SkNf<N/2,T>::Load(vals+N/2)); 84 return SkNf(SkNf<N/2,T>::Load(vals), SkNf<N/2,T>::Load(vals+N/2));
46 } 85 }
47 86
48 SkNf(T a, T b) : fLo(a), fHi(b) { REQUIRE(N==2); } 87 SkNf(T a, T b) : fLo(a), fHi(b) { REQUIRE(N==2); }
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 public: 138 public:
100 SkNb() {} 139 SkNb() {}
101 explicit SkNb(bool val) : fVal(val) {} 140 explicit SkNb(bool val) : fVal(val) {}
102 bool allTrue() const { return fVal; } 141 bool allTrue() const { return fVal; }
103 bool anyTrue() const { return fVal; } 142 bool anyTrue() const { return fVal; }
104 private: 143 private:
105 bool fVal; 144 bool fVal;
106 }; 145 };
107 146
108 template <typename T> 147 template <typename T>
148 class SkNi<1,T> {
149 public:
150 SkNi() {}
151 explicit SkNi(T val) : fVal(val) {}
152 static SkNi Load(const T vals[1]) { return SkNi(vals[0]); }
153
154 void store(T vals[1]) const { vals[0] = fVal; }
155
156 SkNi operator + (const SkNi& o) const { return SkNi(fVal + o.fVal); }
157 SkNi operator - (const SkNi& o) const { return SkNi(fVal - o.fVal); }
158 SkNi operator * (const SkNi& o) const { return SkNi(fVal * o.fVal); }
159
160 SkNi operator << (int bits) const { return SkNi(fVal << bits); }
161 SkNi operator >> (int bits) const { return SkNi(fVal >> bits); }
162
163 template <int k> T kth() const {
164 SkASSERT(0 == k);
165 return fVal;
166 }
167
168 private:
169 T fVal;
170 };
171
172 template <typename T>
109 class SkNf<1,T> { 173 class SkNf<1,T> {
110 typedef SkNb<1, sizeof(T)> Nb; 174 typedef SkNb<1, sizeof(T)> Nb;
111 public: 175 public:
112 SkNf() {} 176 SkNf() {}
113 explicit SkNf(T val) : fVal(val) {} 177 explicit SkNf(T val) : fVal(val) {}
114 static SkNf Load(const T vals[1]) { return SkNf(vals[0]); } 178 static SkNf Load(const T vals[1]) { return SkNf(vals[0]); }
115 179
116 void store(T vals[1]) const { vals[0] = fVal; } 180 void store(T vals[1]) const { vals[0] = fVal; }
117 181
118 SkNf operator + (const SkNf& o) const { return SkNf(fVal + o.fVal); } 182 SkNf operator + (const SkNf& o) const { return SkNf(fVal + o.fVal); }
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 216
153 217
154 // Generic syntax sugar that should work equally well for all implementations. 218 // Generic syntax sugar that should work equally well for all implementations.
155 template <typename T> T operator - (const T& l) { return T(0) - l; } 219 template <typename T> T operator - (const T& l) { return T(0) - l; }
156 220
157 template <typename L, typename R> L& operator += (L& l, const R& r) { return (l = l + r); } 221 template <typename L, typename R> L& operator += (L& l, const R& r) { return (l = l + r); }
158 template <typename L, typename R> L& operator -= (L& l, const R& r) { return (l = l - r); } 222 template <typename L, typename R> L& operator -= (L& l, const R& r) { return (l = l - r); }
159 template <typename L, typename R> L& operator *= (L& l, const R& r) { return (l = l * r); } 223 template <typename L, typename R> L& operator *= (L& l, const R& r) { return (l = l * r); }
160 template <typename L, typename R> L& operator /= (L& l, const R& r) { return (l = l / r); } 224 template <typename L, typename R> L& operator /= (L& l, const R& r) { return (l = l / r); }
161 225
226 template <typename L> L& operator <<= (L& l, int bits) { return (l = l << bits); }
227 template <typename L> L& operator >>= (L& l, int bits) { return (l = l >> bits); }
162 228
163 // Include platform specific specializations if available. 229 // Include platform specific specializations if available.
164 #ifndef SKNX_NO_SIMD 230 #ifndef SKNX_NO_SIMD
165 #if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE2 231 #if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE2
166 #include "../opts/SkNx_sse.h" 232 #include "../opts/SkNx_sse.h"
167 #elif defined(SK_ARM_HAS_NEON) 233 #elif defined(SK_ARM_HAS_NEON)
168 #include "../opts/SkNx_neon.h" 234 #include "../opts/SkNx_neon.h"
169 #endif 235 #endif
170 #endif 236 #endif
171 237
172 #undef REQUIRE 238 #undef REQUIRE
173 239
174 typedef SkNf<2, float> Sk2f; 240 typedef SkNf<2, float> Sk2f;
175 typedef SkNf<2, double> Sk2d; 241 typedef SkNf<2, double> Sk2d;
176 typedef SkNf<2, SkScalar> Sk2s; 242 typedef SkNf<2, SkScalar> Sk2s;
177 243
178 typedef SkNf<4, float> Sk4f; 244 typedef SkNf<4, float> Sk4f;
179 typedef SkNf<4, double> Sk4d; 245 typedef SkNf<4, double> Sk4d;
180 typedef SkNf<4, SkScalar> Sk4s; 246 typedef SkNf<4, SkScalar> Sk4s;
181 247
248 typedef SkNi<4, uint16_t> Sk4h;
249 typedef SkNi<8, uint16_t> Sk8h;
250
182 #endif//SkNx_DEFINED 251 #endif//SkNx_DEFINED
OLDNEW
« no previous file with comments | « no previous file | src/opts/SkNx_sse.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698