xref: /aosp_15_r20/external/libvpx/vpx_dsp/mips/subtract_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/vpx_integer.h"
13*fb1b10abSAndroid Build Coastguard Worker #include "vpx_ports/mem.h"
14*fb1b10abSAndroid Build Coastguard Worker #include "vpx_ports/asmdefs_mmi.h"
15*fb1b10abSAndroid Build Coastguard Worker 
vpx_subtract_block_mmi(int rows,int cols,int16_t * diff,ptrdiff_t diff_stride,const uint8_t * src,ptrdiff_t src_stride,const uint8_t * pred,ptrdiff_t pred_stride)16*fb1b10abSAndroid Build Coastguard Worker void vpx_subtract_block_mmi(int rows, int cols, int16_t *diff,
17*fb1b10abSAndroid Build Coastguard Worker                             ptrdiff_t diff_stride, const uint8_t *src,
18*fb1b10abSAndroid Build Coastguard Worker                             ptrdiff_t src_stride, const uint8_t *pred,
19*fb1b10abSAndroid Build Coastguard Worker                             ptrdiff_t pred_stride) {
20*fb1b10abSAndroid Build Coastguard Worker   double ftmp[13];
21*fb1b10abSAndroid Build Coastguard Worker   uint32_t tmp[1];
22*fb1b10abSAndroid Build Coastguard Worker 
23*fb1b10abSAndroid Build Coastguard Worker   if (rows == cols) {
24*fb1b10abSAndroid Build Coastguard Worker     switch (rows) {
25*fb1b10abSAndroid Build Coastguard Worker       case 4:
26*fb1b10abSAndroid Build Coastguard Worker         __asm__ volatile(
27*fb1b10abSAndroid Build Coastguard Worker             "pxor       %[ftmp0],   %[ftmp0],           %[ftmp0]        \n\t"
28*fb1b10abSAndroid Build Coastguard Worker #if _MIPS_SIM == _ABIO32
29*fb1b10abSAndroid Build Coastguard Worker             "ulw        %[tmp0],    0x00(%[src])                        \n\t"
30*fb1b10abSAndroid Build Coastguard Worker             "mtc1       %[tmp0],    %[ftmp1]                            \n\t"
31*fb1b10abSAndroid Build Coastguard Worker             "ulw        %[tmp0],    0x00(%[pred])                       \n\t"
32*fb1b10abSAndroid Build Coastguard Worker             "mtc1       %[tmp0],    %[ftmp2]                            \n\t"
33*fb1b10abSAndroid Build Coastguard Worker #else
34*fb1b10abSAndroid Build Coastguard Worker             "gslwlc1    %[ftmp1],   0x03(%[src])                        \n\t"
35*fb1b10abSAndroid Build Coastguard Worker             "gslwrc1    %[ftmp1],   0x00(%[src])                        \n\t"
36*fb1b10abSAndroid Build Coastguard Worker             "gslwlc1    %[ftmp2],   0x03(%[pred])                       \n\t"
37*fb1b10abSAndroid Build Coastguard Worker             "gslwrc1    %[ftmp2],   0x00(%[pred])                       \n\t"
38*fb1b10abSAndroid Build Coastguard Worker #endif
39*fb1b10abSAndroid Build Coastguard Worker             MMI_ADDU(%[src], %[src], %[src_stride])
40*fb1b10abSAndroid Build Coastguard Worker             MMI_ADDU(%[pred], %[pred], %[pred_stride])
41*fb1b10abSAndroid Build Coastguard Worker 
42*fb1b10abSAndroid Build Coastguard Worker #if _MIPS_SIM == _ABIO32
43*fb1b10abSAndroid Build Coastguard Worker             "ulw        %[tmp0],    0x00(%[src])                        \n\t"
44*fb1b10abSAndroid Build Coastguard Worker             "mtc1       %[tmp0],    %[ftmp3]                            \n\t"
45*fb1b10abSAndroid Build Coastguard Worker             "ulw        %[tmp0],    0x00(%[pred])                       \n\t"
46*fb1b10abSAndroid Build Coastguard Worker             "mtc1       %[tmp0],    %[ftmp4]                            \n\t"
47*fb1b10abSAndroid Build Coastguard Worker #else
48*fb1b10abSAndroid Build Coastguard Worker             "gslwlc1    %[ftmp3],   0x03(%[src])                        \n\t"
49*fb1b10abSAndroid Build Coastguard Worker             "gslwrc1    %[ftmp3],   0x00(%[src])                        \n\t"
50*fb1b10abSAndroid Build Coastguard Worker             "gslwlc1    %[ftmp4],   0x03(%[pred])                       \n\t"
51*fb1b10abSAndroid Build Coastguard Worker             "gslwrc1    %[ftmp4],   0x00(%[pred])                       \n\t"
52*fb1b10abSAndroid Build Coastguard Worker #endif
53*fb1b10abSAndroid Build Coastguard Worker             MMI_ADDU(%[src], %[src], %[src_stride])
54*fb1b10abSAndroid Build Coastguard Worker             MMI_ADDU(%[pred], %[pred], %[pred_stride])
55*fb1b10abSAndroid Build Coastguard Worker 
56*fb1b10abSAndroid Build Coastguard Worker #if _MIPS_SIM == _ABIO32
57*fb1b10abSAndroid Build Coastguard Worker             "ulw        %[tmp0],    0x00(%[src])                        \n\t"
58*fb1b10abSAndroid Build Coastguard Worker             "mtc1       %[tmp0],    %[ftmp5]                            \n\t"
59*fb1b10abSAndroid Build Coastguard Worker             "ulw        %[tmp0],    0x00(%[pred])                       \n\t"
60*fb1b10abSAndroid Build Coastguard Worker             "mtc1       %[tmp0],    %[ftmp6]                            \n\t"
61*fb1b10abSAndroid Build Coastguard Worker #else
62*fb1b10abSAndroid Build Coastguard Worker             "gslwlc1    %[ftmp5],   0x03(%[src])                        \n\t"
63*fb1b10abSAndroid Build Coastguard Worker             "gslwrc1    %[ftmp5],   0x00(%[src])                        \n\t"
64*fb1b10abSAndroid Build Coastguard Worker             "gslwlc1    %[ftmp6],   0x03(%[pred])                       \n\t"
65*fb1b10abSAndroid Build Coastguard Worker             "gslwrc1    %[ftmp6],   0x00(%[pred])                       \n\t"
66*fb1b10abSAndroid Build Coastguard Worker #endif
67*fb1b10abSAndroid Build Coastguard Worker             MMI_ADDU(%[src], %[src], %[src_stride])
68*fb1b10abSAndroid Build Coastguard Worker             MMI_ADDU(%[pred], %[pred], %[pred_stride])
69*fb1b10abSAndroid Build Coastguard Worker 
70*fb1b10abSAndroid Build Coastguard Worker #if _MIPS_SIM == _ABIO32
71*fb1b10abSAndroid Build Coastguard Worker             "ulw        %[tmp0],    0x00(%[src])                        \n\t"
72*fb1b10abSAndroid Build Coastguard Worker             "mtc1       %[tmp0],    %[ftmp7]                            \n\t"
73*fb1b10abSAndroid Build Coastguard Worker             "ulw        %[tmp0],    0x00(%[pred])                       \n\t"
74*fb1b10abSAndroid Build Coastguard Worker             "mtc1       %[tmp0],    %[ftmp8]                            \n\t"
75*fb1b10abSAndroid Build Coastguard Worker #else
76*fb1b10abSAndroid Build Coastguard Worker             "gslwlc1    %[ftmp7],   0x03(%[src])                        \n\t"
77*fb1b10abSAndroid Build Coastguard Worker             "gslwrc1    %[ftmp7],   0x00(%[src])                        \n\t"
78*fb1b10abSAndroid Build Coastguard Worker             "gslwlc1    %[ftmp8],   0x03(%[pred])                       \n\t"
79*fb1b10abSAndroid Build Coastguard Worker             "gslwrc1    %[ftmp8],   0x00(%[pred])                       \n\t"
80*fb1b10abSAndroid Build Coastguard Worker #endif
81*fb1b10abSAndroid Build Coastguard Worker             "punpcklbh  %[ftmp9],   %[ftmp1],           %[ftmp0]        \n\t"
82*fb1b10abSAndroid Build Coastguard Worker             "punpcklbh  %[ftmp10],  %[ftmp2],           %[ftmp0]        \n\t"
83*fb1b10abSAndroid Build Coastguard Worker             "psubh      %[ftmp11],  %[ftmp9],           %[ftmp10]       \n\t"
84*fb1b10abSAndroid Build Coastguard Worker             "gssdlc1    %[ftmp11],  0x07(%[diff])                       \n\t"
85*fb1b10abSAndroid Build Coastguard Worker             "gssdrc1    %[ftmp11],  0x00(%[diff])                       \n\t"
86*fb1b10abSAndroid Build Coastguard Worker             MMI_ADDU(%[diff], %[diff], %[diff_stride])
87*fb1b10abSAndroid Build Coastguard Worker             "punpcklbh  %[ftmp9],   %[ftmp3],           %[ftmp0]        \n\t"
88*fb1b10abSAndroid Build Coastguard Worker             "punpcklbh  %[ftmp10],  %[ftmp4],           %[ftmp0]        \n\t"
89*fb1b10abSAndroid Build Coastguard Worker             "psubh      %[ftmp11],  %[ftmp9],           %[ftmp10]       \n\t"
90*fb1b10abSAndroid Build Coastguard Worker             "gssdlc1    %[ftmp11],  0x07(%[diff])                       \n\t"
91*fb1b10abSAndroid Build Coastguard Worker             "gssdrc1    %[ftmp11],  0x00(%[diff])                       \n\t"
92*fb1b10abSAndroid Build Coastguard Worker             MMI_ADDU(%[diff], %[diff], %[diff_stride])
93*fb1b10abSAndroid Build Coastguard Worker             "punpcklbh  %[ftmp9],   %[ftmp5],           %[ftmp0]        \n\t"
94*fb1b10abSAndroid Build Coastguard Worker             "punpcklbh  %[ftmp10],  %[ftmp6],           %[ftmp0]        \n\t"
95*fb1b10abSAndroid Build Coastguard Worker             "psubh      %[ftmp11],  %[ftmp9],           %[ftmp10]       \n\t"
96*fb1b10abSAndroid Build Coastguard Worker             "gssdlc1    %[ftmp11],  0x07(%[diff])                       \n\t"
97*fb1b10abSAndroid Build Coastguard Worker             "gssdrc1    %[ftmp11],  0x00(%[diff])                       \n\t"
98*fb1b10abSAndroid Build Coastguard Worker             MMI_ADDU(%[diff], %[diff], %[diff_stride])
99*fb1b10abSAndroid Build Coastguard Worker             "punpcklbh  %[ftmp9],   %[ftmp7],           %[ftmp0]        \n\t"
100*fb1b10abSAndroid Build Coastguard Worker             "punpcklbh  %[ftmp10],  %[ftmp8],           %[ftmp0]        \n\t"
101*fb1b10abSAndroid Build Coastguard Worker             "psubh      %[ftmp11],  %[ftmp9],           %[ftmp10]       \n\t"
102*fb1b10abSAndroid Build Coastguard Worker             "gssdlc1    %[ftmp11],  0x07(%[diff])                       \n\t"
103*fb1b10abSAndroid Build Coastguard Worker             "gssdrc1    %[ftmp11],  0x00(%[diff])                       \n\t"
104*fb1b10abSAndroid Build Coastguard Worker             : [ftmp0] "=&f"(ftmp[0]), [ftmp1] "=&f"(ftmp[1]),
105*fb1b10abSAndroid Build Coastguard Worker               [ftmp2] "=&f"(ftmp[2]), [ftmp3] "=&f"(ftmp[3]),
106*fb1b10abSAndroid Build Coastguard Worker               [ftmp4] "=&f"(ftmp[4]), [ftmp5] "=&f"(ftmp[5]),
107*fb1b10abSAndroid Build Coastguard Worker               [ftmp6] "=&f"(ftmp[6]), [ftmp7] "=&f"(ftmp[7]),
108*fb1b10abSAndroid Build Coastguard Worker               [ftmp8] "=&f"(ftmp[8]), [ftmp9] "=&f"(ftmp[9]),
109*fb1b10abSAndroid Build Coastguard Worker               [ftmp10] "=&f"(ftmp[10]), [ftmp11] "=&f"(ftmp[11]),
110*fb1b10abSAndroid Build Coastguard Worker #if _MIPS_SIM == _ABIO32
111*fb1b10abSAndroid Build Coastguard Worker               [tmp0] "=&r"(tmp[0]),
112*fb1b10abSAndroid Build Coastguard Worker #endif
113*fb1b10abSAndroid Build Coastguard Worker               [src] "+&r"(src), [pred] "+&r"(pred), [diff] "+&r"(diff)
114*fb1b10abSAndroid Build Coastguard Worker             : [src_stride] "r"((mips_reg)src_stride),
115*fb1b10abSAndroid Build Coastguard Worker               [pred_stride] "r"((mips_reg)pred_stride),
116*fb1b10abSAndroid Build Coastguard Worker               [diff_stride] "r"((mips_reg)(diff_stride * 2))
117*fb1b10abSAndroid Build Coastguard Worker             : "memory");
118*fb1b10abSAndroid Build Coastguard Worker         break;
119*fb1b10abSAndroid Build Coastguard Worker       case 8:
120*fb1b10abSAndroid Build Coastguard Worker         __asm__ volatile(
121*fb1b10abSAndroid Build Coastguard Worker             "pxor       %[ftmp0],   %[ftmp0],           %[ftmp0]        \n\t"
122*fb1b10abSAndroid Build Coastguard Worker             "li         %[tmp0],    0x02                                \n\t"
123*fb1b10abSAndroid Build Coastguard Worker             "1:                                                         \n\t"
124*fb1b10abSAndroid Build Coastguard Worker             "gsldlc1    %[ftmp1],   0x07(%[src])                        \n\t"
125*fb1b10abSAndroid Build Coastguard Worker             "gsldrc1    %[ftmp1],   0x00(%[src])                        \n\t"
126*fb1b10abSAndroid Build Coastguard Worker             "gsldlc1    %[ftmp2],   0x07(%[pred])                       \n\t"
127*fb1b10abSAndroid Build Coastguard Worker             "gsldrc1    %[ftmp2],   0x00(%[pred])                       \n\t"
128*fb1b10abSAndroid Build Coastguard Worker             MMI_ADDU(%[src], %[src], %[src_stride])
129*fb1b10abSAndroid Build Coastguard Worker             MMI_ADDU(%[pred], %[pred], %[pred_stride])
130*fb1b10abSAndroid Build Coastguard Worker             "gsldlc1    %[ftmp3],   0x07(%[src])                        \n\t"
131*fb1b10abSAndroid Build Coastguard Worker             "gsldrc1    %[ftmp3],   0x00(%[src])                        \n\t"
132*fb1b10abSAndroid Build Coastguard Worker             "gsldlc1    %[ftmp4],   0x07(%[pred])                       \n\t"
133*fb1b10abSAndroid Build Coastguard Worker             "gsldrc1    %[ftmp4],   0x00(%[pred])                       \n\t"
134*fb1b10abSAndroid Build Coastguard Worker             MMI_ADDU(%[src], %[src], %[src_stride])
135*fb1b10abSAndroid Build Coastguard Worker             MMI_ADDU(%[pred], %[pred], %[pred_stride])
136*fb1b10abSAndroid Build Coastguard Worker             "gsldlc1    %[ftmp5],   0x07(%[src])                        \n\t"
137*fb1b10abSAndroid Build Coastguard Worker             "gsldrc1    %[ftmp5],   0x00(%[src])                        \n\t"
138*fb1b10abSAndroid Build Coastguard Worker             "gsldlc1    %[ftmp6],   0x07(%[pred])                       \n\t"
139*fb1b10abSAndroid Build Coastguard Worker             "gsldrc1    %[ftmp6],   0x00(%[pred])                       \n\t"
140*fb1b10abSAndroid Build Coastguard Worker             MMI_ADDU(%[src], %[src], %[src_stride])
141*fb1b10abSAndroid Build Coastguard Worker             MMI_ADDU(%[pred], %[pred], %[pred_stride])
142*fb1b10abSAndroid Build Coastguard Worker             "gsldlc1    %[ftmp7],   0x07(%[src])                        \n\t"
143*fb1b10abSAndroid Build Coastguard Worker             "gsldrc1    %[ftmp7],   0x00(%[src])                        \n\t"
144*fb1b10abSAndroid Build Coastguard Worker             "gsldlc1    %[ftmp8],   0x07(%[pred])                       \n\t"
145*fb1b10abSAndroid Build Coastguard Worker             "gsldrc1    %[ftmp8],   0x00(%[pred])                       \n\t"
146*fb1b10abSAndroid Build Coastguard Worker             MMI_ADDU(%[src], %[src], %[src_stride])
147*fb1b10abSAndroid Build Coastguard Worker             MMI_ADDU(%[pred], %[pred], %[pred_stride])
148*fb1b10abSAndroid Build Coastguard Worker             "punpcklbh  %[ftmp9],   %[ftmp1],           %[ftmp0]        \n\t"
149*fb1b10abSAndroid Build Coastguard Worker             "punpckhbh  %[ftmp10],  %[ftmp1],           %[ftmp0]        \n\t"
150*fb1b10abSAndroid Build Coastguard Worker             "punpcklbh  %[ftmp11],  %[ftmp2],           %[ftmp0]        \n\t"
151*fb1b10abSAndroid Build Coastguard Worker             "punpckhbh  %[ftmp12],  %[ftmp2],           %[ftmp0]        \n\t"
152*fb1b10abSAndroid Build Coastguard Worker             "psubsh     %[ftmp9],   %[ftmp9],           %[ftmp11]       \n\t"
153*fb1b10abSAndroid Build Coastguard Worker             "psubsh     %[ftmp10],  %[ftmp10],          %[ftmp12]       \n\t"
154*fb1b10abSAndroid Build Coastguard Worker             "gssdlc1    %[ftmp9],   0x07(%[diff])                       \n\t"
155*fb1b10abSAndroid Build Coastguard Worker             "gssdrc1    %[ftmp9],   0x00(%[diff])                       \n\t"
156*fb1b10abSAndroid Build Coastguard Worker             "gssdlc1    %[ftmp10],  0x0f(%[diff])                       \n\t"
157*fb1b10abSAndroid Build Coastguard Worker             "gssdrc1    %[ftmp10],  0x08(%[diff])                       \n\t"
158*fb1b10abSAndroid Build Coastguard Worker             MMI_ADDU(%[diff], %[diff], %[diff_stride])
159*fb1b10abSAndroid Build Coastguard Worker             "punpcklbh  %[ftmp9],   %[ftmp3],           %[ftmp0]        \n\t"
160*fb1b10abSAndroid Build Coastguard Worker             "punpckhbh  %[ftmp10],  %[ftmp3],           %[ftmp0]        \n\t"
161*fb1b10abSAndroid Build Coastguard Worker             "punpcklbh  %[ftmp11],  %[ftmp4],           %[ftmp0]        \n\t"
162*fb1b10abSAndroid Build Coastguard Worker             "punpckhbh  %[ftmp12],  %[ftmp4],           %[ftmp0]        \n\t"
163*fb1b10abSAndroid Build Coastguard Worker             "psubsh     %[ftmp9],   %[ftmp9],           %[ftmp11]       \n\t"
164*fb1b10abSAndroid Build Coastguard Worker             "psubsh     %[ftmp10],  %[ftmp10],          %[ftmp12]       \n\t"
165*fb1b10abSAndroid Build Coastguard Worker             "gssdlc1    %[ftmp9],   0x07(%[diff])                       \n\t"
166*fb1b10abSAndroid Build Coastguard Worker             "gssdrc1    %[ftmp9],   0x00(%[diff])                       \n\t"
167*fb1b10abSAndroid Build Coastguard Worker             "gssdlc1    %[ftmp10],  0x0f(%[diff])                       \n\t"
168*fb1b10abSAndroid Build Coastguard Worker             "gssdrc1    %[ftmp10],  0x08(%[diff])                       \n\t"
169*fb1b10abSAndroid Build Coastguard Worker             MMI_ADDU(%[diff], %[diff], %[diff_stride])
170*fb1b10abSAndroid Build Coastguard Worker             "punpcklbh  %[ftmp9],   %[ftmp5],           %[ftmp0]        \n\t"
171*fb1b10abSAndroid Build Coastguard Worker             "punpckhbh  %[ftmp10],  %[ftmp5],           %[ftmp0]        \n\t"
172*fb1b10abSAndroid Build Coastguard Worker             "punpcklbh  %[ftmp11],  %[ftmp6],           %[ftmp0]        \n\t"
173*fb1b10abSAndroid Build Coastguard Worker             "punpckhbh  %[ftmp12],  %[ftmp6],           %[ftmp0]        \n\t"
174*fb1b10abSAndroid Build Coastguard Worker             "psubsh     %[ftmp9],   %[ftmp9],           %[ftmp11]       \n\t"
175*fb1b10abSAndroid Build Coastguard Worker             "psubsh     %[ftmp10],  %[ftmp10],          %[ftmp12]       \n\t"
176*fb1b10abSAndroid Build Coastguard Worker             "gssdlc1    %[ftmp9],   0x07(%[diff])                       \n\t"
177*fb1b10abSAndroid Build Coastguard Worker             "gssdrc1    %[ftmp9],   0x00(%[diff])                       \n\t"
178*fb1b10abSAndroid Build Coastguard Worker             "gssdlc1    %[ftmp10],  0x0f(%[diff])                       \n\t"
179*fb1b10abSAndroid Build Coastguard Worker             "gssdrc1    %[ftmp10],  0x08(%[diff])                       \n\t"
180*fb1b10abSAndroid Build Coastguard Worker             MMI_ADDU(%[diff], %[diff], %[diff_stride])
181*fb1b10abSAndroid Build Coastguard Worker             "punpcklbh  %[ftmp9],   %[ftmp7],           %[ftmp0]        \n\t"
182*fb1b10abSAndroid Build Coastguard Worker             "punpckhbh  %[ftmp10],  %[ftmp7],           %[ftmp0]        \n\t"
183*fb1b10abSAndroid Build Coastguard Worker             "punpcklbh  %[ftmp11],  %[ftmp8],           %[ftmp0]        \n\t"
184*fb1b10abSAndroid Build Coastguard Worker             "punpckhbh  %[ftmp12],  %[ftmp8],           %[ftmp0]        \n\t"
185*fb1b10abSAndroid Build Coastguard Worker             "psubsh     %[ftmp9],   %[ftmp9],           %[ftmp11]       \n\t"
186*fb1b10abSAndroid Build Coastguard Worker             "psubsh     %[ftmp10],  %[ftmp10],          %[ftmp12]       \n\t"
187*fb1b10abSAndroid Build Coastguard Worker             "gssdlc1    %[ftmp9],   0x07(%[diff])                       \n\t"
188*fb1b10abSAndroid Build Coastguard Worker             "gssdrc1    %[ftmp9],   0x00(%[diff])                       \n\t"
189*fb1b10abSAndroid Build Coastguard Worker             "gssdlc1    %[ftmp10],  0x0f(%[diff])                       \n\t"
190*fb1b10abSAndroid Build Coastguard Worker             "gssdrc1    %[ftmp10],  0x08(%[diff])                       \n\t"
191*fb1b10abSAndroid Build Coastguard Worker             MMI_ADDU(%[diff], %[diff], %[diff_stride])
192*fb1b10abSAndroid Build Coastguard Worker             "addiu      %[tmp0],    %[tmp0],            -0x01           \n\t"
193*fb1b10abSAndroid Build Coastguard Worker             "bnez       %[tmp0],    1b                                  \n\t"
194*fb1b10abSAndroid Build Coastguard Worker             : [ftmp0] "=&f"(ftmp[0]), [ftmp1] "=&f"(ftmp[1]),
195*fb1b10abSAndroid Build Coastguard Worker               [ftmp2] "=&f"(ftmp[2]), [ftmp3] "=&f"(ftmp[3]),
196*fb1b10abSAndroid Build Coastguard Worker               [ftmp4] "=&f"(ftmp[4]), [ftmp5] "=&f"(ftmp[5]),
197*fb1b10abSAndroid Build Coastguard Worker               [ftmp6] "=&f"(ftmp[6]), [ftmp7] "=&f"(ftmp[7]),
198*fb1b10abSAndroid Build Coastguard Worker               [ftmp8] "=&f"(ftmp[8]), [ftmp9] "=&f"(ftmp[9]),
199*fb1b10abSAndroid Build Coastguard Worker               [ftmp10] "=&f"(ftmp[10]), [ftmp11] "=&f"(ftmp[11]),
200*fb1b10abSAndroid Build Coastguard Worker               [ftmp12] "=&f"(ftmp[12]), [tmp0] "=&r"(tmp[0]), [src] "+&r"(src),
201*fb1b10abSAndroid Build Coastguard Worker               [pred] "+&r"(pred), [diff] "+&r"(diff)
202*fb1b10abSAndroid Build Coastguard Worker             : [pred_stride] "r"((mips_reg)pred_stride),
203*fb1b10abSAndroid Build Coastguard Worker               [src_stride] "r"((mips_reg)src_stride),
204*fb1b10abSAndroid Build Coastguard Worker               [diff_stride] "r"((mips_reg)(diff_stride * 2))
205*fb1b10abSAndroid Build Coastguard Worker             : "memory");
206*fb1b10abSAndroid Build Coastguard Worker         break;
207*fb1b10abSAndroid Build Coastguard Worker       case 16:
208*fb1b10abSAndroid Build Coastguard Worker         __asm__ volatile(
209*fb1b10abSAndroid Build Coastguard Worker             "pxor       %[ftmp0],   %[ftmp0],           %[ftmp0]        \n\t"
210*fb1b10abSAndroid Build Coastguard Worker             "li         %[tmp0],    0x08                                \n\t"
211*fb1b10abSAndroid Build Coastguard Worker             "1:                                                         \n\t"
212*fb1b10abSAndroid Build Coastguard Worker             "gsldlc1    %[ftmp1],   0x07(%[src])                        \n\t"
213*fb1b10abSAndroid Build Coastguard Worker             "gsldrc1    %[ftmp1],   0x00(%[src])                        \n\t"
214*fb1b10abSAndroid Build Coastguard Worker             "gsldlc1    %[ftmp2],   0x07(%[pred])                       \n\t"
215*fb1b10abSAndroid Build Coastguard Worker             "gsldrc1    %[ftmp2],   0x00(%[pred])                       \n\t"
216*fb1b10abSAndroid Build Coastguard Worker             "gsldlc1    %[ftmp3],   0x0f(%[src])                        \n\t"
217*fb1b10abSAndroid Build Coastguard Worker             "gsldrc1    %[ftmp3],   0x08(%[src])                        \n\t"
218*fb1b10abSAndroid Build Coastguard Worker             "gsldlc1    %[ftmp4],   0x0f(%[pred])                       \n\t"
219*fb1b10abSAndroid Build Coastguard Worker             "gsldrc1    %[ftmp4],   0x08(%[pred])                       \n\t"
220*fb1b10abSAndroid Build Coastguard Worker             MMI_ADDU(%[src], %[src], %[src_stride])
221*fb1b10abSAndroid Build Coastguard Worker             MMI_ADDU(%[pred], %[pred], %[pred_stride])
222*fb1b10abSAndroid Build Coastguard Worker             "gsldlc1    %[ftmp5],   0x07(%[src])                        \n\t"
223*fb1b10abSAndroid Build Coastguard Worker             "gsldrc1    %[ftmp5],   0x00(%[src])                        \n\t"
224*fb1b10abSAndroid Build Coastguard Worker             "gsldlc1    %[ftmp6],   0x07(%[pred])                       \n\t"
225*fb1b10abSAndroid Build Coastguard Worker             "gsldrc1    %[ftmp6],   0x00(%[pred])                       \n\t"
226*fb1b10abSAndroid Build Coastguard Worker             "gsldlc1    %[ftmp7],   0x0f(%[src])                        \n\t"
227*fb1b10abSAndroid Build Coastguard Worker             "gsldrc1    %[ftmp7],   0x08(%[src])                        \n\t"
228*fb1b10abSAndroid Build Coastguard Worker             "gsldlc1    %[ftmp8],   0x0f(%[pred])                       \n\t"
229*fb1b10abSAndroid Build Coastguard Worker             "gsldrc1    %[ftmp8],   0x08(%[pred])                       \n\t"
230*fb1b10abSAndroid Build Coastguard Worker             MMI_ADDU(%[src], %[src], %[src_stride])
231*fb1b10abSAndroid Build Coastguard Worker             MMI_ADDU(%[pred], %[pred], %[pred_stride])
232*fb1b10abSAndroid Build Coastguard Worker             "punpcklbh  %[ftmp9],   %[ftmp1],           %[ftmp0]        \n\t"
233*fb1b10abSAndroid Build Coastguard Worker             "punpckhbh  %[ftmp10],  %[ftmp1],           %[ftmp0]        \n\t"
234*fb1b10abSAndroid Build Coastguard Worker             "punpcklbh  %[ftmp11],  %[ftmp2],           %[ftmp0]        \n\t"
235*fb1b10abSAndroid Build Coastguard Worker             "punpckhbh  %[ftmp12],  %[ftmp2],           %[ftmp0]        \n\t"
236*fb1b10abSAndroid Build Coastguard Worker             "psubsh     %[ftmp9],   %[ftmp9],           %[ftmp11]       \n\t"
237*fb1b10abSAndroid Build Coastguard Worker             "psubsh     %[ftmp10],  %[ftmp10],          %[ftmp12]       \n\t"
238*fb1b10abSAndroid Build Coastguard Worker             "gssdlc1    %[ftmp9],   0x07(%[diff])                       \n\t"
239*fb1b10abSAndroid Build Coastguard Worker             "gssdrc1    %[ftmp9],   0x00(%[diff])                       \n\t"
240*fb1b10abSAndroid Build Coastguard Worker             "gssdlc1    %[ftmp10],  0x0f(%[diff])                       \n\t"
241*fb1b10abSAndroid Build Coastguard Worker             "gssdrc1    %[ftmp10],  0x08(%[diff])                       \n\t"
242*fb1b10abSAndroid Build Coastguard Worker             "punpcklbh  %[ftmp9],   %[ftmp3],           %[ftmp0]        \n\t"
243*fb1b10abSAndroid Build Coastguard Worker             "punpckhbh  %[ftmp10],  %[ftmp3],           %[ftmp0]        \n\t"
244*fb1b10abSAndroid Build Coastguard Worker             "punpcklbh  %[ftmp11],  %[ftmp4],           %[ftmp0]        \n\t"
245*fb1b10abSAndroid Build Coastguard Worker             "punpckhbh  %[ftmp12],  %[ftmp4],           %[ftmp0]        \n\t"
246*fb1b10abSAndroid Build Coastguard Worker             "psubsh     %[ftmp9],   %[ftmp9],           %[ftmp11]       \n\t"
247*fb1b10abSAndroid Build Coastguard Worker             "psubsh     %[ftmp10],  %[ftmp10],          %[ftmp12]       \n\t"
248*fb1b10abSAndroid Build Coastguard Worker             "gssdlc1    %[ftmp9],   0x17(%[diff])                       \n\t"
249*fb1b10abSAndroid Build Coastguard Worker             "gssdrc1    %[ftmp9],   0x10(%[diff])                       \n\t"
250*fb1b10abSAndroid Build Coastguard Worker             "gssdlc1    %[ftmp10],  0x1f(%[diff])                       \n\t"
251*fb1b10abSAndroid Build Coastguard Worker             "gssdrc1    %[ftmp10],  0x18(%[diff])                       \n\t"
252*fb1b10abSAndroid Build Coastguard Worker             MMI_ADDU(%[diff], %[diff], %[diff_stride])
253*fb1b10abSAndroid Build Coastguard Worker             "punpcklbh  %[ftmp9],   %[ftmp5],           %[ftmp0]        \n\t"
254*fb1b10abSAndroid Build Coastguard Worker             "punpckhbh  %[ftmp10],  %[ftmp5],           %[ftmp0]        \n\t"
255*fb1b10abSAndroid Build Coastguard Worker             "punpcklbh  %[ftmp11],  %[ftmp6],           %[ftmp0]        \n\t"
256*fb1b10abSAndroid Build Coastguard Worker             "punpckhbh  %[ftmp12],  %[ftmp6],           %[ftmp0]        \n\t"
257*fb1b10abSAndroid Build Coastguard Worker             "psubsh     %[ftmp9],   %[ftmp9],           %[ftmp11]       \n\t"
258*fb1b10abSAndroid Build Coastguard Worker             "psubsh     %[ftmp10],  %[ftmp10],          %[ftmp12]       \n\t"
259*fb1b10abSAndroid Build Coastguard Worker             "gssdlc1    %[ftmp9],   0x07(%[diff])                       \n\t"
260*fb1b10abSAndroid Build Coastguard Worker             "gssdrc1    %[ftmp9],   0x00(%[diff])                       \n\t"
261*fb1b10abSAndroid Build Coastguard Worker             "gssdlc1    %[ftmp10],  0x0f(%[diff])                       \n\t"
262*fb1b10abSAndroid Build Coastguard Worker             "gssdrc1    %[ftmp10],  0x08(%[diff])                       \n\t"
263*fb1b10abSAndroid Build Coastguard Worker             "punpcklbh  %[ftmp9],   %[ftmp7],           %[ftmp0]        \n\t"
264*fb1b10abSAndroid Build Coastguard Worker             "punpckhbh  %[ftmp10],  %[ftmp7],           %[ftmp0]        \n\t"
265*fb1b10abSAndroid Build Coastguard Worker             "punpcklbh  %[ftmp11],  %[ftmp8],           %[ftmp0]        \n\t"
266*fb1b10abSAndroid Build Coastguard Worker             "punpckhbh  %[ftmp12],  %[ftmp8],           %[ftmp0]        \n\t"
267*fb1b10abSAndroid Build Coastguard Worker             "psubsh     %[ftmp9],   %[ftmp9],           %[ftmp11]       \n\t"
268*fb1b10abSAndroid Build Coastguard Worker             "psubsh     %[ftmp10],  %[ftmp10],          %[ftmp12]       \n\t"
269*fb1b10abSAndroid Build Coastguard Worker             "gssdlc1    %[ftmp9],   0x17(%[diff])                       \n\t"
270*fb1b10abSAndroid Build Coastguard Worker             "gssdrc1    %[ftmp9],   0x10(%[diff])                       \n\t"
271*fb1b10abSAndroid Build Coastguard Worker             "gssdlc1    %[ftmp10],  0x1f(%[diff])                       \n\t"
272*fb1b10abSAndroid Build Coastguard Worker             "gssdrc1    %[ftmp10],  0x18(%[diff])                       \n\t"
273*fb1b10abSAndroid Build Coastguard Worker             MMI_ADDU(%[diff], %[diff], %[diff_stride])
274*fb1b10abSAndroid Build Coastguard Worker             "addiu      %[tmp0],    %[tmp0],            -0x01           \n\t"
275*fb1b10abSAndroid Build Coastguard Worker             "bnez       %[tmp0],    1b                                  \n\t"
276*fb1b10abSAndroid Build Coastguard Worker             : [ftmp0] "=&f"(ftmp[0]), [ftmp1] "=&f"(ftmp[1]),
277*fb1b10abSAndroid Build Coastguard Worker               [ftmp2] "=&f"(ftmp[2]), [ftmp3] "=&f"(ftmp[3]),
278*fb1b10abSAndroid Build Coastguard Worker               [ftmp4] "=&f"(ftmp[4]), [ftmp5] "=&f"(ftmp[5]),
279*fb1b10abSAndroid Build Coastguard Worker               [ftmp6] "=&f"(ftmp[6]), [ftmp7] "=&f"(ftmp[7]),
280*fb1b10abSAndroid Build Coastguard Worker               [ftmp8] "=&f"(ftmp[8]), [ftmp9] "=&f"(ftmp[9]),
281*fb1b10abSAndroid Build Coastguard Worker               [ftmp10] "=&f"(ftmp[10]), [ftmp11] "=&f"(ftmp[11]),
282*fb1b10abSAndroid Build Coastguard Worker               [ftmp12] "=&f"(ftmp[12]), [tmp0] "=&r"(tmp[0]), [src] "+&r"(src),
283*fb1b10abSAndroid Build Coastguard Worker               [pred] "+&r"(pred), [diff] "+&r"(diff)
284*fb1b10abSAndroid Build Coastguard Worker             : [pred_stride] "r"((mips_reg)pred_stride),
285*fb1b10abSAndroid Build Coastguard Worker               [src_stride] "r"((mips_reg)src_stride),
286*fb1b10abSAndroid Build Coastguard Worker               [diff_stride] "r"((mips_reg)(diff_stride * 2))
287*fb1b10abSAndroid Build Coastguard Worker             : "memory");
288*fb1b10abSAndroid Build Coastguard Worker         break;
289*fb1b10abSAndroid Build Coastguard Worker       case 32:
290*fb1b10abSAndroid Build Coastguard Worker         vpx_subtract_block_c(rows, cols, diff, diff_stride, src, src_stride,
291*fb1b10abSAndroid Build Coastguard Worker                              pred, pred_stride);
292*fb1b10abSAndroid Build Coastguard Worker         break;
293*fb1b10abSAndroid Build Coastguard Worker       case 64:
294*fb1b10abSAndroid Build Coastguard Worker         vpx_subtract_block_c(rows, cols, diff, diff_stride, src, src_stride,
295*fb1b10abSAndroid Build Coastguard Worker                              pred, pred_stride);
296*fb1b10abSAndroid Build Coastguard Worker         break;
297*fb1b10abSAndroid Build Coastguard Worker       default:
298*fb1b10abSAndroid Build Coastguard Worker         vpx_subtract_block_c(rows, cols, diff, diff_stride, src, src_stride,
299*fb1b10abSAndroid Build Coastguard Worker                              pred, pred_stride);
300*fb1b10abSAndroid Build Coastguard Worker         break;
301*fb1b10abSAndroid Build Coastguard Worker     }
302*fb1b10abSAndroid Build Coastguard Worker   } else {
303*fb1b10abSAndroid Build Coastguard Worker     vpx_subtract_block_c(rows, cols, diff, diff_stride, src, src_stride, pred,
304*fb1b10abSAndroid Build Coastguard Worker                          pred_stride);
305*fb1b10abSAndroid Build Coastguard Worker   }
306*fb1b10abSAndroid Build Coastguard Worker }
307