Optimize vclip for NEON in VectorMath
authorrgabor@webkit.org <rgabor@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 30 Oct 2012 10:50:42 +0000 (10:50 +0000)
committerrgabor@webkit.org <rgabor@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 30 Oct 2012 10:50:42 +0000 (10:50 +0000)
https://bugs.webkit.org/show_bug.cgi?id=100737

Reviewed by Zoltan Herczeg.

Speed up vclip in VectorMath with NEON intrinsics.

* platform/audio/VectorMath.cpp:
(WebCore::VectorMath::vclip):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@132890 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/platform/audio/VectorMath.cpp

index 016244b..4585a6b 100644 (file)
@@ -1,3 +1,15 @@
+2012-10-30  Gabor Rapcsanyi  <rgabor@webkit.org>
+
+        Optimize vclip for NEON in VectorMath
+        https://bugs.webkit.org/show_bug.cgi?id=100737
+
+        Reviewed by Zoltan Herczeg.
+
+        Speed up vclip in VectorMath with NEON intrinsics.
+
+        * platform/audio/VectorMath.cpp:
+        (WebCore::VectorMath::vclip):
+
 2012-10-30  Alexandru Chiculita  <achicu@adobe.com>
 
         [CSS Shaders] Software and composited filters should have a common path
index bb20cee..1088744 100644 (file)
@@ -655,7 +655,22 @@ void vclip(const float* sourceP, int sourceStride, const float* lowThresholdP, c
     float highThreshold = *highThresholdP;
 
     // FIXME: Optimize for SSE2.
-    // FIXME: Optimize for NEON.
+#if HAVE(ARM_NEON_INTRINSICS)
+    if ((sourceStride == 1) && (destStride == 1)) {
+        int tailFrames = n % 4;
+        const float* endP = destP + n - tailFrames;
+
+        float32x4_t low = vdupq_n_f32(lowThreshold);
+        float32x4_t high = vdupq_n_f32(highThreshold);
+        while (destP < endP) {
+            float32x4_t source = vld1q_f32(sourceP);
+            vst1q_f32(destP, vmaxq_f32(vminq_f32(source, high), low));
+            sourceP += 4;
+            destP += 4;
+        }
+        n = tailFrames;
+    }
+#endif
     while (n--) {
         *destP = std::max(std::min(*sourceP, highThreshold), lowThreshold);
         sourceP += sourceStride;