1ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org/*
2ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org *  Copyright (c) 2013 The WebM project authors. All Rights Reserved.
3ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org *
4ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org *  Use of this source code is governed by a BSD-style license
5ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org *  that can be found in the LICENSE file in the root of the source
6ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org *  tree. An additional intellectual property rights grant can be found
7ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org *  in the file PATENTS.  All contributing project authors may
8ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org *  be found in the AUTHORS file in the root of the source tree.
9ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org */
10ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
118b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#ifndef VP9_COMMON_MIPS_DSPR2_VP9_COMMON_DSPR2_H_
128b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#define VP9_COMMON_MIPS_DSPR2_VP9_COMMON_DSPR2_H_
13ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
14ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#include <assert.h>
15ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
16ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#include "./vpx_config.h"
17ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#include "vpx/vpx_integer.h"
18ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#include "vp9/common/vp9_common.h"
19ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
20dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#ifdef __cplusplus
21dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.orgextern "C" {
22dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#endif
23dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org
24ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#if HAVE_DSPR2
25ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#define CROP_WIDTH 512
26ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.orgextern uint8_t *vp9_ff_cropTbl;
27ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
28ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#define DCT_CONST_ROUND_SHIFT_TWICE_COSPI_16_64(input)                    ({   \
29ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                                                                               \
30ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  int32_t tmp, out;                                                            \
31ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  int     dct_cost_rounding = DCT_CONST_ROUNDING;                              \
32ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  int     in = input;                                                          \
33ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                                                                               \
34ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  __asm__ __volatile__ (                                                       \
35ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      /* out = dct_const_round_shift(input_dc * cospi_16_64); */               \
36ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      "mtlo     %[dct_cost_rounding],   $ac1                              \n\t"\
37ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      "mthi     $zero,                  $ac1                              \n\t"\
38ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      "madd     $ac1,                   %[in],            %[cospi_16_64]  \n\t"\
39ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      "extp     %[tmp],                 $ac1,             31              \n\t"\
40ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                                                                               \
41ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      /* out = dct_const_round_shift(out * cospi_16_64); */                    \
42ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      "mtlo     %[dct_cost_rounding],   $ac2                              \n\t"\
43ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      "mthi     $zero,                  $ac2                              \n\t"\
44ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      "madd     $ac2,                   %[tmp],           %[cospi_16_64]  \n\t"\
45ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      "extp     %[out],                 $ac2,             31              \n\t"\
46ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                                                                               \
47ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      : [tmp] "=&r" (tmp), [out] "=r" (out)                                    \
48ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      : [in] "r" (in),                                                         \
49ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        [dct_cost_rounding] "r" (dct_cost_rounding),                           \
50ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        [cospi_16_64] "r" (cospi_16_64)                                        \
51ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org   );                                                                          \
52ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  out;                                                                    })
53ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
54ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.orgstatic INLINE void vp9_prefetch_load(const unsigned char *src) {
55ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  __asm__ __volatile__ (
56ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      "pref   0,  0(%[src])   \n\t"
57ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      :
58ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      : [src] "r" (src)
59ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  );
60ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org}
61ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
62ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org/* prefetch data for store */
63ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.orgstatic INLINE void vp9_prefetch_store(unsigned char *dst) {
64ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  __asm__ __volatile__ (
65ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      "pref   1,  0(%[dst])   \n\t"
66ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      :
67ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      : [dst] "r" (dst)
68ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  );
69ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org}
70ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
71ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.orgstatic INLINE void vp9_prefetch_load_streamed(const unsigned char *src) {
72ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  __asm__ __volatile__ (
73ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      "pref   4,  0(%[src])   \n\t"
74ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      :
75ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      : [src] "r" (src)
76ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  );
77ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org}
78ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
79ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org/* prefetch data for store */
80ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.orgstatic INLINE void vp9_prefetch_store_streamed(unsigned char *dst) {
81ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  __asm__ __volatile__ (
82ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      "pref   5,  0(%[dst])   \n\t"
83ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      :
84ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      : [dst] "r" (dst)
85ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  );
86ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org}
87ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
8876e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgvoid vp9_idct32_cols_add_blk_dspr2(int16_t *input, uint8_t *dest,
8976e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org                                   int dest_stride);
90ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
91ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.orgvoid vp9_convolve2_horiz_dspr2(const uint8_t *src, ptrdiff_t src_stride,
92ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                               uint8_t *dst, ptrdiff_t dst_stride,
93ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                               const int16_t *filter_x, int x_step_q4,
94ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                               const int16_t *filter_y, int y_step_q4,
95ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                               int w, int h);
96ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
97ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.orgvoid vp9_convolve2_avg_horiz_dspr2(const uint8_t *src, ptrdiff_t src_stride,
98ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                                   uint8_t *dst, ptrdiff_t dst_stride,
99ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                                   const int16_t *filter_x, int x_step_q4,
100ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                                   const int16_t *filter_y, int y_step_q4,
101ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                                   int w, int h);
102ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
103ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.orgvoid vp9_convolve2_avg_vert_dspr2(const uint8_t *src, ptrdiff_t src_stride,
104ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                                  uint8_t *dst, ptrdiff_t dst_stride,
105ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                                  const int16_t *filter_x, int x_step_q4,
106ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                                  const int16_t *filter_y, int y_step_q4,
107ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                                  int w, int h);
108ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
109ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.orgvoid vp9_convolve2_dspr2(const uint8_t *src, ptrdiff_t src_stride,
110ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                         uint8_t *dst, ptrdiff_t dst_stride,
111ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                         const int16_t *filter,
112ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                         int w, int h);
113ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
114ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.orgvoid vp9_convolve2_vert_dspr2(const uint8_t *src, ptrdiff_t src_stride,
115ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                              uint8_t *dst, ptrdiff_t dst_stride,
116ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                              const int16_t *filter_x, int x_step_q4,
117ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                              const int16_t *filter_y, int y_step_q4,
118ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                              int w, int h);
119ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
120ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#endif  // #if HAVE_DSPR2
121dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#ifdef __cplusplus
122dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org}  // extern "C"
123dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#endif
124dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org
1258b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#endif  // VP9_COMMON_MIPS_DSPR2_VP9_COMMON_DSPR2_H_
126