diff options
author | 2015-11-09 08:33:53 -0800 | |
---|---|---|
committer | 2015-11-09 08:33:53 -0800 | |
commit | 6f797092d2054f79374fb98fc1d57ca3554c7db4 (patch) | |
tree | e5e1ec524c11736085ef5c5080de3e10d57ec38e /src/opts/SkNx_sse.h | |
parent | a4c26c0d3a1ffdd0bab08b1aec24bea025a0d9e2 (diff) |
prune unused SkNx features
- remove float -> int conversion, keeping float -> byte
- remove support for doubles
I was thinking of specializing Sk8f for AVX. This will help keep the complexity down.
This may cause minor diffs in radial gradients: toBytes() rounds where castTrunc() truncated. But I don't see any diffs in Gold.
https://gold.skia.org/search2?issue=1411563008&unt=true&query=source_type%3Dgm&master=false
BUG=skia:4117
CQ_EXTRA_TRYBOTS=client.skia:Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-SKNX_NO_SIMD-Trybot
Review URL: https://codereview.chromium.org/1411563008
Diffstat (limited to 'src/opts/SkNx_sse.h')
-rw-r--r-- | src/opts/SkNx_sse.h | 53 |
1 files changed, 2 insertions, 51 deletions
diff --git a/src/opts/SkNx_sse.h b/src/opts/SkNx_sse.h index a99531b770..6e9c59c5cb 100644 --- a/src/opts/SkNx_sse.h +++ b/src/opts/SkNx_sse.h @@ -14,7 +14,7 @@ namespace { // See SkNx.h template <> -class SkNf<2, float> { +class SkNf<2> { public: SkNf(const __m128& vec) : fVec(vec) {} @@ -63,53 +63,6 @@ public: }; template <> -class SkNf<2, double> { -public: - SkNf(const __m128d& vec) : fVec(vec) {} - - SkNf() {} - explicit SkNf(double val) : fVec( _mm_set1_pd(val) ) {} - static SkNf Load(const double vals[2]) { return _mm_loadu_pd(vals); } - SkNf(double a, double b) : fVec(_mm_setr_pd(a,b)) {} - - void store(double vals[2]) const { _mm_storeu_pd(vals, fVec); } - - SkNf operator + (const SkNf& o) const { return _mm_add_pd(fVec, o.fVec); } - SkNf operator - (const SkNf& o) const { return _mm_sub_pd(fVec, o.fVec); } - SkNf operator * (const SkNf& o) const { return _mm_mul_pd(fVec, o.fVec); } - SkNf operator / (const SkNf& o) const { return _mm_div_pd(fVec, o.fVec); } - - SkNf operator == (const SkNf& o) const { return _mm_cmpeq_pd (fVec, o.fVec); } - SkNf operator != (const SkNf& o) const { return _mm_cmpneq_pd(fVec, o.fVec); } - SkNf operator < (const SkNf& o) const { return _mm_cmplt_pd (fVec, o.fVec); } - SkNf operator > (const SkNf& o) const { return _mm_cmpgt_pd (fVec, o.fVec); } - SkNf operator <= (const SkNf& o) const { return _mm_cmple_pd (fVec, o.fVec); } - SkNf operator >= (const SkNf& o) const { return _mm_cmpge_pd (fVec, o.fVec); } - - static SkNf Min(const SkNf& l, const SkNf& r) { return _mm_min_pd(l.fVec, r.fVec); } - static SkNf Max(const SkNf& l, const SkNf& r) { return _mm_max_pd(l.fVec, r.fVec); } - - SkNf sqrt() const { return _mm_sqrt_pd(fVec); } - SkNf rsqrt0() const { return _mm_cvtps_pd(_mm_rsqrt_ps(_mm_cvtpd_ps(fVec))); } - SkNf rsqrt1() const { return this->rsqrt0(); } - SkNf rsqrt2() const { return this->rsqrt1(); } - - SkNf invert() const { return SkNf(1) / *this; } - SkNf approxInvert() const { return _mm_cvtps_pd(_mm_rcp_ps(_mm_cvtpd_ps(fVec))); } - - template <int k> double kth() const { - SkASSERT(0 <= k && k < 2); - union { __m128d v; double ds[2]; } pun = {fVec}; - return pun.ds[k&1]; - } - - bool allTrue() const { return 0xffff == _mm_movemask_epi8(_mm_castpd_si128(fVec)); } - bool anyTrue() const { return 0x0000 != _mm_movemask_epi8(_mm_castpd_si128(fVec)); } - - __m128d fVec; -}; - -template <> class SkNi<4, int> { public: SkNi(const __m128i& vec) : fVec(vec) {} @@ -148,7 +101,7 @@ public: }; template <> -class SkNf<4, float> { +class SkNf<4> { public: SkNf(const __m128& vec) : fVec(vec) {} @@ -179,8 +132,6 @@ public: *(int*)bytes = _mm_cvtsi128_si32(fix8); } - SkNi<4, int> castTrunc() const { return _mm_cvttps_epi32(fVec); } - SkNf operator + (const SkNf& o) const { return _mm_add_ps(fVec, o.fVec); } SkNf operator - (const SkNf& o) const { return _mm_sub_ps(fVec, o.fVec); } SkNf operator * (const SkNf& o) const { return _mm_mul_ps(fVec, o.fVec); } |