1 /*
2  * motion_comp_vis.c
3  * Copyright (C) 2003 David S. Miller <davem@redhat.com>
4  *
5  * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
6  * See http://libmpeg2.sourceforge.net/ for updates.
7  *
8  * mpeg2dec is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * mpeg2dec is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
21  */
22 
23 #include "config.h"
24 
25 #if defined(ARCH_SPARC) && defined(ENABLE_VIS)
26 
27 #include <inttypes.h>
28 
29 #include "mpeg2_internal.h"
30 #include "vis.h"
31 
32 /* The trick used in some of this file is the formula from the MMX
33  * motion comp code, which is:
34  *
35  * (x+y+1)>>1 == (x|y)-((x^y)>>1)
36  *
37  * This allows us to average 8 bytes at a time in a 64-bit FPU reg.
38  * We avoid overflows by masking before we do the shift, and we
39  * implement the shift by multiplying by 1/2 using mul8x16.  So in
40  * VIS this is (assume 'x' is in f0, 'y' is in f2, a repeating mask
41  * of '0xfe' is in f4, a repeating mask of '0x7f' is in f6, and
42  * the value 0x80808080 is in f8):
43  *
44  *	fxor		f0, f2, f10
45  *	fand		f10, f4, f10
46  *	fmul8x16	f8, f10, f10
47  *	fand		f10, f6, f10
48  *	for		f0, f2, f12
49  *	fpsub16		f12, f10, f10
50  */
51 
52 #define DUP4(x) {x, x, x, x}
53 #define DUP8(x) {x, x, x, x, x, x, x, x}
54 static const int16_t constants1[] ATTR_ALIGN(8) = DUP4 (1);
55 static const int16_t constants2[] ATTR_ALIGN(8) = DUP4 (2);
56 static const int16_t constants3[] ATTR_ALIGN(8) = DUP4 (3);
57 static const int16_t constants6[] ATTR_ALIGN(8) = DUP4 (6);
58 static const int8_t constants_fe[] ATTR_ALIGN(8) = DUP8 (0xfe);
59 static const int8_t constants_7f[] ATTR_ALIGN(8) = DUP8 (0x7f);
60 static const int8_t constants128[] ATTR_ALIGN(8) = DUP8 (128);
61 static const int16_t constants256_512[] ATTR_ALIGN(8) =
62 	{256, 512, 256, 512};
63 static const int16_t constants256_1024[] ATTR_ALIGN(8) =
64 	{256, 1024, 256, 1024};
65 
66 #define REF_0		0
67 #define REF_0_1		1
68 #define REF_2		2
69 #define REF_2_1		3
70 #define REF_4		4
71 #define REF_4_1		5
72 #define REF_6		6
73 #define REF_6_1		7
74 #define REF_S0		8
75 #define REF_S0_1	9
76 #define REF_S2		10
77 #define REF_S2_1	11
78 #define REF_S4		12
79 #define REF_S4_1	13
80 #define REF_S6		14
81 #define REF_S6_1	15
82 #define DST_0		16
83 #define DST_1		17
84 #define DST_2		18
85 #define DST_3		19
86 #define CONST_1		20
87 #define CONST_2		20
88 #define CONST_3		20
89 #define CONST_6		20
90 #define MASK_fe		20
91 #define CONST_128	22
92 #define CONST_256	22
93 #define CONST_512	22
94 #define CONST_1024	22
95 #define TMP0		24
96 #define TMP1		25
97 #define TMP2		26
98 #define TMP3		27
99 #define TMP4		28
100 #define TMP5		29
101 #define ZERO		30
102 #define MASK_7f		30
103 
104 #define TMP6		32
105 #define TMP8		34
106 #define TMP10		36
107 #define TMP12		38
108 #define TMP14		40
109 #define TMP16		42
110 #define TMP18		44
111 #define TMP20		46
112 #define TMP22		48
113 #define TMP24		50
114 #define TMP26		52
115 #define TMP28		54
116 #define TMP30		56
117 #define TMP32		58
118 
MC_put_o_16_vis(uint8_t * dest,uint8_t * _ref,int stride,int height)119 static void MC_put_o_16_vis (uint8_t * dest, uint8_t * _ref,
120 			     int stride, int height)
121 {
122 	uint8_t *ref = (uint8_t *) _ref;
123 	int offset;
124 
125 	ref = vis_alignaddr(ref);
126 	offset = (ref != _ref) ? 16 : 0;
127 	do {	/* 5 cycles */
128 		vis_ld64(ref[0], TMP0);
129 
130 		vis_ld64_2(ref, 8, TMP2);
131 
132 		vis_ld64_2(ref, offset, TMP4);
133 		ref += stride;
134 
135 		vis_faligndata(TMP0, TMP2, REF_0);
136 		vis_st64(REF_0, dest[0]);
137 
138 		vis_faligndata(TMP2, TMP4, REF_2);
139 		vis_st64_2(REF_2, dest, 8);
140 		dest += stride;
141 	} while (--height);
142 }
143 
MC_put_o_8_vis(uint8_t * dest,uint8_t * _ref,int stride,int height)144 static void MC_put_o_8_vis (uint8_t * dest, uint8_t * _ref,
145 			    int stride, int height)
146 {
147 	uint8_t *ref = (uint8_t *) _ref;
148 	int offset;
149 
150 	ref = vis_alignaddr(ref);
151 	offset = (ref != _ref) ? 8 : 0;
152 	do {	/* 4 cycles */
153 		vis_ld64(ref[0], TMP0);
154 
155 		vis_ld64_2(ref, offset, TMP2);
156 		ref += stride;
157 
158 		/* stall */
159 
160 		vis_faligndata(TMP0, TMP2, REF_0);
161 		vis_st64(REF_0, dest[0]);
162 		dest += stride;
163 	} while (--height);
164 }
165 
166 
MC_avg_o_16_vis(uint8_t * dest,uint8_t * _ref,int stride,int height)167 static void MC_avg_o_16_vis (uint8_t * dest, uint8_t * _ref,
168 			     int stride, int height)
169 {
170 	uint8_t *ref = (uint8_t *) _ref;
171 	int stride_8 = stride + 8;
172 	int offset;
173 
174 	ref = vis_alignaddr(ref);
175 	offset = (ref != _ref) ? 16 : 0;
176 
177 	vis_ld64(ref[0], TMP0);
178 
179 	vis_ld64(ref[8], TMP2);
180 
181 	vis_ld64_2(ref, offset, TMP4);
182 
183 	vis_ld64(dest[0], DST_0);
184 
185 	vis_ld64(dest[8], DST_2);
186 
187 	vis_ld64(constants_fe[0], MASK_fe);
188 	vis_faligndata(TMP0, TMP2, REF_0);
189 
190 	vis_ld64(constants_7f[0], MASK_7f);
191 	vis_faligndata(TMP2, TMP4, REF_2);
192 
193 	vis_ld64(constants128[0], CONST_128);
194 
195 	ref += stride;
196 	height = (height >> 1) - 1;
197 
198 	do {	/* 24 cycles */
199 		vis_ld64(ref[0], TMP0);
200 		vis_xor(DST_0, REF_0, TMP6);
201 
202 		vis_ld64_2(ref, 8, TMP2);
203 		vis_and(TMP6, MASK_fe, TMP6);
204 
205 		vis_ld64_2(ref, offset, TMP4);
206 		ref += stride;
207 		vis_mul8x16(CONST_128, TMP6, TMP6);
208 		vis_xor(DST_2, REF_2, TMP8);
209 
210 		vis_and(TMP8, MASK_fe, TMP8);
211 
212 		vis_or(DST_0, REF_0, TMP10);
213 		vis_ld64_2(dest, stride, DST_0);
214 		vis_mul8x16(CONST_128, TMP8, TMP8);
215 
216 		vis_or(DST_2, REF_2, TMP12);
217 		vis_ld64_2(dest, stride_8, DST_2);
218 
219 		vis_ld64(ref[0], TMP14);
220 		vis_and(TMP6, MASK_7f, TMP6);
221 
222 		vis_and(TMP8, MASK_7f, TMP8);
223 
224 		vis_psub16(TMP10, TMP6, TMP6);
225 		vis_st64(TMP6, dest[0]);
226 
227 		vis_psub16(TMP12, TMP8, TMP8);
228 		vis_st64_2(TMP8, dest, 8);
229 
230 		dest += stride;
231 		vis_ld64_2(ref, 8, TMP16);
232 		vis_faligndata(TMP0, TMP2, REF_0);
233 
234 		vis_ld64_2(ref, offset, TMP18);
235 		vis_faligndata(TMP2, TMP4, REF_2);
236 		ref += stride;
237 
238 		vis_xor(DST_0, REF_0, TMP20);
239 
240 		vis_and(TMP20, MASK_fe, TMP20);
241 
242 		vis_xor(DST_2, REF_2, TMP22);
243 		vis_mul8x16(CONST_128, TMP20, TMP20);
244 
245 		vis_and(TMP22, MASK_fe, TMP22);
246 
247 		vis_or(DST_0, REF_0, TMP24);
248 		vis_mul8x16(CONST_128, TMP22, TMP22);
249 
250 		vis_or(DST_2, REF_2, TMP26);
251 
252 		vis_ld64_2(dest, stride, DST_0);
253 		vis_faligndata(TMP14, TMP16, REF_0);
254 
255 		vis_ld64_2(dest, stride_8, DST_2);
256 		vis_faligndata(TMP16, TMP18, REF_2);
257 
258 		vis_and(TMP20, MASK_7f, TMP20);
259 
260 		vis_and(TMP22, MASK_7f, TMP22);
261 
262 		vis_psub16(TMP24, TMP20, TMP20);
263 		vis_st64(TMP20, dest[0]);
264 
265 		vis_psub16(TMP26, TMP22, TMP22);
266 		vis_st64_2(TMP22, dest, 8);
267 		dest += stride;
268 	} while (--height);
269 
270 	vis_ld64(ref[0], TMP0);
271 	vis_xor(DST_0, REF_0, TMP6);
272 
273 	vis_ld64_2(ref, 8, TMP2);
274 	vis_and(TMP6, MASK_fe, TMP6);
275 
276 	vis_ld64_2(ref, offset, TMP4);
277 	vis_mul8x16(CONST_128, TMP6, TMP6);
278 	vis_xor(DST_2, REF_2, TMP8);
279 
280 	vis_and(TMP8, MASK_fe, TMP8);
281 
282 	vis_or(DST_0, REF_0, TMP10);
283 	vis_ld64_2(dest, stride, DST_0);
284 	vis_mul8x16(CONST_128, TMP8, TMP8);
285 
286 	vis_or(DST_2, REF_2, TMP12);
287 	vis_ld64_2(dest, stride_8, DST_2);
288 
289 	vis_ld64(ref[0], TMP14);
290 	vis_and(TMP6, MASK_7f, TMP6);
291 
292 	vis_and(TMP8, MASK_7f, TMP8);
293 
294 	vis_psub16(TMP10, TMP6, TMP6);
295 	vis_st64(TMP6, dest[0]);
296 
297 	vis_psub16(TMP12, TMP8, TMP8);
298 	vis_st64_2(TMP8, dest, 8);
299 
300 	dest += stride;
301 	vis_faligndata(TMP0, TMP2, REF_0);
302 
303 	vis_faligndata(TMP2, TMP4, REF_2);
304 
305 	vis_xor(DST_0, REF_0, TMP20);
306 
307 	vis_and(TMP20, MASK_fe, TMP20);
308 
309 	vis_xor(DST_2, REF_2, TMP22);
310 	vis_mul8x16(CONST_128, TMP20, TMP20);
311 
312 	vis_and(TMP22, MASK_fe, TMP22);
313 
314 	vis_or(DST_0, REF_0, TMP24);
315 	vis_mul8x16(CONST_128, TMP22, TMP22);
316 
317 	vis_or(DST_2, REF_2, TMP26);
318 
319 	vis_and(TMP20, MASK_7f, TMP20);
320 
321 	vis_and(TMP22, MASK_7f, TMP22);
322 
323 	vis_psub16(TMP24, TMP20, TMP20);
324 	vis_st64(TMP20, dest[0]);
325 
326 	vis_psub16(TMP26, TMP22, TMP22);
327 	vis_st64_2(TMP22, dest, 8);
328 }
329 
MC_avg_o_8_vis(uint8_t * dest,uint8_t * _ref,int stride,int height)330 static void MC_avg_o_8_vis (uint8_t * dest, uint8_t * _ref,
331 			    int stride, int height)
332 {
333 	uint8_t *ref = (uint8_t *) _ref;
334 	int offset;
335 
336 	ref = vis_alignaddr(ref);
337 	offset = (ref != _ref) ? 8 : 0;
338 
339 	vis_ld64(ref[0], TMP0);
340 
341 	vis_ld64_2(ref, offset, TMP2);
342 
343 	vis_ld64(dest[0], DST_0);
344 
345 	vis_ld64(constants_fe[0], MASK_fe);
346 
347 	vis_ld64(constants_7f[0], MASK_7f);
348 	vis_faligndata(TMP0, TMP2, REF_0);
349 
350 	vis_ld64(constants128[0], CONST_128);
351 
352 	ref += stride;
353 	height = (height >> 1) - 1;
354 
355 	do {	/* 12 cycles */
356 		vis_ld64(ref[0], TMP0);
357 		vis_xor(DST_0, REF_0, TMP4);
358 
359 		vis_ld64_2(ref, offset, TMP2);
360 		vis_and(TMP4, MASK_fe, TMP4);
361 
362 		vis_or(DST_0, REF_0, TMP6);
363 		vis_ld64_2(dest, stride, DST_0);
364 		ref += stride;
365 		vis_mul8x16(CONST_128, TMP4, TMP4);
366 
367 		vis_ld64(ref[0], TMP12);
368 		vis_faligndata(TMP0, TMP2, REF_0);
369 
370 		vis_ld64_2(ref, offset, TMP2);
371 		vis_xor(DST_0, REF_0, TMP0);
372 		ref += stride;
373 
374 		vis_and(TMP0, MASK_fe, TMP0);
375 
376 		vis_and(TMP4, MASK_7f, TMP4);
377 
378 		vis_psub16(TMP6, TMP4, TMP4);
379 		vis_st64(TMP4, dest[0]);
380 		dest += stride;
381 		vis_mul8x16(CONST_128, TMP0, TMP0);
382 
383 		vis_or(DST_0, REF_0, TMP6);
384 		vis_ld64_2(dest, stride, DST_0);
385 
386 		vis_faligndata(TMP12, TMP2, REF_0);
387 
388 		vis_and(TMP0, MASK_7f, TMP0);
389 
390 		vis_psub16(TMP6, TMP0, TMP4);
391 		vis_st64(TMP4, dest[0]);
392 		dest += stride;
393 	} while (--height);
394 
395 	vis_ld64(ref[0], TMP0);
396 	vis_xor(DST_0, REF_0, TMP4);
397 
398 	vis_ld64_2(ref, offset, TMP2);
399 	vis_and(TMP4, MASK_fe, TMP4);
400 
401 	vis_or(DST_0, REF_0, TMP6);
402 	vis_ld64_2(dest, stride, DST_0);
403 	vis_mul8x16(CONST_128, TMP4, TMP4);
404 
405 	vis_faligndata(TMP0, TMP2, REF_0);
406 
407 	vis_xor(DST_0, REF_0, TMP0);
408 
409 	vis_and(TMP0, MASK_fe, TMP0);
410 
411 	vis_and(TMP4, MASK_7f, TMP4);
412 
413 	vis_psub16(TMP6, TMP4, TMP4);
414 	vis_st64(TMP4, dest[0]);
415 	dest += stride;
416 	vis_mul8x16(CONST_128, TMP0, TMP0);
417 
418 	vis_or(DST_0, REF_0, TMP6);
419 
420 	vis_and(TMP0, MASK_7f, TMP0);
421 
422 	vis_psub16(TMP6, TMP0, TMP4);
423 	vis_st64(TMP4, dest[0]);
424 }
425 
MC_put_x_16_vis(uint8_t * dest,uint8_t * _ref,int stride,int height)426 static void MC_put_x_16_vis (uint8_t * dest, uint8_t * _ref,
427 			     int stride, int height)
428 {
429 	uint8_t *ref = (uint8_t *) _ref;
430 	unsigned long off = (unsigned long) ref & 0x7;
431 	unsigned long off_plus_1 = off + 1;
432 
433 	ref = vis_alignaddr(ref);
434 
435 	vis_ld64(ref[0],    TMP0);
436 
437 	vis_ld64_2(ref, 8,  TMP2);
438 
439 	vis_ld64_2(ref, 16, TMP4);
440 
441 	vis_ld64(constants_fe[0], MASK_fe);
442 
443 	vis_ld64(constants_7f[0], MASK_7f);
444 	vis_faligndata(TMP0, TMP2, REF_0);
445 
446 	vis_ld64(constants128[0], CONST_128);
447 	vis_faligndata(TMP2, TMP4, REF_4);
448 
449 	if (off != 0x7) {
450 		vis_alignaddr_g0((void *)off_plus_1);
451 		vis_faligndata(TMP0, TMP2, REF_2);
452 		vis_faligndata(TMP2, TMP4, REF_6);
453 	} else {
454 		vis_src1(TMP2, REF_2);
455 		vis_src1(TMP4, REF_6);
456 	}
457 
458 	ref += stride;
459 	height = (height >> 1) - 1;
460 
461 	do {	/* 34 cycles */
462 		vis_ld64(ref[0],    TMP0);
463 		vis_xor(REF_0, REF_2, TMP6);
464 
465 		vis_ld64_2(ref, 8,  TMP2);
466 		vis_xor(REF_4, REF_6, TMP8);
467 
468 		vis_ld64_2(ref, 16, TMP4);
469 		vis_and(TMP6, MASK_fe, TMP6);
470 		ref += stride;
471 
472 		vis_ld64(ref[0],    TMP14);
473 		vis_mul8x16(CONST_128, TMP6, TMP6);
474 		vis_and(TMP8, MASK_fe, TMP8);
475 
476 		vis_ld64_2(ref, 8,  TMP16);
477 		vis_mul8x16(CONST_128, TMP8, TMP8);
478 		vis_or(REF_0, REF_2, TMP10);
479 
480 		vis_ld64_2(ref, 16, TMP18);
481 		ref += stride;
482 		vis_or(REF_4, REF_6, TMP12);
483 
484 		vis_alignaddr_g0((void *)off);
485 
486 		vis_faligndata(TMP0, TMP2, REF_0);
487 
488 		vis_faligndata(TMP2, TMP4, REF_4);
489 
490 		if (off != 0x7) {
491 			vis_alignaddr_g0((void *)off_plus_1);
492 			vis_faligndata(TMP0, TMP2, REF_2);
493 			vis_faligndata(TMP2, TMP4, REF_6);
494 		} else {
495 			vis_src1(TMP2, REF_2);
496 			vis_src1(TMP4, REF_6);
497 		}
498 
499 		vis_and(TMP6, MASK_7f, TMP6);
500 
501 		vis_and(TMP8, MASK_7f, TMP8);
502 
503 		vis_psub16(TMP10, TMP6, TMP6);
504 		vis_st64(TMP6, dest[0]);
505 
506 		vis_psub16(TMP12, TMP8, TMP8);
507 		vis_st64_2(TMP8, dest, 8);
508 		dest += stride;
509 
510 		vis_xor(REF_0, REF_2, TMP6);
511 
512 		vis_xor(REF_4, REF_6, TMP8);
513 
514 		vis_and(TMP6, MASK_fe, TMP6);
515 
516 		vis_mul8x16(CONST_128, TMP6, TMP6);
517 		vis_and(TMP8, MASK_fe, TMP8);
518 
519 		vis_mul8x16(CONST_128, TMP8, TMP8);
520 		vis_or(REF_0, REF_2, TMP10);
521 
522 		vis_or(REF_4, REF_6, TMP12);
523 
524 		vis_alignaddr_g0((void *)off);
525 
526 		vis_faligndata(TMP14, TMP16, REF_0);
527 
528 		vis_faligndata(TMP16, TMP18, REF_4);
529 
530 		if (off != 0x7) {
531 			vis_alignaddr_g0((void *)off_plus_1);
532 			vis_faligndata(TMP14, TMP16, REF_2);
533 			vis_faligndata(TMP16, TMP18, REF_6);
534 		} else {
535 			vis_src1(TMP16, REF_2);
536 			vis_src1(TMP18, REF_6);
537 		}
538 
539 		vis_and(TMP6, MASK_7f, TMP6);
540 
541 		vis_and(TMP8, MASK_7f, TMP8);
542 
543 		vis_psub16(TMP10, TMP6, TMP6);
544 		vis_st64(TMP6, dest[0]);
545 
546 		vis_psub16(TMP12, TMP8, TMP8);
547 		vis_st64_2(TMP8, dest, 8);
548 		dest += stride;
549 	} while (--height);
550 
551 	vis_ld64(ref[0],    TMP0);
552 	vis_xor(REF_0, REF_2, TMP6);
553 
554 	vis_ld64_2(ref, 8,  TMP2);
555 	vis_xor(REF_4, REF_6, TMP8);
556 
557 	vis_ld64_2(ref, 16, TMP4);
558 	vis_and(TMP6, MASK_fe, TMP6);
559 
560 	vis_mul8x16(CONST_128, TMP6, TMP6);
561 	vis_and(TMP8, MASK_fe, TMP8);
562 
563 	vis_mul8x16(CONST_128, TMP8, TMP8);
564 	vis_or(REF_0, REF_2, TMP10);
565 
566 	vis_or(REF_4, REF_6, TMP12);
567 
568 	vis_alignaddr_g0((void *)off);
569 
570 	vis_faligndata(TMP0, TMP2, REF_0);
571 
572 	vis_faligndata(TMP2, TMP4, REF_4);
573 
574 	if (off != 0x7) {
575 		vis_alignaddr_g0((void *)off_plus_1);
576 		vis_faligndata(TMP0, TMP2, REF_2);
577 		vis_faligndata(TMP2, TMP4, REF_6);
578 	} else {
579 		vis_src1(TMP2, REF_2);
580 		vis_src1(TMP4, REF_6);
581 	}
582 
583 	vis_and(TMP6, MASK_7f, TMP6);
584 
585 	vis_and(TMP8, MASK_7f, TMP8);
586 
587 	vis_psub16(TMP10, TMP6, TMP6);
588 	vis_st64(TMP6, dest[0]);
589 
590 	vis_psub16(TMP12, TMP8, TMP8);
591 	vis_st64_2(TMP8, dest, 8);
592 	dest += stride;
593 
594 	vis_xor(REF_0, REF_2, TMP6);
595 
596 	vis_xor(REF_4, REF_6, TMP8);
597 
598 	vis_and(TMP6, MASK_fe, TMP6);
599 
600 	vis_mul8x16(CONST_128, TMP6, TMP6);
601 	vis_and(TMP8, MASK_fe, TMP8);
602 
603 	vis_mul8x16(CONST_128, TMP8, TMP8);
604 	vis_or(REF_0, REF_2, TMP10);
605 
606 	vis_or(REF_4, REF_6, TMP12);
607 
608 	vis_and(TMP6, MASK_7f, TMP6);
609 
610 	vis_and(TMP8, MASK_7f, TMP8);
611 
612 	vis_psub16(TMP10, TMP6, TMP6);
613 	vis_st64(TMP6, dest[0]);
614 
615 	vis_psub16(TMP12, TMP8, TMP8);
616 	vis_st64_2(TMP8, dest, 8);
617 }
618 
MC_put_x_8_vis(uint8_t * dest,uint8_t * _ref,int stride,int height)619 static void MC_put_x_8_vis (uint8_t * dest, uint8_t * _ref,
620 			    int stride, int height)
621 {
622 	uint8_t *ref = (uint8_t *) _ref;
623 	unsigned long off = (unsigned long) ref & 0x7;
624 	unsigned long off_plus_1 = off + 1;
625 
626 	ref = vis_alignaddr(ref);
627 
628 	vis_ld64(ref[0], TMP0);
629 
630 	vis_ld64(ref[8], TMP2);
631 
632 	vis_ld64(constants_fe[0], MASK_fe);
633 
634 	vis_ld64(constants_7f[0], MASK_7f);
635 
636 	vis_ld64(constants128[0], CONST_128);
637 	vis_faligndata(TMP0, TMP2, REF_0);
638 
639 	if (off != 0x7) {
640 		vis_alignaddr_g0((void *)off_plus_1);
641 		vis_faligndata(TMP0, TMP2, REF_2);
642 	} else {
643 		vis_src1(TMP2, REF_2);
644 	}
645 
646 	ref += stride;
647 	height = (height >> 1) - 1;
648 
649 	do {	/* 20 cycles */
650 		vis_ld64(ref[0], TMP0);
651 		vis_xor(REF_0, REF_2, TMP4);
652 
653 		vis_ld64_2(ref, 8, TMP2);
654 		vis_and(TMP4, MASK_fe, TMP4);
655 		ref += stride;
656 
657 		vis_ld64(ref[0], TMP8);
658 		vis_or(REF_0, REF_2, TMP6);
659 		vis_mul8x16(CONST_128, TMP4, TMP4);
660 
661 		vis_alignaddr_g0((void *)off);
662 
663 		vis_ld64_2(ref, 8, TMP10);
664 		ref += stride;
665 		vis_faligndata(TMP0, TMP2, REF_0);
666 
667 		if (off != 0x7) {
668 			vis_alignaddr_g0((void *)off_plus_1);
669 			vis_faligndata(TMP0, TMP2, REF_2);
670 		} else {
671 			vis_src1(TMP2, REF_2);
672 		}
673 
674 		vis_and(TMP4, MASK_7f, TMP4);
675 
676 		vis_psub16(TMP6, TMP4, DST_0);
677 		vis_st64(DST_0, dest[0]);
678 		dest += stride;
679 
680 		vis_xor(REF_0, REF_2, TMP12);
681 
682 		vis_and(TMP12, MASK_fe, TMP12);
683 
684 		vis_or(REF_0, REF_2, TMP14);
685 		vis_mul8x16(CONST_128, TMP12, TMP12);
686 
687 		vis_alignaddr_g0((void *)off);
688 		vis_faligndata(TMP8, TMP10, REF_0);
689 		if (off != 0x7) {
690 			vis_alignaddr_g0((void *)off_plus_1);
691 			vis_faligndata(TMP8, TMP10, REF_2);
692 		} else {
693 			vis_src1(TMP10, REF_2);
694 		}
695 
696 		vis_and(TMP12, MASK_7f, TMP12);
697 
698 		vis_psub16(TMP14, TMP12, DST_0);
699 		vis_st64(DST_0, dest[0]);
700 		dest += stride;
701 	} while (--height);
702 
703 	vis_ld64(ref[0], TMP0);
704 	vis_xor(REF_0, REF_2, TMP4);
705 
706 	vis_ld64_2(ref, 8, TMP2);
707 	vis_and(TMP4, MASK_fe, TMP4);
708 
709 	vis_or(REF_0, REF_2, TMP6);
710 	vis_mul8x16(CONST_128, TMP4, TMP4);
711 
712 	vis_alignaddr_g0((void *)off);
713 
714 	vis_faligndata(TMP0, TMP2, REF_0);
715 
716 	if (off != 0x7) {
717 		vis_alignaddr_g0((void *)off_plus_1);
718 		vis_faligndata(TMP0, TMP2, REF_2);
719 	} else {
720 		vis_src1(TMP2, REF_2);
721 	}
722 
723 	vis_and(TMP4, MASK_7f, TMP4);
724 
725 	vis_psub16(TMP6, TMP4, DST_0);
726 	vis_st64(DST_0, dest[0]);
727 	dest += stride;
728 
729 	vis_xor(REF_0, REF_2, TMP12);
730 
731 	vis_and(TMP12, MASK_fe, TMP12);
732 
733 	vis_or(REF_0, REF_2, TMP14);
734 	vis_mul8x16(CONST_128, TMP12, TMP12);
735 
736 	vis_and(TMP12, MASK_7f, TMP12);
737 
738 	vis_psub16(TMP14, TMP12, DST_0);
739 	vis_st64(DST_0, dest[0]);
740 	dest += stride;
741 }
742 
MC_avg_x_16_vis(uint8_t * dest,uint8_t * _ref,int stride,int height)743 static void MC_avg_x_16_vis (uint8_t * dest, uint8_t * _ref,
744 			     int stride, int height)
745 {
746 	uint8_t *ref = (uint8_t *) _ref;
747 	unsigned long off = (unsigned long) ref & 0x7;
748 	unsigned long off_plus_1 = off + 1;
749 
750 	vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
751 
752 	vis_ld64(constants3[0], CONST_3);
753 	vis_fzero(ZERO);
754 	vis_ld64(constants256_512[0], CONST_256);
755 
756 	ref = vis_alignaddr(ref);
757 	do {	/* 26 cycles */
758 		vis_ld64(ref[0], TMP0);
759 
760 		vis_ld64(ref[8], TMP2);
761 
762 		vis_alignaddr_g0((void *)off);
763 
764 		vis_ld64(ref[16], TMP4);
765 
766 		vis_ld64(dest[0], DST_0);
767 		vis_faligndata(TMP0, TMP2, REF_0);
768 
769 		vis_ld64(dest[8], DST_2);
770 		vis_faligndata(TMP2, TMP4, REF_4);
771 
772 		if (off != 0x7) {
773 			vis_alignaddr_g0((void *)off_plus_1);
774 			vis_faligndata(TMP0, TMP2, REF_2);
775 			vis_faligndata(TMP2, TMP4, REF_6);
776 		} else {
777 			vis_src1(TMP2, REF_2);
778 			vis_src1(TMP4, REF_6);
779 		}
780 
781 		vis_mul8x16au(REF_0,   CONST_256, TMP0);
782 
783 		vis_pmerge(ZERO,     REF_2,     TMP4);
784 		vis_mul8x16au(REF_0_1, CONST_256, TMP2);
785 
786 		vis_pmerge(ZERO, REF_2_1, TMP6);
787 
788 		vis_padd16(TMP0, TMP4, TMP0);
789 
790 		vis_mul8x16al(DST_0,   CONST_512, TMP4);
791 		vis_padd16(TMP2, TMP6, TMP2);
792 
793 		vis_mul8x16al(DST_1,   CONST_512, TMP6);
794 
795 		vis_mul8x16au(REF_6,   CONST_256, TMP12);
796 
797 		vis_padd16(TMP0, TMP4, TMP0);
798 		vis_mul8x16au(REF_6_1, CONST_256, TMP14);
799 
800 		vis_padd16(TMP2, TMP6, TMP2);
801 		vis_mul8x16au(REF_4,   CONST_256, TMP16);
802 
803 		vis_padd16(TMP0, CONST_3, TMP8);
804 		vis_mul8x16au(REF_4_1, CONST_256, TMP18);
805 
806 		vis_padd16(TMP2, CONST_3, TMP10);
807 		vis_pack16(TMP8, DST_0);
808 
809 		vis_pack16(TMP10, DST_1);
810 		vis_padd16(TMP16, TMP12, TMP0);
811 
812 		vis_st64(DST_0, dest[0]);
813 		vis_mul8x16al(DST_2,   CONST_512, TMP4);
814 		vis_padd16(TMP18, TMP14, TMP2);
815 
816 		vis_mul8x16al(DST_3,   CONST_512, TMP6);
817 		vis_padd16(TMP0, CONST_3, TMP0);
818 
819 		vis_padd16(TMP2, CONST_3, TMP2);
820 
821 		vis_padd16(TMP0, TMP4, TMP0);
822 
823 		vis_padd16(TMP2, TMP6, TMP2);
824 		vis_pack16(TMP0, DST_2);
825 
826 		vis_pack16(TMP2, DST_3);
827 		vis_st64(DST_2, dest[8]);
828 
829 		ref += stride;
830 		dest += stride;
831 	} while (--height);
832 }
833 
MC_avg_x_8_vis(uint8_t * dest,uint8_t * _ref,int stride,int height)834 static void MC_avg_x_8_vis (uint8_t * dest, uint8_t * _ref,
835 			    int stride, int height)
836 {
837 	uint8_t *ref = (uint8_t *) _ref;
838 	unsigned long off = (unsigned long) ref & 0x7;
839 	unsigned long off_plus_1 = off + 1;
840 	int stride_times_2 = stride << 1;
841 
842 	vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
843 
844 	vis_ld64(constants3[0], CONST_3);
845 	vis_fzero(ZERO);
846 	vis_ld64(constants256_512[0], CONST_256);
847 
848 	ref = vis_alignaddr(ref);
849 	height >>= 2;
850 	do {	/* 47 cycles */
851 		vis_ld64(ref[0],   TMP0);
852 
853 		vis_ld64_2(ref, 8, TMP2);
854 		ref += stride;
855 
856 		vis_alignaddr_g0((void *)off);
857 
858 		vis_ld64(ref[0],   TMP4);
859 		vis_faligndata(TMP0, TMP2, REF_0);
860 
861 		vis_ld64_2(ref, 8, TMP6);
862 		ref += stride;
863 
864 		vis_ld64(ref[0],   TMP8);
865 
866 		vis_ld64_2(ref, 8, TMP10);
867 		ref += stride;
868 		vis_faligndata(TMP4, TMP6, REF_4);
869 
870 		vis_ld64(ref[0],   TMP12);
871 
872 		vis_ld64_2(ref, 8, TMP14);
873 		ref += stride;
874 		vis_faligndata(TMP8, TMP10, REF_S0);
875 
876 		vis_faligndata(TMP12, TMP14, REF_S4);
877 
878 		if (off != 0x7) {
879 			vis_alignaddr_g0((void *)off_plus_1);
880 
881 			vis_ld64(dest[0], DST_0);
882 			vis_faligndata(TMP0, TMP2, REF_2);
883 
884 			vis_ld64_2(dest, stride, DST_2);
885 			vis_faligndata(TMP4, TMP6, REF_6);
886 
887 			vis_faligndata(TMP8, TMP10, REF_S2);
888 
889 			vis_faligndata(TMP12, TMP14, REF_S6);
890 		} else {
891 			vis_ld64(dest[0], DST_0);
892 			vis_src1(TMP2, REF_2);
893 
894 			vis_ld64_2(dest, stride, DST_2);
895 			vis_src1(TMP6, REF_6);
896 
897 			vis_src1(TMP10, REF_S2);
898 
899 			vis_src1(TMP14, REF_S6);
900 		}
901 
902 		vis_pmerge(ZERO,     REF_0,     TMP0);
903 		vis_mul8x16au(REF_0_1, CONST_256, TMP2);
904 
905 		vis_pmerge(ZERO,     REF_2,     TMP4);
906 		vis_mul8x16au(REF_2_1, CONST_256, TMP6);
907 
908 		vis_padd16(TMP0, CONST_3, TMP0);
909 		vis_mul8x16al(DST_0,   CONST_512, TMP16);
910 
911 		vis_padd16(TMP2, CONST_3, TMP2);
912 		vis_mul8x16al(DST_1,   CONST_512, TMP18);
913 
914 		vis_padd16(TMP0, TMP4, TMP0);
915 		vis_mul8x16au(REF_4, CONST_256, TMP8);
916 
917 		vis_padd16(TMP2, TMP6, TMP2);
918 		vis_mul8x16au(REF_4_1, CONST_256, TMP10);
919 
920 		vis_padd16(TMP0, TMP16, TMP0);
921 		vis_mul8x16au(REF_6, CONST_256, TMP12);
922 
923 		vis_padd16(TMP2, TMP18, TMP2);
924 		vis_mul8x16au(REF_6_1, CONST_256, TMP14);
925 
926 		vis_padd16(TMP8, CONST_3, TMP8);
927 		vis_mul8x16al(DST_2, CONST_512, TMP16);
928 
929 		vis_padd16(TMP8, TMP12, TMP8);
930 		vis_mul8x16al(DST_3, CONST_512, TMP18);
931 
932 		vis_padd16(TMP10, TMP14, TMP10);
933 		vis_pack16(TMP0, DST_0);
934 
935 		vis_pack16(TMP2, DST_1);
936 		vis_st64(DST_0, dest[0]);
937 		dest += stride;
938 		vis_padd16(TMP10, CONST_3, TMP10);
939 
940 		vis_ld64_2(dest, stride, DST_0);
941 		vis_padd16(TMP8, TMP16, TMP8);
942 
943 		vis_ld64_2(dest, stride_times_2, TMP4/*DST_2*/);
944 		vis_padd16(TMP10, TMP18, TMP10);
945 		vis_pack16(TMP8, DST_2);
946 
947 		vis_pack16(TMP10, DST_3);
948 		vis_st64(DST_2, dest[0]);
949 		dest += stride;
950 
951 		vis_mul8x16au(REF_S0_1, CONST_256, TMP2);
952 		vis_pmerge(ZERO,     REF_S0,     TMP0);
953 
954 		vis_pmerge(ZERO,     REF_S2,     TMP24);
955 		vis_mul8x16au(REF_S2_1, CONST_256, TMP6);
956 
957 		vis_padd16(TMP0, CONST_3, TMP0);
958 		vis_mul8x16au(REF_S4, CONST_256, TMP8);
959 
960 		vis_padd16(TMP2, CONST_3, TMP2);
961 		vis_mul8x16au(REF_S4_1, CONST_256, TMP10);
962 
963 		vis_padd16(TMP0, TMP24, TMP0);
964 		vis_mul8x16au(REF_S6, CONST_256, TMP12);
965 
966 		vis_padd16(TMP2, TMP6, TMP2);
967 		vis_mul8x16au(REF_S6_1, CONST_256, TMP14);
968 
969 		vis_padd16(TMP8, CONST_3, TMP8);
970 		vis_mul8x16al(DST_0,   CONST_512, TMP16);
971 
972 		vis_padd16(TMP10, CONST_3, TMP10);
973 		vis_mul8x16al(DST_1,   CONST_512, TMP18);
974 
975 		vis_padd16(TMP8, TMP12, TMP8);
976 		vis_mul8x16al(TMP4/*DST_2*/, CONST_512, TMP20);
977 
978 		vis_mul8x16al(TMP5/*DST_3*/, CONST_512, TMP22);
979 		vis_padd16(TMP0, TMP16, TMP0);
980 
981 		vis_padd16(TMP2, TMP18, TMP2);
982 		vis_pack16(TMP0, DST_0);
983 
984 		vis_padd16(TMP10, TMP14, TMP10);
985 		vis_pack16(TMP2, DST_1);
986 		vis_st64(DST_0, dest[0]);
987 		dest += stride;
988 
989 		vis_padd16(TMP8, TMP20, TMP8);
990 
991 		vis_padd16(TMP10, TMP22, TMP10);
992 		vis_pack16(TMP8, DST_2);
993 
994 		vis_pack16(TMP10, DST_3);
995 		vis_st64(DST_2, dest[0]);
996 		dest += stride;
997 	} while (--height);
998 }
999 
MC_put_y_16_vis(uint8_t * dest,uint8_t * _ref,int stride,int height)1000 static void MC_put_y_16_vis (uint8_t * dest, uint8_t * _ref,
1001 			     int stride, int height)
1002 {
1003 	uint8_t *ref = (uint8_t *) _ref;
1004 	int offset;
1005 
1006 	ref = vis_alignaddr(ref);
1007 	offset = (ref != _ref) ? 16 : 0;
1008 
1009 	vis_ld64(ref[0], TMP0);
1010 
1011 	vis_ld64_2(ref, 8, TMP2);
1012 
1013 	vis_ld64_2(ref, offset, TMP4);
1014 	ref += stride;
1015 
1016 	vis_ld64(ref[0], TMP6);
1017 	vis_faligndata(TMP0, TMP2, REF_0);
1018 
1019 	vis_ld64_2(ref, 8, TMP8);
1020 	vis_faligndata(TMP2, TMP4, REF_4);
1021 
1022 	vis_ld64_2(ref, offset, TMP10);
1023 	ref += stride;
1024 
1025 	vis_ld64(constants_fe[0], MASK_fe);
1026 	vis_faligndata(TMP6, TMP8, REF_2);
1027 
1028 	vis_ld64(constants_7f[0], MASK_7f);
1029 	vis_faligndata(TMP8, TMP10, REF_6);
1030 
1031 	vis_ld64(constants128[0], CONST_128);
1032 	height = (height >> 1) - 1;
1033 	do {	/* 24 cycles */
1034 		vis_ld64(ref[0], TMP0);
1035 		vis_xor(REF_0, REF_2, TMP12);
1036 
1037 		vis_ld64_2(ref, 8, TMP2);
1038 		vis_xor(REF_4, REF_6, TMP16);
1039 
1040 		vis_ld64_2(ref, offset, TMP4);
1041 		ref += stride;
1042 		vis_or(REF_0, REF_2, TMP14);
1043 
1044 		vis_ld64(ref[0], TMP6);
1045 		vis_or(REF_4, REF_6, TMP18);
1046 
1047 		vis_ld64_2(ref, 8, TMP8);
1048 		vis_faligndata(TMP0, TMP2, REF_0);
1049 
1050 		vis_ld64_2(ref, offset, TMP10);
1051 		ref += stride;
1052 		vis_faligndata(TMP2, TMP4, REF_4);
1053 
1054 		vis_and(TMP12, MASK_fe, TMP12);
1055 
1056 		vis_and(TMP16, MASK_fe, TMP16);
1057 		vis_mul8x16(CONST_128, TMP12, TMP12);
1058 
1059 		vis_mul8x16(CONST_128, TMP16, TMP16);
1060 		vis_xor(REF_0, REF_2, TMP0);
1061 
1062 		vis_xor(REF_4, REF_6, TMP2);
1063 
1064 		vis_or(REF_0, REF_2, TMP20);
1065 
1066 		vis_and(TMP12, MASK_7f, TMP12);
1067 
1068 		vis_and(TMP16, MASK_7f, TMP16);
1069 
1070 		vis_psub16(TMP14, TMP12, TMP12);
1071 		vis_st64(TMP12, dest[0]);
1072 
1073 		vis_psub16(TMP18, TMP16, TMP16);
1074 		vis_st64_2(TMP16, dest, 8);
1075 		dest += stride;
1076 
1077 		vis_or(REF_4, REF_6, TMP18);
1078 
1079 		vis_and(TMP0, MASK_fe, TMP0);
1080 
1081 		vis_and(TMP2, MASK_fe, TMP2);
1082 		vis_mul8x16(CONST_128, TMP0, TMP0);
1083 
1084 		vis_faligndata(TMP6, TMP8, REF_2);
1085 		vis_mul8x16(CONST_128, TMP2, TMP2);
1086 
1087 		vis_faligndata(TMP8, TMP10, REF_6);
1088 
1089 		vis_and(TMP0, MASK_7f, TMP0);
1090 
1091 		vis_and(TMP2, MASK_7f, TMP2);
1092 
1093 		vis_psub16(TMP20, TMP0, TMP0);
1094 		vis_st64(TMP0, dest[0]);
1095 
1096 		vis_psub16(TMP18, TMP2, TMP2);
1097 		vis_st64_2(TMP2, dest, 8);
1098 		dest += stride;
1099 	} while (--height);
1100 
1101 	vis_ld64(ref[0], TMP0);
1102 	vis_xor(REF_0, REF_2, TMP12);
1103 
1104 	vis_ld64_2(ref, 8, TMP2);
1105 	vis_xor(REF_4, REF_6, TMP16);
1106 
1107 	vis_ld64_2(ref, offset, TMP4);
1108 	vis_or(REF_0, REF_2, TMP14);
1109 
1110 	vis_or(REF_4, REF_6, TMP18);
1111 
1112 	vis_faligndata(TMP0, TMP2, REF_0);
1113 
1114 	vis_faligndata(TMP2, TMP4, REF_4);
1115 
1116 	vis_and(TMP12, MASK_fe, TMP12);
1117 
1118 	vis_and(TMP16, MASK_fe, TMP16);
1119 	vis_mul8x16(CONST_128, TMP12, TMP12);
1120 
1121 	vis_mul8x16(CONST_128, TMP16, TMP16);
1122 	vis_xor(REF_0, REF_2, TMP0);
1123 
1124 	vis_xor(REF_4, REF_6, TMP2);
1125 
1126 	vis_or(REF_0, REF_2, TMP20);
1127 
1128 	vis_and(TMP12, MASK_7f, TMP12);
1129 
1130 	vis_and(TMP16, MASK_7f, TMP16);
1131 
1132 	vis_psub16(TMP14, TMP12, TMP12);
1133 	vis_st64(TMP12, dest[0]);
1134 
1135 	vis_psub16(TMP18, TMP16, TMP16);
1136 	vis_st64_2(TMP16, dest, 8);
1137 	dest += stride;
1138 
1139 	vis_or(REF_4, REF_6, TMP18);
1140 
1141 	vis_and(TMP0, MASK_fe, TMP0);
1142 
1143 	vis_and(TMP2, MASK_fe, TMP2);
1144 	vis_mul8x16(CONST_128, TMP0, TMP0);
1145 
1146 	vis_mul8x16(CONST_128, TMP2, TMP2);
1147 
1148 	vis_and(TMP0, MASK_7f, TMP0);
1149 
1150 	vis_and(TMP2, MASK_7f, TMP2);
1151 
1152 	vis_psub16(TMP20, TMP0, TMP0);
1153 	vis_st64(TMP0, dest[0]);
1154 
1155 	vis_psub16(TMP18, TMP2, TMP2);
1156 	vis_st64_2(TMP2, dest, 8);
1157 }
1158 
MC_put_y_8_vis(uint8_t * dest,uint8_t * _ref,int stride,int height)1159 static void MC_put_y_8_vis (uint8_t * dest, uint8_t * _ref,
1160 			    int stride, int height)
1161 {
1162 	uint8_t *ref = (uint8_t *) _ref;
1163 	int offset;
1164 
1165 	ref = vis_alignaddr(ref);
1166 	offset = (ref != _ref) ? 8 : 0;
1167 
1168 	vis_ld64(ref[0], TMP0);
1169 
1170 	vis_ld64_2(ref, offset, TMP2);
1171 	ref += stride;
1172 
1173 	vis_ld64(ref[0], TMP4);
1174 
1175 	vis_ld64_2(ref, offset, TMP6);
1176 	ref += stride;
1177 
1178 	vis_ld64(constants_fe[0], MASK_fe);
1179 	vis_faligndata(TMP0, TMP2, REF_0);
1180 
1181 	vis_ld64(constants_7f[0], MASK_7f);
1182 	vis_faligndata(TMP4, TMP6, REF_2);
1183 
1184 	vis_ld64(constants128[0], CONST_128);
1185 	height = (height >> 1) - 1;
1186 	do {	/* 12 cycles */
1187 		vis_ld64(ref[0], TMP0);
1188 		vis_xor(REF_0, REF_2, TMP4);
1189 
1190 		vis_ld64_2(ref, offset, TMP2);
1191 		ref += stride;
1192 		vis_and(TMP4, MASK_fe, TMP4);
1193 
1194 		vis_or(REF_0, REF_2, TMP6);
1195 		vis_mul8x16(CONST_128, TMP4, TMP4);
1196 
1197 		vis_faligndata(TMP0, TMP2, REF_0);
1198 		vis_ld64(ref[0], TMP0);
1199 
1200 		vis_ld64_2(ref, offset, TMP2);
1201 		ref += stride;
1202 		vis_xor(REF_0, REF_2, TMP12);
1203 
1204 		vis_and(TMP4, MASK_7f, TMP4);
1205 
1206 		vis_and(TMP12, MASK_fe, TMP12);
1207 
1208 		vis_mul8x16(CONST_128, TMP12, TMP12);
1209 		vis_or(REF_0, REF_2, TMP14);
1210 
1211 		vis_psub16(TMP6, TMP4, DST_0);
1212 		vis_st64(DST_0, dest[0]);
1213 		dest += stride;
1214 
1215 		vis_faligndata(TMP0, TMP2, REF_2);
1216 
1217 		vis_and(TMP12, MASK_7f, TMP12);
1218 
1219 		vis_psub16(TMP14, TMP12, DST_0);
1220 		vis_st64(DST_0, dest[0]);
1221 		dest += stride;
1222 	} while (--height);
1223 
1224 	vis_ld64(ref[0], TMP0);
1225 	vis_xor(REF_0, REF_2, TMP4);
1226 
1227 	vis_ld64_2(ref, offset, TMP2);
1228 	vis_and(TMP4, MASK_fe, TMP4);
1229 
1230 	vis_or(REF_0, REF_2, TMP6);
1231 	vis_mul8x16(CONST_128, TMP4, TMP4);
1232 
1233 	vis_faligndata(TMP0, TMP2, REF_0);
1234 
1235 	vis_xor(REF_0, REF_2, TMP12);
1236 
1237 	vis_and(TMP4, MASK_7f, TMP4);
1238 
1239 	vis_and(TMP12, MASK_fe, TMP12);
1240 
1241 	vis_mul8x16(CONST_128, TMP12, TMP12);
1242 	vis_or(REF_0, REF_2, TMP14);
1243 
1244 	vis_psub16(TMP6, TMP4, DST_0);
1245 	vis_st64(DST_0, dest[0]);
1246 	dest += stride;
1247 
1248 	vis_and(TMP12, MASK_7f, TMP12);
1249 
1250 	vis_psub16(TMP14, TMP12, DST_0);
1251 	vis_st64(DST_0, dest[0]);
1252 }
1253 
MC_avg_y_16_vis(uint8_t * dest,uint8_t * _ref,int stride,int height)1254 static void MC_avg_y_16_vis (uint8_t * dest, uint8_t * _ref,
1255 			     int stride, int height)
1256 {
1257 	uint8_t *ref = (uint8_t *) _ref;
1258 	int stride_8 = stride + 8;
1259 	int stride_16;
1260 	int offset;
1261 
1262 	vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
1263 
1264 	ref = vis_alignaddr(ref);
1265 	offset = (ref != _ref) ? 16 : 0;
1266 
1267 	vis_ld64(ref[ 0], TMP0);
1268 	vis_fzero(ZERO);
1269 
1270 	vis_ld64(ref[ 8], TMP2);
1271 
1272 	vis_ld64_2(ref, offset, TMP4);
1273 	stride_16 = stride + offset;
1274 
1275 	vis_ld64(constants3[0], CONST_3);
1276 	vis_faligndata(TMP0, TMP2, REF_2);
1277 
1278 	vis_ld64(constants256_512[0], CONST_256);
1279 	vis_faligndata(TMP2, TMP4, REF_6);
1280 	height >>= 1;
1281 
1282 	do {	/* 31 cycles */
1283 		vis_ld64_2(ref, stride, TMP0);
1284 		vis_pmerge(ZERO,       REF_2,     TMP12);
1285 		vis_mul8x16au(REF_2_1, CONST_256, TMP14);
1286 
1287 		vis_ld64_2(ref, stride_8, TMP2);
1288 		vis_pmerge(ZERO,       REF_6,     TMP16);
1289 		vis_mul8x16au(REF_6_1, CONST_256, TMP18);
1290 
1291 		vis_ld64_2(ref, stride_16, TMP4);
1292 		ref += stride;
1293 
1294 		vis_ld64(dest[0], DST_0);
1295 		vis_faligndata(TMP0, TMP2, REF_0);
1296 
1297 		vis_ld64_2(dest, 8, DST_2);
1298 		vis_faligndata(TMP2, TMP4, REF_4);
1299 
1300 		vis_ld64_2(ref, stride, TMP6);
1301 		vis_pmerge(ZERO,     REF_0,     TMP0);
1302 		vis_mul8x16au(REF_0_1, CONST_256, TMP2);
1303 
1304 		vis_ld64_2(ref, stride_8, TMP8);
1305 		vis_pmerge(ZERO,     REF_4,     TMP4);
1306 
1307 		vis_ld64_2(ref, stride_16, TMP10);
1308 		ref += stride;
1309 
1310 		vis_ld64_2(dest, stride, REF_S0/*DST_4*/);
1311 		vis_faligndata(TMP6, TMP8, REF_2);
1312 		vis_mul8x16au(REF_4_1, CONST_256, TMP6);
1313 
1314 		vis_ld64_2(dest, stride_8, REF_S2/*DST_6*/);
1315 		vis_faligndata(TMP8, TMP10, REF_6);
1316 		vis_mul8x16al(DST_0,   CONST_512, TMP20);
1317 
1318 		vis_padd16(TMP0, CONST_3, TMP0);
1319 		vis_mul8x16al(DST_1,   CONST_512, TMP22);
1320 
1321 		vis_padd16(TMP2, CONST_3, TMP2);
1322 		vis_mul8x16al(DST_2,   CONST_512, TMP24);
1323 
1324 		vis_padd16(TMP4, CONST_3, TMP4);
1325 		vis_mul8x16al(DST_3,   CONST_512, TMP26);
1326 
1327 		vis_padd16(TMP6, CONST_3, TMP6);
1328 
1329 		vis_padd16(TMP12, TMP20, TMP12);
1330 		vis_mul8x16al(REF_S0,   CONST_512, TMP20);
1331 
1332 		vis_padd16(TMP14, TMP22, TMP14);
1333 		vis_mul8x16al(REF_S0_1, CONST_512, TMP22);
1334 
1335 		vis_padd16(TMP16, TMP24, TMP16);
1336 		vis_mul8x16al(REF_S2,   CONST_512, TMP24);
1337 
1338 		vis_padd16(TMP18, TMP26, TMP18);
1339 		vis_mul8x16al(REF_S2_1, CONST_512, TMP26);
1340 
1341 		vis_padd16(TMP12, TMP0, TMP12);
1342 		vis_mul8x16au(REF_2,   CONST_256, TMP28);
1343 
1344 		vis_padd16(TMP14, TMP2, TMP14);
1345 		vis_mul8x16au(REF_2_1, CONST_256, TMP30);
1346 
1347 		vis_padd16(TMP16, TMP4, TMP16);
1348 		vis_mul8x16au(REF_6,   CONST_256, REF_S4);
1349 
1350 		vis_padd16(TMP18, TMP6, TMP18);
1351 		vis_mul8x16au(REF_6_1, CONST_256, REF_S6);
1352 
1353 		vis_pack16(TMP12, DST_0);
1354 		vis_padd16(TMP28, TMP0, TMP12);
1355 
1356 		vis_pack16(TMP14, DST_1);
1357 		vis_st64(DST_0, dest[0]);
1358 		vis_padd16(TMP30, TMP2, TMP14);
1359 
1360 		vis_pack16(TMP16, DST_2);
1361 		vis_padd16(REF_S4, TMP4, TMP16);
1362 
1363 		vis_pack16(TMP18, DST_3);
1364 		vis_st64_2(DST_2, dest, 8);
1365 		dest += stride;
1366 		vis_padd16(REF_S6, TMP6, TMP18);
1367 
1368 		vis_padd16(TMP12, TMP20, TMP12);
1369 
1370 		vis_padd16(TMP14, TMP22, TMP14);
1371 		vis_pack16(TMP12, DST_0);
1372 
1373 		vis_padd16(TMP16, TMP24, TMP16);
1374 		vis_pack16(TMP14, DST_1);
1375 		vis_st64(DST_0, dest[0]);
1376 
1377 		vis_padd16(TMP18, TMP26, TMP18);
1378 		vis_pack16(TMP16, DST_2);
1379 
1380 		vis_pack16(TMP18, DST_3);
1381 		vis_st64_2(DST_2, dest, 8);
1382 		dest += stride;
1383 	} while (--height);
1384 }
1385 
MC_avg_y_8_vis(uint8_t * dest,uint8_t * _ref,int stride,int height)1386 static void MC_avg_y_8_vis (uint8_t * dest, uint8_t * _ref,
1387 			    int stride, int height)
1388 {
1389 	uint8_t *ref = (uint8_t *) _ref;
1390 	int stride_8;
1391 	int offset;
1392 
1393 	vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
1394 
1395 	ref = vis_alignaddr(ref);
1396 	offset = (ref != _ref) ? 8 : 0;
1397 
1398 	vis_ld64(ref[ 0], TMP0);
1399 	vis_fzero(ZERO);
1400 
1401 	vis_ld64_2(ref, offset, TMP2);
1402 	stride_8 = stride + offset;
1403 
1404 	vis_ld64(constants3[0], CONST_3);
1405 	vis_faligndata(TMP0, TMP2, REF_2);
1406 
1407 	vis_ld64(constants256_512[0], CONST_256);
1408 
1409 	height >>= 1;
1410 	do {	/* 20 cycles */
1411 		vis_ld64_2(ref, stride, TMP0);
1412 		vis_pmerge(ZERO,       REF_2,     TMP8);
1413 		vis_mul8x16au(REF_2_1, CONST_256, TMP10);
1414 
1415 		vis_ld64_2(ref, stride_8, TMP2);
1416 		ref += stride;
1417 
1418 		vis_ld64(dest[0], DST_0);
1419 
1420 		vis_ld64_2(dest, stride, DST_2);
1421 		vis_faligndata(TMP0, TMP2, REF_0);
1422 
1423 		vis_ld64_2(ref, stride, TMP4);
1424 		vis_mul8x16al(DST_0,   CONST_512, TMP16);
1425 		vis_pmerge(ZERO,       REF_0,     TMP12);
1426 
1427 		vis_ld64_2(ref, stride_8, TMP6);
1428 		ref += stride;
1429 		vis_mul8x16al(DST_1,   CONST_512, TMP18);
1430 		vis_pmerge(ZERO,       REF_0_1,   TMP14);
1431 
1432 		vis_padd16(TMP12, CONST_3, TMP12);
1433 		vis_mul8x16al(DST_2,   CONST_512, TMP24);
1434 
1435 		vis_padd16(TMP14, CONST_3, TMP14);
1436 		vis_mul8x16al(DST_3,   CONST_512, TMP26);
1437 
1438 		vis_faligndata(TMP4, TMP6, REF_2);
1439 
1440 		vis_padd16(TMP8, TMP12, TMP8);
1441 
1442 		vis_padd16(TMP10, TMP14, TMP10);
1443 		vis_mul8x16au(REF_2,   CONST_256, TMP20);
1444 
1445 		vis_padd16(TMP8, TMP16, TMP0);
1446 		vis_mul8x16au(REF_2_1, CONST_256, TMP22);
1447 
1448 		vis_padd16(TMP10, TMP18, TMP2);
1449 		vis_pack16(TMP0, DST_0);
1450 
1451 		vis_pack16(TMP2, DST_1);
1452 		vis_st64(DST_0, dest[0]);
1453 		dest += stride;
1454 		vis_padd16(TMP12, TMP20, TMP12);
1455 
1456 		vis_padd16(TMP14, TMP22, TMP14);
1457 
1458 		vis_padd16(TMP12, TMP24, TMP0);
1459 
1460 		vis_padd16(TMP14, TMP26, TMP2);
1461 		vis_pack16(TMP0, DST_2);
1462 
1463 		vis_pack16(TMP2, DST_3);
1464 		vis_st64(DST_2, dest[0]);
1465 		dest += stride;
1466 	} while (--height);
1467 }
1468 
MC_put_xy_16_vis(uint8_t * dest,uint8_t * _ref,int stride,int height)1469 static void MC_put_xy_16_vis (uint8_t * dest, uint8_t * _ref,
1470 			      int stride, int height)
1471 {
1472 	uint8_t *ref = (uint8_t *) _ref;
1473 	unsigned long off = (unsigned long) ref & 0x7;
1474 	unsigned long off_plus_1 = off + 1;
1475 	int stride_8 = stride + 8;
1476 	int stride_16 = stride + 16;
1477 
1478 	vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
1479 
1480 	ref = vis_alignaddr(ref);
1481 
1482 	vis_ld64(ref[ 0], TMP0);
1483 	vis_fzero(ZERO);
1484 
1485 	vis_ld64(ref[ 8], TMP2);
1486 
1487 	vis_ld64(ref[16], TMP4);
1488 
1489 	vis_ld64(constants2[0], CONST_2);
1490 	vis_faligndata(TMP0, TMP2, REF_S0);
1491 
1492 	vis_ld64(constants256_512[0], CONST_256);
1493 	vis_faligndata(TMP2, TMP4, REF_S4);
1494 
1495 	if (off != 0x7) {
1496 		vis_alignaddr_g0((void *)off_plus_1);
1497 		vis_faligndata(TMP0, TMP2, REF_S2);
1498 		vis_faligndata(TMP2, TMP4, REF_S6);
1499 	} else {
1500 		vis_src1(TMP2, REF_S2);
1501 		vis_src1(TMP4, REF_S6);
1502 	}
1503 
1504 	height >>= 1;
1505 	do {
1506 		vis_ld64_2(ref, stride, TMP0);
1507 		vis_mul8x16au(REF_S0, CONST_256, TMP12);
1508 		vis_pmerge(ZERO,      REF_S0_1,  TMP14);
1509 
1510 		vis_alignaddr_g0((void *)off);
1511 
1512 		vis_ld64_2(ref, stride_8, TMP2);
1513 		vis_mul8x16au(REF_S2, CONST_256, TMP16);
1514 		vis_pmerge(ZERO,      REF_S2_1,  TMP18);
1515 
1516 		vis_ld64_2(ref, stride_16, TMP4);
1517 		ref += stride;
1518 		vis_mul8x16au(REF_S4, CONST_256, TMP20);
1519 		vis_pmerge(ZERO,      REF_S4_1,  TMP22);
1520 
1521 		vis_ld64_2(ref, stride, TMP6);
1522 		vis_mul8x16au(REF_S6, CONST_256, TMP24);
1523 		vis_pmerge(ZERO,      REF_S6_1,  TMP26);
1524 
1525 		vis_ld64_2(ref, stride_8, TMP8);
1526 		vis_faligndata(TMP0, TMP2, REF_0);
1527 
1528 		vis_ld64_2(ref, stride_16, TMP10);
1529 		ref += stride;
1530 		vis_faligndata(TMP2, TMP4, REF_4);
1531 
1532 		vis_faligndata(TMP6, TMP8, REF_S0);
1533 
1534 		vis_faligndata(TMP8, TMP10, REF_S4);
1535 
1536 		if (off != 0x7) {
1537 			vis_alignaddr_g0((void *)off_plus_1);
1538 			vis_faligndata(TMP0, TMP2, REF_2);
1539 			vis_faligndata(TMP2, TMP4, REF_6);
1540 			vis_faligndata(TMP6, TMP8, REF_S2);
1541 			vis_faligndata(TMP8, TMP10, REF_S6);
1542 		} else {
1543 			vis_src1(TMP2, REF_2);
1544 			vis_src1(TMP4, REF_6);
1545 			vis_src1(TMP8, REF_S2);
1546 			vis_src1(TMP10, REF_S6);
1547 		}
1548 
1549 		vis_mul8x16au(REF_0, CONST_256, TMP0);
1550 		vis_pmerge(ZERO,      REF_0_1,  TMP2);
1551 
1552 		vis_mul8x16au(REF_2, CONST_256, TMP4);
1553 		vis_pmerge(ZERO,      REF_2_1,  TMP6);
1554 
1555 		vis_padd16(TMP0, CONST_2, TMP8);
1556 		vis_mul8x16au(REF_4, CONST_256, TMP0);
1557 
1558 		vis_padd16(TMP2, CONST_2, TMP10);
1559 		vis_mul8x16au(REF_4_1, CONST_256, TMP2);
1560 
1561 		vis_padd16(TMP8, TMP4, TMP8);
1562 		vis_mul8x16au(REF_6, CONST_256, TMP4);
1563 
1564 		vis_padd16(TMP10, TMP6, TMP10);
1565 		vis_mul8x16au(REF_6_1, CONST_256, TMP6);
1566 
1567 		vis_padd16(TMP12, TMP8, TMP12);
1568 
1569 		vis_padd16(TMP14, TMP10, TMP14);
1570 
1571 		vis_padd16(TMP12, TMP16, TMP12);
1572 
1573 		vis_padd16(TMP14, TMP18, TMP14);
1574 		vis_pack16(TMP12, DST_0);
1575 
1576 		vis_pack16(TMP14, DST_1);
1577 		vis_st64(DST_0, dest[0]);
1578 		vis_padd16(TMP0, CONST_2, TMP12);
1579 
1580 		vis_mul8x16au(REF_S0, CONST_256, TMP0);
1581 		vis_padd16(TMP2, CONST_2, TMP14);
1582 
1583 		vis_mul8x16au(REF_S0_1, CONST_256, TMP2);
1584 		vis_padd16(TMP12, TMP4, TMP12);
1585 
1586 		vis_mul8x16au(REF_S2, CONST_256, TMP4);
1587 		vis_padd16(TMP14, TMP6, TMP14);
1588 
1589 		vis_mul8x16au(REF_S2_1, CONST_256, TMP6);
1590 		vis_padd16(TMP20, TMP12, TMP20);
1591 
1592 		vis_padd16(TMP22, TMP14, TMP22);
1593 
1594 		vis_padd16(TMP20, TMP24, TMP20);
1595 
1596 		vis_padd16(TMP22, TMP26, TMP22);
1597 		vis_pack16(TMP20, DST_2);
1598 
1599 		vis_pack16(TMP22, DST_3);
1600 		vis_st64_2(DST_2, dest, 8);
1601 		dest += stride;
1602 		vis_padd16(TMP0, TMP4, TMP24);
1603 
1604 		vis_mul8x16au(REF_S4, CONST_256, TMP0);
1605 		vis_padd16(TMP2, TMP6, TMP26);
1606 
1607 		vis_mul8x16au(REF_S4_1, CONST_256, TMP2);
1608 		vis_padd16(TMP24, TMP8, TMP24);
1609 
1610 		vis_padd16(TMP26, TMP10, TMP26);
1611 		vis_pack16(TMP24, DST_0);
1612 
1613 		vis_pack16(TMP26, DST_1);
1614 		vis_st64(DST_0, dest[0]);
1615 		vis_pmerge(ZERO, REF_S6, TMP4);
1616 
1617 		vis_pmerge(ZERO,      REF_S6_1,  TMP6);
1618 
1619 		vis_padd16(TMP0, TMP4, TMP0);
1620 
1621 		vis_padd16(TMP2, TMP6, TMP2);
1622 
1623 		vis_padd16(TMP0, TMP12, TMP0);
1624 
1625 		vis_padd16(TMP2, TMP14, TMP2);
1626 		vis_pack16(TMP0, DST_2);
1627 
1628 		vis_pack16(TMP2, DST_3);
1629 		vis_st64_2(DST_2, dest, 8);
1630 		dest += stride;
1631 	} while (--height);
1632 }
1633 
MC_put_xy_8_vis(uint8_t * dest,uint8_t * _ref,int stride,int height)1634 static void MC_put_xy_8_vis (uint8_t * dest, uint8_t * _ref,
1635 			     int stride, int height)
1636 {
1637 	uint8_t *ref = (uint8_t *) _ref;
1638 	unsigned long off = (unsigned long) ref & 0x7;
1639 	unsigned long off_plus_1 = off + 1;
1640 	int stride_8 = stride + 8;
1641 
1642 	vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
1643 
1644 	ref = vis_alignaddr(ref);
1645 
1646 	vis_ld64(ref[ 0], TMP0);
1647 	vis_fzero(ZERO);
1648 
1649 	vis_ld64(ref[ 8], TMP2);
1650 
1651 	vis_ld64(constants2[0], CONST_2);
1652 
1653 	vis_ld64(constants256_512[0], CONST_256);
1654 	vis_faligndata(TMP0, TMP2, REF_S0);
1655 
1656 	if (off != 0x7) {
1657 		vis_alignaddr_g0((void *)off_plus_1);
1658 		vis_faligndata(TMP0, TMP2, REF_S2);
1659 	} else {
1660 		vis_src1(TMP2, REF_S2);
1661 	}
1662 
1663 	height >>= 1;
1664 	do {	/* 26 cycles */
1665 		vis_ld64_2(ref, stride, TMP0);
1666 		vis_mul8x16au(REF_S0,   CONST_256, TMP8);
1667 		vis_pmerge(ZERO,        REF_S2,    TMP12);
1668 
1669 		vis_alignaddr_g0((void *)off);
1670 
1671 		vis_ld64_2(ref, stride_8, TMP2);
1672 		ref += stride;
1673 		vis_mul8x16au(REF_S0_1, CONST_256, TMP10);
1674 		vis_pmerge(ZERO,        REF_S2_1,  TMP14);
1675 
1676 		vis_ld64_2(ref, stride, TMP4);
1677 
1678 		vis_ld64_2(ref, stride_8, TMP6);
1679 		ref += stride;
1680 		vis_faligndata(TMP0, TMP2, REF_S4);
1681 
1682 		vis_pmerge(ZERO, REF_S4, TMP18);
1683 
1684 		vis_pmerge(ZERO, REF_S4_1, TMP20);
1685 
1686 		vis_faligndata(TMP4, TMP6, REF_S0);
1687 
1688 		if (off != 0x7) {
1689 			vis_alignaddr_g0((void *)off_plus_1);
1690 			vis_faligndata(TMP0, TMP2, REF_S6);
1691 			vis_faligndata(TMP4, TMP6, REF_S2);
1692 		} else {
1693 			vis_src1(TMP2, REF_S6);
1694 			vis_src1(TMP6, REF_S2);
1695 		}
1696 
1697 		vis_padd16(TMP18, CONST_2, TMP18);
1698 		vis_mul8x16au(REF_S6,   CONST_256, TMP22);
1699 
1700 		vis_padd16(TMP20, CONST_2, TMP20);
1701 		vis_mul8x16au(REF_S6_1, CONST_256, TMP24);
1702 
1703 		vis_mul8x16au(REF_S0,   CONST_256, TMP26);
1704 		vis_pmerge(ZERO, REF_S0_1, TMP28);
1705 
1706 		vis_mul8x16au(REF_S2,   CONST_256, TMP30);
1707 		vis_padd16(TMP18, TMP22, TMP18);
1708 
1709 		vis_mul8x16au(REF_S2_1, CONST_256, TMP32);
1710 		vis_padd16(TMP20, TMP24, TMP20);
1711 
1712 		vis_padd16(TMP8,  TMP18, TMP8);
1713 
1714 		vis_padd16(TMP10, TMP20, TMP10);
1715 
1716 		vis_padd16(TMP8,  TMP12, TMP8);
1717 
1718 		vis_padd16(TMP10, TMP14, TMP10);
1719 		vis_pack16(TMP8,  DST_0);
1720 
1721 		vis_pack16(TMP10, DST_1);
1722 		vis_st64(DST_0, dest[0]);
1723 		dest += stride;
1724 		vis_padd16(TMP18, TMP26, TMP18);
1725 
1726 		vis_padd16(TMP20, TMP28, TMP20);
1727 
1728 		vis_padd16(TMP18, TMP30, TMP18);
1729 
1730 		vis_padd16(TMP20, TMP32, TMP20);
1731 		vis_pack16(TMP18, DST_2);
1732 
1733 		vis_pack16(TMP20, DST_3);
1734 		vis_st64(DST_2, dest[0]);
1735 		dest += stride;
1736 	} while (--height);
1737 }
1738 
MC_avg_xy_16_vis(uint8_t * dest,uint8_t * _ref,int stride,int height)1739 static void MC_avg_xy_16_vis (uint8_t * dest, uint8_t * _ref,
1740 			      int stride, int height)
1741 {
1742 	uint8_t *ref = (uint8_t *) _ref;
1743 	unsigned long off = (unsigned long) ref & 0x7;
1744 	unsigned long off_plus_1 = off + 1;
1745 	int stride_8 = stride + 8;
1746 	int stride_16 = stride + 16;
1747 
1748 	vis_set_gsr(4 << VIS_GSR_SCALEFACT_SHIFT);
1749 
1750 	ref = vis_alignaddr(ref);
1751 
1752 	vis_ld64(ref[ 0], TMP0);
1753 	vis_fzero(ZERO);
1754 
1755 	vis_ld64(ref[ 8], TMP2);
1756 
1757 	vis_ld64(ref[16], TMP4);
1758 
1759 	vis_ld64(constants6[0], CONST_6);
1760 	vis_faligndata(TMP0, TMP2, REF_S0);
1761 
1762 	vis_ld64(constants256_1024[0], CONST_256);
1763 	vis_faligndata(TMP2, TMP4, REF_S4);
1764 
1765 	if (off != 0x7) {
1766 		vis_alignaddr_g0((void *)off_plus_1);
1767 		vis_faligndata(TMP0, TMP2, REF_S2);
1768 		vis_faligndata(TMP2, TMP4, REF_S6);
1769 	} else {
1770 		vis_src1(TMP2, REF_S2);
1771 		vis_src1(TMP4, REF_S6);
1772 	}
1773 
1774 	height >>= 1;
1775 	do {	/* 55 cycles */
1776 		vis_ld64_2(ref, stride, TMP0);
1777 		vis_mul8x16au(REF_S0, CONST_256, TMP12);
1778 		vis_pmerge(ZERO,      REF_S0_1,  TMP14);
1779 
1780 		vis_alignaddr_g0((void *)off);
1781 
1782 		vis_ld64_2(ref, stride_8, TMP2);
1783 		vis_mul8x16au(REF_S2, CONST_256, TMP16);
1784 		vis_pmerge(ZERO,      REF_S2_1,  TMP18);
1785 
1786 		vis_ld64_2(ref, stride_16, TMP4);
1787 		ref += stride;
1788 		vis_mul8x16au(REF_S4, CONST_256, TMP20);
1789 		vis_pmerge(ZERO,      REF_S4_1,  TMP22);
1790 
1791 		vis_ld64_2(ref, stride, TMP6);
1792 		vis_mul8x16au(REF_S6, CONST_256, TMP24);
1793 		vis_pmerge(ZERO,      REF_S6_1,  TMP26);
1794 
1795 		vis_ld64_2(ref, stride_8, TMP8);
1796 		vis_faligndata(TMP0, TMP2, REF_0);
1797 
1798 		vis_ld64_2(ref, stride_16, TMP10);
1799 		ref += stride;
1800 		vis_faligndata(TMP2, TMP4, REF_4);
1801 
1802 		vis_ld64(dest[0], DST_0);
1803 		vis_faligndata(TMP6, TMP8, REF_S0);
1804 
1805 		vis_ld64_2(dest, 8, DST_2);
1806 		vis_faligndata(TMP8, TMP10, REF_S4);
1807 
1808 		if (off != 0x7) {
1809 			vis_alignaddr_g0((void *)off_plus_1);
1810 			vis_faligndata(TMP0, TMP2, REF_2);
1811 			vis_faligndata(TMP2, TMP4, REF_6);
1812 			vis_faligndata(TMP6, TMP8, REF_S2);
1813 			vis_faligndata(TMP8, TMP10, REF_S6);
1814 		} else {
1815 			vis_src1(TMP2, REF_2);
1816 			vis_src1(TMP4, REF_6);
1817 			vis_src1(TMP8, REF_S2);
1818 			vis_src1(TMP10, REF_S6);
1819 		}
1820 
1821 		vis_mul8x16al(DST_0,   CONST_1024, TMP30);
1822 		vis_pmerge(ZERO, REF_0, TMP0);
1823 
1824 		vis_mul8x16al(DST_1,   CONST_1024, TMP32);
1825 		vis_pmerge(ZERO,      REF_0_1,  TMP2);
1826 
1827 		vis_mul8x16au(REF_2, CONST_256, TMP4);
1828 		vis_pmerge(ZERO,      REF_2_1,  TMP6);
1829 
1830 		vis_mul8x16al(DST_2,   CONST_1024, REF_0);
1831 		vis_padd16(TMP0, CONST_6, TMP0);
1832 
1833 		vis_mul8x16al(DST_3,   CONST_1024, REF_2);
1834 		vis_padd16(TMP2, CONST_6, TMP2);
1835 
1836 		vis_padd16(TMP0, TMP4, TMP0);
1837 		vis_mul8x16au(REF_4, CONST_256, TMP4);
1838 
1839 		vis_padd16(TMP2, TMP6, TMP2);
1840 		vis_mul8x16au(REF_4_1, CONST_256, TMP6);
1841 
1842 		vis_padd16(TMP12, TMP0, TMP12);
1843 		vis_mul8x16au(REF_6, CONST_256, TMP8);
1844 
1845 		vis_padd16(TMP14, TMP2, TMP14);
1846 		vis_mul8x16au(REF_6_1, CONST_256, TMP10);
1847 
1848 		vis_padd16(TMP12, TMP16, TMP12);
1849 		vis_mul8x16au(REF_S0, CONST_256, REF_4);
1850 
1851 		vis_padd16(TMP14, TMP18, TMP14);
1852 		vis_mul8x16au(REF_S0_1, CONST_256, REF_6);
1853 
1854 		vis_padd16(TMP12, TMP30, TMP12);
1855 
1856 		vis_padd16(TMP14, TMP32, TMP14);
1857 		vis_pack16(TMP12, DST_0);
1858 
1859 		vis_pack16(TMP14, DST_1);
1860 		vis_st64(DST_0, dest[0]);
1861 		vis_padd16(TMP4, CONST_6, TMP4);
1862 
1863 		vis_ld64_2(dest, stride, DST_0);
1864 		vis_padd16(TMP6, CONST_6, TMP6);
1865 		vis_mul8x16au(REF_S2, CONST_256, TMP12);
1866 
1867 		vis_padd16(TMP4, TMP8, TMP4);
1868 		vis_mul8x16au(REF_S2_1, CONST_256,  TMP14);
1869 
1870 		vis_padd16(TMP6, TMP10, TMP6);
1871 
1872 		vis_padd16(TMP20, TMP4, TMP20);
1873 
1874 		vis_padd16(TMP22, TMP6, TMP22);
1875 
1876 		vis_padd16(TMP20, TMP24, TMP20);
1877 
1878 		vis_padd16(TMP22, TMP26, TMP22);
1879 
1880 		vis_padd16(TMP20, REF_0, TMP20);
1881 		vis_mul8x16au(REF_S4, CONST_256, REF_0);
1882 
1883 		vis_padd16(TMP22, REF_2, TMP22);
1884 		vis_pack16(TMP20, DST_2);
1885 
1886 		vis_pack16(TMP22, DST_3);
1887 		vis_st64_2(DST_2, dest, 8);
1888 		dest += stride;
1889 
1890 		vis_ld64_2(dest, 8, DST_2);
1891 		vis_mul8x16al(DST_0,   CONST_1024, TMP30);
1892 		vis_pmerge(ZERO,      REF_S4_1,  REF_2);
1893 
1894 		vis_mul8x16al(DST_1,   CONST_1024, TMP32);
1895 		vis_padd16(REF_4, TMP0, TMP8);
1896 
1897 		vis_mul8x16au(REF_S6, CONST_256, REF_4);
1898 		vis_padd16(REF_6, TMP2, TMP10);
1899 
1900 		vis_mul8x16au(REF_S6_1, CONST_256, REF_6);
1901 		vis_padd16(TMP8, TMP12, TMP8);
1902 
1903 		vis_padd16(TMP10, TMP14, TMP10);
1904 
1905 		vis_padd16(TMP8, TMP30, TMP8);
1906 
1907 		vis_padd16(TMP10, TMP32, TMP10);
1908 		vis_pack16(TMP8, DST_0);
1909 
1910 		vis_pack16(TMP10, DST_1);
1911 		vis_st64(DST_0, dest[0]);
1912 
1913 		vis_padd16(REF_0, TMP4, REF_0);
1914 
1915 		vis_mul8x16al(DST_2,   CONST_1024, TMP30);
1916 		vis_padd16(REF_2, TMP6, REF_2);
1917 
1918 		vis_mul8x16al(DST_3,   CONST_1024, TMP32);
1919 		vis_padd16(REF_0, REF_4, REF_0);
1920 
1921 		vis_padd16(REF_2, REF_6, REF_2);
1922 
1923 		vis_padd16(REF_0, TMP30, REF_0);
1924 
1925 		/* stall */
1926 
1927 		vis_padd16(REF_2, TMP32, REF_2);
1928 		vis_pack16(REF_0, DST_2);
1929 
1930 		vis_pack16(REF_2, DST_3);
1931 		vis_st64_2(DST_2, dest, 8);
1932 		dest += stride;
1933 	} while (--height);
1934 }
1935 
MC_avg_xy_8_vis(uint8_t * dest,uint8_t * _ref,int stride,int height)1936 static void MC_avg_xy_8_vis (uint8_t * dest, uint8_t * _ref,
1937 			     int stride, int height)
1938 {
1939 	uint8_t *ref = (uint8_t *) _ref;
1940 	unsigned long off = (unsigned long) ref & 0x7;
1941 	unsigned long off_plus_1 = off + 1;
1942 	int stride_8 = stride + 8;
1943 
1944 	vis_set_gsr(4 << VIS_GSR_SCALEFACT_SHIFT);
1945 
1946 	ref = vis_alignaddr(ref);
1947 
1948 	vis_ld64(ref[0], TMP0);
1949 	vis_fzero(ZERO);
1950 
1951 	vis_ld64_2(ref, 8, TMP2);
1952 
1953 	vis_ld64(constants6[0], CONST_6);
1954 
1955 	vis_ld64(constants256_1024[0], CONST_256);
1956 	vis_faligndata(TMP0, TMP2, REF_S0);
1957 
1958 	if (off != 0x7) {
1959 		vis_alignaddr_g0((void *)off_plus_1);
1960 		vis_faligndata(TMP0, TMP2, REF_S2);
1961 	} else {
1962 		vis_src1(TMP2, REF_S2);
1963 	}
1964 
1965 	height >>= 1;
1966 	do {	/* 31 cycles */
1967 		vis_ld64_2(ref, stride, TMP0);
1968 		vis_mul8x16au(REF_S0, CONST_256, TMP8);
1969 		vis_pmerge(ZERO,      REF_S0_1,  TMP10);
1970 
1971 		vis_ld64_2(ref, stride_8, TMP2);
1972 		ref += stride;
1973 		vis_mul8x16au(REF_S2, CONST_256, TMP12);
1974 		vis_pmerge(ZERO,      REF_S2_1,  TMP14);
1975 
1976 		vis_alignaddr_g0((void *)off);
1977 
1978 		vis_ld64_2(ref, stride, TMP4);
1979 		vis_faligndata(TMP0, TMP2, REF_S4);
1980 
1981 		vis_ld64_2(ref, stride_8, TMP6);
1982 		ref += stride;
1983 
1984 		vis_ld64(dest[0], DST_0);
1985 		vis_faligndata(TMP4, TMP6, REF_S0);
1986 
1987 		vis_ld64_2(dest, stride, DST_2);
1988 
1989 		if (off != 0x7) {
1990 			vis_alignaddr_g0((void *)off_plus_1);
1991 			vis_faligndata(TMP0, TMP2, REF_S6);
1992 			vis_faligndata(TMP4, TMP6, REF_S2);
1993 		} else {
1994 			vis_src1(TMP2, REF_S6);
1995 			vis_src1(TMP6, REF_S2);
1996 		}
1997 
1998 		vis_mul8x16al(DST_0,   CONST_1024, TMP30);
1999 		vis_pmerge(ZERO, REF_S4, TMP22);
2000 
2001 		vis_mul8x16al(DST_1,   CONST_1024, TMP32);
2002 		vis_pmerge(ZERO,      REF_S4_1,  TMP24);
2003 
2004 		vis_mul8x16au(REF_S6, CONST_256, TMP26);
2005 		vis_pmerge(ZERO,      REF_S6_1,  TMP28);
2006 
2007 		vis_mul8x16au(REF_S0, CONST_256, REF_S4);
2008 		vis_padd16(TMP22, CONST_6, TMP22);
2009 
2010 		vis_mul8x16au(REF_S0_1, CONST_256, REF_S6);
2011 		vis_padd16(TMP24, CONST_6, TMP24);
2012 
2013 		vis_mul8x16al(DST_2,   CONST_1024, REF_0);
2014 		vis_padd16(TMP22, TMP26, TMP22);
2015 
2016 		vis_mul8x16al(DST_3,   CONST_1024, REF_2);
2017 		vis_padd16(TMP24, TMP28, TMP24);
2018 
2019 		vis_mul8x16au(REF_S2, CONST_256, TMP26);
2020 		vis_padd16(TMP8, TMP22, TMP8);
2021 
2022 		vis_mul8x16au(REF_S2_1, CONST_256, TMP28);
2023 		vis_padd16(TMP10, TMP24, TMP10);
2024 
2025 		vis_padd16(TMP8, TMP12, TMP8);
2026 
2027 		vis_padd16(TMP10, TMP14, TMP10);
2028 
2029 		vis_padd16(TMP8, TMP30, TMP8);
2030 
2031 		vis_padd16(TMP10, TMP32, TMP10);
2032 		vis_pack16(TMP8, DST_0);
2033 
2034 		vis_pack16(TMP10, DST_1);
2035 		vis_st64(DST_0, dest[0]);
2036 		dest += stride;
2037 
2038 		vis_padd16(REF_S4, TMP22, TMP12);
2039 
2040 		vis_padd16(REF_S6, TMP24, TMP14);
2041 
2042 		vis_padd16(TMP12, TMP26, TMP12);
2043 
2044 		vis_padd16(TMP14, TMP28, TMP14);
2045 
2046 		vis_padd16(TMP12, REF_0, TMP12);
2047 
2048 		vis_padd16(TMP14, REF_2, TMP14);
2049 		vis_pack16(TMP12, DST_2);
2050 
2051 		vis_pack16(TMP14, DST_3);
2052 		vis_st64(DST_2, dest[0]);
2053 		dest += stride;
2054 	} while (--height);
2055 }
2056 
2057 MPEG2_MC_EXTERN(vis);
2058 
2059 #endif  /* defined(ARCH_SPARC) && defined(ENABLE_VIS) */
2060