2 * Copyright (C) 2003 David S. Miller <davem@redhat.com>
4 * This file is part of Libav.
6 * Libav is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * Libav is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with Libav; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 /* The *no_round* functions have been added by James A. Morrison, 2003,2004.
22 The vis code from libmpeg2 was adapted for libavcodec by James A. Morrison.
28 #include "libavutil/attributes.h"
29 #include "libavutil/mem.h"
30 #include "libavcodec/hpeldsp.h"
33 /* The trick used in some of this file is the formula from the MMX
34 * motion comp code, which is:
36 * (x+y+1)>>1 == (x|y)-((x^y)>>1)
38 * This allows us to average 8 bytes at a time in a 64-bit FPU reg.
39 * We avoid overflows by masking before we do the shift, and we
40 * implement the shift by multiplying by 1/2 using mul8x16. So in
41 * VIS this is (assume 'x' is in f0, 'y' is in f2, a repeating mask
42 * of '0xfe' is in f4, a repeating mask of '0x7f' is in f6, and
43 * the value 0x80808080 is in f8):
47 * fmul8x16 f8, f10, f10
50 * fpsub16 f12, f10, f10
53 #define DUP4(x) {x, x, x, x}
54 #define DUP8(x) {x, x, x, x, x, x, x, x}
55 DECLARE_ALIGNED(8, static const int16_t, constants1)[] = DUP4 (1);
56 DECLARE_ALIGNED(8, static const int16_t, constants2)[] = DUP4 (2);
57 DECLARE_ALIGNED(8, static const int16_t, constants3)[] = DUP4 (3);
58 DECLARE_ALIGNED(8, static const int16_t, constants6)[] = DUP4 (6);
59 DECLARE_ALIGNED(8, static const int8_t, constants_fe)[] = DUP8 (0xfe);
60 DECLARE_ALIGNED(8, static const int8_t, constants_7f)[] = DUP8 (0x7f);
61 DECLARE_ALIGNED(8, static const int8_t, constants128)[] = DUP8 (128);
62 DECLARE_ALIGNED(8, static const int16_t, constants256_512)[] =
64 DECLARE_ALIGNED(8, static const int16_t, constants256_1024)[] =
65 {256, 1024, 256, 1024};
120 static void MC_put_o_16_vis (uint8_t * dest, const uint8_t * ref,
121 const ptrdiff_t stride, int height)
123 ref = vis_alignaddr(ref);
125 vis_ld64(ref[0], TMP0);
127 vis_ld64_2(ref, 8, TMP2);
129 vis_ld64_2(ref, 16, TMP4);
132 vis_faligndata(TMP0, TMP2, REF_0);
133 vis_st64(REF_0, dest[0]);
135 vis_faligndata(TMP2, TMP4, REF_2);
136 vis_st64_2(REF_2, dest, 8);
141 static void MC_put_o_8_vis (uint8_t * dest, const uint8_t * ref,
142 const ptrdiff_t stride, int height)
144 ref = vis_alignaddr(ref);
146 vis_ld64(ref[0], TMP0);
148 vis_ld64(ref[8], TMP2);
153 vis_faligndata(TMP0, TMP2, REF_0);
154 vis_st64(REF_0, dest[0]);
160 static void MC_avg_o_16_vis (uint8_t * dest, const uint8_t * ref,
161 const ptrdiff_t stride, int height)
163 int stride_8 = stride + 8;
165 ref = vis_alignaddr(ref);
167 vis_ld64(ref[0], TMP0);
169 vis_ld64(ref[8], TMP2);
171 vis_ld64(ref[16], TMP4);
173 vis_ld64(dest[0], DST_0);
175 vis_ld64(dest[8], DST_2);
177 vis_ld64(constants_fe[0], MASK_fe);
178 vis_faligndata(TMP0, TMP2, REF_0);
180 vis_ld64(constants_7f[0], MASK_7f);
181 vis_faligndata(TMP2, TMP4, REF_2);
183 vis_ld64(constants128[0], CONST_128);
186 height = (height >> 1) - 1;
189 vis_ld64(ref[0], TMP0);
190 vis_xor(DST_0, REF_0, TMP6);
192 vis_ld64_2(ref, 8, TMP2);
193 vis_and(TMP6, MASK_fe, TMP6);
195 vis_ld64_2(ref, 16, TMP4);
197 vis_mul8x16(CONST_128, TMP6, TMP6);
198 vis_xor(DST_2, REF_2, TMP8);
200 vis_and(TMP8, MASK_fe, TMP8);
202 vis_or(DST_0, REF_0, TMP10);
203 vis_ld64_2(dest, stride, DST_0);
204 vis_mul8x16(CONST_128, TMP8, TMP8);
206 vis_or(DST_2, REF_2, TMP12);
207 vis_ld64_2(dest, stride_8, DST_2);
209 vis_ld64(ref[0], TMP14);
210 vis_and(TMP6, MASK_7f, TMP6);
212 vis_and(TMP8, MASK_7f, TMP8);
214 vis_psub16(TMP10, TMP6, TMP6);
215 vis_st64(TMP6, dest[0]);
217 vis_psub16(TMP12, TMP8, TMP8);
218 vis_st64_2(TMP8, dest, 8);
221 vis_ld64_2(ref, 8, TMP16);
222 vis_faligndata(TMP0, TMP2, REF_0);
224 vis_ld64_2(ref, 16, TMP18);
225 vis_faligndata(TMP2, TMP4, REF_2);
228 vis_xor(DST_0, REF_0, TMP20);
230 vis_and(TMP20, MASK_fe, TMP20);
232 vis_xor(DST_2, REF_2, TMP22);
233 vis_mul8x16(CONST_128, TMP20, TMP20);
235 vis_and(TMP22, MASK_fe, TMP22);
237 vis_or(DST_0, REF_0, TMP24);
238 vis_mul8x16(CONST_128, TMP22, TMP22);
240 vis_or(DST_2, REF_2, TMP26);
242 vis_ld64_2(dest, stride, DST_0);
243 vis_faligndata(TMP14, TMP16, REF_0);
245 vis_ld64_2(dest, stride_8, DST_2);
246 vis_faligndata(TMP16, TMP18, REF_2);
248 vis_and(TMP20, MASK_7f, TMP20);
250 vis_and(TMP22, MASK_7f, TMP22);
252 vis_psub16(TMP24, TMP20, TMP20);
253 vis_st64(TMP20, dest[0]);
255 vis_psub16(TMP26, TMP22, TMP22);
256 vis_st64_2(TMP22, dest, 8);
260 vis_ld64(ref[0], TMP0);
261 vis_xor(DST_0, REF_0, TMP6);
263 vis_ld64_2(ref, 8, TMP2);
264 vis_and(TMP6, MASK_fe, TMP6);
266 vis_ld64_2(ref, 16, TMP4);
267 vis_mul8x16(CONST_128, TMP6, TMP6);
268 vis_xor(DST_2, REF_2, TMP8);
270 vis_and(TMP8, MASK_fe, TMP8);
272 vis_or(DST_0, REF_0, TMP10);
273 vis_ld64_2(dest, stride, DST_0);
274 vis_mul8x16(CONST_128, TMP8, TMP8);
276 vis_or(DST_2, REF_2, TMP12);
277 vis_ld64_2(dest, stride_8, DST_2);
279 vis_ld64(ref[0], TMP14);
280 vis_and(TMP6, MASK_7f, TMP6);
282 vis_and(TMP8, MASK_7f, TMP8);
284 vis_psub16(TMP10, TMP6, TMP6);
285 vis_st64(TMP6, dest[0]);
287 vis_psub16(TMP12, TMP8, TMP8);
288 vis_st64_2(TMP8, dest, 8);
291 vis_faligndata(TMP0, TMP2, REF_0);
293 vis_faligndata(TMP2, TMP4, REF_2);
295 vis_xor(DST_0, REF_0, TMP20);
297 vis_and(TMP20, MASK_fe, TMP20);
299 vis_xor(DST_2, REF_2, TMP22);
300 vis_mul8x16(CONST_128, TMP20, TMP20);
302 vis_and(TMP22, MASK_fe, TMP22);
304 vis_or(DST_0, REF_0, TMP24);
305 vis_mul8x16(CONST_128, TMP22, TMP22);
307 vis_or(DST_2, REF_2, TMP26);
309 vis_and(TMP20, MASK_7f, TMP20);
311 vis_and(TMP22, MASK_7f, TMP22);
313 vis_psub16(TMP24, TMP20, TMP20);
314 vis_st64(TMP20, dest[0]);
316 vis_psub16(TMP26, TMP22, TMP22);
317 vis_st64_2(TMP22, dest, 8);
320 static void MC_avg_o_8_vis (uint8_t * dest, const uint8_t * ref,
321 const ptrdiff_t stride, int height)
323 ref = vis_alignaddr(ref);
325 vis_ld64(ref[0], TMP0);
327 vis_ld64(ref[8], TMP2);
329 vis_ld64(dest[0], DST_0);
331 vis_ld64(constants_fe[0], MASK_fe);
333 vis_ld64(constants_7f[0], MASK_7f);
334 vis_faligndata(TMP0, TMP2, REF_0);
336 vis_ld64(constants128[0], CONST_128);
339 height = (height >> 1) - 1;
342 vis_ld64(ref[0], TMP0);
343 vis_xor(DST_0, REF_0, TMP4);
345 vis_ld64(ref[8], TMP2);
346 vis_and(TMP4, MASK_fe, TMP4);
348 vis_or(DST_0, REF_0, TMP6);
349 vis_ld64_2(dest, stride, DST_0);
351 vis_mul8x16(CONST_128, TMP4, TMP4);
353 vis_ld64(ref[0], TMP12);
354 vis_faligndata(TMP0, TMP2, REF_0);
356 vis_ld64(ref[8], TMP2);
357 vis_xor(DST_0, REF_0, TMP0);
360 vis_and(TMP0, MASK_fe, TMP0);
362 vis_and(TMP4, MASK_7f, TMP4);
364 vis_psub16(TMP6, TMP4, TMP4);
365 vis_st64(TMP4, dest[0]);
367 vis_mul8x16(CONST_128, TMP0, TMP0);
369 vis_or(DST_0, REF_0, TMP6);
370 vis_ld64_2(dest, stride, DST_0);
372 vis_faligndata(TMP12, TMP2, REF_0);
374 vis_and(TMP0, MASK_7f, TMP0);
376 vis_psub16(TMP6, TMP0, TMP4);
377 vis_st64(TMP4, dest[0]);
381 vis_ld64(ref[0], TMP0);
382 vis_xor(DST_0, REF_0, TMP4);
384 vis_ld64(ref[8], TMP2);
385 vis_and(TMP4, MASK_fe, TMP4);
387 vis_or(DST_0, REF_0, TMP6);
388 vis_ld64_2(dest, stride, DST_0);
389 vis_mul8x16(CONST_128, TMP4, TMP4);
391 vis_faligndata(TMP0, TMP2, REF_0);
393 vis_xor(DST_0, REF_0, TMP0);
395 vis_and(TMP0, MASK_fe, TMP0);
397 vis_and(TMP4, MASK_7f, TMP4);
399 vis_psub16(TMP6, TMP4, TMP4);
400 vis_st64(TMP4, dest[0]);
402 vis_mul8x16(CONST_128, TMP0, TMP0);
404 vis_or(DST_0, REF_0, TMP6);
406 vis_and(TMP0, MASK_7f, TMP0);
408 vis_psub16(TMP6, TMP0, TMP4);
409 vis_st64(TMP4, dest[0]);
412 static void MC_put_x_16_vis (uint8_t * dest, const uint8_t * ref,
413 const ptrdiff_t stride, int height)
415 unsigned long off = (unsigned long) ref & 0x7;
416 unsigned long off_plus_1 = off + 1;
418 ref = vis_alignaddr(ref);
420 vis_ld64(ref[0], TMP0);
422 vis_ld64_2(ref, 8, TMP2);
424 vis_ld64_2(ref, 16, TMP4);
426 vis_ld64(constants_fe[0], MASK_fe);
428 vis_ld64(constants_7f[0], MASK_7f);
429 vis_faligndata(TMP0, TMP2, REF_0);
431 vis_ld64(constants128[0], CONST_128);
432 vis_faligndata(TMP2, TMP4, REF_4);
435 vis_alignaddr_g0((void *)off_plus_1);
436 vis_faligndata(TMP0, TMP2, REF_2);
437 vis_faligndata(TMP2, TMP4, REF_6);
439 vis_src1(TMP2, REF_2);
440 vis_src1(TMP4, REF_6);
444 height = (height >> 1) - 1;
447 vis_ld64(ref[0], TMP0);
448 vis_xor(REF_0, REF_2, TMP6);
450 vis_ld64_2(ref, 8, TMP2);
451 vis_xor(REF_4, REF_6, TMP8);
453 vis_ld64_2(ref, 16, TMP4);
454 vis_and(TMP6, MASK_fe, TMP6);
457 vis_ld64(ref[0], TMP14);
458 vis_mul8x16(CONST_128, TMP6, TMP6);
459 vis_and(TMP8, MASK_fe, TMP8);
461 vis_ld64_2(ref, 8, TMP16);
462 vis_mul8x16(CONST_128, TMP8, TMP8);
463 vis_or(REF_0, REF_2, TMP10);
465 vis_ld64_2(ref, 16, TMP18);
467 vis_or(REF_4, REF_6, TMP12);
469 vis_alignaddr_g0((void *)off);
471 vis_faligndata(TMP0, TMP2, REF_0);
473 vis_faligndata(TMP2, TMP4, REF_4);
476 vis_alignaddr_g0((void *)off_plus_1);
477 vis_faligndata(TMP0, TMP2, REF_2);
478 vis_faligndata(TMP2, TMP4, REF_6);
480 vis_src1(TMP2, REF_2);
481 vis_src1(TMP4, REF_6);
484 vis_and(TMP6, MASK_7f, TMP6);
486 vis_and(TMP8, MASK_7f, TMP8);
488 vis_psub16(TMP10, TMP6, TMP6);
489 vis_st64(TMP6, dest[0]);
491 vis_psub16(TMP12, TMP8, TMP8);
492 vis_st64_2(TMP8, dest, 8);
495 vis_xor(REF_0, REF_2, TMP6);
497 vis_xor(REF_4, REF_6, TMP8);
499 vis_and(TMP6, MASK_fe, TMP6);
501 vis_mul8x16(CONST_128, TMP6, TMP6);
502 vis_and(TMP8, MASK_fe, TMP8);
504 vis_mul8x16(CONST_128, TMP8, TMP8);
505 vis_or(REF_0, REF_2, TMP10);
507 vis_or(REF_4, REF_6, TMP12);
509 vis_alignaddr_g0((void *)off);
511 vis_faligndata(TMP14, TMP16, REF_0);
513 vis_faligndata(TMP16, TMP18, REF_4);
516 vis_alignaddr_g0((void *)off_plus_1);
517 vis_faligndata(TMP14, TMP16, REF_2);
518 vis_faligndata(TMP16, TMP18, REF_6);
520 vis_src1(TMP16, REF_2);
521 vis_src1(TMP18, REF_6);
524 vis_and(TMP6, MASK_7f, TMP6);
526 vis_and(TMP8, MASK_7f, TMP8);
528 vis_psub16(TMP10, TMP6, TMP6);
529 vis_st64(TMP6, dest[0]);
531 vis_psub16(TMP12, TMP8, TMP8);
532 vis_st64_2(TMP8, dest, 8);
536 vis_ld64(ref[0], TMP0);
537 vis_xor(REF_0, REF_2, TMP6);
539 vis_ld64_2(ref, 8, TMP2);
540 vis_xor(REF_4, REF_6, TMP8);
542 vis_ld64_2(ref, 16, TMP4);
543 vis_and(TMP6, MASK_fe, TMP6);
545 vis_mul8x16(CONST_128, TMP6, TMP6);
546 vis_and(TMP8, MASK_fe, TMP8);
548 vis_mul8x16(CONST_128, TMP8, TMP8);
549 vis_or(REF_0, REF_2, TMP10);
551 vis_or(REF_4, REF_6, TMP12);
553 vis_alignaddr_g0((void *)off);
555 vis_faligndata(TMP0, TMP2, REF_0);
557 vis_faligndata(TMP2, TMP4, REF_4);
560 vis_alignaddr_g0((void *)off_plus_1);
561 vis_faligndata(TMP0, TMP2, REF_2);
562 vis_faligndata(TMP2, TMP4, REF_6);
564 vis_src1(TMP2, REF_2);
565 vis_src1(TMP4, REF_6);
568 vis_and(TMP6, MASK_7f, TMP6);
570 vis_and(TMP8, MASK_7f, TMP8);
572 vis_psub16(TMP10, TMP6, TMP6);
573 vis_st64(TMP6, dest[0]);
575 vis_psub16(TMP12, TMP8, TMP8);
576 vis_st64_2(TMP8, dest, 8);
579 vis_xor(REF_0, REF_2, TMP6);
581 vis_xor(REF_4, REF_6, TMP8);
583 vis_and(TMP6, MASK_fe, TMP6);
585 vis_mul8x16(CONST_128, TMP6, TMP6);
586 vis_and(TMP8, MASK_fe, TMP8);
588 vis_mul8x16(CONST_128, TMP8, TMP8);
589 vis_or(REF_0, REF_2, TMP10);
591 vis_or(REF_4, REF_6, TMP12);
593 vis_and(TMP6, MASK_7f, TMP6);
595 vis_and(TMP8, MASK_7f, TMP8);
597 vis_psub16(TMP10, TMP6, TMP6);
598 vis_st64(TMP6, dest[0]);
600 vis_psub16(TMP12, TMP8, TMP8);
601 vis_st64_2(TMP8, dest, 8);
604 static void MC_put_x_8_vis (uint8_t * dest, const uint8_t * ref,
605 const ptrdiff_t stride, int height)
607 unsigned long off = (unsigned long) ref & 0x7;
608 unsigned long off_plus_1 = off + 1;
610 ref = vis_alignaddr(ref);
612 vis_ld64(ref[0], TMP0);
614 vis_ld64(ref[8], TMP2);
616 vis_ld64(constants_fe[0], MASK_fe);
618 vis_ld64(constants_7f[0], MASK_7f);
620 vis_ld64(constants128[0], CONST_128);
621 vis_faligndata(TMP0, TMP2, REF_0);
624 vis_alignaddr_g0((void *)off_plus_1);
625 vis_faligndata(TMP0, TMP2, REF_2);
627 vis_src1(TMP2, REF_2);
631 height = (height >> 1) - 1;
634 vis_ld64(ref[0], TMP0);
635 vis_xor(REF_0, REF_2, TMP4);
637 vis_ld64_2(ref, 8, TMP2);
638 vis_and(TMP4, MASK_fe, TMP4);
641 vis_ld64(ref[0], TMP8);
642 vis_or(REF_0, REF_2, TMP6);
643 vis_mul8x16(CONST_128, TMP4, TMP4);
645 vis_alignaddr_g0((void *)off);
647 vis_ld64_2(ref, 8, TMP10);
649 vis_faligndata(TMP0, TMP2, REF_0);
652 vis_alignaddr_g0((void *)off_plus_1);
653 vis_faligndata(TMP0, TMP2, REF_2);
655 vis_src1(TMP2, REF_2);
658 vis_and(TMP4, MASK_7f, TMP4);
660 vis_psub16(TMP6, TMP4, DST_0);
661 vis_st64(DST_0, dest[0]);
664 vis_xor(REF_0, REF_2, TMP12);
666 vis_and(TMP12, MASK_fe, TMP12);
668 vis_or(REF_0, REF_2, TMP14);
669 vis_mul8x16(CONST_128, TMP12, TMP12);
671 vis_alignaddr_g0((void *)off);
672 vis_faligndata(TMP8, TMP10, REF_0);
674 vis_alignaddr_g0((void *)off_plus_1);
675 vis_faligndata(TMP8, TMP10, REF_2);
677 vis_src1(TMP10, REF_2);
680 vis_and(TMP12, MASK_7f, TMP12);
682 vis_psub16(TMP14, TMP12, DST_0);
683 vis_st64(DST_0, dest[0]);
687 vis_ld64(ref[0], TMP0);
688 vis_xor(REF_0, REF_2, TMP4);
690 vis_ld64_2(ref, 8, TMP2);
691 vis_and(TMP4, MASK_fe, TMP4);
693 vis_or(REF_0, REF_2, TMP6);
694 vis_mul8x16(CONST_128, TMP4, TMP4);
696 vis_alignaddr_g0((void *)off);
698 vis_faligndata(TMP0, TMP2, REF_0);
701 vis_alignaddr_g0((void *)off_plus_1);
702 vis_faligndata(TMP0, TMP2, REF_2);
704 vis_src1(TMP2, REF_2);
707 vis_and(TMP4, MASK_7f, TMP4);
709 vis_psub16(TMP6, TMP4, DST_0);
710 vis_st64(DST_0, dest[0]);
713 vis_xor(REF_0, REF_2, TMP12);
715 vis_and(TMP12, MASK_fe, TMP12);
717 vis_or(REF_0, REF_2, TMP14);
718 vis_mul8x16(CONST_128, TMP12, TMP12);
720 vis_and(TMP12, MASK_7f, TMP12);
722 vis_psub16(TMP14, TMP12, DST_0);
723 vis_st64(DST_0, dest[0]);
727 static void MC_avg_x_16_vis (uint8_t * dest, const uint8_t * ref,
728 const ptrdiff_t stride, int height)
730 unsigned long off = (unsigned long) ref & 0x7;
731 unsigned long off_plus_1 = off + 1;
733 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
735 vis_ld64(constants3[0], CONST_3);
737 vis_ld64(constants256_512[0], CONST_256);
739 ref = vis_alignaddr(ref);
741 vis_ld64(ref[0], TMP0);
743 vis_ld64(ref[8], TMP2);
745 vis_alignaddr_g0((void *)off);
747 vis_ld64(ref[16], TMP4);
749 vis_ld64(dest[0], DST_0);
750 vis_faligndata(TMP0, TMP2, REF_0);
752 vis_ld64(dest[8], DST_2);
753 vis_faligndata(TMP2, TMP4, REF_4);
756 vis_alignaddr_g0((void *)off_plus_1);
757 vis_faligndata(TMP0, TMP2, REF_2);
758 vis_faligndata(TMP2, TMP4, REF_6);
760 vis_src1(TMP2, REF_2);
761 vis_src1(TMP4, REF_6);
764 vis_mul8x16au(REF_0, CONST_256, TMP0);
766 vis_pmerge(ZERO, REF_2, TMP4);
767 vis_mul8x16au(REF_0_1, CONST_256, TMP2);
769 vis_pmerge(ZERO, REF_2_1, TMP6);
771 vis_padd16(TMP0, TMP4, TMP0);
773 vis_mul8x16al(DST_0, CONST_512, TMP4);
774 vis_padd16(TMP2, TMP6, TMP2);
776 vis_mul8x16al(DST_1, CONST_512, TMP6);
778 vis_mul8x16au(REF_6, CONST_256, TMP12);
780 vis_padd16(TMP0, TMP4, TMP0);
781 vis_mul8x16au(REF_6_1, CONST_256, TMP14);
783 vis_padd16(TMP2, TMP6, TMP2);
784 vis_mul8x16au(REF_4, CONST_256, TMP16);
786 vis_padd16(TMP0, CONST_3, TMP8);
787 vis_mul8x16au(REF_4_1, CONST_256, TMP18);
789 vis_padd16(TMP2, CONST_3, TMP10);
790 vis_pack16(TMP8, DST_0);
792 vis_pack16(TMP10, DST_1);
793 vis_padd16(TMP16, TMP12, TMP0);
795 vis_st64(DST_0, dest[0]);
796 vis_mul8x16al(DST_2, CONST_512, TMP4);
797 vis_padd16(TMP18, TMP14, TMP2);
799 vis_mul8x16al(DST_3, CONST_512, TMP6);
800 vis_padd16(TMP0, CONST_3, TMP0);
802 vis_padd16(TMP2, CONST_3, TMP2);
804 vis_padd16(TMP0, TMP4, TMP0);
806 vis_padd16(TMP2, TMP6, TMP2);
807 vis_pack16(TMP0, DST_2);
809 vis_pack16(TMP2, DST_3);
810 vis_st64(DST_2, dest[8]);
817 static void MC_avg_x_8_vis (uint8_t * dest, const uint8_t * ref,
818 const ptrdiff_t stride, int height)
820 unsigned long off = (unsigned long) ref & 0x7;
821 unsigned long off_plus_1 = off + 1;
822 int stride_times_2 = stride << 1;
824 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
826 vis_ld64(constants3[0], CONST_3);
828 vis_ld64(constants256_512[0], CONST_256);
830 ref = vis_alignaddr(ref);
833 vis_ld64(ref[0], TMP0);
835 vis_ld64_2(ref, 8, TMP2);
838 vis_alignaddr_g0((void *)off);
840 vis_ld64(ref[0], TMP4);
841 vis_faligndata(TMP0, TMP2, REF_0);
843 vis_ld64_2(ref, 8, TMP6);
846 vis_ld64(ref[0], TMP8);
848 vis_ld64_2(ref, 8, TMP10);
850 vis_faligndata(TMP4, TMP6, REF_4);
852 vis_ld64(ref[0], TMP12);
854 vis_ld64_2(ref, 8, TMP14);
856 vis_faligndata(TMP8, TMP10, REF_S0);
858 vis_faligndata(TMP12, TMP14, REF_S4);
861 vis_alignaddr_g0((void *)off_plus_1);
863 vis_ld64(dest[0], DST_0);
864 vis_faligndata(TMP0, TMP2, REF_2);
866 vis_ld64_2(dest, stride, DST_2);
867 vis_faligndata(TMP4, TMP6, REF_6);
869 vis_faligndata(TMP8, TMP10, REF_S2);
871 vis_faligndata(TMP12, TMP14, REF_S6);
873 vis_ld64(dest[0], DST_0);
874 vis_src1(TMP2, REF_2);
876 vis_ld64_2(dest, stride, DST_2);
877 vis_src1(TMP6, REF_6);
879 vis_src1(TMP10, REF_S2);
881 vis_src1(TMP14, REF_S6);
884 vis_pmerge(ZERO, REF_0, TMP0);
885 vis_mul8x16au(REF_0_1, CONST_256, TMP2);
887 vis_pmerge(ZERO, REF_2, TMP4);
888 vis_mul8x16au(REF_2_1, CONST_256, TMP6);
890 vis_padd16(TMP0, CONST_3, TMP0);
891 vis_mul8x16al(DST_0, CONST_512, TMP16);
893 vis_padd16(TMP2, CONST_3, TMP2);
894 vis_mul8x16al(DST_1, CONST_512, TMP18);
896 vis_padd16(TMP0, TMP4, TMP0);
897 vis_mul8x16au(REF_4, CONST_256, TMP8);
899 vis_padd16(TMP2, TMP6, TMP2);
900 vis_mul8x16au(REF_4_1, CONST_256, TMP10);
902 vis_padd16(TMP0, TMP16, TMP0);
903 vis_mul8x16au(REF_6, CONST_256, TMP12);
905 vis_padd16(TMP2, TMP18, TMP2);
906 vis_mul8x16au(REF_6_1, CONST_256, TMP14);
908 vis_padd16(TMP8, CONST_3, TMP8);
909 vis_mul8x16al(DST_2, CONST_512, TMP16);
911 vis_padd16(TMP8, TMP12, TMP8);
912 vis_mul8x16al(DST_3, CONST_512, TMP18);
914 vis_padd16(TMP10, TMP14, TMP10);
915 vis_pack16(TMP0, DST_0);
917 vis_pack16(TMP2, DST_1);
918 vis_st64(DST_0, dest[0]);
920 vis_padd16(TMP10, CONST_3, TMP10);
922 vis_ld64_2(dest, stride, DST_0);
923 vis_padd16(TMP8, TMP16, TMP8);
925 vis_ld64_2(dest, stride_times_2, TMP4/*DST_2*/);
926 vis_padd16(TMP10, TMP18, TMP10);
927 vis_pack16(TMP8, DST_2);
929 vis_pack16(TMP10, DST_3);
930 vis_st64(DST_2, dest[0]);
933 vis_mul8x16au(REF_S0_1, CONST_256, TMP2);
934 vis_pmerge(ZERO, REF_S0, TMP0);
936 vis_pmerge(ZERO, REF_S2, TMP24);
937 vis_mul8x16au(REF_S2_1, CONST_256, TMP6);
939 vis_padd16(TMP0, CONST_3, TMP0);
940 vis_mul8x16au(REF_S4, CONST_256, TMP8);
942 vis_padd16(TMP2, CONST_3, TMP2);
943 vis_mul8x16au(REF_S4_1, CONST_256, TMP10);
945 vis_padd16(TMP0, TMP24, TMP0);
946 vis_mul8x16au(REF_S6, CONST_256, TMP12);
948 vis_padd16(TMP2, TMP6, TMP2);
949 vis_mul8x16au(REF_S6_1, CONST_256, TMP14);
951 vis_padd16(TMP8, CONST_3, TMP8);
952 vis_mul8x16al(DST_0, CONST_512, TMP16);
954 vis_padd16(TMP10, CONST_3, TMP10);
955 vis_mul8x16al(DST_1, CONST_512, TMP18);
957 vis_padd16(TMP8, TMP12, TMP8);
958 vis_mul8x16al(TMP4/*DST_2*/, CONST_512, TMP20);
960 vis_mul8x16al(TMP5/*DST_3*/, CONST_512, TMP22);
961 vis_padd16(TMP0, TMP16, TMP0);
963 vis_padd16(TMP2, TMP18, TMP2);
964 vis_pack16(TMP0, DST_0);
966 vis_padd16(TMP10, TMP14, TMP10);
967 vis_pack16(TMP2, DST_1);
968 vis_st64(DST_0, dest[0]);
971 vis_padd16(TMP8, TMP20, TMP8);
973 vis_padd16(TMP10, TMP22, TMP10);
974 vis_pack16(TMP8, DST_2);
976 vis_pack16(TMP10, DST_3);
977 vis_st64(DST_2, dest[0]);
982 static void MC_put_y_16_vis (uint8_t * dest, const uint8_t * ref,
983 const ptrdiff_t stride, int height)
985 ref = vis_alignaddr(ref);
986 vis_ld64(ref[0], TMP0);
988 vis_ld64_2(ref, 8, TMP2);
990 vis_ld64_2(ref, 16, TMP4);
993 vis_ld64(ref[0], TMP6);
994 vis_faligndata(TMP0, TMP2, REF_0);
996 vis_ld64_2(ref, 8, TMP8);
997 vis_faligndata(TMP2, TMP4, REF_4);
999 vis_ld64_2(ref, 16, TMP10);
1002 vis_ld64(constants_fe[0], MASK_fe);
1003 vis_faligndata(TMP6, TMP8, REF_2);
1005 vis_ld64(constants_7f[0], MASK_7f);
1006 vis_faligndata(TMP8, TMP10, REF_6);
1008 vis_ld64(constants128[0], CONST_128);
1009 height = (height >> 1) - 1;
1010 do { /* 24 cycles */
1011 vis_ld64(ref[0], TMP0);
1012 vis_xor(REF_0, REF_2, TMP12);
1014 vis_ld64_2(ref, 8, TMP2);
1015 vis_xor(REF_4, REF_6, TMP16);
1017 vis_ld64_2(ref, 16, TMP4);
1019 vis_or(REF_0, REF_2, TMP14);
1021 vis_ld64(ref[0], TMP6);
1022 vis_or(REF_4, REF_6, TMP18);
1024 vis_ld64_2(ref, 8, TMP8);
1025 vis_faligndata(TMP0, TMP2, REF_0);
1027 vis_ld64_2(ref, 16, TMP10);
1029 vis_faligndata(TMP2, TMP4, REF_4);
1031 vis_and(TMP12, MASK_fe, TMP12);
1033 vis_and(TMP16, MASK_fe, TMP16);
1034 vis_mul8x16(CONST_128, TMP12, TMP12);
1036 vis_mul8x16(CONST_128, TMP16, TMP16);
1037 vis_xor(REF_0, REF_2, TMP0);
1039 vis_xor(REF_4, REF_6, TMP2);
1041 vis_or(REF_0, REF_2, TMP20);
1043 vis_and(TMP12, MASK_7f, TMP12);
1045 vis_and(TMP16, MASK_7f, TMP16);
1047 vis_psub16(TMP14, TMP12, TMP12);
1048 vis_st64(TMP12, dest[0]);
1050 vis_psub16(TMP18, TMP16, TMP16);
1051 vis_st64_2(TMP16, dest, 8);
1054 vis_or(REF_4, REF_6, TMP18);
1056 vis_and(TMP0, MASK_fe, TMP0);
1058 vis_and(TMP2, MASK_fe, TMP2);
1059 vis_mul8x16(CONST_128, TMP0, TMP0);
1061 vis_faligndata(TMP6, TMP8, REF_2);
1062 vis_mul8x16(CONST_128, TMP2, TMP2);
1064 vis_faligndata(TMP8, TMP10, REF_6);
1066 vis_and(TMP0, MASK_7f, TMP0);
1068 vis_and(TMP2, MASK_7f, TMP2);
1070 vis_psub16(TMP20, TMP0, TMP0);
1071 vis_st64(TMP0, dest[0]);
1073 vis_psub16(TMP18, TMP2, TMP2);
1074 vis_st64_2(TMP2, dest, 8);
1078 vis_ld64(ref[0], TMP0);
1079 vis_xor(REF_0, REF_2, TMP12);
1081 vis_ld64_2(ref, 8, TMP2);
1082 vis_xor(REF_4, REF_6, TMP16);
1084 vis_ld64_2(ref, 16, TMP4);
1085 vis_or(REF_0, REF_2, TMP14);
1087 vis_or(REF_4, REF_6, TMP18);
1089 vis_faligndata(TMP0, TMP2, REF_0);
1091 vis_faligndata(TMP2, TMP4, REF_4);
1093 vis_and(TMP12, MASK_fe, TMP12);
1095 vis_and(TMP16, MASK_fe, TMP16);
1096 vis_mul8x16(CONST_128, TMP12, TMP12);
1098 vis_mul8x16(CONST_128, TMP16, TMP16);
1099 vis_xor(REF_0, REF_2, TMP0);
1101 vis_xor(REF_4, REF_6, TMP2);
1103 vis_or(REF_0, REF_2, TMP20);
1105 vis_and(TMP12, MASK_7f, TMP12);
1107 vis_and(TMP16, MASK_7f, TMP16);
1109 vis_psub16(TMP14, TMP12, TMP12);
1110 vis_st64(TMP12, dest[0]);
1112 vis_psub16(TMP18, TMP16, TMP16);
1113 vis_st64_2(TMP16, dest, 8);
1116 vis_or(REF_4, REF_6, TMP18);
1118 vis_and(TMP0, MASK_fe, TMP0);
1120 vis_and(TMP2, MASK_fe, TMP2);
1121 vis_mul8x16(CONST_128, TMP0, TMP0);
1123 vis_mul8x16(CONST_128, TMP2, TMP2);
1125 vis_and(TMP0, MASK_7f, TMP0);
1127 vis_and(TMP2, MASK_7f, TMP2);
1129 vis_psub16(TMP20, TMP0, TMP0);
1130 vis_st64(TMP0, dest[0]);
1132 vis_psub16(TMP18, TMP2, TMP2);
1133 vis_st64_2(TMP2, dest, 8);
1136 static void MC_put_y_8_vis (uint8_t * dest, const uint8_t * ref,
1137 const ptrdiff_t stride, int height)
1139 ref = vis_alignaddr(ref);
1140 vis_ld64(ref[0], TMP0);
1142 vis_ld64_2(ref, 8, TMP2);
1145 vis_ld64(ref[0], TMP4);
1147 vis_ld64_2(ref, 8, TMP6);
1150 vis_ld64(constants_fe[0], MASK_fe);
1151 vis_faligndata(TMP0, TMP2, REF_0);
1153 vis_ld64(constants_7f[0], MASK_7f);
1154 vis_faligndata(TMP4, TMP6, REF_2);
1156 vis_ld64(constants128[0], CONST_128);
1157 height = (height >> 1) - 1;
1158 do { /* 12 cycles */
1159 vis_ld64(ref[0], TMP0);
1160 vis_xor(REF_0, REF_2, TMP4);
1162 vis_ld64_2(ref, 8, TMP2);
1164 vis_and(TMP4, MASK_fe, TMP4);
1166 vis_or(REF_0, REF_2, TMP6);
1167 vis_mul8x16(CONST_128, TMP4, TMP4);
1169 vis_faligndata(TMP0, TMP2, REF_0);
1170 vis_ld64(ref[0], TMP0);
1172 vis_ld64_2(ref, 8, TMP2);
1174 vis_xor(REF_0, REF_2, TMP12);
1176 vis_and(TMP4, MASK_7f, TMP4);
1178 vis_and(TMP12, MASK_fe, TMP12);
1180 vis_mul8x16(CONST_128, TMP12, TMP12);
1181 vis_or(REF_0, REF_2, TMP14);
1183 vis_psub16(TMP6, TMP4, DST_0);
1184 vis_st64(DST_0, dest[0]);
1187 vis_faligndata(TMP0, TMP2, REF_2);
1189 vis_and(TMP12, MASK_7f, TMP12);
1191 vis_psub16(TMP14, TMP12, DST_0);
1192 vis_st64(DST_0, dest[0]);
1196 vis_ld64(ref[0], TMP0);
1197 vis_xor(REF_0, REF_2, TMP4);
1199 vis_ld64_2(ref, 8, TMP2);
1200 vis_and(TMP4, MASK_fe, TMP4);
1202 vis_or(REF_0, REF_2, TMP6);
1203 vis_mul8x16(CONST_128, TMP4, TMP4);
1205 vis_faligndata(TMP0, TMP2, REF_0);
1207 vis_xor(REF_0, REF_2, TMP12);
1209 vis_and(TMP4, MASK_7f, TMP4);
1211 vis_and(TMP12, MASK_fe, TMP12);
1213 vis_mul8x16(CONST_128, TMP12, TMP12);
1214 vis_or(REF_0, REF_2, TMP14);
1216 vis_psub16(TMP6, TMP4, DST_0);
1217 vis_st64(DST_0, dest[0]);
1220 vis_and(TMP12, MASK_7f, TMP12);
1222 vis_psub16(TMP14, TMP12, DST_0);
1223 vis_st64(DST_0, dest[0]);
1226 static void MC_avg_y_16_vis (uint8_t * dest, const uint8_t * ref,
1227 const ptrdiff_t stride, int height)
1229 int stride_8 = stride + 8;
1230 int stride_16 = stride + 16;
1232 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
1234 ref = vis_alignaddr(ref);
1236 vis_ld64(ref[ 0], TMP0);
1239 vis_ld64(ref[ 8], TMP2);
1241 vis_ld64(ref[16], TMP4);
1243 vis_ld64(constants3[0], CONST_3);
1244 vis_faligndata(TMP0, TMP2, REF_2);
1246 vis_ld64(constants256_512[0], CONST_256);
1247 vis_faligndata(TMP2, TMP4, REF_6);
1250 do { /* 31 cycles */
1251 vis_ld64_2(ref, stride, TMP0);
1252 vis_pmerge(ZERO, REF_2, TMP12);
1253 vis_mul8x16au(REF_2_1, CONST_256, TMP14);
1255 vis_ld64_2(ref, stride_8, TMP2);
1256 vis_pmerge(ZERO, REF_6, TMP16);
1257 vis_mul8x16au(REF_6_1, CONST_256, TMP18);
1259 vis_ld64_2(ref, stride_16, TMP4);
1262 vis_ld64(dest[0], DST_0);
1263 vis_faligndata(TMP0, TMP2, REF_0);
1265 vis_ld64_2(dest, 8, DST_2);
1266 vis_faligndata(TMP2, TMP4, REF_4);
1268 vis_ld64_2(ref, stride, TMP6);
1269 vis_pmerge(ZERO, REF_0, TMP0);
1270 vis_mul8x16au(REF_0_1, CONST_256, TMP2);
1272 vis_ld64_2(ref, stride_8, TMP8);
1273 vis_pmerge(ZERO, REF_4, TMP4);
1275 vis_ld64_2(ref, stride_16, TMP10);
1278 vis_ld64_2(dest, stride, REF_S0/*DST_4*/);
1279 vis_faligndata(TMP6, TMP8, REF_2);
1280 vis_mul8x16au(REF_4_1, CONST_256, TMP6);
1282 vis_ld64_2(dest, stride_8, REF_S2/*DST_6*/);
1283 vis_faligndata(TMP8, TMP10, REF_6);
1284 vis_mul8x16al(DST_0, CONST_512, TMP20);
1286 vis_padd16(TMP0, CONST_3, TMP0);
1287 vis_mul8x16al(DST_1, CONST_512, TMP22);
1289 vis_padd16(TMP2, CONST_3, TMP2);
1290 vis_mul8x16al(DST_2, CONST_512, TMP24);
1292 vis_padd16(TMP4, CONST_3, TMP4);
1293 vis_mul8x16al(DST_3, CONST_512, TMP26);
1295 vis_padd16(TMP6, CONST_3, TMP6);
1297 vis_padd16(TMP12, TMP20, TMP12);
1298 vis_mul8x16al(REF_S0, CONST_512, TMP20);
1300 vis_padd16(TMP14, TMP22, TMP14);
1301 vis_mul8x16al(REF_S0_1, CONST_512, TMP22);
1303 vis_padd16(TMP16, TMP24, TMP16);
1304 vis_mul8x16al(REF_S2, CONST_512, TMP24);
1306 vis_padd16(TMP18, TMP26, TMP18);
1307 vis_mul8x16al(REF_S2_1, CONST_512, TMP26);
1309 vis_padd16(TMP12, TMP0, TMP12);
1310 vis_mul8x16au(REF_2, CONST_256, TMP28);
1312 vis_padd16(TMP14, TMP2, TMP14);
1313 vis_mul8x16au(REF_2_1, CONST_256, TMP30);
1315 vis_padd16(TMP16, TMP4, TMP16);
1316 vis_mul8x16au(REF_6, CONST_256, REF_S4);
1318 vis_padd16(TMP18, TMP6, TMP18);
1319 vis_mul8x16au(REF_6_1, CONST_256, REF_S6);
1321 vis_pack16(TMP12, DST_0);
1322 vis_padd16(TMP28, TMP0, TMP12);
1324 vis_pack16(TMP14, DST_1);
1325 vis_st64(DST_0, dest[0]);
1326 vis_padd16(TMP30, TMP2, TMP14);
1328 vis_pack16(TMP16, DST_2);
1329 vis_padd16(REF_S4, TMP4, TMP16);
1331 vis_pack16(TMP18, DST_3);
1332 vis_st64_2(DST_2, dest, 8);
1334 vis_padd16(REF_S6, TMP6, TMP18);
1336 vis_padd16(TMP12, TMP20, TMP12);
1338 vis_padd16(TMP14, TMP22, TMP14);
1339 vis_pack16(TMP12, DST_0);
1341 vis_padd16(TMP16, TMP24, TMP16);
1342 vis_pack16(TMP14, DST_1);
1343 vis_st64(DST_0, dest[0]);
1345 vis_padd16(TMP18, TMP26, TMP18);
1346 vis_pack16(TMP16, DST_2);
1348 vis_pack16(TMP18, DST_3);
1349 vis_st64_2(DST_2, dest, 8);
1354 static void MC_avg_y_8_vis (uint8_t * dest, const uint8_t * ref,
1355 const ptrdiff_t stride, int height)
1357 int stride_8 = stride + 8;
1359 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
1361 ref = vis_alignaddr(ref);
1363 vis_ld64(ref[ 0], TMP0);
1366 vis_ld64(ref[ 8], TMP2);
1368 vis_ld64(constants3[0], CONST_3);
1369 vis_faligndata(TMP0, TMP2, REF_2);
1371 vis_ld64(constants256_512[0], CONST_256);
1374 do { /* 20 cycles */
1375 vis_ld64_2(ref, stride, TMP0);
1376 vis_pmerge(ZERO, REF_2, TMP8);
1377 vis_mul8x16au(REF_2_1, CONST_256, TMP10);
1379 vis_ld64_2(ref, stride_8, TMP2);
1382 vis_ld64(dest[0], DST_0);
1384 vis_ld64_2(dest, stride, DST_2);
1385 vis_faligndata(TMP0, TMP2, REF_0);
1387 vis_ld64_2(ref, stride, TMP4);
1388 vis_mul8x16al(DST_0, CONST_512, TMP16);
1389 vis_pmerge(ZERO, REF_0, TMP12);
1391 vis_ld64_2(ref, stride_8, TMP6);
1393 vis_mul8x16al(DST_1, CONST_512, TMP18);
1394 vis_pmerge(ZERO, REF_0_1, TMP14);
1396 vis_padd16(TMP12, CONST_3, TMP12);
1397 vis_mul8x16al(DST_2, CONST_512, TMP24);
1399 vis_padd16(TMP14, CONST_3, TMP14);
1400 vis_mul8x16al(DST_3, CONST_512, TMP26);
1402 vis_faligndata(TMP4, TMP6, REF_2);
1404 vis_padd16(TMP8, TMP12, TMP8);
1406 vis_padd16(TMP10, TMP14, TMP10);
1407 vis_mul8x16au(REF_2, CONST_256, TMP20);
1409 vis_padd16(TMP8, TMP16, TMP0);
1410 vis_mul8x16au(REF_2_1, CONST_256, TMP22);
1412 vis_padd16(TMP10, TMP18, TMP2);
1413 vis_pack16(TMP0, DST_0);
1415 vis_pack16(TMP2, DST_1);
1416 vis_st64(DST_0, dest[0]);
1418 vis_padd16(TMP12, TMP20, TMP12);
1420 vis_padd16(TMP14, TMP22, TMP14);
1422 vis_padd16(TMP12, TMP24, TMP0);
1424 vis_padd16(TMP14, TMP26, TMP2);
1425 vis_pack16(TMP0, DST_2);
1427 vis_pack16(TMP2, DST_3);
1428 vis_st64(DST_2, dest[0]);
1433 static void MC_put_xy_16_vis (uint8_t * dest, const uint8_t * ref,
1434 const ptrdiff_t stride, int height)
1436 unsigned long off = (unsigned long) ref & 0x7;
1437 unsigned long off_plus_1 = off + 1;
1438 int stride_8 = stride + 8;
1439 int stride_16 = stride + 16;
1441 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
1443 ref = vis_alignaddr(ref);
1445 vis_ld64(ref[ 0], TMP0);
1448 vis_ld64(ref[ 8], TMP2);
1450 vis_ld64(ref[16], TMP4);
1452 vis_ld64(constants2[0], CONST_2);
1453 vis_faligndata(TMP0, TMP2, REF_S0);
1455 vis_ld64(constants256_512[0], CONST_256);
1456 vis_faligndata(TMP2, TMP4, REF_S4);
1459 vis_alignaddr_g0((void *)off_plus_1);
1460 vis_faligndata(TMP0, TMP2, REF_S2);
1461 vis_faligndata(TMP2, TMP4, REF_S6);
1463 vis_src1(TMP2, REF_S2);
1464 vis_src1(TMP4, REF_S6);
1469 vis_ld64_2(ref, stride, TMP0);
1470 vis_mul8x16au(REF_S0, CONST_256, TMP12);
1471 vis_pmerge(ZERO, REF_S0_1, TMP14);
1473 vis_alignaddr_g0((void *)off);
1475 vis_ld64_2(ref, stride_8, TMP2);
1476 vis_mul8x16au(REF_S2, CONST_256, TMP16);
1477 vis_pmerge(ZERO, REF_S2_1, TMP18);
1479 vis_ld64_2(ref, stride_16, TMP4);
1481 vis_mul8x16au(REF_S4, CONST_256, TMP20);
1482 vis_pmerge(ZERO, REF_S4_1, TMP22);
1484 vis_ld64_2(ref, stride, TMP6);
1485 vis_mul8x16au(REF_S6, CONST_256, TMP24);
1486 vis_pmerge(ZERO, REF_S6_1, TMP26);
1488 vis_ld64_2(ref, stride_8, TMP8);
1489 vis_faligndata(TMP0, TMP2, REF_0);
1491 vis_ld64_2(ref, stride_16, TMP10);
1493 vis_faligndata(TMP2, TMP4, REF_4);
1495 vis_faligndata(TMP6, TMP8, REF_S0);
1497 vis_faligndata(TMP8, TMP10, REF_S4);
1500 vis_alignaddr_g0((void *)off_plus_1);
1501 vis_faligndata(TMP0, TMP2, REF_2);
1502 vis_faligndata(TMP2, TMP4, REF_6);
1503 vis_faligndata(TMP6, TMP8, REF_S2);
1504 vis_faligndata(TMP8, TMP10, REF_S6);
1506 vis_src1(TMP2, REF_2);
1507 vis_src1(TMP4, REF_6);
1508 vis_src1(TMP8, REF_S2);
1509 vis_src1(TMP10, REF_S6);
1512 vis_mul8x16au(REF_0, CONST_256, TMP0);
1513 vis_pmerge(ZERO, REF_0_1, TMP2);
1515 vis_mul8x16au(REF_2, CONST_256, TMP4);
1516 vis_pmerge(ZERO, REF_2_1, TMP6);
1518 vis_padd16(TMP0, CONST_2, TMP8);
1519 vis_mul8x16au(REF_4, CONST_256, TMP0);
1521 vis_padd16(TMP2, CONST_2, TMP10);
1522 vis_mul8x16au(REF_4_1, CONST_256, TMP2);
1524 vis_padd16(TMP8, TMP4, TMP8);
1525 vis_mul8x16au(REF_6, CONST_256, TMP4);
1527 vis_padd16(TMP10, TMP6, TMP10);
1528 vis_mul8x16au(REF_6_1, CONST_256, TMP6);
1530 vis_padd16(TMP12, TMP8, TMP12);
1532 vis_padd16(TMP14, TMP10, TMP14);
1534 vis_padd16(TMP12, TMP16, TMP12);
1536 vis_padd16(TMP14, TMP18, TMP14);
1537 vis_pack16(TMP12, DST_0);
1539 vis_pack16(TMP14, DST_1);
1540 vis_st64(DST_0, dest[0]);
1541 vis_padd16(TMP0, CONST_2, TMP12);
1543 vis_mul8x16au(REF_S0, CONST_256, TMP0);
1544 vis_padd16(TMP2, CONST_2, TMP14);
1546 vis_mul8x16au(REF_S0_1, CONST_256, TMP2);
1547 vis_padd16(TMP12, TMP4, TMP12);
1549 vis_mul8x16au(REF_S2, CONST_256, TMP4);
1550 vis_padd16(TMP14, TMP6, TMP14);
1552 vis_mul8x16au(REF_S2_1, CONST_256, TMP6);
1553 vis_padd16(TMP20, TMP12, TMP20);
1555 vis_padd16(TMP22, TMP14, TMP22);
1557 vis_padd16(TMP20, TMP24, TMP20);
1559 vis_padd16(TMP22, TMP26, TMP22);
1560 vis_pack16(TMP20, DST_2);
1562 vis_pack16(TMP22, DST_3);
1563 vis_st64_2(DST_2, dest, 8);
1565 vis_padd16(TMP0, TMP4, TMP24);
1567 vis_mul8x16au(REF_S4, CONST_256, TMP0);
1568 vis_padd16(TMP2, TMP6, TMP26);
1570 vis_mul8x16au(REF_S4_1, CONST_256, TMP2);
1571 vis_padd16(TMP24, TMP8, TMP24);
1573 vis_padd16(TMP26, TMP10, TMP26);
1574 vis_pack16(TMP24, DST_0);
1576 vis_pack16(TMP26, DST_1);
1577 vis_st64(DST_0, dest[0]);
1578 vis_pmerge(ZERO, REF_S6, TMP4);
1580 vis_pmerge(ZERO, REF_S6_1, TMP6);
1582 vis_padd16(TMP0, TMP4, TMP0);
1584 vis_padd16(TMP2, TMP6, TMP2);
1586 vis_padd16(TMP0, TMP12, TMP0);
1588 vis_padd16(TMP2, TMP14, TMP2);
1589 vis_pack16(TMP0, DST_2);
1591 vis_pack16(TMP2, DST_3);
1592 vis_st64_2(DST_2, dest, 8);
1597 static void MC_put_xy_8_vis (uint8_t * dest, const uint8_t * ref,
1598 const ptrdiff_t stride, int height)
1600 unsigned long off = (unsigned long) ref & 0x7;
1601 unsigned long off_plus_1 = off + 1;
1602 int stride_8 = stride + 8;
1604 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
1606 ref = vis_alignaddr(ref);
1608 vis_ld64(ref[ 0], TMP0);
1611 vis_ld64(ref[ 8], TMP2);
1613 vis_ld64(constants2[0], CONST_2);
1615 vis_ld64(constants256_512[0], CONST_256);
1616 vis_faligndata(TMP0, TMP2, REF_S0);
1619 vis_alignaddr_g0((void *)off_plus_1);
1620 vis_faligndata(TMP0, TMP2, REF_S2);
1622 vis_src1(TMP2, REF_S2);
1626 do { /* 26 cycles */
1627 vis_ld64_2(ref, stride, TMP0);
1628 vis_mul8x16au(REF_S0, CONST_256, TMP8);
1629 vis_pmerge(ZERO, REF_S2, TMP12);
1631 vis_alignaddr_g0((void *)off);
1633 vis_ld64_2(ref, stride_8, TMP2);
1635 vis_mul8x16au(REF_S0_1, CONST_256, TMP10);
1636 vis_pmerge(ZERO, REF_S2_1, TMP14);
1638 vis_ld64_2(ref, stride, TMP4);
1640 vis_ld64_2(ref, stride_8, TMP6);
1642 vis_faligndata(TMP0, TMP2, REF_S4);
1644 vis_pmerge(ZERO, REF_S4, TMP18);
1646 vis_pmerge(ZERO, REF_S4_1, TMP20);
1648 vis_faligndata(TMP4, TMP6, REF_S0);
1651 vis_alignaddr_g0((void *)off_plus_1);
1652 vis_faligndata(TMP0, TMP2, REF_S6);
1653 vis_faligndata(TMP4, TMP6, REF_S2);
1655 vis_src1(TMP2, REF_S6);
1656 vis_src1(TMP6, REF_S2);
1659 vis_padd16(TMP18, CONST_2, TMP18);
1660 vis_mul8x16au(REF_S6, CONST_256, TMP22);
1662 vis_padd16(TMP20, CONST_2, TMP20);
1663 vis_mul8x16au(REF_S6_1, CONST_256, TMP24);
1665 vis_mul8x16au(REF_S0, CONST_256, TMP26);
1666 vis_pmerge(ZERO, REF_S0_1, TMP28);
1668 vis_mul8x16au(REF_S2, CONST_256, TMP30);
1669 vis_padd16(TMP18, TMP22, TMP18);
1671 vis_mul8x16au(REF_S2_1, CONST_256, TMP32);
1672 vis_padd16(TMP20, TMP24, TMP20);
1674 vis_padd16(TMP8, TMP18, TMP8);
1676 vis_padd16(TMP10, TMP20, TMP10);
1678 vis_padd16(TMP8, TMP12, TMP8);
1680 vis_padd16(TMP10, TMP14, TMP10);
1681 vis_pack16(TMP8, DST_0);
1683 vis_pack16(TMP10, DST_1);
1684 vis_st64(DST_0, dest[0]);
1686 vis_padd16(TMP18, TMP26, TMP18);
1688 vis_padd16(TMP20, TMP28, TMP20);
1690 vis_padd16(TMP18, TMP30, TMP18);
1692 vis_padd16(TMP20, TMP32, TMP20);
1693 vis_pack16(TMP18, DST_2);
1695 vis_pack16(TMP20, DST_3);
1696 vis_st64(DST_2, dest[0]);
1701 static void MC_avg_xy_16_vis (uint8_t * dest, const uint8_t * ref,
1702 const ptrdiff_t stride, int height)
1704 unsigned long off = (unsigned long) ref & 0x7;
1705 unsigned long off_plus_1 = off + 1;
1706 int stride_8 = stride + 8;
1707 int stride_16 = stride + 16;
1709 vis_set_gsr(4 << VIS_GSR_SCALEFACT_SHIFT);
1711 ref = vis_alignaddr(ref);
1713 vis_ld64(ref[ 0], TMP0);
1716 vis_ld64(ref[ 8], TMP2);
1718 vis_ld64(ref[16], TMP4);
1720 vis_ld64(constants6[0], CONST_6);
1721 vis_faligndata(TMP0, TMP2, REF_S0);
1723 vis_ld64(constants256_1024[0], CONST_256);
1724 vis_faligndata(TMP2, TMP4, REF_S4);
1727 vis_alignaddr_g0((void *)off_plus_1);
1728 vis_faligndata(TMP0, TMP2, REF_S2);
1729 vis_faligndata(TMP2, TMP4, REF_S6);
1731 vis_src1(TMP2, REF_S2);
1732 vis_src1(TMP4, REF_S6);
1736 do { /* 55 cycles */
1737 vis_ld64_2(ref, stride, TMP0);
1738 vis_mul8x16au(REF_S0, CONST_256, TMP12);
1739 vis_pmerge(ZERO, REF_S0_1, TMP14);
1741 vis_alignaddr_g0((void *)off);
1743 vis_ld64_2(ref, stride_8, TMP2);
1744 vis_mul8x16au(REF_S2, CONST_256, TMP16);
1745 vis_pmerge(ZERO, REF_S2_1, TMP18);
1747 vis_ld64_2(ref, stride_16, TMP4);
1749 vis_mul8x16au(REF_S4, CONST_256, TMP20);
1750 vis_pmerge(ZERO, REF_S4_1, TMP22);
1752 vis_ld64_2(ref, stride, TMP6);
1753 vis_mul8x16au(REF_S6, CONST_256, TMP24);
1754 vis_pmerge(ZERO, REF_S6_1, TMP26);
1756 vis_ld64_2(ref, stride_8, TMP8);
1757 vis_faligndata(TMP0, TMP2, REF_0);
1759 vis_ld64_2(ref, stride_16, TMP10);
1761 vis_faligndata(TMP2, TMP4, REF_4);
1763 vis_ld64(dest[0], DST_0);
1764 vis_faligndata(TMP6, TMP8, REF_S0);
1766 vis_ld64_2(dest, 8, DST_2);
1767 vis_faligndata(TMP8, TMP10, REF_S4);
1770 vis_alignaddr_g0((void *)off_plus_1);
1771 vis_faligndata(TMP0, TMP2, REF_2);
1772 vis_faligndata(TMP2, TMP4, REF_6);
1773 vis_faligndata(TMP6, TMP8, REF_S2);
1774 vis_faligndata(TMP8, TMP10, REF_S6);
1776 vis_src1(TMP2, REF_2);
1777 vis_src1(TMP4, REF_6);
1778 vis_src1(TMP8, REF_S2);
1779 vis_src1(TMP10, REF_S6);
1782 vis_mul8x16al(DST_0, CONST_1024, TMP30);
1783 vis_pmerge(ZERO, REF_0, TMP0);
1785 vis_mul8x16al(DST_1, CONST_1024, TMP32);
1786 vis_pmerge(ZERO, REF_0_1, TMP2);
1788 vis_mul8x16au(REF_2, CONST_256, TMP4);
1789 vis_pmerge(ZERO, REF_2_1, TMP6);
1791 vis_mul8x16al(DST_2, CONST_1024, REF_0);
1792 vis_padd16(TMP0, CONST_6, TMP0);
1794 vis_mul8x16al(DST_3, CONST_1024, REF_2);
1795 vis_padd16(TMP2, CONST_6, TMP2);
1797 vis_padd16(TMP0, TMP4, TMP0);
1798 vis_mul8x16au(REF_4, CONST_256, TMP4);
1800 vis_padd16(TMP2, TMP6, TMP2);
1801 vis_mul8x16au(REF_4_1, CONST_256, TMP6);
1803 vis_padd16(TMP12, TMP0, TMP12);
1804 vis_mul8x16au(REF_6, CONST_256, TMP8);
1806 vis_padd16(TMP14, TMP2, TMP14);
1807 vis_mul8x16au(REF_6_1, CONST_256, TMP10);
1809 vis_padd16(TMP12, TMP16, TMP12);
1810 vis_mul8x16au(REF_S0, CONST_256, REF_4);
1812 vis_padd16(TMP14, TMP18, TMP14);
1813 vis_mul8x16au(REF_S0_1, CONST_256, REF_6);
1815 vis_padd16(TMP12, TMP30, TMP12);
1817 vis_padd16(TMP14, TMP32, TMP14);
1818 vis_pack16(TMP12, DST_0);
1820 vis_pack16(TMP14, DST_1);
1821 vis_st64(DST_0, dest[0]);
1822 vis_padd16(TMP4, CONST_6, TMP4);
1824 vis_ld64_2(dest, stride, DST_0);
1825 vis_padd16(TMP6, CONST_6, TMP6);
1826 vis_mul8x16au(REF_S2, CONST_256, TMP12);
1828 vis_padd16(TMP4, TMP8, TMP4);
1829 vis_mul8x16au(REF_S2_1, CONST_256, TMP14);
1831 vis_padd16(TMP6, TMP10, TMP6);
1833 vis_padd16(TMP20, TMP4, TMP20);
1835 vis_padd16(TMP22, TMP6, TMP22);
1837 vis_padd16(TMP20, TMP24, TMP20);
1839 vis_padd16(TMP22, TMP26, TMP22);
1841 vis_padd16(TMP20, REF_0, TMP20);
1842 vis_mul8x16au(REF_S4, CONST_256, REF_0);
1844 vis_padd16(TMP22, REF_2, TMP22);
1845 vis_pack16(TMP20, DST_2);
1847 vis_pack16(TMP22, DST_3);
1848 vis_st64_2(DST_2, dest, 8);
1851 vis_ld64_2(dest, 8, DST_2);
1852 vis_mul8x16al(DST_0, CONST_1024, TMP30);
1853 vis_pmerge(ZERO, REF_S4_1, REF_2);
1855 vis_mul8x16al(DST_1, CONST_1024, TMP32);
1856 vis_padd16(REF_4, TMP0, TMP8);
1858 vis_mul8x16au(REF_S6, CONST_256, REF_4);
1859 vis_padd16(REF_6, TMP2, TMP10);
1861 vis_mul8x16au(REF_S6_1, CONST_256, REF_6);
1862 vis_padd16(TMP8, TMP12, TMP8);
1864 vis_padd16(TMP10, TMP14, TMP10);
1866 vis_padd16(TMP8, TMP30, TMP8);
1868 vis_padd16(TMP10, TMP32, TMP10);
1869 vis_pack16(TMP8, DST_0);
1871 vis_pack16(TMP10, DST_1);
1872 vis_st64(DST_0, dest[0]);
1874 vis_padd16(REF_0, TMP4, REF_0);
1876 vis_mul8x16al(DST_2, CONST_1024, TMP30);
1877 vis_padd16(REF_2, TMP6, REF_2);
1879 vis_mul8x16al(DST_3, CONST_1024, TMP32);
1880 vis_padd16(REF_0, REF_4, REF_0);
1882 vis_padd16(REF_2, REF_6, REF_2);
1884 vis_padd16(REF_0, TMP30, REF_0);
1888 vis_padd16(REF_2, TMP32, REF_2);
1889 vis_pack16(REF_0, DST_2);
1891 vis_pack16(REF_2, DST_3);
1892 vis_st64_2(DST_2, dest, 8);
1897 static void MC_avg_xy_8_vis (uint8_t * dest, const uint8_t * ref,
1898 const ptrdiff_t stride, int height)
1900 unsigned long off = (unsigned long) ref & 0x7;
1901 unsigned long off_plus_1 = off + 1;
1902 int stride_8 = stride + 8;
1904 vis_set_gsr(4 << VIS_GSR_SCALEFACT_SHIFT);
1906 ref = vis_alignaddr(ref);
1908 vis_ld64(ref[0], TMP0);
1911 vis_ld64_2(ref, 8, TMP2);
1913 vis_ld64(constants6[0], CONST_6);
1915 vis_ld64(constants256_1024[0], CONST_256);
1916 vis_faligndata(TMP0, TMP2, REF_S0);
1919 vis_alignaddr_g0((void *)off_plus_1);
1920 vis_faligndata(TMP0, TMP2, REF_S2);
1922 vis_src1(TMP2, REF_S2);
1926 do { /* 31 cycles */
1927 vis_ld64_2(ref, stride, TMP0);
1928 vis_mul8x16au(REF_S0, CONST_256, TMP8);
1929 vis_pmerge(ZERO, REF_S0_1, TMP10);
1931 vis_ld64_2(ref, stride_8, TMP2);
1933 vis_mul8x16au(REF_S2, CONST_256, TMP12);
1934 vis_pmerge(ZERO, REF_S2_1, TMP14);
1936 vis_alignaddr_g0((void *)off);
1938 vis_ld64_2(ref, stride, TMP4);
1939 vis_faligndata(TMP0, TMP2, REF_S4);
1941 vis_ld64_2(ref, stride_8, TMP6);
1944 vis_ld64(dest[0], DST_0);
1945 vis_faligndata(TMP4, TMP6, REF_S0);
1947 vis_ld64_2(dest, stride, DST_2);
1950 vis_alignaddr_g0((void *)off_plus_1);
1951 vis_faligndata(TMP0, TMP2, REF_S6);
1952 vis_faligndata(TMP4, TMP6, REF_S2);
1954 vis_src1(TMP2, REF_S6);
1955 vis_src1(TMP6, REF_S2);
1958 vis_mul8x16al(DST_0, CONST_1024, TMP30);
1959 vis_pmerge(ZERO, REF_S4, TMP22);
1961 vis_mul8x16al(DST_1, CONST_1024, TMP32);
1962 vis_pmerge(ZERO, REF_S4_1, TMP24);
1964 vis_mul8x16au(REF_S6, CONST_256, TMP26);
1965 vis_pmerge(ZERO, REF_S6_1, TMP28);
1967 vis_mul8x16au(REF_S0, CONST_256, REF_S4);
1968 vis_padd16(TMP22, CONST_6, TMP22);
1970 vis_mul8x16au(REF_S0_1, CONST_256, REF_S6);
1971 vis_padd16(TMP24, CONST_6, TMP24);
1973 vis_mul8x16al(DST_2, CONST_1024, REF_0);
1974 vis_padd16(TMP22, TMP26, TMP22);
1976 vis_mul8x16al(DST_3, CONST_1024, REF_2);
1977 vis_padd16(TMP24, TMP28, TMP24);
1979 vis_mul8x16au(REF_S2, CONST_256, TMP26);
1980 vis_padd16(TMP8, TMP22, TMP8);
1982 vis_mul8x16au(REF_S2_1, CONST_256, TMP28);
1983 vis_padd16(TMP10, TMP24, TMP10);
1985 vis_padd16(TMP8, TMP12, TMP8);
1987 vis_padd16(TMP10, TMP14, TMP10);
1989 vis_padd16(TMP8, TMP30, TMP8);
1991 vis_padd16(TMP10, TMP32, TMP10);
1992 vis_pack16(TMP8, DST_0);
1994 vis_pack16(TMP10, DST_1);
1995 vis_st64(DST_0, dest[0]);
1998 vis_padd16(REF_S4, TMP22, TMP12);
2000 vis_padd16(REF_S6, TMP24, TMP14);
2002 vis_padd16(TMP12, TMP26, TMP12);
2004 vis_padd16(TMP14, TMP28, TMP14);
2006 vis_padd16(TMP12, REF_0, TMP12);
2008 vis_padd16(TMP14, REF_2, TMP14);
2009 vis_pack16(TMP12, DST_2);
2011 vis_pack16(TMP14, DST_3);
2012 vis_st64(DST_2, dest[0]);
2017 /* End of rounding code */
2019 /* Start of no rounding code */
2020 /* The trick used in some of this file is the formula from the MMX
2021 * motion comp code, which is:
2023 * (x+y)>>1 == (x&y)+((x^y)>>1)
2025 * This allows us to average 8 bytes at a time in a 64-bit FPU reg.
2026 * We avoid overflows by masking before we do the shift, and we
2027 * implement the shift by multiplying by 1/2 using mul8x16. So in
2028 * VIS this is (assume 'x' is in f0, 'y' is in f2, a repeating mask
2029 * of '0xfe' is in f4, a repeating mask of '0x7f' is in f6, and
2030 * the value 0x80808080 is in f8):
2034 * fmul8x16 f8, f10, f10
2037 * fpadd16 f12, f10, f10
2040 static void MC_put_no_round_o_16_vis (uint8_t * dest, const uint8_t * ref,
2041 const ptrdiff_t stride, int height)
2043 ref = vis_alignaddr(ref);
2045 vis_ld64(ref[0], TMP0);
2047 vis_ld64_2(ref, 8, TMP2);
2049 vis_ld64_2(ref, 16, TMP4);
2052 vis_faligndata(TMP0, TMP2, REF_0);
2053 vis_st64(REF_0, dest[0]);
2055 vis_faligndata(TMP2, TMP4, REF_2);
2056 vis_st64_2(REF_2, dest, 8);
2061 static void MC_put_no_round_o_8_vis (uint8_t * dest, const uint8_t * ref,
2062 const ptrdiff_t stride, int height)
2064 ref = vis_alignaddr(ref);
2066 vis_ld64(ref[0], TMP0);
2068 vis_ld64(ref[8], TMP2);
2073 vis_faligndata(TMP0, TMP2, REF_0);
2074 vis_st64(REF_0, dest[0]);
2080 static void MC_avg_no_round_o_16_vis (uint8_t * dest, const uint8_t * ref,
2081 const ptrdiff_t stride, int height)
2083 int stride_8 = stride + 8;
2085 ref = vis_alignaddr(ref);
2087 vis_ld64(ref[0], TMP0);
2089 vis_ld64(ref[8], TMP2);
2091 vis_ld64(ref[16], TMP4);
2093 vis_ld64(dest[0], DST_0);
2095 vis_ld64(dest[8], DST_2);
2097 vis_ld64(constants_fe[0], MASK_fe);
2098 vis_faligndata(TMP0, TMP2, REF_0);
2100 vis_ld64(constants_7f[0], MASK_7f);
2101 vis_faligndata(TMP2, TMP4, REF_2);
2103 vis_ld64(constants128[0], CONST_128);
2106 height = (height >> 1) - 1;
2108 do { /* 24 cycles */
2109 vis_ld64(ref[0], TMP0);
2110 vis_xor(DST_0, REF_0, TMP6);
2112 vis_ld64_2(ref, 8, TMP2);
2113 vis_and(TMP6, MASK_fe, TMP6);
2115 vis_ld64_2(ref, 16, TMP4);
2117 vis_mul8x16(CONST_128, TMP6, TMP6);
2118 vis_xor(DST_2, REF_2, TMP8);
2120 vis_and(TMP8, MASK_fe, TMP8);
2122 vis_and(DST_0, REF_0, TMP10);
2123 vis_ld64_2(dest, stride, DST_0);
2124 vis_mul8x16(CONST_128, TMP8, TMP8);
2126 vis_and(DST_2, REF_2, TMP12);
2127 vis_ld64_2(dest, stride_8, DST_2);
2129 vis_ld64(ref[0], TMP14);
2130 vis_and(TMP6, MASK_7f, TMP6);
2132 vis_and(TMP8, MASK_7f, TMP8);
2134 vis_padd16(TMP10, TMP6, TMP6);
2135 vis_st64(TMP6, dest[0]);
2137 vis_padd16(TMP12, TMP8, TMP8);
2138 vis_st64_2(TMP8, dest, 8);
2141 vis_ld64_2(ref, 8, TMP16);
2142 vis_faligndata(TMP0, TMP2, REF_0);
2144 vis_ld64_2(ref, 16, TMP18);
2145 vis_faligndata(TMP2, TMP4, REF_2);
2148 vis_xor(DST_0, REF_0, TMP20);
2150 vis_and(TMP20, MASK_fe, TMP20);
2152 vis_xor(DST_2, REF_2, TMP22);
2153 vis_mul8x16(CONST_128, TMP20, TMP20);
2155 vis_and(TMP22, MASK_fe, TMP22);
2157 vis_and(DST_0, REF_0, TMP24);
2158 vis_mul8x16(CONST_128, TMP22, TMP22);
2160 vis_and(DST_2, REF_2, TMP26);
2162 vis_ld64_2(dest, stride, DST_0);
2163 vis_faligndata(TMP14, TMP16, REF_0);
2165 vis_ld64_2(dest, stride_8, DST_2);
2166 vis_faligndata(TMP16, TMP18, REF_2);
2168 vis_and(TMP20, MASK_7f, TMP20);
2170 vis_and(TMP22, MASK_7f, TMP22);
2172 vis_padd16(TMP24, TMP20, TMP20);
2173 vis_st64(TMP20, dest[0]);
2175 vis_padd16(TMP26, TMP22, TMP22);
2176 vis_st64_2(TMP22, dest, 8);
2180 vis_ld64(ref[0], TMP0);
2181 vis_xor(DST_0, REF_0, TMP6);
2183 vis_ld64_2(ref, 8, TMP2);
2184 vis_and(TMP6, MASK_fe, TMP6);
2186 vis_ld64_2(ref, 16, TMP4);
2187 vis_mul8x16(CONST_128, TMP6, TMP6);
2188 vis_xor(DST_2, REF_2, TMP8);
2190 vis_and(TMP8, MASK_fe, TMP8);
2192 vis_and(DST_0, REF_0, TMP10);
2193 vis_ld64_2(dest, stride, DST_0);
2194 vis_mul8x16(CONST_128, TMP8, TMP8);
2196 vis_and(DST_2, REF_2, TMP12);
2197 vis_ld64_2(dest, stride_8, DST_2);
2199 vis_ld64(ref[0], TMP14);
2200 vis_and(TMP6, MASK_7f, TMP6);
2202 vis_and(TMP8, MASK_7f, TMP8);
2204 vis_padd16(TMP10, TMP6, TMP6);
2205 vis_st64(TMP6, dest[0]);
2207 vis_padd16(TMP12, TMP8, TMP8);
2208 vis_st64_2(TMP8, dest, 8);
2211 vis_faligndata(TMP0, TMP2, REF_0);
2213 vis_faligndata(TMP2, TMP4, REF_2);
2215 vis_xor(DST_0, REF_0, TMP20);
2217 vis_and(TMP20, MASK_fe, TMP20);
2219 vis_xor(DST_2, REF_2, TMP22);
2220 vis_mul8x16(CONST_128, TMP20, TMP20);
2222 vis_and(TMP22, MASK_fe, TMP22);
2224 vis_and(DST_0, REF_0, TMP24);
2225 vis_mul8x16(CONST_128, TMP22, TMP22);
2227 vis_and(DST_2, REF_2, TMP26);
2229 vis_and(TMP20, MASK_7f, TMP20);
2231 vis_and(TMP22, MASK_7f, TMP22);
2233 vis_padd16(TMP24, TMP20, TMP20);
2234 vis_st64(TMP20, dest[0]);
2236 vis_padd16(TMP26, TMP22, TMP22);
2237 vis_st64_2(TMP22, dest, 8);
2240 static void MC_put_no_round_x_16_vis (uint8_t * dest, const uint8_t * ref,
2241 const ptrdiff_t stride, int height)
2243 unsigned long off = (unsigned long) ref & 0x7;
2244 unsigned long off_plus_1 = off + 1;
2246 ref = vis_alignaddr(ref);
2248 vis_ld64(ref[0], TMP0);
2250 vis_ld64_2(ref, 8, TMP2);
2252 vis_ld64_2(ref, 16, TMP4);
2254 vis_ld64(constants_fe[0], MASK_fe);
2256 vis_ld64(constants_7f[0], MASK_7f);
2257 vis_faligndata(TMP0, TMP2, REF_0);
2259 vis_ld64(constants128[0], CONST_128);
2260 vis_faligndata(TMP2, TMP4, REF_4);
2263 vis_alignaddr_g0((void *)off_plus_1);
2264 vis_faligndata(TMP0, TMP2, REF_2);
2265 vis_faligndata(TMP2, TMP4, REF_6);
2267 vis_src1(TMP2, REF_2);
2268 vis_src1(TMP4, REF_6);
2272 height = (height >> 1) - 1;
2274 do { /* 34 cycles */
2275 vis_ld64(ref[0], TMP0);
2276 vis_xor(REF_0, REF_2, TMP6);
2278 vis_ld64_2(ref, 8, TMP2);
2279 vis_xor(REF_4, REF_6, TMP8);
2281 vis_ld64_2(ref, 16, TMP4);
2282 vis_and(TMP6, MASK_fe, TMP6);
2285 vis_ld64(ref[0], TMP14);
2286 vis_mul8x16(CONST_128, TMP6, TMP6);
2287 vis_and(TMP8, MASK_fe, TMP8);
2289 vis_ld64_2(ref, 8, TMP16);
2290 vis_mul8x16(CONST_128, TMP8, TMP8);
2291 vis_and(REF_0, REF_2, TMP10);
2293 vis_ld64_2(ref, 16, TMP18);
2295 vis_and(REF_4, REF_6, TMP12);
2297 vis_alignaddr_g0((void *)off);
2299 vis_faligndata(TMP0, TMP2, REF_0);
2301 vis_faligndata(TMP2, TMP4, REF_4);
2304 vis_alignaddr_g0((void *)off_plus_1);
2305 vis_faligndata(TMP0, TMP2, REF_2);
2306 vis_faligndata(TMP2, TMP4, REF_6);
2308 vis_src1(TMP2, REF_2);
2309 vis_src1(TMP4, REF_6);
2312 vis_and(TMP6, MASK_7f, TMP6);
2314 vis_and(TMP8, MASK_7f, TMP8);
2316 vis_padd16(TMP10, TMP6, TMP6);
2317 vis_st64(TMP6, dest[0]);
2319 vis_padd16(TMP12, TMP8, TMP8);
2320 vis_st64_2(TMP8, dest, 8);
2323 vis_xor(REF_0, REF_2, TMP6);
2325 vis_xor(REF_4, REF_6, TMP8);
2327 vis_and(TMP6, MASK_fe, TMP6);
2329 vis_mul8x16(CONST_128, TMP6, TMP6);
2330 vis_and(TMP8, MASK_fe, TMP8);
2332 vis_mul8x16(CONST_128, TMP8, TMP8);
2333 vis_and(REF_0, REF_2, TMP10);
2335 vis_and(REF_4, REF_6, TMP12);
2337 vis_alignaddr_g0((void *)off);
2339 vis_faligndata(TMP14, TMP16, REF_0);
2341 vis_faligndata(TMP16, TMP18, REF_4);
2344 vis_alignaddr_g0((void *)off_plus_1);
2345 vis_faligndata(TMP14, TMP16, REF_2);
2346 vis_faligndata(TMP16, TMP18, REF_6);
2348 vis_src1(TMP16, REF_2);
2349 vis_src1(TMP18, REF_6);
2352 vis_and(TMP6, MASK_7f, TMP6);
2354 vis_and(TMP8, MASK_7f, TMP8);
2356 vis_padd16(TMP10, TMP6, TMP6);
2357 vis_st64(TMP6, dest[0]);
2359 vis_padd16(TMP12, TMP8, TMP8);
2360 vis_st64_2(TMP8, dest, 8);
2364 vis_ld64(ref[0], TMP0);
2365 vis_xor(REF_0, REF_2, TMP6);
2367 vis_ld64_2(ref, 8, TMP2);
2368 vis_xor(REF_4, REF_6, TMP8);
2370 vis_ld64_2(ref, 16, TMP4);
2371 vis_and(TMP6, MASK_fe, TMP6);
2373 vis_mul8x16(CONST_128, TMP6, TMP6);
2374 vis_and(TMP8, MASK_fe, TMP8);
2376 vis_mul8x16(CONST_128, TMP8, TMP8);
2377 vis_and(REF_0, REF_2, TMP10);
2379 vis_and(REF_4, REF_6, TMP12);
2381 vis_alignaddr_g0((void *)off);
2383 vis_faligndata(TMP0, TMP2, REF_0);
2385 vis_faligndata(TMP2, TMP4, REF_4);
2388 vis_alignaddr_g0((void *)off_plus_1);
2389 vis_faligndata(TMP0, TMP2, REF_2);
2390 vis_faligndata(TMP2, TMP4, REF_6);
2392 vis_src1(TMP2, REF_2);
2393 vis_src1(TMP4, REF_6);
2396 vis_and(TMP6, MASK_7f, TMP6);
2398 vis_and(TMP8, MASK_7f, TMP8);
2400 vis_padd16(TMP10, TMP6, TMP6);
2401 vis_st64(TMP6, dest[0]);
2403 vis_padd16(TMP12, TMP8, TMP8);
2404 vis_st64_2(TMP8, dest, 8);
2407 vis_xor(REF_0, REF_2, TMP6);
2409 vis_xor(REF_4, REF_6, TMP8);
2411 vis_and(TMP6, MASK_fe, TMP6);
2413 vis_mul8x16(CONST_128, TMP6, TMP6);
2414 vis_and(TMP8, MASK_fe, TMP8);
2416 vis_mul8x16(CONST_128, TMP8, TMP8);
2417 vis_and(REF_0, REF_2, TMP10);
2419 vis_and(REF_4, REF_6, TMP12);
2421 vis_and(TMP6, MASK_7f, TMP6);
2423 vis_and(TMP8, MASK_7f, TMP8);
2425 vis_padd16(TMP10, TMP6, TMP6);
2426 vis_st64(TMP6, dest[0]);
2428 vis_padd16(TMP12, TMP8, TMP8);
2429 vis_st64_2(TMP8, dest, 8);
2432 static void MC_put_no_round_x_8_vis (uint8_t * dest, const uint8_t * ref,
2433 const ptrdiff_t stride, int height)
2435 unsigned long off = (unsigned long) ref & 0x7;
2436 unsigned long off_plus_1 = off + 1;
2438 ref = vis_alignaddr(ref);
2440 vis_ld64(ref[0], TMP0);
2442 vis_ld64(ref[8], TMP2);
2444 vis_ld64(constants_fe[0], MASK_fe);
2446 vis_ld64(constants_7f[0], MASK_7f);
2448 vis_ld64(constants128[0], CONST_128);
2449 vis_faligndata(TMP0, TMP2, REF_0);
2452 vis_alignaddr_g0((void *)off_plus_1);
2453 vis_faligndata(TMP0, TMP2, REF_2);
2455 vis_src1(TMP2, REF_2);
2459 height = (height >> 1) - 1;
2461 do { /* 20 cycles */
2462 vis_ld64(ref[0], TMP0);
2463 vis_xor(REF_0, REF_2, TMP4);
2465 vis_ld64_2(ref, 8, TMP2);
2466 vis_and(TMP4, MASK_fe, TMP4);
2469 vis_ld64(ref[0], TMP8);
2470 vis_and(REF_0, REF_2, TMP6);
2471 vis_mul8x16(CONST_128, TMP4, TMP4);
2473 vis_alignaddr_g0((void *)off);
2475 vis_ld64_2(ref, 8, TMP10);
2477 vis_faligndata(TMP0, TMP2, REF_0);
2480 vis_alignaddr_g0((void *)off_plus_1);
2481 vis_faligndata(TMP0, TMP2, REF_2);
2483 vis_src1(TMP2, REF_2);
2486 vis_and(TMP4, MASK_7f, TMP4);
2488 vis_padd16(TMP6, TMP4, DST_0);
2489 vis_st64(DST_0, dest[0]);
2492 vis_xor(REF_0, REF_2, TMP12);
2494 vis_and(TMP12, MASK_fe, TMP12);
2496 vis_and(REF_0, REF_2, TMP14);
2497 vis_mul8x16(CONST_128, TMP12, TMP12);
2499 vis_alignaddr_g0((void *)off);
2500 vis_faligndata(TMP8, TMP10, REF_0);
2502 vis_alignaddr_g0((void *)off_plus_1);
2503 vis_faligndata(TMP8, TMP10, REF_2);
2505 vis_src1(TMP10, REF_2);
2508 vis_and(TMP12, MASK_7f, TMP12);
2510 vis_padd16(TMP14, TMP12, DST_0);
2511 vis_st64(DST_0, dest[0]);
2515 vis_ld64(ref[0], TMP0);
2516 vis_xor(REF_0, REF_2, TMP4);
2518 vis_ld64_2(ref, 8, TMP2);
2519 vis_and(TMP4, MASK_fe, TMP4);
2521 vis_and(REF_0, REF_2, TMP6);
2522 vis_mul8x16(CONST_128, TMP4, TMP4);
2524 vis_alignaddr_g0((void *)off);
2526 vis_faligndata(TMP0, TMP2, REF_0);
2529 vis_alignaddr_g0((void *)off_plus_1);
2530 vis_faligndata(TMP0, TMP2, REF_2);
2532 vis_src1(TMP2, REF_2);
2535 vis_and(TMP4, MASK_7f, TMP4);
2537 vis_padd16(TMP6, TMP4, DST_0);
2538 vis_st64(DST_0, dest[0]);
2541 vis_xor(REF_0, REF_2, TMP12);
2543 vis_and(TMP12, MASK_fe, TMP12);
2545 vis_and(REF_0, REF_2, TMP14);
2546 vis_mul8x16(CONST_128, TMP12, TMP12);
2548 vis_and(TMP12, MASK_7f, TMP12);
2550 vis_padd16(TMP14, TMP12, DST_0);
2551 vis_st64(DST_0, dest[0]);
2555 static void MC_avg_no_round_x_16_vis (uint8_t * dest, const uint8_t * ref,
2556 const ptrdiff_t stride, int height)
2558 unsigned long off = (unsigned long) ref & 0x7;
2559 unsigned long off_plus_1 = off + 1;
2561 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
2563 vis_ld64(constants3[0], CONST_3);
2565 vis_ld64(constants256_512[0], CONST_256);
2567 ref = vis_alignaddr(ref);
2568 do { /* 26 cycles */
2569 vis_ld64(ref[0], TMP0);
2571 vis_ld64(ref[8], TMP2);
2573 vis_alignaddr_g0((void *)off);
2575 vis_ld64(ref[16], TMP4);
2577 vis_ld64(dest[0], DST_0);
2578 vis_faligndata(TMP0, TMP2, REF_0);
2580 vis_ld64(dest[8], DST_2);
2581 vis_faligndata(TMP2, TMP4, REF_4);
2584 vis_alignaddr_g0((void *)off_plus_1);
2585 vis_faligndata(TMP0, TMP2, REF_2);
2586 vis_faligndata(TMP2, TMP4, REF_6);
2588 vis_src1(TMP2, REF_2);
2589 vis_src1(TMP4, REF_6);
2592 vis_mul8x16au(REF_0, CONST_256, TMP0);
2594 vis_pmerge(ZERO, REF_2, TMP4);
2595 vis_mul8x16au(REF_0_1, CONST_256, TMP2);
2597 vis_pmerge(ZERO, REF_2_1, TMP6);
2599 vis_padd16(TMP0, TMP4, TMP0);
2601 vis_mul8x16al(DST_0, CONST_512, TMP4);
2602 vis_padd16(TMP2, TMP6, TMP2);
2604 vis_mul8x16al(DST_1, CONST_512, TMP6);
2606 vis_mul8x16au(REF_6, CONST_256, TMP12);
2608 vis_padd16(TMP0, TMP4, TMP0);
2609 vis_mul8x16au(REF_6_1, CONST_256, TMP14);
2611 vis_padd16(TMP2, TMP6, TMP2);
2612 vis_mul8x16au(REF_4, CONST_256, TMP16);
2614 vis_padd16(TMP0, CONST_3, TMP8);
2615 vis_mul8x16au(REF_4_1, CONST_256, TMP18);
2617 vis_padd16(TMP2, CONST_3, TMP10);
2618 vis_pack16(TMP8, DST_0);
2620 vis_pack16(TMP10, DST_1);
2621 vis_padd16(TMP16, TMP12, TMP0);
2623 vis_st64(DST_0, dest[0]);
2624 vis_mul8x16al(DST_2, CONST_512, TMP4);
2625 vis_padd16(TMP18, TMP14, TMP2);
2627 vis_mul8x16al(DST_3, CONST_512, TMP6);
2628 vis_padd16(TMP0, CONST_3, TMP0);
2630 vis_padd16(TMP2, CONST_3, TMP2);
2632 vis_padd16(TMP0, TMP4, TMP0);
2634 vis_padd16(TMP2, TMP6, TMP2);
2635 vis_pack16(TMP0, DST_2);
2637 vis_pack16(TMP2, DST_3);
2638 vis_st64(DST_2, dest[8]);
2645 static void MC_put_no_round_y_16_vis (uint8_t * dest, const uint8_t * ref,
2646 const ptrdiff_t stride, int height)
2648 ref = vis_alignaddr(ref);
2649 vis_ld64(ref[0], TMP0);
2651 vis_ld64_2(ref, 8, TMP2);
2653 vis_ld64_2(ref, 16, TMP4);
2656 vis_ld64(ref[0], TMP6);
2657 vis_faligndata(TMP0, TMP2, REF_0);
2659 vis_ld64_2(ref, 8, TMP8);
2660 vis_faligndata(TMP2, TMP4, REF_4);
2662 vis_ld64_2(ref, 16, TMP10);
2665 vis_ld64(constants_fe[0], MASK_fe);
2666 vis_faligndata(TMP6, TMP8, REF_2);
2668 vis_ld64(constants_7f[0], MASK_7f);
2669 vis_faligndata(TMP8, TMP10, REF_6);
2671 vis_ld64(constants128[0], CONST_128);
2672 height = (height >> 1) - 1;
2673 do { /* 24 cycles */
2674 vis_ld64(ref[0], TMP0);
2675 vis_xor(REF_0, REF_2, TMP12);
2677 vis_ld64_2(ref, 8, TMP2);
2678 vis_xor(REF_4, REF_6, TMP16);
2680 vis_ld64_2(ref, 16, TMP4);
2682 vis_and(REF_0, REF_2, TMP14);
2684 vis_ld64(ref[0], TMP6);
2685 vis_and(REF_4, REF_6, TMP18);
2687 vis_ld64_2(ref, 8, TMP8);
2688 vis_faligndata(TMP0, TMP2, REF_0);
2690 vis_ld64_2(ref, 16, TMP10);
2692 vis_faligndata(TMP2, TMP4, REF_4);
2694 vis_and(TMP12, MASK_fe, TMP12);
2696 vis_and(TMP16, MASK_fe, TMP16);
2697 vis_mul8x16(CONST_128, TMP12, TMP12);
2699 vis_mul8x16(CONST_128, TMP16, TMP16);
2700 vis_xor(REF_0, REF_2, TMP0);
2702 vis_xor(REF_4, REF_6, TMP2);
2704 vis_and(REF_0, REF_2, TMP20);
2706 vis_and(TMP12, MASK_7f, TMP12);
2708 vis_and(TMP16, MASK_7f, TMP16);
2710 vis_padd16(TMP14, TMP12, TMP12);
2711 vis_st64(TMP12, dest[0]);
2713 vis_padd16(TMP18, TMP16, TMP16);
2714 vis_st64_2(TMP16, dest, 8);
2717 vis_and(REF_4, REF_6, TMP18);
2719 vis_and(TMP0, MASK_fe, TMP0);
2721 vis_and(TMP2, MASK_fe, TMP2);
2722 vis_mul8x16(CONST_128, TMP0, TMP0);
2724 vis_faligndata(TMP6, TMP8, REF_2);
2725 vis_mul8x16(CONST_128, TMP2, TMP2);
2727 vis_faligndata(TMP8, TMP10, REF_6);
2729 vis_and(TMP0, MASK_7f, TMP0);
2731 vis_and(TMP2, MASK_7f, TMP2);
2733 vis_padd16(TMP20, TMP0, TMP0);
2734 vis_st64(TMP0, dest[0]);
2736 vis_padd16(TMP18, TMP2, TMP2);
2737 vis_st64_2(TMP2, dest, 8);
2741 vis_ld64(ref[0], TMP0);
2742 vis_xor(REF_0, REF_2, TMP12);
2744 vis_ld64_2(ref, 8, TMP2);
2745 vis_xor(REF_4, REF_6, TMP16);
2747 vis_ld64_2(ref, 16, TMP4);
2748 vis_and(REF_0, REF_2, TMP14);
2750 vis_and(REF_4, REF_6, TMP18);
2752 vis_faligndata(TMP0, TMP2, REF_0);
2754 vis_faligndata(TMP2, TMP4, REF_4);
2756 vis_and(TMP12, MASK_fe, TMP12);
2758 vis_and(TMP16, MASK_fe, TMP16);
2759 vis_mul8x16(CONST_128, TMP12, TMP12);
2761 vis_mul8x16(CONST_128, TMP16, TMP16);
2762 vis_xor(REF_0, REF_2, TMP0);
2764 vis_xor(REF_4, REF_6, TMP2);
2766 vis_and(REF_0, REF_2, TMP20);
2768 vis_and(TMP12, MASK_7f, TMP12);
2770 vis_and(TMP16, MASK_7f, TMP16);
2772 vis_padd16(TMP14, TMP12, TMP12);
2773 vis_st64(TMP12, dest[0]);
2775 vis_padd16(TMP18, TMP16, TMP16);
2776 vis_st64_2(TMP16, dest, 8);
2779 vis_and(REF_4, REF_6, TMP18);
2781 vis_and(TMP0, MASK_fe, TMP0);
2783 vis_and(TMP2, MASK_fe, TMP2);
2784 vis_mul8x16(CONST_128, TMP0, TMP0);
2786 vis_mul8x16(CONST_128, TMP2, TMP2);
2788 vis_and(TMP0, MASK_7f, TMP0);
2790 vis_and(TMP2, MASK_7f, TMP2);
2792 vis_padd16(TMP20, TMP0, TMP0);
2793 vis_st64(TMP0, dest[0]);
2795 vis_padd16(TMP18, TMP2, TMP2);
2796 vis_st64_2(TMP2, dest, 8);
2799 static void MC_put_no_round_y_8_vis (uint8_t * dest, const uint8_t * ref,
2800 const ptrdiff_t stride, int height)
2802 ref = vis_alignaddr(ref);
2803 vis_ld64(ref[0], TMP0);
2805 vis_ld64_2(ref, 8, TMP2);
2808 vis_ld64(ref[0], TMP4);
2810 vis_ld64_2(ref, 8, TMP6);
2813 vis_ld64(constants_fe[0], MASK_fe);
2814 vis_faligndata(TMP0, TMP2, REF_0);
2816 vis_ld64(constants_7f[0], MASK_7f);
2817 vis_faligndata(TMP4, TMP6, REF_2);
2819 vis_ld64(constants128[0], CONST_128);
2820 height = (height >> 1) - 1;
2821 do { /* 12 cycles */
2822 vis_ld64(ref[0], TMP0);
2823 vis_xor(REF_0, REF_2, TMP4);
2825 vis_ld64_2(ref, 8, TMP2);
2827 vis_and(TMP4, MASK_fe, TMP4);
2829 vis_and(REF_0, REF_2, TMP6);
2830 vis_mul8x16(CONST_128, TMP4, TMP4);
2832 vis_faligndata(TMP0, TMP2, REF_0);
2833 vis_ld64(ref[0], TMP0);
2835 vis_ld64_2(ref, 8, TMP2);
2837 vis_xor(REF_0, REF_2, TMP12);
2839 vis_and(TMP4, MASK_7f, TMP4);
2841 vis_and(TMP12, MASK_fe, TMP12);
2843 vis_mul8x16(CONST_128, TMP12, TMP12);
2844 vis_and(REF_0, REF_2, TMP14);
2846 vis_padd16(TMP6, TMP4, DST_0);
2847 vis_st64(DST_0, dest[0]);
2850 vis_faligndata(TMP0, TMP2, REF_2);
2852 vis_and(TMP12, MASK_7f, TMP12);
2854 vis_padd16(TMP14, TMP12, DST_0);
2855 vis_st64(DST_0, dest[0]);
2859 vis_ld64(ref[0], TMP0);
2860 vis_xor(REF_0, REF_2, TMP4);
2862 vis_ld64_2(ref, 8, TMP2);
2863 vis_and(TMP4, MASK_fe, TMP4);
2865 vis_and(REF_0, REF_2, TMP6);
2866 vis_mul8x16(CONST_128, TMP4, TMP4);
2868 vis_faligndata(TMP0, TMP2, REF_0);
2870 vis_xor(REF_0, REF_2, TMP12);
2872 vis_and(TMP4, MASK_7f, TMP4);
2874 vis_and(TMP12, MASK_fe, TMP12);
2876 vis_mul8x16(CONST_128, TMP12, TMP12);
2877 vis_and(REF_0, REF_2, TMP14);
2879 vis_padd16(TMP6, TMP4, DST_0);
2880 vis_st64(DST_0, dest[0]);
2883 vis_and(TMP12, MASK_7f, TMP12);
2885 vis_padd16(TMP14, TMP12, DST_0);
2886 vis_st64(DST_0, dest[0]);
2889 static void MC_avg_no_round_y_16_vis (uint8_t * dest, const uint8_t * ref,
2890 const ptrdiff_t stride, int height)
2892 int stride_8 = stride + 8;
2893 int stride_16 = stride + 16;
2895 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
2897 ref = vis_alignaddr(ref);
2899 vis_ld64(ref[ 0], TMP0);
2902 vis_ld64(ref[ 8], TMP2);
2904 vis_ld64(ref[16], TMP4);
2906 vis_ld64(constants3[0], CONST_3);
2907 vis_faligndata(TMP0, TMP2, REF_2);
2909 vis_ld64(constants256_512[0], CONST_256);
2910 vis_faligndata(TMP2, TMP4, REF_6);
2913 do { /* 31 cycles */
2914 vis_ld64_2(ref, stride, TMP0);
2915 vis_pmerge(ZERO, REF_2, TMP12);
2916 vis_mul8x16au(REF_2_1, CONST_256, TMP14);
2918 vis_ld64_2(ref, stride_8, TMP2);
2919 vis_pmerge(ZERO, REF_6, TMP16);
2920 vis_mul8x16au(REF_6_1, CONST_256, TMP18);
2922 vis_ld64_2(ref, stride_16, TMP4);
2925 vis_ld64(dest[0], DST_0);
2926 vis_faligndata(TMP0, TMP2, REF_0);
2928 vis_ld64_2(dest, 8, DST_2);
2929 vis_faligndata(TMP2, TMP4, REF_4);
2931 vis_ld64_2(ref, stride, TMP6);
2932 vis_pmerge(ZERO, REF_0, TMP0);
2933 vis_mul8x16au(REF_0_1, CONST_256, TMP2);
2935 vis_ld64_2(ref, stride_8, TMP8);
2936 vis_pmerge(ZERO, REF_4, TMP4);
2938 vis_ld64_2(ref, stride_16, TMP10);
2941 vis_ld64_2(dest, stride, REF_S0/*DST_4*/);
2942 vis_faligndata(TMP6, TMP8, REF_2);
2943 vis_mul8x16au(REF_4_1, CONST_256, TMP6);
2945 vis_ld64_2(dest, stride_8, REF_S2/*DST_6*/);
2946 vis_faligndata(TMP8, TMP10, REF_6);
2947 vis_mul8x16al(DST_0, CONST_512, TMP20);
2949 vis_padd16(TMP0, CONST_3, TMP0);
2950 vis_mul8x16al(DST_1, CONST_512, TMP22);
2952 vis_padd16(TMP2, CONST_3, TMP2);
2953 vis_mul8x16al(DST_2, CONST_512, TMP24);
2955 vis_padd16(TMP4, CONST_3, TMP4);
2956 vis_mul8x16al(DST_3, CONST_512, TMP26);
2958 vis_padd16(TMP6, CONST_3, TMP6);
2960 vis_padd16(TMP12, TMP20, TMP12);
2961 vis_mul8x16al(REF_S0, CONST_512, TMP20);
2963 vis_padd16(TMP14, TMP22, TMP14);
2964 vis_mul8x16al(REF_S0_1, CONST_512, TMP22);
2966 vis_padd16(TMP16, TMP24, TMP16);
2967 vis_mul8x16al(REF_S2, CONST_512, TMP24);
2969 vis_padd16(TMP18, TMP26, TMP18);
2970 vis_mul8x16al(REF_S2_1, CONST_512, TMP26);
2972 vis_padd16(TMP12, TMP0, TMP12);
2973 vis_mul8x16au(REF_2, CONST_256, TMP28);
2975 vis_padd16(TMP14, TMP2, TMP14);
2976 vis_mul8x16au(REF_2_1, CONST_256, TMP30);
2978 vis_padd16(TMP16, TMP4, TMP16);
2979 vis_mul8x16au(REF_6, CONST_256, REF_S4);
2981 vis_padd16(TMP18, TMP6, TMP18);
2982 vis_mul8x16au(REF_6_1, CONST_256, REF_S6);
2984 vis_pack16(TMP12, DST_0);
2985 vis_padd16(TMP28, TMP0, TMP12);
2987 vis_pack16(TMP14, DST_1);
2988 vis_st64(DST_0, dest[0]);
2989 vis_padd16(TMP30, TMP2, TMP14);
2991 vis_pack16(TMP16, DST_2);
2992 vis_padd16(REF_S4, TMP4, TMP16);
2994 vis_pack16(TMP18, DST_3);
2995 vis_st64_2(DST_2, dest, 8);
2997 vis_padd16(REF_S6, TMP6, TMP18);
2999 vis_padd16(TMP12, TMP20, TMP12);
3001 vis_padd16(TMP14, TMP22, TMP14);
3002 vis_pack16(TMP12, DST_0);
3004 vis_padd16(TMP16, TMP24, TMP16);
3005 vis_pack16(TMP14, DST_1);
3006 vis_st64(DST_0, dest[0]);
3008 vis_padd16(TMP18, TMP26, TMP18);
3009 vis_pack16(TMP16, DST_2);
3011 vis_pack16(TMP18, DST_3);
3012 vis_st64_2(DST_2, dest, 8);
3017 static void MC_put_no_round_xy_16_vis (uint8_t * dest, const uint8_t * ref,
3018 const ptrdiff_t stride, int height)
3020 unsigned long off = (unsigned long) ref & 0x7;
3021 unsigned long off_plus_1 = off + 1;
3022 int stride_8 = stride + 8;
3023 int stride_16 = stride + 16;
3025 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
3027 ref = vis_alignaddr(ref);
3029 vis_ld64(ref[ 0], TMP0);
3032 vis_ld64(ref[ 8], TMP2);
3034 vis_ld64(ref[16], TMP4);
3036 vis_ld64(constants1[0], CONST_1);
3037 vis_faligndata(TMP0, TMP2, REF_S0);
3039 vis_ld64(constants256_512[0], CONST_256);
3040 vis_faligndata(TMP2, TMP4, REF_S4);
3043 vis_alignaddr_g0((void *)off_plus_1);
3044 vis_faligndata(TMP0, TMP2, REF_S2);
3045 vis_faligndata(TMP2, TMP4, REF_S6);
3047 vis_src1(TMP2, REF_S2);
3048 vis_src1(TMP4, REF_S6);
3053 vis_ld64_2(ref, stride, TMP0);
3054 vis_mul8x16au(REF_S0, CONST_256, TMP12);
3055 vis_pmerge(ZERO, REF_S0_1, TMP14);
3057 vis_alignaddr_g0((void *)off);
3059 vis_ld64_2(ref, stride_8, TMP2);
3060 vis_mul8x16au(REF_S2, CONST_256, TMP16);
3061 vis_pmerge(ZERO, REF_S2_1, TMP18);
3063 vis_ld64_2(ref, stride_16, TMP4);
3065 vis_mul8x16au(REF_S4, CONST_256, TMP20);
3066 vis_pmerge(ZERO, REF_S4_1, TMP22);
3068 vis_ld64_2(ref, stride, TMP6);
3069 vis_mul8x16au(REF_S6, CONST_256, TMP24);
3070 vis_pmerge(ZERO, REF_S6_1, TMP26);
3072 vis_ld64_2(ref, stride_8, TMP8);
3073 vis_faligndata(TMP0, TMP2, REF_0);
3075 vis_ld64_2(ref, stride_16, TMP10);
3077 vis_faligndata(TMP2, TMP4, REF_4);
3079 vis_faligndata(TMP6, TMP8, REF_S0);
3081 vis_faligndata(TMP8, TMP10, REF_S4);
3084 vis_alignaddr_g0((void *)off_plus_1);
3085 vis_faligndata(TMP0, TMP2, REF_2);
3086 vis_faligndata(TMP2, TMP4, REF_6);
3087 vis_faligndata(TMP6, TMP8, REF_S2);
3088 vis_faligndata(TMP8, TMP10, REF_S6);
3090 vis_src1(TMP2, REF_2);
3091 vis_src1(TMP4, REF_6);
3092 vis_src1(TMP8, REF_S2);
3093 vis_src1(TMP10, REF_S6);
3096 vis_mul8x16au(REF_0, CONST_256, TMP0);
3097 vis_pmerge(ZERO, REF_0_1, TMP2);
3099 vis_mul8x16au(REF_2, CONST_256, TMP4);
3100 vis_pmerge(ZERO, REF_2_1, TMP6);
3102 vis_padd16(TMP0, CONST_2, TMP8);
3103 vis_mul8x16au(REF_4, CONST_256, TMP0);
3105 vis_padd16(TMP2, CONST_1, TMP10);
3106 vis_mul8x16au(REF_4_1, CONST_256, TMP2);
3108 vis_padd16(TMP8, TMP4, TMP8);
3109 vis_mul8x16au(REF_6, CONST_256, TMP4);
3111 vis_padd16(TMP10, TMP6, TMP10);
3112 vis_mul8x16au(REF_6_1, CONST_256, TMP6);
3114 vis_padd16(TMP12, TMP8, TMP12);
3116 vis_padd16(TMP14, TMP10, TMP14);
3118 vis_padd16(TMP12, TMP16, TMP12);
3120 vis_padd16(TMP14, TMP18, TMP14);
3121 vis_pack16(TMP12, DST_0);
3123 vis_pack16(TMP14, DST_1);
3124 vis_st64(DST_0, dest[0]);
3125 vis_padd16(TMP0, CONST_1, TMP12);
3127 vis_mul8x16au(REF_S0, CONST_256, TMP0);
3128 vis_padd16(TMP2, CONST_1, TMP14);
3130 vis_mul8x16au(REF_S0_1, CONST_256, TMP2);
3131 vis_padd16(TMP12, TMP4, TMP12);
3133 vis_mul8x16au(REF_S2, CONST_256, TMP4);
3134 vis_padd16(TMP14, TMP6, TMP14);
3136 vis_mul8x16au(REF_S2_1, CONST_256, TMP6);
3137 vis_padd16(TMP20, TMP12, TMP20);
3139 vis_padd16(TMP22, TMP14, TMP22);
3141 vis_padd16(TMP20, TMP24, TMP20);
3143 vis_padd16(TMP22, TMP26, TMP22);
3144 vis_pack16(TMP20, DST_2);
3146 vis_pack16(TMP22, DST_3);
3147 vis_st64_2(DST_2, dest, 8);
3149 vis_padd16(TMP0, TMP4, TMP24);
3151 vis_mul8x16au(REF_S4, CONST_256, TMP0);
3152 vis_padd16(TMP2, TMP6, TMP26);
3154 vis_mul8x16au(REF_S4_1, CONST_256, TMP2);
3155 vis_padd16(TMP24, TMP8, TMP24);
3157 vis_padd16(TMP26, TMP10, TMP26);
3158 vis_pack16(TMP24, DST_0);
3160 vis_pack16(TMP26, DST_1);
3161 vis_st64(DST_0, dest[0]);
3162 vis_pmerge(ZERO, REF_S6, TMP4);
3164 vis_pmerge(ZERO, REF_S6_1, TMP6);
3166 vis_padd16(TMP0, TMP4, TMP0);
3168 vis_padd16(TMP2, TMP6, TMP2);
3170 vis_padd16(TMP0, TMP12, TMP0);
3172 vis_padd16(TMP2, TMP14, TMP2);
3173 vis_pack16(TMP0, DST_2);
3175 vis_pack16(TMP2, DST_3);
3176 vis_st64_2(DST_2, dest, 8);
3181 static void MC_put_no_round_xy_8_vis (uint8_t * dest, const uint8_t * ref,
3182 const ptrdiff_t stride, int height)
3184 unsigned long off = (unsigned long) ref & 0x7;
3185 unsigned long off_plus_1 = off + 1;
3186 int stride_8 = stride + 8;
3188 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
3190 ref = vis_alignaddr(ref);
3192 vis_ld64(ref[ 0], TMP0);
3195 vis_ld64(ref[ 8], TMP2);
3197 vis_ld64(constants1[0], CONST_1);
3199 vis_ld64(constants256_512[0], CONST_256);
3200 vis_faligndata(TMP0, TMP2, REF_S0);
3203 vis_alignaddr_g0((void *)off_plus_1);
3204 vis_faligndata(TMP0, TMP2, REF_S2);
3206 vis_src1(TMP2, REF_S2);
3210 do { /* 26 cycles */
3211 vis_ld64_2(ref, stride, TMP0);
3212 vis_mul8x16au(REF_S0, CONST_256, TMP8);
3213 vis_pmerge(ZERO, REF_S2, TMP12);
3215 vis_alignaddr_g0((void *)off);
3217 vis_ld64_2(ref, stride_8, TMP2);
3219 vis_mul8x16au(REF_S0_1, CONST_256, TMP10);
3220 vis_pmerge(ZERO, REF_S2_1, TMP14);
3222 vis_ld64_2(ref, stride, TMP4);
3224 vis_ld64_2(ref, stride_8, TMP6);
3226 vis_faligndata(TMP0, TMP2, REF_S4);
3228 vis_pmerge(ZERO, REF_S4, TMP18);
3230 vis_pmerge(ZERO, REF_S4_1, TMP20);
3232 vis_faligndata(TMP4, TMP6, REF_S0);
3235 vis_alignaddr_g0((void *)off_plus_1);
3236 vis_faligndata(TMP0, TMP2, REF_S6);
3237 vis_faligndata(TMP4, TMP6, REF_S2);
3239 vis_src1(TMP2, REF_S6);
3240 vis_src1(TMP6, REF_S2);
3243 vis_padd16(TMP18, CONST_1, TMP18);
3244 vis_mul8x16au(REF_S6, CONST_256, TMP22);
3246 vis_padd16(TMP20, CONST_1, TMP20);
3247 vis_mul8x16au(REF_S6_1, CONST_256, TMP24);
3249 vis_mul8x16au(REF_S0, CONST_256, TMP26);
3250 vis_pmerge(ZERO, REF_S0_1, TMP28);
3252 vis_mul8x16au(REF_S2, CONST_256, TMP30);
3253 vis_padd16(TMP18, TMP22, TMP18);
3255 vis_mul8x16au(REF_S2_1, CONST_256, TMP32);
3256 vis_padd16(TMP20, TMP24, TMP20);
3258 vis_padd16(TMP8, TMP18, TMP8);
3260 vis_padd16(TMP10, TMP20, TMP10);
3262 vis_padd16(TMP8, TMP12, TMP8);
3264 vis_padd16(TMP10, TMP14, TMP10);
3265 vis_pack16(TMP8, DST_0);
3267 vis_pack16(TMP10, DST_1);
3268 vis_st64(DST_0, dest[0]);
3270 vis_padd16(TMP18, TMP26, TMP18);
3272 vis_padd16(TMP20, TMP28, TMP20);
3274 vis_padd16(TMP18, TMP30, TMP18);
3276 vis_padd16(TMP20, TMP32, TMP20);
3277 vis_pack16(TMP18, DST_2);
3279 vis_pack16(TMP20, DST_3);
3280 vis_st64(DST_2, dest[0]);
3285 static void MC_avg_no_round_xy_16_vis (uint8_t * dest, const uint8_t * ref,
3286 const ptrdiff_t stride, int height)
3288 unsigned long off = (unsigned long) ref & 0x7;
3289 unsigned long off_plus_1 = off + 1;
3290 int stride_8 = stride + 8;
3291 int stride_16 = stride + 16;
3293 vis_set_gsr(4 << VIS_GSR_SCALEFACT_SHIFT);
3295 ref = vis_alignaddr(ref);
3297 vis_ld64(ref[ 0], TMP0);
3300 vis_ld64(ref[ 8], TMP2);
3302 vis_ld64(ref[16], TMP4);
3304 vis_ld64(constants6[0], CONST_6);
3305 vis_faligndata(TMP0, TMP2, REF_S0);
3307 vis_ld64(constants256_1024[0], CONST_256);
3308 vis_faligndata(TMP2, TMP4, REF_S4);
3311 vis_alignaddr_g0((void *)off_plus_1);
3312 vis_faligndata(TMP0, TMP2, REF_S2);
3313 vis_faligndata(TMP2, TMP4, REF_S6);
3315 vis_src1(TMP2, REF_S2);
3316 vis_src1(TMP4, REF_S6);
3320 do { /* 55 cycles */
3321 vis_ld64_2(ref, stride, TMP0);
3322 vis_mul8x16au(REF_S0, CONST_256, TMP12);
3323 vis_pmerge(ZERO, REF_S0_1, TMP14);
3325 vis_alignaddr_g0((void *)off);
3327 vis_ld64_2(ref, stride_8, TMP2);
3328 vis_mul8x16au(REF_S2, CONST_256, TMP16);
3329 vis_pmerge(ZERO, REF_S2_1, TMP18);
3331 vis_ld64_2(ref, stride_16, TMP4);
3333 vis_mul8x16au(REF_S4, CONST_256, TMP20);
3334 vis_pmerge(ZERO, REF_S4_1, TMP22);
3336 vis_ld64_2(ref, stride, TMP6);
3337 vis_mul8x16au(REF_S6, CONST_256, TMP24);
3338 vis_pmerge(ZERO, REF_S6_1, TMP26);
3340 vis_ld64_2(ref, stride_8, TMP8);
3341 vis_faligndata(TMP0, TMP2, REF_0);
3343 vis_ld64_2(ref, stride_16, TMP10);
3345 vis_faligndata(TMP2, TMP4, REF_4);
3347 vis_ld64(dest[0], DST_0);
3348 vis_faligndata(TMP6, TMP8, REF_S0);
3350 vis_ld64_2(dest, 8, DST_2);
3351 vis_faligndata(TMP8, TMP10, REF_S4);
3354 vis_alignaddr_g0((void *)off_plus_1);
3355 vis_faligndata(TMP0, TMP2, REF_2);
3356 vis_faligndata(TMP2, TMP4, REF_6);
3357 vis_faligndata(TMP6, TMP8, REF_S2);
3358 vis_faligndata(TMP8, TMP10, REF_S6);
3360 vis_src1(TMP2, REF_2);
3361 vis_src1(TMP4, REF_6);
3362 vis_src1(TMP8, REF_S2);
3363 vis_src1(TMP10, REF_S6);
3366 vis_mul8x16al(DST_0, CONST_1024, TMP30);
3367 vis_pmerge(ZERO, REF_0, TMP0);
3369 vis_mul8x16al(DST_1, CONST_1024, TMP32);
3370 vis_pmerge(ZERO, REF_0_1, TMP2);
3372 vis_mul8x16au(REF_2, CONST_256, TMP4);
3373 vis_pmerge(ZERO, REF_2_1, TMP6);
3375 vis_mul8x16al(DST_2, CONST_1024, REF_0);
3376 vis_padd16(TMP0, CONST_6, TMP0);
3378 vis_mul8x16al(DST_3, CONST_1024, REF_2);
3379 vis_padd16(TMP2, CONST_6, TMP2);
3381 vis_padd16(TMP0, TMP4, TMP0);
3382 vis_mul8x16au(REF_4, CONST_256, TMP4);
3384 vis_padd16(TMP2, TMP6, TMP2);
3385 vis_mul8x16au(REF_4_1, CONST_256, TMP6);
3387 vis_padd16(TMP12, TMP0, TMP12);
3388 vis_mul8x16au(REF_6, CONST_256, TMP8);
3390 vis_padd16(TMP14, TMP2, TMP14);
3391 vis_mul8x16au(REF_6_1, CONST_256, TMP10);
3393 vis_padd16(TMP12, TMP16, TMP12);
3394 vis_mul8x16au(REF_S0, CONST_256, REF_4);
3396 vis_padd16(TMP14, TMP18, TMP14);
3397 vis_mul8x16au(REF_S0_1, CONST_256, REF_6);
3399 vis_padd16(TMP12, TMP30, TMP12);
3401 vis_padd16(TMP14, TMP32, TMP14);
3402 vis_pack16(TMP12, DST_0);
3404 vis_pack16(TMP14, DST_1);
3405 vis_st64(DST_0, dest[0]);
3406 vis_padd16(TMP4, CONST_6, TMP4);
3408 vis_ld64_2(dest, stride, DST_0);
3409 vis_padd16(TMP6, CONST_6, TMP6);
3410 vis_mul8x16au(REF_S2, CONST_256, TMP12);
3412 vis_padd16(TMP4, TMP8, TMP4);
3413 vis_mul8x16au(REF_S2_1, CONST_256, TMP14);
3415 vis_padd16(TMP6, TMP10, TMP6);
3417 vis_padd16(TMP20, TMP4, TMP20);
3419 vis_padd16(TMP22, TMP6, TMP22);
3421 vis_padd16(TMP20, TMP24, TMP20);
3423 vis_padd16(TMP22, TMP26, TMP22);
3425 vis_padd16(TMP20, REF_0, TMP20);
3426 vis_mul8x16au(REF_S4, CONST_256, REF_0);
3428 vis_padd16(TMP22, REF_2, TMP22);
3429 vis_pack16(TMP20, DST_2);
3431 vis_pack16(TMP22, DST_3);
3432 vis_st64_2(DST_2, dest, 8);
3435 vis_ld64_2(dest, 8, DST_2);
3436 vis_mul8x16al(DST_0, CONST_1024, TMP30);
3437 vis_pmerge(ZERO, REF_S4_1, REF_2);
3439 vis_mul8x16al(DST_1, CONST_1024, TMP32);
3440 vis_padd16(REF_4, TMP0, TMP8);
3442 vis_mul8x16au(REF_S6, CONST_256, REF_4);
3443 vis_padd16(REF_6, TMP2, TMP10);
3445 vis_mul8x16au(REF_S6_1, CONST_256, REF_6);
3446 vis_padd16(TMP8, TMP12, TMP8);
3448 vis_padd16(TMP10, TMP14, TMP10);
3450 vis_padd16(TMP8, TMP30, TMP8);
3452 vis_padd16(TMP10, TMP32, TMP10);
3453 vis_pack16(TMP8, DST_0);
3455 vis_pack16(TMP10, DST_1);
3456 vis_st64(DST_0, dest[0]);
3458 vis_padd16(REF_0, TMP4, REF_0);
3460 vis_mul8x16al(DST_2, CONST_1024, TMP30);
3461 vis_padd16(REF_2, TMP6, REF_2);
3463 vis_mul8x16al(DST_3, CONST_1024, TMP32);
3464 vis_padd16(REF_0, REF_4, REF_0);
3466 vis_padd16(REF_2, REF_6, REF_2);
3468 vis_padd16(REF_0, TMP30, REF_0);
3472 vis_padd16(REF_2, TMP32, REF_2);
3473 vis_pack16(REF_0, DST_2);
3475 vis_pack16(REF_2, DST_3);
3476 vis_st64_2(DST_2, dest, 8);
3481 /* End of no rounding code */
3483 av_cold void ff_hpeldsp_init_vis(HpelDSPContext *c, int flags)
3485 /* VIS-specific optimizations */
3486 int accel = vis_level ();
3488 if (accel & ACCEL_SPARC_VIS) {
3489 c->put_pixels_tab[0][0] = MC_put_o_16_vis;
3490 c->put_pixels_tab[0][1] = MC_put_x_16_vis;
3491 c->put_pixels_tab[0][2] = MC_put_y_16_vis;
3492 c->put_pixels_tab[0][3] = MC_put_xy_16_vis;
3494 c->put_pixels_tab[1][0] = MC_put_o_8_vis;
3495 c->put_pixels_tab[1][1] = MC_put_x_8_vis;
3496 c->put_pixels_tab[1][2] = MC_put_y_8_vis;
3497 c->put_pixels_tab[1][3] = MC_put_xy_8_vis;
3499 c->avg_pixels_tab[0][0] = MC_avg_o_16_vis;
3500 c->avg_pixels_tab[0][1] = MC_avg_x_16_vis;
3501 c->avg_pixels_tab[0][2] = MC_avg_y_16_vis;
3502 c->avg_pixels_tab[0][3] = MC_avg_xy_16_vis;
3504 c->avg_pixels_tab[1][0] = MC_avg_o_8_vis;
3505 c->avg_pixels_tab[1][1] = MC_avg_x_8_vis;
3506 c->avg_pixels_tab[1][2] = MC_avg_y_8_vis;
3507 c->avg_pixels_tab[1][3] = MC_avg_xy_8_vis;
3509 c->put_no_rnd_pixels_tab[0][0] = MC_put_no_round_o_16_vis;
3510 c->put_no_rnd_pixels_tab[0][1] = MC_put_no_round_x_16_vis;
3511 c->put_no_rnd_pixels_tab[0][2] = MC_put_no_round_y_16_vis;
3512 c->put_no_rnd_pixels_tab[0][3] = MC_put_no_round_xy_16_vis;
3514 c->put_no_rnd_pixels_tab[1][0] = MC_put_no_round_o_8_vis;
3515 c->put_no_rnd_pixels_tab[1][1] = MC_put_no_round_x_8_vis;
3516 c->put_no_rnd_pixels_tab[1][2] = MC_put_no_round_y_8_vis;
3517 c->put_no_rnd_pixels_tab[1][3] = MC_put_no_round_xy_8_vis;
3519 c->avg_no_rnd_pixels_tab[0] = MC_avg_no_round_o_16_vis;
3520 c->avg_no_rnd_pixels_tab[1] = MC_avg_no_round_x_16_vis;
3521 c->avg_no_rnd_pixels_tab[2] = MC_avg_no_round_y_16_vis;
3522 c->avg_no_rnd_pixels_tab[3] = MC_avg_no_round_xy_16_vis;