aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar mtklein <mtklein@chromium.org>2015-02-26 12:48:05 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2015-02-26 12:48:05 -0800
commit24aa0f0679d5299b394bcb62b1c4430e4cd34c65 (patch)
tree4101cac8b70bb03c7eb3ccf7c31f693248b1d197 /src
parent2719552fb1469b9697a3ee8b15a537044fa6dd96 (diff)
Add sqrt() and rsqrt() to Sk4f.
This doesn't add them to the second-stringer Sk4i. It's unclear we should be doing that often, and we don't have efficient ways to do it except via floats. BUG=skia: Review URL: https://codereview.chromium.org/964603002
Diffstat (limited to 'src')
-rw-r--r--src/core/Sk4x.h3
-rw-r--r--src/core/Sk4x_portable.h16
-rw-r--r--src/core/Sk4x_sse.h3
3 files changed, 22 insertions, 0 deletions
diff --git a/src/core/Sk4x.h b/src/core/Sk4x.h
index 058c400380..b01b6f1648 100644
--- a/src/core/Sk4x.h
+++ b/src/core/Sk4x.h
@@ -50,6 +50,9 @@ public:
Sk4x multiply(const Sk4x&) const;
Sk4x divide(const Sk4x&) const;
+ Sk4x rsqrt() const; // Approximate reciprocal sqrt().
+ Sk4x sqrt() const; // this->multiply(this->rsqrt()) may be faster, but less precise.
+
Sk4i equal(const Sk4x&) const;
Sk4i notEqual(const Sk4x&) const;
Sk4i lessThan(const Sk4x&) const;
diff --git a/src/core/Sk4x_portable.h b/src/core/Sk4x_portable.h
index bd056c777e..440e91faaa 100644
--- a/src/core/Sk4x_portable.h
+++ b/src/core/Sk4x_portable.h
@@ -2,6 +2,8 @@
// This file will be intentionally included three times.
#if defined(SK4X_PREAMBLE)
+ #include "SkFloatingPoint.h"
+ #include <math.h>
#elif defined(SK4X_PRIVATE)
typedef T Type;
@@ -60,6 +62,20 @@ M(Sk4x<T>) multiply(const Sk4x<T>& other) const { return Sk4x(BINOP(*)); }
M(Sk4x<T>) divide(const Sk4x<T>& other) const { return Sk4x(BINOP(/)); }
#undef BINOP
+template<> inline Sk4f Sk4f::rsqrt() const {
+ return Sk4f(sk_float_rsqrt(fVec[0]),
+ sk_float_rsqrt(fVec[1]),
+ sk_float_rsqrt(fVec[2]),
+ sk_float_rsqrt(fVec[3]));
+}
+
+template<> inline Sk4f Sk4f::sqrt() const {
+ return Sk4f(sqrtf(fVec[0]),
+ sqrtf(fVec[1]),
+ sqrtf(fVec[2]),
+ sqrtf(fVec[3]));
+}
+
#define BOOL_BINOP(op) fVec[0] op other.fVec[0] ? -1 : 0, \
fVec[1] op other.fVec[1] ? -1 : 0, \
fVec[2] op other.fVec[2] ? -1 : 0, \
diff --git a/src/core/Sk4x_sse.h b/src/core/Sk4x_sse.h
index ee09f77449..6077d0273d 100644
--- a/src/core/Sk4x_sse.h
+++ b/src/core/Sk4x_sse.h
@@ -99,6 +99,9 @@ M(Sk4f) subtract(const Sk4f& o) const { return _mm_sub_ps(fVec, o.fVec); }
M(Sk4f) multiply(const Sk4f& o) const { return _mm_mul_ps(fVec, o.fVec); }
M(Sk4f) divide (const Sk4f& o) const { return _mm_div_ps(fVec, o.fVec); }
+M(Sk4f) rsqrt() const { return _mm_rsqrt_ps(fVec); }
+M(Sk4f) sqrt() const { return _mm_sqrt_ps( fVec); }
+
M(Sk4i) equal (const Sk4f& o) const { return _mm_cmpeq_ps (fVec, o.fVec); }
M(Sk4i) notEqual (const Sk4f& o) const { return _mm_cmpneq_ps(fVec, o.fVec); }
M(Sk4i) lessThan (const Sk4f& o) const { return _mm_cmplt_ps (fVec, o.fVec); }