xref: /aosp_15_r20/external/libvpx/vpx_dsp/mips/intrapred4_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_dsp/mips/common_dspr2.h"
12*fb1b10abSAndroid Build Coastguard Worker 
13*fb1b10abSAndroid Build Coastguard Worker #if HAVE_DSPR2
vpx_h_predictor_4x4_dspr2(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)14*fb1b10abSAndroid Build Coastguard Worker void vpx_h_predictor_4x4_dspr2(uint8_t *dst, ptrdiff_t stride,
15*fb1b10abSAndroid Build Coastguard Worker                                const uint8_t *above, const uint8_t *left) {
16*fb1b10abSAndroid Build Coastguard Worker   int32_t tmp1, tmp2, tmp3, tmp4;
17*fb1b10abSAndroid Build Coastguard Worker   (void)above;
18*fb1b10abSAndroid Build Coastguard Worker 
19*fb1b10abSAndroid Build Coastguard Worker   __asm__ __volatile__(
20*fb1b10abSAndroid Build Coastguard Worker       "lb         %[tmp1],      (%[left])                    \n\t"
21*fb1b10abSAndroid Build Coastguard Worker       "lb         %[tmp2],      1(%[left])                   \n\t"
22*fb1b10abSAndroid Build Coastguard Worker       "lb         %[tmp3],      2(%[left])                   \n\t"
23*fb1b10abSAndroid Build Coastguard Worker       "lb         %[tmp4],      3(%[left])                   \n\t"
24*fb1b10abSAndroid Build Coastguard Worker       "replv.qb   %[tmp1],      %[tmp1]                      \n\t"
25*fb1b10abSAndroid Build Coastguard Worker       "replv.qb   %[tmp2],      %[tmp2]                      \n\t"
26*fb1b10abSAndroid Build Coastguard Worker       "replv.qb   %[tmp3],      %[tmp3]                      \n\t"
27*fb1b10abSAndroid Build Coastguard Worker       "replv.qb   %[tmp4],      %[tmp4]                      \n\t"
28*fb1b10abSAndroid Build Coastguard Worker       "sw         %[tmp1],      (%[dst])                     \n\t"
29*fb1b10abSAndroid Build Coastguard Worker       "add        %[dst],       %[dst],         %[stride]    \n\t"
30*fb1b10abSAndroid Build Coastguard Worker       "sw         %[tmp2],      (%[dst])                     \n\t"
31*fb1b10abSAndroid Build Coastguard Worker       "add        %[dst],       %[dst],         %[stride]    \n\t"
32*fb1b10abSAndroid Build Coastguard Worker       "sw         %[tmp3],      (%[dst])                     \n\t"
33*fb1b10abSAndroid Build Coastguard Worker       "add        %[dst],       %[dst],         %[stride]    \n\t"
34*fb1b10abSAndroid Build Coastguard Worker       "sw         %[tmp4],      (%[dst])                     \n\t"
35*fb1b10abSAndroid Build Coastguard Worker 
36*fb1b10abSAndroid Build Coastguard Worker       : [tmp1] "=&r"(tmp1), [tmp2] "=&r"(tmp2), [tmp3] "=&r"(tmp3),
37*fb1b10abSAndroid Build Coastguard Worker         [tmp4] "=&r"(tmp4)
38*fb1b10abSAndroid Build Coastguard Worker       : [left] "r"(left), [dst] "r"(dst), [stride] "r"(stride));
39*fb1b10abSAndroid Build Coastguard Worker }
40*fb1b10abSAndroid Build Coastguard Worker 
vpx_dc_predictor_4x4_dspr2(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)41*fb1b10abSAndroid Build Coastguard Worker void vpx_dc_predictor_4x4_dspr2(uint8_t *dst, ptrdiff_t stride,
42*fb1b10abSAndroid Build Coastguard Worker                                 const uint8_t *above, const uint8_t *left) {
43*fb1b10abSAndroid Build Coastguard Worker   int32_t expected_dc;
44*fb1b10abSAndroid Build Coastguard Worker   int32_t average;
45*fb1b10abSAndroid Build Coastguard Worker   int32_t tmp, above_c, above_l, above_r, left_c, left_r, left_l;
46*fb1b10abSAndroid Build Coastguard Worker 
47*fb1b10abSAndroid Build Coastguard Worker   __asm__ __volatile__(
48*fb1b10abSAndroid Build Coastguard Worker       "lw              %[above_c],         (%[above])                    \n\t"
49*fb1b10abSAndroid Build Coastguard Worker       "lw              %[left_c],          (%[left])                     \n\t"
50*fb1b10abSAndroid Build Coastguard Worker 
51*fb1b10abSAndroid Build Coastguard Worker       "preceu.ph.qbl   %[above_l],         %[above_c]                    \n\t"
52*fb1b10abSAndroid Build Coastguard Worker       "preceu.ph.qbr   %[above_r],         %[above_c]                    \n\t"
53*fb1b10abSAndroid Build Coastguard Worker       "preceu.ph.qbl   %[left_l],          %[left_c]                     \n\t"
54*fb1b10abSAndroid Build Coastguard Worker       "preceu.ph.qbr   %[left_r],          %[left_c]                     \n\t"
55*fb1b10abSAndroid Build Coastguard Worker 
56*fb1b10abSAndroid Build Coastguard Worker       "addu.ph         %[average],         %[above_r],       %[above_l]  \n\t"
57*fb1b10abSAndroid Build Coastguard Worker       "addu.ph         %[average],         %[average],       %[left_l]   \n\t"
58*fb1b10abSAndroid Build Coastguard Worker       "addu.ph         %[average],         %[average],       %[left_r]   \n\t"
59*fb1b10abSAndroid Build Coastguard Worker       "addiu           %[average],         %[average],       4           \n\t"
60*fb1b10abSAndroid Build Coastguard Worker       "srl             %[tmp],             %[average],       16          \n\t"
61*fb1b10abSAndroid Build Coastguard Worker       "addu.ph         %[average],         %[tmp],           %[average]  \n\t"
62*fb1b10abSAndroid Build Coastguard Worker       "srl             %[expected_dc],     %[average],       3           \n\t"
63*fb1b10abSAndroid Build Coastguard Worker       "replv.qb        %[expected_dc],     %[expected_dc]                \n\t"
64*fb1b10abSAndroid Build Coastguard Worker 
65*fb1b10abSAndroid Build Coastguard Worker       "sw              %[expected_dc],     (%[dst])                      \n\t"
66*fb1b10abSAndroid Build Coastguard Worker       "add             %[dst],              %[dst],          %[stride]   \n\t"
67*fb1b10abSAndroid Build Coastguard Worker       "sw              %[expected_dc],     (%[dst])                      \n\t"
68*fb1b10abSAndroid Build Coastguard Worker       "add             %[dst],              %[dst],          %[stride]   \n\t"
69*fb1b10abSAndroid Build Coastguard Worker       "sw              %[expected_dc],     (%[dst])                      \n\t"
70*fb1b10abSAndroid Build Coastguard Worker       "add             %[dst],              %[dst],          %[stride]   \n\t"
71*fb1b10abSAndroid Build Coastguard Worker       "sw              %[expected_dc],     (%[dst])                      \n\t"
72*fb1b10abSAndroid Build Coastguard Worker 
73*fb1b10abSAndroid Build Coastguard Worker       : [above_c] "=&r"(above_c), [above_l] "=&r"(above_l),
74*fb1b10abSAndroid Build Coastguard Worker         [above_r] "=&r"(above_r), [left_c] "=&r"(left_c),
75*fb1b10abSAndroid Build Coastguard Worker         [left_l] "=&r"(left_l), [left_r] "=&r"(left_r),
76*fb1b10abSAndroid Build Coastguard Worker         [average] "=&r"(average), [tmp] "=&r"(tmp),
77*fb1b10abSAndroid Build Coastguard Worker         [expected_dc] "=&r"(expected_dc)
78*fb1b10abSAndroid Build Coastguard Worker       : [above] "r"(above), [left] "r"(left), [dst] "r"(dst),
79*fb1b10abSAndroid Build Coastguard Worker         [stride] "r"(stride));
80*fb1b10abSAndroid Build Coastguard Worker }
81*fb1b10abSAndroid Build Coastguard Worker 
vpx_tm_predictor_4x4_dspr2(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)82*fb1b10abSAndroid Build Coastguard Worker void vpx_tm_predictor_4x4_dspr2(uint8_t *dst, ptrdiff_t stride,
83*fb1b10abSAndroid Build Coastguard Worker                                 const uint8_t *above, const uint8_t *left) {
84*fb1b10abSAndroid Build Coastguard Worker   int32_t abovel, abover;
85*fb1b10abSAndroid Build Coastguard Worker   int32_t left0, left1, left2, left3;
86*fb1b10abSAndroid Build Coastguard Worker   int32_t res0, res1;
87*fb1b10abSAndroid Build Coastguard Worker   int32_t resl;
88*fb1b10abSAndroid Build Coastguard Worker   int32_t resr;
89*fb1b10abSAndroid Build Coastguard Worker   int32_t top_left;
90*fb1b10abSAndroid Build Coastguard Worker   uint8_t *cm = vpx_ff_cropTbl;
91*fb1b10abSAndroid Build Coastguard Worker 
92*fb1b10abSAndroid Build Coastguard Worker   __asm__ __volatile__(
93*fb1b10abSAndroid Build Coastguard Worker       "ulw             %[resl],       (%[above])                         \n\t"
94*fb1b10abSAndroid Build Coastguard Worker 
95*fb1b10abSAndroid Build Coastguard Worker       "lbu             %[left0],       (%[left])                         \n\t"
96*fb1b10abSAndroid Build Coastguard Worker       "lbu             %[left1],       1(%[left])                        \n\t"
97*fb1b10abSAndroid Build Coastguard Worker       "lbu             %[left2],       2(%[left])                        \n\t"
98*fb1b10abSAndroid Build Coastguard Worker       "lbu             %[left3],       3(%[left])                        \n\t"
99*fb1b10abSAndroid Build Coastguard Worker 
100*fb1b10abSAndroid Build Coastguard Worker       "lbu             %[top_left],    -1(%[above])                      \n\t"
101*fb1b10abSAndroid Build Coastguard Worker 
102*fb1b10abSAndroid Build Coastguard Worker       "preceu.ph.qbl   %[abovel],      %[resl]                           \n\t"
103*fb1b10abSAndroid Build Coastguard Worker       "preceu.ph.qbr   %[abover],      %[resl]                           \n\t"
104*fb1b10abSAndroid Build Coastguard Worker 
105*fb1b10abSAndroid Build Coastguard Worker       "replv.ph        %[left0],       %[left0]                          \n\t"
106*fb1b10abSAndroid Build Coastguard Worker       "replv.ph        %[left1],       %[left1]                          \n\t"
107*fb1b10abSAndroid Build Coastguard Worker       "replv.ph        %[left2],       %[left2]                          \n\t"
108*fb1b10abSAndroid Build Coastguard Worker       "replv.ph        %[left3],       %[left3]                          \n\t"
109*fb1b10abSAndroid Build Coastguard Worker 
110*fb1b10abSAndroid Build Coastguard Worker       "replv.ph        %[top_left],    %[top_left]                       \n\t"
111*fb1b10abSAndroid Build Coastguard Worker 
112*fb1b10abSAndroid Build Coastguard Worker       "addu.ph         %[resl],        %[abovel],         %[left0]       \n\t"
113*fb1b10abSAndroid Build Coastguard Worker       "subu.ph         %[resl],        %[resl],           %[top_left]    \n\t"
114*fb1b10abSAndroid Build Coastguard Worker 
115*fb1b10abSAndroid Build Coastguard Worker       "addu.ph         %[resr],        %[abover],         %[left0]       \n\t"
116*fb1b10abSAndroid Build Coastguard Worker       "subu.ph         %[resr],        %[resr],           %[top_left]    \n\t"
117*fb1b10abSAndroid Build Coastguard Worker 
118*fb1b10abSAndroid Build Coastguard Worker       "sll             %[res0],        %[resr],           16             \n\t"
119*fb1b10abSAndroid Build Coastguard Worker       "sra             %[res0],        %[res0],           16             \n\t"
120*fb1b10abSAndroid Build Coastguard Worker       "lbux            %[res0],        %[res0](%[cm])                    \n\t"
121*fb1b10abSAndroid Build Coastguard Worker 
122*fb1b10abSAndroid Build Coastguard Worker       "sra             %[res1],        %[resr],           16             \n\t"
123*fb1b10abSAndroid Build Coastguard Worker       "lbux            %[res1],        %[res1](%[cm])                    \n\t"
124*fb1b10abSAndroid Build Coastguard Worker       "sb              %[res0],        (%[dst])                          \n\t"
125*fb1b10abSAndroid Build Coastguard Worker 
126*fb1b10abSAndroid Build Coastguard Worker       "sll             %[res0],        %[resl],           16             \n\t"
127*fb1b10abSAndroid Build Coastguard Worker       "sra             %[res0],        %[res0],           16             \n\t"
128*fb1b10abSAndroid Build Coastguard Worker       "lbux            %[res0],        %[res0](%[cm])                    \n\t"
129*fb1b10abSAndroid Build Coastguard Worker       "sb              %[res1],        1(%[dst])                         \n\t"
130*fb1b10abSAndroid Build Coastguard Worker 
131*fb1b10abSAndroid Build Coastguard Worker       "sra             %[res1],        %[resl],           16             \n\t"
132*fb1b10abSAndroid Build Coastguard Worker       "lbux            %[res1],        %[res1](%[cm])                    \n\t"
133*fb1b10abSAndroid Build Coastguard Worker 
134*fb1b10abSAndroid Build Coastguard Worker       "addu.ph         %[resl],        %[abovel],         %[left1]       \n\t"
135*fb1b10abSAndroid Build Coastguard Worker       "subu.ph         %[resl],        %[resl],           %[top_left]    \n\t"
136*fb1b10abSAndroid Build Coastguard Worker 
137*fb1b10abSAndroid Build Coastguard Worker       "addu.ph         %[resr],        %[abover],         %[left1]       \n\t"
138*fb1b10abSAndroid Build Coastguard Worker       "subu.ph         %[resr],        %[resr],           %[top_left]    \n\t"
139*fb1b10abSAndroid Build Coastguard Worker 
140*fb1b10abSAndroid Build Coastguard Worker       "sb              %[res0],        2(%[dst])                         \n\t"
141*fb1b10abSAndroid Build Coastguard Worker       "sb              %[res1],        3(%[dst])                         \n\t"
142*fb1b10abSAndroid Build Coastguard Worker 
143*fb1b10abSAndroid Build Coastguard Worker       "add             %[dst],          %[dst],           %[stride]      \n\t"
144*fb1b10abSAndroid Build Coastguard Worker 
145*fb1b10abSAndroid Build Coastguard Worker       "sll             %[res0],        %[resr],           16             \n\t"
146*fb1b10abSAndroid Build Coastguard Worker       "sra             %[res0],        %[res0],           16             \n\t"
147*fb1b10abSAndroid Build Coastguard Worker       "lbux            %[res0],        %[res0](%[cm])                    \n\t"
148*fb1b10abSAndroid Build Coastguard Worker 
149*fb1b10abSAndroid Build Coastguard Worker       "sra             %[res1],        %[resr],           16             \n\t"
150*fb1b10abSAndroid Build Coastguard Worker       "lbux            %[res1],        %[res1](%[cm])                    \n\t"
151*fb1b10abSAndroid Build Coastguard Worker       "sb              %[res0],        (%[dst])                          \n\t"
152*fb1b10abSAndroid Build Coastguard Worker 
153*fb1b10abSAndroid Build Coastguard Worker       "sll             %[res0],        %[resl],           16             \n\t"
154*fb1b10abSAndroid Build Coastguard Worker       "sra             %[res0],        %[res0],           16             \n\t"
155*fb1b10abSAndroid Build Coastguard Worker       "lbux            %[res0],        %[res0](%[cm])                    \n\t"
156*fb1b10abSAndroid Build Coastguard Worker 
157*fb1b10abSAndroid Build Coastguard Worker       "sb              %[res1],        1(%[dst])                         \n\t"
158*fb1b10abSAndroid Build Coastguard Worker       "sra             %[res1],        %[resl],           16             \n\t"
159*fb1b10abSAndroid Build Coastguard Worker       "lbux            %[res1],        %[res1](%[cm])                    \n\t"
160*fb1b10abSAndroid Build Coastguard Worker 
161*fb1b10abSAndroid Build Coastguard Worker       "addu.ph         %[resl],        %[abovel],         %[left2]       \n\t"
162*fb1b10abSAndroid Build Coastguard Worker       "subu.ph         %[resl],        %[resl],           %[top_left]    \n\t"
163*fb1b10abSAndroid Build Coastguard Worker 
164*fb1b10abSAndroid Build Coastguard Worker       "addu.ph         %[resr],        %[abover],         %[left2]       \n\t"
165*fb1b10abSAndroid Build Coastguard Worker       "subu.ph         %[resr],        %[resr],           %[top_left]    \n\t"
166*fb1b10abSAndroid Build Coastguard Worker 
167*fb1b10abSAndroid Build Coastguard Worker       "sb              %[res0],        2(%[dst])                         \n\t"
168*fb1b10abSAndroid Build Coastguard Worker       "sb              %[res1],        3(%[dst])                         \n\t"
169*fb1b10abSAndroid Build Coastguard Worker 
170*fb1b10abSAndroid Build Coastguard Worker       "add             %[dst],          %[dst],           %[stride]      \n\t"
171*fb1b10abSAndroid Build Coastguard Worker 
172*fb1b10abSAndroid Build Coastguard Worker       "sll             %[res0],        %[resr],           16             \n\t"
173*fb1b10abSAndroid Build Coastguard Worker       "sra             %[res0],        %[res0],           16             \n\t"
174*fb1b10abSAndroid Build Coastguard Worker       "lbux            %[res0],        %[res0](%[cm])                    \n\t"
175*fb1b10abSAndroid Build Coastguard Worker 
176*fb1b10abSAndroid Build Coastguard Worker       "sra             %[res1],        %[resr],           16             \n\t"
177*fb1b10abSAndroid Build Coastguard Worker       "lbux            %[res1],        %[res1](%[cm])                    \n\t"
178*fb1b10abSAndroid Build Coastguard Worker       "sb              %[res0],        (%[dst])                          \n\t"
179*fb1b10abSAndroid Build Coastguard Worker 
180*fb1b10abSAndroid Build Coastguard Worker       "sll             %[res0],        %[resl],           16             \n\t"
181*fb1b10abSAndroid Build Coastguard Worker       "sra             %[res0],        %[res0],           16             \n\t"
182*fb1b10abSAndroid Build Coastguard Worker       "lbux            %[res0],        %[res0](%[cm])                    \n\t"
183*fb1b10abSAndroid Build Coastguard Worker 
184*fb1b10abSAndroid Build Coastguard Worker       "sb              %[res1],        1(%[dst])                         \n\t"
185*fb1b10abSAndroid Build Coastguard Worker       "sra             %[res1],        %[resl],           16             \n\t"
186*fb1b10abSAndroid Build Coastguard Worker       "lbux            %[res1],        %[res1](%[cm])                    \n\t"
187*fb1b10abSAndroid Build Coastguard Worker 
188*fb1b10abSAndroid Build Coastguard Worker       "addu.ph         %[resl],        %[abovel],        %[left3]        \n\t"
189*fb1b10abSAndroid Build Coastguard Worker       "subu.ph         %[resl],        %[resl],          %[top_left]     \n\t"
190*fb1b10abSAndroid Build Coastguard Worker 
191*fb1b10abSAndroid Build Coastguard Worker       "addu.ph         %[resr],        %[abover],        %[left3]        \n\t"
192*fb1b10abSAndroid Build Coastguard Worker       "subu.ph         %[resr],        %[resr],          %[top_left]     \n\t"
193*fb1b10abSAndroid Build Coastguard Worker 
194*fb1b10abSAndroid Build Coastguard Worker       "sb              %[res0],        2(%[dst])                         \n\t"
195*fb1b10abSAndroid Build Coastguard Worker       "sb              %[res1],        3(%[dst])                         \n\t"
196*fb1b10abSAndroid Build Coastguard Worker 
197*fb1b10abSAndroid Build Coastguard Worker       "add             %[dst],          %[dst],          %[stride]       \n\t"
198*fb1b10abSAndroid Build Coastguard Worker 
199*fb1b10abSAndroid Build Coastguard Worker       "sll             %[res0],        %[resr],           16             \n\t"
200*fb1b10abSAndroid Build Coastguard Worker       "sra             %[res0],        %[res0],           16             \n\t"
201*fb1b10abSAndroid Build Coastguard Worker       "lbux            %[res0],        %[res0](%[cm])                    \n\t"
202*fb1b10abSAndroid Build Coastguard Worker 
203*fb1b10abSAndroid Build Coastguard Worker       "sra             %[res1],        %[resr],           16             \n\t"
204*fb1b10abSAndroid Build Coastguard Worker       "lbux            %[res1],        %[res1](%[cm])                    \n\t"
205*fb1b10abSAndroid Build Coastguard Worker       "sb              %[res0],        (%[dst])                          \n\t"
206*fb1b10abSAndroid Build Coastguard Worker 
207*fb1b10abSAndroid Build Coastguard Worker       "sll             %[res0],        %[resl],           16             \n\t"
208*fb1b10abSAndroid Build Coastguard Worker       "sra             %[res0],        %[res0],           16             \n\t"
209*fb1b10abSAndroid Build Coastguard Worker       "lbux            %[res0],        %[res0](%[cm])                    \n\t"
210*fb1b10abSAndroid Build Coastguard Worker       "sb              %[res1],        1(%[dst])                         \n\t"
211*fb1b10abSAndroid Build Coastguard Worker 
212*fb1b10abSAndroid Build Coastguard Worker       "sra             %[res1],        %[resl],           16             \n\t"
213*fb1b10abSAndroid Build Coastguard Worker       "lbux            %[res1],        %[res1](%[cm])                    \n\t"
214*fb1b10abSAndroid Build Coastguard Worker 
215*fb1b10abSAndroid Build Coastguard Worker       "sb              %[res0],        2(%[dst])                         \n\t"
216*fb1b10abSAndroid Build Coastguard Worker       "sb              %[res1],        3(%[dst])                         \n\t"
217*fb1b10abSAndroid Build Coastguard Worker 
218*fb1b10abSAndroid Build Coastguard Worker       : [abovel] "=&r"(abovel), [abover] "=&r"(abover), [left0] "=&r"(left0),
219*fb1b10abSAndroid Build Coastguard Worker         [left1] "=&r"(left1), [left2] "=&r"(left2), [res0] "=&r"(res0),
220*fb1b10abSAndroid Build Coastguard Worker         [res1] "=&r"(res1), [left3] "=&r"(left3), [resl] "=&r"(resl),
221*fb1b10abSAndroid Build Coastguard Worker         [resr] "=&r"(resr), [top_left] "=&r"(top_left)
222*fb1b10abSAndroid Build Coastguard Worker       : [above] "r"(above), [left] "r"(left), [dst] "r"(dst),
223*fb1b10abSAndroid Build Coastguard Worker         [stride] "r"(stride), [cm] "r"(cm));
224*fb1b10abSAndroid Build Coastguard Worker }
225*fb1b10abSAndroid Build Coastguard Worker #endif  // #if HAVE_DSPR2
226