Home | History | Annotate | Download | only in mips
      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 VPX_DSP_MIPS_INV_TXFM_DSPR2_H_
     12 #define VPX_DSP_MIPS_INV_TXFM_DSPR2_H_
     13 
     14 #include <assert.h>
     15 
     16 #include "./vpx_config.h"
     17 #include "vpx/vpx_integer.h"
     18 #include "vpx_dsp/inv_txfm.h"
     19 #include "vpx_dsp/mips/common_dspr2.h"
     20 
     21 #ifdef __cplusplus
     22 extern "C" {
     23 #endif
     24 
     25 #if HAVE_DSPR2
     26 #define DCT_CONST_ROUND_SHIFT_TWICE_COSPI_16_64(input)                         \
     27   ({                                                                           \
     28                                                                                \
     29     int32_t tmp, out;                                                          \
     30     int dct_cost_rounding = DCT_CONST_ROUNDING;                                \
     31     int in = input;                                                            \
     32                                                                                \
     33     __asm__ __volatile__(/* out = dct_const_round_shift(dc *  cospi_16_64); */ \
     34                          "mtlo     %[dct_cost_rounding],   $ac1              " \
     35                          "                \n\t"                                \
     36                          "mthi     $zero,                  $ac1              " \
     37                          "                \n\t"                                \
     38                          "madd     $ac1,                   %[in],            " \
     39                          "%[cospi_16_64]  \n\t"                                \
     40                          "extp     %[tmp],                 $ac1,             " \
     41                          "31              \n\t"                                \
     42                                                                                \
     43                          /* out = dct_const_round_shift(out * cospi_16_64); */ \
     44                          "mtlo     %[dct_cost_rounding],   $ac2              " \
     45                          "                \n\t"                                \
     46                          "mthi     $zero,                  $ac2              " \
     47                          "                \n\t"                                \
     48                          "madd     $ac2,                   %[tmp],           " \
     49                          "%[cospi_16_64]  \n\t"                                \
     50                          "extp     %[out],                 $ac2,             " \
     51                          "31              \n\t"                                \
     52                                                                                \
     53                          : [tmp] "=&r"(tmp), [out] "=r"(out)                   \
     54                          : [in] "r"(in),                                       \
     55                            [dct_cost_rounding] "r"(dct_cost_rounding),         \
     56                            [cospi_16_64] "r"(cospi_16_64));                    \
     57     out;                                                                       \
     58   })
     59 
     60 void vpx_idct32_cols_add_blk_dspr2(int16_t *input, uint8_t *dest, int stride);
     61 void vpx_idct4_rows_dspr2(const int16_t *input, int16_t *output);
     62 void vpx_idct4_columns_add_blk_dspr2(int16_t *input, uint8_t *dest, int stride);
     63 void iadst4_dspr2(const int16_t *input, int16_t *output);
     64 void idct8_rows_dspr2(const int16_t *input, int16_t *output, uint32_t no_rows);
     65 void idct8_columns_add_blk_dspr2(int16_t *input, uint8_t *dest, int stride);
     66 void iadst8_dspr2(const int16_t *input, int16_t *output);
     67 void idct16_rows_dspr2(const int16_t *input, int16_t *output, uint32_t no_rows);
     68 void idct16_cols_add_blk_dspr2(int16_t *input, uint8_t *dest, int stride);
     69 void iadst16_dspr2(const int16_t *input, int16_t *output);
     70 
     71 #endif  // #if HAVE_DSPR2
     72 #ifdef __cplusplus
     73 }  // extern "C"
     74 #endif
     75 
     76 #endif  // VPX_DSP_MIPS_INV_TXFM_DSPR2_H_
     77