1923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org/*
2923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org *
4923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org *  Use of this source code is governed by a BSD-style license
5923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org *  that can be found in the LICENSE file in the root of the source
6923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org *  tree. An additional intellectual property rights grant can be found
7923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org *  in the file PATENTS.  All contributing project authors may
8923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org *  be found in the AUTHORS file in the root of the source tree.
9923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org */
10923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
11f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org#include <string.h>
1210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org#include "test/acm_random.h"
1310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org#include "test/register_state_check.h"
1410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org#include "test/util.h"
1510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org#include "third_party/googletest/src/include/gtest/gtest.h"
16923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
17923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#include "./vpx_config.h"
18923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#include "./vp9_rtcd.h"
19923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#include "vp9/common/vp9_filter.h"
20923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#include "vpx_mem/vpx_mem.h"
21923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#include "vpx_ports/mem.h"
22923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
23923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orgnamespace {
2487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
2587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgstatic const unsigned int kMaxDimension = 64;
2687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
27ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgtypedef void (*ConvolveFunc)(const uint8_t *src, ptrdiff_t src_stride,
28ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org                             uint8_t *dst, ptrdiff_t dst_stride,
29ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org                             const int16_t *filter_x, int filter_x_stride,
30ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org                             const int16_t *filter_y, int filter_y_stride,
31ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org                             int w, int h);
32923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
33923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orgstruct ConvolveFunctions {
34ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  ConvolveFunctions(ConvolveFunc h8, ConvolveFunc h8_avg,
35ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org                    ConvolveFunc v8, ConvolveFunc v8_avg,
3687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                    ConvolveFunc hv8, ConvolveFunc hv8_avg,
3787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                    int bd)
38923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org      : h8_(h8), v8_(v8), hv8_(hv8), h8_avg_(h8_avg), v8_avg_(v8_avg),
3987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        hv8_avg_(hv8_avg), use_high_bd_(bd) {}
40923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
41ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  ConvolveFunc h8_;
42ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  ConvolveFunc v8_;
43ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  ConvolveFunc hv8_;
44ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  ConvolveFunc h8_avg_;
45ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  ConvolveFunc v8_avg_;
46ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  ConvolveFunc hv8_avg_;
4787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  int use_high_bd_;  // 0 if high bitdepth not used, else the actual bit depth.
48923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org};
49923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
50ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgtypedef std::tr1::tuple<int, int, const ConvolveFunctions *> ConvolveParam;
51d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
52923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org// Reference 8-tap subpixel filter, slightly modified to fit into this test.
53923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#define VP9_FILTER_WEIGHT 128
54923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#define VP9_FILTER_SHIFT 7
5510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.orguint8_t clip_pixel(int x) {
56923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  return x < 0 ? 0 :
57923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org         x > 255 ? 255 :
58923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org         x;
59923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org}
60923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
6110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.orgvoid filter_block2d_8_c(const uint8_t *src_ptr,
6210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                        const unsigned int src_stride,
6310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                        const int16_t *HFilter,
6410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                        const int16_t *VFilter,
6510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                        uint8_t *dst_ptr,
6610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                        unsigned int dst_stride,
6710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                        unsigned int output_width,
6810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                        unsigned int output_height) {
69923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  // Between passes, we use an intermediate buffer whose height is extended to
70923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  // have enough horizontally filtered values as input for the vertical pass.
71923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  // This buffer is allocated to be big enough for the largest block type we
72923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  // support.
73923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  const int kInterp_Extend = 4;
74923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  const unsigned int intermediate_height =
7510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org      (kInterp_Extend - 1) + output_height + kInterp_Extend;
7687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  unsigned int i, j;
7787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
7887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  // Size of intermediate_buffer is max_intermediate_height * filter_max_width,
7987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  // where max_intermediate_height = (kInterp_Extend - 1) + filter_max_height
8087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  //                                 + kInterp_Extend
8187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  //                               = 3 + 16 + 4
8287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  //                               = 23
8387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  // and filter_max_width          = 16
8487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  //
8587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint8_t intermediate_buffer[71 * kMaxDimension];
8687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  const int intermediate_next_stride = 1 - intermediate_height * output_width;
8787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
8887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  // Horizontal pass (src -> transposed intermediate).
8987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint8_t *output_ptr = intermediate_buffer;
9087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  const int src_next_row_stride = src_stride - output_width;
9187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  src_ptr -= (kInterp_Extend - 1) * src_stride + (kInterp_Extend - 1);
9287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  for (i = 0; i < intermediate_height; ++i) {
9387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    for (j = 0; j < output_width; ++j) {
9487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      // Apply filter...
9587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      const int temp = (src_ptr[0] * HFilter[0]) +
9687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          (src_ptr[1] * HFilter[1]) +
9787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          (src_ptr[2] * HFilter[2]) +
9887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          (src_ptr[3] * HFilter[3]) +
9987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          (src_ptr[4] * HFilter[4]) +
10087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          (src_ptr[5] * HFilter[5]) +
10187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          (src_ptr[6] * HFilter[6]) +
10287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          (src_ptr[7] * HFilter[7]) +
10387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          (VP9_FILTER_WEIGHT >> 1);  // Rounding
10487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
10587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      // Normalize back to 0-255...
10687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      *output_ptr = clip_pixel(temp >> VP9_FILTER_SHIFT);
10787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      ++src_ptr;
10887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      output_ptr += intermediate_height;
10987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    }
11087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    src_ptr += src_next_row_stride;
11187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    output_ptr += intermediate_next_stride;
11287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  }
11387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
11487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  // Vertical pass (transposed intermediate -> dst).
11587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  src_ptr = intermediate_buffer;
11687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  const int dst_next_row_stride = dst_stride - output_width;
11787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  for (i = 0; i < output_height; ++i) {
11887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    for (j = 0; j < output_width; ++j) {
11987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      // Apply filter...
12087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      const int temp = (src_ptr[0] * VFilter[0]) +
12187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          (src_ptr[1] * VFilter[1]) +
12287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          (src_ptr[2] * VFilter[2]) +
12387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          (src_ptr[3] * VFilter[3]) +
12487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          (src_ptr[4] * VFilter[4]) +
12587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          (src_ptr[5] * VFilter[5]) +
12687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          (src_ptr[6] * VFilter[6]) +
12787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          (src_ptr[7] * VFilter[7]) +
12887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          (VP9_FILTER_WEIGHT >> 1);  // Rounding
12987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
13087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      // Normalize back to 0-255...
13187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      *dst_ptr++ = clip_pixel(temp >> VP9_FILTER_SHIFT);
13287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      src_ptr += intermediate_height;
13387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    }
13487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    src_ptr += intermediate_next_stride;
13587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    dst_ptr += dst_next_row_stride;
13687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  }
13787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
13887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
13987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid block2d_average_c(uint8_t *src,
14087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                       unsigned int src_stride,
14187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                       uint8_t *output_ptr,
14287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                       unsigned int output_stride,
14387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                       unsigned int output_width,
14487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                       unsigned int output_height) {
14587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  unsigned int i, j;
14687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  for (i = 0; i < output_height; ++i) {
14787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    for (j = 0; j < output_width; ++j) {
14887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      output_ptr[j] = (output_ptr[j] + src[i * src_stride + j] + 1) >> 1;
14987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    }
15087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    output_ptr += output_stride;
15187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  }
15287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
15387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
15487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid filter_average_block2d_8_c(const uint8_t *src_ptr,
15587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                const unsigned int src_stride,
15687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                const int16_t *HFilter,
15787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                const int16_t *VFilter,
15887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                uint8_t *dst_ptr,
15987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                unsigned int dst_stride,
16087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                unsigned int output_width,
16187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                unsigned int output_height) {
16287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint8_t tmp[kMaxDimension * kMaxDimension];
16387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
16487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  assert(output_width <= kMaxDimension);
16587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  assert(output_height <= kMaxDimension);
16687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  filter_block2d_8_c(src_ptr, src_stride, HFilter, VFilter, tmp, 64,
16787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                     output_width, output_height);
16887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  block2d_average_c(tmp, 64, dst_ptr, dst_stride,
16987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                    output_width, output_height);
17087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
17187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
17287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
17387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid high_filter_block2d_8_c(const uint16_t *src_ptr,
17487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             const unsigned int src_stride,
17587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             const int16_t *HFilter,
17687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             const int16_t *VFilter,
17787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             uint16_t *dst_ptr,
17887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             unsigned int dst_stride,
17987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             unsigned int output_width,
18087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             unsigned int output_height,
18187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             int bd) {
18287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  // Between passes, we use an intermediate buffer whose height is extended to
18387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  // have enough horizontally filtered values as input for the vertical pass.
18487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  // This buffer is allocated to be big enough for the largest block type we
18587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  // support.
18687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  const int kInterp_Extend = 4;
18787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  const unsigned int intermediate_height =
18887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      (kInterp_Extend - 1) + output_height + kInterp_Extend;
189923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
190923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  /* Size of intermediate_buffer is max_intermediate_height * filter_max_width,
191923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org   * where max_intermediate_height = (kInterp_Extend - 1) + filter_max_height
192923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org   *                                 + kInterp_Extend
193923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org   *                               = 3 + 16 + 4
194923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org   *                               = 23
195923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org   * and filter_max_width = 16
196923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org   */
19787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint16_t intermediate_buffer[71 * kMaxDimension];
198923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  const int intermediate_next_stride = 1 - intermediate_height * output_width;
199923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
200923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  // Horizontal pass (src -> transposed intermediate).
201923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  {
20287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    uint16_t *output_ptr = intermediate_buffer;
203923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    const int src_next_row_stride = src_stride - output_width;
204923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    unsigned int i, j;
205923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    src_ptr -= (kInterp_Extend - 1) * src_stride + (kInterp_Extend - 1);
206923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    for (i = 0; i < intermediate_height; ++i) {
207923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org      for (j = 0; j < output_width; ++j) {
208923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org        // Apply filter...
20910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        const int temp = (src_ptr[0] * HFilter[0]) +
21010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                         (src_ptr[1] * HFilter[1]) +
21110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                         (src_ptr[2] * HFilter[2]) +
21210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                         (src_ptr[3] * HFilter[3]) +
21310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                         (src_ptr[4] * HFilter[4]) +
21410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                         (src_ptr[5] * HFilter[5]) +
21510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                         (src_ptr[6] * HFilter[6]) +
21610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                         (src_ptr[7] * HFilter[7]) +
21710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                         (VP9_FILTER_WEIGHT >> 1);  // Rounding
218923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
219923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org        // Normalize back to 0-255...
22087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        *output_ptr = clip_pixel_high(temp >> VP9_FILTER_SHIFT, bd);
221923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org        ++src_ptr;
222923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org        output_ptr += intermediate_height;
223923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org      }
224923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org      src_ptr += src_next_row_stride;
225923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org      output_ptr += intermediate_next_stride;
226923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    }
227923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  }
228923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
229923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  // Vertical pass (transposed intermediate -> dst).
230923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  {
23187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    uint16_t *src_ptr = intermediate_buffer;
232923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    const int dst_next_row_stride = dst_stride - output_width;
233923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    unsigned int i, j;
234923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    for (i = 0; i < output_height; ++i) {
235923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org      for (j = 0; j < output_width; ++j) {
236923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org        // Apply filter...
23710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        const int temp = (src_ptr[0] * VFilter[0]) +
23810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                         (src_ptr[1] * VFilter[1]) +
23910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                         (src_ptr[2] * VFilter[2]) +
24010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                         (src_ptr[3] * VFilter[3]) +
24110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                         (src_ptr[4] * VFilter[4]) +
24210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                         (src_ptr[5] * VFilter[5]) +
24310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                         (src_ptr[6] * VFilter[6]) +
24410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                         (src_ptr[7] * VFilter[7]) +
24510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                         (VP9_FILTER_WEIGHT >> 1);  // Rounding
246923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
247923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org        // Normalize back to 0-255...
24887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        *dst_ptr++ = clip_pixel_high(temp >> VP9_FILTER_SHIFT, bd);
249923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org        src_ptr += intermediate_height;
250923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org      }
251923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org      src_ptr += intermediate_next_stride;
252923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org      dst_ptr += dst_next_row_stride;
253923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    }
254923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  }
255923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org}
256923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
25787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid high_block2d_average_c(uint16_t *src,
25887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            unsigned int src_stride,
25987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            uint16_t *output_ptr,
26087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            unsigned int output_stride,
26187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            unsigned int output_width,
26287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            unsigned int output_height,
26387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            int bd) {
264923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  unsigned int i, j;
265923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  for (i = 0; i < output_height; ++i) {
266923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    for (j = 0; j < output_width; ++j) {
267923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org      output_ptr[j] = (output_ptr[j] + src[i * src_stride + j] + 1) >> 1;
268923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    }
269923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    output_ptr += output_stride;
270923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  }
271923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org}
272923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
27387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid high_filter_average_block2d_8_c(const uint16_t *src_ptr,
27487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     const unsigned int src_stride,
27587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     const int16_t *HFilter,
27687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     const int16_t *VFilter,
27787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     uint16_t *dst_ptr,
27887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     unsigned int dst_stride,
27987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     unsigned int output_width,
28087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     unsigned int output_height,
28187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     int bd) {
28287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint16_t tmp[kMaxDimension * kMaxDimension];
28387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
28487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  assert(output_width <= kMaxDimension);
28587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  assert(output_height <= kMaxDimension);
28687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  high_filter_block2d_8_c(src_ptr, src_stride, HFilter, VFilter, tmp, 64,
28787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                          output_width, output_height, bd);
28887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  high_block2d_average_c(tmp, 64, dst_ptr, dst_stride,
28987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                         output_width, output_height, bd);
290923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org}
29187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif  // CONFIG_VP9_HIGHBITDEPTH
292923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
293ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgclass ConvolveTest : public ::testing::TestWithParam<ConvolveParam> {
294923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org public:
295923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  static void SetUpTestCase() {
296923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    // Force input_ to be unaligned, output to be 16 byte aligned.
297923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    input_ = reinterpret_cast<uint8_t*>(
29810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        vpx_memalign(kDataAlignment, kInputBufferSize + 1)) + 1;
299923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    output_ = reinterpret_cast<uint8_t*>(
30010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        vpx_memalign(kDataAlignment, kOutputBufferSize));
30187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
30287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    input16_ = reinterpret_cast<uint16_t*>(
30387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        vpx_memalign(kDataAlignment,
30487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                     (kInputBufferSize + 1) * sizeof(uint16_t))) + 1;
30587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    output16_ = reinterpret_cast<uint16_t*>(
30687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        vpx_memalign(kDataAlignment, (kOutputBufferSize) * sizeof(uint16_t)));
30787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
308923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  }
309923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
310923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  static void TearDownTestCase() {
311923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    vpx_free(input_ - 1);
312923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    input_ = NULL;
313923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    vpx_free(output_);
314923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    output_ = NULL;
31587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
31687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    vpx_free(input16_ - 1);
31787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    input16_ = NULL;
31887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    vpx_free(output16_);
31987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    output16_ = NULL;
32087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
321923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  }
322923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
32310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org protected:
32410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  static const int kDataAlignment = 16;
325f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org  static const int kOuterBlockSize = 256;
32610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  static const int kInputStride = kOuterBlockSize;
32710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  static const int kOutputStride = kOuterBlockSize;
32810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  static const int kInputBufferSize = kOuterBlockSize * kOuterBlockSize;
32910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  static const int kOutputBufferSize = kOuterBlockSize * kOuterBlockSize;
33010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
33110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  int Width() const { return GET_PARAM(0); }
33210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  int Height() const { return GET_PARAM(1); }
33310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  int BorderLeft() const {
33410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    const int center = (kOuterBlockSize - Width()) / 2;
33510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    return (center + (kDataAlignment - 1)) & ~(kDataAlignment - 1);
33610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  }
33710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  int BorderTop() const { return (kOuterBlockSize - Height()) / 2; }
338923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
33910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  bool IsIndexInBorder(int i) {
34010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    return (i < BorderTop() * kOuterBlockSize ||
34110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org            i >= (BorderTop() + Height()) * kOuterBlockSize ||
34210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org            i % kOuterBlockSize < BorderLeft() ||
34310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org            i % kOuterBlockSize >= (BorderLeft() + Width()));
34410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  }
345923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
34610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  virtual void SetUp() {
34710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    UUT_ = GET_PARAM(2);
34887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
34987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    if (UUT_->use_high_bd_ != 0)
35087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      mask_ = (1 << UUT_->use_high_bd_) - 1;
35187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    else
35287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      mask_ = 255;
35387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
35447265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    /* Set up guard blocks for an inner block centered in the outer block */
35510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    for (int i = 0; i < kOutputBufferSize; ++i) {
35610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org      if (IsIndexInBorder(i))
35710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        output_[i] = 255;
35810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org      else
35910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        output_[i] = 0;
360923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    }
361923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
36210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    ::libvpx_test::ACMRandom prng;
36388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    for (int i = 0; i < kInputBufferSize; ++i) {
36487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      if (i & 1) {
36588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org        input_[i] = 255;
36687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
36787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        input16_[i] = mask_;
36887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
36987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      } else {
37088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org        input_[i] = prng.Rand8Extremes();
37187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
37287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        input16_[i] = prng.Rand16() & mask_;
37387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
37487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      }
37588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    }
37610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  }
377923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
378f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org  void SetConstantInput(int value) {
379f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org    memset(input_, value, kInputBufferSize);
38087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
38187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    vpx_memset16(input16_, value, kInputBufferSize);
38287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
383f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org  }
384f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org
38510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  void CheckGuardBlocks() {
38610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    for (int i = 0; i < kOutputBufferSize; ++i) {
38710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org      if (IsIndexInBorder(i))
38810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        EXPECT_EQ(255, output_[i]);
389923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    }
39010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  }
391923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
39287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint8_t *input() const {
39387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
39487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    if (UUT_->use_high_bd_ == 0) {
39587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      return input_ + BorderTop() * kOuterBlockSize + BorderLeft();
39687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    } else {
39787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      return CONVERT_TO_BYTEPTR(input16_ + BorderTop() * kOuterBlockSize +
39887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                BorderLeft());
39987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    }
40087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#else
40110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    return input_ + BorderTop() * kOuterBlockSize + BorderLeft();
40287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
40310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  }
404923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
40587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint8_t *output() const {
40687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
40787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    if (UUT_->use_high_bd_ == 0) {
40887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      return output_ + BorderTop() * kOuterBlockSize + BorderLeft();
40987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    } else {
41087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      return CONVERT_TO_BYTEPTR(output16_ + BorderTop() * kOuterBlockSize +
41187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                BorderLeft());
41287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    }
41387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#else
41410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    return output_ + BorderTop() * kOuterBlockSize + BorderLeft();
41587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
41687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  }
41787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
41887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint16_t lookup(uint8_t *list, int index) const {
41987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
42087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    if (UUT_->use_high_bd_ == 0) {
42187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      return list[index];
42287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    } else {
42387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      return CONVERT_TO_SHORTPTR(list)[index];
42487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    }
42587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#else
42687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    return list[index];
42787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
42887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  }
42987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
43087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  void assign_val(uint8_t *list, int index, uint16_t val) const {
43187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
43287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    if (UUT_->use_high_bd_ == 0) {
43387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      list[index] = (uint8_t) val;
43487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    } else {
43587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      CONVERT_TO_SHORTPTR(list)[index] = val;
43687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    }
43787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#else
43887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    list[index] = (uint8_t) val;
43987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
44087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  }
44187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
44287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  void wrapper_filter_average_block2d_8_c(const uint8_t *src_ptr,
44387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                          const unsigned int src_stride,
44487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                          const int16_t *HFilter,
44587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                          const int16_t *VFilter,
44687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                          uint8_t *dst_ptr,
44787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                          unsigned int dst_stride,
44887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                          unsigned int output_width,
44987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                          unsigned int output_height) {
45087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
45187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    if (UUT_->use_high_bd_ == 0) {
45287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      filter_average_block2d_8_c(src_ptr, src_stride, HFilter, VFilter,
45387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 dst_ptr, dst_stride, output_width,
45487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 output_height);
45587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    } else {
45687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      high_filter_average_block2d_8_c(CONVERT_TO_SHORTPTR(src_ptr), src_stride,
45787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                      HFilter, VFilter,
45887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                      CONVERT_TO_SHORTPTR(dst_ptr), dst_stride,
45987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                      output_width, output_height,
46087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                      UUT_->use_high_bd_);
46187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    }
46287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#else
46387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    filter_average_block2d_8_c(src_ptr, src_stride, HFilter, VFilter,
46487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                               dst_ptr, dst_stride, output_width,
46587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                               output_height);
46687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
46787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  }
46887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
46987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  void wrapper_filter_block2d_8_c(const uint8_t *src_ptr,
47087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  const unsigned int src_stride,
47187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  const int16_t *HFilter,
47287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  const int16_t *VFilter,
47387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  uint8_t *dst_ptr,
47487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  unsigned int dst_stride,
47587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  unsigned int output_width,
47687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  unsigned int output_height) {
47787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
47887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    if (UUT_->use_high_bd_ == 0) {
47987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      filter_block2d_8_c(src_ptr, src_stride, HFilter, VFilter,
48087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                         dst_ptr, dst_stride, output_width, output_height);
48187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    } else {
48287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      high_filter_block2d_8_c(CONVERT_TO_SHORTPTR(src_ptr), src_stride,
48387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                              HFilter, VFilter,
48487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                              CONVERT_TO_SHORTPTR(dst_ptr), dst_stride,
48587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                              output_width, output_height, UUT_->use_high_bd_);
48687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    }
48787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#else
48887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    filter_block2d_8_c(src_ptr, src_stride, HFilter, VFilter,
48987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                       dst_ptr, dst_stride, output_width, output_height);
49087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
49110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  }
49210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
49310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  const ConvolveFunctions* UUT_;
49410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  static uint8_t* input_;
49510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  static uint8_t* output_;
49687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
49787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  static uint16_t* input16_;
49887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  static uint16_t* output16_;
49987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  int mask_;
50087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
501923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org};
50287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
503923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orguint8_t* ConvolveTest::input_ = NULL;
504923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orguint8_t* ConvolveTest::output_ = NULL;
50587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
50687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orguint16_t* ConvolveTest::input16_ = NULL;
50787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orguint16_t* ConvolveTest::output16_ = NULL;
50887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
509923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
510923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orgTEST_P(ConvolveTest, GuardBlocks) {
511923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  CheckGuardBlocks();
512923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org}
513923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
514923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orgTEST_P(ConvolveTest, CopyHoriz) {
515923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  uint8_t* const in = input();
516923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  uint8_t* const out = output();
5176ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com  DECLARE_ALIGNED(256, const int16_t, filter8[8]) = {0, 0, 0, 128, 0, 0, 0, 0};
518923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
51995aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com  ASM_REGISTER_STATE_CHECK(
520923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org      UUT_->h8_(in, kInputStride, out, kOutputStride, filter8, 16, filter8, 16,
521923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                Width(), Height()));
522923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
523923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  CheckGuardBlocks();
524923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
525923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  for (int y = 0; y < Height(); ++y)
526923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    for (int x = 0; x < Width(); ++x)
52787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      ASSERT_EQ(lookup(out, y * kOutputStride + x),
52887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                lookup(in, y * kInputStride + x))
529923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org          << "(" << x << "," << y << ")";
530923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org}
531923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
532923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orgTEST_P(ConvolveTest, CopyVert) {
533923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  uint8_t* const in = input();
534923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  uint8_t* const out = output();
5356ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com  DECLARE_ALIGNED(256, const int16_t, filter8[8]) = {0, 0, 0, 128, 0, 0, 0, 0};
536923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
53795aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com  ASM_REGISTER_STATE_CHECK(
538923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org      UUT_->v8_(in, kInputStride, out, kOutputStride, filter8, 16, filter8, 16,
539923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                Width(), Height()));
540923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
541923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  CheckGuardBlocks();
542923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
543923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  for (int y = 0; y < Height(); ++y)
544923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    for (int x = 0; x < Width(); ++x)
54587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      ASSERT_EQ(lookup(out, y * kOutputStride + x),
54687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                lookup(in, y * kInputStride + x))
547923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org          << "(" << x << "," << y << ")";
548923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org}
549923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
550923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orgTEST_P(ConvolveTest, Copy2D) {
551923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  uint8_t* const in = input();
552923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  uint8_t* const out = output();
5536ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com  DECLARE_ALIGNED(256, const int16_t, filter8[8]) = {0, 0, 0, 128, 0, 0, 0, 0};
554923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
55595aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com  ASM_REGISTER_STATE_CHECK(
556923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org      UUT_->hv8_(in, kInputStride, out, kOutputStride, filter8, 16, filter8, 16,
557923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                 Width(), Height()));
558923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
559923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  CheckGuardBlocks();
560923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
561923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  for (int y = 0; y < Height(); ++y)
562923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    for (int x = 0; x < Width(); ++x)
56387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      ASSERT_EQ(lookup(out, y * kOutputStride + x),
56487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                lookup(in, y * kInputStride + x))
565923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org          << "(" << x << "," << y << ")";
566923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org}
567923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
568693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.comconst int kNumFilterBanks = 4;
56910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.orgconst int kNumFilters = 16;
57010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
57110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.orgTEST(ConvolveTest, FiltersWontSaturateWhenAddedPairwise) {
57210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  for (int filter_bank = 0; filter_bank < kNumFilterBanks; ++filter_bank) {
573693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com    const InterpKernel *filters =
574693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com        vp9_get_interp_kernel(static_cast<INTERP_FILTER>(filter_bank));
57510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    for (int i = 0; i < kNumFilters; i++) {
57610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org      const int p0 = filters[i][0] + filters[i][1];
57710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org      const int p1 = filters[i][2] + filters[i][3];
57810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org      const int p2 = filters[i][4] + filters[i][5];
57910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org      const int p3 = filters[i][6] + filters[i][7];
58010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org      EXPECT_LE(p0, 128);
58110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org      EXPECT_LE(p1, 128);
58210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org      EXPECT_LE(p2, 128);
58310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org      EXPECT_LE(p3, 128);
58410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org      EXPECT_LE(p0 + p3, 128);
58510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org      EXPECT_LE(p0 + p3 + p1, 128);
58610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org      EXPECT_LE(p0 + p3 + p1 + p2, 128);
58710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org      EXPECT_EQ(p0 + p1 + p2 + p3, 128);
58810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    }
58910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  }
59010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org}
591923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
592923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orgconst int16_t kInvalidFilter[8] = { 0 };
593923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
594923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orgTEST_P(ConvolveTest, MatchesReferenceSubpixelFilter) {
595923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  uint8_t* const in = input();
596923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  uint8_t* const out = output();
59787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
59887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint8_t ref8[kOutputStride * kMaxDimension];
59987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint16_t ref16[kOutputStride * kMaxDimension];
60087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint8_t* ref;
60187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  if (UUT_->use_high_bd_ == 0) {
60287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    ref = ref8;
60387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  } else {
60487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    ref = CONVERT_TO_BYTEPTR(ref16);
60587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  }
60687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#else
607923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  uint8_t ref[kOutputStride * kMaxDimension];
60887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
609923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
610923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  for (int filter_bank = 0; filter_bank < kNumFilterBanks; ++filter_bank) {
611693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com    const InterpKernel *filters =
612693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com        vp9_get_interp_kernel(static_cast<INTERP_FILTER>(filter_bank));
61388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    const InterpKernel *const eighttap_smooth =
61488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org        vp9_get_interp_kernel(EIGHTTAP_SMOOTH);
61588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
616923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    for (int filter_x = 0; filter_x < kNumFilters; ++filter_x) {
617923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org      for (int filter_y = 0; filter_y < kNumFilters; ++filter_y) {
61887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        wrapper_filter_block2d_8_c(in, kInputStride,
61987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                   filters[filter_x], filters[filter_y],
62087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                   ref, kOutputStride,
62187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                   Width(), Height());
622923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
62388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org        if (filters == eighttap_smooth || (filter_x && filter_y))
62495aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com          ASM_REGISTER_STATE_CHECK(
625923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org              UUT_->hv8_(in, kInputStride, out, kOutputStride,
626923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                         filters[filter_x], 16, filters[filter_y], 16,
627923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                         Width(), Height()));
628923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org        else if (filter_y)
62995aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com          ASM_REGISTER_STATE_CHECK(
630923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org              UUT_->v8_(in, kInputStride, out, kOutputStride,
631923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                        kInvalidFilter, 16, filters[filter_y], 16,
632923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                        Width(), Height()));
633923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org        else
63495aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com          ASM_REGISTER_STATE_CHECK(
635923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org              UUT_->h8_(in, kInputStride, out, kOutputStride,
636923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                        filters[filter_x], 16, kInvalidFilter, 16,
637923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                        Width(), Height()));
638923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
639923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org        CheckGuardBlocks();
640923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
641923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org        for (int y = 0; y < Height(); ++y)
642923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org          for (int x = 0; x < Width(); ++x)
64387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            ASSERT_EQ(lookup(ref, y * kOutputStride + x),
64487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                      lookup(out, y * kOutputStride + x))
645923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                << "mismatch at (" << x << "," << y << "), "
646923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                << "filters (" << filter_bank << ","
647923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                << filter_x << "," << filter_y << ")";
648923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org      }
649923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    }
650923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  }
651923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org}
652923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
653923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orgTEST_P(ConvolveTest, MatchesReferenceAveragingSubpixelFilter) {
654923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  uint8_t* const in = input();
655923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  uint8_t* const out = output();
65687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
65787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint8_t ref8[kOutputStride * kMaxDimension];
65887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint16_t ref16[kOutputStride * kMaxDimension];
65987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint8_t* ref;
66087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  if (UUT_->use_high_bd_ == 0) {
66187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    ref = ref8;
66287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  } else {
66387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    ref = CONVERT_TO_BYTEPTR(ref16);
66487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  }
66587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#else
666923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  uint8_t ref[kOutputStride * kMaxDimension];
66787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
668923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
669923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  // Populate ref and out with some random data
670923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  ::libvpx_test::ACMRandom prng;
671923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  for (int y = 0; y < Height(); ++y) {
672923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    for (int x = 0; x < Width(); ++x) {
67387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      uint16_t r;
67487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
67587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      if (UUT_->use_high_bd_ == 0 || UUT_->use_high_bd_ == 8) {
67687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        r = prng.Rand8Extremes();
67787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      } else {
67887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        r = prng.Rand16() & mask_;
67987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      }
68087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#else
68187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      r = prng.Rand8Extremes();
68287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
683923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
68487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      assign_val(out, y * kOutputStride + x, r);
68587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      assign_val(ref, y * kOutputStride + x, r);
686923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    }
687923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  }
688923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
689923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  for (int filter_bank = 0; filter_bank < kNumFilterBanks; ++filter_bank) {
690693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com    const InterpKernel *filters =
691693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com        vp9_get_interp_kernel(static_cast<INTERP_FILTER>(filter_bank));
69288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    const InterpKernel *const eighttap_smooth =
69388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org        vp9_get_interp_kernel(EIGHTTAP_SMOOTH);
694923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
695923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    for (int filter_x = 0; filter_x < kNumFilters; ++filter_x) {
696923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org      for (int filter_y = 0; filter_y < kNumFilters; ++filter_y) {
69787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        wrapper_filter_average_block2d_8_c(in, kInputStride,
69887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                           filters[filter_x], filters[filter_y],
69987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                           ref, kOutputStride,
70087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                           Width(), Height());
701923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
70288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org        if (filters == eighttap_smooth || (filter_x && filter_y))
70395aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com          ASM_REGISTER_STATE_CHECK(
704923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org              UUT_->hv8_avg_(in, kInputStride, out, kOutputStride,
705923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                             filters[filter_x], 16, filters[filter_y], 16,
706923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                             Width(), Height()));
707923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org        else if (filter_y)
70895aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com          ASM_REGISTER_STATE_CHECK(
709923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org              UUT_->v8_avg_(in, kInputStride, out, kOutputStride,
710923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                            filters[filter_x], 16, filters[filter_y], 16,
711923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                            Width(), Height()));
712923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org        else
71395aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com          ASM_REGISTER_STATE_CHECK(
714923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org              UUT_->h8_avg_(in, kInputStride, out, kOutputStride,
715923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                            filters[filter_x], 16, filters[filter_y], 16,
716923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                            Width(), Height()));
717923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
718923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org        CheckGuardBlocks();
719923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
720923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org        for (int y = 0; y < Height(); ++y)
721923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org          for (int x = 0; x < Width(); ++x)
72287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            ASSERT_EQ(lookup(ref, y * kOutputStride + x),
72387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                      lookup(out, y * kOutputStride + x))
724923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                << "mismatch at (" << x << "," << y << "), "
725923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                << "filters (" << filter_bank << ","
726923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org                << filter_x << "," << filter_y << ")";
727923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org      }
728923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    }
729923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  }
730923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org}
731923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
73287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgTEST_P(ConvolveTest, FilterExtremes) {
73387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint8_t *const in = input();
73487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint8_t *const out = output();
73587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
73687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint8_t ref8[kOutputStride * kMaxDimension];
73787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint16_t ref16[kOutputStride * kMaxDimension];
73887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint8_t *ref;
73987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  if (UUT_->use_high_bd_ == 0) {
74087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    ref = ref8;
74187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  } else {
74287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    ref = CONVERT_TO_BYTEPTR(ref16);
74387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  }
74487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#else
74587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  uint8_t ref[kOutputStride * kMaxDimension];
74687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
74787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
74887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  // Populate ref and out with some random data
74987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  ::libvpx_test::ACMRandom prng;
75087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  for (int y = 0; y < Height(); ++y) {
75187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    for (int x = 0; x < Width(); ++x) {
75287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      uint16_t r;
75387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
75487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      if (UUT_->use_high_bd_ == 0 || UUT_->use_high_bd_ == 8) {
75587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        r = prng.Rand8Extremes();
75687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      } else {
75787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        r = prng.Rand16() & mask_;
75887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      }
75987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#else
76087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      r = prng.Rand8Extremes();
76187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
76287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      assign_val(out, y * kOutputStride + x, r);
76387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      assign_val(ref, y * kOutputStride + x, r);
76487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    }
76587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  }
76687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
76787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  for (int axis = 0; axis < 2; axis++) {
76887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    int seed_val = 0;
76987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    while (seed_val < 256) {
77087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      for (int y = 0; y < 8; ++y) {
77187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        for (int x = 0; x < 8; ++x) {
77287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
77387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            assign_val(in, y * kOutputStride + x - SUBPEL_TAPS / 2 + 1,
77487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                       ((seed_val >> (axis ? y : x)) & 1) * mask_);
77587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#else
77687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            assign_val(in, y * kOutputStride + x - SUBPEL_TAPS / 2 + 1,
77787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                       ((seed_val >> (axis ? y : x)) & 1) * 255);
77887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
77987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          if (axis) seed_val++;
78087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        }
78187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        if (axis)
78287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          seed_val-= 8;
78387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        else
78487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          seed_val++;
78587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      }
78687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      if (axis) seed_val += 8;
78787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
78887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      for (int filter_bank = 0; filter_bank < kNumFilterBanks; ++filter_bank) {
78987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        const InterpKernel *filters =
79087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            vp9_get_interp_kernel(static_cast<INTERP_FILTER>(filter_bank));
79187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        const InterpKernel *const eighttap_smooth =
79287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            vp9_get_interp_kernel(EIGHTTAP_SMOOTH);
79387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        for (int filter_x = 0; filter_x < kNumFilters; ++filter_x) {
79487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          for (int filter_y = 0; filter_y < kNumFilters; ++filter_y) {
79587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            wrapper_filter_block2d_8_c(in, kInputStride,
79687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                       filters[filter_x], filters[filter_y],
79787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                       ref, kOutputStride,
79887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                       Width(), Height());
79987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            if (filters == eighttap_smooth || (filter_x && filter_y))
80087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org              ASM_REGISTER_STATE_CHECK(
80187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                  UUT_->hv8_(in, kInputStride, out, kOutputStride,
80287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             filters[filter_x], 16, filters[filter_y], 16,
80387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             Width(), Height()));
80487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            else if (filter_y)
80587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org              ASM_REGISTER_STATE_CHECK(
80687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                  UUT_->v8_(in, kInputStride, out, kOutputStride,
80787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            kInvalidFilter, 16, filters[filter_y], 16,
80887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            Width(), Height()));
80987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            else
81087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org              ASM_REGISTER_STATE_CHECK(
81187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                  UUT_->h8_(in, kInputStride, out, kOutputStride,
81287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            filters[filter_x], 16, kInvalidFilter, 16,
81387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            Width(), Height()));
81487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
81587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org            for (int y = 0; y < Height(); ++y)
81687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org              for (int x = 0; x < Width(); ++x)
81787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                ASSERT_EQ(lookup(ref, y * kOutputStride + x),
81887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                          lookup(out, y * kOutputStride + x))
81987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                    << "mismatch at (" << x << "," << y << "), "
82087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                    << "filters (" << filter_bank << ","
82187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                    << filter_x << "," << filter_y << ")";
82287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          }
82387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        }
82487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      }
82587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    }
82687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  }
82787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
82887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
829923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orgDECLARE_ALIGNED(256, const int16_t, kChangeFilters[16][8]) = {
830923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    { 0,   0,   0,   0,   0,   0,   0, 128},
831923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    { 0,   0,   0,   0,   0,   0, 128},
832923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    { 0,   0,   0,   0,   0, 128},
833923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    { 0,   0,   0,   0, 128},
834923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    { 0,   0,   0, 128},
835923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    { 0,   0, 128},
836923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    { 0, 128},
837923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    { 128},
838923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    { 0,   0,   0,   0,   0,   0,   0, 128},
839923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    { 0,   0,   0,   0,   0,   0, 128},
840923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    { 0,   0,   0,   0,   0, 128},
841923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    { 0,   0,   0,   0, 128},
842923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    { 0,   0,   0, 128},
843923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    { 0,   0, 128},
844923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    { 0, 128},
845923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    { 128}
846923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org};
847923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
84853a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org/* This test exercises the horizontal and vertical filter functions. */
849923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orgTEST_P(ConvolveTest, ChangeFilterWorks) {
850923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  uint8_t* const in = input();
851923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  uint8_t* const out = output();
85253a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org
85353a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  /* Assume that the first input sample is at the 8/16th position. */
85453a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  const int kInitialSubPelOffset = 8;
85553a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org
85653a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  /* Filters are 8-tap, so the first filter tap will be applied to the pixel
85753a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org   * at position -3 with respect to the current filtering position. Since
85853a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org   * kInitialSubPelOffset is set to 8, we first select sub-pixel filter 8,
85953a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org   * which is non-zero only in the last tap. So, applying the filter at the
86053a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org   * current input position will result in an output equal to the pixel at
86153a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org   * offset +4 (-3 + 7) with respect to the current filtering position.
86253a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org   */
86310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org  const int kPixelSelected = 4;
864923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
86553a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  /* Assume that each output pixel requires us to step on by 17/16th pixels in
86653a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org   * the input.
86753a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org   */
86853a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  const int kInputPixelStep = 17;
86953a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org
87053a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  /* The filters are setup in such a way that the expected output produces
87153a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org   * sets of 8 identical output samples. As the filter position moves to the
87253a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org   * next 1/16th pixel position the only active (=128) filter tap moves one
87353a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org   * position to the left, resulting in the same input pixel being replicated
87453a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org   * in to the output for 8 consecutive samples. After each set of 8 positions
87553a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org   * the filters select a different input pixel. kFilterPeriodAdjust below
87653a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org   * computes which input pixel is written to the output for a specified
87753a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org   * x or y position.
87853a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org   */
87953a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org
88053a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  /* Test the horizontal filter. */
88195aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com  ASM_REGISTER_STATE_CHECK(
88295aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com      UUT_->h8_(in, kInputStride, out, kOutputStride,
88395aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com                kChangeFilters[kInitialSubPelOffset],
88495aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com                kInputPixelStep, NULL, 0, Width(), Height()));
885923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
886923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  for (int x = 0; x < Width(); ++x) {
88710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    const int kFilterPeriodAdjust = (x >> 3) << 3;
88853a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    const int ref_x =
88953a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org        kPixelSelected + ((kInitialSubPelOffset
89053a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org            + kFilterPeriodAdjust * kInputPixelStep)
89153a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org                          >> SUBPEL_BITS);
89287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    ASSERT_EQ(lookup(in, ref_x), lookup(out, x))
89387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        << "x == " << x << "width = " << Width();
894923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  }
895923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
89653a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  /* Test the vertical filter. */
89795aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com  ASM_REGISTER_STATE_CHECK(
89895aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com      UUT_->v8_(in, kInputStride, out, kOutputStride,
89995aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com                NULL, 0, kChangeFilters[kInitialSubPelOffset],
90095aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com                kInputPixelStep, Width(), Height()));
901923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
902923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  for (int y = 0; y < Height(); ++y) {
90310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    const int kFilterPeriodAdjust = (y >> 3) << 3;
90453a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    const int ref_y =
90553a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org        kPixelSelected + ((kInitialSubPelOffset
90653a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org            + kFilterPeriodAdjust * kInputPixelStep)
90753a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org                          >> SUBPEL_BITS);
90887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    ASSERT_EQ(lookup(in, ref_y * kInputStride), lookup(out, y * kInputStride))
90987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org        << "y == " << y;
910923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  }
911923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
91253a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org  /* Test the horizontal and vertical filters in combination. */
91395aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com  ASM_REGISTER_STATE_CHECK(
91495aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com      UUT_->hv8_(in, kInputStride, out, kOutputStride,
91595aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com                 kChangeFilters[kInitialSubPelOffset], kInputPixelStep,
91695aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com                 kChangeFilters[kInitialSubPelOffset], kInputPixelStep,
91795aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com                 Width(), Height()));
918923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
919923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  for (int y = 0; y < Height(); ++y) {
92010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    const int kFilterPeriodAdjustY = (y >> 3) << 3;
92153a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    const int ref_y =
92253a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org        kPixelSelected + ((kInitialSubPelOffset
92353a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org            + kFilterPeriodAdjustY * kInputPixelStep)
92453a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org                          >> SUBPEL_BITS);
925923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    for (int x = 0; x < Width(); ++x) {
92610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org      const int kFilterPeriodAdjustX = (x >> 3) << 3;
92753a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org      const int ref_x =
92853a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org          kPixelSelected + ((kInitialSubPelOffset
92953a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org              + kFilterPeriodAdjustX * kInputPixelStep)
93053a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org                            >> SUBPEL_BITS);
931923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
93287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org      ASSERT_EQ(lookup(in, ref_y * kInputStride + ref_x),
93387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                lookup(out, y * kOutputStride + x))
934923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org          << "x == " << x << ", y == " << y;
935923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    }
936923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org  }
937923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org}
938923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
939f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org/* This test exercises that enough rows and columns are filtered with every
940f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org   possible initial fractional positions and scaling steps. */
941f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.orgTEST_P(ConvolveTest, CheckScalingFiltering) {
942f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org  uint8_t* const in = input();
943f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org  uint8_t* const out = output();
94488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  const InterpKernel *const eighttap = vp9_get_interp_kernel(EIGHTTAP);
945f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org
946f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org  SetConstantInput(127);
947f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org
948f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org  for (int frac = 0; frac < 16; ++frac) {
949f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org    for (int step = 1; step <= 32; ++step) {
950f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org      /* Test the horizontal and vertical filters in combination. */
95195aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com      ASM_REGISTER_STATE_CHECK(UUT_->hv8_(in, kInputStride, out, kOutputStride,
95295aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com                                          eighttap[frac], step,
95395aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com                                          eighttap[frac], step,
95495aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com                                          Width(), Height()));
955f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org
956f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org      CheckGuardBlocks();
957f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org
958f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org      for (int y = 0; y < Height(); ++y) {
959f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org        for (int x = 0; x < Width(); ++x) {
96087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org          ASSERT_EQ(lookup(in, y * kInputStride + x),
96187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                    lookup(out, y * kOutputStride + x))
962f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org              << "x == " << x << ", y == " << y
963f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org              << ", frac == " << frac << ", step == " << step;
964f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org        }
965f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org      }
966f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org    }
967f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org  }
968f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org}
969f9586bb54d74c97d07b09eb2512f8569c9c1c025fgalligan@chromium.org
970923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orgusing std::tr1::make_tuple;
971923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
97287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
97387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if HAVE_SSE2 && ARCH_X86_64
97487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_horiz_sse2_8(const uint8_t *src, ptrdiff_t src_stride,
97587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 uint8_t *dst, ptrdiff_t dst_stride,
97687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 const int16_t *filter_x,
97787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 int filter_x_stride,
97887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 const int16_t *filter_y,
97987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 int filter_y_stride,
98087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 int w, int h) {
98187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_horiz_sse2(src, src_stride, dst, dst_stride, filter_x,
98287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                filter_x_stride, filter_y, filter_y_stride,
98387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                w, h, 8);
98487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
98587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
98687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_avg_horiz_sse2_8(const uint8_t *src, ptrdiff_t src_stride,
98787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     uint8_t *dst, ptrdiff_t dst_stride,
98887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     const int16_t *filter_x,
98987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     int filter_x_stride,
99087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     const int16_t *filter_y,
99187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     int filter_y_stride,
99287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     int w, int h) {
99387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_avg_horiz_sse2(src, src_stride, dst, dst_stride, filter_x,
99487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    filter_x_stride, filter_y, filter_y_stride, w, h, 8);
99587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
99687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
99787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_vert_sse2_8(const uint8_t *src, ptrdiff_t src_stride,
99887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                uint8_t *dst, ptrdiff_t dst_stride,
99987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                const int16_t *filter_x,
100087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                int filter_x_stride,
100187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                const int16_t *filter_y,
100287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                int filter_y_stride,
100387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                int w, int h) {
100487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_vert_sse2(src, src_stride, dst, dst_stride, filter_x,
100587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    filter_x_stride, filter_y, filter_y_stride, w, h, 8);
100687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
100787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
100887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_avg_vert_sse2_8(const uint8_t *src, ptrdiff_t src_stride,
100987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                    uint8_t *dst, ptrdiff_t dst_stride,
101087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                    const int16_t *filter_x,
101187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                    int filter_x_stride,
101287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                    const int16_t *filter_y,
101387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                    int filter_y_stride,
101487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                    int w, int h) {
101587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_avg_vert_sse2(src, src_stride, dst, dst_stride, filter_x,
101687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                   filter_x_stride, filter_y, filter_y_stride,
101787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                   w, h, 8);
101887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
101987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
102087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_sse2_8(const uint8_t *src, ptrdiff_t src_stride,
102187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                           uint8_t *dst, ptrdiff_t dst_stride,
102287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                           const int16_t *filter_x,
102387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                           int filter_x_stride,
102487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                           const int16_t *filter_y,
102587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                           int filter_y_stride,
102687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                           int w, int h) {
102787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_sse2(src, src_stride, dst, dst_stride, filter_x,
102887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    filter_x_stride, filter_y, filter_y_stride, w, h, 8);
102987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
103087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
103187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_avg_sse2_8(const uint8_t *src, ptrdiff_t src_stride,
103287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                               uint8_t *dst, ptrdiff_t dst_stride,
103387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                               const int16_t *filter_x,
103487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                               int filter_x_stride,
103587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                               const int16_t *filter_y,
103687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                               int filter_y_stride,
103787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                               int w, int h) {
103887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_avg_sse2(src, src_stride, dst, dst_stride, filter_x,
103987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    filter_x_stride, filter_y, filter_y_stride, w, h, 8);
104087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
104187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
104287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_horiz_sse2_10(const uint8_t *src, ptrdiff_t src_stride,
104387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  uint8_t *dst, ptrdiff_t dst_stride,
104487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  const int16_t *filter_x,
104587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  int filter_x_stride,
104687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  const int16_t *filter_y,
104787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  int filter_y_stride,
104887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  int w, int h) {
104987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_horiz_sse2(src, src_stride, dst, dst_stride, filter_x,
105087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    filter_x_stride, filter_y, filter_y_stride, w, h, 10);
105187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
105287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
105387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_avg_horiz_sse2_10(const uint8_t *src, ptrdiff_t src_stride,
105487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                      uint8_t *dst, ptrdiff_t dst_stride,
105587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                      const int16_t *filter_x,
105687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                      int filter_x_stride,
105787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                      const int16_t *filter_y,
105887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                      int filter_y_stride,
105987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                      int w, int h) {
106087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_avg_horiz_sse2(src, src_stride, dst, dst_stride, filter_x,
106187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    filter_x_stride, filter_y, filter_y_stride, w, h, 10);
106287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
106387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
106487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_vert_sse2_10(const uint8_t *src, ptrdiff_t src_stride,
106587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 uint8_t *dst, ptrdiff_t dst_stride,
106687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 const int16_t *filter_x,
106787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 int filter_x_stride,
106887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 const int16_t *filter_y,
106987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 int filter_y_stride,
107087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 int w, int h) {
107187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_vert_sse2(src, src_stride, dst, dst_stride, filter_x,
107287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    filter_x_stride, filter_y, filter_y_stride, w, h, 10);
107387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
107487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
107587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_avg_vert_sse2_10(const uint8_t *src, ptrdiff_t src_stride,
107687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     uint8_t *dst, ptrdiff_t dst_stride,
107787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     const int16_t *filter_x,
107887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     int filter_x_stride,
107987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     const int16_t *filter_y,
108087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     int filter_y_stride,
108187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     int w, int h) {
108287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_avg_vert_sse2(src, src_stride, dst, dst_stride, filter_x,
108387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    filter_x_stride, filter_y, filter_y_stride, w, h, 10);
108487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
108587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
108687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_sse2_10(const uint8_t *src, ptrdiff_t src_stride,
108787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            uint8_t *dst, ptrdiff_t dst_stride,
108887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            const int16_t *filter_x,
108987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            int filter_x_stride,
109087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            const int16_t *filter_y,
109187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            int filter_y_stride,
109287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            int w, int h) {
109387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_sse2(src, src_stride, dst, dst_stride, filter_x,
109487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    filter_x_stride, filter_y, filter_y_stride, w, h, 10);
109587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
109687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
109787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_avg_sse2_10(const uint8_t *src, ptrdiff_t src_stride,
109887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                uint8_t *dst, ptrdiff_t dst_stride,
109987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                const int16_t *filter_x,
110087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                int filter_x_stride,
110187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                const int16_t *filter_y,
110287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                int filter_y_stride,
110387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                int w, int h) {
110487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_avg_sse2(src, src_stride, dst, dst_stride, filter_x,
110587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                              filter_x_stride, filter_y, filter_y_stride,
110687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                              w, h, 10);
110787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
110887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
110987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_horiz_sse2_12(const uint8_t *src, ptrdiff_t src_stride,
111087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  uint8_t *dst, ptrdiff_t dst_stride,
111187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  const int16_t *filter_x,
111287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  int filter_x_stride,
111387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  const int16_t *filter_y,
111487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  int filter_y_stride,
111587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  int w, int h) {
111687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_horiz_sse2(src, src_stride, dst, dst_stride, filter_x,
111787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                filter_x_stride, filter_y, filter_y_stride,
111887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                w, h, 12);
111987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
112087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
112187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_avg_horiz_sse2_12(const uint8_t *src, ptrdiff_t src_stride,
112287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                      uint8_t *dst, ptrdiff_t dst_stride,
112387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                      const int16_t *filter_x,
112487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                      int filter_x_stride,
112587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                      const int16_t *filter_y,
112687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                      int filter_y_stride,
112787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                      int w, int h) {
112887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_avg_horiz_sse2(src, src_stride, dst, dst_stride, filter_x,
112987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                    filter_x_stride, filter_y, filter_y_stride,
113087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                    w, h, 12);
113187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
113287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
113387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_vert_sse2_12(const uint8_t *src, ptrdiff_t src_stride,
113487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 uint8_t *dst, ptrdiff_t dst_stride,
113587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 const int16_t *filter_x,
113687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 int filter_x_stride,
113787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 const int16_t *filter_y,
113887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 int filter_y_stride,
113987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 int w, int h) {
114087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_vert_sse2(src, src_stride, dst, dst_stride, filter_x,
114187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                               filter_x_stride, filter_y, filter_y_stride,
114287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                               w, h, 12);
114387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
114487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
114587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_avg_vert_sse2_12(const uint8_t *src, ptrdiff_t src_stride,
114687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     uint8_t *dst, ptrdiff_t dst_stride,
114787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     const int16_t *filter_x,
114887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     int filter_x_stride,
114987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     const int16_t *filter_y,
115087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     int filter_y_stride,
115187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                     int w, int h) {
115287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_avg_vert_sse2(src, src_stride, dst, dst_stride, filter_x,
115387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                   filter_x_stride, filter_y, filter_y_stride, w, h, 12);
115487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
115587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
115687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_sse2_12(const uint8_t *src, ptrdiff_t src_stride,
115787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            uint8_t *dst, ptrdiff_t dst_stride,
115887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            const int16_t *filter_x,
115987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            int filter_x_stride,
116087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            const int16_t *filter_y,
116187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            int filter_y_stride,
116287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            int w, int h) {
116387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_sse2(src, src_stride, dst, dst_stride, filter_x,
116487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    filter_x_stride, filter_y, filter_y_stride, w, h, 12);
116587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
116687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
116787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_avg_sse2_12(const uint8_t *src, ptrdiff_t src_stride,
116887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                uint8_t *dst, ptrdiff_t dst_stride,
116987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                const int16_t *filter_x,
117087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                int filter_x_stride,
117187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                const int16_t *filter_y,
117287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                int filter_y_stride,
117387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                int w, int h) {
117487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_avg_sse2(src, src_stride, dst, dst_stride, filter_x,
117587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                              filter_x_stride, filter_y, filter_y_stride, w, h, 12);
117687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
117787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif  // HAVE_SSE2 && ARCH_X86_64
117887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
117987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_horiz_c_8(const uint8_t *src, ptrdiff_t src_stride,
118087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                              uint8_t *dst, ptrdiff_t dst_stride,
118187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                              const int16_t *filter_x,
118287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                              int filter_x_stride,
118387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                              const int16_t *filter_y,
118487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                              int filter_y_stride,
118587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                              int w, int h) {
118687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_horiz_c(src, src_stride, dst, dst_stride, filter_x,
118787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             filter_x_stride, filter_y, filter_y_stride, w, h, 8);
118887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
118987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
119087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_avg_horiz_c_8(const uint8_t *src, ptrdiff_t src_stride,
119187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  uint8_t *dst, ptrdiff_t dst_stride,
119287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  const int16_t *filter_x,
119387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  int filter_x_stride,
119487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  const int16_t *filter_y,
119587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  int filter_y_stride,
119687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  int w, int h) {
119787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_avg_horiz_c(src, src_stride, dst, dst_stride, filter_x,
119887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 filter_x_stride, filter_y, filter_y_stride, w, h, 8);
119987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
120087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
120187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_vert_c_8(const uint8_t *src, ptrdiff_t src_stride,
120287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             uint8_t *dst, ptrdiff_t dst_stride,
120387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             const int16_t *filter_x,
120487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             int filter_x_stride,
120587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             const int16_t *filter_y,
120687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             int filter_y_stride,
120787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             int w, int h) {
120887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_vert_c(src, src_stride, dst, dst_stride, filter_x,
120987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            filter_x_stride, filter_y, filter_y_stride, w, h, 8);
121087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
121187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
121287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_avg_vert_c_8(const uint8_t *src, ptrdiff_t src_stride,
121387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 uint8_t *dst, ptrdiff_t dst_stride,
121487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 const int16_t *filter_x,
121587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 int filter_x_stride,
121687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 const int16_t *filter_y,
121787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 int filter_y_stride,
121887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 int w, int h) {
121987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_avg_vert_c(src, src_stride, dst, dst_stride, filter_x,
122087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                filter_x_stride, filter_y, filter_y_stride, w, h, 8);
122187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
122287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
122387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_c_8(const uint8_t *src, ptrdiff_t src_stride,
122487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                        uint8_t *dst, ptrdiff_t dst_stride,
122587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                        const int16_t *filter_x,
122687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                        int filter_x_stride,
122787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                        const int16_t *filter_y,
122887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                        int filter_y_stride,
122987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                        int w, int h) {
123087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_c(src, src_stride, dst, dst_stride, filter_x,
123187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                       filter_x_stride, filter_y, filter_y_stride, w, h, 8);
123287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
123387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
123487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_avg_c_8(const uint8_t *src, ptrdiff_t src_stride,
123587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            uint8_t *dst, ptrdiff_t dst_stride,
123687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            const int16_t *filter_x,
123787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            int filter_x_stride,
123887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            const int16_t *filter_y,
123987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            int filter_y_stride,
124087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            int w, int h) {
124187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_avg_c(src, src_stride, dst, dst_stride, filter_x,
124287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                           filter_x_stride, filter_y, filter_y_stride,
124387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                           w, h, 8);
124487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
124587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
124687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_horiz_c_10(const uint8_t *src, ptrdiff_t src_stride,
124787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                               uint8_t *dst, ptrdiff_t dst_stride,
124887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                               const int16_t *filter_x,
124987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                               int filter_x_stride,
125087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                               const int16_t *filter_y,
125187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                               int filter_y_stride,
125287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                               int w, int h) {
125387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_horiz_c(src, src_stride, dst, dst_stride, filter_x,
125487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             filter_x_stride, filter_y, filter_y_stride, w, h, 10);
125587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
125687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
125787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_avg_horiz_c_10(const uint8_t *src, ptrdiff_t src_stride,
125887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                   uint8_t *dst, ptrdiff_t dst_stride,
125987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                   const int16_t *filter_x,
126087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                   int filter_x_stride,
126187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                   const int16_t *filter_y,
126287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                   int filter_y_stride,
126387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                   int w, int h) {
126487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_avg_horiz_c(src, src_stride, dst, dst_stride, filter_x,
126587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 filter_x_stride, filter_y, filter_y_stride,
126687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 w, h, 10);
126787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
126887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
126987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_vert_c_10(const uint8_t *src, ptrdiff_t src_stride,
127087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                              uint8_t *dst, ptrdiff_t dst_stride,
127187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                              const int16_t *filter_x,
127287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                              int filter_x_stride,
127387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                              const int16_t *filter_y,
127487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                              int filter_y_stride,
127587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                              int w, int h) {
127687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_vert_c(src, src_stride, dst, dst_stride, filter_x,
127787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            filter_x_stride, filter_y, filter_y_stride, w, h, 10);
127887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
127987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
128087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_avg_vert_c_10(const uint8_t *src, ptrdiff_t src_stride,
128187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  uint8_t *dst, ptrdiff_t dst_stride,
128287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  const int16_t *filter_x,
128387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  int filter_x_stride,
128487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  const int16_t *filter_y,
128587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  int filter_y_stride,
128687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  int w, int h) {
128787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_avg_vert_c(src, src_stride, dst, dst_stride, filter_x,
128887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                filter_x_stride, filter_y, filter_y_stride, w, h, 10);
128987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
129087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
129187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_c_10(const uint8_t *src, ptrdiff_t src_stride,
129287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                         uint8_t *dst, ptrdiff_t dst_stride,
129387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                         const int16_t *filter_x,
129487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                         int filter_x_stride,
129587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                         const int16_t *filter_y,
129687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                         int filter_y_stride,
129787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                         int w, int h) {
129887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_c(src, src_stride, dst, dst_stride, filter_x,
129987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    filter_x_stride, filter_y, filter_y_stride, w, h, 10);
130087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
130187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
130287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_avg_c_10(const uint8_t *src, ptrdiff_t src_stride,
130387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             uint8_t *dst, ptrdiff_t dst_stride,
130487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             const int16_t *filter_x,
130587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             int filter_x_stride,
130687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             const int16_t *filter_y,
130787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             int filter_y_stride,
130887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             int w, int h) {
130987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_avg_c(src, src_stride, dst, dst_stride, filter_x,
131087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                           filter_x_stride, filter_y, filter_y_stride, w, h, 10);
131187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
131287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
131387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_horiz_c_12(const uint8_t *src, ptrdiff_t src_stride,
131487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                               uint8_t *dst, ptrdiff_t dst_stride,
131587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                               const int16_t *filter_x,
131687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                               int filter_x_stride,
131787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                               const int16_t *filter_y,
131887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                               int filter_y_stride,
131987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                               int w, int h) {
132087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_horiz_c(src, src_stride, dst, dst_stride, filter_x,
132187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             filter_x_stride, filter_y, filter_y_stride,
132287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             w, h, 12);
132387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
132487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
132587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_avg_horiz_c_12(const uint8_t *src, ptrdiff_t src_stride,
132687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                   uint8_t *dst, ptrdiff_t dst_stride,
132787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                   const int16_t *filter_x,
132887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                   int filter_x_stride,
132987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                   const int16_t *filter_y,
133087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                   int filter_y_stride,
133187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                   int w, int h) {
133287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_avg_horiz_c(src, src_stride, dst, dst_stride, filter_x,
133387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 filter_x_stride, filter_y, filter_y_stride,
133487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                 w, h, 12);
133587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
133687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
133787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_vert_c_12(const uint8_t *src, ptrdiff_t src_stride,
133887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                              uint8_t *dst, ptrdiff_t dst_stride,
133987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                              const int16_t *filter_x,
134087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                              int filter_x_stride,
134187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                              const int16_t *filter_y,
134287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                              int filter_y_stride,
134387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                              int w, int h) {
134487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_vert_c(src, src_stride, dst, dst_stride, filter_x,
134587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            filter_x_stride, filter_y, filter_y_stride,
134687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                            w, h, 12);
134787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
134887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
134987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_avg_vert_c_12(const uint8_t *src, ptrdiff_t src_stride,
135087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  uint8_t *dst, ptrdiff_t dst_stride,
135187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  const int16_t *filter_x,
135287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  int filter_x_stride,
135387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  const int16_t *filter_y,
135487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  int filter_y_stride,
135587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                  int w, int h) {
135687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_avg_vert_c(src, src_stride, dst, dst_stride, filter_x,
135787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                filter_x_stride, filter_y, filter_y_stride,
135887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                                w, h, 12);
135987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
136087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
136187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_c_12(const uint8_t *src, ptrdiff_t src_stride,
136287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                         uint8_t *dst, ptrdiff_t dst_stride,
136387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                         const int16_t *filter_x,
136487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                         int filter_x_stride,
136587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                         const int16_t *filter_y,
136687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                         int filter_y_stride,
136787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                         int w, int h) {
136887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_c(src, src_stride, dst, dst_stride, filter_x,
136987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                       filter_x_stride, filter_y, filter_y_stride,
137087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                       w, h, 12);
137187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
137287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
137387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid wrap_convolve8_avg_c_12(const uint8_t *src, ptrdiff_t src_stride,
137487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             uint8_t *dst, ptrdiff_t dst_stride,
137587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             const int16_t *filter_x,
137687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             int filter_x_stride,
137787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             const int16_t *filter_y,
137887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             int filter_y_stride,
137987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                             int w, int h) {
138087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  vp9_high_convolve8_avg_c(src, src_stride, dst, dst_stride, filter_x,
138187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                           filter_x_stride, filter_y, filter_y_stride,
138287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                           w, h, 12);
138387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org}
138487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
138587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgconst ConvolveFunctions convolve8_c(
138687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    wrap_convolve8_horiz_c_8, wrap_convolve8_avg_horiz_c_8,
138787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    wrap_convolve8_vert_c_8, wrap_convolve8_avg_vert_c_8,
138887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    wrap_convolve8_c_8, wrap_convolve8_avg_c_8, 8);
138987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P(C_8, ConvolveTest, ::testing::Values(
139087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(4, 4, &convolve8_c),
139187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(8, 4, &convolve8_c),
139287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(4, 8, &convolve8_c),
139387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(8, 8, &convolve8_c),
139487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(16, 8, &convolve8_c),
139587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(8, 16, &convolve8_c),
139687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(16, 16, &convolve8_c),
139787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(32, 16, &convolve8_c),
139887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(16, 32, &convolve8_c),
139987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(32, 32, &convolve8_c),
140087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(64, 32, &convolve8_c),
140187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(32, 64, &convolve8_c),
140287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(64, 64, &convolve8_c)));
140387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgconst ConvolveFunctions convolve10_c(
140487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    wrap_convolve8_horiz_c_10, wrap_convolve8_avg_horiz_c_10,
140587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    wrap_convolve8_vert_c_10, wrap_convolve8_avg_vert_c_10,
140687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    wrap_convolve8_c_10, wrap_convolve8_avg_c_10, 10);
140787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P(C_10, ConvolveTest, ::testing::Values(
140887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(4, 4, &convolve10_c),
140987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(8, 4, &convolve10_c),
141087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(4, 8, &convolve10_c),
141187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(8, 8, &convolve10_c),
141287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(16, 8, &convolve10_c),
141387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(8, 16, &convolve10_c),
141487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(16, 16, &convolve10_c),
141587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(32, 16, &convolve10_c),
141687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(16, 32, &convolve10_c),
141787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(32, 32, &convolve10_c),
141887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(64, 32, &convolve10_c),
141987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(32, 64, &convolve10_c),
142087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(64, 64, &convolve10_c)));
142187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgconst ConvolveFunctions convolve12_c(
142287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    wrap_convolve8_horiz_c_12, wrap_convolve8_avg_horiz_c_12,
142387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    wrap_convolve8_vert_c_12, wrap_convolve8_avg_vert_c_12,
142487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    wrap_convolve8_c_12, wrap_convolve8_avg_c_12, 12);
142587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P(C_12, ConvolveTest, ::testing::Values(
142687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(4, 4, &convolve12_c),
142787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(8, 4, &convolve12_c),
142887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(4, 8, &convolve12_c),
142987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(8, 8, &convolve12_c),
143087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(16, 8, &convolve12_c),
143187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(8, 16, &convolve12_c),
143287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(16, 16, &convolve12_c),
143387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(32, 16, &convolve12_c),
143487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(16, 32, &convolve12_c),
143587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(32, 32, &convolve12_c),
143687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(64, 32, &convolve12_c),
143787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(32, 64, &convolve12_c),
143887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(64, 64, &convolve12_c)));
143987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
144087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#else
144187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org
1442923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orgconst ConvolveFunctions convolve8_c(
1443923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    vp9_convolve8_horiz_c, vp9_convolve8_avg_horiz_c,
1444923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    vp9_convolve8_vert_c, vp9_convolve8_avg_vert_c,
144587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    vp9_convolve8_c, vp9_convolve8_avg_c, 0);
1446923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
1447923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P(C, ConvolveTest, ::testing::Values(
1448923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    make_tuple(4, 4, &convolve8_c),
1449923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    make_tuple(8, 4, &convolve8_c),
145010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    make_tuple(4, 8, &convolve8_c),
1451923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    make_tuple(8, 8, &convolve8_c),
1452923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    make_tuple(16, 8, &convolve8_c),
145310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    make_tuple(8, 16, &convolve8_c),
145410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    make_tuple(16, 16, &convolve8_c),
145510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    make_tuple(32, 16, &convolve8_c),
145610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    make_tuple(16, 32, &convolve8_c),
145710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    make_tuple(32, 32, &convolve8_c),
145810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    make_tuple(64, 32, &convolve8_c),
145910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    make_tuple(32, 64, &convolve8_c),
146010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    make_tuple(64, 64, &convolve8_c)));
146187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif
1462923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
146387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if HAVE_SSE2 && ARCH_X86_64
146487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if CONFIG_VP9_HIGHBITDEPTH
146587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgconst ConvolveFunctions convolve8_sse2(
146687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    wrap_convolve8_horiz_sse2_8, wrap_convolve8_avg_horiz_sse2_8,
146787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    wrap_convolve8_vert_sse2_8, wrap_convolve8_avg_vert_sse2_8,
146887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    wrap_convolve8_sse2_8, wrap_convolve8_avg_sse2_8, 8);
146987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P(SSE2_8, ConvolveTest, ::testing::Values(
147087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(4, 4, &convolve8_sse2),
147187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(8, 4, &convolve8_sse2),
147287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(4, 8, &convolve8_sse2),
147387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(8, 8, &convolve8_sse2),
147487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(16, 8, &convolve8_sse2),
147587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(8, 16, &convolve8_sse2),
147687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(16, 16, &convolve8_sse2),
147787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(32, 16, &convolve8_sse2),
147887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(16, 32, &convolve8_sse2),
147987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(32, 32, &convolve8_sse2),
148087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(64, 32, &convolve8_sse2),
148187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(32, 64, &convolve8_sse2),
148287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(64, 64, &convolve8_sse2)));
148387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgconst ConvolveFunctions convolve10_sse2(
148487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    wrap_convolve8_horiz_sse2_10, wrap_convolve8_avg_horiz_sse2_10,
148587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    wrap_convolve8_vert_sse2_10, wrap_convolve8_avg_vert_sse2_10,
148687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    wrap_convolve8_sse2_10, wrap_convolve8_avg_sse2_10, 10);
148787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P(SSE2_10, ConvolveTest, ::testing::Values(
148887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(4, 4, &convolve10_sse2),
148987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(8, 4, &convolve10_sse2),
149087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(4, 8, &convolve10_sse2),
149187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(8, 8, &convolve10_sse2),
149287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(16, 8, &convolve10_sse2),
149387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(8, 16, &convolve10_sse2),
149487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(16, 16, &convolve10_sse2),
149587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(32, 16, &convolve10_sse2),
149687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(16, 32, &convolve10_sse2),
149787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(32, 32, &convolve10_sse2),
149887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(64, 32, &convolve10_sse2),
149987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(32, 64, &convolve10_sse2),
150087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(64, 64, &convolve10_sse2)));
150187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgconst ConvolveFunctions convolve12_sse2(
150287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    wrap_convolve8_horiz_sse2_12, wrap_convolve8_avg_horiz_sse2_12,
150387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    wrap_convolve8_vert_sse2_12, wrap_convolve8_avg_vert_sse2_12,
150487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    wrap_convolve8_sse2_12, wrap_convolve8_avg_sse2_12, 12);
150587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P(SSE2_12, ConvolveTest, ::testing::Values(
150687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(4, 4, &convolve12_sse2),
150787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(8, 4, &convolve12_sse2),
150887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(4, 8, &convolve12_sse2),
150987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(8, 8, &convolve12_sse2),
151087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(16, 8, &convolve12_sse2),
151187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(8, 16, &convolve12_sse2),
151287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(16, 16, &convolve12_sse2),
151387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(32, 16, &convolve12_sse2),
151487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(16, 32, &convolve12_sse2),
151587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(32, 32, &convolve12_sse2),
151687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(64, 32, &convolve12_sse2),
151787997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(32, 64, &convolve12_sse2),
151887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    make_tuple(64, 64, &convolve12_sse2)));
151987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#else
15200d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.orgconst ConvolveFunctions convolve8_sse2(
15210d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    vp9_convolve8_horiz_sse2, vp9_convolve8_avg_horiz_sse2,
15220d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    vp9_convolve8_vert_sse2, vp9_convolve8_avg_vert_sse2,
152387997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    vp9_convolve8_sse2, vp9_convolve8_avg_sse2, 0);
15240d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org
15250d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P(SSE2, ConvolveTest, ::testing::Values(
15260d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    make_tuple(4, 4, &convolve8_sse2),
15270d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    make_tuple(8, 4, &convolve8_sse2),
15280d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    make_tuple(4, 8, &convolve8_sse2),
15290d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    make_tuple(8, 8, &convolve8_sse2),
15300d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    make_tuple(16, 8, &convolve8_sse2),
15310d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    make_tuple(8, 16, &convolve8_sse2),
15320d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    make_tuple(16, 16, &convolve8_sse2),
15330d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    make_tuple(32, 16, &convolve8_sse2),
15340d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    make_tuple(16, 32, &convolve8_sse2),
15350d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    make_tuple(32, 32, &convolve8_sse2),
15360d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    make_tuple(64, 32, &convolve8_sse2),
15370d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    make_tuple(32, 64, &convolve8_sse2),
15380d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    make_tuple(64, 64, &convolve8_sse2)));
153987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif  // CONFIG_VP9_HIGHBITDEPTH
15400d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org#endif
15410d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org
1542923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#if HAVE_SSSE3
1543923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orgconst ConvolveFunctions convolve8_ssse3(
154453a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    vp9_convolve8_horiz_ssse3, vp9_convolve8_avg_horiz_ssse3,
154553a13f1fa964820f7a8f9d3932a6f3c0433f8bf5fgalligan@chromium.org    vp9_convolve8_vert_ssse3, vp9_convolve8_avg_vert_ssse3,
154687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    vp9_convolve8_ssse3, vp9_convolve8_avg_ssse3, 0);
1547923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org
1548923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P(SSSE3, ConvolveTest, ::testing::Values(
1549923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    make_tuple(4, 4, &convolve8_ssse3),
1550923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    make_tuple(8, 4, &convolve8_ssse3),
155110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    make_tuple(4, 8, &convolve8_ssse3),
1552923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    make_tuple(8, 8, &convolve8_ssse3),
1553923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org    make_tuple(16, 8, &convolve8_ssse3),
155410a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    make_tuple(8, 16, &convolve8_ssse3),
155510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    make_tuple(16, 16, &convolve8_ssse3),
155610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    make_tuple(32, 16, &convolve8_ssse3),
155710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    make_tuple(16, 32, &convolve8_ssse3),
155810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    make_tuple(32, 32, &convolve8_ssse3),
155910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    make_tuple(64, 32, &convolve8_ssse3),
156010a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    make_tuple(32, 64, &convolve8_ssse3),
156110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org    make_tuple(64, 64, &convolve8_ssse3)));
1562923acb6a717b7f2719ed21184c1bc533b0a14888johannkoenig@chromium.org#endif
156347265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org
156487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#if HAVE_AVX2 && HAVE_SSSE3
156588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgconst ConvolveFunctions convolve8_avx2(
156688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vp9_convolve8_horiz_avx2, vp9_convolve8_avg_horiz_ssse3,
156788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    vp9_convolve8_vert_avx2, vp9_convolve8_avg_vert_ssse3,
156887997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    vp9_convolve8_avx2, vp9_convolve8_avg_ssse3, 0);
156988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
157088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgINSTANTIATE_TEST_CASE_P(AVX2, ConvolveTest, ::testing::Values(
157188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    make_tuple(4, 4, &convolve8_avx2),
157288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    make_tuple(8, 4, &convolve8_avx2),
157388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    make_tuple(4, 8, &convolve8_avx2),
157488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    make_tuple(8, 8, &convolve8_avx2),
1575ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org    make_tuple(8, 16, &convolve8_avx2),
157688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    make_tuple(16, 8, &convolve8_avx2),
157788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    make_tuple(16, 16, &convolve8_avx2),
157888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    make_tuple(32, 16, &convolve8_avx2),
157988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    make_tuple(16, 32, &convolve8_avx2),
158088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    make_tuple(32, 32, &convolve8_avx2),
158188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    make_tuple(64, 32, &convolve8_avx2),
158288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    make_tuple(32, 64, &convolve8_avx2),
158388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    make_tuple(64, 64, &convolve8_avx2)));
158487997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#endif  // HAVE_AVX2 && HAVE_SSSE3
158588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
15867765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org#if HAVE_NEON_ASM
158747265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.orgconst ConvolveFunctions convolve8_neon(
158847265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    vp9_convolve8_horiz_neon, vp9_convolve8_avg_horiz_neon,
158947265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    vp9_convolve8_vert_neon, vp9_convolve8_avg_vert_neon,
159087997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    vp9_convolve8_neon, vp9_convolve8_avg_neon, 0);
159147265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org
159247265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P(NEON, ConvolveTest, ::testing::Values(
159347265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    make_tuple(4, 4, &convolve8_neon),
159447265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    make_tuple(8, 4, &convolve8_neon),
159547265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    make_tuple(4, 8, &convolve8_neon),
159647265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    make_tuple(8, 8, &convolve8_neon),
159747265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    make_tuple(16, 8, &convolve8_neon),
159847265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    make_tuple(8, 16, &convolve8_neon),
159947265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    make_tuple(16, 16, &convolve8_neon),
160047265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    make_tuple(32, 16, &convolve8_neon),
160147265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    make_tuple(16, 32, &convolve8_neon),
160247265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    make_tuple(32, 32, &convolve8_neon),
160347265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    make_tuple(64, 32, &convolve8_neon),
160447265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    make_tuple(32, 64, &convolve8_neon),
160547265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org    make_tuple(64, 64, &convolve8_neon)));
160647265f8fe3a36a426773454ad90d20c9aa616c24johannkoenig@chromium.org#endif
16070d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org
16080d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org#if HAVE_DSPR2
16090d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.orgconst ConvolveFunctions convolve8_dspr2(
16100d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    vp9_convolve8_horiz_dspr2, vp9_convolve8_avg_horiz_dspr2,
16110d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    vp9_convolve8_vert_dspr2, vp9_convolve8_avg_vert_dspr2,
161287997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org    vp9_convolve8_dspr2, vp9_convolve8_avg_dspr2, 0);
16130d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org
16140d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.orgINSTANTIATE_TEST_CASE_P(DSPR2, ConvolveTest, ::testing::Values(
16150d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    make_tuple(4, 4, &convolve8_dspr2),
16160d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    make_tuple(8, 4, &convolve8_dspr2),
16170d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    make_tuple(4, 8, &convolve8_dspr2),
16180d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    make_tuple(8, 8, &convolve8_dspr2),
16190d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    make_tuple(16, 8, &convolve8_dspr2),
16200d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    make_tuple(8, 16, &convolve8_dspr2),
16210d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    make_tuple(16, 16, &convolve8_dspr2),
16220d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    make_tuple(32, 16, &convolve8_dspr2),
16230d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    make_tuple(16, 32, &convolve8_dspr2),
16240d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    make_tuple(32, 32, &convolve8_dspr2),
16250d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    make_tuple(64, 32, &convolve8_dspr2),
16260d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    make_tuple(32, 64, &convolve8_dspr2),
16270d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org    make_tuple(64, 64, &convolve8_dspr2)));
16280d106b34dc08439a7c6887d1316a3e1a35f8f0cajohannkoenig@chromium.org#endif
162910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org}  // namespace
1630