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