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