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