xref: /aosp_15_r20/external/libvpx/vpx_dsp/mips/sad_mmi.c (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker  *  Copyright (c) 2017 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_ports/asmdefs_mmi.h"
13*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_integer.h"
14*fb1b10abSAndroid Build Coastguard Worker #include "vpx_ports/mem.h"
15*fb1b10abSAndroid Build Coastguard Worker 
16*fb1b10abSAndroid Build Coastguard Worker #define SAD_SRC_REF_ABS_SUB_64                                      \
17*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp1],   0x07(%[src])                        \n\t" \
18*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp1],   0x00(%[src])                        \n\t" \
19*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp2],   0x0f(%[src])                        \n\t" \
20*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp2],   0x08(%[src])                        \n\t" \
21*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp3],   0x07(%[ref])                        \n\t" \
22*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp3],   0x00(%[ref])                        \n\t" \
23*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp4],   0x0f(%[ref])                        \n\t" \
24*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp4],   0x08(%[ref])                        \n\t" \
25*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp1],   %[ftmp1],       %[ftmp3]            \n\t" \
26*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp2],   %[ftmp2],       %[ftmp4]            \n\t" \
27*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp1],   %[ftmp1]                            \n\t" \
28*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp2],   %[ftmp2]                            \n\t" \
29*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp5],   %[ftmp5],       %[ftmp1]            \n\t" \
30*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp5],   %[ftmp5],       %[ftmp2]            \n\t" \
31*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp1],   0x17(%[src])                        \n\t" \
32*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp1],   0x10(%[src])                        \n\t" \
33*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp2],   0x1f(%[src])                        \n\t" \
34*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp2],   0x18(%[src])                        \n\t" \
35*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp3],   0x17(%[ref])                        \n\t" \
36*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp3],   0x10(%[ref])                        \n\t" \
37*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp4],   0x1f(%[ref])                        \n\t" \
38*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp4],   0x18(%[ref])                        \n\t" \
39*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp1],   %[ftmp1],       %[ftmp3]            \n\t" \
40*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp2],   %[ftmp2],       %[ftmp4]            \n\t" \
41*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp1],   %[ftmp1]                            \n\t" \
42*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp2],   %[ftmp2]                            \n\t" \
43*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp5],   %[ftmp5],       %[ftmp1]            \n\t" \
44*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp5],   %[ftmp5],       %[ftmp2]            \n\t" \
45*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp1],   0x27(%[src])                        \n\t" \
46*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp1],   0x20(%[src])                        \n\t" \
47*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp2],   0x2f(%[src])                        \n\t" \
48*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp2],   0x28(%[src])                        \n\t" \
49*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp3],   0x27(%[ref])                        \n\t" \
50*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp3],   0x20(%[ref])                        \n\t" \
51*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp4],   0x2f(%[ref])                        \n\t" \
52*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp4],   0x28(%[ref])                        \n\t" \
53*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp1],   %[ftmp1],       %[ftmp3]            \n\t" \
54*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp2],   %[ftmp2],       %[ftmp4]            \n\t" \
55*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp1],   %[ftmp1]                            \n\t" \
56*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp2],   %[ftmp2]                            \n\t" \
57*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp5],   %[ftmp5],       %[ftmp1]            \n\t" \
58*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp5],   %[ftmp5],       %[ftmp2]            \n\t" \
59*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp1],   0x37(%[src])                        \n\t" \
60*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp1],   0x30(%[src])                        \n\t" \
61*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp2],   0x3f(%[src])                        \n\t" \
62*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp2],   0x38(%[src])                        \n\t" \
63*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp3],   0x37(%[ref])                        \n\t" \
64*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp3],   0x30(%[ref])                        \n\t" \
65*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp4],   0x3f(%[ref])                        \n\t" \
66*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp4],   0x38(%[ref])                        \n\t" \
67*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp1],   %[ftmp1],       %[ftmp3]            \n\t" \
68*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp2],   %[ftmp2],       %[ftmp4]            \n\t" \
69*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp1],   %[ftmp1]                            \n\t" \
70*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp2],   %[ftmp2]                            \n\t" \
71*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp5],   %[ftmp5],       %[ftmp1]            \n\t" \
72*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp5],   %[ftmp5],       %[ftmp2]            \n\t"
73*fb1b10abSAndroid Build Coastguard Worker 
74*fb1b10abSAndroid Build Coastguard Worker #define SAD_SRC_REF_ABS_SUB_32                                      \
75*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp1],   0x07(%[src])                        \n\t" \
76*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp1],   0x00(%[src])                        \n\t" \
77*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp2],   0x0f(%[src])                        \n\t" \
78*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp2],   0x08(%[src])                        \n\t" \
79*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp3],   0x07(%[ref])                        \n\t" \
80*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp3],   0x00(%[ref])                        \n\t" \
81*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp4],   0x0f(%[ref])                        \n\t" \
82*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp4],   0x08(%[ref])                        \n\t" \
83*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp1],   %[ftmp1],       %[ftmp3]            \n\t" \
84*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp2],   %[ftmp2],       %[ftmp4]            \n\t" \
85*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp1],   %[ftmp1]                            \n\t" \
86*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp2],   %[ftmp2]                            \n\t" \
87*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp5],   %[ftmp5],       %[ftmp1]            \n\t" \
88*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp5],   %[ftmp5],       %[ftmp2]            \n\t" \
89*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp1],   0x17(%[src])                        \n\t" \
90*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp1],   0x10(%[src])                        \n\t" \
91*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp2],   0x1f(%[src])                        \n\t" \
92*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp2],   0x18(%[src])                        \n\t" \
93*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp3],   0x17(%[ref])                        \n\t" \
94*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp3],   0x10(%[ref])                        \n\t" \
95*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp4],   0x1f(%[ref])                        \n\t" \
96*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp4],   0x18(%[ref])                        \n\t" \
97*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp1],   %[ftmp1],       %[ftmp3]            \n\t" \
98*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp2],   %[ftmp2],       %[ftmp4]            \n\t" \
99*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp1],   %[ftmp1]                            \n\t" \
100*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp2],   %[ftmp2]                            \n\t" \
101*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp5],   %[ftmp5],       %[ftmp1]            \n\t" \
102*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp5],   %[ftmp5],       %[ftmp2]            \n\t"
103*fb1b10abSAndroid Build Coastguard Worker 
104*fb1b10abSAndroid Build Coastguard Worker #define SAD_SRC_REF_ABS_SUB_16                                      \
105*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp1],   0x07(%[src])                        \n\t" \
106*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp1],   0x00(%[src])                        \n\t" \
107*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp2],   0x0f(%[src])                        \n\t" \
108*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp2],   0x08(%[src])                        \n\t" \
109*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp3],   0x07(%[ref])                        \n\t" \
110*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp3],   0x00(%[ref])                        \n\t" \
111*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp4],   0x0f(%[ref])                        \n\t" \
112*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp4],   0x08(%[ref])                        \n\t" \
113*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp1],   %[ftmp1],       %[ftmp3]            \n\t" \
114*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp2],   %[ftmp2],       %[ftmp4]            \n\t" \
115*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp1],   %[ftmp1]                            \n\t" \
116*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp2],   %[ftmp2]                            \n\t" \
117*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp5],   %[ftmp5],       %[ftmp1]            \n\t" \
118*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp5],   %[ftmp5],       %[ftmp2]            \n\t"
119*fb1b10abSAndroid Build Coastguard Worker 
120*fb1b10abSAndroid Build Coastguard Worker #define SAD_SRC_REF_ABS_SUB_8                                       \
121*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp1],   0x07(%[src])                        \n\t" \
122*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp1],   0x00(%[src])                        \n\t" \
123*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp2],   0x07(%[ref])                        \n\t" \
124*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp2],   0x00(%[ref])                        \n\t" \
125*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp1],   %[ftmp1],       %[ftmp2]            \n\t" \
126*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp1],   %[ftmp1]                            \n\t" \
127*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp3],   %[ftmp3],       %[ftmp1]            \n\t"
128*fb1b10abSAndroid Build Coastguard Worker 
129*fb1b10abSAndroid Build Coastguard Worker #if _MIPS_SIM == _ABIO32
130*fb1b10abSAndroid Build Coastguard Worker #define SAD_SRC_REF_ABS_SUB_4                                       \
131*fb1b10abSAndroid Build Coastguard Worker   "ulw        %[tmp0],    0x00(%[src])                        \n\t" \
132*fb1b10abSAndroid Build Coastguard Worker   "mtc1       %[tmp0],    %[ftmp1]                            \n\t" \
133*fb1b10abSAndroid Build Coastguard Worker   "ulw        %[tmp0],    0x00(%[ref])                        \n\t" \
134*fb1b10abSAndroid Build Coastguard Worker   "mtc1       %[tmp0],    %[ftmp2]                            \n\t" \
135*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp1],   %[ftmp1],       %[ftmp2]            \n\t" \
136*fb1b10abSAndroid Build Coastguard Worker   "mthc1      $0,         %[ftmp1]                            \n\t" \
137*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp1],   %[ftmp1]                            \n\t" \
138*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp3],   %[ftmp3],       %[ftmp1]            \n\t"
139*fb1b10abSAndroid Build Coastguard Worker #else /* _MIPS_SIM == _ABI64 || _MIPS_SIM == _ABIN32 */
140*fb1b10abSAndroid Build Coastguard Worker #define SAD_SRC_REF_ABS_SUB_4                                       \
141*fb1b10abSAndroid Build Coastguard Worker   "gslwlc1    %[ftmp1],   0x03(%[src])                        \n\t" \
142*fb1b10abSAndroid Build Coastguard Worker   "gslwrc1    %[ftmp1],   0x00(%[src])                        \n\t" \
143*fb1b10abSAndroid Build Coastguard Worker   "gslwlc1    %[ftmp2],   0x03(%[ref])                        \n\t" \
144*fb1b10abSAndroid Build Coastguard Worker   "gslwrc1    %[ftmp2],   0x00(%[ref])                        \n\t" \
145*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp1],   %[ftmp1],       %[ftmp2]            \n\t" \
146*fb1b10abSAndroid Build Coastguard Worker   "mthc1      $0,         %[ftmp1]                            \n\t" \
147*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp1],   %[ftmp1]                            \n\t" \
148*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp3],   %[ftmp3],       %[ftmp1]            \n\t"
149*fb1b10abSAndroid Build Coastguard Worker #endif /* _MIPS_SIM == _ABIO32 */
150*fb1b10abSAndroid Build Coastguard Worker 
151*fb1b10abSAndroid Build Coastguard Worker #define SAD_SRC_AVGREF_ABS_SUB_64                                   \
152*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp1],   0x07(%[second_pred])                \n\t" \
153*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp1],   0x00(%[second_pred])                \n\t" \
154*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp2],   0x0f(%[second_pred])                \n\t" \
155*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp2],   0x08(%[second_pred])                \n\t" \
156*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp3],   0x07(%[ref])                        \n\t" \
157*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp3],   0x00(%[ref])                        \n\t" \
158*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp4],   0x0f(%[ref])                        \n\t" \
159*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp4],   0x08(%[ref])                        \n\t" \
160*fb1b10abSAndroid Build Coastguard Worker   "pavgb      %[ftmp3],   %[ftmp1],       %[ftmp3]            \n\t" \
161*fb1b10abSAndroid Build Coastguard Worker   "pavgb      %[ftmp4],   %[ftmp2],       %[ftmp4]            \n\t" \
162*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp1],   0x07(%[src])                        \n\t" \
163*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp1],   0x00(%[src])                        \n\t" \
164*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp2],   0x0f(%[src])                        \n\t" \
165*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp2],   0x08(%[src])                        \n\t" \
166*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp1],   %[ftmp1],       %[ftmp3]            \n\t" \
167*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp2],   %[ftmp2],       %[ftmp4]            \n\t" \
168*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp1],   %[ftmp1]                            \n\t" \
169*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp2],   %[ftmp2]                            \n\t" \
170*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp5],   %[ftmp5],       %[ftmp1]            \n\t" \
171*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp5],   %[ftmp5],       %[ftmp2]            \n\t" \
172*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp1],   0x17(%[second_pred])                \n\t" \
173*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp1],   0x10(%[second_pred])                \n\t" \
174*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp2],   0x1f(%[second_pred])                \n\t" \
175*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp2],   0x18(%[second_pred])                \n\t" \
176*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp3],   0x17(%[ref])                        \n\t" \
177*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp3],   0x10(%[ref])                        \n\t" \
178*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp4],   0x1f(%[ref])                        \n\t" \
179*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp4],   0x18(%[ref])                        \n\t" \
180*fb1b10abSAndroid Build Coastguard Worker   "pavgb      %[ftmp3],   %[ftmp1],       %[ftmp3]            \n\t" \
181*fb1b10abSAndroid Build Coastguard Worker   "pavgb      %[ftmp4],   %[ftmp2],       %[ftmp4]            \n\t" \
182*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp1],   0x17(%[src])                        \n\t" \
183*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp1],   0x10(%[src])                        \n\t" \
184*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp2],   0x1f(%[src])                        \n\t" \
185*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp2],   0x18(%[src])                        \n\t" \
186*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp1],   %[ftmp1],       %[ftmp3]            \n\t" \
187*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp2],   %[ftmp2],       %[ftmp4]            \n\t" \
188*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp1],   %[ftmp1]                            \n\t" \
189*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp2],   %[ftmp2]                            \n\t" \
190*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp5],   %[ftmp5],       %[ftmp1]            \n\t" \
191*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp5],   %[ftmp5],       %[ftmp2]            \n\t" \
192*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp1],   0x27(%[second_pred])                \n\t" \
193*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp1],   0x20(%[second_pred])                \n\t" \
194*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp2],   0x2f(%[second_pred])                \n\t" \
195*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp2],   0x28(%[second_pred])                \n\t" \
196*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp3],   0x27(%[ref])                        \n\t" \
197*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp3],   0x20(%[ref])                        \n\t" \
198*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp4],   0x2f(%[ref])                        \n\t" \
199*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp4],   0x28(%[ref])                        \n\t" \
200*fb1b10abSAndroid Build Coastguard Worker   "pavgb      %[ftmp3],   %[ftmp1],       %[ftmp3]            \n\t" \
201*fb1b10abSAndroid Build Coastguard Worker   "pavgb      %[ftmp4],   %[ftmp2],       %[ftmp4]            \n\t" \
202*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp1],   0x27(%[src])                        \n\t" \
203*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp1],   0x20(%[src])                        \n\t" \
204*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp2],   0x2f(%[src])                        \n\t" \
205*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp2],   0x28(%[src])                        \n\t" \
206*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp1],   %[ftmp1],       %[ftmp3]            \n\t" \
207*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp2],   %[ftmp2],       %[ftmp4]            \n\t" \
208*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp1],   %[ftmp1]                            \n\t" \
209*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp2],   %[ftmp2]                            \n\t" \
210*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp5],   %[ftmp5],       %[ftmp1]            \n\t" \
211*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp5],   %[ftmp5],       %[ftmp2]            \n\t" \
212*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp1],   0x37(%[second_pred])                \n\t" \
213*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp1],   0x30(%[second_pred])                \n\t" \
214*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp2],   0x3f(%[second_pred])                \n\t" \
215*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp2],   0x38(%[second_pred])                \n\t" \
216*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp3],   0x37(%[ref])                        \n\t" \
217*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp3],   0x30(%[ref])                        \n\t" \
218*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp4],   0x3f(%[ref])                        \n\t" \
219*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp4],   0x38(%[ref])                        \n\t" \
220*fb1b10abSAndroid Build Coastguard Worker   "pavgb      %[ftmp3],   %[ftmp1],       %[ftmp3]            \n\t" \
221*fb1b10abSAndroid Build Coastguard Worker   "pavgb      %[ftmp4],   %[ftmp2],       %[ftmp4]            \n\t" \
222*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp1],   0x37(%[src])                        \n\t" \
223*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp1],   0x30(%[src])                        \n\t" \
224*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp2],   0x3f(%[src])                        \n\t" \
225*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp2],   0x38(%[src])                        \n\t" \
226*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp1],   %[ftmp1],       %[ftmp3]            \n\t" \
227*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp2],   %[ftmp2],       %[ftmp4]            \n\t" \
228*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp1],   %[ftmp1]                            \n\t" \
229*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp2],   %[ftmp2]                            \n\t" \
230*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp5],   %[ftmp5],       %[ftmp1]            \n\t" \
231*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp5],   %[ftmp5],       %[ftmp2]            \n\t"
232*fb1b10abSAndroid Build Coastguard Worker 
233*fb1b10abSAndroid Build Coastguard Worker #define SAD_SRC_AVGREF_ABS_SUB_32                                   \
234*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp1],   0x07(%[second_pred])                \n\t" \
235*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp1],   0x00(%[second_pred])                \n\t" \
236*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp2],   0x0f(%[second_pred])                \n\t" \
237*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp2],   0x08(%[second_pred])                \n\t" \
238*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp3],   0x07(%[ref])                        \n\t" \
239*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp3],   0x00(%[ref])                        \n\t" \
240*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp4],   0x0f(%[ref])                        \n\t" \
241*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp4],   0x08(%[ref])                        \n\t" \
242*fb1b10abSAndroid Build Coastguard Worker   "pavgb      %[ftmp3],   %[ftmp1],       %[ftmp3]            \n\t" \
243*fb1b10abSAndroid Build Coastguard Worker   "pavgb      %[ftmp4],   %[ftmp2],       %[ftmp4]            \n\t" \
244*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp1],   0x07(%[src])                        \n\t" \
245*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp1],   0x00(%[src])                        \n\t" \
246*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp2],   0x0f(%[src])                        \n\t" \
247*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp2],   0x08(%[src])                        \n\t" \
248*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp1],   %[ftmp1],       %[ftmp3]            \n\t" \
249*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp2],   %[ftmp2],       %[ftmp4]            \n\t" \
250*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp1],   %[ftmp1]                            \n\t" \
251*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp2],   %[ftmp2]                            \n\t" \
252*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp5],   %[ftmp5],       %[ftmp1]            \n\t" \
253*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp5],   %[ftmp5],       %[ftmp2]            \n\t" \
254*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp1],   0x17(%[second_pred])                \n\t" \
255*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp1],   0x10(%[second_pred])                \n\t" \
256*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp2],   0x1f(%[second_pred])                \n\t" \
257*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp2],   0x18(%[second_pred])                \n\t" \
258*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp3],   0x17(%[ref])                        \n\t" \
259*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp3],   0x10(%[ref])                        \n\t" \
260*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp4],   0x1f(%[ref])                        \n\t" \
261*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp4],   0x18(%[ref])                        \n\t" \
262*fb1b10abSAndroid Build Coastguard Worker   "pavgb      %[ftmp3],   %[ftmp1],       %[ftmp3]            \n\t" \
263*fb1b10abSAndroid Build Coastguard Worker   "pavgb      %[ftmp4],   %[ftmp2],       %[ftmp4]            \n\t" \
264*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp1],   0x17(%[src])                        \n\t" \
265*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp1],   0x10(%[src])                        \n\t" \
266*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp2],   0x1f(%[src])                        \n\t" \
267*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp2],   0x18(%[src])                        \n\t" \
268*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp1],   %[ftmp1],       %[ftmp3]            \n\t" \
269*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp2],   %[ftmp2],       %[ftmp4]            \n\t" \
270*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp1],   %[ftmp1]                            \n\t" \
271*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp2],   %[ftmp2]                            \n\t" \
272*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp5],   %[ftmp5],       %[ftmp1]            \n\t" \
273*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp5],   %[ftmp5],       %[ftmp2]            \n\t"
274*fb1b10abSAndroid Build Coastguard Worker 
275*fb1b10abSAndroid Build Coastguard Worker #define SAD_SRC_AVGREF_ABS_SUB_16                                   \
276*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp1],   0x07(%[second_pred])                \n\t" \
277*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp1],   0x00(%[second_pred])                \n\t" \
278*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp2],   0x0f(%[second_pred])                \n\t" \
279*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp2],   0x08(%[second_pred])                \n\t" \
280*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp3],   0x07(%[ref])                        \n\t" \
281*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp3],   0x00(%[ref])                        \n\t" \
282*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp4],   0x0f(%[ref])                        \n\t" \
283*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp4],   0x08(%[ref])                        \n\t" \
284*fb1b10abSAndroid Build Coastguard Worker   "pavgb      %[ftmp3],   %[ftmp1],       %[ftmp3]            \n\t" \
285*fb1b10abSAndroid Build Coastguard Worker   "pavgb      %[ftmp4],   %[ftmp2],       %[ftmp4]            \n\t" \
286*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp1],   0x07(%[src])                        \n\t" \
287*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp1],   0x00(%[src])                        \n\t" \
288*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp2],   0x0f(%[src])                        \n\t" \
289*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp2],   0x08(%[src])                        \n\t" \
290*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp1],   %[ftmp1],       %[ftmp3]            \n\t" \
291*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp2],   %[ftmp2],       %[ftmp4]            \n\t" \
292*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp1],   %[ftmp1]                            \n\t" \
293*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp2],   %[ftmp2]                            \n\t" \
294*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp5],   %[ftmp5],       %[ftmp1]            \n\t" \
295*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp5],   %[ftmp5],       %[ftmp2]            \n\t"
296*fb1b10abSAndroid Build Coastguard Worker 
297*fb1b10abSAndroid Build Coastguard Worker #define SAD_SRC_AVGREF_ABS_SUB_8                                    \
298*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp1],   0x07(%[second_pred])                \n\t" \
299*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp1],   0x00(%[second_pred])                \n\t" \
300*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp2],   0x07(%[ref])                        \n\t" \
301*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp2],   0x00(%[ref])                        \n\t" \
302*fb1b10abSAndroid Build Coastguard Worker   "pavgb      %[ftmp2],   %[ftmp1],       %[ftmp2]            \n\t" \
303*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp1],   0x07(%[src])                        \n\t" \
304*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp1],   0x00(%[src])                        \n\t" \
305*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp1],   %[ftmp1],       %[ftmp2]            \n\t" \
306*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp1],   %[ftmp1]                            \n\t" \
307*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp3],   %[ftmp3],       %[ftmp1]            \n\t"
308*fb1b10abSAndroid Build Coastguard Worker 
309*fb1b10abSAndroid Build Coastguard Worker #if _MIPS_SIM == _ABIO32
310*fb1b10abSAndroid Build Coastguard Worker #define SAD_SRC_AVGREF_ABS_SUB_4                                    \
311*fb1b10abSAndroid Build Coastguard Worker   "ulw        %[tmp0],    0x00(%[second_pred])                \n\t" \
312*fb1b10abSAndroid Build Coastguard Worker   "mtc1       %[tmp0],    %[ftmp1]                            \n\t" \
313*fb1b10abSAndroid Build Coastguard Worker   "ulw        %[tmp0],    0x00(%[ref])                        \n\t" \
314*fb1b10abSAndroid Build Coastguard Worker   "mtc1       %[tmp0],    %[ftmp2]                            \n\t" \
315*fb1b10abSAndroid Build Coastguard Worker   "pavgb      %[ftmp2],   %[ftmp1],       %[ftmp2]            \n\t" \
316*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp1],   0x07(%[src])                        \n\t" \
317*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp1],   0x00(%[src])                        \n\t" \
318*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp1],   %[ftmp1],       %[ftmp2]            \n\t" \
319*fb1b10abSAndroid Build Coastguard Worker   "mthc1      $0,         %[ftmp1]                            \n\t" \
320*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp1],   %[ftmp1]                            \n\t" \
321*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp3],   %[ftmp3],       %[ftmp1]            \n\t"
322*fb1b10abSAndroid Build Coastguard Worker #else /* _MIPS_SIM == _ABI64 || _MIPS_SIM == _ABIN32 */
323*fb1b10abSAndroid Build Coastguard Worker #define SAD_SRC_AVGREF_ABS_SUB_4                                    \
324*fb1b10abSAndroid Build Coastguard Worker   "gslwlc1    %[ftmp1],   0x03(%[second_pred])                \n\t" \
325*fb1b10abSAndroid Build Coastguard Worker   "gslwrc1    %[ftmp1],   0x00(%[second_pred])                \n\t" \
326*fb1b10abSAndroid Build Coastguard Worker   "gslwlc1    %[ftmp2],   0x03(%[ref])                        \n\t" \
327*fb1b10abSAndroid Build Coastguard Worker   "gslwrc1    %[ftmp2],   0x00(%[ref])                        \n\t" \
328*fb1b10abSAndroid Build Coastguard Worker   "pavgb      %[ftmp2],   %[ftmp1],       %[ftmp2]            \n\t" \
329*fb1b10abSAndroid Build Coastguard Worker   "gsldlc1    %[ftmp1],   0x07(%[src])                        \n\t" \
330*fb1b10abSAndroid Build Coastguard Worker   "gsldrc1    %[ftmp1],   0x00(%[src])                        \n\t" \
331*fb1b10abSAndroid Build Coastguard Worker   "pasubub    %[ftmp1],   %[ftmp1],       %[ftmp2]            \n\t" \
332*fb1b10abSAndroid Build Coastguard Worker   "mthc1      $0,         %[ftmp1]                            \n\t" \
333*fb1b10abSAndroid Build Coastguard Worker   "biadd      %[ftmp1],   %[ftmp1]                            \n\t" \
334*fb1b10abSAndroid Build Coastguard Worker   "paddw      %[ftmp3],   %[ftmp3],       %[ftmp1]            \n\t"
335*fb1b10abSAndroid Build Coastguard Worker #endif /* _MIPS_SIM == _ABIO32 */
336*fb1b10abSAndroid Build Coastguard Worker 
337*fb1b10abSAndroid Build Coastguard Worker #define sadMxNx4D_mmi(m, n)                                                  \
338*fb1b10abSAndroid Build Coastguard Worker   void vpx_sad##m##x##n##x4d_mmi(const uint8_t *src, int src_stride,         \
339*fb1b10abSAndroid Build Coastguard Worker                                  const uint8_t *const ref_array[],           \
340*fb1b10abSAndroid Build Coastguard Worker                                  int ref_stride, uint32_t *sad_array) {      \
341*fb1b10abSAndroid Build Coastguard Worker     int i;                                                                   \
342*fb1b10abSAndroid Build Coastguard Worker     for (i = 0; i < 4; ++i)                                                  \
343*fb1b10abSAndroid Build Coastguard Worker       sad_array[i] =                                                         \
344*fb1b10abSAndroid Build Coastguard Worker           vpx_sad##m##x##n##_mmi(src, src_stride, ref_array[i], ref_stride); \
345*fb1b10abSAndroid Build Coastguard Worker   }
346*fb1b10abSAndroid Build Coastguard Worker 
vpx_sad64x(const uint8_t * src,int src_stride,const uint8_t * ref,int ref_stride,int counter)347*fb1b10abSAndroid Build Coastguard Worker static inline unsigned int vpx_sad64x(const uint8_t *src, int src_stride,
348*fb1b10abSAndroid Build Coastguard Worker                                       const uint8_t *ref, int ref_stride,
349*fb1b10abSAndroid Build Coastguard Worker                                       int counter) {
350*fb1b10abSAndroid Build Coastguard Worker   unsigned int sad;
351*fb1b10abSAndroid Build Coastguard Worker   double ftmp1, ftmp2, ftmp3, ftmp4, ftmp5;
352*fb1b10abSAndroid Build Coastguard Worker   mips_reg l_counter = counter;
353*fb1b10abSAndroid Build Coastguard Worker 
354*fb1b10abSAndroid Build Coastguard Worker   /* clang-format off */
355*fb1b10abSAndroid Build Coastguard Worker   __asm__ volatile (
356*fb1b10abSAndroid Build Coastguard Worker     "pxor       %[ftmp5],   %[ftmp5],       %[ftmp5]            \n\t"
357*fb1b10abSAndroid Build Coastguard Worker     "1:                                                         \n\t"
358*fb1b10abSAndroid Build Coastguard Worker     // Include two loop body, to reduce loop time.
359*fb1b10abSAndroid Build Coastguard Worker     SAD_SRC_REF_ABS_SUB_64
360*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[src],     %[src],         %[src_stride])
361*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[ref],     %[ref],         %[ref_stride])
362*fb1b10abSAndroid Build Coastguard Worker     SAD_SRC_REF_ABS_SUB_64
363*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[src],     %[src],         %[src_stride])
364*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[ref],     %[ref],         %[ref_stride])
365*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDIU(%[counter], %[counter], -0x02)
366*fb1b10abSAndroid Build Coastguard Worker     "bnez       %[counter], 1b                                  \n\t"
367*fb1b10abSAndroid Build Coastguard Worker     "mfc1       %[sad],     %[ftmp5]                            \n\t"
368*fb1b10abSAndroid Build Coastguard Worker     : [ftmp1]"=&f"(ftmp1), [ftmp2]"=&f"(ftmp2), [ftmp3]"=&f"(ftmp3),
369*fb1b10abSAndroid Build Coastguard Worker       [ftmp4]"=&f"(ftmp4), [ftmp5]"=&f"(ftmp5), [counter]"+&r"(l_counter),
370*fb1b10abSAndroid Build Coastguard Worker       [src]"+&r"(src), [ref]"+&r"(ref), [sad]"=&r"(sad)
371*fb1b10abSAndroid Build Coastguard Worker     : [src_stride]"r"((mips_reg)src_stride),
372*fb1b10abSAndroid Build Coastguard Worker       [ref_stride]"r"((mips_reg)ref_stride)
373*fb1b10abSAndroid Build Coastguard Worker   );
374*fb1b10abSAndroid Build Coastguard Worker   /* clang-format on */
375*fb1b10abSAndroid Build Coastguard Worker 
376*fb1b10abSAndroid Build Coastguard Worker   return sad;
377*fb1b10abSAndroid Build Coastguard Worker }
378*fb1b10abSAndroid Build Coastguard Worker 
379*fb1b10abSAndroid Build Coastguard Worker #define vpx_sad64xN(H)                                                   \
380*fb1b10abSAndroid Build Coastguard Worker   unsigned int vpx_sad64x##H##_mmi(const uint8_t *src, int src_stride,   \
381*fb1b10abSAndroid Build Coastguard Worker                                    const uint8_t *ref, int ref_stride) { \
382*fb1b10abSAndroid Build Coastguard Worker     return vpx_sad64x(src, src_stride, ref, ref_stride, H);              \
383*fb1b10abSAndroid Build Coastguard Worker   }
384*fb1b10abSAndroid Build Coastguard Worker 
385*fb1b10abSAndroid Build Coastguard Worker vpx_sad64xN(64);
386*fb1b10abSAndroid Build Coastguard Worker vpx_sad64xN(32);
387*fb1b10abSAndroid Build Coastguard Worker sadMxNx4D_mmi(64, 64);
388*fb1b10abSAndroid Build Coastguard Worker sadMxNx4D_mmi(64, 32);
389*fb1b10abSAndroid Build Coastguard Worker 
vpx_sad_avg64x(const uint8_t * src,int src_stride,const uint8_t * ref,int ref_stride,const uint8_t * second_pred,int counter)390*fb1b10abSAndroid Build Coastguard Worker static inline unsigned int vpx_sad_avg64x(const uint8_t *src, int src_stride,
391*fb1b10abSAndroid Build Coastguard Worker                                           const uint8_t *ref, int ref_stride,
392*fb1b10abSAndroid Build Coastguard Worker                                           const uint8_t *second_pred,
393*fb1b10abSAndroid Build Coastguard Worker                                           int counter) {
394*fb1b10abSAndroid Build Coastguard Worker   unsigned int sad;
395*fb1b10abSAndroid Build Coastguard Worker   double ftmp1, ftmp2, ftmp3, ftmp4, ftmp5;
396*fb1b10abSAndroid Build Coastguard Worker   mips_reg l_counter = counter;
397*fb1b10abSAndroid Build Coastguard Worker   mips_reg l_second_pred = (mips_reg)second_pred;
398*fb1b10abSAndroid Build Coastguard Worker 
399*fb1b10abSAndroid Build Coastguard Worker   /* clang-format off */
400*fb1b10abSAndroid Build Coastguard Worker   __asm__ volatile (
401*fb1b10abSAndroid Build Coastguard Worker     "pxor       %[ftmp5],   %[ftmp5],       %[ftmp5]            \n\t"
402*fb1b10abSAndroid Build Coastguard Worker     "1:                                                         \n\t"
403*fb1b10abSAndroid Build Coastguard Worker     // Include two loop body, to reduce loop time.
404*fb1b10abSAndroid Build Coastguard Worker     SAD_SRC_AVGREF_ABS_SUB_64
405*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDIU(%[second_pred], %[second_pred], 0x40)
406*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[src],     %[src],         %[src_stride])
407*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[ref],     %[ref],         %[ref_stride])
408*fb1b10abSAndroid Build Coastguard Worker     SAD_SRC_AVGREF_ABS_SUB_64
409*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDIU(%[second_pred], %[second_pred], 0x40)
410*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[src],     %[src],         %[src_stride])
411*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[ref],     %[ref],         %[ref_stride])
412*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDIU(%[counter], %[counter], -0x02)
413*fb1b10abSAndroid Build Coastguard Worker     "bnez       %[counter], 1b                                  \n\t"
414*fb1b10abSAndroid Build Coastguard Worker     "mfc1       %[sad],     %[ftmp5]                            \n\t"
415*fb1b10abSAndroid Build Coastguard Worker     : [ftmp1]"=&f"(ftmp1), [ftmp2]"=&f"(ftmp2), [ftmp3]"=&f"(ftmp3),
416*fb1b10abSAndroid Build Coastguard Worker       [ftmp4]"=&f"(ftmp4), [ftmp5]"=&f"(ftmp5), [counter]"+&r"(l_counter),
417*fb1b10abSAndroid Build Coastguard Worker       [src]"+&r"(src), [ref]"+&r"(ref),
418*fb1b10abSAndroid Build Coastguard Worker       [second_pred]"+&r"(l_second_pred),
419*fb1b10abSAndroid Build Coastguard Worker       [sad]"=&r"(sad)
420*fb1b10abSAndroid Build Coastguard Worker     : [src_stride]"r"((mips_reg)src_stride),
421*fb1b10abSAndroid Build Coastguard Worker       [ref_stride]"r"((mips_reg)ref_stride)
422*fb1b10abSAndroid Build Coastguard Worker   );
423*fb1b10abSAndroid Build Coastguard Worker   /* clang-format on */
424*fb1b10abSAndroid Build Coastguard Worker 
425*fb1b10abSAndroid Build Coastguard Worker   return sad;
426*fb1b10abSAndroid Build Coastguard Worker }
427*fb1b10abSAndroid Build Coastguard Worker 
428*fb1b10abSAndroid Build Coastguard Worker #define vpx_sad_avg64xN(H)                                                   \
429*fb1b10abSAndroid Build Coastguard Worker   unsigned int vpx_sad64x##H##_avg_mmi(const uint8_t *src, int src_stride,   \
430*fb1b10abSAndroid Build Coastguard Worker                                        const uint8_t *ref, int ref_stride,   \
431*fb1b10abSAndroid Build Coastguard Worker                                        const uint8_t *second_pred) {         \
432*fb1b10abSAndroid Build Coastguard Worker     return vpx_sad_avg64x(src, src_stride, ref, ref_stride, second_pred, H); \
433*fb1b10abSAndroid Build Coastguard Worker   }
434*fb1b10abSAndroid Build Coastguard Worker 
435*fb1b10abSAndroid Build Coastguard Worker vpx_sad_avg64xN(64);
436*fb1b10abSAndroid Build Coastguard Worker vpx_sad_avg64xN(32);
437*fb1b10abSAndroid Build Coastguard Worker 
vpx_sad32x(const uint8_t * src,int src_stride,const uint8_t * ref,int ref_stride,int counter)438*fb1b10abSAndroid Build Coastguard Worker static inline unsigned int vpx_sad32x(const uint8_t *src, int src_stride,
439*fb1b10abSAndroid Build Coastguard Worker                                       const uint8_t *ref, int ref_stride,
440*fb1b10abSAndroid Build Coastguard Worker                                       int counter) {
441*fb1b10abSAndroid Build Coastguard Worker   unsigned int sad;
442*fb1b10abSAndroid Build Coastguard Worker   double ftmp1, ftmp2, ftmp3, ftmp4, ftmp5;
443*fb1b10abSAndroid Build Coastguard Worker   mips_reg l_counter = counter;
444*fb1b10abSAndroid Build Coastguard Worker 
445*fb1b10abSAndroid Build Coastguard Worker   /* clang-format off */
446*fb1b10abSAndroid Build Coastguard Worker   __asm__ volatile (
447*fb1b10abSAndroid Build Coastguard Worker     "pxor       %[ftmp5],   %[ftmp5],       %[ftmp5]            \n\t"
448*fb1b10abSAndroid Build Coastguard Worker     "1:                                                         \n\t"
449*fb1b10abSAndroid Build Coastguard Worker     // Include two loop body, to reduce loop time.
450*fb1b10abSAndroid Build Coastguard Worker     SAD_SRC_REF_ABS_SUB_32
451*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[src],     %[src],         %[src_stride])
452*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[ref],     %[ref],         %[ref_stride])
453*fb1b10abSAndroid Build Coastguard Worker     SAD_SRC_REF_ABS_SUB_32
454*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[src],     %[src],         %[src_stride])
455*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[ref],     %[ref],         %[ref_stride])
456*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDIU(%[counter], %[counter], -0x02)
457*fb1b10abSAndroid Build Coastguard Worker     "bnez       %[counter], 1b                                  \n\t"
458*fb1b10abSAndroid Build Coastguard Worker     "mfc1       %[sad],     %[ftmp5]                            \n\t"
459*fb1b10abSAndroid Build Coastguard Worker     : [ftmp1]"=&f"(ftmp1), [ftmp2]"=&f"(ftmp2), [ftmp3]"=&f"(ftmp3),
460*fb1b10abSAndroid Build Coastguard Worker       [ftmp4]"=&f"(ftmp4), [ftmp5]"=&f"(ftmp5), [counter]"+&r"(l_counter),
461*fb1b10abSAndroid Build Coastguard Worker       [src]"+&r"(src), [ref]"+&r"(ref), [sad]"=&r"(sad)
462*fb1b10abSAndroid Build Coastguard Worker     : [src_stride]"r"((mips_reg)src_stride),
463*fb1b10abSAndroid Build Coastguard Worker       [ref_stride]"r"((mips_reg)ref_stride)
464*fb1b10abSAndroid Build Coastguard Worker   );
465*fb1b10abSAndroid Build Coastguard Worker   /* clang-format on */
466*fb1b10abSAndroid Build Coastguard Worker 
467*fb1b10abSAndroid Build Coastguard Worker   return sad;
468*fb1b10abSAndroid Build Coastguard Worker }
469*fb1b10abSAndroid Build Coastguard Worker 
470*fb1b10abSAndroid Build Coastguard Worker #define vpx_sad32xN(H)                                                   \
471*fb1b10abSAndroid Build Coastguard Worker   unsigned int vpx_sad32x##H##_mmi(const uint8_t *src, int src_stride,   \
472*fb1b10abSAndroid Build Coastguard Worker                                    const uint8_t *ref, int ref_stride) { \
473*fb1b10abSAndroid Build Coastguard Worker     return vpx_sad32x(src, src_stride, ref, ref_stride, H);              \
474*fb1b10abSAndroid Build Coastguard Worker   }
475*fb1b10abSAndroid Build Coastguard Worker 
476*fb1b10abSAndroid Build Coastguard Worker vpx_sad32xN(64);
477*fb1b10abSAndroid Build Coastguard Worker vpx_sad32xN(32);
478*fb1b10abSAndroid Build Coastguard Worker vpx_sad32xN(16);
479*fb1b10abSAndroid Build Coastguard Worker sadMxNx4D_mmi(32, 64);
480*fb1b10abSAndroid Build Coastguard Worker sadMxNx4D_mmi(32, 32);
481*fb1b10abSAndroid Build Coastguard Worker sadMxNx4D_mmi(32, 16);
482*fb1b10abSAndroid Build Coastguard Worker 
vpx_sad_avg32x(const uint8_t * src,int src_stride,const uint8_t * ref,int ref_stride,const uint8_t * second_pred,int counter)483*fb1b10abSAndroid Build Coastguard Worker static inline unsigned int vpx_sad_avg32x(const uint8_t *src, int src_stride,
484*fb1b10abSAndroid Build Coastguard Worker                                           const uint8_t *ref, int ref_stride,
485*fb1b10abSAndroid Build Coastguard Worker                                           const uint8_t *second_pred,
486*fb1b10abSAndroid Build Coastguard Worker                                           int counter) {
487*fb1b10abSAndroid Build Coastguard Worker   unsigned int sad;
488*fb1b10abSAndroid Build Coastguard Worker   double ftmp1, ftmp2, ftmp3, ftmp4, ftmp5;
489*fb1b10abSAndroid Build Coastguard Worker   mips_reg l_counter = counter;
490*fb1b10abSAndroid Build Coastguard Worker   mips_reg l_second_pred = (mips_reg)second_pred;
491*fb1b10abSAndroid Build Coastguard Worker 
492*fb1b10abSAndroid Build Coastguard Worker   /* clang-format off */
493*fb1b10abSAndroid Build Coastguard Worker   __asm__ volatile (
494*fb1b10abSAndroid Build Coastguard Worker     "pxor       %[ftmp5],   %[ftmp5],       %[ftmp5]            \n\t"
495*fb1b10abSAndroid Build Coastguard Worker     "1:                                                         \n\t"
496*fb1b10abSAndroid Build Coastguard Worker     // Include two loop body, to reduce loop time.
497*fb1b10abSAndroid Build Coastguard Worker     SAD_SRC_AVGREF_ABS_SUB_32
498*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDIU(%[second_pred], %[second_pred], 0x20)
499*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[src],     %[src],         %[src_stride])
500*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[ref],     %[ref],         %[ref_stride])
501*fb1b10abSAndroid Build Coastguard Worker     SAD_SRC_AVGREF_ABS_SUB_32
502*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDIU(%[second_pred], %[second_pred], 0x20)
503*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[src],     %[src],         %[src_stride])
504*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[ref],     %[ref],         %[ref_stride])
505*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDIU(%[counter], %[counter], -0x02)
506*fb1b10abSAndroid Build Coastguard Worker     "bnez       %[counter], 1b                                  \n\t"
507*fb1b10abSAndroid Build Coastguard Worker     "mfc1       %[sad],     %[ftmp5]                            \n\t"
508*fb1b10abSAndroid Build Coastguard Worker     : [ftmp1]"=&f"(ftmp1), [ftmp2]"=&f"(ftmp2), [ftmp3]"=&f"(ftmp3),
509*fb1b10abSAndroid Build Coastguard Worker       [ftmp4]"=&f"(ftmp4), [ftmp5]"=&f"(ftmp5), [counter]"+&r"(l_counter),
510*fb1b10abSAndroid Build Coastguard Worker       [src]"+&r"(src), [ref]"+&r"(ref),
511*fb1b10abSAndroid Build Coastguard Worker       [second_pred]"+&r"(l_second_pred),
512*fb1b10abSAndroid Build Coastguard Worker       [sad]"=&r"(sad)
513*fb1b10abSAndroid Build Coastguard Worker     : [src_stride]"r"((mips_reg)src_stride),
514*fb1b10abSAndroid Build Coastguard Worker       [ref_stride]"r"((mips_reg)ref_stride)
515*fb1b10abSAndroid Build Coastguard Worker   );
516*fb1b10abSAndroid Build Coastguard Worker   /* clang-format on */
517*fb1b10abSAndroid Build Coastguard Worker 
518*fb1b10abSAndroid Build Coastguard Worker   return sad;
519*fb1b10abSAndroid Build Coastguard Worker }
520*fb1b10abSAndroid Build Coastguard Worker 
521*fb1b10abSAndroid Build Coastguard Worker #define vpx_sad_avg32xN(H)                                                   \
522*fb1b10abSAndroid Build Coastguard Worker   unsigned int vpx_sad32x##H##_avg_mmi(const uint8_t *src, int src_stride,   \
523*fb1b10abSAndroid Build Coastguard Worker                                        const uint8_t *ref, int ref_stride,   \
524*fb1b10abSAndroid Build Coastguard Worker                                        const uint8_t *second_pred) {         \
525*fb1b10abSAndroid Build Coastguard Worker     return vpx_sad_avg32x(src, src_stride, ref, ref_stride, second_pred, H); \
526*fb1b10abSAndroid Build Coastguard Worker   }
527*fb1b10abSAndroid Build Coastguard Worker 
528*fb1b10abSAndroid Build Coastguard Worker vpx_sad_avg32xN(64);
529*fb1b10abSAndroid Build Coastguard Worker vpx_sad_avg32xN(32);
530*fb1b10abSAndroid Build Coastguard Worker vpx_sad_avg32xN(16);
531*fb1b10abSAndroid Build Coastguard Worker 
vpx_sad16x(const uint8_t * src,int src_stride,const uint8_t * ref,int ref_stride,int counter)532*fb1b10abSAndroid Build Coastguard Worker static inline unsigned int vpx_sad16x(const uint8_t *src, int src_stride,
533*fb1b10abSAndroid Build Coastguard Worker                                       const uint8_t *ref, int ref_stride,
534*fb1b10abSAndroid Build Coastguard Worker                                       int counter) {
535*fb1b10abSAndroid Build Coastguard Worker   unsigned int sad;
536*fb1b10abSAndroid Build Coastguard Worker   double ftmp1, ftmp2, ftmp3, ftmp4, ftmp5;
537*fb1b10abSAndroid Build Coastguard Worker   mips_reg l_counter = counter;
538*fb1b10abSAndroid Build Coastguard Worker 
539*fb1b10abSAndroid Build Coastguard Worker   /* clang-format off */
540*fb1b10abSAndroid Build Coastguard Worker   __asm__ volatile (
541*fb1b10abSAndroid Build Coastguard Worker     "pxor       %[ftmp5],   %[ftmp5],       %[ftmp5]            \n\t"
542*fb1b10abSAndroid Build Coastguard Worker     "1:                                                         \n\t"
543*fb1b10abSAndroid Build Coastguard Worker     // Include two loop body, to reduce loop time.
544*fb1b10abSAndroid Build Coastguard Worker     SAD_SRC_REF_ABS_SUB_16
545*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[src],     %[src],         %[src_stride])
546*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[ref],     %[ref],         %[ref_stride])
547*fb1b10abSAndroid Build Coastguard Worker     SAD_SRC_REF_ABS_SUB_16
548*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[src],     %[src],         %[src_stride])
549*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[ref],     %[ref],         %[ref_stride])
550*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDIU(%[counter], %[counter], -0x02)
551*fb1b10abSAndroid Build Coastguard Worker     "bnez       %[counter], 1b                                  \n\t"
552*fb1b10abSAndroid Build Coastguard Worker     "mfc1       %[sad],     %[ftmp5]                            \n\t"
553*fb1b10abSAndroid Build Coastguard Worker     : [ftmp1]"=&f"(ftmp1), [ftmp2]"=&f"(ftmp2), [ftmp3]"=&f"(ftmp3),
554*fb1b10abSAndroid Build Coastguard Worker       [ftmp4]"=&f"(ftmp4), [ftmp5]"=&f"(ftmp5), [counter]"+&r"(l_counter),
555*fb1b10abSAndroid Build Coastguard Worker       [src]"+&r"(src), [ref]"+&r"(ref), [sad]"=&r"(sad)
556*fb1b10abSAndroid Build Coastguard Worker     : [src_stride]"r"((mips_reg)src_stride),
557*fb1b10abSAndroid Build Coastguard Worker       [ref_stride]"r"((mips_reg)ref_stride)
558*fb1b10abSAndroid Build Coastguard Worker   );
559*fb1b10abSAndroid Build Coastguard Worker   /* clang-format on */
560*fb1b10abSAndroid Build Coastguard Worker 
561*fb1b10abSAndroid Build Coastguard Worker   return sad;
562*fb1b10abSAndroid Build Coastguard Worker }
563*fb1b10abSAndroid Build Coastguard Worker 
564*fb1b10abSAndroid Build Coastguard Worker #define vpx_sad16xN(H)                                                   \
565*fb1b10abSAndroid Build Coastguard Worker   unsigned int vpx_sad16x##H##_mmi(const uint8_t *src, int src_stride,   \
566*fb1b10abSAndroid Build Coastguard Worker                                    const uint8_t *ref, int ref_stride) { \
567*fb1b10abSAndroid Build Coastguard Worker     return vpx_sad16x(src, src_stride, ref, ref_stride, H);              \
568*fb1b10abSAndroid Build Coastguard Worker   }
569*fb1b10abSAndroid Build Coastguard Worker 
570*fb1b10abSAndroid Build Coastguard Worker vpx_sad16xN(32);
571*fb1b10abSAndroid Build Coastguard Worker vpx_sad16xN(16);
572*fb1b10abSAndroid Build Coastguard Worker vpx_sad16xN(8);
573*fb1b10abSAndroid Build Coastguard Worker sadMxNx4D_mmi(16, 32);
574*fb1b10abSAndroid Build Coastguard Worker sadMxNx4D_mmi(16, 16);
575*fb1b10abSAndroid Build Coastguard Worker sadMxNx4D_mmi(16, 8);
576*fb1b10abSAndroid Build Coastguard Worker 
vpx_sad_avg16x(const uint8_t * src,int src_stride,const uint8_t * ref,int ref_stride,const uint8_t * second_pred,int counter)577*fb1b10abSAndroid Build Coastguard Worker static inline unsigned int vpx_sad_avg16x(const uint8_t *src, int src_stride,
578*fb1b10abSAndroid Build Coastguard Worker                                           const uint8_t *ref, int ref_stride,
579*fb1b10abSAndroid Build Coastguard Worker                                           const uint8_t *second_pred,
580*fb1b10abSAndroid Build Coastguard Worker                                           int counter) {
581*fb1b10abSAndroid Build Coastguard Worker   unsigned int sad;
582*fb1b10abSAndroid Build Coastguard Worker   double ftmp1, ftmp2, ftmp3, ftmp4, ftmp5;
583*fb1b10abSAndroid Build Coastguard Worker   mips_reg l_counter = counter;
584*fb1b10abSAndroid Build Coastguard Worker   mips_reg l_second_pred = (mips_reg)second_pred;
585*fb1b10abSAndroid Build Coastguard Worker 
586*fb1b10abSAndroid Build Coastguard Worker   /* clang-format off */
587*fb1b10abSAndroid Build Coastguard Worker   __asm__ volatile (
588*fb1b10abSAndroid Build Coastguard Worker     "pxor       %[ftmp5],   %[ftmp5],       %[ftmp5]            \n\t"
589*fb1b10abSAndroid Build Coastguard Worker     "1:                                                         \n\t"
590*fb1b10abSAndroid Build Coastguard Worker     // Include two loop body, to reduce loop time.
591*fb1b10abSAndroid Build Coastguard Worker     SAD_SRC_AVGREF_ABS_SUB_16
592*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDIU(%[second_pred], %[second_pred], 0x10)
593*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[src],     %[src],         %[src_stride])
594*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[ref],     %[ref],         %[ref_stride])
595*fb1b10abSAndroid Build Coastguard Worker     SAD_SRC_AVGREF_ABS_SUB_16
596*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDIU(%[second_pred], %[second_pred], 0x10)
597*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[src],     %[src],         %[src_stride])
598*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[ref],     %[ref],         %[ref_stride])
599*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDIU(%[counter], %[counter], -0x02)
600*fb1b10abSAndroid Build Coastguard Worker     "bnez       %[counter], 1b                                  \n\t"
601*fb1b10abSAndroid Build Coastguard Worker     "mfc1       %[sad],     %[ftmp5]                            \n\t"
602*fb1b10abSAndroid Build Coastguard Worker     : [ftmp1]"=&f"(ftmp1), [ftmp2]"=&f"(ftmp2), [ftmp3]"=&f"(ftmp3),
603*fb1b10abSAndroid Build Coastguard Worker       [ftmp4]"=&f"(ftmp4), [ftmp5]"=&f"(ftmp5), [counter]"+&r"(l_counter),
604*fb1b10abSAndroid Build Coastguard Worker       [src]"+&r"(src), [ref]"+&r"(ref),
605*fb1b10abSAndroid Build Coastguard Worker       [second_pred]"+&r"(l_second_pred),
606*fb1b10abSAndroid Build Coastguard Worker       [sad]"=&r"(sad)
607*fb1b10abSAndroid Build Coastguard Worker     : [src_stride]"r"((mips_reg)src_stride),
608*fb1b10abSAndroid Build Coastguard Worker       [ref_stride]"r"((mips_reg)ref_stride)
609*fb1b10abSAndroid Build Coastguard Worker   );
610*fb1b10abSAndroid Build Coastguard Worker   /* clang-format on */
611*fb1b10abSAndroid Build Coastguard Worker 
612*fb1b10abSAndroid Build Coastguard Worker   return sad;
613*fb1b10abSAndroid Build Coastguard Worker }
614*fb1b10abSAndroid Build Coastguard Worker 
615*fb1b10abSAndroid Build Coastguard Worker #define vpx_sad_avg16xN(H)                                                   \
616*fb1b10abSAndroid Build Coastguard Worker   unsigned int vpx_sad16x##H##_avg_mmi(const uint8_t *src, int src_stride,   \
617*fb1b10abSAndroid Build Coastguard Worker                                        const uint8_t *ref, int ref_stride,   \
618*fb1b10abSAndroid Build Coastguard Worker                                        const uint8_t *second_pred) {         \
619*fb1b10abSAndroid Build Coastguard Worker     return vpx_sad_avg16x(src, src_stride, ref, ref_stride, second_pred, H); \
620*fb1b10abSAndroid Build Coastguard Worker   }
621*fb1b10abSAndroid Build Coastguard Worker 
622*fb1b10abSAndroid Build Coastguard Worker vpx_sad_avg16xN(32);
623*fb1b10abSAndroid Build Coastguard Worker vpx_sad_avg16xN(16);
624*fb1b10abSAndroid Build Coastguard Worker vpx_sad_avg16xN(8);
625*fb1b10abSAndroid Build Coastguard Worker 
vpx_sad8x(const uint8_t * src,int src_stride,const uint8_t * ref,int ref_stride,int counter)626*fb1b10abSAndroid Build Coastguard Worker static inline unsigned int vpx_sad8x(const uint8_t *src, int src_stride,
627*fb1b10abSAndroid Build Coastguard Worker                                      const uint8_t *ref, int ref_stride,
628*fb1b10abSAndroid Build Coastguard Worker                                      int counter) {
629*fb1b10abSAndroid Build Coastguard Worker   unsigned int sad;
630*fb1b10abSAndroid Build Coastguard Worker   double ftmp1, ftmp2, ftmp3;
631*fb1b10abSAndroid Build Coastguard Worker   mips_reg l_counter = counter;
632*fb1b10abSAndroid Build Coastguard Worker 
633*fb1b10abSAndroid Build Coastguard Worker   /* clang-format off */
634*fb1b10abSAndroid Build Coastguard Worker   __asm__ volatile (
635*fb1b10abSAndroid Build Coastguard Worker     "pxor       %[ftmp3],   %[ftmp3],       %[ftmp3]            \n\t"
636*fb1b10abSAndroid Build Coastguard Worker     "1:                                                         \n\t"
637*fb1b10abSAndroid Build Coastguard Worker     // Include two loop body, to reduce loop time.
638*fb1b10abSAndroid Build Coastguard Worker     SAD_SRC_REF_ABS_SUB_8
639*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[src],     %[src],         %[src_stride])
640*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[ref],     %[ref],         %[ref_stride])
641*fb1b10abSAndroid Build Coastguard Worker     SAD_SRC_REF_ABS_SUB_8
642*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[src],     %[src],         %[src_stride])
643*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[ref],     %[ref],         %[ref_stride])
644*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDIU(%[counter], %[counter], -0x02)
645*fb1b10abSAndroid Build Coastguard Worker     "bnez       %[counter], 1b                                  \n\t"
646*fb1b10abSAndroid Build Coastguard Worker     "mfc1       %[sad],     %[ftmp3]                            \n\t"
647*fb1b10abSAndroid Build Coastguard Worker     : [ftmp1]"=&f"(ftmp1), [ftmp2]"=&f"(ftmp2), [ftmp3]"=&f"(ftmp3),
648*fb1b10abSAndroid Build Coastguard Worker       [counter]"+&r"(l_counter), [src]"+&r"(src), [ref]"+&r"(ref),
649*fb1b10abSAndroid Build Coastguard Worker       [sad]"=&r"(sad)
650*fb1b10abSAndroid Build Coastguard Worker     : [src_stride]"r"((mips_reg)src_stride),
651*fb1b10abSAndroid Build Coastguard Worker       [ref_stride]"r"((mips_reg)ref_stride)
652*fb1b10abSAndroid Build Coastguard Worker   );
653*fb1b10abSAndroid Build Coastguard Worker   /* clang-format on */
654*fb1b10abSAndroid Build Coastguard Worker 
655*fb1b10abSAndroid Build Coastguard Worker   return sad;
656*fb1b10abSAndroid Build Coastguard Worker }
657*fb1b10abSAndroid Build Coastguard Worker 
658*fb1b10abSAndroid Build Coastguard Worker #define vpx_sad8xN(H)                                                   \
659*fb1b10abSAndroid Build Coastguard Worker   unsigned int vpx_sad8x##H##_mmi(const uint8_t *src, int src_stride,   \
660*fb1b10abSAndroid Build Coastguard Worker                                   const uint8_t *ref, int ref_stride) { \
661*fb1b10abSAndroid Build Coastguard Worker     return vpx_sad8x(src, src_stride, ref, ref_stride, H);              \
662*fb1b10abSAndroid Build Coastguard Worker   }
663*fb1b10abSAndroid Build Coastguard Worker 
664*fb1b10abSAndroid Build Coastguard Worker vpx_sad8xN(16);
665*fb1b10abSAndroid Build Coastguard Worker vpx_sad8xN(8);
666*fb1b10abSAndroid Build Coastguard Worker vpx_sad8xN(4);
667*fb1b10abSAndroid Build Coastguard Worker sadMxNx4D_mmi(8, 16);
668*fb1b10abSAndroid Build Coastguard Worker sadMxNx4D_mmi(8, 8);
669*fb1b10abSAndroid Build Coastguard Worker sadMxNx4D_mmi(8, 4);
670*fb1b10abSAndroid Build Coastguard Worker 
vpx_sad_avg8x(const uint8_t * src,int src_stride,const uint8_t * ref,int ref_stride,const uint8_t * second_pred,int counter)671*fb1b10abSAndroid Build Coastguard Worker static inline unsigned int vpx_sad_avg8x(const uint8_t *src, int src_stride,
672*fb1b10abSAndroid Build Coastguard Worker                                          const uint8_t *ref, int ref_stride,
673*fb1b10abSAndroid Build Coastguard Worker                                          const uint8_t *second_pred,
674*fb1b10abSAndroid Build Coastguard Worker                                          int counter) {
675*fb1b10abSAndroid Build Coastguard Worker   unsigned int sad;
676*fb1b10abSAndroid Build Coastguard Worker   double ftmp1, ftmp2, ftmp3;
677*fb1b10abSAndroid Build Coastguard Worker   mips_reg l_counter = counter;
678*fb1b10abSAndroid Build Coastguard Worker   mips_reg l_second_pred = (mips_reg)second_pred;
679*fb1b10abSAndroid Build Coastguard Worker 
680*fb1b10abSAndroid Build Coastguard Worker   /* clang-format off */
681*fb1b10abSAndroid Build Coastguard Worker   __asm__ volatile (
682*fb1b10abSAndroid Build Coastguard Worker     "pxor       %[ftmp3],   %[ftmp3],       %[ftmp3]            \n\t"
683*fb1b10abSAndroid Build Coastguard Worker     "1:                                                         \n\t"
684*fb1b10abSAndroid Build Coastguard Worker     // Include two loop body, to reduce loop time.
685*fb1b10abSAndroid Build Coastguard Worker     SAD_SRC_AVGREF_ABS_SUB_8
686*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDIU(%[second_pred], %[second_pred], 0x08)
687*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[src],     %[src],         %[src_stride])
688*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[ref],     %[ref],         %[ref_stride])
689*fb1b10abSAndroid Build Coastguard Worker     SAD_SRC_AVGREF_ABS_SUB_8
690*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDIU(%[second_pred], %[second_pred], 0x08)
691*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[src],     %[src],         %[src_stride])
692*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[ref],     %[ref],         %[ref_stride])
693*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDIU(%[counter], %[counter], -0x02)
694*fb1b10abSAndroid Build Coastguard Worker     "bnez       %[counter], 1b                                  \n\t"
695*fb1b10abSAndroid Build Coastguard Worker     "mfc1       %[sad],     %[ftmp3]                            \n\t"
696*fb1b10abSAndroid Build Coastguard Worker     : [ftmp1]"=&f"(ftmp1), [ftmp2]"=&f"(ftmp2), [ftmp3]"=&f"(ftmp3),
697*fb1b10abSAndroid Build Coastguard Worker       [counter]"+&r"(l_counter), [src]"+&r"(src), [ref]"+&r"(ref),
698*fb1b10abSAndroid Build Coastguard Worker       [second_pred]"+&r"(l_second_pred),
699*fb1b10abSAndroid Build Coastguard Worker       [sad]"=&r"(sad)
700*fb1b10abSAndroid Build Coastguard Worker     : [src_stride]"r"((mips_reg)src_stride),
701*fb1b10abSAndroid Build Coastguard Worker       [ref_stride]"r"((mips_reg)ref_stride)
702*fb1b10abSAndroid Build Coastguard Worker   );
703*fb1b10abSAndroid Build Coastguard Worker   /* clang-format on */
704*fb1b10abSAndroid Build Coastguard Worker 
705*fb1b10abSAndroid Build Coastguard Worker   return sad;
706*fb1b10abSAndroid Build Coastguard Worker }
707*fb1b10abSAndroid Build Coastguard Worker 
708*fb1b10abSAndroid Build Coastguard Worker #define vpx_sad_avg8xN(H)                                                   \
709*fb1b10abSAndroid Build Coastguard Worker   unsigned int vpx_sad8x##H##_avg_mmi(const uint8_t *src, int src_stride,   \
710*fb1b10abSAndroid Build Coastguard Worker                                       const uint8_t *ref, int ref_stride,   \
711*fb1b10abSAndroid Build Coastguard Worker                                       const uint8_t *second_pred) {         \
712*fb1b10abSAndroid Build Coastguard Worker     return vpx_sad_avg8x(src, src_stride, ref, ref_stride, second_pred, H); \
713*fb1b10abSAndroid Build Coastguard Worker   }
714*fb1b10abSAndroid Build Coastguard Worker 
715*fb1b10abSAndroid Build Coastguard Worker vpx_sad_avg8xN(16);
716*fb1b10abSAndroid Build Coastguard Worker vpx_sad_avg8xN(8);
717*fb1b10abSAndroid Build Coastguard Worker vpx_sad_avg8xN(4);
718*fb1b10abSAndroid Build Coastguard Worker 
vpx_sad4x(const uint8_t * src,int src_stride,const uint8_t * ref,int ref_stride,int counter)719*fb1b10abSAndroid Build Coastguard Worker static inline unsigned int vpx_sad4x(const uint8_t *src, int src_stride,
720*fb1b10abSAndroid Build Coastguard Worker                                      const uint8_t *ref, int ref_stride,
721*fb1b10abSAndroid Build Coastguard Worker                                      int counter) {
722*fb1b10abSAndroid Build Coastguard Worker   unsigned int sad;
723*fb1b10abSAndroid Build Coastguard Worker   double ftmp1, ftmp2, ftmp3;
724*fb1b10abSAndroid Build Coastguard Worker   mips_reg l_counter = counter;
725*fb1b10abSAndroid Build Coastguard Worker 
726*fb1b10abSAndroid Build Coastguard Worker   /* clang-format off */
727*fb1b10abSAndroid Build Coastguard Worker   __asm__ volatile (
728*fb1b10abSAndroid Build Coastguard Worker     "pxor       %[ftmp3],   %[ftmp3],       %[ftmp3]            \n\t"
729*fb1b10abSAndroid Build Coastguard Worker     "1:                                                         \n\t"
730*fb1b10abSAndroid Build Coastguard Worker     // Include two loop body, to reduce loop time.
731*fb1b10abSAndroid Build Coastguard Worker     SAD_SRC_REF_ABS_SUB_4
732*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[src],     %[src],         %[src_stride])
733*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[ref],     %[ref],         %[ref_stride])
734*fb1b10abSAndroid Build Coastguard Worker     SAD_SRC_REF_ABS_SUB_4
735*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[src],     %[src],         %[src_stride])
736*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[ref],     %[ref],         %[ref_stride])
737*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDIU(%[counter], %[counter], -0x02)
738*fb1b10abSAndroid Build Coastguard Worker     "bnez       %[counter], 1b                                  \n\t"
739*fb1b10abSAndroid Build Coastguard Worker     "mfc1       %[sad],     %[ftmp3]                            \n\t"
740*fb1b10abSAndroid Build Coastguard Worker     : [ftmp1]"=&f"(ftmp1), [ftmp2]"=&f"(ftmp2), [ftmp3]"=&f"(ftmp3),
741*fb1b10abSAndroid Build Coastguard Worker       [counter]"+&r"(l_counter), [src]"+&r"(src), [ref]"+&r"(ref),
742*fb1b10abSAndroid Build Coastguard Worker       [sad]"=&r"(sad)
743*fb1b10abSAndroid Build Coastguard Worker     : [src_stride]"r"((mips_reg)src_stride),
744*fb1b10abSAndroid Build Coastguard Worker       [ref_stride]"r"((mips_reg)ref_stride)
745*fb1b10abSAndroid Build Coastguard Worker   );
746*fb1b10abSAndroid Build Coastguard Worker   /* clang-format on */
747*fb1b10abSAndroid Build Coastguard Worker 
748*fb1b10abSAndroid Build Coastguard Worker   return sad;
749*fb1b10abSAndroid Build Coastguard Worker }
750*fb1b10abSAndroid Build Coastguard Worker 
751*fb1b10abSAndroid Build Coastguard Worker #define vpx_sad4xN(H)                                                   \
752*fb1b10abSAndroid Build Coastguard Worker   unsigned int vpx_sad4x##H##_mmi(const uint8_t *src, int src_stride,   \
753*fb1b10abSAndroid Build Coastguard Worker                                   const uint8_t *ref, int ref_stride) { \
754*fb1b10abSAndroid Build Coastguard Worker     return vpx_sad4x(src, src_stride, ref, ref_stride, H);              \
755*fb1b10abSAndroid Build Coastguard Worker   }
756*fb1b10abSAndroid Build Coastguard Worker 
757*fb1b10abSAndroid Build Coastguard Worker vpx_sad4xN(8);
758*fb1b10abSAndroid Build Coastguard Worker vpx_sad4xN(4);
759*fb1b10abSAndroid Build Coastguard Worker sadMxNx4D_mmi(4, 8);
760*fb1b10abSAndroid Build Coastguard Worker sadMxNx4D_mmi(4, 4);
761*fb1b10abSAndroid Build Coastguard Worker 
vpx_sad_avg4x(const uint8_t * src,int src_stride,const uint8_t * ref,int ref_stride,const uint8_t * second_pred,int counter)762*fb1b10abSAndroid Build Coastguard Worker static inline unsigned int vpx_sad_avg4x(const uint8_t *src, int src_stride,
763*fb1b10abSAndroid Build Coastguard Worker                                          const uint8_t *ref, int ref_stride,
764*fb1b10abSAndroid Build Coastguard Worker                                          const uint8_t *second_pred,
765*fb1b10abSAndroid Build Coastguard Worker                                          int counter) {
766*fb1b10abSAndroid Build Coastguard Worker   unsigned int sad;
767*fb1b10abSAndroid Build Coastguard Worker   double ftmp1, ftmp2, ftmp3;
768*fb1b10abSAndroid Build Coastguard Worker   mips_reg l_counter = counter;
769*fb1b10abSAndroid Build Coastguard Worker   mips_reg l_second_pred = (mips_reg)second_pred;
770*fb1b10abSAndroid Build Coastguard Worker 
771*fb1b10abSAndroid Build Coastguard Worker   /* clang-format off */
772*fb1b10abSAndroid Build Coastguard Worker   __asm__ volatile (
773*fb1b10abSAndroid Build Coastguard Worker     "pxor       %[ftmp3],   %[ftmp3],       %[ftmp3]            \n\t"
774*fb1b10abSAndroid Build Coastguard Worker     "1:                                                         \n\t"
775*fb1b10abSAndroid Build Coastguard Worker     // Include two loop body, to reduce loop time.
776*fb1b10abSAndroid Build Coastguard Worker     SAD_SRC_AVGREF_ABS_SUB_4
777*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDIU(%[second_pred], %[second_pred], 0x04)
778*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[src],     %[src],         %[src_stride])
779*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[ref],     %[ref],         %[ref_stride])
780*fb1b10abSAndroid Build Coastguard Worker     SAD_SRC_AVGREF_ABS_SUB_4
781*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDIU(%[second_pred], %[second_pred], 0x04)
782*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[src],     %[src],         %[src_stride])
783*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDU(%[ref],     %[ref],         %[ref_stride])
784*fb1b10abSAndroid Build Coastguard Worker     MMI_ADDIU(%[counter], %[counter], -0x02)
785*fb1b10abSAndroid Build Coastguard Worker     "bnez       %[counter], 1b                                  \n\t"
786*fb1b10abSAndroid Build Coastguard Worker     "mfc1       %[sad],     %[ftmp3]                            \n\t"
787*fb1b10abSAndroid Build Coastguard Worker     : [ftmp1]"=&f"(ftmp1), [ftmp2]"=&f"(ftmp2), [ftmp3]"=&f"(ftmp3),
788*fb1b10abSAndroid Build Coastguard Worker       [counter]"+&r"(l_counter), [src]"+&r"(src), [ref]"+&r"(ref),
789*fb1b10abSAndroid Build Coastguard Worker       [second_pred]"+&r"(l_second_pred),
790*fb1b10abSAndroid Build Coastguard Worker       [sad]"=&r"(sad)
791*fb1b10abSAndroid Build Coastguard Worker     : [src_stride]"r"((mips_reg)src_stride),
792*fb1b10abSAndroid Build Coastguard Worker       [ref_stride]"r"((mips_reg)ref_stride)
793*fb1b10abSAndroid Build Coastguard Worker   );
794*fb1b10abSAndroid Build Coastguard Worker   /* clang-format on */
795*fb1b10abSAndroid Build Coastguard Worker 
796*fb1b10abSAndroid Build Coastguard Worker   return sad;
797*fb1b10abSAndroid Build Coastguard Worker }
798*fb1b10abSAndroid Build Coastguard Worker 
799*fb1b10abSAndroid Build Coastguard Worker #define vpx_sad_avg4xN(H)                                                   \
800*fb1b10abSAndroid Build Coastguard Worker   unsigned int vpx_sad4x##H##_avg_mmi(const uint8_t *src, int src_stride,   \
801*fb1b10abSAndroid Build Coastguard Worker                                       const uint8_t *ref, int ref_stride,   \
802*fb1b10abSAndroid Build Coastguard Worker                                       const uint8_t *second_pred) {         \
803*fb1b10abSAndroid Build Coastguard Worker     return vpx_sad_avg4x(src, src_stride, ref, ref_stride, second_pred, H); \
804*fb1b10abSAndroid Build Coastguard Worker   }
805*fb1b10abSAndroid Build Coastguard Worker 
806*fb1b10abSAndroid Build Coastguard Worker vpx_sad_avg4xN(8);
807*fb1b10abSAndroid Build Coastguard Worker vpx_sad_avg4xN(4);
808