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
11ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#include <assert.h>
12ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#include <stdio.h>
13ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
14ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#include "./vpx_config.h"
15ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#include "./vp9_rtcd.h"
16ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#include "vp9/common/vp9_common.h"
17ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#include "vp9/common/vp9_blockd.h"
18ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#include "vp9/common/vp9_idct.h"
19ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#include "vp9/common/mips/dspr2/vp9_common_dspr2.h"
20ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
21ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#if HAVE_DSPR2
2276e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgstatic void vp9_idct4_rows_dspr2(const int16_t *input, int16_t *output) {
23ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  int16_t   step_0, step_1, step_2, step_3;
24ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  int       Temp0, Temp1, Temp2, Temp3;
25ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  const int const_2_power_13 = 8192;
26ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  int       i;
27ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
28ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  for (i = 4; i--; ) {
29ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    __asm__ __volatile__ (
30ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        /*
31ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          temp_1 = (input[0] + input[2]) * cospi_16_64;
32ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          step_0 = dct_const_round_shift(temp_1);
33ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
34ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          temp_2 = (input[0] - input[2]) * cospi_16_64;
35ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          step_1 = dct_const_round_shift(temp_2);
36ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        */
37ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "lh       %[Temp0],             0(%[input])                     \n\t"
38ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "lh       %[Temp1],             4(%[input])                     \n\t"
39ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "mtlo     %[const_2_power_13],  $ac0                            \n\t"
40ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "mthi     $zero,                $ac0                            \n\t"
41ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "mtlo     %[const_2_power_13],  $ac1                            \n\t"
42ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "mthi     $zero,                $ac1                            \n\t"
43ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "add      %[Temp2],             %[Temp0],       %[Temp1]        \n\t"
44ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "sub      %[Temp3],             %[Temp0],       %[Temp1]        \n\t"
45ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "madd     $ac0,                 %[Temp2],       %[cospi_16_64]  \n\t"
46ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "lh       %[Temp0],             2(%[input])                     \n\t"
47ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "lh       %[Temp1],             6(%[input])                     \n\t"
48ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "extp     %[step_0],            $ac0,           31              \n\t"
49ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "mtlo     %[const_2_power_13],  $ac0                            \n\t"
50ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "mthi     $zero,                $ac0                            \n\t"
51ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
52ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "madd     $ac1,                 %[Temp3],       %[cospi_16_64]  \n\t"
53ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "extp     %[step_1],            $ac1,           31              \n\t"
54ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "mtlo     %[const_2_power_13],  $ac1                            \n\t"
55ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "mthi     $zero,                $ac1                            \n\t"
56ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
57ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        /*
58ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          temp1 = input[1] * cospi_24_64 - input[3] * cospi_8_64;
59ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          step_2 = dct_const_round_shift(temp1);
60ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        */
61ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "madd     $ac0,                 %[Temp0],       %[cospi_24_64]  \n\t"
62ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "msub     $ac0,                 %[Temp1],       %[cospi_8_64]   \n\t"
63ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "extp     %[step_2],            $ac0,           31              \n\t"
64ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
65ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        /*
66ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          temp2 = input[1] * cospi_8_64 + input[3] * cospi_24_64;
67ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          step_3 = dct_const_round_shift(temp2);
68ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        */
69ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "madd     $ac1,                 %[Temp0],       %[cospi_8_64]   \n\t"
70ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "madd     $ac1,                 %[Temp1],       %[cospi_24_64]  \n\t"
71ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "extp     %[step_3],            $ac1,           31              \n\t"
72ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
73ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        /*
74ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          output[0]  = step_0 + step_3;
75ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          output[4]  = step_1 + step_2;
76ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          output[8]  = step_1 - step_2;
77ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          output[12] = step_0 - step_3;
78ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        */
79ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "add      %[Temp0],             %[step_0],      %[step_3]       \n\t"
80ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "sh       %[Temp0],             0(%[output])                    \n\t"
81ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
82ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "add      %[Temp1],             %[step_1],      %[step_2]       \n\t"
83ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "sh       %[Temp1],             8(%[output])                    \n\t"
84ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
85ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "sub      %[Temp2],             %[step_1],      %[step_2]       \n\t"
86ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "sh       %[Temp2],             16(%[output])                   \n\t"
87ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
88ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "sub      %[Temp3],             %[step_0],      %[step_3]       \n\t"
89ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "sh       %[Temp3],             24(%[output])                   \n\t"
90ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
91ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      : [Temp0] "=&r" (Temp0), [Temp1] "=&r" (Temp1),
92ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        [Temp2] "=&r" (Temp2), [Temp3] "=&r" (Temp3),
93ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        [step_0] "=&r" (step_0), [step_1] "=&r" (step_1),
94ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        [step_2] "=&r" (step_2), [step_3] "=&r" (step_3),
95ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        [output] "+r" (output)
96ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      : [const_2_power_13] "r" (const_2_power_13),
97ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        [cospi_8_64] "r" (cospi_8_64), [cospi_16_64] "r" (cospi_16_64),
98ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        [cospi_24_64] "r" (cospi_24_64),
99ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        [input] "r" (input)
100ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    );
101ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
102ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    input += 4;
103ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    output += 1;
104ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  }
105ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org}
106ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
10776e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgstatic void vp9_idct4_columns_add_blk_dspr2(int16_t *input, uint8_t *dest,
108ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                                               int dest_stride) {
109ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  int16_t   step_0, step_1, step_2, step_3;
110ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  int       Temp0, Temp1, Temp2, Temp3;
111ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  const int const_2_power_13 = 8192;
112ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  int       i;
113ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  uint8_t   *dest_pix;
114ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  uint8_t   *cm = vp9_ff_cropTbl;
115ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
116ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  /* prefetch vp9_ff_cropTbl */
117ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  vp9_prefetch_load(vp9_ff_cropTbl);
118ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  vp9_prefetch_load(vp9_ff_cropTbl +  32);
119ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  vp9_prefetch_load(vp9_ff_cropTbl +  64);
120ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  vp9_prefetch_load(vp9_ff_cropTbl +  96);
121ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  vp9_prefetch_load(vp9_ff_cropTbl + 128);
122ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  vp9_prefetch_load(vp9_ff_cropTbl + 160);
123ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  vp9_prefetch_load(vp9_ff_cropTbl + 192);
124ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  vp9_prefetch_load(vp9_ff_cropTbl + 224);
125ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
126ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  for (i = 0; i < 4; ++i) {
127ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      dest_pix = (dest + i);
128ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
129ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    __asm__ __volatile__ (
130ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        /*
131ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          temp_1 = (input[0] + input[2]) * cospi_16_64;
132ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          step_0 = dct_const_round_shift(temp_1);
133ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
134ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          temp_2 = (input[0] - input[2]) * cospi_16_64;
135ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          step_1 = dct_const_round_shift(temp_2);
136ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        */
137ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "lh       %[Temp0],             0(%[input])                     \n\t"
138ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "lh       %[Temp1],             4(%[input])                     \n\t"
139ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "mtlo     %[const_2_power_13],  $ac0                            \n\t"
140ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "mthi     $zero,                $ac0                            \n\t"
141ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "mtlo     %[const_2_power_13],  $ac1                            \n\t"
142ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "mthi     $zero,                $ac1                            \n\t"
143ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "add      %[Temp2],             %[Temp0],       %[Temp1]        \n\t"
144ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "sub      %[Temp3],             %[Temp0],       %[Temp1]        \n\t"
145ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "madd     $ac0,                 %[Temp2],       %[cospi_16_64]  \n\t"
146ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "lh       %[Temp0],             2(%[input])                     \n\t"
147ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "lh       %[Temp1],             6(%[input])                     \n\t"
148ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "extp     %[step_0],            $ac0,           31              \n\t"
149ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "mtlo     %[const_2_power_13],  $ac0                            \n\t"
150ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "mthi     $zero,                $ac0                            \n\t"
151ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
152ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "madd     $ac1,                 %[Temp3],       %[cospi_16_64]  \n\t"
153ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "extp     %[step_1],            $ac1,           31              \n\t"
154ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "mtlo     %[const_2_power_13],  $ac1                            \n\t"
155ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "mthi     $zero,                $ac1                            \n\t"
156ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
157ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        /*
158ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          temp1 = input[1] * cospi_24_64 - input[3] * cospi_8_64;
159ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          step_2 = dct_const_round_shift(temp1);
160ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        */
161ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "madd     $ac0,                 %[Temp0],       %[cospi_24_64]  \n\t"
162ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "msub     $ac0,                 %[Temp1],       %[cospi_8_64]   \n\t"
163ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "extp     %[step_2],            $ac0,           31              \n\t"
164ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
165ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        /*
166ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          temp2 = input[1] * cospi_8_64 + input[3] * cospi_24_64;
167ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          step_3 = dct_const_round_shift(temp2);
168ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        */
169ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "madd     $ac1,                 %[Temp0],       %[cospi_8_64]   \n\t"
170ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "madd     $ac1,                 %[Temp1],       %[cospi_24_64]  \n\t"
171ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "extp     %[step_3],            $ac1,           31              \n\t"
172ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
173ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        /*
174ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          output[0]  = step_0 + step_3;
175ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          output[4]  = step_1 + step_2;
176ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          output[8]  = step_1 - step_2;
177ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          output[12] = step_0 - step_3;
178ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        */
179ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "add      %[Temp0],             %[step_0],      %[step_3]       \n\t"
180ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "addi     %[Temp0],             %[Temp0],       8               \n\t"
181ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "sra      %[Temp0],             %[Temp0],       4               \n\t"
182ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "lbu      %[Temp1],             0(%[dest_pix])                  \n\t"
183ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "add      %[Temp1],             %[Temp1],       %[Temp0]        \n\t"
184ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "add      %[Temp0],             %[step_1],      %[step_2]       \n\t"
185ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "lbux     %[Temp2],             %[Temp1](%[cm])                 \n\t"
186ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "sb       %[Temp2],             0(%[dest_pix])                  \n\t"
187ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "addu     %[dest_pix],          %[dest_pix],    %[dest_stride]  \n\t"
188ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
189ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "addi     %[Temp0],             %[Temp0],       8               \n\t"
190ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "sra      %[Temp0],             %[Temp0],       4               \n\t"
191ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "lbu      %[Temp1],             0(%[dest_pix])                  \n\t"
192ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "add      %[Temp1],             %[Temp1],       %[Temp0]        \n\t"
193ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "sub      %[Temp0],             %[step_1],      %[step_2]       \n\t"
194ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "lbux     %[Temp2],             %[Temp1](%[cm])                 \n\t"
195ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "sb       %[Temp2],             0(%[dest_pix])                  \n\t"
196ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "addu     %[dest_pix],          %[dest_pix],    %[dest_stride]  \n\t"
197ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
198ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "addi     %[Temp0],             %[Temp0],       8               \n\t"
199ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "sra      %[Temp0],             %[Temp0],       4               \n\t"
200ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "lbu      %[Temp1],             0(%[dest_pix])                  \n\t"
201ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "add      %[Temp1],             %[Temp1],       %[Temp0]        \n\t"
202ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "sub      %[Temp0],             %[step_0],      %[step_3]       \n\t"
203ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "lbux     %[Temp2],             %[Temp1](%[cm])                 \n\t"
204ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "sb       %[Temp2],             0(%[dest_pix])                  \n\t"
205ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "addu     %[dest_pix],          %[dest_pix],    %[dest_stride]  \n\t"
206ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
207ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "addi     %[Temp0],             %[Temp0],       8               \n\t"
208ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "sra      %[Temp0],             %[Temp0],       4               \n\t"
209ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "lbu      %[Temp1],             0(%[dest_pix])                  \n\t"
210ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "add      %[Temp1],             %[Temp1],       %[Temp0]        \n\t"
211ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "lbux     %[Temp2],             %[Temp1](%[cm])                 \n\t"
212ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "sb       %[Temp2],             0(%[dest_pix])                  \n\t"
213ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
214ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      : [Temp0] "=&r" (Temp0), [Temp1] "=&r" (Temp1),
215ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        [Temp2] "=&r" (Temp2), [Temp3] "=&r" (Temp3),
216ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        [step_0] "=&r" (step_0), [step_1] "=&r" (step_1),
217ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        [step_2] "=&r" (step_2), [step_3] "=&r" (step_3),
218ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        [dest_pix] "+r" (dest_pix)
219ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      : [const_2_power_13] "r" (const_2_power_13),
220ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        [cospi_8_64] "r" (cospi_8_64), [cospi_16_64] "r" (cospi_16_64),
221ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        [cospi_24_64] "r" (cospi_24_64),
222ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        [input] "r" (input), [cm] "r" (cm), [dest_stride] "r" (dest_stride)
223ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    );
224ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
225ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    input += 4;
226ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  }
227ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org}
228ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
229ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.orgvoid vp9_idct4x4_16_add_dspr2(const int16_t *input, uint8_t *dest,
230ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                              int dest_stride) {
231ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  DECLARE_ALIGNED(32, int16_t, out[4 * 4]);
232ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  int16_t *outptr = out;
233ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  uint32_t pos = 45;
234ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
235ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  /* bit positon for extract from acc */
236ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  __asm__ __volatile__ (
237ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    "wrdsp      %[pos],     1           \n\t"
238ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    :
239ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    : [pos] "r" (pos)
240ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  );
241ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
242ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  // Rows
24376e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org  vp9_idct4_rows_dspr2(input, outptr);
244ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
245ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  // Columns
24676e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org  vp9_idct4_columns_add_blk_dspr2(&out[0], dest, dest_stride);
247ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org}
248ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
249ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.orgvoid vp9_idct4x4_1_add_dspr2(const int16_t *input, uint8_t *dest,
250ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                             int dest_stride) {
251ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  int       a1, absa1;
252ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  int       r;
253ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  int32_t   out;
254ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  int       t2, vector_a1, vector_a;
255ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  uint32_t  pos = 45;
256ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  int16_t   input_dc = input[0];
257ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
258ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  /* bit positon for extract from acc */
259ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  __asm__ __volatile__ (
260ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    "wrdsp      %[pos],     1           \n\t"
261ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
262ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    :
263ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    : [pos] "r" (pos)
264ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  );
265ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
266ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  out = DCT_CONST_ROUND_SHIFT_TWICE_COSPI_16_64(input_dc);
267ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  __asm__ __volatile__ (
268ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      "addi     %[out],     %[out],    8       \n\t"
269ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      "sra      %[a1],      %[out],    4       \n\t"
270ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
271ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      : [out] "+r" (out), [a1] "=r" (a1)
272ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      :
273ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  );
274ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
275ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  if (a1 < 0) {
276ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    /* use quad-byte
277ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org     * input and output memory are four byte aligned */
278ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    __asm__ __volatile__ (
279ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "abs        %[absa1],     %[a1]         \n\t"
280ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "replv.qb   %[vector_a1], %[absa1]      \n\t"
281ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
282ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        : [absa1] "=r" (absa1), [vector_a1] "=r" (vector_a1)
283ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        : [a1] "r" (a1)
284ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    );
285ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
286ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    for (r = 4; r--;) {
287ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      __asm__ __volatile__ (
288ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          "lw             %[t2],          0(%[dest])                      \n\t"
289ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          "subu_s.qb      %[vector_a],    %[t2],          %[vector_a1]    \n\t"
290ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          "sw             %[vector_a],    0(%[dest])                      \n\t"
291ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          "add            %[dest],        %[dest],        %[dest_stride]  \n\t"
292ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
293ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          : [t2] "=&r" (t2), [vector_a] "=&r" (vector_a),
294ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org            [dest] "+&r" (dest)
295ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          : [dest_stride] "r" (dest_stride), [vector_a1] "r" (vector_a1)
296ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      );
297ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    }
298ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  } else {
299ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    /* use quad-byte
300ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org     * input and output memory are four byte aligned */
301ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    __asm__ __volatile__ (
302ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        "replv.qb       %[vector_a1],   %[a1]     \n\t"
303ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        : [vector_a1] "=r" (vector_a1)
304ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        : [a1] "r" (a1)
305ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    );
306ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
307ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    for (r = 4; r--;) {
308ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      __asm__ __volatile__ (
309ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          "lw           %[t2],          0(%[dest])                        \n\t"
310ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          "addu_s.qb    %[vector_a],    %[t2],            %[vector_a1]    \n\t"
311ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          "sw           %[vector_a],    0(%[dest])                        \n\t"
312ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          "add          %[dest],        %[dest],          %[dest_stride]  \n\t"
313ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
314ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          : [t2] "=&r" (t2), [vector_a] "=&r" (vector_a),
315ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org            [dest] "+&r" (dest)
316ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          : [dest_stride] "r" (dest_stride), [vector_a1] "r" (vector_a1)
317ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      );
318ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    }
319ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  }
320ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org}
321ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
32276e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgstatic void iadst4_dspr2(const int16_t *input, int16_t *output) {
323ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  int s0, s1, s2, s3, s4, s5, s6, s7;
324ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  int x0, x1, x2, x3;
325ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
326ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  x0 = input[0];
327ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  x1 = input[1];
328ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  x2 = input[2];
329ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  x3 = input[3];
330ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
331ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  if (!(x0 | x1 | x2 | x3)) {
332ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    output[0] = output[1] = output[2] = output[3] = 0;
333ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    return;
334ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  }
335ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
336ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  s0 = sinpi_1_9 * x0;
337ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  s1 = sinpi_2_9 * x0;
338ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  s2 = sinpi_3_9 * x1;
339ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  s3 = sinpi_4_9 * x2;
340ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  s4 = sinpi_1_9 * x2;
341ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  s5 = sinpi_2_9 * x3;
342ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  s6 = sinpi_4_9 * x3;
343ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  s7 = x0 - x2 + x3;
344ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
345ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  x0 = s0 + s3 + s5;
346ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  x1 = s1 - s4 - s6;
347ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  x2 = sinpi_3_9 * s7;
348ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  x3 = s2;
349ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
350ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  s0 = x0 + x3;
351ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  s1 = x1 + x3;
352ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  s2 = x2;
353ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  s3 = x0 + x1 - x3;
354ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
355ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  // 1-D transform scaling factor is sqrt(2).
356ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  // The overall dynamic range is 14b (input) + 14b (multiplication scaling)
357ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  // + 1b (addition) = 29b.
358ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  // Hence the output bit depth is 15b.
359ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  output[0] = dct_const_round_shift(s0);
360ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  output[1] = dct_const_round_shift(s1);
361ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  output[2] = dct_const_round_shift(s2);
362ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  output[3] = dct_const_round_shift(s3);
363ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org}
364ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
365ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.orgvoid vp9_iht4x4_16_add_dspr2(const int16_t *input, uint8_t *dest,
366ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                             int dest_stride, int tx_type) {
367ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  int i, j;
368ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  DECLARE_ALIGNED(32, int16_t, out[4 * 4]);
369ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  int16_t *outptr = out;
370ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  int16_t temp_in[4 * 4], temp_out[4];
371ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  uint32_t pos = 45;
372ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
373ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  /* bit positon for extract from acc */
374ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  __asm__ __volatile__ (
375ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    "wrdsp      %[pos],     1           \n\t"
376ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    :
377ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    : [pos] "r" (pos)
378ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  );
379ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
380ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  switch (tx_type) {
381ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    case DCT_DCT:   // DCT in both horizontal and vertical
38276e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org      vp9_idct4_rows_dspr2(input, outptr);
38376e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org      vp9_idct4_columns_add_blk_dspr2(&out[0], dest, dest_stride);
384ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      break;
385ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    case ADST_DCT:  // ADST in vertical, DCT in horizontal
38676e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org      vp9_idct4_rows_dspr2(input, outptr);
387ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
388ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      outptr = out;
389ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
390ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      for (i = 0; i < 4; ++i) {
39176e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org        iadst4_dspr2(outptr, temp_out);
392ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
393ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        for (j = 0; j < 4; ++j)
394ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          dest[j * dest_stride + i] =
395ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                    clip_pixel(ROUND_POWER_OF_TWO(temp_out[j], 4)
396ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                                      + dest[j * dest_stride + i]);
397ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
398ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        outptr += 4;
399ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      }
400ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      break;
401ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    case DCT_ADST:  // DCT in vertical, ADST in horizontal
402ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      for (i = 0; i < 4; ++i) {
40376e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org        iadst4_dspr2(input, outptr);
404ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        input  += 4;
405ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        outptr += 4;
406ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      }
407ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
408ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      for (i = 0; i < 4; ++i) {
409ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        for (j = 0; j < 4; ++j) {
410ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          temp_in[i * 4 + j] = out[j * 4 + i];
411ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        }
412ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      }
41376e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org      vp9_idct4_columns_add_blk_dspr2(&temp_in[0], dest, dest_stride);
414ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      break;
415ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    case ADST_ADST:  // ADST in both directions
416ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      for (i = 0; i < 4; ++i) {
41776e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org        iadst4_dspr2(input, outptr);
418ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        input  += 4;
419ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        outptr += 4;
420ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      }
421ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
422ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      for (i = 0; i < 4; ++i) {
423ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        for (j = 0; j < 4; ++j)
424ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          temp_in[j] = out[j * 4 + i];
42576e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org        iadst4_dspr2(temp_in, temp_out);
426ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org
427ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org        for (j = 0; j < 4; ++j)
428ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org          dest[j * dest_stride + i] =
429ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                  clip_pixel(ROUND_POWER_OF_TWO(temp_out[j], 4)
430ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org                                      + dest[j * dest_stride + i]);
431ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      }
432ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      break;
433ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org    default:
434ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      printf("vp9_short_iht4x4_add_dspr2 : Invalid tx_type\n");
435ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org      break;
436ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org  }
437ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org}
438ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org#endif  // #if HAVE_DSPR2
439