From f310ddc4704e8b1cd5ec72472495ee8c3b13a486 Mon Sep 17 00:00:00 2001 From: Johann Date: Thu, 22 Jun 2017 18:22:27 -0700 Subject: [PATCH] partial fdct neon: add 16x16_1 For the 8x8_1, the highbd output fit nicely in the existing function. 12 bit input will overflow this implementation of 16x16_1. BUG=webm:1424 Change-Id: I2945fe5478b18f996f1a5de80110fa30f3f4e7ec --- test/dct_partial_test.cc | 6 ++++-- vpx_dsp/arm/fdct_partial_neon.c | 18 ++++++++++++++++++ vpx_dsp/vpx_dsp_rtcd_defs.pl | 4 ++-- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/test/dct_partial_test.cc b/test/dct_partial_test.cc index f197349e5..95c1f7bdf 100644 --- a/test/dct_partial_test.cc +++ b/test/dct_partial_test.cc @@ -142,14 +142,16 @@ INSTANTIATE_TEST_CASE_P( #if CONFIG_VP9_HIGHBITDEPTH INSTANTIATE_TEST_CASE_P( NEON, PartialFdctTest, - ::testing::Values(make_tuple(&vpx_fdct8x8_1_neon, 8, VPX_BITS_12), + ::testing::Values(make_tuple(&vpx_fdct16x16_1_neon, 16, VPX_BITS_8), + 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_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), + ::testing::Values(make_tuple(&vpx_fdct16x16_1_neon, 16, VPX_BITS_8), + 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 diff --git a/vpx_dsp/arm/fdct_partial_neon.c b/vpx_dsp/arm/fdct_partial_neon.c index 945b96a21..4e1a6dfda 100644 --- a/vpx_dsp/arm/fdct_partial_neon.c +++ b/vpx_dsp/arm/fdct_partial_neon.c @@ -59,3 +59,21 @@ void vpx_fdct8x8_1_neon(const int16_t *input, tran_low_t *output, int stride) { output[0] = sum_int16x8(sum); output[1] = 0; } + +void vpx_fdct16x16_1_neon(const int16_t *input, tran_low_t *output, + int stride) { + int r; + int16x8_t left = vld1q_s16(input); + int16x8_t right = vld1q_s16(input + 8); + input += stride; + for (r = 1; r < 16; ++r) { + const int16x8_t a = vld1q_s16(input); + const int16x8_t b = vld1q_s16(input + 8); + input += stride; + left = vaddq_s16(left, a); + right = vaddq_s16(right, b); + } + + output[0] = (sum_int16x8(left) + sum_int16x8(right)) >> 1; + output[1] = 0; +} diff --git a/vpx_dsp/vpx_dsp_rtcd_defs.pl b/vpx_dsp/vpx_dsp_rtcd_defs.pl index 0453a6a6e..734f6e1e2 100644 --- a/vpx_dsp/vpx_dsp_rtcd_defs.pl +++ b/vpx_dsp/vpx_dsp_rtcd_defs.pl @@ -499,7 +499,7 @@ if (vpx_config("CONFIG_VP9_HIGHBITDEPTH") eq "yes") { specialize qw/vpx_fdct16x16 neon sse2/; add_proto qw/void vpx_fdct16x16_1/, "const int16_t *input, tran_low_t *output, int stride"; - specialize qw/vpx_fdct16x16_1 sse2/; + specialize qw/vpx_fdct16x16_1 sse2 neon/; add_proto qw/void vpx_fdct32x32/, "const int16_t *input, tran_low_t *output, int stride"; specialize qw/vpx_fdct32x32 neon sse2/; @@ -549,7 +549,7 @@ if (vpx_config("CONFIG_VP9_HIGHBITDEPTH") eq "yes") { specialize qw/vpx_fdct16x16 neon sse2 msa/; add_proto qw/void vpx_fdct16x16_1/, "const int16_t *input, tran_low_t *output, int stride"; - specialize qw/vpx_fdct16x16_1 sse2 msa/; + specialize qw/vpx_fdct16x16_1 sse2 neon msa/; add_proto qw/void vpx_fdct32x32/, "const int16_t *input, tran_low_t *output, int stride"; specialize qw/vpx_fdct32x32 neon sse2 avx2 msa/; -- 2.40.0