| 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 |
| 11 | 11 |
| 12 #define SKNX_NO_SIMDx // Remove the x to disable SIMD for all SkNx types. | 12 #define SKNX_NO_SIMDx // Remove the x to disable SIMD for all SkNx types. |
| 13 | 13 |
| 14 | 14 |
| 15 #include "SkScalar.h" | 15 #include "SkScalar.h" |
| 16 #include "SkTypes.h" | 16 #include "SkTypes.h" |
| 17 #include <math.h> | 17 #include <math.h> |
| 18 #define REQUIRE(x) static_assert(x, #x) | 18 #define REQUIRE(x) static_assert(x, #x) |
| 19 | 19 |
| 20 // This file may be included multiple times by .cpp files with different flags,
leading | |
| 21 // to different definitions. Usually that doesn't matter because it's all inlin
ed, but | |
| 22 // in Debug modes the compilers may not inline everything. So wrap everything i
n an | |
| 23 // anonymous namespace to give each includer their own silo of this code (or the
linker | |
| 24 // will probably pick one randomly for us, which is rarely correct). | |
| 25 namespace { | |
| 26 | |
| 27 // The default implementations just fall back on a pair of size N/2. | 20 // The default implementations just fall back on a pair of size N/2. |
| 28 | 21 |
| 29 template <int N, typename T> | 22 template <int N, typename T> |
| 30 class SkNi { | 23 class SkNi { |
| 31 public: | 24 public: |
| 32 SkNi() {} | 25 SkNi() {} |
| 33 SkNi(const SkNi<N/2, T>& lo, const SkNi<N/2, T>& hi) : fLo(lo), fHi(hi) {} | 26 SkNi(const SkNi<N/2, T>& lo, const SkNi<N/2, T>& hi) : fLo(lo), fHi(hi) {} |
| 34 explicit SkNi(T val) : fLo(val), fHi(val) {} | 27 explicit SkNi(T val) : fLo(val), fHi(val) {} |
| 35 static SkNi Load(const T vals[N]) { | 28 static SkNi Load(const T vals[N]) { |
| 36 return SkNi(SkNi<N/2,T>::Load(vals), SkNi<N/2,T>::Load(vals+N/2)); | 29 return SkNi(SkNi<N/2,T>::Load(vals), SkNi<N/2,T>::Load(vals+N/2)); |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 245 static double Sqrt(double val) { return ::sqrt ( val); } | 238 static double Sqrt(double val) { return ::sqrt ( val); } |
| 246 | 239 |
| 247 I pun() const { | 240 I pun() const { |
| 248 union { T f; I i; } pun = { fVal }; | 241 union { T f; I i; } pun = { fVal }; |
| 249 return pun.i; | 242 return pun.i; |
| 250 } | 243 } |
| 251 | 244 |
| 252 T fVal; | 245 T fVal; |
| 253 }; | 246 }; |
| 254 | 247 |
| 255 } // namespace | |
| 256 | |
| 257 // Include platform specific specializations if available. | 248 // Include platform specific specializations if available. |
| 258 #ifndef SKNX_NO_SIMD | 249 #ifndef SKNX_NO_SIMD |
| 259 #if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE2 | 250 #if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE2 |
| 260 #include "../opts/SkNx_sse.h" | 251 #include "../opts/SkNx_sse.h" |
| 261 #elif defined(SK_ARM_HAS_NEON) | 252 #elif defined(SK_ARM_HAS_NEON) |
| 262 #include "../opts/SkNx_neon.h" | 253 #include "../opts/SkNx_neon.h" |
| 263 #endif | 254 #endif |
| 264 #endif | 255 #endif |
| 265 | 256 |
| 266 #undef REQUIRE | 257 #undef REQUIRE |
| 267 | 258 |
| 268 typedef SkNf<2, float> Sk2f; | 259 typedef SkNf<2, float> Sk2f; |
| 269 typedef SkNf<2, double> Sk2d; | 260 typedef SkNf<2, double> Sk2d; |
| 270 typedef SkNf<2, SkScalar> Sk2s; | 261 typedef SkNf<2, SkScalar> Sk2s; |
| 271 | 262 |
| 272 typedef SkNf<4, float> Sk4f; | 263 typedef SkNf<4, float> Sk4f; |
| 273 typedef SkNf<4, double> Sk4d; | 264 typedef SkNf<4, double> Sk4d; |
| 274 typedef SkNf<4, SkScalar> Sk4s; | 265 typedef SkNf<4, SkScalar> Sk4s; |
| 275 | 266 |
| 276 typedef SkNi<4, uint16_t> Sk4h; | 267 typedef SkNi<4, uint16_t> Sk4h; |
| 277 typedef SkNi<8, uint16_t> Sk8h; | 268 typedef SkNi<8, uint16_t> Sk8h; |
| 278 typedef SkNi<16, uint16_t> Sk16h; | 269 typedef SkNi<16, uint16_t> Sk16h; |
| 279 | 270 |
| 280 typedef SkNi<16, uint8_t> Sk16b; | 271 typedef SkNi<16, uint8_t> Sk16b; |
| 281 | 272 |
| 282 typedef SkNi<4, int32_t> Sk4i; | 273 typedef SkNi<4, int32_t> Sk4i; |
| 283 typedef SkNi<4, uint32_t> Sk4u; | 274 typedef SkNi<4, uint32_t> Sk4u; |
| 284 | 275 |
| 285 #endif//SkNx_DEFINED | 276 #endif//SkNx_DEFINED |
| OLD | NEW |