xref: /aosp_15_r20/external/libvpx/vpx_dsp/mips/itrans4_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
vpx_idct4_rows_dspr2(const int16_t * input,int16_t * output)17*fb1b10abSAndroid Build Coastguard Worker void vpx_idct4_rows_dspr2(const int16_t *input, int16_t *output) {
18*fb1b10abSAndroid Build Coastguard Worker   int step_0, step_1, step_2, step_3;
19*fb1b10abSAndroid Build Coastguard Worker   int Temp0, Temp1, Temp2, Temp3;
20*fb1b10abSAndroid Build Coastguard Worker   const int const_2_power_13 = 8192;
21*fb1b10abSAndroid Build Coastguard Worker   int i;
22*fb1b10abSAndroid Build Coastguard Worker 
23*fb1b10abSAndroid Build Coastguard Worker   for (i = 4; i--;) {
24*fb1b10abSAndroid Build Coastguard Worker     __asm__ __volatile__(
25*fb1b10abSAndroid Build Coastguard Worker         /*
26*fb1b10abSAndroid Build Coastguard Worker           temp_1 = (input[0] + input[2]) * cospi_16_64;
27*fb1b10abSAndroid Build Coastguard Worker           step_0 = dct_const_round_shift(temp_1);
28*fb1b10abSAndroid Build Coastguard Worker 
29*fb1b10abSAndroid Build Coastguard Worker           temp_2 = (input[0] - input[2]) * cospi_16_64;
30*fb1b10abSAndroid Build Coastguard Worker           step_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],             4(%[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         "sub      %[Temp3],             %[Temp0],       %[Temp1]        \n\t"
40*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac0,                 %[Temp2],       %[cospi_16_64]  \n\t"
41*fb1b10abSAndroid Build Coastguard Worker         "lh       %[Temp0],             2(%[input])                     \n\t"
42*fb1b10abSAndroid Build Coastguard Worker         "lh       %[Temp1],             6(%[input])                     \n\t"
43*fb1b10abSAndroid Build Coastguard Worker         "extp     %[step_0],            $ac0,           31              \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 
47*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac1,                 %[Temp3],       %[cospi_16_64]  \n\t"
48*fb1b10abSAndroid Build Coastguard Worker         "extp     %[step_1],            $ac1,           31              \n\t"
49*fb1b10abSAndroid Build Coastguard Worker         "mtlo     %[const_2_power_13],  $ac1                            \n\t"
50*fb1b10abSAndroid Build Coastguard Worker         "mthi     $zero,                $ac1                            \n\t"
51*fb1b10abSAndroid Build Coastguard Worker 
52*fb1b10abSAndroid Build Coastguard Worker         /*
53*fb1b10abSAndroid Build Coastguard Worker           temp1 = input[1] * cospi_24_64 - input[3] * cospi_8_64;
54*fb1b10abSAndroid Build Coastguard Worker           step_2 = dct_const_round_shift(temp1);
55*fb1b10abSAndroid Build Coastguard Worker         */
56*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac0,                 %[Temp0],       %[cospi_24_64]  \n\t"
57*fb1b10abSAndroid Build Coastguard Worker         "msub     $ac0,                 %[Temp1],       %[cospi_8_64]   \n\t"
58*fb1b10abSAndroid Build Coastguard Worker         "extp     %[step_2],            $ac0,           31              \n\t"
59*fb1b10abSAndroid Build Coastguard Worker 
60*fb1b10abSAndroid Build Coastguard Worker         /*
61*fb1b10abSAndroid Build Coastguard Worker           temp2 = input[1] * cospi_8_64 + input[3] * cospi_24_64;
62*fb1b10abSAndroid Build Coastguard Worker           step_3 = dct_const_round_shift(temp2);
63*fb1b10abSAndroid Build Coastguard Worker         */
64*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac1,                 %[Temp0],       %[cospi_8_64]   \n\t"
65*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac1,                 %[Temp1],       %[cospi_24_64]  \n\t"
66*fb1b10abSAndroid Build Coastguard Worker         "extp     %[step_3],            $ac1,           31              \n\t"
67*fb1b10abSAndroid Build Coastguard Worker 
68*fb1b10abSAndroid Build Coastguard Worker         /*
69*fb1b10abSAndroid Build Coastguard Worker           output[0]  = step_0 + step_3;
70*fb1b10abSAndroid Build Coastguard Worker           output[4]  = step_1 + step_2;
71*fb1b10abSAndroid Build Coastguard Worker           output[8]  = step_1 - step_2;
72*fb1b10abSAndroid Build Coastguard Worker           output[12] = step_0 - step_3;
73*fb1b10abSAndroid Build Coastguard Worker         */
74*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp0],             %[step_0],      %[step_3]       \n\t"
75*fb1b10abSAndroid Build Coastguard Worker         "sh       %[Temp0],             0(%[output])                    \n\t"
76*fb1b10abSAndroid Build Coastguard Worker 
77*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp1],             %[step_1],      %[step_2]       \n\t"
78*fb1b10abSAndroid Build Coastguard Worker         "sh       %[Temp1],             8(%[output])                    \n\t"
79*fb1b10abSAndroid Build Coastguard Worker 
80*fb1b10abSAndroid Build Coastguard Worker         "sub      %[Temp2],             %[step_1],      %[step_2]       \n\t"
81*fb1b10abSAndroid Build Coastguard Worker         "sh       %[Temp2],             16(%[output])                   \n\t"
82*fb1b10abSAndroid Build Coastguard Worker 
83*fb1b10abSAndroid Build Coastguard Worker         "sub      %[Temp3],             %[step_0],      %[step_3]       \n\t"
84*fb1b10abSAndroid Build Coastguard Worker         "sh       %[Temp3],             24(%[output])                   \n\t"
85*fb1b10abSAndroid Build Coastguard Worker 
86*fb1b10abSAndroid Build Coastguard Worker         : [Temp0] "=&r"(Temp0), [Temp1] "=&r"(Temp1), [Temp2] "=&r"(Temp2),
87*fb1b10abSAndroid Build Coastguard Worker           [Temp3] "=&r"(Temp3), [step_0] "=&r"(step_0), [step_1] "=&r"(step_1),
88*fb1b10abSAndroid Build Coastguard Worker           [step_2] "=&r"(step_2), [step_3] "=&r"(step_3), [output] "+r"(output)
89*fb1b10abSAndroid Build Coastguard Worker         : [const_2_power_13] "r"(const_2_power_13),
90*fb1b10abSAndroid Build Coastguard Worker           [cospi_8_64] "r"(cospi_8_64), [cospi_16_64] "r"(cospi_16_64),
91*fb1b10abSAndroid Build Coastguard Worker           [cospi_24_64] "r"(cospi_24_64), [input] "r"(input));
92*fb1b10abSAndroid Build Coastguard Worker 
93*fb1b10abSAndroid Build Coastguard Worker     input += 4;
94*fb1b10abSAndroid Build Coastguard Worker     output += 1;
95*fb1b10abSAndroid Build Coastguard Worker   }
96*fb1b10abSAndroid Build Coastguard Worker }
97*fb1b10abSAndroid Build Coastguard Worker 
vpx_idct4_columns_add_blk_dspr2(int16_t * input,uint8_t * dest,int stride)98*fb1b10abSAndroid Build Coastguard Worker void vpx_idct4_columns_add_blk_dspr2(int16_t *input, uint8_t *dest,
99*fb1b10abSAndroid Build Coastguard Worker                                      int stride) {
100*fb1b10abSAndroid Build Coastguard Worker   int step_0, step_1, step_2, step_3;
101*fb1b10abSAndroid Build Coastguard Worker   int Temp0, Temp1, Temp2, Temp3;
102*fb1b10abSAndroid Build Coastguard Worker   const int const_2_power_13 = 8192;
103*fb1b10abSAndroid Build Coastguard Worker   const int const_255 = 255;
104*fb1b10abSAndroid Build Coastguard Worker   int i;
105*fb1b10abSAndroid Build Coastguard Worker   uint8_t *dest_pix;
106*fb1b10abSAndroid Build Coastguard Worker 
107*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < 4; ++i) {
108*fb1b10abSAndroid Build Coastguard Worker     dest_pix = (dest + i);
109*fb1b10abSAndroid Build Coastguard Worker 
110*fb1b10abSAndroid Build Coastguard Worker     __asm__ __volatile__(
111*fb1b10abSAndroid Build Coastguard Worker         /*
112*fb1b10abSAndroid Build Coastguard Worker           temp_1 = (input[0] + input[2]) * cospi_16_64;
113*fb1b10abSAndroid Build Coastguard Worker           step_0 = dct_const_round_shift(temp_1);
114*fb1b10abSAndroid Build Coastguard Worker 
115*fb1b10abSAndroid Build Coastguard Worker           temp_2 = (input[0] - input[2]) * cospi_16_64;
116*fb1b10abSAndroid Build Coastguard Worker           step_1 = dct_const_round_shift(temp_2);
117*fb1b10abSAndroid Build Coastguard Worker         */
118*fb1b10abSAndroid Build Coastguard Worker         "lh       %[Temp0],             0(%[input])                     \n\t"
119*fb1b10abSAndroid Build Coastguard Worker         "lh       %[Temp1],             4(%[input])                     \n\t"
120*fb1b10abSAndroid Build Coastguard Worker         "mtlo     %[const_2_power_13],  $ac0                            \n\t"
121*fb1b10abSAndroid Build Coastguard Worker         "mthi     $zero,                $ac0                            \n\t"
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         "add      %[Temp2],             %[Temp0],       %[Temp1]        \n\t"
125*fb1b10abSAndroid Build Coastguard Worker         "sub      %[Temp3],             %[Temp0],       %[Temp1]        \n\t"
126*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac0,                 %[Temp2],       %[cospi_16_64]  \n\t"
127*fb1b10abSAndroid Build Coastguard Worker         "lh       %[Temp0],             2(%[input])                     \n\t"
128*fb1b10abSAndroid Build Coastguard Worker         "lh       %[Temp1],             6(%[input])                     \n\t"
129*fb1b10abSAndroid Build Coastguard Worker         "extp     %[step_0],            $ac0,           31              \n\t"
130*fb1b10abSAndroid Build Coastguard Worker         "mtlo     %[const_2_power_13],  $ac0                            \n\t"
131*fb1b10abSAndroid Build Coastguard Worker         "mthi     $zero,                $ac0                            \n\t"
132*fb1b10abSAndroid Build Coastguard Worker 
133*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac1,                 %[Temp3],       %[cospi_16_64]  \n\t"
134*fb1b10abSAndroid Build Coastguard Worker         "extp     %[step_1],            $ac1,           31              \n\t"
135*fb1b10abSAndroid Build Coastguard Worker         "mtlo     %[const_2_power_13],  $ac1                            \n\t"
136*fb1b10abSAndroid Build Coastguard Worker         "mthi     $zero,                $ac1                            \n\t"
137*fb1b10abSAndroid Build Coastguard Worker 
138*fb1b10abSAndroid Build Coastguard Worker         /*
139*fb1b10abSAndroid Build Coastguard Worker           temp1 = input[1] * cospi_24_64 - input[3] * cospi_8_64;
140*fb1b10abSAndroid Build Coastguard Worker           step_2 = dct_const_round_shift(temp1);
141*fb1b10abSAndroid Build Coastguard Worker         */
142*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac0,                 %[Temp0],       %[cospi_24_64]  \n\t"
143*fb1b10abSAndroid Build Coastguard Worker         "msub     $ac0,                 %[Temp1],       %[cospi_8_64]   \n\t"
144*fb1b10abSAndroid Build Coastguard Worker         "extp     %[step_2],            $ac0,           31              \n\t"
145*fb1b10abSAndroid Build Coastguard Worker 
146*fb1b10abSAndroid Build Coastguard Worker         /*
147*fb1b10abSAndroid Build Coastguard Worker           temp2 = input[1] * cospi_8_64 + input[3] * cospi_24_64;
148*fb1b10abSAndroid Build Coastguard Worker           step_3 = dct_const_round_shift(temp2);
149*fb1b10abSAndroid Build Coastguard Worker         */
150*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac1,                 %[Temp0],       %[cospi_8_64]   \n\t"
151*fb1b10abSAndroid Build Coastguard Worker         "madd     $ac1,                 %[Temp1],       %[cospi_24_64]  \n\t"
152*fb1b10abSAndroid Build Coastguard Worker         "extp     %[step_3],            $ac1,           31              \n\t"
153*fb1b10abSAndroid Build Coastguard Worker 
154*fb1b10abSAndroid Build Coastguard Worker         /*
155*fb1b10abSAndroid Build Coastguard Worker           output[0]  = step_0 + step_3;
156*fb1b10abSAndroid Build Coastguard Worker           output[4]  = step_1 + step_2;
157*fb1b10abSAndroid Build Coastguard Worker           output[8]  = step_1 - step_2;
158*fb1b10abSAndroid Build Coastguard Worker           output[12] = step_0 - step_3;
159*fb1b10abSAndroid Build Coastguard Worker         */
160*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp0],             %[step_0],      %[step_3]       \n\t"
161*fb1b10abSAndroid Build Coastguard Worker         "addi     %[Temp0],             %[Temp0],       8               \n\t"
162*fb1b10abSAndroid Build Coastguard Worker         "sra      %[Temp0],             %[Temp0],       4               \n\t"
163*fb1b10abSAndroid Build Coastguard Worker         "lbu      %[Temp1],             0(%[dest_pix])                  \n\t"
164*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp1],             %[Temp1],       %[Temp0]        \n\t"
165*fb1b10abSAndroid Build Coastguard Worker         "slt      %[Temp2],             %[Temp1],       %[const_255]    \n\t"
166*fb1b10abSAndroid Build Coastguard Worker         "slt      %[Temp3],             $zero,          %[Temp1]        \n\t"
167*fb1b10abSAndroid Build Coastguard Worker         "movz     %[Temp1],             %[const_255],   %[Temp2]        \n\t"
168*fb1b10abSAndroid Build Coastguard Worker         "movz     %[Temp1],             $zero,          %[Temp3]        \n\t"
169*fb1b10abSAndroid Build Coastguard Worker         "sb       %[Temp1],             0(%[dest_pix])                  \n\t"
170*fb1b10abSAndroid Build Coastguard Worker         "addu     %[dest_pix],          %[dest_pix],    %[stride]       \n\t"
171*fb1b10abSAndroid Build Coastguard Worker 
172*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp0],             %[step_1],      %[step_2]       \n\t"
173*fb1b10abSAndroid Build Coastguard Worker         "addi     %[Temp0],             %[Temp0],       8               \n\t"
174*fb1b10abSAndroid Build Coastguard Worker         "sra      %[Temp0],             %[Temp0],       4               \n\t"
175*fb1b10abSAndroid Build Coastguard Worker         "lbu      %[Temp1],             0(%[dest_pix])                  \n\t"
176*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp1],             %[Temp1],       %[Temp0]        \n\t"
177*fb1b10abSAndroid Build Coastguard Worker         "slt      %[Temp2],             %[Temp1],       %[const_255]    \n\t"
178*fb1b10abSAndroid Build Coastguard Worker         "slt      %[Temp3],             $zero,          %[Temp1]        \n\t"
179*fb1b10abSAndroid Build Coastguard Worker         "movz     %[Temp1],             %[const_255],   %[Temp2]        \n\t"
180*fb1b10abSAndroid Build Coastguard Worker         "movz     %[Temp1],             $zero,          %[Temp3]        \n\t"
181*fb1b10abSAndroid Build Coastguard Worker         "sb       %[Temp1],             0(%[dest_pix])                  \n\t"
182*fb1b10abSAndroid Build Coastguard Worker         "addu     %[dest_pix],          %[dest_pix],    %[stride]       \n\t"
183*fb1b10abSAndroid Build Coastguard Worker 
184*fb1b10abSAndroid Build Coastguard Worker         "sub      %[Temp0],             %[step_1],      %[step_2]       \n\t"
185*fb1b10abSAndroid Build Coastguard Worker         "addi     %[Temp0],             %[Temp0],       8               \n\t"
186*fb1b10abSAndroid Build Coastguard Worker         "sra      %[Temp0],             %[Temp0],       4               \n\t"
187*fb1b10abSAndroid Build Coastguard Worker         "lbu      %[Temp1],             0(%[dest_pix])                  \n\t"
188*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp1],             %[Temp1],       %[Temp0]        \n\t"
189*fb1b10abSAndroid Build Coastguard Worker         "slt      %[Temp2],             %[Temp1],       %[const_255]    \n\t"
190*fb1b10abSAndroid Build Coastguard Worker         "slt      %[Temp3],             $zero,          %[Temp1]        \n\t"
191*fb1b10abSAndroid Build Coastguard Worker         "movz     %[Temp1],             %[const_255],   %[Temp2]        \n\t"
192*fb1b10abSAndroid Build Coastguard Worker         "movz     %[Temp1],             $zero,          %[Temp3]        \n\t"
193*fb1b10abSAndroid Build Coastguard Worker         "sb       %[Temp1],             0(%[dest_pix])                  \n\t"
194*fb1b10abSAndroid Build Coastguard Worker         "addu     %[dest_pix],          %[dest_pix],    %[stride]       \n\t"
195*fb1b10abSAndroid Build Coastguard Worker 
196*fb1b10abSAndroid Build Coastguard Worker         "sub      %[Temp0],             %[step_0],      %[step_3]       \n\t"
197*fb1b10abSAndroid Build Coastguard Worker         "addi     %[Temp0],             %[Temp0],       8               \n\t"
198*fb1b10abSAndroid Build Coastguard Worker         "sra      %[Temp0],             %[Temp0],       4               \n\t"
199*fb1b10abSAndroid Build Coastguard Worker         "lbu      %[Temp1],             0(%[dest_pix])                  \n\t"
200*fb1b10abSAndroid Build Coastguard Worker         "add      %[Temp1],             %[Temp1],       %[Temp0]        \n\t"
201*fb1b10abSAndroid Build Coastguard Worker         "slt      %[Temp2],             %[Temp1],       %[const_255]    \n\t"
202*fb1b10abSAndroid Build Coastguard Worker         "slt      %[Temp3],             $zero,          %[Temp1]        \n\t"
203*fb1b10abSAndroid Build Coastguard Worker         "movz     %[Temp1],             %[const_255],   %[Temp2]        \n\t"
204*fb1b10abSAndroid Build Coastguard Worker         "movz     %[Temp1],             $zero,          %[Temp3]        \n\t"
205*fb1b10abSAndroid Build Coastguard Worker         "sb       %[Temp1],             0(%[dest_pix])                  \n\t"
206*fb1b10abSAndroid Build Coastguard Worker 
207*fb1b10abSAndroid Build Coastguard Worker         : [Temp0] "=&r"(Temp0), [Temp1] "=&r"(Temp1), [Temp2] "=&r"(Temp2),
208*fb1b10abSAndroid Build Coastguard Worker           [Temp3] "=&r"(Temp3), [step_0] "=&r"(step_0), [step_1] "=&r"(step_1),
209*fb1b10abSAndroid Build Coastguard Worker           [step_2] "=&r"(step_2), [step_3] "=&r"(step_3),
210*fb1b10abSAndroid Build Coastguard Worker           [dest_pix] "+r"(dest_pix)
211*fb1b10abSAndroid Build Coastguard Worker         : [const_2_power_13] "r"(const_2_power_13), [const_255] "r"(const_255),
212*fb1b10abSAndroid Build Coastguard Worker           [cospi_8_64] "r"(cospi_8_64), [cospi_16_64] "r"(cospi_16_64),
213*fb1b10abSAndroid Build Coastguard Worker           [cospi_24_64] "r"(cospi_24_64), [input] "r"(input),
214*fb1b10abSAndroid Build Coastguard Worker           [stride] "r"(stride));
215*fb1b10abSAndroid Build Coastguard Worker 
216*fb1b10abSAndroid Build Coastguard Worker     input += 4;
217*fb1b10abSAndroid Build Coastguard Worker   }
218*fb1b10abSAndroid Build Coastguard Worker }
219*fb1b10abSAndroid Build Coastguard Worker 
vpx_idct4x4_16_add_dspr2(const int16_t * input,uint8_t * dest,int stride)220*fb1b10abSAndroid Build Coastguard Worker void vpx_idct4x4_16_add_dspr2(const int16_t *input, uint8_t *dest, int stride) {
221*fb1b10abSAndroid Build Coastguard Worker   DECLARE_ALIGNED(32, int16_t, out[4 * 4]);
222*fb1b10abSAndroid Build Coastguard Worker   int16_t *outptr = out;
223*fb1b10abSAndroid Build Coastguard Worker   uint32_t pos = 45;
224*fb1b10abSAndroid Build Coastguard Worker 
225*fb1b10abSAndroid Build Coastguard Worker   /* bit positon for extract from acc */
226*fb1b10abSAndroid Build Coastguard Worker   __asm__ __volatile__("wrdsp      %[pos],     1           \n\t"
227*fb1b10abSAndroid Build Coastguard Worker                        :
228*fb1b10abSAndroid Build Coastguard Worker                        : [pos] "r"(pos));
229*fb1b10abSAndroid Build Coastguard Worker 
230*fb1b10abSAndroid Build Coastguard Worker   // Rows
231*fb1b10abSAndroid Build Coastguard Worker   vpx_idct4_rows_dspr2(input, outptr);
232*fb1b10abSAndroid Build Coastguard Worker 
233*fb1b10abSAndroid Build Coastguard Worker   // Columns
234*fb1b10abSAndroid Build Coastguard Worker   vpx_idct4_columns_add_blk_dspr2(&out[0], dest, stride);
235*fb1b10abSAndroid Build Coastguard Worker }
236*fb1b10abSAndroid Build Coastguard Worker 
vpx_idct4x4_1_add_dspr2(const int16_t * input,uint8_t * dest,int stride)237*fb1b10abSAndroid Build Coastguard Worker void vpx_idct4x4_1_add_dspr2(const int16_t *input, uint8_t *dest, int stride) {
238*fb1b10abSAndroid Build Coastguard Worker   int a1, absa1;
239*fb1b10abSAndroid Build Coastguard Worker   int r;
240*fb1b10abSAndroid Build Coastguard Worker   int32_t out;
241*fb1b10abSAndroid Build Coastguard Worker   int t2, vector_a1, vector_a;
242*fb1b10abSAndroid Build Coastguard Worker   uint32_t pos = 45;
243*fb1b10abSAndroid Build Coastguard Worker   int16_t input_dc = input[0];
244*fb1b10abSAndroid Build Coastguard Worker 
245*fb1b10abSAndroid Build Coastguard Worker   /* bit positon for extract from acc */
246*fb1b10abSAndroid Build Coastguard Worker   __asm__ __volatile__("wrdsp      %[pos],     1           \n\t"
247*fb1b10abSAndroid Build Coastguard Worker 
248*fb1b10abSAndroid Build Coastguard Worker                        :
249*fb1b10abSAndroid Build Coastguard Worker                        : [pos] "r"(pos));
250*fb1b10abSAndroid Build Coastguard Worker 
251*fb1b10abSAndroid Build Coastguard Worker   out = DCT_CONST_ROUND_SHIFT_TWICE_COSPI_16_64(input_dc);
252*fb1b10abSAndroid Build Coastguard Worker   __asm__ __volatile__(
253*fb1b10abSAndroid Build Coastguard Worker       "addi     %[out],     %[out],    8       \n\t"
254*fb1b10abSAndroid Build Coastguard Worker       "sra      %[a1],      %[out],    4       \n\t"
255*fb1b10abSAndroid Build Coastguard Worker 
256*fb1b10abSAndroid Build Coastguard Worker       : [out] "+r"(out), [a1] "=r"(a1)
257*fb1b10abSAndroid Build Coastguard Worker       :);
258*fb1b10abSAndroid Build Coastguard Worker 
259*fb1b10abSAndroid Build Coastguard Worker   if (a1 < 0) {
260*fb1b10abSAndroid Build Coastguard Worker     /* use quad-byte
261*fb1b10abSAndroid Build Coastguard Worker      * input and output memory are four byte aligned */
262*fb1b10abSAndroid Build Coastguard Worker     __asm__ __volatile__(
263*fb1b10abSAndroid Build Coastguard Worker         "abs        %[absa1],     %[a1]         \n\t"
264*fb1b10abSAndroid Build Coastguard Worker         "replv.qb   %[vector_a1], %[absa1]      \n\t"
265*fb1b10abSAndroid Build Coastguard Worker 
266*fb1b10abSAndroid Build Coastguard Worker         : [absa1] "=r"(absa1), [vector_a1] "=r"(vector_a1)
267*fb1b10abSAndroid Build Coastguard Worker         : [a1] "r"(a1));
268*fb1b10abSAndroid Build Coastguard Worker 
269*fb1b10abSAndroid Build Coastguard Worker     for (r = 4; r--;) {
270*fb1b10abSAndroid Build Coastguard Worker       __asm__ __volatile__(
271*fb1b10abSAndroid Build Coastguard Worker           "lw             %[t2],          0(%[dest])                      \n\t"
272*fb1b10abSAndroid Build Coastguard Worker           "subu_s.qb      %[vector_a],    %[t2],          %[vector_a1]    \n\t"
273*fb1b10abSAndroid Build Coastguard Worker           "sw             %[vector_a],    0(%[dest])                      \n\t"
274*fb1b10abSAndroid Build Coastguard Worker           "add            %[dest],        %[dest],        %[stride]       \n\t"
275*fb1b10abSAndroid Build Coastguard Worker 
276*fb1b10abSAndroid Build Coastguard Worker           : [t2] "=&r"(t2), [vector_a] "=&r"(vector_a), [dest] "+&r"(dest)
277*fb1b10abSAndroid Build Coastguard Worker           : [stride] "r"(stride), [vector_a1] "r"(vector_a1));
278*fb1b10abSAndroid Build Coastguard Worker     }
279*fb1b10abSAndroid Build Coastguard Worker   } else if (a1 > 255) {
280*fb1b10abSAndroid Build Coastguard Worker     int32_t a11, a12, vector_a11, vector_a12;
281*fb1b10abSAndroid Build Coastguard Worker 
282*fb1b10abSAndroid Build Coastguard Worker     /* use quad-byte
283*fb1b10abSAndroid Build Coastguard Worker      * input and output memory are four byte aligned */
284*fb1b10abSAndroid Build Coastguard Worker     a11 = a1 >> 3;
285*fb1b10abSAndroid Build Coastguard Worker     a12 = a1 - (a11 * 7);
286*fb1b10abSAndroid Build Coastguard Worker 
287*fb1b10abSAndroid Build Coastguard Worker     __asm__ __volatile__(
288*fb1b10abSAndroid Build Coastguard Worker         "replv.qb       %[vector_a11],  %[a11]     \n\t"
289*fb1b10abSAndroid Build Coastguard Worker         "replv.qb       %[vector_a12],  %[a12]     \n\t"
290*fb1b10abSAndroid Build Coastguard Worker 
291*fb1b10abSAndroid Build Coastguard Worker         : [vector_a11] "=&r"(vector_a11), [vector_a12] "=&r"(vector_a12)
292*fb1b10abSAndroid Build Coastguard Worker         : [a11] "r"(a11), [a12] "r"(a12));
293*fb1b10abSAndroid Build Coastguard Worker 
294*fb1b10abSAndroid Build Coastguard Worker     for (r = 4; r--;) {
295*fb1b10abSAndroid Build Coastguard Worker       __asm__ __volatile__(
296*fb1b10abSAndroid Build Coastguard Worker           "lw             %[t2],          4(%[dest])                      \n\t"
297*fb1b10abSAndroid Build Coastguard Worker           "addu_s.qb      %[vector_a],    %[t2],          %[vector_a11]   \n\t"
298*fb1b10abSAndroid Build Coastguard Worker           "addu_s.qb      %[vector_a],    %[vector_a],    %[vector_a11]   \n\t"
299*fb1b10abSAndroid Build Coastguard Worker           "addu_s.qb      %[vector_a],    %[vector_a],    %[vector_a11]   \n\t"
300*fb1b10abSAndroid Build Coastguard Worker           "addu_s.qb      %[vector_a],    %[vector_a],    %[vector_a11]   \n\t"
301*fb1b10abSAndroid Build Coastguard Worker           "addu_s.qb      %[vector_a],    %[vector_a],    %[vector_a11]   \n\t"
302*fb1b10abSAndroid Build Coastguard Worker           "addu_s.qb      %[vector_a],    %[vector_a],    %[vector_a11]   \n\t"
303*fb1b10abSAndroid Build Coastguard Worker           "addu_s.qb      %[vector_a],    %[vector_a],    %[vector_a11]   \n\t"
304*fb1b10abSAndroid Build Coastguard Worker           "addu_s.qb      %[vector_a],    %[vector_a],    %[vector_a12]   \n\t"
305*fb1b10abSAndroid Build Coastguard Worker           "sw             %[vector_a],    0(%[dest])                      \n\t"
306*fb1b10abSAndroid Build Coastguard Worker           "add            %[dest],        %[dest],        %[stride]       \n\t"
307*fb1b10abSAndroid Build Coastguard Worker 
308*fb1b10abSAndroid Build Coastguard Worker           : [t2] "=&r"(t2), [vector_a] "=&r"(vector_a), [dest] "+&r"(dest)
309*fb1b10abSAndroid Build Coastguard Worker           : [stride] "r"(stride), [vector_a11] "r"(vector_a11),
310*fb1b10abSAndroid Build Coastguard Worker             [vector_a12] "r"(vector_a12));
311*fb1b10abSAndroid Build Coastguard Worker     }
312*fb1b10abSAndroid Build Coastguard Worker   } else {
313*fb1b10abSAndroid Build Coastguard Worker     /* use quad-byte
314*fb1b10abSAndroid Build Coastguard Worker      * input and output memory are four byte aligned */
315*fb1b10abSAndroid Build Coastguard Worker     __asm__ __volatile__("replv.qb       %[vector_a1],   %[a1]     \n\t"
316*fb1b10abSAndroid Build Coastguard Worker                          : [vector_a1] "=r"(vector_a1)
317*fb1b10abSAndroid Build Coastguard Worker                          : [a1] "r"(a1));
318*fb1b10abSAndroid Build Coastguard Worker 
319*fb1b10abSAndroid Build Coastguard Worker     for (r = 4; r--;) {
320*fb1b10abSAndroid Build Coastguard Worker       __asm__ __volatile__(
321*fb1b10abSAndroid Build Coastguard Worker           "lw           %[t2],          0(%[dest])                        \n\t"
322*fb1b10abSAndroid Build Coastguard Worker           "addu_s.qb    %[vector_a],    %[t2],            %[vector_a1]    \n\t"
323*fb1b10abSAndroid Build Coastguard Worker           "sw           %[vector_a],    0(%[dest])                        \n\t"
324*fb1b10abSAndroid Build Coastguard Worker           "add          %[dest],        %[dest],          %[stride]       \n\t"
325*fb1b10abSAndroid Build Coastguard Worker 
326*fb1b10abSAndroid Build Coastguard Worker           : [t2] "=&r"(t2), [vector_a] "=&r"(vector_a), [dest] "+&r"(dest)
327*fb1b10abSAndroid Build Coastguard Worker           : [stride] "r"(stride), [vector_a1] "r"(vector_a1));
328*fb1b10abSAndroid Build Coastguard Worker     }
329*fb1b10abSAndroid Build Coastguard Worker   }
330*fb1b10abSAndroid Build Coastguard Worker }
331*fb1b10abSAndroid Build Coastguard Worker 
iadst4_dspr2(const int16_t * input,int16_t * output)332*fb1b10abSAndroid Build Coastguard Worker void iadst4_dspr2(const int16_t *input, int16_t *output) {
333*fb1b10abSAndroid Build Coastguard Worker   int s0, s1, s2, s3, s4, s5, s6, s7;
334*fb1b10abSAndroid Build Coastguard Worker   int x0, x1, x2, x3;
335*fb1b10abSAndroid Build Coastguard Worker 
336*fb1b10abSAndroid Build Coastguard Worker   x0 = input[0];
337*fb1b10abSAndroid Build Coastguard Worker   x1 = input[1];
338*fb1b10abSAndroid Build Coastguard Worker   x2 = input[2];
339*fb1b10abSAndroid Build Coastguard Worker   x3 = input[3];
340*fb1b10abSAndroid Build Coastguard Worker 
341*fb1b10abSAndroid Build Coastguard Worker   if (!(x0 | x1 | x2 | x3)) {
342*fb1b10abSAndroid Build Coastguard Worker     output[0] = output[1] = output[2] = output[3] = 0;
343*fb1b10abSAndroid Build Coastguard Worker     return;
344*fb1b10abSAndroid Build Coastguard Worker   }
345*fb1b10abSAndroid Build Coastguard Worker 
346*fb1b10abSAndroid Build Coastguard Worker   // 32-bit result is enough for the following multiplications.
347*fb1b10abSAndroid Build Coastguard Worker   s0 = sinpi_1_9 * x0;
348*fb1b10abSAndroid Build Coastguard Worker   s1 = sinpi_2_9 * x0;
349*fb1b10abSAndroid Build Coastguard Worker   s2 = sinpi_3_9 * x1;
350*fb1b10abSAndroid Build Coastguard Worker   s3 = sinpi_4_9 * x2;
351*fb1b10abSAndroid Build Coastguard Worker   s4 = sinpi_1_9 * x2;
352*fb1b10abSAndroid Build Coastguard Worker   s5 = sinpi_2_9 * x3;
353*fb1b10abSAndroid Build Coastguard Worker   s6 = sinpi_4_9 * x3;
354*fb1b10abSAndroid Build Coastguard Worker   s7 = x0 - x2 + x3;
355*fb1b10abSAndroid Build Coastguard Worker 
356*fb1b10abSAndroid Build Coastguard Worker   x0 = s0 + s3 + s5;
357*fb1b10abSAndroid Build Coastguard Worker   x1 = s1 - s4 - s6;
358*fb1b10abSAndroid Build Coastguard Worker   x2 = sinpi_3_9 * s7;
359*fb1b10abSAndroid Build Coastguard Worker   x3 = s2;
360*fb1b10abSAndroid Build Coastguard Worker 
361*fb1b10abSAndroid Build Coastguard Worker   s0 = x0 + x3;
362*fb1b10abSAndroid Build Coastguard Worker   s1 = x1 + x3;
363*fb1b10abSAndroid Build Coastguard Worker   s2 = x2;
364*fb1b10abSAndroid Build Coastguard Worker   s3 = x0 + x1 - x3;
365*fb1b10abSAndroid Build Coastguard Worker 
366*fb1b10abSAndroid Build Coastguard Worker   // 1-D transform scaling factor is sqrt(2).
367*fb1b10abSAndroid Build Coastguard Worker   // The overall dynamic range is 14b (input) + 14b (multiplication scaling)
368*fb1b10abSAndroid Build Coastguard Worker   // + 1b (addition) = 29b.
369*fb1b10abSAndroid Build Coastguard Worker   // Hence the output bit depth is 15b.
370*fb1b10abSAndroid Build Coastguard Worker   output[0] = dct_const_round_shift(s0);
371*fb1b10abSAndroid Build Coastguard Worker   output[1] = dct_const_round_shift(s1);
372*fb1b10abSAndroid Build Coastguard Worker   output[2] = dct_const_round_shift(s2);
373*fb1b10abSAndroid Build Coastguard Worker   output[3] = dct_const_round_shift(s3);
374*fb1b10abSAndroid Build Coastguard Worker }
375*fb1b10abSAndroid Build Coastguard Worker #endif  // #if HAVE_DSPR2
376