xref: /aosp_15_r20/external/libvpx/vpx_dsp/mips/itrans8_dspr2.c (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker  *  Copyright (c) 2015 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker  *
4*fb1b10abSAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker  */
10*fb1b10abSAndroid Build Coastguard Worker 
11*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_config.h"
12*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_dsp_rtcd.h"
13*fb1b10abSAndroid Build Coastguard Worker #include "vpx_dsp/mips/inv_txfm_dspr2.h"
14*fb1b10abSAndroid Build Coastguard Worker #include "vpx_dsp/txfm_common.h"
15*fb1b10abSAndroid Build Coastguard Worker 
16*fb1b10abSAndroid Build Coastguard Worker #if HAVE_DSPR2
idct8_rows_dspr2(const int16_t * input,int16_t * output,uint32_t no_rows)17*fb1b10abSAndroid Build Coastguard Worker void idct8_rows_dspr2(const int16_t *input, int16_t *output, uint32_t no_rows) {
18*fb1b10abSAndroid Build Coastguard Worker   int step1_0, step1_1, step1_2, step1_3, step1_4, step1_5, step1_6, step1_7;
19*fb1b10abSAndroid Build Coastguard Worker   const int const_2_power_13 = 8192;
20*fb1b10abSAndroid Build Coastguard Worker   int Temp0, Temp1, Temp2, Temp3, Temp4;
21*fb1b10abSAndroid Build Coastguard Worker   int i;
22*fb1b10abSAndroid Build Coastguard Worker 
23*fb1b10abSAndroid Build Coastguard Worker   for (i = no_rows; i--;) {
24*fb1b10abSAndroid Build Coastguard Worker     __asm__ __volatile__(
25*fb1b10abSAndroid Build Coastguard Worker         /*
26*fb1b10abSAndroid Build Coastguard Worker           temp_1 = (input[0] + input[4]) * cospi_16_64;
27*fb1b10abSAndroid Build Coastguard Worker           step2_0 = dct_const_round_shift(temp_1);
28*fb1b10abSAndroid Build Coastguard Worker 
29*fb1b10abSAndroid Build Coastguard Worker           temp_2 = (input[0] - input[4]) * cospi_16_64;
30*fb1b10abSAndroid Build Coastguard Worker           step2_1 = dct_const_round_shift(temp_2);
31*fb1b10abSAndroid Build Coastguard Worker         */
32*fb1b10abSAndroid Build Coastguard Worker         "lh       %[Temp0],             0(%[input])                     \n\t"
33*fb1b10abSAndroid Build Coastguard Worker         "lh       %[Temp1],             8(%[input])                     \n\t"
34*fb1b10abSAndroid Build Coastguard Worker         "mtlo     %[const_2_power_13],  $ac0                            \n\t"
35*fb1b10abSAndroid Build Coastguard Worker         "mthi     $zero,                $ac0                            \n\t"
36*fb1b10abSAndroid Build Coastguard Worker         "mtlo     %[const_2_power_13],  $ac1                            \n\t"
37*fb1b10abSAndroid Build Coastguard Worker         "mthi     $zero,                $ac1                            \n\t"
38*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp2],             %[Temp0],       %[Temp1]        \n\t"
39*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac0,                 %[Temp2],       %[cospi_16_64]  \n\t"
40*fb1b10abSAndroid Build Coastguard Worker         "extp     %[Temp4],             $ac0,           31              \n\t"
41*fb1b10abSAndroid Build Coastguard Worker 
42*fb1b10abSAndroid Build Coastguard Worker         "sub      %[Temp3],             %[Temp0],       %[Temp1]        \n\t"
43*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac1,                 %[Temp3],       %[cospi_16_64]  \n\t"
44*fb1b10abSAndroid Build Coastguard Worker         "mtlo     %[const_2_power_13],  $ac0                            \n\t"
45*fb1b10abSAndroid Build Coastguard Worker         "mthi     $zero,                $ac0                            \n\t"
46*fb1b10abSAndroid Build Coastguard Worker         "extp     %[Temp2],             $ac1,           31              \n\t"
47*fb1b10abSAndroid Build Coastguard Worker 
48*fb1b10abSAndroid Build Coastguard Worker         /*
49*fb1b10abSAndroid Build Coastguard Worker           temp_1 = input[2] * cospi_24_64 - input[6] * cospi_8_64;
50*fb1b10abSAndroid Build Coastguard Worker           step2_2 = dct_const_round_shift(temp_1);
51*fb1b10abSAndroid Build Coastguard Worker         */
52*fb1b10abSAndroid Build Coastguard Worker         "lh       %[Temp0],             4(%[input])                     \n\t"
53*fb1b10abSAndroid Build Coastguard Worker         "lh       %[Temp1],             12(%[input])                    \n\t"
54*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac0,                 %[Temp0],       %[cospi_24_64]  \n\t"
55*fb1b10abSAndroid Build Coastguard Worker         "msub     $ac0,                 %[Temp1],       %[cospi_8_64]   \n\t"
56*fb1b10abSAndroid Build Coastguard Worker         "mtlo     %[const_2_power_13],  $ac1                            \n\t"
57*fb1b10abSAndroid Build Coastguard Worker         "mthi     $zero,                $ac1                            \n\t"
58*fb1b10abSAndroid Build Coastguard Worker         "extp     %[Temp3],             $ac0,           31              \n\t"
59*fb1b10abSAndroid Build Coastguard Worker 
60*fb1b10abSAndroid Build Coastguard Worker         /*
61*fb1b10abSAndroid Build Coastguard Worker           step1_1 = step2_1 + step2_2;
62*fb1b10abSAndroid Build Coastguard Worker           step1_2 = step2_1 - step2_2;
63*fb1b10abSAndroid Build Coastguard Worker         */
64*fb1b10abSAndroid Build Coastguard Worker         "add      %[step1_1],           %[Temp2],       %[Temp3]        \n\t"
65*fb1b10abSAndroid Build Coastguard Worker         "sub      %[step1_2],           %[Temp2],       %[Temp3]        \n\t"
66*fb1b10abSAndroid Build Coastguard Worker 
67*fb1b10abSAndroid Build Coastguard Worker         /*
68*fb1b10abSAndroid Build Coastguard Worker           temp_2 = input[2] * cospi_8_64 + input[6] * cospi_24_64;
69*fb1b10abSAndroid Build Coastguard Worker           step2_3 = dct_const_round_shift(temp_2);
70*fb1b10abSAndroid Build Coastguard Worker         */
71*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac1,                 %[Temp0],       %[cospi_8_64]   \n\t"
72*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac1,                 %[Temp1],       %[cospi_24_64]  \n\t"
73*fb1b10abSAndroid Build Coastguard Worker         "extp     %[Temp1],             $ac1,           31              \n\t"
74*fb1b10abSAndroid Build Coastguard Worker 
75*fb1b10abSAndroid Build Coastguard Worker         "mtlo     %[const_2_power_13],  $ac0                            \n\t"
76*fb1b10abSAndroid Build Coastguard Worker         "mthi     $zero,                $ac0                            \n\t"
77*fb1b10abSAndroid Build Coastguard Worker 
78*fb1b10abSAndroid Build Coastguard Worker         /*
79*fb1b10abSAndroid Build Coastguard Worker           step1_0 = step2_0 + step2_3;
80*fb1b10abSAndroid Build Coastguard Worker           step1_3 = step2_0 - step2_3;
81*fb1b10abSAndroid Build Coastguard Worker         */
82*fb1b10abSAndroid Build Coastguard Worker         "add      %[step1_0],           %[Temp4],       %[Temp1]        \n\t"
83*fb1b10abSAndroid Build Coastguard Worker         "sub      %[step1_3],           %[Temp4],       %[Temp1]        \n\t"
84*fb1b10abSAndroid Build Coastguard Worker 
85*fb1b10abSAndroid Build Coastguard Worker         /*
86*fb1b10abSAndroid Build Coastguard Worker           temp_1 = input[1] * cospi_28_64 - input[7] * cospi_4_64;
87*fb1b10abSAndroid Build Coastguard Worker           step1_4 = dct_const_round_shift(temp_1);
88*fb1b10abSAndroid Build Coastguard Worker         */
89*fb1b10abSAndroid Build Coastguard Worker         "lh       %[Temp0],             2(%[input])                     \n\t"
90*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac0,                 %[Temp0],       %[cospi_28_64]  \n\t"
91*fb1b10abSAndroid Build Coastguard Worker         "mtlo     %[const_2_power_13],  $ac1                            \n\t"
92*fb1b10abSAndroid Build Coastguard Worker         "mthi     $zero,                $ac1                            \n\t"
93*fb1b10abSAndroid Build Coastguard Worker         "lh       %[Temp1],             14(%[input])                    \n\t"
94*fb1b10abSAndroid Build Coastguard Worker         "lh       %[Temp0],             2(%[input])                     \n\t"
95*fb1b10abSAndroid Build Coastguard Worker         "msub     $ac0,                 %[Temp1],       %[cospi_4_64]   \n\t"
96*fb1b10abSAndroid Build Coastguard Worker         "extp     %[step1_4],           $ac0,           31              \n\t"
97*fb1b10abSAndroid Build Coastguard Worker 
98*fb1b10abSAndroid Build Coastguard Worker         /*
99*fb1b10abSAndroid Build Coastguard Worker           temp_2 = input[1] * cospi_4_64 + input[7] * cospi_28_64;
100*fb1b10abSAndroid Build Coastguard Worker           step1_7 = dct_const_round_shift(temp_2);
101*fb1b10abSAndroid Build Coastguard Worker         */
102*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac1,                 %[Temp0],       %[cospi_4_64]   \n\t"
103*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac1,                 %[Temp1],       %[cospi_28_64]  \n\t"
104*fb1b10abSAndroid Build Coastguard Worker         "extp     %[step1_7],           $ac1,           31              \n\t"
105*fb1b10abSAndroid Build Coastguard Worker 
106*fb1b10abSAndroid Build Coastguard Worker         /*
107*fb1b10abSAndroid Build Coastguard Worker           temp_1 = input[5] * cospi_12_64 - input[3] * cospi_20_64;
108*fb1b10abSAndroid Build Coastguard Worker           step1_5 = dct_const_round_shift(temp_1);
109*fb1b10abSAndroid Build Coastguard Worker         */
110*fb1b10abSAndroid Build Coastguard Worker         "mtlo     %[const_2_power_13],  $ac0                            \n\t"
111*fb1b10abSAndroid Build Coastguard Worker         "mthi     $zero,                $ac0                            \n\t"
112*fb1b10abSAndroid Build Coastguard Worker         "lh       %[Temp0],             10(%[input])                    \n\t"
113*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac0,                 %[Temp0],       %[cospi_12_64]  \n\t"
114*fb1b10abSAndroid Build Coastguard Worker         "lh       %[Temp1],             6(%[input])                     \n\t"
115*fb1b10abSAndroid Build Coastguard Worker         "msub     $ac0,                 %[Temp1],       %[cospi_20_64]  \n\t"
116*fb1b10abSAndroid Build Coastguard Worker         "extp     %[step1_5],           $ac0,           31              \n\t"
117*fb1b10abSAndroid Build Coastguard Worker 
118*fb1b10abSAndroid Build Coastguard Worker         /*
119*fb1b10abSAndroid Build Coastguard Worker           temp_2 = input[5] * cospi_20_64 + input[3] * cospi_12_64;
120*fb1b10abSAndroid Build Coastguard Worker           step1_6 = dct_const_round_shift(temp_2);
121*fb1b10abSAndroid Build Coastguard Worker         */
122*fb1b10abSAndroid Build Coastguard Worker         "mtlo     %[const_2_power_13],  $ac1                            \n\t"
123*fb1b10abSAndroid Build Coastguard Worker         "mthi     $zero,                $ac1                            \n\t"
124*fb1b10abSAndroid Build Coastguard Worker         "lh       %[Temp0],             10(%[input])                    \n\t"
125*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac1,                 %[Temp0],       %[cospi_20_64]  \n\t"
126*fb1b10abSAndroid Build Coastguard Worker         "lh       %[Temp1],             6(%[input])                     \n\t"
127*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac1,                 %[Temp1],       %[cospi_12_64]  \n\t"
128*fb1b10abSAndroid Build Coastguard Worker         "extp     %[step1_6],           $ac1,           31              \n\t"
129*fb1b10abSAndroid Build Coastguard Worker 
130*fb1b10abSAndroid Build Coastguard Worker         /*
131*fb1b10abSAndroid Build Coastguard Worker           temp_1 = (step1_7 - step1_6 - step1_4 + step1_5) * cospi_16_64;
132*fb1b10abSAndroid Build Coastguard Worker           temp_2 = (step1_4 - step1_5 - step1_6 + step1_7) * cospi_16_64;
133*fb1b10abSAndroid Build Coastguard Worker         */
134*fb1b10abSAndroid Build Coastguard Worker         "sub      %[Temp0],             %[step1_7],     %[step1_6]      \n\t"
135*fb1b10abSAndroid Build Coastguard Worker         "sub      %[Temp0],             %[Temp0],       %[step1_4]      \n\t"
136*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp0],             %[Temp0],       %[step1_5]      \n\t"
137*fb1b10abSAndroid Build Coastguard Worker         "sub      %[Temp1],             %[step1_4],     %[step1_5]      \n\t"
138*fb1b10abSAndroid Build Coastguard Worker         "sub      %[Temp1],             %[Temp1],       %[step1_6]      \n\t"
139*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp1],             %[Temp1],       %[step1_7]      \n\t"
140*fb1b10abSAndroid Build Coastguard Worker 
141*fb1b10abSAndroid Build Coastguard Worker         "mtlo     %[const_2_power_13],  $ac0                            \n\t"
142*fb1b10abSAndroid Build Coastguard Worker         "mthi     $zero,                $ac0                            \n\t"
143*fb1b10abSAndroid Build Coastguard Worker         "mtlo     %[const_2_power_13],  $ac1                            \n\t"
144*fb1b10abSAndroid Build Coastguard Worker         "mthi     $zero,                $ac1                            \n\t"
145*fb1b10abSAndroid Build Coastguard Worker 
146*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac0,                 %[Temp0],       %[cospi_16_64]  \n\t"
147*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac1,                 %[Temp1],       %[cospi_16_64]  \n\t"
148*fb1b10abSAndroid Build Coastguard Worker 
149*fb1b10abSAndroid Build Coastguard Worker         /*
150*fb1b10abSAndroid Build Coastguard Worker           step1_4 = step1_4 + step1_5;
151*fb1b10abSAndroid Build Coastguard Worker           step1_7 = step1_6 + step1_7;
152*fb1b10abSAndroid Build Coastguard Worker         */
153*fb1b10abSAndroid Build Coastguard Worker         "add      %[step1_4],           %[step1_4],     %[step1_5]      \n\t"
154*fb1b10abSAndroid Build Coastguard Worker         "add      %[step1_7],           %[step1_7],     %[step1_6]      \n\t"
155*fb1b10abSAndroid Build Coastguard Worker 
156*fb1b10abSAndroid Build Coastguard Worker         "extp     %[step1_5],           $ac0,           31              \n\t"
157*fb1b10abSAndroid Build Coastguard Worker         "extp     %[step1_6],           $ac1,           31              \n\t"
158*fb1b10abSAndroid Build Coastguard Worker 
159*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp0],             %[step1_0],     %[step1_7]      \n\t"
160*fb1b10abSAndroid Build Coastguard Worker         "sh       %[Temp0],             0(%[output])                    \n\t"
161*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp1],             %[step1_1],     %[step1_6]      \n\t"
162*fb1b10abSAndroid Build Coastguard Worker         "sh       %[Temp1],             16(%[output])                   \n\t"
163*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp0],             %[step1_2],     %[step1_5]      \n\t"
164*fb1b10abSAndroid Build Coastguard Worker         "sh       %[Temp0],             32(%[output])                   \n\t"
165*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp1],             %[step1_3],     %[step1_4]      \n\t"
166*fb1b10abSAndroid Build Coastguard Worker         "sh       %[Temp1],             48(%[output])                   \n\t"
167*fb1b10abSAndroid Build Coastguard Worker 
168*fb1b10abSAndroid Build Coastguard Worker         "sub      %[Temp0],             %[step1_3],     %[step1_4]      \n\t"
169*fb1b10abSAndroid Build Coastguard Worker         "sh       %[Temp0],             64(%[output])                   \n\t"
170*fb1b10abSAndroid Build Coastguard Worker         "sub      %[Temp1],             %[step1_2],     %[step1_5]      \n\t"
171*fb1b10abSAndroid Build Coastguard Worker         "sh       %[Temp1],             80(%[output])                   \n\t"
172*fb1b10abSAndroid Build Coastguard Worker         "sub      %[Temp0],             %[step1_1],     %[step1_6]      \n\t"
173*fb1b10abSAndroid Build Coastguard Worker         "sh       %[Temp0],             96(%[output])                   \n\t"
174*fb1b10abSAndroid Build Coastguard Worker         "sub      %[Temp1],             %[step1_0],     %[step1_7]      \n\t"
175*fb1b10abSAndroid Build Coastguard Worker         "sh       %[Temp1],             112(%[output])                  \n\t"
176*fb1b10abSAndroid Build Coastguard Worker 
177*fb1b10abSAndroid Build Coastguard Worker         : [step1_0] "=&r"(step1_0), [step1_1] "=&r"(step1_1),
178*fb1b10abSAndroid Build Coastguard Worker           [step1_2] "=&r"(step1_2), [step1_3] "=&r"(step1_3),
179*fb1b10abSAndroid Build Coastguard Worker           [step1_4] "=&r"(step1_4), [step1_5] "=&r"(step1_5),
180*fb1b10abSAndroid Build Coastguard Worker           [step1_6] "=&r"(step1_6), [step1_7] "=&r"(step1_7),
181*fb1b10abSAndroid Build Coastguard Worker           [Temp0] "=&r"(Temp0), [Temp1] "=&r"(Temp1), [Temp2] "=&r"(Temp2),
182*fb1b10abSAndroid Build Coastguard Worker           [Temp3] "=&r"(Temp3), [Temp4] "=&r"(Temp4)
183*fb1b10abSAndroid Build Coastguard Worker         : [const_2_power_13] "r"(const_2_power_13),
184*fb1b10abSAndroid Build Coastguard Worker           [cospi_16_64] "r"(cospi_16_64), [cospi_28_64] "r"(cospi_28_64),
185*fb1b10abSAndroid Build Coastguard Worker           [cospi_4_64] "r"(cospi_4_64), [cospi_12_64] "r"(cospi_12_64),
186*fb1b10abSAndroid Build Coastguard Worker           [cospi_20_64] "r"(cospi_20_64), [cospi_8_64] "r"(cospi_8_64),
187*fb1b10abSAndroid Build Coastguard Worker           [cospi_24_64] "r"(cospi_24_64), [output] "r"(output),
188*fb1b10abSAndroid Build Coastguard Worker           [input] "r"(input));
189*fb1b10abSAndroid Build Coastguard Worker 
190*fb1b10abSAndroid Build Coastguard Worker     input += 8;
191*fb1b10abSAndroid Build Coastguard Worker     output += 1;
192*fb1b10abSAndroid Build Coastguard Worker   }
193*fb1b10abSAndroid Build Coastguard Worker }
194*fb1b10abSAndroid Build Coastguard Worker 
idct8_columns_add_blk_dspr2(int16_t * input,uint8_t * dest,int stride)195*fb1b10abSAndroid Build Coastguard Worker void idct8_columns_add_blk_dspr2(int16_t *input, uint8_t *dest, int stride) {
196*fb1b10abSAndroid Build Coastguard Worker   int step1_0, step1_1, step1_2, step1_3, step1_4, step1_5, step1_6, step1_7;
197*fb1b10abSAndroid Build Coastguard Worker   int Temp0, Temp1, Temp2, Temp3;
198*fb1b10abSAndroid Build Coastguard Worker   int i;
199*fb1b10abSAndroid Build Coastguard Worker   const int const_2_power_13 = 8192;
200*fb1b10abSAndroid Build Coastguard Worker   const int const_255 = 255;
201*fb1b10abSAndroid Build Coastguard Worker   uint8_t *dest_pix;
202*fb1b10abSAndroid Build Coastguard Worker 
203*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < 8; ++i) {
204*fb1b10abSAndroid Build Coastguard Worker     dest_pix = (dest + i);
205*fb1b10abSAndroid Build Coastguard Worker 
206*fb1b10abSAndroid Build Coastguard Worker     __asm__ __volatile__(
207*fb1b10abSAndroid Build Coastguard Worker         /*
208*fb1b10abSAndroid Build Coastguard Worker           temp_1 = (input[0] + input[4]) * cospi_16_64;
209*fb1b10abSAndroid Build Coastguard Worker           step2_0 = dct_const_round_shift(temp_1);
210*fb1b10abSAndroid Build Coastguard Worker 
211*fb1b10abSAndroid Build Coastguard Worker           temp_2 = (input[0] - input[4]) * cospi_16_64;
212*fb1b10abSAndroid Build Coastguard Worker           step2_1 = dct_const_round_shift(temp_2);
213*fb1b10abSAndroid Build Coastguard Worker         */
214*fb1b10abSAndroid Build Coastguard Worker         "lh       %[Temp0],             0(%[input])                     \n\t"
215*fb1b10abSAndroid Build Coastguard Worker         "lh       %[Temp1],             8(%[input])                     \n\t"
216*fb1b10abSAndroid Build Coastguard Worker         "mtlo     %[const_2_power_13],  $ac0                            \n\t"
217*fb1b10abSAndroid Build Coastguard Worker         "mthi     $zero,                $ac0                            \n\t"
218*fb1b10abSAndroid Build Coastguard Worker         "mtlo     %[const_2_power_13],  $ac1                            \n\t"
219*fb1b10abSAndroid Build Coastguard Worker         "mthi     $zero,                $ac1                            \n\t"
220*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp2],             %[Temp0],       %[Temp1]        \n\t"
221*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac0,                 %[Temp2],       %[cospi_16_64]  \n\t"
222*fb1b10abSAndroid Build Coastguard Worker         "extp     %[step1_6],           $ac0,           31              \n\t"
223*fb1b10abSAndroid Build Coastguard Worker 
224*fb1b10abSAndroid Build Coastguard Worker         "sub      %[Temp3],             %[Temp0],       %[Temp1]        \n\t"
225*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac1,                 %[Temp3],       %[cospi_16_64]  \n\t"
226*fb1b10abSAndroid Build Coastguard Worker         "mtlo     %[const_2_power_13],  $ac0                            \n\t"
227*fb1b10abSAndroid Build Coastguard Worker         "mthi     $zero,                $ac0                            \n\t"
228*fb1b10abSAndroid Build Coastguard Worker         "extp     %[Temp2],             $ac1,           31              \n\t"
229*fb1b10abSAndroid Build Coastguard Worker 
230*fb1b10abSAndroid Build Coastguard Worker         /*
231*fb1b10abSAndroid Build Coastguard Worker           temp_1 = input[2] * cospi_24_64 - input[6] * cospi_8_64;
232*fb1b10abSAndroid Build Coastguard Worker           step2_2 = dct_const_round_shift(temp_1);
233*fb1b10abSAndroid Build Coastguard Worker         */
234*fb1b10abSAndroid Build Coastguard Worker         "lh       %[Temp0],             4(%[input])                     \n\t"
235*fb1b10abSAndroid Build Coastguard Worker         "lh       %[Temp1],             12(%[input])                    \n\t"
236*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac0,                 %[Temp0],       %[cospi_24_64]  \n\t"
237*fb1b10abSAndroid Build Coastguard Worker         "msub     $ac0,                 %[Temp1],       %[cospi_8_64]   \n\t"
238*fb1b10abSAndroid Build Coastguard Worker         "mtlo     %[const_2_power_13],  $ac1                            \n\t"
239*fb1b10abSAndroid Build Coastguard Worker         "mthi     $zero,                $ac1                            \n\t"
240*fb1b10abSAndroid Build Coastguard Worker         "extp     %[Temp3],             $ac0,           31              \n\t"
241*fb1b10abSAndroid Build Coastguard Worker 
242*fb1b10abSAndroid Build Coastguard Worker         /*
243*fb1b10abSAndroid Build Coastguard Worker           step1_1 = step2_1 + step2_2;
244*fb1b10abSAndroid Build Coastguard Worker           step1_2 = step2_1 - step2_2;
245*fb1b10abSAndroid Build Coastguard Worker         */
246*fb1b10abSAndroid Build Coastguard Worker         "add      %[step1_1],           %[Temp2],       %[Temp3]        \n\t"
247*fb1b10abSAndroid Build Coastguard Worker         "sub      %[step1_2],           %[Temp2],       %[Temp3]        \n\t"
248*fb1b10abSAndroid Build Coastguard Worker 
249*fb1b10abSAndroid Build Coastguard Worker         /*
250*fb1b10abSAndroid Build Coastguard Worker           temp_2 = input[2] * cospi_8_64 + input[6] * cospi_24_64;
251*fb1b10abSAndroid Build Coastguard Worker           step2_3 = dct_const_round_shift(temp_2);
252*fb1b10abSAndroid Build Coastguard Worker         */
253*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac1,                 %[Temp0],       %[cospi_8_64]   \n\t"
254*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac1,                 %[Temp1],       %[cospi_24_64]  \n\t"
255*fb1b10abSAndroid Build Coastguard Worker         "extp     %[Temp1],             $ac1,           31              \n\t"
256*fb1b10abSAndroid Build Coastguard Worker 
257*fb1b10abSAndroid Build Coastguard Worker         "mtlo     %[const_2_power_13],  $ac0                            \n\t"
258*fb1b10abSAndroid Build Coastguard Worker         "mthi     $zero,                $ac0                            \n\t"
259*fb1b10abSAndroid Build Coastguard Worker 
260*fb1b10abSAndroid Build Coastguard Worker         /*
261*fb1b10abSAndroid Build Coastguard Worker           step1_0 = step2_0 + step2_3;
262*fb1b10abSAndroid Build Coastguard Worker           step1_3 = step2_0 - step2_3;
263*fb1b10abSAndroid Build Coastguard Worker         */
264*fb1b10abSAndroid Build Coastguard Worker         "add      %[step1_0],           %[step1_6],     %[Temp1]        \n\t"
265*fb1b10abSAndroid Build Coastguard Worker         "sub      %[step1_3],           %[step1_6],     %[Temp1]        \n\t"
266*fb1b10abSAndroid Build Coastguard Worker 
267*fb1b10abSAndroid Build Coastguard Worker         /*
268*fb1b10abSAndroid Build Coastguard Worker           temp_1 = input[1] * cospi_28_64 - input[7] * cospi_4_64;
269*fb1b10abSAndroid Build Coastguard Worker           step1_4 = dct_const_round_shift(temp_1);
270*fb1b10abSAndroid Build Coastguard Worker         */
271*fb1b10abSAndroid Build Coastguard Worker         "lh       %[Temp0],             2(%[input])                     \n\t"
272*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac0,                 %[Temp0],       %[cospi_28_64]  \n\t"
273*fb1b10abSAndroid Build Coastguard Worker         "mtlo     %[const_2_power_13],  $ac1                            \n\t"
274*fb1b10abSAndroid Build Coastguard Worker         "mthi     $zero,                $ac1                            \n\t"
275*fb1b10abSAndroid Build Coastguard Worker         "lh       %[Temp1],             14(%[input])                    \n\t"
276*fb1b10abSAndroid Build Coastguard Worker         "lh       %[Temp0],             2(%[input])                     \n\t"
277*fb1b10abSAndroid Build Coastguard Worker         "msub     $ac0,                 %[Temp1],       %[cospi_4_64]   \n\t"
278*fb1b10abSAndroid Build Coastguard Worker         "extp     %[step1_4],           $ac0,           31              \n\t"
279*fb1b10abSAndroid Build Coastguard Worker 
280*fb1b10abSAndroid Build Coastguard Worker         /*
281*fb1b10abSAndroid Build Coastguard Worker           temp_2 = input[1] * cospi_4_64 + input[7] * cospi_28_64;
282*fb1b10abSAndroid Build Coastguard Worker           step1_7 = dct_const_round_shift(temp_2);
283*fb1b10abSAndroid Build Coastguard Worker         */
284*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac1,                 %[Temp0],       %[cospi_4_64]   \n\t"
285*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac1,                 %[Temp1],       %[cospi_28_64]  \n\t"
286*fb1b10abSAndroid Build Coastguard Worker         "extp     %[step1_7],           $ac1,           31              \n\t"
287*fb1b10abSAndroid Build Coastguard Worker 
288*fb1b10abSAndroid Build Coastguard Worker         /*
289*fb1b10abSAndroid Build Coastguard Worker           temp_1 = input[5] * cospi_12_64 - input[3] * cospi_20_64;
290*fb1b10abSAndroid Build Coastguard Worker           step1_5 = dct_const_round_shift(temp_1);
291*fb1b10abSAndroid Build Coastguard Worker         */
292*fb1b10abSAndroid Build Coastguard Worker         "mtlo     %[const_2_power_13],  $ac0                            \n\t"
293*fb1b10abSAndroid Build Coastguard Worker         "mthi     $zero,                $ac0                            \n\t"
294*fb1b10abSAndroid Build Coastguard Worker         "lh       %[Temp0],             10(%[input])                    \n\t"
295*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac0,                 %[Temp0],       %[cospi_12_64]  \n\t"
296*fb1b10abSAndroid Build Coastguard Worker         "lh       %[Temp1],             6(%[input])                     \n\t"
297*fb1b10abSAndroid Build Coastguard Worker         "msub     $ac0,                 %[Temp1],       %[cospi_20_64]  \n\t"
298*fb1b10abSAndroid Build Coastguard Worker         "extp     %[step1_5],           $ac0,           31              \n\t"
299*fb1b10abSAndroid Build Coastguard Worker 
300*fb1b10abSAndroid Build Coastguard Worker         /*
301*fb1b10abSAndroid Build Coastguard Worker           temp_2 = input[5] * cospi_20_64 + input[3] * cospi_12_64;
302*fb1b10abSAndroid Build Coastguard Worker           step1_6 = dct_const_round_shift(temp_2);
303*fb1b10abSAndroid Build Coastguard Worker         */
304*fb1b10abSAndroid Build Coastguard Worker         "mtlo     %[const_2_power_13],  $ac1                            \n\t"
305*fb1b10abSAndroid Build Coastguard Worker         "mthi     $zero,                $ac1                            \n\t"
306*fb1b10abSAndroid Build Coastguard Worker         "lh       %[Temp0],             10(%[input])                    \n\t"
307*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac1,                 %[Temp0],       %[cospi_20_64]  \n\t"
308*fb1b10abSAndroid Build Coastguard Worker         "lh       %[Temp1],             6(%[input])                     \n\t"
309*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac1,                 %[Temp1],       %[cospi_12_64]  \n\t"
310*fb1b10abSAndroid Build Coastguard Worker         "extp     %[step1_6],           $ac1,           31              \n\t"
311*fb1b10abSAndroid Build Coastguard Worker 
312*fb1b10abSAndroid Build Coastguard Worker         /*
313*fb1b10abSAndroid Build Coastguard Worker           temp_1 = (step1_7 - step1_6 - step1_4 + step1_5) * cospi_16_64;
314*fb1b10abSAndroid Build Coastguard Worker           temp_2 = (step1_4 - step1_5 - step1_6 + step1_7) * cospi_16_64;
315*fb1b10abSAndroid Build Coastguard Worker         */
316*fb1b10abSAndroid Build Coastguard Worker         "sub      %[Temp0],             %[step1_7],     %[step1_6]      \n\t"
317*fb1b10abSAndroid Build Coastguard Worker         "sub      %[Temp0],             %[Temp0],       %[step1_4]      \n\t"
318*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp0],             %[Temp0],       %[step1_5]      \n\t"
319*fb1b10abSAndroid Build Coastguard Worker         "sub      %[Temp1],             %[step1_4],     %[step1_5]      \n\t"
320*fb1b10abSAndroid Build Coastguard Worker         "sub      %[Temp1],             %[Temp1],       %[step1_6]      \n\t"
321*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp1],             %[Temp1],       %[step1_7]      \n\t"
322*fb1b10abSAndroid Build Coastguard Worker 
323*fb1b10abSAndroid Build Coastguard Worker         "mtlo     %[const_2_power_13],  $ac0                            \n\t"
324*fb1b10abSAndroid Build Coastguard Worker         "mthi     $zero,                $ac0                            \n\t"
325*fb1b10abSAndroid Build Coastguard Worker         "mtlo     %[const_2_power_13],  $ac1                            \n\t"
326*fb1b10abSAndroid Build Coastguard Worker         "mthi     $zero,                $ac1                            \n\t"
327*fb1b10abSAndroid Build Coastguard Worker 
328*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac0,                 %[Temp0],       %[cospi_16_64]  \n\t"
329*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac1,                 %[Temp1],       %[cospi_16_64]  \n\t"
330*fb1b10abSAndroid Build Coastguard Worker 
331*fb1b10abSAndroid Build Coastguard Worker         /*
332*fb1b10abSAndroid Build Coastguard Worker           step1_4 = step1_4 + step1_5;
333*fb1b10abSAndroid Build Coastguard Worker           step1_7 = step1_6 + step1_7;
334*fb1b10abSAndroid Build Coastguard Worker         */
335*fb1b10abSAndroid Build Coastguard Worker         "add      %[step1_4],           %[step1_4],     %[step1_5]      \n\t"
336*fb1b10abSAndroid Build Coastguard Worker         "add      %[step1_7],           %[step1_7],     %[step1_6]      \n\t"
337*fb1b10abSAndroid Build Coastguard Worker 
338*fb1b10abSAndroid Build Coastguard Worker         "extp     %[step1_5],           $ac0,           31              \n\t"
339*fb1b10abSAndroid Build Coastguard Worker         "extp     %[step1_6],           $ac1,           31              \n\t"
340*fb1b10abSAndroid Build Coastguard Worker 
341*fb1b10abSAndroid Build Coastguard Worker         /* add block */
342*fb1b10abSAndroid Build Coastguard Worker         "lbu      %[Temp1],             0(%[dest_pix])                  \n\t"
343*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp0],             %[step1_0],     %[step1_7]      \n\t"
344*fb1b10abSAndroid Build Coastguard Worker         "addi     %[Temp0],             %[Temp0],       16              \n\t"
345*fb1b10abSAndroid Build Coastguard Worker         "sra      %[Temp0],             %[Temp0],       5               \n\t"
346*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp1],             %[Temp1],       %[Temp0]        \n\t"
347*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp0],             %[step1_1],     %[step1_6]      \n\t"
348*fb1b10abSAndroid Build Coastguard Worker         "slt      %[Temp2],             %[Temp1],       %[const_255]    \n\t"
349*fb1b10abSAndroid Build Coastguard Worker         "slt      %[Temp3],             $zero,          %[Temp1]        \n\t"
350*fb1b10abSAndroid Build Coastguard Worker         "movz     %[Temp1],             %[const_255],   %[Temp2]        \n\t"
351*fb1b10abSAndroid Build Coastguard Worker         "movz     %[Temp1],             $zero,          %[Temp3]        \n\t"
352*fb1b10abSAndroid Build Coastguard Worker         "sb       %[Temp1],             0(%[dest_pix])                  \n\t"
353*fb1b10abSAndroid Build Coastguard Worker         "addu     %[dest_pix],          %[dest_pix],    %[stride]       \n\t"
354*fb1b10abSAndroid Build Coastguard Worker 
355*fb1b10abSAndroid Build Coastguard Worker         "lbu      %[Temp1],             0(%[dest_pix])                  \n\t"
356*fb1b10abSAndroid Build Coastguard Worker         "addi     %[Temp0],             %[Temp0],       16              \n\t"
357*fb1b10abSAndroid Build Coastguard Worker         "sra      %[Temp0],             %[Temp0],       5               \n\t"
358*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp1],             %[Temp1],       %[Temp0]        \n\t"
359*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp0],             %[step1_2],     %[step1_5]      \n\t"
360*fb1b10abSAndroid Build Coastguard Worker         "slt      %[Temp2],             %[Temp1],       %[const_255]    \n\t"
361*fb1b10abSAndroid Build Coastguard Worker         "slt      %[Temp3],             $zero,          %[Temp1]        \n\t"
362*fb1b10abSAndroid Build Coastguard Worker         "movz     %[Temp1],             %[const_255],   %[Temp2]        \n\t"
363*fb1b10abSAndroid Build Coastguard Worker         "movz     %[Temp1],             $zero,          %[Temp3]        \n\t"
364*fb1b10abSAndroid Build Coastguard Worker         "sb       %[Temp1],             0(%[dest_pix])                  \n\t"
365*fb1b10abSAndroid Build Coastguard Worker         "addu     %[dest_pix],          %[dest_pix],    %[stride]       \n\t"
366*fb1b10abSAndroid Build Coastguard Worker 
367*fb1b10abSAndroid Build Coastguard Worker         "lbu      %[Temp1],             0(%[dest_pix])                  \n\t"
368*fb1b10abSAndroid Build Coastguard Worker         "addi     %[Temp0],             %[Temp0],       16              \n\t"
369*fb1b10abSAndroid Build Coastguard Worker         "sra      %[Temp0],             %[Temp0],       5               \n\t"
370*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp1],             %[Temp1],       %[Temp0]        \n\t"
371*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp0],             %[step1_3],     %[step1_4]      \n\t"
372*fb1b10abSAndroid Build Coastguard Worker         "slt      %[Temp2],             %[Temp1],       %[const_255]    \n\t"
373*fb1b10abSAndroid Build Coastguard Worker         "slt      %[Temp3],             $zero,          %[Temp1]        \n\t"
374*fb1b10abSAndroid Build Coastguard Worker         "movz     %[Temp1],             %[const_255],   %[Temp2]        \n\t"
375*fb1b10abSAndroid Build Coastguard Worker         "movz     %[Temp1],             $zero,          %[Temp3]        \n\t"
376*fb1b10abSAndroid Build Coastguard Worker         "sb       %[Temp1],             0(%[dest_pix])                  \n\t"
377*fb1b10abSAndroid Build Coastguard Worker         "addu     %[dest_pix],          %[dest_pix],    %[stride]       \n\t"
378*fb1b10abSAndroid Build Coastguard Worker 
379*fb1b10abSAndroid Build Coastguard Worker         "lbu      %[Temp1],             0(%[dest_pix])                  \n\t"
380*fb1b10abSAndroid Build Coastguard Worker         "addi     %[Temp0],             %[Temp0],       16              \n\t"
381*fb1b10abSAndroid Build Coastguard Worker         "sra      %[Temp0],             %[Temp0],       5               \n\t"
382*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp1],             %[Temp1],       %[Temp0]        \n\t"
383*fb1b10abSAndroid Build Coastguard Worker         "sub      %[Temp0],             %[step1_3],     %[step1_4]      \n\t"
384*fb1b10abSAndroid Build Coastguard Worker         "slt      %[Temp2],             %[Temp1],       %[const_255]    \n\t"
385*fb1b10abSAndroid Build Coastguard Worker         "slt      %[Temp3],             $zero,          %[Temp1]        \n\t"
386*fb1b10abSAndroid Build Coastguard Worker         "movz     %[Temp1],             %[const_255],   %[Temp2]        \n\t"
387*fb1b10abSAndroid Build Coastguard Worker         "movz     %[Temp1],             $zero,          %[Temp3]        \n\t"
388*fb1b10abSAndroid Build Coastguard Worker         "sb       %[Temp1],             0(%[dest_pix])                  \n\t"
389*fb1b10abSAndroid Build Coastguard Worker         "addu     %[dest_pix],          %[dest_pix],    %[stride]       \n\t"
390*fb1b10abSAndroid Build Coastguard Worker 
391*fb1b10abSAndroid Build Coastguard Worker         "lbu      %[Temp1],             0(%[dest_pix])                  \n\t"
392*fb1b10abSAndroid Build Coastguard Worker         "addi     %[Temp0],             %[Temp0],       16              \n\t"
393*fb1b10abSAndroid Build Coastguard Worker         "sra      %[Temp0],             %[Temp0],       5               \n\t"
394*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp1],             %[Temp1],       %[Temp0]        \n\t"
395*fb1b10abSAndroid Build Coastguard Worker         "sub      %[Temp0],             %[step1_2],     %[step1_5]      \n\t"
396*fb1b10abSAndroid Build Coastguard Worker         "slt      %[Temp2],             %[Temp1],       %[const_255]    \n\t"
397*fb1b10abSAndroid Build Coastguard Worker         "slt      %[Temp3],             $zero,          %[Temp1]        \n\t"
398*fb1b10abSAndroid Build Coastguard Worker         "movz     %[Temp1],             %[const_255],   %[Temp2]        \n\t"
399*fb1b10abSAndroid Build Coastguard Worker         "movz     %[Temp1],             $zero,          %[Temp3]        \n\t"
400*fb1b10abSAndroid Build Coastguard Worker         "sb       %[Temp1],             0(%[dest_pix])                  \n\t"
401*fb1b10abSAndroid Build Coastguard Worker         "addu     %[dest_pix],          %[dest_pix],    %[stride]       \n\t"
402*fb1b10abSAndroid Build Coastguard Worker 
403*fb1b10abSAndroid Build Coastguard Worker         "lbu      %[Temp1],             0(%[dest_pix])                  \n\t"
404*fb1b10abSAndroid Build Coastguard Worker         "addi     %[Temp0],             %[Temp0],       16              \n\t"
405*fb1b10abSAndroid Build Coastguard Worker         "sra      %[Temp0],             %[Temp0],       5               \n\t"
406*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp1],             %[Temp1],       %[Temp0]        \n\t"
407*fb1b10abSAndroid Build Coastguard Worker         "sub      %[Temp0],             %[step1_1],     %[step1_6]      \n\t"
408*fb1b10abSAndroid Build Coastguard Worker         "slt      %[Temp2],             %[Temp1],       %[const_255]    \n\t"
409*fb1b10abSAndroid Build Coastguard Worker         "slt      %[Temp3],             $zero,          %[Temp1]        \n\t"
410*fb1b10abSAndroid Build Coastguard Worker         "movz     %[Temp1],             %[const_255],   %[Temp2]        \n\t"
411*fb1b10abSAndroid Build Coastguard Worker         "movz     %[Temp1],             $zero,          %[Temp3]        \n\t"
412*fb1b10abSAndroid Build Coastguard Worker         "sb       %[Temp1],             0(%[dest_pix])                  \n\t"
413*fb1b10abSAndroid Build Coastguard Worker         "addu     %[dest_pix],          %[dest_pix],    %[stride]       \n\t"
414*fb1b10abSAndroid Build Coastguard Worker 
415*fb1b10abSAndroid Build Coastguard Worker         "lbu      %[Temp1],             0(%[dest_pix])                  \n\t"
416*fb1b10abSAndroid Build Coastguard Worker         "addi     %[Temp0],             %[Temp0],       16              \n\t"
417*fb1b10abSAndroid Build Coastguard Worker         "sra      %[Temp0],             %[Temp0],       5               \n\t"
418*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp1],             %[Temp1],       %[Temp0]        \n\t"
419*fb1b10abSAndroid Build Coastguard Worker         "sub      %[Temp0],             %[step1_0],     %[step1_7]      \n\t"
420*fb1b10abSAndroid Build Coastguard Worker         "slt      %[Temp2],             %[Temp1],       %[const_255]    \n\t"
421*fb1b10abSAndroid Build Coastguard Worker         "slt      %[Temp3],             $zero,          %[Temp1]        \n\t"
422*fb1b10abSAndroid Build Coastguard Worker         "movz     %[Temp1],             %[const_255],   %[Temp2]        \n\t"
423*fb1b10abSAndroid Build Coastguard Worker         "movz     %[Temp1],             $zero,          %[Temp3]        \n\t"
424*fb1b10abSAndroid Build Coastguard Worker         "sb       %[Temp1],             0(%[dest_pix])                  \n\t"
425*fb1b10abSAndroid Build Coastguard Worker         "addu     %[dest_pix],          %[dest_pix],    %[stride]       \n\t"
426*fb1b10abSAndroid Build Coastguard Worker 
427*fb1b10abSAndroid Build Coastguard Worker         "lbu      %[Temp1],             0(%[dest_pix])                  \n\t"
428*fb1b10abSAndroid Build Coastguard Worker         "addi     %[Temp0],             %[Temp0],       16              \n\t"
429*fb1b10abSAndroid Build Coastguard Worker         "sra      %[Temp0],             %[Temp0],       5               \n\t"
430*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp1],             %[Temp1],       %[Temp0]        \n\t"
431*fb1b10abSAndroid Build Coastguard Worker         "slt      %[Temp2],             %[Temp1],       %[const_255]    \n\t"
432*fb1b10abSAndroid Build Coastguard Worker         "slt      %[Temp3],             $zero,          %[Temp1]        \n\t"
433*fb1b10abSAndroid Build Coastguard Worker         "movz     %[Temp1],             %[const_255],   %[Temp2]        \n\t"
434*fb1b10abSAndroid Build Coastguard Worker         "movz     %[Temp1],             $zero,          %[Temp3]        \n\t"
435*fb1b10abSAndroid Build Coastguard Worker         "sb       %[Temp1],             0(%[dest_pix])                  \n\t"
436*fb1b10abSAndroid Build Coastguard Worker 
437*fb1b10abSAndroid Build Coastguard Worker         : [step1_0] "=&r"(step1_0), [step1_1] "=&r"(step1_1),
438*fb1b10abSAndroid Build Coastguard Worker           [step1_2] "=&r"(step1_2), [step1_3] "=&r"(step1_3),
439*fb1b10abSAndroid Build Coastguard Worker           [step1_4] "=&r"(step1_4), [step1_5] "=&r"(step1_5),
440*fb1b10abSAndroid Build Coastguard Worker           [step1_6] "=&r"(step1_6), [step1_7] "=&r"(step1_7),
441*fb1b10abSAndroid Build Coastguard Worker           [Temp0] "=&r"(Temp0), [Temp1] "=&r"(Temp1), [Temp2] "=&r"(Temp2),
442*fb1b10abSAndroid Build Coastguard Worker           [Temp3] "=&r"(Temp3), [dest_pix] "+r"(dest_pix)
443*fb1b10abSAndroid Build Coastguard Worker         : [const_2_power_13] "r"(const_2_power_13), [const_255] "r"(const_255),
444*fb1b10abSAndroid Build Coastguard Worker           [cospi_16_64] "r"(cospi_16_64), [cospi_28_64] "r"(cospi_28_64),
445*fb1b10abSAndroid Build Coastguard Worker           [cospi_4_64] "r"(cospi_4_64), [cospi_12_64] "r"(cospi_12_64),
446*fb1b10abSAndroid Build Coastguard Worker           [cospi_20_64] "r"(cospi_20_64), [cospi_8_64] "r"(cospi_8_64),
447*fb1b10abSAndroid Build Coastguard Worker           [cospi_24_64] "r"(cospi_24_64), [input] "r"(input),
448*fb1b10abSAndroid Build Coastguard Worker           [stride] "r"(stride));
449*fb1b10abSAndroid Build Coastguard Worker 
450*fb1b10abSAndroid Build Coastguard Worker     input += 8;
451*fb1b10abSAndroid Build Coastguard Worker   }
452*fb1b10abSAndroid Build Coastguard Worker }
453*fb1b10abSAndroid Build Coastguard Worker 
vpx_idct8x8_64_add_dspr2(const int16_t * input,uint8_t * dest,int stride)454*fb1b10abSAndroid Build Coastguard Worker void vpx_idct8x8_64_add_dspr2(const int16_t *input, uint8_t *dest, int stride) {
455*fb1b10abSAndroid Build Coastguard Worker   DECLARE_ALIGNED(32, int16_t, out[8 * 8]);
456*fb1b10abSAndroid Build Coastguard Worker   int16_t *outptr = out;
457*fb1b10abSAndroid Build Coastguard Worker   uint32_t pos = 45;
458*fb1b10abSAndroid Build Coastguard Worker 
459*fb1b10abSAndroid Build Coastguard Worker   /* bit positon for extract from acc */
460*fb1b10abSAndroid Build Coastguard Worker   __asm__ __volatile__("wrdsp    %[pos],    1    \n\t" : : [pos] "r"(pos));
461*fb1b10abSAndroid Build Coastguard Worker 
462*fb1b10abSAndroid Build Coastguard Worker   // First transform rows
463*fb1b10abSAndroid Build Coastguard Worker   idct8_rows_dspr2(input, outptr, 8);
464*fb1b10abSAndroid Build Coastguard Worker 
465*fb1b10abSAndroid Build Coastguard Worker   // Then transform columns and add to dest
466*fb1b10abSAndroid Build Coastguard Worker   idct8_columns_add_blk_dspr2(&out[0], dest, stride);
467*fb1b10abSAndroid Build Coastguard Worker }
468*fb1b10abSAndroid Build Coastguard Worker 
vpx_idct8x8_12_add_dspr2(const int16_t * input,uint8_t * dest,int stride)469*fb1b10abSAndroid Build Coastguard Worker void vpx_idct8x8_12_add_dspr2(const int16_t *input, uint8_t *dest, int stride) {
470*fb1b10abSAndroid Build Coastguard Worker   DECLARE_ALIGNED(32, int16_t, out[8 * 8]);
471*fb1b10abSAndroid Build Coastguard Worker   int16_t *outptr = out;
472*fb1b10abSAndroid Build Coastguard Worker   uint32_t pos = 45;
473*fb1b10abSAndroid Build Coastguard Worker 
474*fb1b10abSAndroid Build Coastguard Worker   /* bit positon for extract from acc */
475*fb1b10abSAndroid Build Coastguard Worker   __asm__ __volatile__("wrdsp    %[pos],    1    \n\t" : : [pos] "r"(pos));
476*fb1b10abSAndroid Build Coastguard Worker 
477*fb1b10abSAndroid Build Coastguard Worker   // First transform rows
478*fb1b10abSAndroid Build Coastguard Worker   idct8_rows_dspr2(input, outptr, 4);
479*fb1b10abSAndroid Build Coastguard Worker 
480*fb1b10abSAndroid Build Coastguard Worker   outptr += 4;
481*fb1b10abSAndroid Build Coastguard Worker 
482*fb1b10abSAndroid Build Coastguard Worker   __asm__ __volatile__(
483*fb1b10abSAndroid Build Coastguard Worker       "sw  $zero,   0(%[outptr])  \n\t"
484*fb1b10abSAndroid Build Coastguard Worker       "sw  $zero,   4(%[outptr])  \n\t"
485*fb1b10abSAndroid Build Coastguard Worker       "sw  $zero,  16(%[outptr])  \n\t"
486*fb1b10abSAndroid Build Coastguard Worker       "sw  $zero,  20(%[outptr])  \n\t"
487*fb1b10abSAndroid Build Coastguard Worker       "sw  $zero,  32(%[outptr])  \n\t"
488*fb1b10abSAndroid Build Coastguard Worker       "sw  $zero,  36(%[outptr])  \n\t"
489*fb1b10abSAndroid Build Coastguard Worker       "sw  $zero,  48(%[outptr])  \n\t"
490*fb1b10abSAndroid Build Coastguard Worker       "sw  $zero,  52(%[outptr])  \n\t"
491*fb1b10abSAndroid Build Coastguard Worker       "sw  $zero,  64(%[outptr])  \n\t"
492*fb1b10abSAndroid Build Coastguard Worker       "sw  $zero,  68(%[outptr])  \n\t"
493*fb1b10abSAndroid Build Coastguard Worker       "sw  $zero,  80(%[outptr])  \n\t"
494*fb1b10abSAndroid Build Coastguard Worker       "sw  $zero,  84(%[outptr])  \n\t"
495*fb1b10abSAndroid Build Coastguard Worker       "sw  $zero,  96(%[outptr])  \n\t"
496*fb1b10abSAndroid Build Coastguard Worker       "sw  $zero, 100(%[outptr])  \n\t"
497*fb1b10abSAndroid Build Coastguard Worker       "sw  $zero, 112(%[outptr])  \n\t"
498*fb1b10abSAndroid Build Coastguard Worker       "sw  $zero, 116(%[outptr])  \n\t"
499*fb1b10abSAndroid Build Coastguard Worker 
500*fb1b10abSAndroid Build Coastguard Worker       :
501*fb1b10abSAndroid Build Coastguard Worker       : [outptr] "r"(outptr));
502*fb1b10abSAndroid Build Coastguard Worker 
503*fb1b10abSAndroid Build Coastguard Worker   // Then transform columns and add to dest
504*fb1b10abSAndroid Build Coastguard Worker   idct8_columns_add_blk_dspr2(&out[0], dest, stride);
505*fb1b10abSAndroid Build Coastguard Worker }
506*fb1b10abSAndroid Build Coastguard Worker 
vpx_idct8x8_1_add_dspr2(const int16_t * input,uint8_t * dest,int stride)507*fb1b10abSAndroid Build Coastguard Worker void vpx_idct8x8_1_add_dspr2(const int16_t *input, uint8_t *dest, int stride) {
508*fb1b10abSAndroid Build Coastguard Worker   uint32_t pos = 45;
509*fb1b10abSAndroid Build Coastguard Worker   int32_t out;
510*fb1b10abSAndroid Build Coastguard Worker   int32_t r;
511*fb1b10abSAndroid Build Coastguard Worker   int32_t a1, absa1;
512*fb1b10abSAndroid Build Coastguard Worker   int32_t t1, t2, vector_a1, vector_1, vector_2;
513*fb1b10abSAndroid Build Coastguard Worker 
514*fb1b10abSAndroid Build Coastguard Worker   /* bit positon for extract from acc */
515*fb1b10abSAndroid Build Coastguard Worker   __asm__ __volatile__("wrdsp      %[pos],     1           \n\t"
516*fb1b10abSAndroid Build Coastguard Worker 
517*fb1b10abSAndroid Build Coastguard Worker                        :
518*fb1b10abSAndroid Build Coastguard Worker                        : [pos] "r"(pos));
519*fb1b10abSAndroid Build Coastguard Worker 
520*fb1b10abSAndroid Build Coastguard Worker   out = DCT_CONST_ROUND_SHIFT_TWICE_COSPI_16_64(input[0]);
521*fb1b10abSAndroid Build Coastguard Worker   __asm__ __volatile__(
522*fb1b10abSAndroid Build Coastguard Worker       "addi     %[out],     %[out],     16      \n\t"
523*fb1b10abSAndroid Build Coastguard Worker       "sra      %[a1],      %[out],     5       \n\t"
524*fb1b10abSAndroid Build Coastguard Worker 
525*fb1b10abSAndroid Build Coastguard Worker       : [out] "+r"(out), [a1] "=r"(a1)
526*fb1b10abSAndroid Build Coastguard Worker       :);
527*fb1b10abSAndroid Build Coastguard Worker 
528*fb1b10abSAndroid Build Coastguard Worker   if (a1 < 0) {
529*fb1b10abSAndroid Build Coastguard Worker     /* use quad-byte
530*fb1b10abSAndroid Build Coastguard Worker      * input and output memory are four byte aligned */
531*fb1b10abSAndroid Build Coastguard Worker     __asm__ __volatile__(
532*fb1b10abSAndroid Build Coastguard Worker         "abs        %[absa1],       %[a1]       \n\t"
533*fb1b10abSAndroid Build Coastguard Worker         "replv.qb   %[vector_a1],   %[absa1]    \n\t"
534*fb1b10abSAndroid Build Coastguard Worker 
535*fb1b10abSAndroid Build Coastguard Worker         : [absa1] "=r"(absa1), [vector_a1] "=r"(vector_a1)
536*fb1b10abSAndroid Build Coastguard Worker         : [a1] "r"(a1));
537*fb1b10abSAndroid Build Coastguard Worker 
538*fb1b10abSAndroid Build Coastguard Worker     for (r = 8; r--;) {
539*fb1b10abSAndroid Build Coastguard Worker       __asm__ __volatile__(
540*fb1b10abSAndroid Build Coastguard Worker           "lw           %[t1],          0(%[dest])                      \n\t"
541*fb1b10abSAndroid Build Coastguard Worker           "lw           %[t2],          4(%[dest])                      \n\t"
542*fb1b10abSAndroid Build Coastguard Worker           "subu_s.qb    %[vector_1],    %[t1],          %[vector_a1]    \n\t"
543*fb1b10abSAndroid Build Coastguard Worker           "subu_s.qb    %[vector_2],    %[t2],          %[vector_a1]    \n\t"
544*fb1b10abSAndroid Build Coastguard Worker           "sw           %[vector_1],    0(%[dest])                      \n\t"
545*fb1b10abSAndroid Build Coastguard Worker           "sw           %[vector_2],    4(%[dest])                      \n\t"
546*fb1b10abSAndroid Build Coastguard Worker           "add          %[dest],        %[dest],        %[stride]       \n\t"
547*fb1b10abSAndroid Build Coastguard Worker 
548*fb1b10abSAndroid Build Coastguard Worker           : [t1] "=&r"(t1), [t2] "=&r"(t2), [vector_1] "=&r"(vector_1),
549*fb1b10abSAndroid Build Coastguard Worker             [vector_2] "=&r"(vector_2), [dest] "+&r"(dest)
550*fb1b10abSAndroid Build Coastguard Worker           : [stride] "r"(stride), [vector_a1] "r"(vector_a1));
551*fb1b10abSAndroid Build Coastguard Worker     }
552*fb1b10abSAndroid Build Coastguard Worker   } else if (a1 > 255) {
553*fb1b10abSAndroid Build Coastguard Worker     int32_t a11, a12, vector_a11, vector_a12;
554*fb1b10abSAndroid Build Coastguard Worker 
555*fb1b10abSAndroid Build Coastguard Worker     /* use quad-byte
556*fb1b10abSAndroid Build Coastguard Worker      * input and output memory are four byte aligned */
557*fb1b10abSAndroid Build Coastguard Worker     a11 = a1 >> 2;
558*fb1b10abSAndroid Build Coastguard Worker     a12 = a1 - (a11 * 3);
559*fb1b10abSAndroid Build Coastguard Worker 
560*fb1b10abSAndroid Build Coastguard Worker     __asm__ __volatile__(
561*fb1b10abSAndroid Build Coastguard Worker         "replv.qb      %[vector_a11],  %[a11]     \n\t"
562*fb1b10abSAndroid Build Coastguard Worker         "replv.qb      %[vector_a12],  %[a12]     \n\t"
563*fb1b10abSAndroid Build Coastguard Worker 
564*fb1b10abSAndroid Build Coastguard Worker         : [vector_a11] "=&r"(vector_a11), [vector_a12] "=&r"(vector_a12)
565*fb1b10abSAndroid Build Coastguard Worker         : [a11] "r"(a11), [a12] "r"(a12));
566*fb1b10abSAndroid Build Coastguard Worker 
567*fb1b10abSAndroid Build Coastguard Worker     for (r = 8; r--;) {
568*fb1b10abSAndroid Build Coastguard Worker       __asm__ __volatile__(
569*fb1b10abSAndroid Build Coastguard Worker           "lw             %[t1],          0(%[dest])                      \n\t"
570*fb1b10abSAndroid Build Coastguard Worker           "lw             %[t2],          4(%[dest])                      \n\t"
571*fb1b10abSAndroid Build Coastguard Worker           "addu_s.qb      %[vector_1],    %[t1],          %[vector_a11]   \n\t"
572*fb1b10abSAndroid Build Coastguard Worker           "addu_s.qb      %[vector_2],    %[t2],          %[vector_a11]   \n\t"
573*fb1b10abSAndroid Build Coastguard Worker           "addu_s.qb      %[vector_1],    %[vector_1],    %[vector_a11]   \n\t"
574*fb1b10abSAndroid Build Coastguard Worker           "addu_s.qb      %[vector_2],    %[vector_2],    %[vector_a11]   \n\t"
575*fb1b10abSAndroid Build Coastguard Worker           "addu_s.qb      %[vector_1],    %[vector_1],    %[vector_a11]   \n\t"
576*fb1b10abSAndroid Build Coastguard Worker           "addu_s.qb      %[vector_2],    %[vector_2],    %[vector_a11]   \n\t"
577*fb1b10abSAndroid Build Coastguard Worker           "addu_s.qb      %[vector_1],    %[vector_1],    %[vector_a12]   \n\t"
578*fb1b10abSAndroid Build Coastguard Worker           "addu_s.qb      %[vector_2],    %[vector_2],    %[vector_a12]   \n\t"
579*fb1b10abSAndroid Build Coastguard Worker           "sw             %[vector_1],    0(%[dest])                      \n\t"
580*fb1b10abSAndroid Build Coastguard Worker           "sw             %[vector_2],    4(%[dest])                      \n\t"
581*fb1b10abSAndroid Build Coastguard Worker           "add            %[dest],        %[dest],        %[stride]       \n\t"
582*fb1b10abSAndroid Build Coastguard Worker 
583*fb1b10abSAndroid Build Coastguard Worker           : [t1] "=&r"(t1), [t2] "=&r"(t2), [vector_1] "=&r"(vector_1),
584*fb1b10abSAndroid Build Coastguard Worker             [vector_2] "=&r"(vector_2), [dest] "+r"(dest)
585*fb1b10abSAndroid Build Coastguard Worker           : [stride] "r"(stride), [vector_a11] "r"(vector_a11),
586*fb1b10abSAndroid Build Coastguard Worker             [vector_a12] "r"(vector_a12));
587*fb1b10abSAndroid Build Coastguard Worker     }
588*fb1b10abSAndroid Build Coastguard Worker   } else {
589*fb1b10abSAndroid Build Coastguard Worker     /* use quad-byte
590*fb1b10abSAndroid Build Coastguard Worker      * input and output memory are four byte aligned */
591*fb1b10abSAndroid Build Coastguard Worker     __asm__ __volatile__("replv.qb   %[vector_a1],   %[a1]   \n\t"
592*fb1b10abSAndroid Build Coastguard Worker 
593*fb1b10abSAndroid Build Coastguard Worker                          : [vector_a1] "=r"(vector_a1)
594*fb1b10abSAndroid Build Coastguard Worker                          : [a1] "r"(a1));
595*fb1b10abSAndroid Build Coastguard Worker 
596*fb1b10abSAndroid Build Coastguard Worker     for (r = 8; r--;) {
597*fb1b10abSAndroid Build Coastguard Worker       __asm__ __volatile__(
598*fb1b10abSAndroid Build Coastguard Worker           "lw           %[t1],          0(%[dest])                      \n\t"
599*fb1b10abSAndroid Build Coastguard Worker           "lw           %[t2],          4(%[dest])                      \n\t"
600*fb1b10abSAndroid Build Coastguard Worker           "addu_s.qb    %[vector_1],    %[t1],          %[vector_a1]    \n\t"
601*fb1b10abSAndroid Build Coastguard Worker           "addu_s.qb    %[vector_2],    %[t2],          %[vector_a1]    \n\t"
602*fb1b10abSAndroid Build Coastguard Worker           "sw           %[vector_1],    0(%[dest])                      \n\t"
603*fb1b10abSAndroid Build Coastguard Worker           "sw           %[vector_2],    4(%[dest])                      \n\t"
604*fb1b10abSAndroid Build Coastguard Worker           "add          %[dest],        %[dest],        %[stride]       \n\t"
605*fb1b10abSAndroid Build Coastguard Worker 
606*fb1b10abSAndroid Build Coastguard Worker           : [t1] "=&r"(t1), [t2] "=&r"(t2), [vector_1] "=&r"(vector_1),
607*fb1b10abSAndroid Build Coastguard Worker             [vector_2] "=&r"(vector_2), [dest] "+r"(dest)
608*fb1b10abSAndroid Build Coastguard Worker           : [stride] "r"(stride), [vector_a1] "r"(vector_a1));
609*fb1b10abSAndroid Build Coastguard Worker     }
610*fb1b10abSAndroid Build Coastguard Worker   }
611*fb1b10abSAndroid Build Coastguard Worker }
612*fb1b10abSAndroid Build Coastguard Worker 
iadst8_dspr2(const int16_t * input,int16_t * output)613*fb1b10abSAndroid Build Coastguard Worker void iadst8_dspr2(const int16_t *input, int16_t *output) {
614*fb1b10abSAndroid Build Coastguard Worker   int s0, s1, s2, s3, s4, s5, s6, s7;
615*fb1b10abSAndroid Build Coastguard Worker   int x0, x1, x2, x3, x4, x5, x6, x7;
616*fb1b10abSAndroid Build Coastguard Worker 
617*fb1b10abSAndroid Build Coastguard Worker   x0 = input[7];
618*fb1b10abSAndroid Build Coastguard Worker   x1 = input[0];
619*fb1b10abSAndroid Build Coastguard Worker   x2 = input[5];
620*fb1b10abSAndroid Build Coastguard Worker   x3 = input[2];
621*fb1b10abSAndroid Build Coastguard Worker   x4 = input[3];
622*fb1b10abSAndroid Build Coastguard Worker   x5 = input[4];
623*fb1b10abSAndroid Build Coastguard Worker   x6 = input[1];
624*fb1b10abSAndroid Build Coastguard Worker   x7 = input[6];
625*fb1b10abSAndroid Build Coastguard Worker 
626*fb1b10abSAndroid Build Coastguard Worker   if (!(x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7)) {
627*fb1b10abSAndroid Build Coastguard Worker     output[0] = output[1] = output[2] = output[3] = output[4] = output[5] =
628*fb1b10abSAndroid Build Coastguard Worker         output[6] = output[7] = 0;
629*fb1b10abSAndroid Build Coastguard Worker     return;
630*fb1b10abSAndroid Build Coastguard Worker   }
631*fb1b10abSAndroid Build Coastguard Worker 
632*fb1b10abSAndroid Build Coastguard Worker   // stage 1
633*fb1b10abSAndroid Build Coastguard Worker   s0 = cospi_2_64 * x0 + cospi_30_64 * x1;
634*fb1b10abSAndroid Build Coastguard Worker   s1 = cospi_30_64 * x0 - cospi_2_64 * x1;
635*fb1b10abSAndroid Build Coastguard Worker   s2 = cospi_10_64 * x2 + cospi_22_64 * x3;
636*fb1b10abSAndroid Build Coastguard Worker   s3 = cospi_22_64 * x2 - cospi_10_64 * x3;
637*fb1b10abSAndroid Build Coastguard Worker   s4 = cospi_18_64 * x4 + cospi_14_64 * x5;
638*fb1b10abSAndroid Build Coastguard Worker   s5 = cospi_14_64 * x4 - cospi_18_64 * x5;
639*fb1b10abSAndroid Build Coastguard Worker   s6 = cospi_26_64 * x6 + cospi_6_64 * x7;
640*fb1b10abSAndroid Build Coastguard Worker   s7 = cospi_6_64 * x6 - cospi_26_64 * x7;
641*fb1b10abSAndroid Build Coastguard Worker 
642*fb1b10abSAndroid Build Coastguard Worker   x0 = ROUND_POWER_OF_TWO((s0 + s4), DCT_CONST_BITS);
643*fb1b10abSAndroid Build Coastguard Worker   x1 = ROUND_POWER_OF_TWO((s1 + s5), DCT_CONST_BITS);
644*fb1b10abSAndroid Build Coastguard Worker   x2 = ROUND_POWER_OF_TWO((s2 + s6), DCT_CONST_BITS);
645*fb1b10abSAndroid Build Coastguard Worker   x3 = ROUND_POWER_OF_TWO((s3 + s7), DCT_CONST_BITS);
646*fb1b10abSAndroid Build Coastguard Worker   x4 = ROUND_POWER_OF_TWO((s0 - s4), DCT_CONST_BITS);
647*fb1b10abSAndroid Build Coastguard Worker   x5 = ROUND_POWER_OF_TWO((s1 - s5), DCT_CONST_BITS);
648*fb1b10abSAndroid Build Coastguard Worker   x6 = ROUND_POWER_OF_TWO((s2 - s6), DCT_CONST_BITS);
649*fb1b10abSAndroid Build Coastguard Worker   x7 = ROUND_POWER_OF_TWO((s3 - s7), DCT_CONST_BITS);
650*fb1b10abSAndroid Build Coastguard Worker 
651*fb1b10abSAndroid Build Coastguard Worker   // stage 2
652*fb1b10abSAndroid Build Coastguard Worker   s0 = x0;
653*fb1b10abSAndroid Build Coastguard Worker   s1 = x1;
654*fb1b10abSAndroid Build Coastguard Worker   s2 = x2;
655*fb1b10abSAndroid Build Coastguard Worker   s3 = x3;
656*fb1b10abSAndroid Build Coastguard Worker   s4 = cospi_8_64 * x4 + cospi_24_64 * x5;
657*fb1b10abSAndroid Build Coastguard Worker   s5 = cospi_24_64 * x4 - cospi_8_64 * x5;
658*fb1b10abSAndroid Build Coastguard Worker   s6 = -cospi_24_64 * x6 + cospi_8_64 * x7;
659*fb1b10abSAndroid Build Coastguard Worker   s7 = cospi_8_64 * x6 + cospi_24_64 * x7;
660*fb1b10abSAndroid Build Coastguard Worker 
661*fb1b10abSAndroid Build Coastguard Worker   x0 = s0 + s2;
662*fb1b10abSAndroid Build Coastguard Worker   x1 = s1 + s3;
663*fb1b10abSAndroid Build Coastguard Worker   x2 = s0 - s2;
664*fb1b10abSAndroid Build Coastguard Worker   x3 = s1 - s3;
665*fb1b10abSAndroid Build Coastguard Worker   x4 = ROUND_POWER_OF_TWO((s4 + s6), DCT_CONST_BITS);
666*fb1b10abSAndroid Build Coastguard Worker   x5 = ROUND_POWER_OF_TWO((s5 + s7), DCT_CONST_BITS);
667*fb1b10abSAndroid Build Coastguard Worker   x6 = ROUND_POWER_OF_TWO((s4 - s6), DCT_CONST_BITS);
668*fb1b10abSAndroid Build Coastguard Worker   x7 = ROUND_POWER_OF_TWO((s5 - s7), DCT_CONST_BITS);
669*fb1b10abSAndroid Build Coastguard Worker 
670*fb1b10abSAndroid Build Coastguard Worker   // stage 3
671*fb1b10abSAndroid Build Coastguard Worker   s2 = cospi_16_64 * (x2 + x3);
672*fb1b10abSAndroid Build Coastguard Worker   s3 = cospi_16_64 * (x2 - x3);
673*fb1b10abSAndroid Build Coastguard Worker   s6 = cospi_16_64 * (x6 + x7);
674*fb1b10abSAndroid Build Coastguard Worker   s7 = cospi_16_64 * (x6 - x7);
675*fb1b10abSAndroid Build Coastguard Worker 
676*fb1b10abSAndroid Build Coastguard Worker   x2 = ROUND_POWER_OF_TWO((s2), DCT_CONST_BITS);
677*fb1b10abSAndroid Build Coastguard Worker   x3 = ROUND_POWER_OF_TWO((s3), DCT_CONST_BITS);
678*fb1b10abSAndroid Build Coastguard Worker   x6 = ROUND_POWER_OF_TWO((s6), DCT_CONST_BITS);
679*fb1b10abSAndroid Build Coastguard Worker   x7 = ROUND_POWER_OF_TWO((s7), DCT_CONST_BITS);
680*fb1b10abSAndroid Build Coastguard Worker 
681*fb1b10abSAndroid Build Coastguard Worker   output[0] = x0;
682*fb1b10abSAndroid Build Coastguard Worker   output[1] = -x4;
683*fb1b10abSAndroid Build Coastguard Worker   output[2] = x6;
684*fb1b10abSAndroid Build Coastguard Worker   output[3] = -x2;
685*fb1b10abSAndroid Build Coastguard Worker   output[4] = x3;
686*fb1b10abSAndroid Build Coastguard Worker   output[5] = -x7;
687*fb1b10abSAndroid Build Coastguard Worker   output[6] = x5;
688*fb1b10abSAndroid Build Coastguard Worker   output[7] = -x1;
689*fb1b10abSAndroid Build Coastguard Worker }
690*fb1b10abSAndroid Build Coastguard Worker #endif  // HAVE_DSPR2
691