Home | History | Annotate | Download | only in core

Lines Matching refs:SkNx

17 // Every single SkNx method wants to be fully inlined.  (We know better than MSVC).
22 // The default SkNx<N,T> just proxies down to a pair of SkNx<N/2, T>.
24 struct SkNx {
25 typedef SkNx<N/2, T> Half;
29 AI SkNx() = default;
30 AI SkNx(const Half& lo, const Half& hi) : fLo(lo), fHi(hi) {}
32 AI SkNx(T v) : fLo(v), fHi(v) {}
34 AI SkNx(T a, T b) : fLo(a) , fHi(b) { static_assert(N==2, ""); }
35 AI SkNx(T a, T b, T c, T d) : fLo(a,b), fHi(c,d) { static_assert(N==4, ""); }
36 AI SkNx(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) {
39 AI SkNx(T a, T b, T c, T d, T e, T f, T g, T h,
50 AI static SkNx Load(const void* vptr) {
60 AI static void Load4(const void* vptr, SkNx* a, SkNx* b, SkNx* c, SkNx* d) {
66 *a = SkNx{al, ah};
67 *b = SkNx{bl, bh};
68 *c = SkNx{cl, ch};
69 *d = SkNx{dl, dh};
71 AI static void Load3(const void* vptr, SkNx* a, SkNx* b, SkNx* c) {
77 *a = SkNx{al, ah};
78 *b = SkNx{bl, bh};
79 *c = SkNx{cl, ch};
81 AI static void Load2(const void* vptr, SkNx* a, SkNx* b) {
87 *a = SkNx{al, ah};
88 *b = SkNx{bl, bh};
90 AI static void Store4(void* vptr, const SkNx& a, const SkNx& b, const SkNx& c, const SkNx& d) {
95 AI static void Store3(void* vptr, const SkNx& a, const SkNx& b, const SkNx& c) {
104 AI SkNx abs() const { return { fLo. abs(), fHi. abs() }; }
105 AI SkNx sqrt() const { return { fLo. sqrt(), fHi. sqrt() }; }
106 AI SkNx rsqrt() const { return { fLo. rsqrt(), fHi. rsqrt() }; }
107 AI SkNx floor() const { return { fLo. floor(), fHi. floor() }; }
108 AI SkNx invert() const { return { fLo.invert(), fHi.invert() }; }
110 AI SkNx operator!() const { return { !fLo, !fHi }; }
111 AI SkNx operator-() const { return { -fLo, -fHi }; }
112 AI SkNx operator~() const { return { ~fLo, ~fHi }; }
114 AI SkNx operator<<(int bits) const { return { fLo << bits, fHi << bits }; }
115 AI SkNx operator>>(int bits) const { return { fLo >> bits, fHi >> bits }; }
117 AI SkNx operator+(const SkNx& y) const { return { fLo + y.fLo, fHi + y.fHi }; }
118 AI SkNx operator-(const SkNx& y) const { return { fLo - y.fLo, fHi - y.fHi }; }
119 AI SkNx operator*(const SkNx& y) const { return { fLo * y.fLo, fHi * y.fHi }; }
120 AI SkNx operator/(const SkNx& y) const { return { fLo / y.fLo, fHi / y.fHi }; }
122 AI SkNx operator&(const SkNx& y) const { return { fLo & y.fLo, fHi & y.fHi }; }
123 AI SkNx operator|(const SkNx& y) const { return { fLo | y.fLo, fHi | y.fHi }; }
124 AI SkNx operator^(const SkNx& y) const { return { fLo ^ y.fLo, fHi ^ y.fHi }; }
126 AI SkNx operator==(const SkNx& y) const { return { fLo == y.fLo, fHi == y.fHi }; }
127 AI SkNx operator!=(const SkNx& y) const { return { fLo != y.fLo, fHi != y.fHi }; }
128 AI SkNx operator<=(const SkNx& y) const { return { fLo <= y.fLo, fHi <= y.fHi }; }
129 AI SkNx operator>=(const SkNx& y) const { return { fLo >= y.fLo, fHi >= y.fHi }; }
130 AI SkNx operator< (const SkNx& y) const { return { fLo < y.fLo, fHi < y.fHi }; }
131 AI SkNx operator> (const SkNx& y) const { return { fLo > y.fLo, fHi > y.fHi }; }
133 AI SkNx saturatedAdd(const SkNx& y) const {
137 AI SkNx mulHi(const SkNx& m) const {
140 AI SkNx thenElse(const SkNx& t, const SkNx& e) const {
143 AI static SkNx Min(const SkNx& x, const SkNx& y) {
146 AI static SkNx Max(const SkNx& x, const SkNx& y) {
153 struct SkNx<1,T> {
156 AI SkNx() = default;
157 AI SkNx(T v) : fVal(v) {}
165 AI static SkNx Load(const void* ptr) {
166 SkNx v;
172 AI static void Load4(const void* vptr, SkNx* a, SkNx* b, SkNx* c, SkNx* d) {
179 AI static void Load3(const void* vptr, SkNx* a, SkNx* b, SkNx* c) {
185 AI static void Load2(const void* vptr, SkNx* a, SkNx* b) {
190 AI static void Store4(void* vptr, const SkNx& a, const SkNx& b, const SkNx& c, const SkNx& d) {
197 AI static void Store3(void* vptr, const SkNx& a, const SkNx& b, const SkNx& c) {
207 AI SkNx abs() const { return Abs(fVal); }
208 AI SkNx sqrt() const { return Sqrt(fVal); }
209 AI SkNx rsqrt() const { return T(1) / this->sqrt(); }
210 AI SkNx floor() const { return Floor(fVal); }
211 AI SkNx invert() const { return T(1) / *this; }
213 AI SkNx operator!() const { return !fVal; }
214 AI SkNx operator-() const { return -fVal; }
215 AI SkNx operator~() const { return FromBits(~ToBits(fVal)); }
217 AI SkNx operator<<(int bits) const { return fVal << bits; }
218 AI SkNx operator>>(int bits) const { return fVal >> bits; }
220 AI SkNx operator+(const SkNx& y) const { return fVal + y.fVal; }
221 AI SkNx operator-(const SkNx& y) const { return fVal - y.fVal; }
222 AI SkNx operator*(const SkNx& y) const { return fVal * y.fVal; }
223 AI SkNx operator/(const SkNx& y) const { return fVal / y.fVal; }
225 AI SkNx operator&(const SkNx& y) const { return FromBits(ToBits(fVal) & ToBits(y.fVal)); }
226 AI SkNx operator|(const SkNx& y) const { return FromBits(ToBits(fVal) | ToBits(y.fVal)); }
227 AI SkNx operator^(const SkNx& y) const { return FromBits(ToBits(fVal) ^ ToBits(y.fVal)); }
229 AI SkNx operator==(const SkNx& y) const { return FromBits(fVal == y.fVal ? ~0 : 0); }
230 AI SkNx operator!=(const SkNx& y) const { return FromBits(fVal != y.fVal ? ~0 : 0); }
231 AI SkNx operator<=(const SkNx& y) const { return FromBits(fVal <= y.fVal ? ~0 : 0); }
232 AI SkNx operator>=(const SkNx& y) const { return FromBits(fVal >= y.fVal ? ~0 : 0); }
233 AI SkNx operator< (const SkNx& y) const { return FromBits(fVal < y.fVal ? ~0 : 0); }
234 AI SkNx operator> (const SkNx& y) const { return FromBits(fVal > y.fVal ? ~0 : 0); }
236 AI static SkNx Min(const SkNx& x, const SkNx& y) { return x.fVal < y.fVal ? x : y; }
237 AI static SkNx Max(const SkNx& x, const SkNx& y) { return x.fVal > y.fVal ? x : y; }
239 AI SkNx saturatedAdd(const SkNx& y) const {
245 AI SkNx mulHi(const SkNx& m) const {
251 AI SkNx thenElse(const SkNx& t, const SkNx& e) const { return fVal != 0 ? t : e; }
283 #define V template <int N, typename T> AI static SkNx<N,T>
284 V operator+ (T x, const SkNx<N,T>& y) { return SkNx<N,T>(x) + y; }
285 V operator- (T x, const SkNx<N,T>& y) { return SkNx<N,T>(x) - y; }
286 V operator* (T x, const SkNx<N,T>& y) { return SkNx<N,T>(x) * y; }
287 V operator/ (T x, const SkNx<N,T>& y) { return SkNx<N,T>(x) / y; }
288 V operator& (T x, const SkNx<N,T>& y) { return SkNx<N,T>(x) & y; }
289 V operator| (T x, const SkNx<N,T>& y) { return SkNx<N,T>(x) | y; }
290 V operator^ (T x, const SkNx<N,T>& y) { return SkNx<N,T>(x) ^ y; }
291 V operator==(T x, const SkNx<N,T>& y) { return SkNx<N,T>(x) == y; }
292 V operator!=(T x, const SkNx<N,T>& y) { return SkNx<N,T>(x) != y; }
293 V operator<=(T x, const SkNx<N,T>& y) { return SkNx<N,T>(x) <= y; }
294 V operator>=(T x, const SkNx<N,T>& y) { return SkNx<N,T>(x) >= y; }
295 V operator< (T x, const SkNx<N,T>& y) { return SkNx<N,T>(x) < y; }
296 V operator> (T x, const SkNx<N,T>& y) { return SkNx<N,T>(x) > y; }
298 V operator+ (const SkNx<N,T>& x, T y) { return x + SkNx<N,T>(y); }
299 V operator- (const SkNx<N,T>& x, T y) { return x - SkNx<N,T>(y); }
300 V operator* (const SkNx<N,T>& x, T y) { return x * SkNx<N,T>(y); }
301 V operator/ (const SkNx<N,T>& x, T y) { return x / SkNx<N,T>(y); }
302 V operator& (const SkNx<N,T>& x, T y) { return x & SkNx<N,T>(y); }
303 V operator| (const SkNx<N,T>& x, T y) { return x | SkNx<N,T>(y); }
304 V operator^ (const SkNx<N,T>& x, T y) { return x ^ SkNx<N,T>(y); }
305 V operator==(const SkNx<N,T>& x, T y) { return x == SkNx<N,T>(y); }
306 V operator!=(const SkNx<N,T>& x, T y) { return x != SkNx<N,T>(y); }
307 V operator<=(const SkNx<N,T>& x, T y) { return x <= SkNx<N,T>(y); }
308 V operator>=(const SkNx<N,T>& x, T y) { return x >= SkNx<N,T>(y); }
309 V operator< (const SkNx<N,T>& x, T y) { return x < SkNx<N,T>(y); }
310 V operator> (const SkNx<N,T>& x, T y) { return x > SkNx<N,T>(y); }
312 V& operator<<=(SkNx<N,T>& x, int bits) { return (x = x << bits); }
313 V& operator>>=(SkNx<N,T>& x, int bits) { return (x = x >> bits); }
315 V& operator +=(SkNx<N,T>& x, const SkNx<N,T>& y) { return (x = x + y); }
316 V& operator -=(SkNx<N,T>& x, const SkNx<N,T>& y) { return (x = x - y); }
317 V& operator *=(SkNx<N,T>& x, const SkNx<N,T>& y) { return (x = x * y); }
318 V& operator /=(SkNx<N,T>& x, const SkNx<N,T>& y) { return (x = x / y); }
319 V& operator &=(SkNx<N,T>& x, const SkNx<N,T>& y) { return (x = x & y); }
320 V& operator |=(SkNx<N,T>& x, const SkNx<N,T>& y) { return (x = x | y); }
321 V& operator ^=(SkNx<N,T>& x, const SkNx<N,T>& y) { return (x = x ^ y); }
323 V& operator +=(SkNx<N,T>& x, T y) { return (x = x + SkNx<N,T>(y)); }
324 V& operator -=(SkNx<N,T>& x, T y) { return (x = x - SkNx<N,T>(y)); }
325 V& operator *=(SkNx<N,T>& x, T y) { return (x = x * SkNx<N,T>(y)); }
326 V& operator /=(SkNx<N,T>& x, T y) { return (x = x / SkNx<N,T>(y)); }
327 V& operator &=(SkNx<N,T>& x, T y) { return (x = x & SkNx<N,T>(y)); }
328 V& operator |=(SkNx<N,T>& x, T y) { return (x = x | SkNx<N,T>(y)); }
329 V& operator ^=(SkNx<N,T>& x, T y) { return (x = x ^ SkNx<N,T>(y)); }
332 // SkNx<N,T> ~~> SkNx<N/2,T> + SkNx<N/2,T>
334 AI static void SkNx_split(const SkNx<N,T>& v, SkNx<N/2,T>* lo, SkNx<N/2,T>* hi) {
339 // SkNx<N/2,T> + SkNx<N/2,T> ~~> SkNx<N,T>
341 AI static SkNx<N*2,T> SkNx_join(const SkNx<N,T>& lo, const SkNx<N,T>& hi) {
352 AI static SkNx<sizeof...(Ix),T> SkNx_shuffle(const SkNx<N,T>& v) {
356 // Cast from SkNx<N, Src> to SkNx<N, Dst>, as if you called static_cast<Dst>(Src).
358 AI static SkNx<N,Dst> SkNx_cast(const SkNx<N,Src>& v) {
362 AI static SkNx<1,Dst> SkNx_cast(const SkNx<1,Src>& v) {
367 AI static SkNx<N,T> SkNx_fma(const SkNx<N,T>& f, const SkNx<N,T>& m, const SkNx<N,T>& a) {
373 typedef SkNx<2, float> Sk2f;
374 typedef SkNx<4, float> Sk4f;
375 typedef SkNx<8, float> Sk8f;
376 typedef SkNx<16, float> Sk16f;
378 typedef SkNx<2, SkScalar> Sk2s;
379 typedef SkNx<4, SkScalar> Sk4s;
380 typedef SkNx<8, SkScalar> Sk8s;
381 typedef SkNx<16, SkScalar> Sk16s;
383 typedef SkNx<4, uint8_t> Sk4b;
384 typedef SkNx<8, uint8_t> Sk8b;
385 typedef SkNx<16, uint8_t> Sk16b;
387 typedef SkNx<4, uint16_t> Sk4h;
388 typedef SkNx<8, uint16_t> Sk8h;
389 typedef SkNx<16, uint16_t> Sk16h;
391 typedef SkNx<4, int32_t> Sk4i;
392 typedef SkNx<8, int32_t> Sk8i;
393 typedef SkNx