Index: src/opts/SkNx_neon.h |
diff --git a/src/opts/SkNx_neon.h b/src/opts/SkNx_neon.h |
index cf149862c5791c8477bf17eb9d8e3a3e3039eac8..33b3ad8c5311287129aeeb4849569291548aaf3f 100644 |
--- a/src/opts/SkNx_neon.h |
+++ b/src/opts/SkNx_neon.h |
@@ -33,7 +33,7 @@ namespace { // See SkNx.h |
case 31: return op(v, 31); } return fVec |
template <> |
-class SkNf<2, float> { |
+class SkNf<2> { |
public: |
SkNf(float32x2_t vec) : fVec(vec) {} |
@@ -113,81 +113,6 @@ public: |
float32x2_t fVec; |
}; |
-#if defined(SK_CPU_ARM64) |
-template <> |
-class SkNf<2, double> { |
-public: |
- SkNf(float64x2_t vec) : fVec(vec) {} |
- |
- SkNf() {} |
- explicit SkNf(double val) : fVec(vdupq_n_f64(val)) {} |
- static SkNf Load(const double vals[2]) { return vld1q_f64(vals); } |
- SkNf(double a, double b) { fVec = (float64x2_t) { a, b }; } |
- |
- void store(double vals[2]) const { vst1q_f64(vals, fVec); } |
- |
- SkNf operator + (const SkNf& o) const { return vaddq_f64(fVec, o.fVec); } |
- SkNf operator - (const SkNf& o) const { return vsubq_f64(fVec, o.fVec); } |
- SkNf operator * (const SkNf& o) const { return vmulq_f64(fVec, o.fVec); } |
- SkNf operator / (const SkNf& o) const { return vdivq_f64(fVec, o.fVec); } |
- |
- // vreinterpretq_f64_u64 and vreinterpretq_f64_u32 don't seem to exist.... weird. |
- SkNf operator==(const SkNf& o) const { return (float64x2_t)(vceqq_f64(fVec, o.fVec)); } |
- SkNf operator <(const SkNf& o) const { return (float64x2_t)(vcltq_f64(fVec, o.fVec)); } |
- SkNf operator >(const SkNf& o) const { return (float64x2_t)(vcgtq_f64(fVec, o.fVec)); } |
- SkNf operator<=(const SkNf& o) const { return (float64x2_t)(vcleq_f64(fVec, o.fVec)); } |
- SkNf operator>=(const SkNf& o) const { return (float64x2_t)(vcgeq_f64(fVec, o.fVec)); } |
- SkNf operator != (const SkNf& o) const { |
- return (float64x2_t)(vmvnq_u32(vreinterpretq_u32_u64(vceqq_f64(fVec, o.fVec)))); |
- } |
- |
- static SkNf Min(const SkNf& l, const SkNf& r) { return vminq_f64(l.fVec, r.fVec); } |
- static SkNf Max(const SkNf& l, const SkNf& r) { return vmaxq_f64(l.fVec, r.fVec); } |
- |
- SkNf sqrt() const { return vsqrtq_f64(fVec); } |
- |
- SkNf rsqrt0() const { return vrsqrteq_f64(fVec); } |
- SkNf rsqrt1() const { |
- float64x2_t est0 = this->rsqrt0().fVec; |
- return vmulq_f64(vrsqrtsq_f64(fVec, vmulq_f64(est0, est0)), est0); |
- } |
- SkNf rsqrt2() const { |
- float64x2_t est1 = this->rsqrt1().fVec; |
- return vmulq_f64(vrsqrtsq_f64(fVec, vmulq_f64(est1, est1)), est1); |
- } |
- |
- SkNf approxInvert() const { |
- float64x2_t est0 = vrecpeq_f64(fVec), |
- est1 = vmulq_f64(vrecpsq_f64(est0, fVec), est0); |
- return est1; |
- } |
- |
- SkNf invert() const { |
- float64x2_t est1 = this->approxInvert().fVec, |
- est2 = vmulq_f64(vrecpsq_f64(est1, fVec), est1), |
- est3 = vmulq_f64(vrecpsq_f64(est2, fVec), est2); |
- return est3; |
- } |
- |
- template <int k> double kth() const { |
- SkASSERT(0 <= k && k < 2); |
- return vgetq_lane_f64(fVec, k&1); |
- } |
- |
- // vreinterpretq_u64_f64 doesn't seem to exist.... weird. |
- bool allTrue() const { |
- auto v = (uint64x2_t)(fVec); |
- return vgetq_lane_u64(v,0) && vgetq_lane_u64(v,1); |
- } |
- bool anyTrue() const { |
- auto v = (uint64x2_t)(fVec); |
- return vgetq_lane_u64(v,0) || vgetq_lane_u64(v,1); |
- } |
- |
- float64x2_t fVec; |
-}; |
-#endif//defined(SK_CPU_ARM64) |
- |
template <> |
class SkNi<4, int> { |
public: |
@@ -216,7 +141,7 @@ public: |
}; |
template <> |
-class SkNf<4, float> { |
+class SkNf<4> { |
public: |
SkNf(float32x4_t vec) : fVec(vec) {} |
@@ -240,8 +165,6 @@ public: |
vst1_lane_u32((uint32_t*)bytes, (uint32x2_t)fix8, 0); |
} |
- SkNi<4, int> castTrunc() const { return vcvtq_s32_f32(fVec); } |
- |
SkNf approxInvert() const { |
float32x4_t est0 = vrecpeq_f32(fVec), |
est1 = vmulq_f32(vrecpsq_f32(est0, fVec), est0); |