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

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

Issue 1059743002: Use switch operator[](int) to kth<int>() so we can use vget_lane. (Closed) Base URL: https://skia.googlesource.com/skia.git@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 | « src/opts/SkNx_neon.h ('k') | tests/SkNxTest.cpp » ('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_sse_DEFINED 8 #ifndef SkNx_sse_DEFINED
9 #define SkNx_sse_DEFINED 9 #define SkNx_sse_DEFINED
10 10
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 80
81 static SkNf Min(const SkNf& l, const SkNf& r) { return _mm_min_ps(l.fVec, r. fVec); } 81 static SkNf Min(const SkNf& l, const SkNf& r) { return _mm_min_ps(l.fVec, r. fVec); }
82 static SkNf Max(const SkNf& l, const SkNf& r) { return _mm_max_ps(l.fVec, r. fVec); } 82 static SkNf Max(const SkNf& l, const SkNf& r) { return _mm_max_ps(l.fVec, r. fVec); }
83 83
84 SkNf sqrt() const { return _mm_sqrt_ps (fVec); } 84 SkNf sqrt() const { return _mm_sqrt_ps (fVec); }
85 SkNf rsqrt() const { return _mm_rsqrt_ps(fVec); } 85 SkNf rsqrt() const { return _mm_rsqrt_ps(fVec); }
86 86
87 SkNf invert() const { return SkNf(1) / *this; } 87 SkNf invert() const { return SkNf(1) / *this; }
88 SkNf approxInvert() const { return _mm_rcp_ps(fVec); } 88 SkNf approxInvert() const { return _mm_rcp_ps(fVec); }
89 89
90 float operator[] (int k) const { 90 template <int k> float kth() const {
91 SkASSERT(0 <= k && k < 2); 91 SkASSERT(0 <= k && k < 2);
92 union { __m128 v; float fs[4]; } pun = {fVec}; 92 union { __m128 v; float fs[4]; } pun = {fVec};
93 return pun.fs[k]; 93 return pun.fs[k&1];
94 } 94 }
95 95
96 private: 96 private:
97 __m128 fVec; 97 __m128 fVec;
98 }; 98 };
99 99
100 template <> 100 template <>
101 class SkNf<2, double> { 101 class SkNf<2, double> {
102 typedef SkNi<2, int64_t> Ni; 102 typedef SkNi<2, int64_t> Ni;
103 public: 103 public:
(...skipping 20 matching lines...) Expand all
124 124
125 static SkNf Min(const SkNf& l, const SkNf& r) { return _mm_min_pd(l.fVec, r. fVec); } 125 static SkNf Min(const SkNf& l, const SkNf& r) { return _mm_min_pd(l.fVec, r. fVec); }
126 static SkNf Max(const SkNf& l, const SkNf& r) { return _mm_max_pd(l.fVec, r. fVec); } 126 static SkNf Max(const SkNf& l, const SkNf& r) { return _mm_max_pd(l.fVec, r. fVec); }
127 127
128 SkNf sqrt() const { return _mm_sqrt_pd(fVec); } 128 SkNf sqrt() const { return _mm_sqrt_pd(fVec); }
129 SkNf rsqrt() const { return _mm_cvtps_pd(_mm_rsqrt_ps(_mm_cvtpd_ps(fVec))); } 129 SkNf rsqrt() const { return _mm_cvtps_pd(_mm_rsqrt_ps(_mm_cvtpd_ps(fVec))); }
130 130
131 SkNf invert() const { return SkNf(1) / *this; } 131 SkNf invert() const { return SkNf(1) / *this; }
132 SkNf approxInvert() const { return _mm_cvtps_pd(_mm_rcp_ps(_mm_cvtpd_ps(fVec ))); } 132 SkNf approxInvert() const { return _mm_cvtps_pd(_mm_rcp_ps(_mm_cvtpd_ps(fVec ))); }
133 133
134 double operator[] (int k) const { 134 template <int k> double kth() const {
135 SkASSERT(0 <= k && k < 2); 135 SkASSERT(0 <= k && k < 2);
136 union { __m128d v; double ds[2]; } pun = {fVec}; 136 union { __m128d v; double ds[2]; } pun = {fVec};
137 return pun.ds[k]; 137 return pun.ds[k&1];
138 } 138 }
139 139
140 private: 140 private:
141 __m128d fVec; 141 __m128d fVec;
142 }; 142 };
143 143
144 template <> 144 template <>
145 class SkNf<4, float> { 145 class SkNf<4, float> {
146 typedef SkNi<4, int32_t> Ni; 146 typedef SkNi<4, int32_t> Ni;
147 public: 147 public:
(...skipping 21 matching lines...) Expand all
169 169
170 static SkNf Min(const SkNf& l, const SkNf& r) { return _mm_min_ps(l.fVec, r. fVec); } 170 static SkNf Min(const SkNf& l, const SkNf& r) { return _mm_min_ps(l.fVec, r. fVec); }
171 static SkNf Max(const SkNf& l, const SkNf& r) { return _mm_max_ps(l.fVec, r. fVec); } 171 static SkNf Max(const SkNf& l, const SkNf& r) { return _mm_max_ps(l.fVec, r. fVec); }
172 172
173 SkNf sqrt() const { return _mm_sqrt_ps (fVec); } 173 SkNf sqrt() const { return _mm_sqrt_ps (fVec); }
174 SkNf rsqrt() const { return _mm_rsqrt_ps(fVec); } 174 SkNf rsqrt() const { return _mm_rsqrt_ps(fVec); }
175 175
176 SkNf invert() const { return SkNf(1) / *this; } 176 SkNf invert() const { return SkNf(1) / *this; }
177 SkNf approxInvert() const { return _mm_rcp_ps(fVec); } 177 SkNf approxInvert() const { return _mm_rcp_ps(fVec); }
178 178
179 float operator[] (int k) const { 179 template <int k> float kth() const {
180 SkASSERT(0 <= k && k < 4); 180 SkASSERT(0 <= k && k < 4);
181 union { __m128 v; float fs[4]; } pun = {fVec}; 181 union { __m128 v; float fs[4]; } pun = {fVec};
182 return pun.fs[k]; 182 return pun.fs[k&3];
183 } 183 }
184 184
185 private: 185 private:
186 __m128 fVec; 186 __m128 fVec;
187 }; 187 };
188 188
189 189
190 #endif//SkNx_sse_DEFINED 190 #endif//SkNx_sse_DEFINED
OLDNEW
« no previous file with comments | « src/opts/SkNx_neon.h ('k') | tests/SkNxTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698