]> granicus.if.org Git - libvpx/commitdiff
partial fdct neon: add 4x4_1
authorJohann <johannkoenig@google.com>
Fri, 23 Jun 2017 01:12:28 +0000 (18:12 -0700)
committerJohann <johannkoenig@google.com>
Wed, 28 Jun 2017 22:37:44 +0000 (15:37 -0700)
BUG=webm:1424

Change-Id: Ib0f3cfd6116fc1f5a99acb8bfd76e25b90177ffc

test/dct_partial_test.cc
vpx_dsp/arm/fdct_partial_neon.c
vpx_dsp/vpx_dsp_rtcd_defs.pl

index 11b2fadcc6741eb218249371c86bd54f04a4f49e..f197349e56ad0a40d4264af285ee86d4e3cb677b 100644 (file)
@@ -144,11 +144,13 @@ INSTANTIATE_TEST_CASE_P(
     NEON, PartialFdctTest,
     ::testing::Values(make_tuple(&vpx_fdct8x8_1_neon, 8, VPX_BITS_12),
                       make_tuple(&vpx_fdct8x8_1_neon, 8, VPX_BITS_10),
-                      make_tuple(&vpx_fdct8x8_1_neon, 8, VPX_BITS_8)));
+                      make_tuple(&vpx_fdct8x8_1_neon, 8, VPX_BITS_8),
+                      make_tuple(&vpx_fdct4x4_1_neon, 4, VPX_BITS_8)));
 #else
-INSTANTIATE_TEST_CASE_P(NEON, PartialFdctTest,
-                        ::testing::Values(make_tuple(&vpx_fdct8x8_1_neon, 8,
-                                                     VPX_BITS_8)));
+INSTANTIATE_TEST_CASE_P(
+    NEON, PartialFdctTest,
+    ::testing::Values(make_tuple(&vpx_fdct8x8_1_neon, 8, VPX_BITS_8),
+                      make_tuple(&vpx_fdct4x4_1_neon, 4, VPX_BITS_8)));
 #endif  // CONFIG_VP9_HIGHBITDEPTH
 #endif  // HAVE_NEON
 
index 3db40a11bb740894208197ff62c6a1d27b6e2103..945b96a21e60a09c2729cbd90ddabaf14727b17f 100644 (file)
 
 #include "./vpx_dsp_rtcd.h"
 #include "./vpx_config.h"
+#include "vpx_dsp/arm/mem_neon.h"
+
+static INLINE tran_low_t sum_int16x8(const int16x8_t a) {
+  const int32x4_t b = vpaddlq_s16(a);
+  const int64x2_t c = vpaddlq_s32(b);
+  const int32x2_t d = vadd_s32(vreinterpret_s32_s64(vget_low_s64(c)),
+                               vreinterpret_s32_s64(vget_high_s64(c)));
+#if CONFIG_VP9_HIGHBITDEPTH
+  return vget_lane_s32(d, 0);
+#else
+  return vget_lane_s16(vreinterpret_s16_s32(d), 0);
+#endif
+}
+
+void vpx_fdct4x4_1_neon(const int16_t *input, tran_low_t *output, int stride) {
+  int16x4_t a0, a1, a2, a3;
+  int16x8_t b0, b1;
+  int16x8_t c;
+
+  a0 = vld1_s16(input);
+  input += stride;
+  a1 = vld1_s16(input);
+  input += stride;
+  a2 = vld1_s16(input);
+  input += stride;
+  a3 = vld1_s16(input);
+
+  b0 = vcombine_s16(a0, a1);
+  b1 = vcombine_s16(a2, a3);
+
+  c = vaddq_s16(b0, b1);
+
+  output[0] = sum_int16x8(c) << 1;
+  output[1] = 0;
+}
 
 void vpx_fdct8x8_1_neon(const int16_t *input, tran_low_t *output, int stride) {
   int r;
@@ -20,16 +55,7 @@ void vpx_fdct8x8_1_neon(const int16_t *input, tran_low_t *output, int stride) {
     const int16x8_t input_00 = vld1q_s16(&input[r * stride]);
     sum = vaddq_s16(sum, input_00);
   }
-  {
-    const int32x4_t a = vpaddlq_s16(sum);
-    const int64x2_t b = vpaddlq_s32(a);
-    const int32x2_t c = vadd_s32(vreinterpret_s32_s64(vget_low_s64(b)),
-                                 vreinterpret_s32_s64(vget_high_s64(b)));
-#if CONFIG_VP9_HIGHBITDEPTH
-    output[0] = vget_lane_s32(c, 0);
-#else
-    output[0] = vget_lane_s16(vreinterpret_s16_s32(c), 0);
-#endif
-    output[1] = 0;
-  }
+
+  output[0] = sum_int16x8(sum);
+  output[1] = 0;
 }
index b6e64efac0444207a0e00eeec26af5a72e92f2b3..0453a6a6e6f953dda4d1ad4387dc405a29689428 100644 (file)
@@ -487,7 +487,7 @@ if (vpx_config("CONFIG_VP9_HIGHBITDEPTH") eq "yes") {
   specialize qw/vpx_fdct4x4 neon sse2/;
 
   add_proto qw/void vpx_fdct4x4_1/, "const int16_t *input, tran_low_t *output, int stride";
-  specialize qw/vpx_fdct4x4_1 sse2/;
+  specialize qw/vpx_fdct4x4_1 sse2 neon/;
 
   add_proto qw/void vpx_fdct8x8/, "const int16_t *input, tran_low_t *output, int stride";
   specialize qw/vpx_fdct8x8 neon sse2/;
@@ -537,7 +537,7 @@ if (vpx_config("CONFIG_VP9_HIGHBITDEPTH") eq "yes") {
   specialize qw/vpx_fdct4x4 neon sse2 msa/;
 
   add_proto qw/void vpx_fdct4x4_1/, "const int16_t *input, tran_low_t *output, int stride";
-  specialize qw/vpx_fdct4x4_1 sse2/;
+  specialize qw/vpx_fdct4x4_1 sse2 neon/;
 
   add_proto qw/void vpx_fdct8x8/, "const int16_t *input, tran_low_t *output, int stride";
   specialize qw/vpx_fdct8x8 sse2 neon msa/, "$ssse3_x86_64";