| 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_DEFINED | 8 #ifndef SkNx_DEFINED |
| 9 #define SkNx_DEFINED | 9 #define SkNx_DEFINED |
| 10 | 10 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |