Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(119)

Side by Side Diff: source/libvpx/vp9/encoder/mips/msa/vp9_fdct16x16_msa.c

Issue 1217053002: libvpx: Pull from upstream (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/libvpx.git@master
Patch Set: Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 /*
2 * Copyright (c) 2015 The WebM project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include <assert.h>
12
13 #include "./vp9_rtcd.h"
14 #include "vp9/encoder/mips/msa/vp9_fdct_msa.h"
15
16 static void fdct8x16_1d_column(const int16_t *input, int16_t *tmp_ptr,
17 int32_t src_stride) {
18 v8i16 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
19 v8i16 in0, in1, in2, in3, in4, in5, in6, in7;
20 v8i16 in8, in9, in10, in11, in12, in13, in14, in15;
21 v8i16 stp21, stp22, stp23, stp24, stp25, stp26, stp30;
22 v8i16 stp31, stp32, stp33, stp34, stp35, stp36, stp37;
23 v8i16 vec0, vec1, vec2, vec3, vec4, vec5, cnst0, cnst1, cnst4, cnst5;
24 v8i16 coeff = { cospi_16_64, -cospi_16_64, cospi_8_64, cospi_24_64,
25 -cospi_8_64, -cospi_24_64, cospi_12_64, cospi_20_64 };
26 v8i16 coeff1 = { cospi_2_64, cospi_30_64, cospi_14_64, cospi_18_64,
27 cospi_10_64, cospi_22_64, cospi_6_64, cospi_26_64 };
28 v8i16 coeff2 = { -cospi_2_64, -cospi_10_64, -cospi_18_64, -cospi_26_64,
29 0, 0, 0, 0 };
30
31 LD_SH16(input, src_stride,
32 in0, in1, in2, in3, in4, in5, in6, in7,
33 in8, in9, in10, in11, in12, in13, in14, in15);
34 SLLI_4V(in0, in1, in2, in3, 2);
35 SLLI_4V(in4, in5, in6, in7, 2);
36 SLLI_4V(in8, in9, in10, in11, 2);
37 SLLI_4V(in12, in13, in14, in15, 2);
38 ADD4(in0, in15, in1, in14, in2, in13, in3, in12, tmp0, tmp1, tmp2, tmp3);
39 ADD4(in4, in11, in5, in10, in6, in9, in7, in8, tmp4, tmp5, tmp6, tmp7);
40 VP9_FDCT8x16_EVEN(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7,
41 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7);
42 ST_SH8(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp_ptr, 32);
43 SUB4(in0, in15, in1, in14, in2, in13, in3, in12, in15, in14, in13, in12);
44 SUB4(in4, in11, in5, in10, in6, in9, in7, in8, in11, in10, in9, in8);
45
46 tmp_ptr += 16;
47
48 /* stp 1 */
49 ILVL_H2_SH(in10, in13, in11, in12, vec2, vec4);
50 ILVR_H2_SH(in10, in13, in11, in12, vec3, vec5);
51
52 cnst4 = __msa_splati_h(coeff, 0);
53 stp25 = VP9_DOT_SHIFT_RIGHT_PCK_H(vec2, vec3, cnst4);
54
55 cnst5 = __msa_splati_h(coeff, 1);
56 cnst5 = __msa_ilvev_h(cnst5, cnst4);
57 stp22 = VP9_DOT_SHIFT_RIGHT_PCK_H(vec2, vec3, cnst5);
58 stp24 = VP9_DOT_SHIFT_RIGHT_PCK_H(vec4, vec5, cnst4);
59 stp23 = VP9_DOT_SHIFT_RIGHT_PCK_H(vec4, vec5, cnst5);
60
61 /* stp2 */
62 BUTTERFLY_4(in8, in9, stp22, stp23, stp30, stp31, stp32, stp33);
63 BUTTERFLY_4(in15, in14, stp25, stp24, stp37, stp36, stp35, stp34);
64 ILVL_H2_SH(stp36, stp31, stp35, stp32, vec2, vec4);
65 ILVR_H2_SH(stp36, stp31, stp35, stp32, vec3, vec5);
66 SPLATI_H2_SH(coeff, 2, 3, cnst0, cnst1);
67 cnst0 = __msa_ilvev_h(cnst0, cnst1);
68 stp26 = VP9_DOT_SHIFT_RIGHT_PCK_H(vec2, vec3, cnst0);
69
70 cnst0 = __msa_splati_h(coeff, 4);
71 cnst1 = __msa_ilvev_h(cnst1, cnst0);
72 stp21 = VP9_DOT_SHIFT_RIGHT_PCK_H(vec2, vec3, cnst1);
73
74 BUTTERFLY_4(stp30, stp37, stp26, stp21, in8, in15, in14, in9);
75 ILVRL_H2_SH(in15, in8, vec1, vec0);
76 SPLATI_H2_SH(coeff1, 0, 1, cnst0, cnst1);
77 cnst0 = __msa_ilvev_h(cnst0, cnst1);
78
79 in8 = VP9_DOT_SHIFT_RIGHT_PCK_H(vec0, vec1, cnst0);
80 ST_SH(in8, tmp_ptr);
81
82 cnst0 = __msa_splati_h(coeff2, 0);
83 cnst0 = __msa_ilvev_h(cnst1, cnst0);
84 in8 = VP9_DOT_SHIFT_RIGHT_PCK_H(vec0, vec1, cnst0);
85 ST_SH(in8, tmp_ptr + 224);
86
87 ILVRL_H2_SH(in14, in9, vec1, vec0);
88 SPLATI_H2_SH(coeff1, 2, 3, cnst0, cnst1);
89 cnst1 = __msa_ilvev_h(cnst1, cnst0);
90
91 in8 = VP9_DOT_SHIFT_RIGHT_PCK_H(vec0, vec1, cnst1);
92 ST_SH(in8, tmp_ptr + 128);
93
94 cnst1 = __msa_splati_h(coeff2, 2);
95 cnst0 = __msa_ilvev_h(cnst0, cnst1);
96 in8 = VP9_DOT_SHIFT_RIGHT_PCK_H(vec0, vec1, cnst0);
97 ST_SH(in8, tmp_ptr + 96);
98
99 SPLATI_H2_SH(coeff, 2, 5, cnst0, cnst1);
100 cnst1 = __msa_ilvev_h(cnst1, cnst0);
101
102 stp25 = VP9_DOT_SHIFT_RIGHT_PCK_H(vec4, vec5, cnst1);
103
104 cnst1 = __msa_splati_h(coeff, 3);
105 cnst1 = __msa_ilvev_h(cnst0, cnst1);
106 stp22 = VP9_DOT_SHIFT_RIGHT_PCK_H(vec4, vec5, cnst1);
107
108 /* stp4 */
109 ADD2(stp34, stp25, stp33, stp22, in13, in10);
110
111 ILVRL_H2_SH(in13, in10, vec1, vec0);
112 SPLATI_H2_SH(coeff1, 4, 5, cnst0, cnst1);
113 cnst0 = __msa_ilvev_h(cnst0, cnst1);
114 in8 = VP9_DOT_SHIFT_RIGHT_PCK_H(vec0, vec1, cnst0);
115 ST_SH(in8, tmp_ptr + 64);
116
117 cnst0 = __msa_splati_h(coeff2, 1);
118 cnst0 = __msa_ilvev_h(cnst1, cnst0);
119 in8 = VP9_DOT_SHIFT_RIGHT_PCK_H(vec0, vec1, cnst0);
120 ST_SH(in8, tmp_ptr + 160);
121
122 SUB2(stp34, stp25, stp33, stp22, in12, in11);
123 ILVRL_H2_SH(in12, in11, vec1, vec0);
124 SPLATI_H2_SH(coeff1, 6, 7, cnst0, cnst1);
125 cnst1 = __msa_ilvev_h(cnst1, cnst0);
126
127 in8 = VP9_DOT_SHIFT_RIGHT_PCK_H(vec0, vec1, cnst1);
128 ST_SH(in8, tmp_ptr + 192);
129
130 cnst1 = __msa_splati_h(coeff2, 3);
131 cnst0 = __msa_ilvev_h(cnst0, cnst1);
132 in8 = VP9_DOT_SHIFT_RIGHT_PCK_H(vec0, vec1, cnst0);
133 ST_SH(in8, tmp_ptr + 32);
134 }
135
136 static void fdct16x8_1d_row(int16_t *input, int16_t *output) {
137 v8i16 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
138 v8i16 in0, in1, in2, in3, in4, in5, in6, in7;
139 v8i16 in8, in9, in10, in11, in12, in13, in14, in15;
140
141 LD_SH8(input, 16, in0, in1, in2, in3, in4, in5, in6, in7);
142 LD_SH8((input + 8), 16, in8, in9, in10, in11, in12, in13, in14, in15);
143 TRANSPOSE8x8_SH_SH(in0, in1, in2, in3, in4, in5, in6, in7,
144 in0, in1, in2, in3, in4, in5, in6, in7);
145 TRANSPOSE8x8_SH_SH(in8, in9, in10, in11, in12, in13, in14, in15,
146 in8, in9, in10, in11, in12, in13, in14, in15);
147 ADD4(in0, 1, in1, 1, in2, 1, in3, 1, in0, in1, in2, in3);
148 ADD4(in4, 1, in5, 1, in6, 1, in7, 1, in4, in5, in6, in7);
149 ADD4(in8, 1, in9, 1, in10, 1, in11, 1, in8, in9, in10, in11);
150 ADD4(in12, 1, in13, 1, in14, 1, in15, 1, in12, in13, in14, in15);
151 SRA_4V(in0, in1, in2, in3, 2);
152 SRA_4V(in4, in5, in6, in7, 2);
153 SRA_4V(in8, in9, in10, in11, 2);
154 SRA_4V(in12, in13, in14, in15, 2);
155 BUTTERFLY_16(in0, in1, in2, in3, in4, in5, in6, in7, in8, in9, in10, in11,
156 in12, in13, in14, in15, tmp0, tmp1, tmp2, tmp3, tmp4, tmp5,
157 tmp6, tmp7, in8, in9, in10, in11, in12, in13, in14, in15);
158 ST_SH8(in8, in9, in10, in11, in12, in13, in14, in15, input, 16);
159 VP9_FDCT8x16_EVEN(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7,
160 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7);
161 LD_SH8(input, 16, in8, in9, in10, in11, in12, in13, in14, in15);
162 VP9_FDCT8x16_ODD(in8, in9, in10, in11, in12, in13, in14, in15,
163 in0, in1, in2, in3, in4, in5, in6, in7);
164 TRANSPOSE8x8_SH_SH(tmp0, in0, tmp1, in1, tmp2, in2, tmp3, in3,
165 tmp0, in0, tmp1, in1, tmp2, in2, tmp3, in3);
166 ST_SH8(tmp0, in0, tmp1, in1, tmp2, in2, tmp3, in3, output, 16);
167 TRANSPOSE8x8_SH_SH(tmp4, in4, tmp5, in5, tmp6, in6, tmp7, in7,
168 tmp4, in4, tmp5, in5, tmp6, in6, tmp7, in7);
169 ST_SH8(tmp4, in4, tmp5, in5, tmp6, in6, tmp7, in7, output + 8, 16);
170 }
171
172 void vp9_fdct16x16_msa(const int16_t *input, int16_t *output,
173 int32_t src_stride) {
174 int32_t i;
175 DECLARE_ALIGNED(32, int16_t, tmp_buf[16 * 16]);
176
177 /* column transform */
178 for (i = 0; i < 2; ++i) {
179 fdct8x16_1d_column((input + 8 * i), (&tmp_buf[0] + 8 * i), src_stride);
180 }
181
182 /* row transform */
183 for (i = 0; i < 2; ++i) {
184 fdct16x8_1d_row((&tmp_buf[0] + (128 * i)), (output + (128 * i)));
185 }
186 }
187
188 void vp9_fdct16x16_1_msa(const int16_t *input, int16_t *out, int32_t stride) {
189 out[1] = 0;
190
191 out[0] = VP9_LD_HADD(input, stride);
192 out[0] += VP9_LD_HADD(input + 8, stride);
193 out[0] += VP9_LD_HADD(input + 16 * 8, stride);
194 out[0] += VP9_LD_HADD(input + 16 * 8 + 8, stride);
195 out[0] >>= 1;
196 }
197
198 static void fadst16_cols_step1_msa(const int16_t *input, int32_t stride,
199 const int32_t *const0, int16_t *int_buf) {
200 v8i16 r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15;
201 v8i16 tp0, tp1, tp2, tp3, g0, g1, g2, g3, g8, g9, g10, g11, h0, h1, h2, h3;
202 v4i32 k0, k1, k2, k3;
203
204 /* load input data */
205 r0 = LD_SH(input);
206 r15 = LD_SH(input + 15 * stride);
207 r7 = LD_SH(input + 7 * stride);
208 r8 = LD_SH(input + 8 * stride);
209 SLLI_4V(r0, r15, r7, r8, 2);
210
211 /* stage 1 */
212 LD_SW2(const0, 4, k0, k1);
213 LD_SW2(const0 + 8, 4, k2, k3);
214 VP9_MADD_BF(r15, r0, r7, r8, k0, k1, k2, k3, g0, g1, g2, g3);
215
216 r3 = LD_SH(input + 3 * stride);
217 r4 = LD_SH(input + 4 * stride);
218 r11 = LD_SH(input + 11 * stride);
219 r12 = LD_SH(input + 12 * stride);
220 SLLI_4V(r3, r4, r11, r12, 2);
221
222 LD_SW2(const0 + 4 * 4, 4, k0, k1);
223 LD_SW2(const0 + 4 * 6, 4, k2, k3);
224 VP9_MADD_BF(r11, r4, r3, r12, k0, k1, k2, k3, g8, g9, g10, g11);
225
226 /* stage 2 */
227 BUTTERFLY_4(g0, g2, g10, g8, tp0, tp2, tp3, tp1);
228 ST_SH2(tp0, tp2, int_buf, 8);
229 ST_SH2(tp1, tp3, int_buf + 4 * 8, 8);
230
231 LD_SW2(const0 + 4 * 8, 4, k0, k1);
232 k2 = LD_SW(const0 + 4 * 10);
233 VP9_MADD_BF(g1, g3, g9, g11, k0, k1, k2, k0, h0, h1, h2, h3);
234
235 ST_SH2(h0, h1, int_buf + 8 * 8, 8);
236 ST_SH2(h3, h2, int_buf + 12 * 8, 8);
237
238 r9 = LD_SH(input + 9 * stride);
239 r6 = LD_SH(input + 6 * stride);
240 r1 = LD_SH(input + stride);
241 r14 = LD_SH(input + 14 * stride);
242 SLLI_4V(r9, r6, r1, r14, 2);
243
244 LD_SW2(const0 + 4 * 11, 4, k0, k1);
245 LD_SW2(const0 + 4 * 13, 4, k2, k3);
246 VP9_MADD_BF(r9, r6, r1, r14, k0, k1, k2, k3, g0, g1, g2, g3);
247
248 ST_SH2(g1, g3, int_buf + 3 * 8, 4 * 8);
249
250 r13 = LD_SH(input + 13 * stride);
251 r2 = LD_SH(input + 2 * stride);
252 r5 = LD_SH(input + 5 * stride);
253 r10 = LD_SH(input + 10 * stride);
254 SLLI_4V(r13, r2, r5, r10, 2);
255
256 LD_SW2(const0 + 4 * 15, 4, k0, k1);
257 LD_SW2(const0 + 4 * 17, 4, k2, k3);
258 VP9_MADD_BF(r13, r2, r5, r10, k0, k1, k2, k3, h0, h1, h2, h3);
259
260 ST_SH2(h1, h3, int_buf + 11 * 8, 4 * 8);
261
262 BUTTERFLY_4(h0, h2, g2, g0, tp0, tp1, tp2, tp3);
263 ST_SH4(tp0, tp1, tp2, tp3, int_buf + 2 * 8, 4 * 8);
264 }
265
266 static void fadst16_cols_step2_msa(int16_t *int_buf, const int32_t *const0,
267 int16_t *out) {
268 int16_t *out_ptr = out + 128;
269 v8i16 tp0, tp1, tp2, tp3, g5, g7, g13, g15;
270 v8i16 h0, h1, h2, h3, h4, h5, h6, h7, h10, h11;
271 v8i16 out0, out1, out2, out3, out4, out5, out6, out7;
272 v8i16 out8, out9, out10, out11, out12, out13, out14, out15;
273 v4i32 k0, k1, k2, k3;
274
275 LD_SH2(int_buf + 3 * 8, 4 * 8, g13, g15);
276 LD_SH2(int_buf + 11 * 8, 4 * 8, g5, g7);
277 LD_SW2(const0 + 4 * 19, 4, k0, k1);
278 k2 = LD_SW(const0 + 4 * 21);
279 VP9_MADD_BF(g7, g5, g15, g13, k0, k1, k2, k0, h4, h5, h6, h7);
280
281 tp0 = LD_SH(int_buf + 4 * 8);
282 tp1 = LD_SH(int_buf + 5 * 8);
283 tp3 = LD_SH(int_buf + 10 * 8);
284 tp2 = LD_SH(int_buf + 14 * 8);
285 LD_SW2(const0 + 4 * 22, 4, k0, k1);
286 k2 = LD_SW(const0 + 4 * 24);
287 VP9_MADD_BF(tp0, tp1, tp2, tp3, k0, k1, k2, k0, out4, out6, out5, out7);
288 out4 = -out4;
289 ST_SH(out4, (out + 3 * 16));
290 ST_SH(out5, (out_ptr + 4 * 16));
291
292 h1 = LD_SH(int_buf + 9 * 8);
293 h3 = LD_SH(int_buf + 12 * 8);
294 VP9_MADD_BF(h1, h3, h5, h7, k0, k1, k2, k0, out12, out14, out13, out15);
295 out13 = -out13;
296 ST_SH(out12, (out + 2 * 16));
297 ST_SH(out13, (out_ptr + 5 * 16));
298
299 tp0 = LD_SH(int_buf);
300 tp1 = LD_SH(int_buf + 8);
301 tp2 = LD_SH(int_buf + 2 * 8);
302 tp3 = LD_SH(int_buf + 6 * 8);
303
304 BUTTERFLY_4(tp0, tp1, tp3, tp2, out0, out1, h11, h10);
305 out1 = -out1;
306 ST_SH(out0, (out));
307 ST_SH(out1, (out_ptr + 7 * 16));
308
309 h0 = LD_SH(int_buf + 8 * 8);
310 h2 = LD_SH(int_buf + 13 * 8);
311
312 BUTTERFLY_4(h0, h2, h6, h4, out8, out9, out11, out10);
313 out8 = -out8;
314 ST_SH(out8, (out + 16));
315 ST_SH(out9, (out_ptr + 6 * 16));
316
317 /* stage 4 */
318 LD_SW2(const0 + 4 * 25, 4, k0, k1);
319 LD_SW2(const0 + 4 * 27, 4, k2, k3);
320 VP9_MADD_SHORT(h10, h11, k1, k2, out2, out3);
321 ST_SH(out2, (out + 7 * 16));
322 ST_SH(out3, (out_ptr));
323
324 VP9_MADD_SHORT(out6, out7, k0, k3, out6, out7);
325 ST_SH(out6, (out + 4 * 16));
326 ST_SH(out7, (out_ptr + 3 * 16));
327
328 VP9_MADD_SHORT(out10, out11, k0, k3, out10, out11);
329 ST_SH(out10, (out + 6 * 16));
330 ST_SH(out11, (out_ptr + 16));
331
332 VP9_MADD_SHORT(out14, out15, k1, k2, out14, out15);
333 ST_SH(out14, (out + 5 * 16));
334 ST_SH(out15, (out_ptr + 2 * 16));
335 }
336
337 static void fadst16_transpose_postproc_msa(int16_t *input, int16_t *out) {
338 v8i16 r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15;
339 v8i16 l0, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15;
340
341 /* load input data */
342 LD_SH8(input, 16, l0, l1, l2, l3, l4, l5, l6, l7);
343 TRANSPOSE8x8_SH_SH(l0, l1, l2, l3, l4, l5, l6, l7,
344 r0, r1, r2, r3, r4, r5, r6, r7);
345 VP9_FDCT_POSTPROC_2V_NEG_H(r0, r1);
346 VP9_FDCT_POSTPROC_2V_NEG_H(r2, r3);
347 VP9_FDCT_POSTPROC_2V_NEG_H(r4, r5);
348 VP9_FDCT_POSTPROC_2V_NEG_H(r6, r7);
349 ST_SH8(r0, r1, r2, r3, r4, r5, r6, r7, out, 8);
350 out += 64;
351
352 LD_SH8(input + 8, 16, l8, l9, l10, l11, l12, l13, l14, l15);
353 TRANSPOSE8x8_SH_SH(l8, l9, l10, l11, l12, l13, l14, l15,
354 r8, r9, r10, r11, r12, r13, r14, r15);
355 VP9_FDCT_POSTPROC_2V_NEG_H(r8, r9);
356 VP9_FDCT_POSTPROC_2V_NEG_H(r10, r11);
357 VP9_FDCT_POSTPROC_2V_NEG_H(r12, r13);
358 VP9_FDCT_POSTPROC_2V_NEG_H(r14, r15);
359 ST_SH8(r8, r9, r10, r11, r12, r13, r14, r15, out, 8);
360 out += 64;
361
362 /* load input data */
363 input += 128;
364 LD_SH8(input, 16, l0, l1, l2, l3, l4, l5, l6, l7);
365 TRANSPOSE8x8_SH_SH(l0, l1, l2, l3, l4, l5, l6, l7,
366 r0, r1, r2, r3, r4, r5, r6, r7);
367 VP9_FDCT_POSTPROC_2V_NEG_H(r0, r1);
368 VP9_FDCT_POSTPROC_2V_NEG_H(r2, r3);
369 VP9_FDCT_POSTPROC_2V_NEG_H(r4, r5);
370 VP9_FDCT_POSTPROC_2V_NEG_H(r6, r7);
371 ST_SH8(r0, r1, r2, r3, r4, r5, r6, r7, out, 8);
372 out += 64;
373
374 LD_SH8(input + 8, 16, l8, l9, l10, l11, l12, l13, l14, l15);
375 TRANSPOSE8x8_SH_SH(l8, l9, l10, l11, l12, l13, l14, l15,
376 r8, r9, r10, r11, r12, r13, r14, r15);
377 VP9_FDCT_POSTPROC_2V_NEG_H(r8, r9);
378 VP9_FDCT_POSTPROC_2V_NEG_H(r10, r11);
379 VP9_FDCT_POSTPROC_2V_NEG_H(r12, r13);
380 VP9_FDCT_POSTPROC_2V_NEG_H(r14, r15);
381 ST_SH8(r8, r9, r10, r11, r12, r13, r14, r15, out, 8);
382 }
383
384 static void fadst16_rows_step1_msa(int16_t *input, const int32_t *const0,
385 int16_t *int_buf) {
386 v8i16 r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15;
387 v8i16 tp0, tp1, tp2, tp3, g0, g1, g2, g3, g8, g9, g10, g11, h0, h1, h2, h3;
388 v4i32 k0, k1, k2, k3;
389
390 /* load input data */
391 r0 = LD_SH(input);
392 r7 = LD_SH(input + 7 * 8);
393 r8 = LD_SH(input + 8 * 8);
394 r15 = LD_SH(input + 15 * 8);
395
396 /* stage 1 */
397 LD_SW2(const0, 4, k0, k1);
398 LD_SW2(const0 + 4 * 2, 4, k2, k3);
399 VP9_MADD_BF(r15, r0, r7, r8, k0, k1, k2, k3, g0, g1, g2, g3);
400
401 r3 = LD_SH(input + 3 * 8);
402 r4 = LD_SH(input + 4 * 8);
403 r11 = LD_SH(input + 11 * 8);
404 r12 = LD_SH(input + 12 * 8);
405
406 LD_SW2(const0 + 4 * 4, 4, k0, k1);
407 LD_SW2(const0 + 4 * 6, 4, k2, k3);
408 VP9_MADD_BF(r11, r4, r3, r12, k0, k1, k2, k3, g8, g9, g10, g11);
409
410 /* stage 2 */
411 BUTTERFLY_4(g0, g2, g10, g8, tp0, tp2, tp3, tp1);
412 ST_SH2(tp0, tp1, int_buf, 4 * 8);
413 ST_SH2(tp2, tp3, int_buf + 8, 4 * 8);
414
415 LD_SW2(const0 + 4 * 8, 4, k0, k1);
416 k2 = LD_SW(const0 + 4 * 10);
417 VP9_MADD_BF(g1, g3, g9, g11, k0, k1, k2, k0, h0, h1, h2, h3);
418 ST_SH2(h0, h3, int_buf + 8 * 8, 4 * 8);
419 ST_SH2(h1, h2, int_buf + 9 * 8, 4 * 8);
420
421 r1 = LD_SH(input + 8);
422 r6 = LD_SH(input + 6 * 8);
423 r9 = LD_SH(input + 9 * 8);
424 r14 = LD_SH(input + 14 * 8);
425
426 LD_SW2(const0 + 4 * 11, 4, k0, k1);
427 LD_SW2(const0 + 4 * 13, 4, k2, k3);
428 VP9_MADD_BF(r9, r6, r1, r14, k0, k1, k2, k3, g0, g1, g2, g3);
429 ST_SH2(g1, g3, int_buf + 3 * 8, 4 * 8);
430
431 r2 = LD_SH(input + 2 * 8);
432 r5 = LD_SH(input + 5 * 8);
433 r10 = LD_SH(input + 10 * 8);
434 r13 = LD_SH(input + 13 * 8);
435
436 LD_SW2(const0 + 4 * 15, 4, k0, k1);
437 LD_SW2(const0 + 4 * 17, 4, k2, k3);
438 VP9_MADD_BF(r13, r2, r5, r10, k0, k1, k2, k3, h0, h1, h2, h3);
439 ST_SH2(h1, h3, int_buf + 11 * 8, 4 * 8);
440 BUTTERFLY_4(h0, h2, g2, g0, tp0, tp1, tp2, tp3);
441 ST_SH4(tp0, tp1, tp2, tp3, int_buf + 2 * 8, 4 * 8);
442 }
443
444 static void fadst16_rows_step2_msa(int16_t *int_buf, const int32_t *const0,
445 int16_t *out) {
446 int16_t *out_ptr = out + 8;
447 v8i16 tp0, tp1, tp2, tp3, g5, g7, g13, g15;
448 v8i16 h0, h1, h2, h3, h4, h5, h6, h7, h10, h11;
449 v8i16 out0, out1, out2, out3, out4, out5, out6, out7;
450 v8i16 out8, out9, out10, out11, out12, out13, out14, out15;
451 v4i32 k0, k1, k2, k3;
452
453 g13 = LD_SH(int_buf + 3 * 8);
454 g15 = LD_SH(int_buf + 7 * 8);
455 g5 = LD_SH(int_buf + 11 * 8);
456 g7 = LD_SH(int_buf + 15 * 8);
457
458 LD_SW2(const0 + 4 * 19, 4, k0, k1);
459 k2 = LD_SW(const0 + 4 * 21);
460 VP9_MADD_BF(g7, g5, g15, g13, k0, k1, k2, k0, h4, h5, h6, h7);
461
462 tp0 = LD_SH(int_buf + 4 * 8);
463 tp1 = LD_SH(int_buf + 5 * 8);
464 tp3 = LD_SH(int_buf + 10 * 8);
465 tp2 = LD_SH(int_buf + 14 * 8);
466
467 LD_SW2(const0 + 4 * 22, 4, k0, k1);
468 k2 = LD_SW(const0 + 4 * 24);
469 VP9_MADD_BF(tp0, tp1, tp2, tp3, k0, k1, k2, k0, out4, out6, out5, out7);
470 out4 = -out4;
471 ST_SH(out4, (out + 3 * 16));
472 ST_SH(out5, (out_ptr + 4 * 16));
473
474 h1 = LD_SH(int_buf + 9 * 8);
475 h3 = LD_SH(int_buf + 12 * 8);
476 VP9_MADD_BF(h1, h3, h5, h7, k0, k1, k2, k0, out12, out14, out13, out15);
477 out13 = -out13;
478 ST_SH(out12, (out + 2 * 16));
479 ST_SH(out13, (out_ptr + 5 * 16));
480
481 tp0 = LD_SH(int_buf);
482 tp1 = LD_SH(int_buf + 8);
483 tp2 = LD_SH(int_buf + 2 * 8);
484 tp3 = LD_SH(int_buf + 6 * 8);
485
486 BUTTERFLY_4(tp0, tp1, tp3, tp2, out0, out1, h11, h10);
487 out1 = -out1;
488 ST_SH(out0, (out));
489 ST_SH(out1, (out_ptr + 7 * 16));
490
491 h0 = LD_SH(int_buf + 8 * 8);
492 h2 = LD_SH(int_buf + 13 * 8);
493 BUTTERFLY_4(h0, h2, h6, h4, out8, out9, out11, out10);
494 out8 = -out8;
495 ST_SH(out8, (out + 16));
496 ST_SH(out9, (out_ptr + 6 * 16));
497
498 /* stage 4 */
499 LD_SW2(const0 + 4 * 25, 4, k0, k1);
500 LD_SW2(const0 + 4 * 27, 4, k2, k3);
501 VP9_MADD_SHORT(h10, h11, k1, k2, out2, out3);
502 ST_SH(out2, (out + 7 * 16));
503 ST_SH(out3, (out_ptr));
504
505 VP9_MADD_SHORT(out6, out7, k0, k3, out6, out7);
506 ST_SH(out6, (out + 4 * 16));
507 ST_SH(out7, (out_ptr + 3 * 16));
508
509 VP9_MADD_SHORT(out10, out11, k0, k3, out10, out11);
510 ST_SH(out10, (out + 6 * 16));
511 ST_SH(out11, (out_ptr + 16));
512
513 VP9_MADD_SHORT(out14, out15, k1, k2, out14, out15);
514 ST_SH(out14, (out + 5 * 16));
515 ST_SH(out15, (out_ptr + 2 * 16));
516 }
517
518 static void fadst16_transpose_msa(int16_t *input, int16_t *out) {
519 v8i16 r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15;
520 v8i16 l0, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15;
521
522 /* load input data */
523 LD_SH16(input, 8, l0, l8, l1, l9, l2, l10, l3, l11,
524 l4, l12, l5, l13, l6, l14, l7, l15);
525 TRANSPOSE8x8_SH_SH(l0, l1, l2, l3, l4, l5, l6, l7,
526 r0, r1, r2, r3, r4, r5, r6, r7);
527 TRANSPOSE8x8_SH_SH(l8, l9, l10, l11, l12, l13, l14, l15,
528 r8, r9, r10, r11, r12, r13, r14, r15);
529 ST_SH8(r0, r8, r1, r9, r2, r10, r3, r11, out, 8);
530 ST_SH8(r4, r12, r5, r13, r6, r14, r7, r15, (out + 64), 8);
531 out += 16 * 8;
532
533 /* load input data */
534 input += 128;
535 LD_SH16(input, 8, l0, l8, l1, l9, l2, l10, l3, l11,
536 l4, l12, l5, l13, l6, l14, l7, l15);
537 TRANSPOSE8x8_SH_SH(l0, l1, l2, l3, l4, l5, l6, l7,
538 r0, r1, r2, r3, r4, r5, r6, r7);
539 TRANSPOSE8x8_SH_SH(l8, l9, l10, l11, l12, l13, l14, l15,
540 r8, r9, r10, r11, r12, r13, r14, r15);
541 ST_SH8(r0, r8, r1, r9, r2, r10, r3, r11, out, 8);
542 ST_SH8(r4, r12, r5, r13, r6, r14, r7, r15, (out + 64), 8);
543 }
544
545 static void postproc_fdct16x8_1d_row(int16_t *intermediate, int16_t *output) {
546 int16_t *temp = intermediate;
547 int16_t *out = output;
548 v8i16 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
549 v8i16 in0, in1, in2, in3, in4, in5, in6, in7, in8, in9, in10, in11;
550 v8i16 in12, in13, in14, in15;
551
552 LD_SH8(temp, 16, in0, in1, in2, in3, in4, in5, in6, in7);
553 temp = intermediate + 8;
554 LD_SH8(temp, 16, in8, in9, in10, in11, in12, in13, in14, in15);
555 TRANSPOSE8x8_SH_SH(in0, in1, in2, in3, in4, in5, in6, in7,
556 in0, in1, in2, in3, in4, in5, in6, in7);
557 TRANSPOSE8x8_SH_SH(in8, in9, in10, in11, in12, in13, in14, in15,
558 in8, in9, in10, in11, in12, in13, in14, in15);
559 VP9_FDCT_POSTPROC_2V_NEG_H(in0, in1);
560 VP9_FDCT_POSTPROC_2V_NEG_H(in2, in3);
561 VP9_FDCT_POSTPROC_2V_NEG_H(in4, in5);
562 VP9_FDCT_POSTPROC_2V_NEG_H(in6, in7);
563 VP9_FDCT_POSTPROC_2V_NEG_H(in8, in9);
564 VP9_FDCT_POSTPROC_2V_NEG_H(in10, in11);
565 VP9_FDCT_POSTPROC_2V_NEG_H(in12, in13);
566 VP9_FDCT_POSTPROC_2V_NEG_H(in14, in15);
567 BUTTERFLY_16(in0, in1, in2, in3, in4, in5, in6, in7,
568 in8, in9, in10, in11, in12, in13, in14, in15,
569 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7,
570 in8, in9, in10, in11, in12, in13, in14, in15);
571 temp = intermediate;
572 ST_SH8(in8, in9, in10, in11, in12, in13, in14, in15, temp, 16);
573 VP9_FDCT8x16_EVEN(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7,
574 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7);
575 temp = intermediate;
576 LD_SH8(temp, 16, in8, in9, in10, in11, in12, in13, in14, in15);
577 VP9_FDCT8x16_ODD(in8, in9, in10, in11, in12, in13, in14, in15,
578 in0, in1, in2, in3, in4, in5, in6, in7);
579 TRANSPOSE8x8_SH_SH(tmp0, in0, tmp1, in1, tmp2, in2, tmp3, in3,
580 tmp0, in0, tmp1, in1, tmp2, in2, tmp3, in3);
581 ST_SH8(tmp0, in0, tmp1, in1, tmp2, in2, tmp3, in3, out, 16);
582 TRANSPOSE8x8_SH_SH(tmp4, in4, tmp5, in5, tmp6, in6, tmp7, in7,
583 tmp4, in4, tmp5, in5, tmp6, in6, tmp7, in7);
584 out = output + 8;
585 ST_SH8(tmp4, in4, tmp5, in5, tmp6, in6, tmp7, in7, out, 16);
586 }
587
588 void vp9_fht16x16_msa(const int16_t *input, int16_t *output,
589 int32_t stride, int32_t tx_type) {
590 DECLARE_ALIGNED(32, int16_t, tmp[256]);
591 DECLARE_ALIGNED(32, int16_t, trans_buf[256]);
592 DECLARE_ALIGNED(32, int16_t, tmp_buf[128]);
593 int32_t i;
594 int16_t *ptmpbuf = &tmp_buf[0];
595 int16_t *trans = &trans_buf[0];
596 const int32_t const_arr[29 * 4] = {
597 52707308, 52707308, 52707308, 52707308,
598 -1072430300, -1072430300, -1072430300, -1072430300,
599 795618043, 795618043, 795618043, 795618043,
600 -721080468, -721080468, -721080468, -721080468,
601 459094491, 459094491, 459094491, 459094491,
602 -970646691, -970646691, -970646691, -970646691,
603 1010963856, 1010963856, 1010963856, 1010963856,
604 -361743294, -361743294, -361743294, -361743294,
605 209469125, 209469125, 209469125, 209469125,
606 -1053094788, -1053094788, -1053094788, -1053094788,
607 1053160324, 1053160324, 1053160324, 1053160324,
608 639644520, 639644520, 639644520, 639644520,
609 -862444000, -862444000, -862444000, -862444000,
610 1062144356, 1062144356, 1062144356, 1062144356,
611 -157532337, -157532337, -157532337, -157532337,
612 260914709, 260914709, 260914709, 260914709,
613 -1041559667, -1041559667, -1041559667, -1041559667,
614 920985831, 920985831, 920985831, 920985831,
615 -551995675, -551995675, -551995675, -551995675,
616 596522295, 596522295, 596522295, 596522295,
617 892853362, 892853362, 892853362, 892853362,
618 -892787826, -892787826, -892787826, -892787826,
619 410925857, 410925857, 410925857, 410925857,
620 -992012162, -992012162, -992012162, -992012162,
621 992077698, 992077698, 992077698, 992077698,
622 759246145, 759246145, 759246145, 759246145,
623 -759180609, -759180609, -759180609, -759180609,
624 -759222975, -759222975, -759222975, -759222975,
625 759288511, 759288511, 759288511, 759288511 };
626
627 switch (tx_type) {
628 case DCT_DCT:
629 /* column transform */
630 for (i = 0; i < 2; ++i) {
631 fdct8x16_1d_column(input + 8 * i, tmp + 8 * i, stride);
632 }
633
634 /* row transform */
635 for (i = 0; i < 2; ++i) {
636 fdct16x8_1d_row(tmp + (128 * i), output + (128 * i));
637 }
638 break;
639 case ADST_DCT:
640 /* column transform */
641 for (i = 0; i < 2; ++i) {
642 fadst16_cols_step1_msa(input + (i << 3), stride, const_arr, ptmpbuf);
643 fadst16_cols_step2_msa(ptmpbuf, const_arr, tmp + (i << 3));
644 }
645
646 /* row transform */
647 for (i = 0; i < 2; ++i) {
648 postproc_fdct16x8_1d_row(tmp + (128 * i), output + (128 * i));
649 }
650 break;
651 case DCT_ADST:
652 /* column transform */
653 for (i = 0; i < 2; ++i) {
654 fdct8x16_1d_column(input + 8 * i, tmp + 8 * i, stride);
655 }
656
657 fadst16_transpose_postproc_msa(tmp, trans);
658
659 /* row transform */
660 for (i = 0; i < 2; ++i) {
661 fadst16_rows_step1_msa(trans + (i << 7), const_arr, ptmpbuf);
662 fadst16_rows_step2_msa(ptmpbuf, const_arr, tmp + (i << 7));
663 }
664
665 fadst16_transpose_msa(tmp, output);
666 break;
667 case ADST_ADST:
668 /* column transform */
669 for (i = 0; i < 2; ++i) {
670 fadst16_cols_step1_msa(input + (i << 3), stride, const_arr, ptmpbuf);
671 fadst16_cols_step2_msa(ptmpbuf, const_arr, tmp + (i << 3));
672 }
673
674 fadst16_transpose_postproc_msa(tmp, trans);
675
676 /* row transform */
677 for (i = 0; i < 2; ++i) {
678 fadst16_rows_step1_msa(trans + (i << 7), const_arr, ptmpbuf);
679 fadst16_rows_step2_msa(ptmpbuf, const_arr, tmp + (i << 7));
680 }
681
682 fadst16_transpose_msa(tmp, output);
683 break;
684 default:
685 assert(0);
686 break;
687 }
688 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/mips/msa/vp9_error_msa.c ('k') | source/libvpx/vp9/encoder/mips/msa/vp9_fdct32x32_msa.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698