Think implicit promotion is a good idea?
authormtklein <mtklein@chromium.org>
Thu, 26 Feb 2015 20:21:25 +0000 (12:21 -0800)
committerCommit bot <commit-bot@chromium.org>
Thu, 26 Feb 2015 20:21:25 +0000 (12:21 -0800)
Things like foo.multiply(Sk4f(t,t,t,t)) can just be foo.multiply(t).

BUG=skia:

Review URL: https://codereview.chromium.org/960773005

src/core/Sk4x.h
src/core/Sk4x_portable.h
src/core/Sk4x_sse.h
tests/Sk4xTest.cpp

index 7c246df..058c400 100644 (file)
@@ -22,7 +22,8 @@ typedef Sk4x<int32_t> Sk4i;
 
 template <typename T> class Sk4x {
 public:
-    Sk4x();  // Uninitialized; use Sk4x(0,0,0,0) for zero.
+    Sk4x();  // Uninitialized; use Sk4x(0) for zero.
+    /*implicit*/ Sk4x(T);  // Same as Sk4x(T,T,T,T);
     Sk4x(T, T, T, T);
 
     Sk4x(const Sk4x&);
index 2f985d0..bd056c7 100644 (file)
@@ -19,6 +19,7 @@
 #define M(...) template <typename T> __VA_ARGS__ Sk4x<T>::
 
 M() Sk4x() {}
+M() Sk4x(T v) { fVec[0] = fVec[1] = fVec[2] = fVec[3] = v; }
 M() Sk4x(T a, T b, T c, T d) { fVec[0] = a; fVec[1] = b; fVec[2] = c; fVec[3] = d; }
 
 M()              Sk4x(const Sk4x<T>& other) { this->set(other.fVec);               }
index 10a0a83..ee09f77 100644 (file)
@@ -75,6 +75,7 @@ Sk4x<T> Sk4x<T>::ZWCD(const Sk4x<T>& a, const Sk4x<T>& b) {
 // Now we'll write all Sk4f specific methods.  This M() macro will remove some noise.
 #define M(...) template <> inline __VA_ARGS__ Sk4f::
 
+M() Sk4x(float v) : fVec(_mm_set1_ps(v)) {}
 M() Sk4x(float a, float b, float c, float d) : fVec(_mm_set_ps(d,c,b,a)) {}
 
 M(Sk4f) Load       (const float fs[4]) { return _mm_loadu_ps(fs); }
@@ -112,6 +113,7 @@ M(Sk4f) Max(const Sk4f& a, const Sk4f& b) { return _mm_max_ps(a.fVec, b.fVec); }
 #undef M
 #define M(...) template <> inline __VA_ARGS__ Sk4i::
 
+M() Sk4x(int32_t v) : fVec(_mm_set1_epi32(v)) {}
 M() Sk4x(int32_t a, int32_t b, int32_t c, int32_t d) : fVec(_mm_set_epi32(d,c,b,a)) {}
 
 M(Sk4i) Load       (const int32_t is[4]) { return _mm_loadu_si128((const __m128i*)is); }
index d6e7e51..0985c3b 100644 (file)
@@ -83,6 +83,10 @@ DEF_TEST(Sk4x_Arith, r) {
     ASSERT_EQ(Sk4i(3,8,15,24),   Sk4i(1,2,3,4).multiply(Sk4i(3,4,5,6)));
 }
 
+DEF_TEST(Sk4x_ImplicitPromotion, r) {
+    ASSERT_EQ(Sk4f(2,4,6,8), Sk4f(1,2,3,4).multiply(2.0f));
+}
+
 DEF_TEST(Sk4x_Comparison, r) {
     ASSERT_EQ(Sk4f(1,2,3,4), Sk4f(1,2,3,4));
     ASSERT_NE(Sk4f(4,3,2,1), Sk4f(1,2,3,4));