xref: /aosp_15_r20/external/libvpx/vpx_dsp/mips/subtract_msa.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_rtcd.h"
12*fb1b10abSAndroid Build Coastguard Worker #include "vpx_dsp/mips/macros_msa.h"
13*fb1b10abSAndroid Build Coastguard Worker 
sub_blk_4x4_msa(const uint8_t * src_ptr,int32_t src_stride,const uint8_t * pred_ptr,int32_t pred_stride,int16_t * diff_ptr,int32_t diff_stride)14*fb1b10abSAndroid Build Coastguard Worker static void sub_blk_4x4_msa(const uint8_t *src_ptr, int32_t src_stride,
15*fb1b10abSAndroid Build Coastguard Worker                             const uint8_t *pred_ptr, int32_t pred_stride,
16*fb1b10abSAndroid Build Coastguard Worker                             int16_t *diff_ptr, int32_t diff_stride) {
17*fb1b10abSAndroid Build Coastguard Worker   uint32_t src0, src1, src2, src3;
18*fb1b10abSAndroid Build Coastguard Worker   uint32_t pred0, pred1, pred2, pred3;
19*fb1b10abSAndroid Build Coastguard Worker   v16i8 src = { 0 };
20*fb1b10abSAndroid Build Coastguard Worker   v16i8 pred = { 0 };
21*fb1b10abSAndroid Build Coastguard Worker   v16u8 src_l0, src_l1;
22*fb1b10abSAndroid Build Coastguard Worker   v8i16 diff0, diff1;
23*fb1b10abSAndroid Build Coastguard Worker 
24*fb1b10abSAndroid Build Coastguard Worker   LW4(src_ptr, src_stride, src0, src1, src2, src3);
25*fb1b10abSAndroid Build Coastguard Worker   LW4(pred_ptr, pred_stride, pred0, pred1, pred2, pred3);
26*fb1b10abSAndroid Build Coastguard Worker   INSERT_W4_SB(src0, src1, src2, src3, src);
27*fb1b10abSAndroid Build Coastguard Worker   INSERT_W4_SB(pred0, pred1, pred2, pred3, pred);
28*fb1b10abSAndroid Build Coastguard Worker   ILVRL_B2_UB(src, pred, src_l0, src_l1);
29*fb1b10abSAndroid Build Coastguard Worker   HSUB_UB2_SH(src_l0, src_l1, diff0, diff1);
30*fb1b10abSAndroid Build Coastguard Worker   ST8x4_UB(diff0, diff1, diff_ptr, (2 * diff_stride));
31*fb1b10abSAndroid Build Coastguard Worker }
32*fb1b10abSAndroid Build Coastguard Worker 
sub_blk_8x8_msa(const uint8_t * src_ptr,int32_t src_stride,const uint8_t * pred_ptr,int32_t pred_stride,int16_t * diff_ptr,int32_t diff_stride)33*fb1b10abSAndroid Build Coastguard Worker static void sub_blk_8x8_msa(const uint8_t *src_ptr, int32_t src_stride,
34*fb1b10abSAndroid Build Coastguard Worker                             const uint8_t *pred_ptr, int32_t pred_stride,
35*fb1b10abSAndroid Build Coastguard Worker                             int16_t *diff_ptr, int32_t diff_stride) {
36*fb1b10abSAndroid Build Coastguard Worker   uint32_t loop_cnt;
37*fb1b10abSAndroid Build Coastguard Worker   uint64_t src0, src1, pred0, pred1;
38*fb1b10abSAndroid Build Coastguard Worker   v16i8 src = { 0 };
39*fb1b10abSAndroid Build Coastguard Worker   v16i8 pred = { 0 };
40*fb1b10abSAndroid Build Coastguard Worker   v16u8 src_l0, src_l1;
41*fb1b10abSAndroid Build Coastguard Worker   v8i16 diff0, diff1;
42*fb1b10abSAndroid Build Coastguard Worker 
43*fb1b10abSAndroid Build Coastguard Worker   for (loop_cnt = 4; loop_cnt--;) {
44*fb1b10abSAndroid Build Coastguard Worker     LD2(src_ptr, src_stride, src0, src1);
45*fb1b10abSAndroid Build Coastguard Worker     src_ptr += (2 * src_stride);
46*fb1b10abSAndroid Build Coastguard Worker     LD2(pred_ptr, pred_stride, pred0, pred1);
47*fb1b10abSAndroid Build Coastguard Worker     pred_ptr += (2 * pred_stride);
48*fb1b10abSAndroid Build Coastguard Worker 
49*fb1b10abSAndroid Build Coastguard Worker     INSERT_D2_SB(src0, src1, src);
50*fb1b10abSAndroid Build Coastguard Worker     INSERT_D2_SB(pred0, pred1, pred);
51*fb1b10abSAndroid Build Coastguard Worker     ILVRL_B2_UB(src, pred, src_l0, src_l1);
52*fb1b10abSAndroid Build Coastguard Worker     HSUB_UB2_SH(src_l0, src_l1, diff0, diff1);
53*fb1b10abSAndroid Build Coastguard Worker     ST_SH2(diff0, diff1, diff_ptr, diff_stride);
54*fb1b10abSAndroid Build Coastguard Worker     diff_ptr += (2 * diff_stride);
55*fb1b10abSAndroid Build Coastguard Worker   }
56*fb1b10abSAndroid Build Coastguard Worker }
57*fb1b10abSAndroid Build Coastguard Worker 
sub_blk_16x16_msa(const uint8_t * src,int32_t src_stride,const uint8_t * pred,int32_t pred_stride,int16_t * diff,int32_t diff_stride)58*fb1b10abSAndroid Build Coastguard Worker static void sub_blk_16x16_msa(const uint8_t *src, int32_t src_stride,
59*fb1b10abSAndroid Build Coastguard Worker                               const uint8_t *pred, int32_t pred_stride,
60*fb1b10abSAndroid Build Coastguard Worker                               int16_t *diff, int32_t diff_stride) {
61*fb1b10abSAndroid Build Coastguard Worker   int8_t count;
62*fb1b10abSAndroid Build Coastguard Worker   v16i8 src0, src1, src2, src3, src4, src5, src6, src7;
63*fb1b10abSAndroid Build Coastguard Worker   v16i8 pred0, pred1, pred2, pred3, pred4, pred5, pred6, pred7;
64*fb1b10abSAndroid Build Coastguard Worker   v16u8 src_l0, src_l1;
65*fb1b10abSAndroid Build Coastguard Worker   v8i16 diff0, diff1;
66*fb1b10abSAndroid Build Coastguard Worker 
67*fb1b10abSAndroid Build Coastguard Worker   for (count = 2; count--;) {
68*fb1b10abSAndroid Build Coastguard Worker     LD_SB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
69*fb1b10abSAndroid Build Coastguard Worker     src += (8 * src_stride);
70*fb1b10abSAndroid Build Coastguard Worker 
71*fb1b10abSAndroid Build Coastguard Worker     LD_SB8(pred, pred_stride, pred0, pred1, pred2, pred3, pred4, pred5, pred6,
72*fb1b10abSAndroid Build Coastguard Worker            pred7);
73*fb1b10abSAndroid Build Coastguard Worker     pred += (8 * pred_stride);
74*fb1b10abSAndroid Build Coastguard Worker 
75*fb1b10abSAndroid Build Coastguard Worker     ILVRL_B2_UB(src0, pred0, src_l0, src_l1);
76*fb1b10abSAndroid Build Coastguard Worker     HSUB_UB2_SH(src_l0, src_l1, diff0, diff1);
77*fb1b10abSAndroid Build Coastguard Worker     ST_SH2(diff0, diff1, diff, 8);
78*fb1b10abSAndroid Build Coastguard Worker     diff += diff_stride;
79*fb1b10abSAndroid Build Coastguard Worker 
80*fb1b10abSAndroid Build Coastguard Worker     ILVRL_B2_UB(src1, pred1, src_l0, src_l1);
81*fb1b10abSAndroid Build Coastguard Worker     HSUB_UB2_SH(src_l0, src_l1, diff0, diff1);
82*fb1b10abSAndroid Build Coastguard Worker     ST_SH2(diff0, diff1, diff, 8);
83*fb1b10abSAndroid Build Coastguard Worker     diff += diff_stride;
84*fb1b10abSAndroid Build Coastguard Worker 
85*fb1b10abSAndroid Build Coastguard Worker     ILVRL_B2_UB(src2, pred2, src_l0, src_l1);
86*fb1b10abSAndroid Build Coastguard Worker     HSUB_UB2_SH(src_l0, src_l1, diff0, diff1);
87*fb1b10abSAndroid Build Coastguard Worker     ST_SH2(diff0, diff1, diff, 8);
88*fb1b10abSAndroid Build Coastguard Worker     diff += diff_stride;
89*fb1b10abSAndroid Build Coastguard Worker 
90*fb1b10abSAndroid Build Coastguard Worker     ILVRL_B2_UB(src3, pred3, src_l0, src_l1);
91*fb1b10abSAndroid Build Coastguard Worker     HSUB_UB2_SH(src_l0, src_l1, diff0, diff1);
92*fb1b10abSAndroid Build Coastguard Worker     ST_SH2(diff0, diff1, diff, 8);
93*fb1b10abSAndroid Build Coastguard Worker     diff += diff_stride;
94*fb1b10abSAndroid Build Coastguard Worker 
95*fb1b10abSAndroid Build Coastguard Worker     ILVRL_B2_UB(src4, pred4, src_l0, src_l1);
96*fb1b10abSAndroid Build Coastguard Worker     HSUB_UB2_SH(src_l0, src_l1, diff0, diff1);
97*fb1b10abSAndroid Build Coastguard Worker     ST_SH2(diff0, diff1, diff, 8);
98*fb1b10abSAndroid Build Coastguard Worker     diff += diff_stride;
99*fb1b10abSAndroid Build Coastguard Worker 
100*fb1b10abSAndroid Build Coastguard Worker     ILVRL_B2_UB(src5, pred5, src_l0, src_l1);
101*fb1b10abSAndroid Build Coastguard Worker     HSUB_UB2_SH(src_l0, src_l1, diff0, diff1);
102*fb1b10abSAndroid Build Coastguard Worker     ST_SH2(diff0, diff1, diff, 8);
103*fb1b10abSAndroid Build Coastguard Worker     diff += diff_stride;
104*fb1b10abSAndroid Build Coastguard Worker 
105*fb1b10abSAndroid Build Coastguard Worker     ILVRL_B2_UB(src6, pred6, src_l0, src_l1);
106*fb1b10abSAndroid Build Coastguard Worker     HSUB_UB2_SH(src_l0, src_l1, diff0, diff1);
107*fb1b10abSAndroid Build Coastguard Worker     ST_SH2(diff0, diff1, diff, 8);
108*fb1b10abSAndroid Build Coastguard Worker     diff += diff_stride;
109*fb1b10abSAndroid Build Coastguard Worker 
110*fb1b10abSAndroid Build Coastguard Worker     ILVRL_B2_UB(src7, pred7, src_l0, src_l1);
111*fb1b10abSAndroid Build Coastguard Worker     HSUB_UB2_SH(src_l0, src_l1, diff0, diff1);
112*fb1b10abSAndroid Build Coastguard Worker     ST_SH2(diff0, diff1, diff, 8);
113*fb1b10abSAndroid Build Coastguard Worker     diff += diff_stride;
114*fb1b10abSAndroid Build Coastguard Worker   }
115*fb1b10abSAndroid Build Coastguard Worker }
116*fb1b10abSAndroid Build Coastguard Worker 
sub_blk_32x32_msa(const uint8_t * src,int32_t src_stride,const uint8_t * pred,int32_t pred_stride,int16_t * diff,int32_t diff_stride)117*fb1b10abSAndroid Build Coastguard Worker static void sub_blk_32x32_msa(const uint8_t *src, int32_t src_stride,
118*fb1b10abSAndroid Build Coastguard Worker                               const uint8_t *pred, int32_t pred_stride,
119*fb1b10abSAndroid Build Coastguard Worker                               int16_t *diff, int32_t diff_stride) {
120*fb1b10abSAndroid Build Coastguard Worker   uint32_t loop_cnt;
121*fb1b10abSAndroid Build Coastguard Worker   v16i8 src0, src1, src2, src3, src4, src5, src6, src7;
122*fb1b10abSAndroid Build Coastguard Worker   v16i8 pred0, pred1, pred2, pred3, pred4, pred5, pred6, pred7;
123*fb1b10abSAndroid Build Coastguard Worker   v16u8 src_l0, src_l1;
124*fb1b10abSAndroid Build Coastguard Worker   v8i16 diff0, diff1;
125*fb1b10abSAndroid Build Coastguard Worker 
126*fb1b10abSAndroid Build Coastguard Worker   for (loop_cnt = 8; loop_cnt--;) {
127*fb1b10abSAndroid Build Coastguard Worker     LD_SB2(src, 16, src0, src1);
128*fb1b10abSAndroid Build Coastguard Worker     src += src_stride;
129*fb1b10abSAndroid Build Coastguard Worker     LD_SB2(src, 16, src2, src3);
130*fb1b10abSAndroid Build Coastguard Worker     src += src_stride;
131*fb1b10abSAndroid Build Coastguard Worker     LD_SB2(src, 16, src4, src5);
132*fb1b10abSAndroid Build Coastguard Worker     src += src_stride;
133*fb1b10abSAndroid Build Coastguard Worker     LD_SB2(src, 16, src6, src7);
134*fb1b10abSAndroid Build Coastguard Worker     src += src_stride;
135*fb1b10abSAndroid Build Coastguard Worker 
136*fb1b10abSAndroid Build Coastguard Worker     LD_SB2(pred, 16, pred0, pred1);
137*fb1b10abSAndroid Build Coastguard Worker     pred += pred_stride;
138*fb1b10abSAndroid Build Coastguard Worker     LD_SB2(pred, 16, pred2, pred3);
139*fb1b10abSAndroid Build Coastguard Worker     pred += pred_stride;
140*fb1b10abSAndroid Build Coastguard Worker     LD_SB2(pred, 16, pred4, pred5);
141*fb1b10abSAndroid Build Coastguard Worker     pred += pred_stride;
142*fb1b10abSAndroid Build Coastguard Worker     LD_SB2(pred, 16, pred6, pred7);
143*fb1b10abSAndroid Build Coastguard Worker     pred += pred_stride;
144*fb1b10abSAndroid Build Coastguard Worker 
145*fb1b10abSAndroid Build Coastguard Worker     ILVRL_B2_UB(src0, pred0, src_l0, src_l1);
146*fb1b10abSAndroid Build Coastguard Worker     HSUB_UB2_SH(src_l0, src_l1, diff0, diff1);
147*fb1b10abSAndroid Build Coastguard Worker     ST_SH2(diff0, diff1, diff, 8);
148*fb1b10abSAndroid Build Coastguard Worker     ILVRL_B2_UB(src1, pred1, src_l0, src_l1);
149*fb1b10abSAndroid Build Coastguard Worker     HSUB_UB2_SH(src_l0, src_l1, diff0, diff1);
150*fb1b10abSAndroid Build Coastguard Worker     ST_SH2(diff0, diff1, diff + 16, 8);
151*fb1b10abSAndroid Build Coastguard Worker     diff += diff_stride;
152*fb1b10abSAndroid Build Coastguard Worker 
153*fb1b10abSAndroid Build Coastguard Worker     ILVRL_B2_UB(src2, pred2, src_l0, src_l1);
154*fb1b10abSAndroid Build Coastguard Worker     HSUB_UB2_SH(src_l0, src_l1, diff0, diff1);
155*fb1b10abSAndroid Build Coastguard Worker     ST_SH2(diff0, diff1, diff, 8);
156*fb1b10abSAndroid Build Coastguard Worker     ILVRL_B2_UB(src3, pred3, src_l0, src_l1);
157*fb1b10abSAndroid Build Coastguard Worker     HSUB_UB2_SH(src_l0, src_l1, diff0, diff1);
158*fb1b10abSAndroid Build Coastguard Worker     ST_SH2(diff0, diff1, diff + 16, 8);
159*fb1b10abSAndroid Build Coastguard Worker     diff += diff_stride;
160*fb1b10abSAndroid Build Coastguard Worker 
161*fb1b10abSAndroid Build Coastguard Worker     ILVRL_B2_UB(src4, pred4, src_l0, src_l1);
162*fb1b10abSAndroid Build Coastguard Worker     HSUB_UB2_SH(src_l0, src_l1, diff0, diff1);
163*fb1b10abSAndroid Build Coastguard Worker     ST_SH2(diff0, diff1, diff, 8);
164*fb1b10abSAndroid Build Coastguard Worker     ILVRL_B2_UB(src5, pred5, src_l0, src_l1);
165*fb1b10abSAndroid Build Coastguard Worker     HSUB_UB2_SH(src_l0, src_l1, diff0, diff1);
166*fb1b10abSAndroid Build Coastguard Worker     ST_SH2(diff0, diff1, diff + 16, 8);
167*fb1b10abSAndroid Build Coastguard Worker     diff += diff_stride;
168*fb1b10abSAndroid Build Coastguard Worker 
169*fb1b10abSAndroid Build Coastguard Worker     ILVRL_B2_UB(src6, pred6, src_l0, src_l1);
170*fb1b10abSAndroid Build Coastguard Worker     HSUB_UB2_SH(src_l0, src_l1, diff0, diff1);
171*fb1b10abSAndroid Build Coastguard Worker     ST_SH2(diff0, diff1, diff, 8);
172*fb1b10abSAndroid Build Coastguard Worker     ILVRL_B2_UB(src7, pred7, src_l0, src_l1);
173*fb1b10abSAndroid Build Coastguard Worker     HSUB_UB2_SH(src_l0, src_l1, diff0, diff1);
174*fb1b10abSAndroid Build Coastguard Worker     ST_SH2(diff0, diff1, diff + 16, 8);
175*fb1b10abSAndroid Build Coastguard Worker     diff += diff_stride;
176*fb1b10abSAndroid Build Coastguard Worker   }
177*fb1b10abSAndroid Build Coastguard Worker }
178*fb1b10abSAndroid Build Coastguard Worker 
sub_blk_64x64_msa(const uint8_t * src,int32_t src_stride,const uint8_t * pred,int32_t pred_stride,int16_t * diff,int32_t diff_stride)179*fb1b10abSAndroid Build Coastguard Worker static void sub_blk_64x64_msa(const uint8_t *src, int32_t src_stride,
180*fb1b10abSAndroid Build Coastguard Worker                               const uint8_t *pred, int32_t pred_stride,
181*fb1b10abSAndroid Build Coastguard Worker                               int16_t *diff, int32_t diff_stride) {
182*fb1b10abSAndroid Build Coastguard Worker   uint32_t loop_cnt;
183*fb1b10abSAndroid Build Coastguard Worker   v16i8 src0, src1, src2, src3, src4, src5, src6, src7;
184*fb1b10abSAndroid Build Coastguard Worker   v16i8 pred0, pred1, pred2, pred3, pred4, pred5, pred6, pred7;
185*fb1b10abSAndroid Build Coastguard Worker   v16u8 src_l0, src_l1;
186*fb1b10abSAndroid Build Coastguard Worker   v8i16 diff0, diff1;
187*fb1b10abSAndroid Build Coastguard Worker 
188*fb1b10abSAndroid Build Coastguard Worker   for (loop_cnt = 32; loop_cnt--;) {
189*fb1b10abSAndroid Build Coastguard Worker     LD_SB4(src, 16, src0, src1, src2, src3);
190*fb1b10abSAndroid Build Coastguard Worker     src += src_stride;
191*fb1b10abSAndroid Build Coastguard Worker     LD_SB4(src, 16, src4, src5, src6, src7);
192*fb1b10abSAndroid Build Coastguard Worker     src += src_stride;
193*fb1b10abSAndroid Build Coastguard Worker 
194*fb1b10abSAndroid Build Coastguard Worker     LD_SB4(pred, 16, pred0, pred1, pred2, pred3);
195*fb1b10abSAndroid Build Coastguard Worker     pred += pred_stride;
196*fb1b10abSAndroid Build Coastguard Worker     LD_SB4(pred, 16, pred4, pred5, pred6, pred7);
197*fb1b10abSAndroid Build Coastguard Worker     pred += pred_stride;
198*fb1b10abSAndroid Build Coastguard Worker 
199*fb1b10abSAndroid Build Coastguard Worker     ILVRL_B2_UB(src0, pred0, src_l0, src_l1);
200*fb1b10abSAndroid Build Coastguard Worker     HSUB_UB2_SH(src_l0, src_l1, diff0, diff1);
201*fb1b10abSAndroid Build Coastguard Worker     ST_SH2(diff0, diff1, diff, 8);
202*fb1b10abSAndroid Build Coastguard Worker     ILVRL_B2_UB(src1, pred1, src_l0, src_l1);
203*fb1b10abSAndroid Build Coastguard Worker     HSUB_UB2_SH(src_l0, src_l1, diff0, diff1);
204*fb1b10abSAndroid Build Coastguard Worker     ST_SH2(diff0, diff1, diff + 16, 8);
205*fb1b10abSAndroid Build Coastguard Worker     ILVRL_B2_UB(src2, pred2, src_l0, src_l1);
206*fb1b10abSAndroid Build Coastguard Worker     HSUB_UB2_SH(src_l0, src_l1, diff0, diff1);
207*fb1b10abSAndroid Build Coastguard Worker     ST_SH2(diff0, diff1, diff + 32, 8);
208*fb1b10abSAndroid Build Coastguard Worker     ILVRL_B2_UB(src3, pred3, src_l0, src_l1);
209*fb1b10abSAndroid Build Coastguard Worker     HSUB_UB2_SH(src_l0, src_l1, diff0, diff1);
210*fb1b10abSAndroid Build Coastguard Worker     ST_SH2(diff0, diff1, diff + 48, 8);
211*fb1b10abSAndroid Build Coastguard Worker     diff += diff_stride;
212*fb1b10abSAndroid Build Coastguard Worker 
213*fb1b10abSAndroid Build Coastguard Worker     ILVRL_B2_UB(src4, pred4, src_l0, src_l1);
214*fb1b10abSAndroid Build Coastguard Worker     HSUB_UB2_SH(src_l0, src_l1, diff0, diff1);
215*fb1b10abSAndroid Build Coastguard Worker     ST_SH2(diff0, diff1, diff, 8);
216*fb1b10abSAndroid Build Coastguard Worker     ILVRL_B2_UB(src5, pred5, src_l0, src_l1);
217*fb1b10abSAndroid Build Coastguard Worker     HSUB_UB2_SH(src_l0, src_l1, diff0, diff1);
218*fb1b10abSAndroid Build Coastguard Worker     ST_SH2(diff0, diff1, diff + 16, 8);
219*fb1b10abSAndroid Build Coastguard Worker     ILVRL_B2_UB(src6, pred6, src_l0, src_l1);
220*fb1b10abSAndroid Build Coastguard Worker     HSUB_UB2_SH(src_l0, src_l1, diff0, diff1);
221*fb1b10abSAndroid Build Coastguard Worker     ST_SH2(diff0, diff1, diff + 32, 8);
222*fb1b10abSAndroid Build Coastguard Worker     ILVRL_B2_UB(src7, pred7, src_l0, src_l1);
223*fb1b10abSAndroid Build Coastguard Worker     HSUB_UB2_SH(src_l0, src_l1, diff0, diff1);
224*fb1b10abSAndroid Build Coastguard Worker     ST_SH2(diff0, diff1, diff + 48, 8);
225*fb1b10abSAndroid Build Coastguard Worker     diff += diff_stride;
226*fb1b10abSAndroid Build Coastguard Worker   }
227*fb1b10abSAndroid Build Coastguard Worker }
228*fb1b10abSAndroid Build Coastguard Worker 
vpx_subtract_block_msa(int32_t rows,int32_t cols,int16_t * diff_ptr,ptrdiff_t diff_stride,const uint8_t * src_ptr,ptrdiff_t src_stride,const uint8_t * pred_ptr,ptrdiff_t pred_stride)229*fb1b10abSAndroid Build Coastguard Worker void vpx_subtract_block_msa(int32_t rows, int32_t cols, int16_t *diff_ptr,
230*fb1b10abSAndroid Build Coastguard Worker                             ptrdiff_t diff_stride, const uint8_t *src_ptr,
231*fb1b10abSAndroid Build Coastguard Worker                             ptrdiff_t src_stride, const uint8_t *pred_ptr,
232*fb1b10abSAndroid Build Coastguard Worker                             ptrdiff_t pred_stride) {
233*fb1b10abSAndroid Build Coastguard Worker   if (rows == cols) {
234*fb1b10abSAndroid Build Coastguard Worker     switch (rows) {
235*fb1b10abSAndroid Build Coastguard Worker       case 4:
236*fb1b10abSAndroid Build Coastguard Worker         sub_blk_4x4_msa(src_ptr, src_stride, pred_ptr, pred_stride, diff_ptr,
237*fb1b10abSAndroid Build Coastguard Worker                         diff_stride);
238*fb1b10abSAndroid Build Coastguard Worker         break;
239*fb1b10abSAndroid Build Coastguard Worker       case 8:
240*fb1b10abSAndroid Build Coastguard Worker         sub_blk_8x8_msa(src_ptr, src_stride, pred_ptr, pred_stride, diff_ptr,
241*fb1b10abSAndroid Build Coastguard Worker                         diff_stride);
242*fb1b10abSAndroid Build Coastguard Worker         break;
243*fb1b10abSAndroid Build Coastguard Worker       case 16:
244*fb1b10abSAndroid Build Coastguard Worker         sub_blk_16x16_msa(src_ptr, src_stride, pred_ptr, pred_stride, diff_ptr,
245*fb1b10abSAndroid Build Coastguard Worker                           diff_stride);
246*fb1b10abSAndroid Build Coastguard Worker         break;
247*fb1b10abSAndroid Build Coastguard Worker       case 32:
248*fb1b10abSAndroid Build Coastguard Worker         sub_blk_32x32_msa(src_ptr, src_stride, pred_ptr, pred_stride, diff_ptr,
249*fb1b10abSAndroid Build Coastguard Worker                           diff_stride);
250*fb1b10abSAndroid Build Coastguard Worker         break;
251*fb1b10abSAndroid Build Coastguard Worker       case 64:
252*fb1b10abSAndroid Build Coastguard Worker         sub_blk_64x64_msa(src_ptr, src_stride, pred_ptr, pred_stride, diff_ptr,
253*fb1b10abSAndroid Build Coastguard Worker                           diff_stride);
254*fb1b10abSAndroid Build Coastguard Worker         break;
255*fb1b10abSAndroid Build Coastguard Worker       default:
256*fb1b10abSAndroid Build Coastguard Worker         vpx_subtract_block_c(rows, cols, diff_ptr, diff_stride, src_ptr,
257*fb1b10abSAndroid Build Coastguard Worker                              src_stride, pred_ptr, pred_stride);
258*fb1b10abSAndroid Build Coastguard Worker         break;
259*fb1b10abSAndroid Build Coastguard Worker     }
260*fb1b10abSAndroid Build Coastguard Worker   } else {
261*fb1b10abSAndroid Build Coastguard Worker     vpx_subtract_block_c(rows, cols, diff_ptr, diff_stride, src_ptr, src_stride,
262*fb1b10abSAndroid Build Coastguard Worker                          pred_ptr, pred_stride);
263*fb1b10abSAndroid Build Coastguard Worker   }
264*fb1b10abSAndroid Build Coastguard Worker }
265