2 * Copyright (C) 2003 David S. Miller <davem@redhat.com>
4 * This file is part of FFmpeg.
6 * FFmpeg 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 * FFmpeg 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 FFmpeg; 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.
29 #include "libavutil/attributes.h"
30 #include "libavcodec/dsputil.h"
31 #include "libavutil/mem.h"
32 #include "dsputil_vis.h"
36 /* The trick used in some of this file is the formula from the MMX
37 * motion comp code, which is:
39 * (x+y+1)>>1 == (x|y)-((x^y)>>1)
41 * This allows us to average 8 bytes at a time in a 64-bit FPU reg.
42 * We avoid overflows by masking before we do the shift, and we
43 * implement the shift by multiplying by 1/2 using mul8x16. So in
44 * VIS this is (assume 'x' is in f0, 'y' is in f2, a repeating mask
45 * of '0xfe' is in f4, a repeating mask of '0x7f' is in f6, and
46 * the value 0x80808080 is in f8):
50 * fmul8x16 f8, f10, f10
53 * fpsub16 f12, f10, f10
56 #define DUP4(x) {x, x, x, x}
57 #define DUP8(x) {x, x, x, x, x, x, x, x}
58 DECLARE_ALIGNED(8, static const int16_t, constants1)[] = DUP4 (1);
59 DECLARE_ALIGNED(8, static const int16_t, constants2)[] = DUP4 (2);
60 DECLARE_ALIGNED(8, static const int16_t, constants3)[] = DUP4 (3);
61 DECLARE_ALIGNED(8, static const int16_t, constants6)[] = DUP4 (6);
62 DECLARE_ALIGNED(8, static const int8_t, constants_fe)[] = DUP8 (0xfe);
63 DECLARE_ALIGNED(8, static const int8_t, constants_7f)[] = DUP8 (0x7f);
64 DECLARE_ALIGNED(8, static const int8_t, constants128)[] = DUP8 (128);
65 DECLARE_ALIGNED(8, static const int16_t, constants256_512)[] =
67 DECLARE_ALIGNED(8, static const int16_t, constants256_1024)[] =
68 {256, 1024, 256, 1024};
123 static void MC_put_o_16_vis (uint8_t * dest, const uint8_t * ref,
124 const ptrdiff_t stride, int height)
126 ref = vis_alignaddr(ref);
128 vis_ld64(ref[0], TMP0);
130 vis_ld64_2(ref, 8, TMP2);
132 vis_ld64_2(ref, 16, TMP4);
135 vis_faligndata(TMP0, TMP2, REF_0);
136 vis_st64(REF_0, dest[0]);
138 vis_faligndata(TMP2, TMP4, REF_2);
139 vis_st64_2(REF_2, dest, 8);
144 static void MC_put_o_8_vis (uint8_t * dest, const uint8_t * ref,
145 const ptrdiff_t stride, int height)
147 ref = vis_alignaddr(ref);
149 vis_ld64(ref[0], TMP0);
151 vis_ld64(ref[8], TMP2);
156 vis_faligndata(TMP0, TMP2, REF_0);
157 vis_st64(REF_0, dest[0]);
163 static void MC_avg_o_16_vis (uint8_t * dest, const uint8_t * ref,
164 const ptrdiff_t stride, int height)
166 int stride_8 = stride + 8;
168 ref = vis_alignaddr(ref);
170 vis_ld64(ref[0], TMP0);
172 vis_ld64(ref[8], TMP2);
174 vis_ld64(ref[16], TMP4);
176 vis_ld64(dest[0], DST_0);
178 vis_ld64(dest[8], DST_2);
180 vis_ld64(constants_fe[0], MASK_fe);
181 vis_faligndata(TMP0, TMP2, REF_0);
183 vis_ld64(constants_7f[0], MASK_7f);
184 vis_faligndata(TMP2, TMP4, REF_2);
186 vis_ld64(constants128[0], CONST_128);
189 height = (height >> 1) - 1;
192 vis_ld64(ref[0], TMP0);
193 vis_xor(DST_0, REF_0, TMP6);
195 vis_ld64_2(ref, 8, TMP2);
196 vis_and(TMP6, MASK_fe, TMP6);
198 vis_ld64_2(ref, 16, TMP4);
200 vis_mul8x16(CONST_128, TMP6, TMP6);
201 vis_xor(DST_2, REF_2, TMP8);
203 vis_and(TMP8, MASK_fe, TMP8);
205 vis_or(DST_0, REF_0, TMP10);
206 vis_ld64_2(dest, stride, DST_0);
207 vis_mul8x16(CONST_128, TMP8, TMP8);
209 vis_or(DST_2, REF_2, TMP12);
210 vis_ld64_2(dest, stride_8, DST_2);
212 vis_ld64(ref[0], TMP14);
213 vis_and(TMP6, MASK_7f, TMP6);
215 vis_and(TMP8, MASK_7f, TMP8);
217 vis_psub16(TMP10, TMP6, TMP6);
218 vis_st64(TMP6, dest[0]);
220 vis_psub16(TMP12, TMP8, TMP8);
221 vis_st64_2(TMP8, dest, 8);
224 vis_ld64_2(ref, 8, TMP16);
225 vis_faligndata(TMP0, TMP2, REF_0);
227 vis_ld64_2(ref, 16, TMP18);
228 vis_faligndata(TMP2, TMP4, REF_2);
231 vis_xor(DST_0, REF_0, TMP20);
233 vis_and(TMP20, MASK_fe, TMP20);
235 vis_xor(DST_2, REF_2, TMP22);
236 vis_mul8x16(CONST_128, TMP20, TMP20);
238 vis_and(TMP22, MASK_fe, TMP22);
240 vis_or(DST_0, REF_0, TMP24);
241 vis_mul8x16(CONST_128, TMP22, TMP22);
243 vis_or(DST_2, REF_2, TMP26);
245 vis_ld64_2(dest, stride, DST_0);
246 vis_faligndata(TMP14, TMP16, REF_0);
248 vis_ld64_2(dest, stride_8, DST_2);
249 vis_faligndata(TMP16, TMP18, REF_2);
251 vis_and(TMP20, MASK_7f, TMP20);
253 vis_and(TMP22, MASK_7f, TMP22);
255 vis_psub16(TMP24, TMP20, TMP20);
256 vis_st64(TMP20, dest[0]);
258 vis_psub16(TMP26, TMP22, TMP22);
259 vis_st64_2(TMP22, dest, 8);
263 vis_ld64(ref[0], TMP0);
264 vis_xor(DST_0, REF_0, TMP6);
266 vis_ld64_2(ref, 8, TMP2);
267 vis_and(TMP6, MASK_fe, TMP6);
269 vis_ld64_2(ref, 16, TMP4);
270 vis_mul8x16(CONST_128, TMP6, TMP6);
271 vis_xor(DST_2, REF_2, TMP8);
273 vis_and(TMP8, MASK_fe, TMP8);
275 vis_or(DST_0, REF_0, TMP10);
276 vis_ld64_2(dest, stride, DST_0);
277 vis_mul8x16(CONST_128, TMP8, TMP8);
279 vis_or(DST_2, REF_2, TMP12);
280 vis_ld64_2(dest, stride_8, DST_2);
282 vis_ld64(ref[0], TMP14);
283 vis_and(TMP6, MASK_7f, TMP6);
285 vis_and(TMP8, MASK_7f, TMP8);
287 vis_psub16(TMP10, TMP6, TMP6);
288 vis_st64(TMP6, dest[0]);
290 vis_psub16(TMP12, TMP8, TMP8);
291 vis_st64_2(TMP8, dest, 8);
294 vis_faligndata(TMP0, TMP2, REF_0);
296 vis_faligndata(TMP2, TMP4, REF_2);
298 vis_xor(DST_0, REF_0, TMP20);
300 vis_and(TMP20, MASK_fe, TMP20);
302 vis_xor(DST_2, REF_2, TMP22);
303 vis_mul8x16(CONST_128, TMP20, TMP20);
305 vis_and(TMP22, MASK_fe, TMP22);
307 vis_or(DST_0, REF_0, TMP24);
308 vis_mul8x16(CONST_128, TMP22, TMP22);
310 vis_or(DST_2, REF_2, TMP26);
312 vis_and(TMP20, MASK_7f, TMP20);
314 vis_and(TMP22, MASK_7f, TMP22);
316 vis_psub16(TMP24, TMP20, TMP20);
317 vis_st64(TMP20, dest[0]);
319 vis_psub16(TMP26, TMP22, TMP22);
320 vis_st64_2(TMP22, dest, 8);
323 static void MC_avg_o_8_vis (uint8_t * dest, const uint8_t * ref,
324 const ptrdiff_t stride, int height)
326 ref = vis_alignaddr(ref);
328 vis_ld64(ref[0], TMP0);
330 vis_ld64(ref[8], TMP2);
332 vis_ld64(dest[0], DST_0);
334 vis_ld64(constants_fe[0], MASK_fe);
336 vis_ld64(constants_7f[0], MASK_7f);
337 vis_faligndata(TMP0, TMP2, REF_0);
339 vis_ld64(constants128[0], CONST_128);
342 height = (height >> 1) - 1;
345 vis_ld64(ref[0], TMP0);
346 vis_xor(DST_0, REF_0, TMP4);
348 vis_ld64(ref[8], TMP2);
349 vis_and(TMP4, MASK_fe, TMP4);
351 vis_or(DST_0, REF_0, TMP6);
352 vis_ld64_2(dest, stride, DST_0);
354 vis_mul8x16(CONST_128, TMP4, TMP4);
356 vis_ld64(ref[0], TMP12);
357 vis_faligndata(TMP0, TMP2, REF_0);
359 vis_ld64(ref[8], TMP2);
360 vis_xor(DST_0, REF_0, TMP0);
363 vis_and(TMP0, MASK_fe, TMP0);
365 vis_and(TMP4, MASK_7f, TMP4);
367 vis_psub16(TMP6, TMP4, TMP4);
368 vis_st64(TMP4, dest[0]);
370 vis_mul8x16(CONST_128, TMP0, TMP0);
372 vis_or(DST_0, REF_0, TMP6);
373 vis_ld64_2(dest, stride, DST_0);
375 vis_faligndata(TMP12, TMP2, REF_0);
377 vis_and(TMP0, MASK_7f, TMP0);
379 vis_psub16(TMP6, TMP0, TMP4);
380 vis_st64(TMP4, dest[0]);
384 vis_ld64(ref[0], TMP0);
385 vis_xor(DST_0, REF_0, TMP4);
387 vis_ld64(ref[8], TMP2);
388 vis_and(TMP4, MASK_fe, TMP4);
390 vis_or(DST_0, REF_0, TMP6);
391 vis_ld64_2(dest, stride, DST_0);
392 vis_mul8x16(CONST_128, TMP4, TMP4);
394 vis_faligndata(TMP0, TMP2, REF_0);
396 vis_xor(DST_0, REF_0, TMP0);
398 vis_and(TMP0, MASK_fe, TMP0);
400 vis_and(TMP4, MASK_7f, TMP4);
402 vis_psub16(TMP6, TMP4, TMP4);
403 vis_st64(TMP4, dest[0]);
405 vis_mul8x16(CONST_128, TMP0, TMP0);
407 vis_or(DST_0, REF_0, TMP6);
409 vis_and(TMP0, MASK_7f, TMP0);
411 vis_psub16(TMP6, TMP0, TMP4);
412 vis_st64(TMP4, dest[0]);
415 static void MC_put_x_16_vis (uint8_t * dest, const uint8_t * ref,
416 const ptrdiff_t stride, int height)
418 unsigned long off = (unsigned long) ref & 0x7;
419 unsigned long off_plus_1 = off + 1;
421 ref = vis_alignaddr(ref);
423 vis_ld64(ref[0], TMP0);
425 vis_ld64_2(ref, 8, TMP2);
427 vis_ld64_2(ref, 16, TMP4);
429 vis_ld64(constants_fe[0], MASK_fe);
431 vis_ld64(constants_7f[0], MASK_7f);
432 vis_faligndata(TMP0, TMP2, REF_0);
434 vis_ld64(constants128[0], CONST_128);
435 vis_faligndata(TMP2, TMP4, REF_4);
438 vis_alignaddr_g0((void *)off_plus_1);
439 vis_faligndata(TMP0, TMP2, REF_2);
440 vis_faligndata(TMP2, TMP4, REF_6);
442 vis_src1(TMP2, REF_2);
443 vis_src1(TMP4, REF_6);
447 height = (height >> 1) - 1;
450 vis_ld64(ref[0], TMP0);
451 vis_xor(REF_0, REF_2, TMP6);
453 vis_ld64_2(ref, 8, TMP2);
454 vis_xor(REF_4, REF_6, TMP8);
456 vis_ld64_2(ref, 16, TMP4);
457 vis_and(TMP6, MASK_fe, TMP6);
460 vis_ld64(ref[0], TMP14);
461 vis_mul8x16(CONST_128, TMP6, TMP6);
462 vis_and(TMP8, MASK_fe, TMP8);
464 vis_ld64_2(ref, 8, TMP16);
465 vis_mul8x16(CONST_128, TMP8, TMP8);
466 vis_or(REF_0, REF_2, TMP10);
468 vis_ld64_2(ref, 16, TMP18);
470 vis_or(REF_4, REF_6, TMP12);
472 vis_alignaddr_g0((void *)off);
474 vis_faligndata(TMP0, TMP2, REF_0);
476 vis_faligndata(TMP2, TMP4, REF_4);
479 vis_alignaddr_g0((void *)off_plus_1);
480 vis_faligndata(TMP0, TMP2, REF_2);
481 vis_faligndata(TMP2, TMP4, REF_6);
483 vis_src1(TMP2, REF_2);
484 vis_src1(TMP4, REF_6);
487 vis_and(TMP6, MASK_7f, TMP6);
489 vis_and(TMP8, MASK_7f, TMP8);
491 vis_psub16(TMP10, TMP6, TMP6);
492 vis_st64(TMP6, dest[0]);
494 vis_psub16(TMP12, TMP8, TMP8);
495 vis_st64_2(TMP8, dest, 8);
498 vis_xor(REF_0, REF_2, TMP6);
500 vis_xor(REF_4, REF_6, TMP8);
502 vis_and(TMP6, MASK_fe, TMP6);
504 vis_mul8x16(CONST_128, TMP6, TMP6);
505 vis_and(TMP8, MASK_fe, TMP8);
507 vis_mul8x16(CONST_128, TMP8, TMP8);
508 vis_or(REF_0, REF_2, TMP10);
510 vis_or(REF_4, REF_6, TMP12);
512 vis_alignaddr_g0((void *)off);
514 vis_faligndata(TMP14, TMP16, REF_0);
516 vis_faligndata(TMP16, TMP18, REF_4);
519 vis_alignaddr_g0((void *)off_plus_1);
520 vis_faligndata(TMP14, TMP16, REF_2);
521 vis_faligndata(TMP16, TMP18, REF_6);
523 vis_src1(TMP16, REF_2);
524 vis_src1(TMP18, REF_6);
527 vis_and(TMP6, MASK_7f, TMP6);
529 vis_and(TMP8, MASK_7f, TMP8);
531 vis_psub16(TMP10, TMP6, TMP6);
532 vis_st64(TMP6, dest[0]);
534 vis_psub16(TMP12, TMP8, TMP8);
535 vis_st64_2(TMP8, dest, 8);
539 vis_ld64(ref[0], TMP0);
540 vis_xor(REF_0, REF_2, TMP6);
542 vis_ld64_2(ref, 8, TMP2);
543 vis_xor(REF_4, REF_6, TMP8);
545 vis_ld64_2(ref, 16, TMP4);
546 vis_and(TMP6, MASK_fe, TMP6);
548 vis_mul8x16(CONST_128, TMP6, TMP6);
549 vis_and(TMP8, MASK_fe, TMP8);
551 vis_mul8x16(CONST_128, TMP8, TMP8);
552 vis_or(REF_0, REF_2, TMP10);
554 vis_or(REF_4, REF_6, TMP12);
556 vis_alignaddr_g0((void *)off);
558 vis_faligndata(TMP0, TMP2, REF_0);
560 vis_faligndata(TMP2, TMP4, REF_4);
563 vis_alignaddr_g0((void *)off_plus_1);
564 vis_faligndata(TMP0, TMP2, REF_2);
565 vis_faligndata(TMP2, TMP4, REF_6);
567 vis_src1(TMP2, REF_2);
568 vis_src1(TMP4, REF_6);
571 vis_and(TMP6, MASK_7f, TMP6);
573 vis_and(TMP8, MASK_7f, TMP8);
575 vis_psub16(TMP10, TMP6, TMP6);
576 vis_st64(TMP6, dest[0]);
578 vis_psub16(TMP12, TMP8, TMP8);
579 vis_st64_2(TMP8, dest, 8);
582 vis_xor(REF_0, REF_2, TMP6);
584 vis_xor(REF_4, REF_6, TMP8);
586 vis_and(TMP6, MASK_fe, TMP6);
588 vis_mul8x16(CONST_128, TMP6, TMP6);
589 vis_and(TMP8, MASK_fe, TMP8);
591 vis_mul8x16(CONST_128, TMP8, TMP8);
592 vis_or(REF_0, REF_2, TMP10);
594 vis_or(REF_4, REF_6, TMP12);
596 vis_and(TMP6, MASK_7f, TMP6);
598 vis_and(TMP8, MASK_7f, TMP8);
600 vis_psub16(TMP10, TMP6, TMP6);
601 vis_st64(TMP6, dest[0]);
603 vis_psub16(TMP12, TMP8, TMP8);
604 vis_st64_2(TMP8, dest, 8);
607 static void MC_put_x_8_vis (uint8_t * dest, const uint8_t * ref,
608 const ptrdiff_t stride, int height)
610 unsigned long off = (unsigned long) ref & 0x7;
611 unsigned long off_plus_1 = off + 1;
613 ref = vis_alignaddr(ref);
615 vis_ld64(ref[0], TMP0);
617 vis_ld64(ref[8], TMP2);
619 vis_ld64(constants_fe[0], MASK_fe);
621 vis_ld64(constants_7f[0], MASK_7f);
623 vis_ld64(constants128[0], CONST_128);
624 vis_faligndata(TMP0, TMP2, REF_0);
627 vis_alignaddr_g0((void *)off_plus_1);
628 vis_faligndata(TMP0, TMP2, REF_2);
630 vis_src1(TMP2, REF_2);
634 height = (height >> 1) - 1;
637 vis_ld64(ref[0], TMP0);
638 vis_xor(REF_0, REF_2, TMP4);
640 vis_ld64_2(ref, 8, TMP2);
641 vis_and(TMP4, MASK_fe, TMP4);
644 vis_ld64(ref[0], TMP8);
645 vis_or(REF_0, REF_2, TMP6);
646 vis_mul8x16(CONST_128, TMP4, TMP4);
648 vis_alignaddr_g0((void *)off);
650 vis_ld64_2(ref, 8, TMP10);
652 vis_faligndata(TMP0, TMP2, REF_0);
655 vis_alignaddr_g0((void *)off_plus_1);
656 vis_faligndata(TMP0, TMP2, REF_2);
658 vis_src1(TMP2, REF_2);
661 vis_and(TMP4, MASK_7f, TMP4);
663 vis_psub16(TMP6, TMP4, DST_0);
664 vis_st64(DST_0, dest[0]);
667 vis_xor(REF_0, REF_2, TMP12);
669 vis_and(TMP12, MASK_fe, TMP12);
671 vis_or(REF_0, REF_2, TMP14);
672 vis_mul8x16(CONST_128, TMP12, TMP12);
674 vis_alignaddr_g0((void *)off);
675 vis_faligndata(TMP8, TMP10, REF_0);
677 vis_alignaddr_g0((void *)off_plus_1);
678 vis_faligndata(TMP8, TMP10, REF_2);
680 vis_src1(TMP10, REF_2);
683 vis_and(TMP12, MASK_7f, TMP12);
685 vis_psub16(TMP14, TMP12, DST_0);
686 vis_st64(DST_0, dest[0]);
690 vis_ld64(ref[0], TMP0);
691 vis_xor(REF_0, REF_2, TMP4);
693 vis_ld64_2(ref, 8, TMP2);
694 vis_and(TMP4, MASK_fe, TMP4);
696 vis_or(REF_0, REF_2, TMP6);
697 vis_mul8x16(CONST_128, TMP4, TMP4);
699 vis_alignaddr_g0((void *)off);
701 vis_faligndata(TMP0, TMP2, REF_0);
704 vis_alignaddr_g0((void *)off_plus_1);
705 vis_faligndata(TMP0, TMP2, REF_2);
707 vis_src1(TMP2, REF_2);
710 vis_and(TMP4, MASK_7f, TMP4);
712 vis_psub16(TMP6, TMP4, DST_0);
713 vis_st64(DST_0, dest[0]);
716 vis_xor(REF_0, REF_2, TMP12);
718 vis_and(TMP12, MASK_fe, TMP12);
720 vis_or(REF_0, REF_2, TMP14);
721 vis_mul8x16(CONST_128, TMP12, TMP12);
723 vis_and(TMP12, MASK_7f, TMP12);
725 vis_psub16(TMP14, TMP12, DST_0);
726 vis_st64(DST_0, dest[0]);
730 static void MC_avg_x_16_vis (uint8_t * dest, const uint8_t * ref,
731 const ptrdiff_t stride, int height)
733 unsigned long off = (unsigned long) ref & 0x7;
734 unsigned long off_plus_1 = off + 1;
736 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
738 vis_ld64(constants3[0], CONST_3);
740 vis_ld64(constants256_512[0], CONST_256);
742 ref = vis_alignaddr(ref);
744 vis_ld64(ref[0], TMP0);
746 vis_ld64(ref[8], TMP2);
748 vis_alignaddr_g0((void *)off);
750 vis_ld64(ref[16], TMP4);
752 vis_ld64(dest[0], DST_0);
753 vis_faligndata(TMP0, TMP2, REF_0);
755 vis_ld64(dest[8], DST_2);
756 vis_faligndata(TMP2, TMP4, REF_4);
759 vis_alignaddr_g0((void *)off_plus_1);
760 vis_faligndata(TMP0, TMP2, REF_2);
761 vis_faligndata(TMP2, TMP4, REF_6);
763 vis_src1(TMP2, REF_2);
764 vis_src1(TMP4, REF_6);
767 vis_mul8x16au(REF_0, CONST_256, TMP0);
769 vis_pmerge(ZERO, REF_2, TMP4);
770 vis_mul8x16au(REF_0_1, CONST_256, TMP2);
772 vis_pmerge(ZERO, REF_2_1, TMP6);
774 vis_padd16(TMP0, TMP4, TMP0);
776 vis_mul8x16al(DST_0, CONST_512, TMP4);
777 vis_padd16(TMP2, TMP6, TMP2);
779 vis_mul8x16al(DST_1, CONST_512, TMP6);
781 vis_mul8x16au(REF_6, CONST_256, TMP12);
783 vis_padd16(TMP0, TMP4, TMP0);
784 vis_mul8x16au(REF_6_1, CONST_256, TMP14);
786 vis_padd16(TMP2, TMP6, TMP2);
787 vis_mul8x16au(REF_4, CONST_256, TMP16);
789 vis_padd16(TMP0, CONST_3, TMP8);
790 vis_mul8x16au(REF_4_1, CONST_256, TMP18);
792 vis_padd16(TMP2, CONST_3, TMP10);
793 vis_pack16(TMP8, DST_0);
795 vis_pack16(TMP10, DST_1);
796 vis_padd16(TMP16, TMP12, TMP0);
798 vis_st64(DST_0, dest[0]);
799 vis_mul8x16al(DST_2, CONST_512, TMP4);
800 vis_padd16(TMP18, TMP14, TMP2);
802 vis_mul8x16al(DST_3, CONST_512, TMP6);
803 vis_padd16(TMP0, CONST_3, TMP0);
805 vis_padd16(TMP2, CONST_3, TMP2);
807 vis_padd16(TMP0, TMP4, TMP0);
809 vis_padd16(TMP2, TMP6, TMP2);
810 vis_pack16(TMP0, DST_2);
812 vis_pack16(TMP2, DST_3);
813 vis_st64(DST_2, dest[8]);
820 static void MC_avg_x_8_vis (uint8_t * dest, const uint8_t * ref,
821 const ptrdiff_t stride, int height)
823 unsigned long off = (unsigned long) ref & 0x7;
824 unsigned long off_plus_1 = off + 1;
825 int stride_times_2 = stride << 1;
827 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
829 vis_ld64(constants3[0], CONST_3);
831 vis_ld64(constants256_512[0], CONST_256);
833 ref = vis_alignaddr(ref);
836 vis_ld64(ref[0], TMP0);
838 vis_ld64_2(ref, 8, TMP2);
841 vis_alignaddr_g0((void *)off);
843 vis_ld64(ref[0], TMP4);
844 vis_faligndata(TMP0, TMP2, REF_0);
846 vis_ld64_2(ref, 8, TMP6);
849 vis_ld64(ref[0], TMP8);
851 vis_ld64_2(ref, 8, TMP10);
853 vis_faligndata(TMP4, TMP6, REF_4);
855 vis_ld64(ref[0], TMP12);
857 vis_ld64_2(ref, 8, TMP14);
859 vis_faligndata(TMP8, TMP10, REF_S0);
861 vis_faligndata(TMP12, TMP14, REF_S4);
864 vis_alignaddr_g0((void *)off_plus_1);
866 vis_ld64(dest[0], DST_0);
867 vis_faligndata(TMP0, TMP2, REF_2);
869 vis_ld64_2(dest, stride, DST_2);
870 vis_faligndata(TMP4, TMP6, REF_6);
872 vis_faligndata(TMP8, TMP10, REF_S2);
874 vis_faligndata(TMP12, TMP14, REF_S6);
876 vis_ld64(dest[0], DST_0);
877 vis_src1(TMP2, REF_2);
879 vis_ld64_2(dest, stride, DST_2);
880 vis_src1(TMP6, REF_6);
882 vis_src1(TMP10, REF_S2);
884 vis_src1(TMP14, REF_S6);
887 vis_pmerge(ZERO, REF_0, TMP0);
888 vis_mul8x16au(REF_0_1, CONST_256, TMP2);
890 vis_pmerge(ZERO, REF_2, TMP4);
891 vis_mul8x16au(REF_2_1, CONST_256, TMP6);
893 vis_padd16(TMP0, CONST_3, TMP0);
894 vis_mul8x16al(DST_0, CONST_512, TMP16);
896 vis_padd16(TMP2, CONST_3, TMP2);
897 vis_mul8x16al(DST_1, CONST_512, TMP18);
899 vis_padd16(TMP0, TMP4, TMP0);
900 vis_mul8x16au(REF_4, CONST_256, TMP8);
902 vis_padd16(TMP2, TMP6, TMP2);
903 vis_mul8x16au(REF_4_1, CONST_256, TMP10);
905 vis_padd16(TMP0, TMP16, TMP0);
906 vis_mul8x16au(REF_6, CONST_256, TMP12);
908 vis_padd16(TMP2, TMP18, TMP2);
909 vis_mul8x16au(REF_6_1, CONST_256, TMP14);
911 vis_padd16(TMP8, CONST_3, TMP8);
912 vis_mul8x16al(DST_2, CONST_512, TMP16);
914 vis_padd16(TMP8, TMP12, TMP8);
915 vis_mul8x16al(DST_3, CONST_512, TMP18);
917 vis_padd16(TMP10, TMP14, TMP10);
918 vis_pack16(TMP0, DST_0);
920 vis_pack16(TMP2, DST_1);
921 vis_st64(DST_0, dest[0]);
923 vis_padd16(TMP10, CONST_3, TMP10);
925 vis_ld64_2(dest, stride, DST_0);
926 vis_padd16(TMP8, TMP16, TMP8);
928 vis_ld64_2(dest, stride_times_2, TMP4/*DST_2*/);
929 vis_padd16(TMP10, TMP18, TMP10);
930 vis_pack16(TMP8, DST_2);
932 vis_pack16(TMP10, DST_3);
933 vis_st64(DST_2, dest[0]);
936 vis_mul8x16au(REF_S0_1, CONST_256, TMP2);
937 vis_pmerge(ZERO, REF_S0, TMP0);
939 vis_pmerge(ZERO, REF_S2, TMP24);
940 vis_mul8x16au(REF_S2_1, CONST_256, TMP6);
942 vis_padd16(TMP0, CONST_3, TMP0);
943 vis_mul8x16au(REF_S4, CONST_256, TMP8);
945 vis_padd16(TMP2, CONST_3, TMP2);
946 vis_mul8x16au(REF_S4_1, CONST_256, TMP10);
948 vis_padd16(TMP0, TMP24, TMP0);
949 vis_mul8x16au(REF_S6, CONST_256, TMP12);
951 vis_padd16(TMP2, TMP6, TMP2);
952 vis_mul8x16au(REF_S6_1, CONST_256, TMP14);
954 vis_padd16(TMP8, CONST_3, TMP8);
955 vis_mul8x16al(DST_0, CONST_512, TMP16);
957 vis_padd16(TMP10, CONST_3, TMP10);
958 vis_mul8x16al(DST_1, CONST_512, TMP18);
960 vis_padd16(TMP8, TMP12, TMP8);
961 vis_mul8x16al(TMP4/*DST_2*/, CONST_512, TMP20);
963 vis_mul8x16al(TMP5/*DST_3*/, CONST_512, TMP22);
964 vis_padd16(TMP0, TMP16, TMP0);
966 vis_padd16(TMP2, TMP18, TMP2);
967 vis_pack16(TMP0, DST_0);
969 vis_padd16(TMP10, TMP14, TMP10);
970 vis_pack16(TMP2, DST_1);
971 vis_st64(DST_0, dest[0]);
974 vis_padd16(TMP8, TMP20, TMP8);
976 vis_padd16(TMP10, TMP22, TMP10);
977 vis_pack16(TMP8, DST_2);
979 vis_pack16(TMP10, DST_3);
980 vis_st64(DST_2, dest[0]);
985 static void MC_put_y_16_vis (uint8_t * dest, const uint8_t * ref,
986 const ptrdiff_t stride, int height)
988 ref = vis_alignaddr(ref);
989 vis_ld64(ref[0], TMP0);
991 vis_ld64_2(ref, 8, TMP2);
993 vis_ld64_2(ref, 16, TMP4);
996 vis_ld64(ref[0], TMP6);
997 vis_faligndata(TMP0, TMP2, REF_0);
999 vis_ld64_2(ref, 8, TMP8);
1000 vis_faligndata(TMP2, TMP4, REF_4);
1002 vis_ld64_2(ref, 16, TMP10);
1005 vis_ld64(constants_fe[0], MASK_fe);
1006 vis_faligndata(TMP6, TMP8, REF_2);
1008 vis_ld64(constants_7f[0], MASK_7f);
1009 vis_faligndata(TMP8, TMP10, REF_6);
1011 vis_ld64(constants128[0], CONST_128);
1012 height = (height >> 1) - 1;
1013 do { /* 24 cycles */
1014 vis_ld64(ref[0], TMP0);
1015 vis_xor(REF_0, REF_2, TMP12);
1017 vis_ld64_2(ref, 8, TMP2);
1018 vis_xor(REF_4, REF_6, TMP16);
1020 vis_ld64_2(ref, 16, TMP4);
1022 vis_or(REF_0, REF_2, TMP14);
1024 vis_ld64(ref[0], TMP6);
1025 vis_or(REF_4, REF_6, TMP18);
1027 vis_ld64_2(ref, 8, TMP8);
1028 vis_faligndata(TMP0, TMP2, REF_0);
1030 vis_ld64_2(ref, 16, TMP10);
1032 vis_faligndata(TMP2, TMP4, REF_4);
1034 vis_and(TMP12, MASK_fe, TMP12);
1036 vis_and(TMP16, MASK_fe, TMP16);
1037 vis_mul8x16(CONST_128, TMP12, TMP12);
1039 vis_mul8x16(CONST_128, TMP16, TMP16);
1040 vis_xor(REF_0, REF_2, TMP0);
1042 vis_xor(REF_4, REF_6, TMP2);
1044 vis_or(REF_0, REF_2, TMP20);
1046 vis_and(TMP12, MASK_7f, TMP12);
1048 vis_and(TMP16, MASK_7f, TMP16);
1050 vis_psub16(TMP14, TMP12, TMP12);
1051 vis_st64(TMP12, dest[0]);
1053 vis_psub16(TMP18, TMP16, TMP16);
1054 vis_st64_2(TMP16, dest, 8);
1057 vis_or(REF_4, REF_6, TMP18);
1059 vis_and(TMP0, MASK_fe, TMP0);
1061 vis_and(TMP2, MASK_fe, TMP2);
1062 vis_mul8x16(CONST_128, TMP0, TMP0);
1064 vis_faligndata(TMP6, TMP8, REF_2);
1065 vis_mul8x16(CONST_128, TMP2, TMP2);
1067 vis_faligndata(TMP8, TMP10, REF_6);
1069 vis_and(TMP0, MASK_7f, TMP0);
1071 vis_and(TMP2, MASK_7f, TMP2);
1073 vis_psub16(TMP20, TMP0, TMP0);
1074 vis_st64(TMP0, dest[0]);
1076 vis_psub16(TMP18, TMP2, TMP2);
1077 vis_st64_2(TMP2, dest, 8);
1081 vis_ld64(ref[0], TMP0);
1082 vis_xor(REF_0, REF_2, TMP12);
1084 vis_ld64_2(ref, 8, TMP2);
1085 vis_xor(REF_4, REF_6, TMP16);
1087 vis_ld64_2(ref, 16, TMP4);
1088 vis_or(REF_0, REF_2, TMP14);
1090 vis_or(REF_4, REF_6, TMP18);
1092 vis_faligndata(TMP0, TMP2, REF_0);
1094 vis_faligndata(TMP2, TMP4, REF_4);
1096 vis_and(TMP12, MASK_fe, TMP12);
1098 vis_and(TMP16, MASK_fe, TMP16);
1099 vis_mul8x16(CONST_128, TMP12, TMP12);
1101 vis_mul8x16(CONST_128, TMP16, TMP16);
1102 vis_xor(REF_0, REF_2, TMP0);
1104 vis_xor(REF_4, REF_6, TMP2);
1106 vis_or(REF_0, REF_2, TMP20);
1108 vis_and(TMP12, MASK_7f, TMP12);
1110 vis_and(TMP16, MASK_7f, TMP16);
1112 vis_psub16(TMP14, TMP12, TMP12);
1113 vis_st64(TMP12, dest[0]);
1115 vis_psub16(TMP18, TMP16, TMP16);
1116 vis_st64_2(TMP16, dest, 8);
1119 vis_or(REF_4, REF_6, TMP18);
1121 vis_and(TMP0, MASK_fe, TMP0);
1123 vis_and(TMP2, MASK_fe, TMP2);
1124 vis_mul8x16(CONST_128, TMP0, TMP0);
1126 vis_mul8x16(CONST_128, TMP2, TMP2);
1128 vis_and(TMP0, MASK_7f, TMP0);
1130 vis_and(TMP2, MASK_7f, TMP2);
1132 vis_psub16(TMP20, TMP0, TMP0);
1133 vis_st64(TMP0, dest[0]);
1135 vis_psub16(TMP18, TMP2, TMP2);
1136 vis_st64_2(TMP2, dest, 8);
1139 static void MC_put_y_8_vis (uint8_t * dest, const uint8_t * ref,
1140 const ptrdiff_t stride, int height)
1142 ref = vis_alignaddr(ref);
1143 vis_ld64(ref[0], TMP0);
1145 vis_ld64_2(ref, 8, TMP2);
1148 vis_ld64(ref[0], TMP4);
1150 vis_ld64_2(ref, 8, TMP6);
1153 vis_ld64(constants_fe[0], MASK_fe);
1154 vis_faligndata(TMP0, TMP2, REF_0);
1156 vis_ld64(constants_7f[0], MASK_7f);
1157 vis_faligndata(TMP4, TMP6, REF_2);
1159 vis_ld64(constants128[0], CONST_128);
1160 height = (height >> 1) - 1;
1161 do { /* 12 cycles */
1162 vis_ld64(ref[0], TMP0);
1163 vis_xor(REF_0, REF_2, TMP4);
1165 vis_ld64_2(ref, 8, TMP2);
1167 vis_and(TMP4, MASK_fe, TMP4);
1169 vis_or(REF_0, REF_2, TMP6);
1170 vis_mul8x16(CONST_128, TMP4, TMP4);
1172 vis_faligndata(TMP0, TMP2, REF_0);
1173 vis_ld64(ref[0], TMP0);
1175 vis_ld64_2(ref, 8, TMP2);
1177 vis_xor(REF_0, REF_2, TMP12);
1179 vis_and(TMP4, MASK_7f, TMP4);
1181 vis_and(TMP12, MASK_fe, TMP12);
1183 vis_mul8x16(CONST_128, TMP12, TMP12);
1184 vis_or(REF_0, REF_2, TMP14);
1186 vis_psub16(TMP6, TMP4, DST_0);
1187 vis_st64(DST_0, dest[0]);
1190 vis_faligndata(TMP0, TMP2, REF_2);
1192 vis_and(TMP12, MASK_7f, TMP12);
1194 vis_psub16(TMP14, TMP12, DST_0);
1195 vis_st64(DST_0, dest[0]);
1199 vis_ld64(ref[0], TMP0);
1200 vis_xor(REF_0, REF_2, TMP4);
1202 vis_ld64_2(ref, 8, TMP2);
1203 vis_and(TMP4, MASK_fe, TMP4);
1205 vis_or(REF_0, REF_2, TMP6);
1206 vis_mul8x16(CONST_128, TMP4, TMP4);
1208 vis_faligndata(TMP0, TMP2, REF_0);
1210 vis_xor(REF_0, REF_2, TMP12);
1212 vis_and(TMP4, MASK_7f, TMP4);
1214 vis_and(TMP12, MASK_fe, TMP12);
1216 vis_mul8x16(CONST_128, TMP12, TMP12);
1217 vis_or(REF_0, REF_2, TMP14);
1219 vis_psub16(TMP6, TMP4, DST_0);
1220 vis_st64(DST_0, dest[0]);
1223 vis_and(TMP12, MASK_7f, TMP12);
1225 vis_psub16(TMP14, TMP12, DST_0);
1226 vis_st64(DST_0, dest[0]);
1229 static void MC_avg_y_16_vis (uint8_t * dest, const uint8_t * ref,
1230 const ptrdiff_t stride, int height)
1232 int stride_8 = stride + 8;
1233 int stride_16 = stride + 16;
1235 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
1237 ref = vis_alignaddr(ref);
1239 vis_ld64(ref[ 0], TMP0);
1242 vis_ld64(ref[ 8], TMP2);
1244 vis_ld64(ref[16], TMP4);
1246 vis_ld64(constants3[0], CONST_3);
1247 vis_faligndata(TMP0, TMP2, REF_2);
1249 vis_ld64(constants256_512[0], CONST_256);
1250 vis_faligndata(TMP2, TMP4, REF_6);
1253 do { /* 31 cycles */
1254 vis_ld64_2(ref, stride, TMP0);
1255 vis_pmerge(ZERO, REF_2, TMP12);
1256 vis_mul8x16au(REF_2_1, CONST_256, TMP14);
1258 vis_ld64_2(ref, stride_8, TMP2);
1259 vis_pmerge(ZERO, REF_6, TMP16);
1260 vis_mul8x16au(REF_6_1, CONST_256, TMP18);
1262 vis_ld64_2(ref, stride_16, TMP4);
1265 vis_ld64(dest[0], DST_0);
1266 vis_faligndata(TMP0, TMP2, REF_0);
1268 vis_ld64_2(dest, 8, DST_2);
1269 vis_faligndata(TMP2, TMP4, REF_4);
1271 vis_ld64_2(ref, stride, TMP6);
1272 vis_pmerge(ZERO, REF_0, TMP0);
1273 vis_mul8x16au(REF_0_1, CONST_256, TMP2);
1275 vis_ld64_2(ref, stride_8, TMP8);
1276 vis_pmerge(ZERO, REF_4, TMP4);
1278 vis_ld64_2(ref, stride_16, TMP10);
1281 vis_ld64_2(dest, stride, REF_S0/*DST_4*/);
1282 vis_faligndata(TMP6, TMP8, REF_2);
1283 vis_mul8x16au(REF_4_1, CONST_256, TMP6);
1285 vis_ld64_2(dest, stride_8, REF_S2/*DST_6*/);
1286 vis_faligndata(TMP8, TMP10, REF_6);
1287 vis_mul8x16al(DST_0, CONST_512, TMP20);
1289 vis_padd16(TMP0, CONST_3, TMP0);
1290 vis_mul8x16al(DST_1, CONST_512, TMP22);
1292 vis_padd16(TMP2, CONST_3, TMP2);
1293 vis_mul8x16al(DST_2, CONST_512, TMP24);
1295 vis_padd16(TMP4, CONST_3, TMP4);
1296 vis_mul8x16al(DST_3, CONST_512, TMP26);
1298 vis_padd16(TMP6, CONST_3, TMP6);
1300 vis_padd16(TMP12, TMP20, TMP12);
1301 vis_mul8x16al(REF_S0, CONST_512, TMP20);
1303 vis_padd16(TMP14, TMP22, TMP14);
1304 vis_mul8x16al(REF_S0_1, CONST_512, TMP22);
1306 vis_padd16(TMP16, TMP24, TMP16);
1307 vis_mul8x16al(REF_S2, CONST_512, TMP24);
1309 vis_padd16(TMP18, TMP26, TMP18);
1310 vis_mul8x16al(REF_S2_1, CONST_512, TMP26);
1312 vis_padd16(TMP12, TMP0, TMP12);
1313 vis_mul8x16au(REF_2, CONST_256, TMP28);
1315 vis_padd16(TMP14, TMP2, TMP14);
1316 vis_mul8x16au(REF_2_1, CONST_256, TMP30);
1318 vis_padd16(TMP16, TMP4, TMP16);
1319 vis_mul8x16au(REF_6, CONST_256, REF_S4);
1321 vis_padd16(TMP18, TMP6, TMP18);
1322 vis_mul8x16au(REF_6_1, CONST_256, REF_S6);
1324 vis_pack16(TMP12, DST_0);
1325 vis_padd16(TMP28, TMP0, TMP12);
1327 vis_pack16(TMP14, DST_1);
1328 vis_st64(DST_0, dest[0]);
1329 vis_padd16(TMP30, TMP2, TMP14);
1331 vis_pack16(TMP16, DST_2);
1332 vis_padd16(REF_S4, TMP4, TMP16);
1334 vis_pack16(TMP18, DST_3);
1335 vis_st64_2(DST_2, dest, 8);
1337 vis_padd16(REF_S6, TMP6, TMP18);
1339 vis_padd16(TMP12, TMP20, TMP12);
1341 vis_padd16(TMP14, TMP22, TMP14);
1342 vis_pack16(TMP12, DST_0);
1344 vis_padd16(TMP16, TMP24, TMP16);
1345 vis_pack16(TMP14, DST_1);
1346 vis_st64(DST_0, dest[0]);
1348 vis_padd16(TMP18, TMP26, TMP18);
1349 vis_pack16(TMP16, DST_2);
1351 vis_pack16(TMP18, DST_3);
1352 vis_st64_2(DST_2, dest, 8);
1357 static void MC_avg_y_8_vis (uint8_t * dest, const uint8_t * ref,
1358 const ptrdiff_t stride, int height)
1360 int stride_8 = stride + 8;
1362 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
1364 ref = vis_alignaddr(ref);
1366 vis_ld64(ref[ 0], TMP0);
1369 vis_ld64(ref[ 8], TMP2);
1371 vis_ld64(constants3[0], CONST_3);
1372 vis_faligndata(TMP0, TMP2, REF_2);
1374 vis_ld64(constants256_512[0], CONST_256);
1377 do { /* 20 cycles */
1378 vis_ld64_2(ref, stride, TMP0);
1379 vis_pmerge(ZERO, REF_2, TMP8);
1380 vis_mul8x16au(REF_2_1, CONST_256, TMP10);
1382 vis_ld64_2(ref, stride_8, TMP2);
1385 vis_ld64(dest[0], DST_0);
1387 vis_ld64_2(dest, stride, DST_2);
1388 vis_faligndata(TMP0, TMP2, REF_0);
1390 vis_ld64_2(ref, stride, TMP4);
1391 vis_mul8x16al(DST_0, CONST_512, TMP16);
1392 vis_pmerge(ZERO, REF_0, TMP12);
1394 vis_ld64_2(ref, stride_8, TMP6);
1396 vis_mul8x16al(DST_1, CONST_512, TMP18);
1397 vis_pmerge(ZERO, REF_0_1, TMP14);
1399 vis_padd16(TMP12, CONST_3, TMP12);
1400 vis_mul8x16al(DST_2, CONST_512, TMP24);
1402 vis_padd16(TMP14, CONST_3, TMP14);
1403 vis_mul8x16al(DST_3, CONST_512, TMP26);
1405 vis_faligndata(TMP4, TMP6, REF_2);
1407 vis_padd16(TMP8, TMP12, TMP8);
1409 vis_padd16(TMP10, TMP14, TMP10);
1410 vis_mul8x16au(REF_2, CONST_256, TMP20);
1412 vis_padd16(TMP8, TMP16, TMP0);
1413 vis_mul8x16au(REF_2_1, CONST_256, TMP22);
1415 vis_padd16(TMP10, TMP18, TMP2);
1416 vis_pack16(TMP0, DST_0);
1418 vis_pack16(TMP2, DST_1);
1419 vis_st64(DST_0, dest[0]);
1421 vis_padd16(TMP12, TMP20, TMP12);
1423 vis_padd16(TMP14, TMP22, TMP14);
1425 vis_padd16(TMP12, TMP24, TMP0);
1427 vis_padd16(TMP14, TMP26, TMP2);
1428 vis_pack16(TMP0, DST_2);
1430 vis_pack16(TMP2, DST_3);
1431 vis_st64(DST_2, dest[0]);
1436 static void MC_put_xy_16_vis (uint8_t * dest, const uint8_t * ref,
1437 const ptrdiff_t stride, int height)
1439 unsigned long off = (unsigned long) ref & 0x7;
1440 unsigned long off_plus_1 = off + 1;
1441 int stride_8 = stride + 8;
1442 int stride_16 = stride + 16;
1444 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
1446 ref = vis_alignaddr(ref);
1448 vis_ld64(ref[ 0], TMP0);
1451 vis_ld64(ref[ 8], TMP2);
1453 vis_ld64(ref[16], TMP4);
1455 vis_ld64(constants2[0], CONST_2);
1456 vis_faligndata(TMP0, TMP2, REF_S0);
1458 vis_ld64(constants256_512[0], CONST_256);
1459 vis_faligndata(TMP2, TMP4, REF_S4);
1462 vis_alignaddr_g0((void *)off_plus_1);
1463 vis_faligndata(TMP0, TMP2, REF_S2);
1464 vis_faligndata(TMP2, TMP4, REF_S6);
1466 vis_src1(TMP2, REF_S2);
1467 vis_src1(TMP4, REF_S6);
1472 vis_ld64_2(ref, stride, TMP0);
1473 vis_mul8x16au(REF_S0, CONST_256, TMP12);
1474 vis_pmerge(ZERO, REF_S0_1, TMP14);
1476 vis_alignaddr_g0((void *)off);
1478 vis_ld64_2(ref, stride_8, TMP2);
1479 vis_mul8x16au(REF_S2, CONST_256, TMP16);
1480 vis_pmerge(ZERO, REF_S2_1, TMP18);
1482 vis_ld64_2(ref, stride_16, TMP4);
1484 vis_mul8x16au(REF_S4, CONST_256, TMP20);
1485 vis_pmerge(ZERO, REF_S4_1, TMP22);
1487 vis_ld64_2(ref, stride, TMP6);
1488 vis_mul8x16au(REF_S6, CONST_256, TMP24);
1489 vis_pmerge(ZERO, REF_S6_1, TMP26);
1491 vis_ld64_2(ref, stride_8, TMP8);
1492 vis_faligndata(TMP0, TMP2, REF_0);
1494 vis_ld64_2(ref, stride_16, TMP10);
1496 vis_faligndata(TMP2, TMP4, REF_4);
1498 vis_faligndata(TMP6, TMP8, REF_S0);
1500 vis_faligndata(TMP8, TMP10, REF_S4);
1503 vis_alignaddr_g0((void *)off_plus_1);
1504 vis_faligndata(TMP0, TMP2, REF_2);
1505 vis_faligndata(TMP2, TMP4, REF_6);
1506 vis_faligndata(TMP6, TMP8, REF_S2);
1507 vis_faligndata(TMP8, TMP10, REF_S6);
1509 vis_src1(TMP2, REF_2);
1510 vis_src1(TMP4, REF_6);
1511 vis_src1(TMP8, REF_S2);
1512 vis_src1(TMP10, REF_S6);
1515 vis_mul8x16au(REF_0, CONST_256, TMP0);
1516 vis_pmerge(ZERO, REF_0_1, TMP2);
1518 vis_mul8x16au(REF_2, CONST_256, TMP4);
1519 vis_pmerge(ZERO, REF_2_1, TMP6);
1521 vis_padd16(TMP0, CONST_2, TMP8);
1522 vis_mul8x16au(REF_4, CONST_256, TMP0);
1524 vis_padd16(TMP2, CONST_2, TMP10);
1525 vis_mul8x16au(REF_4_1, CONST_256, TMP2);
1527 vis_padd16(TMP8, TMP4, TMP8);
1528 vis_mul8x16au(REF_6, CONST_256, TMP4);
1530 vis_padd16(TMP10, TMP6, TMP10);
1531 vis_mul8x16au(REF_6_1, CONST_256, TMP6);
1533 vis_padd16(TMP12, TMP8, TMP12);
1535 vis_padd16(TMP14, TMP10, TMP14);
1537 vis_padd16(TMP12, TMP16, TMP12);
1539 vis_padd16(TMP14, TMP18, TMP14);
1540 vis_pack16(TMP12, DST_0);
1542 vis_pack16(TMP14, DST_1);
1543 vis_st64(DST_0, dest[0]);
1544 vis_padd16(TMP0, CONST_2, TMP12);
1546 vis_mul8x16au(REF_S0, CONST_256, TMP0);
1547 vis_padd16(TMP2, CONST_2, TMP14);
1549 vis_mul8x16au(REF_S0_1, CONST_256, TMP2);
1550 vis_padd16(TMP12, TMP4, TMP12);
1552 vis_mul8x16au(REF_S2, CONST_256, TMP4);
1553 vis_padd16(TMP14, TMP6, TMP14);
1555 vis_mul8x16au(REF_S2_1, CONST_256, TMP6);
1556 vis_padd16(TMP20, TMP12, TMP20);
1558 vis_padd16(TMP22, TMP14, TMP22);
1560 vis_padd16(TMP20, TMP24, TMP20);
1562 vis_padd16(TMP22, TMP26, TMP22);
1563 vis_pack16(TMP20, DST_2);
1565 vis_pack16(TMP22, DST_3);
1566 vis_st64_2(DST_2, dest, 8);
1568 vis_padd16(TMP0, TMP4, TMP24);
1570 vis_mul8x16au(REF_S4, CONST_256, TMP0);
1571 vis_padd16(TMP2, TMP6, TMP26);
1573 vis_mul8x16au(REF_S4_1, CONST_256, TMP2);
1574 vis_padd16(TMP24, TMP8, TMP24);
1576 vis_padd16(TMP26, TMP10, TMP26);
1577 vis_pack16(TMP24, DST_0);
1579 vis_pack16(TMP26, DST_1);
1580 vis_st64(DST_0, dest[0]);
1581 vis_pmerge(ZERO, REF_S6, TMP4);
1583 vis_pmerge(ZERO, REF_S6_1, TMP6);
1585 vis_padd16(TMP0, TMP4, TMP0);
1587 vis_padd16(TMP2, TMP6, TMP2);
1589 vis_padd16(TMP0, TMP12, TMP0);
1591 vis_padd16(TMP2, TMP14, TMP2);
1592 vis_pack16(TMP0, DST_2);
1594 vis_pack16(TMP2, DST_3);
1595 vis_st64_2(DST_2, dest, 8);
1600 static void MC_put_xy_8_vis (uint8_t * dest, const uint8_t * ref,
1601 const ptrdiff_t stride, int height)
1603 unsigned long off = (unsigned long) ref & 0x7;
1604 unsigned long off_plus_1 = off + 1;
1605 int stride_8 = stride + 8;
1607 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
1609 ref = vis_alignaddr(ref);
1611 vis_ld64(ref[ 0], TMP0);
1614 vis_ld64(ref[ 8], TMP2);
1616 vis_ld64(constants2[0], CONST_2);
1618 vis_ld64(constants256_512[0], CONST_256);
1619 vis_faligndata(TMP0, TMP2, REF_S0);
1622 vis_alignaddr_g0((void *)off_plus_1);
1623 vis_faligndata(TMP0, TMP2, REF_S2);
1625 vis_src1(TMP2, REF_S2);
1629 do { /* 26 cycles */
1630 vis_ld64_2(ref, stride, TMP0);
1631 vis_mul8x16au(REF_S0, CONST_256, TMP8);
1632 vis_pmerge(ZERO, REF_S2, TMP12);
1634 vis_alignaddr_g0((void *)off);
1636 vis_ld64_2(ref, stride_8, TMP2);
1638 vis_mul8x16au(REF_S0_1, CONST_256, TMP10);
1639 vis_pmerge(ZERO, REF_S2_1, TMP14);
1641 vis_ld64_2(ref, stride, TMP4);
1643 vis_ld64_2(ref, stride_8, TMP6);
1645 vis_faligndata(TMP0, TMP2, REF_S4);
1647 vis_pmerge(ZERO, REF_S4, TMP18);
1649 vis_pmerge(ZERO, REF_S4_1, TMP20);
1651 vis_faligndata(TMP4, TMP6, REF_S0);
1654 vis_alignaddr_g0((void *)off_plus_1);
1655 vis_faligndata(TMP0, TMP2, REF_S6);
1656 vis_faligndata(TMP4, TMP6, REF_S2);
1658 vis_src1(TMP2, REF_S6);
1659 vis_src1(TMP6, REF_S2);
1662 vis_padd16(TMP18, CONST_2, TMP18);
1663 vis_mul8x16au(REF_S6, CONST_256, TMP22);
1665 vis_padd16(TMP20, CONST_2, TMP20);
1666 vis_mul8x16au(REF_S6_1, CONST_256, TMP24);
1668 vis_mul8x16au(REF_S0, CONST_256, TMP26);
1669 vis_pmerge(ZERO, REF_S0_1, TMP28);
1671 vis_mul8x16au(REF_S2, CONST_256, TMP30);
1672 vis_padd16(TMP18, TMP22, TMP18);
1674 vis_mul8x16au(REF_S2_1, CONST_256, TMP32);
1675 vis_padd16(TMP20, TMP24, TMP20);
1677 vis_padd16(TMP8, TMP18, TMP8);
1679 vis_padd16(TMP10, TMP20, TMP10);
1681 vis_padd16(TMP8, TMP12, TMP8);
1683 vis_padd16(TMP10, TMP14, TMP10);
1684 vis_pack16(TMP8, DST_0);
1686 vis_pack16(TMP10, DST_1);
1687 vis_st64(DST_0, dest[0]);
1689 vis_padd16(TMP18, TMP26, TMP18);
1691 vis_padd16(TMP20, TMP28, TMP20);
1693 vis_padd16(TMP18, TMP30, TMP18);
1695 vis_padd16(TMP20, TMP32, TMP20);
1696 vis_pack16(TMP18, DST_2);
1698 vis_pack16(TMP20, DST_3);
1699 vis_st64(DST_2, dest[0]);
1704 static void MC_avg_xy_16_vis (uint8_t * dest, const uint8_t * ref,
1705 const ptrdiff_t stride, int height)
1707 unsigned long off = (unsigned long) ref & 0x7;
1708 unsigned long off_plus_1 = off + 1;
1709 int stride_8 = stride + 8;
1710 int stride_16 = stride + 16;
1712 vis_set_gsr(4 << VIS_GSR_SCALEFACT_SHIFT);
1714 ref = vis_alignaddr(ref);
1716 vis_ld64(ref[ 0], TMP0);
1719 vis_ld64(ref[ 8], TMP2);
1721 vis_ld64(ref[16], TMP4);
1723 vis_ld64(constants6[0], CONST_6);
1724 vis_faligndata(TMP0, TMP2, REF_S0);
1726 vis_ld64(constants256_1024[0], CONST_256);
1727 vis_faligndata(TMP2, TMP4, REF_S4);
1730 vis_alignaddr_g0((void *)off_plus_1);
1731 vis_faligndata(TMP0, TMP2, REF_S2);
1732 vis_faligndata(TMP2, TMP4, REF_S6);
1734 vis_src1(TMP2, REF_S2);
1735 vis_src1(TMP4, REF_S6);
1739 do { /* 55 cycles */
1740 vis_ld64_2(ref, stride, TMP0);
1741 vis_mul8x16au(REF_S0, CONST_256, TMP12);
1742 vis_pmerge(ZERO, REF_S0_1, TMP14);
1744 vis_alignaddr_g0((void *)off);
1746 vis_ld64_2(ref, stride_8, TMP2);
1747 vis_mul8x16au(REF_S2, CONST_256, TMP16);
1748 vis_pmerge(ZERO, REF_S2_1, TMP18);
1750 vis_ld64_2(ref, stride_16, TMP4);
1752 vis_mul8x16au(REF_S4, CONST_256, TMP20);
1753 vis_pmerge(ZERO, REF_S4_1, TMP22);
1755 vis_ld64_2(ref, stride, TMP6);
1756 vis_mul8x16au(REF_S6, CONST_256, TMP24);
1757 vis_pmerge(ZERO, REF_S6_1, TMP26);
1759 vis_ld64_2(ref, stride_8, TMP8);
1760 vis_faligndata(TMP0, TMP2, REF_0);
1762 vis_ld64_2(ref, stride_16, TMP10);
1764 vis_faligndata(TMP2, TMP4, REF_4);
1766 vis_ld64(dest[0], DST_0);
1767 vis_faligndata(TMP6, TMP8, REF_S0);
1769 vis_ld64_2(dest, 8, DST_2);
1770 vis_faligndata(TMP8, TMP10, REF_S4);
1773 vis_alignaddr_g0((void *)off_plus_1);
1774 vis_faligndata(TMP0, TMP2, REF_2);
1775 vis_faligndata(TMP2, TMP4, REF_6);
1776 vis_faligndata(TMP6, TMP8, REF_S2);
1777 vis_faligndata(TMP8, TMP10, REF_S6);
1779 vis_src1(TMP2, REF_2);
1780 vis_src1(TMP4, REF_6);
1781 vis_src1(TMP8, REF_S2);
1782 vis_src1(TMP10, REF_S6);
1785 vis_mul8x16al(DST_0, CONST_1024, TMP30);
1786 vis_pmerge(ZERO, REF_0, TMP0);
1788 vis_mul8x16al(DST_1, CONST_1024, TMP32);
1789 vis_pmerge(ZERO, REF_0_1, TMP2);
1791 vis_mul8x16au(REF_2, CONST_256, TMP4);
1792 vis_pmerge(ZERO, REF_2_1, TMP6);
1794 vis_mul8x16al(DST_2, CONST_1024, REF_0);
1795 vis_padd16(TMP0, CONST_6, TMP0);
1797 vis_mul8x16al(DST_3, CONST_1024, REF_2);
1798 vis_padd16(TMP2, CONST_6, TMP2);
1800 vis_padd16(TMP0, TMP4, TMP0);
1801 vis_mul8x16au(REF_4, CONST_256, TMP4);
1803 vis_padd16(TMP2, TMP6, TMP2);
1804 vis_mul8x16au(REF_4_1, CONST_256, TMP6);
1806 vis_padd16(TMP12, TMP0, TMP12);
1807 vis_mul8x16au(REF_6, CONST_256, TMP8);
1809 vis_padd16(TMP14, TMP2, TMP14);
1810 vis_mul8x16au(REF_6_1, CONST_256, TMP10);
1812 vis_padd16(TMP12, TMP16, TMP12);
1813 vis_mul8x16au(REF_S0, CONST_256, REF_4);
1815 vis_padd16(TMP14, TMP18, TMP14);
1816 vis_mul8x16au(REF_S0_1, CONST_256, REF_6);
1818 vis_padd16(TMP12, TMP30, TMP12);
1820 vis_padd16(TMP14, TMP32, TMP14);
1821 vis_pack16(TMP12, DST_0);
1823 vis_pack16(TMP14, DST_1);
1824 vis_st64(DST_0, dest[0]);
1825 vis_padd16(TMP4, CONST_6, TMP4);
1827 vis_ld64_2(dest, stride, DST_0);
1828 vis_padd16(TMP6, CONST_6, TMP6);
1829 vis_mul8x16au(REF_S2, CONST_256, TMP12);
1831 vis_padd16(TMP4, TMP8, TMP4);
1832 vis_mul8x16au(REF_S2_1, CONST_256, TMP14);
1834 vis_padd16(TMP6, TMP10, TMP6);
1836 vis_padd16(TMP20, TMP4, TMP20);
1838 vis_padd16(TMP22, TMP6, TMP22);
1840 vis_padd16(TMP20, TMP24, TMP20);
1842 vis_padd16(TMP22, TMP26, TMP22);
1844 vis_padd16(TMP20, REF_0, TMP20);
1845 vis_mul8x16au(REF_S4, CONST_256, REF_0);
1847 vis_padd16(TMP22, REF_2, TMP22);
1848 vis_pack16(TMP20, DST_2);
1850 vis_pack16(TMP22, DST_3);
1851 vis_st64_2(DST_2, dest, 8);
1854 vis_ld64_2(dest, 8, DST_2);
1855 vis_mul8x16al(DST_0, CONST_1024, TMP30);
1856 vis_pmerge(ZERO, REF_S4_1, REF_2);
1858 vis_mul8x16al(DST_1, CONST_1024, TMP32);
1859 vis_padd16(REF_4, TMP0, TMP8);
1861 vis_mul8x16au(REF_S6, CONST_256, REF_4);
1862 vis_padd16(REF_6, TMP2, TMP10);
1864 vis_mul8x16au(REF_S6_1, CONST_256, REF_6);
1865 vis_padd16(TMP8, TMP12, TMP8);
1867 vis_padd16(TMP10, TMP14, TMP10);
1869 vis_padd16(TMP8, TMP30, TMP8);
1871 vis_padd16(TMP10, TMP32, TMP10);
1872 vis_pack16(TMP8, DST_0);
1874 vis_pack16(TMP10, DST_1);
1875 vis_st64(DST_0, dest[0]);
1877 vis_padd16(REF_0, TMP4, REF_0);
1879 vis_mul8x16al(DST_2, CONST_1024, TMP30);
1880 vis_padd16(REF_2, TMP6, REF_2);
1882 vis_mul8x16al(DST_3, CONST_1024, TMP32);
1883 vis_padd16(REF_0, REF_4, REF_0);
1885 vis_padd16(REF_2, REF_6, REF_2);
1887 vis_padd16(REF_0, TMP30, REF_0);
1891 vis_padd16(REF_2, TMP32, REF_2);
1892 vis_pack16(REF_0, DST_2);
1894 vis_pack16(REF_2, DST_3);
1895 vis_st64_2(DST_2, dest, 8);
1900 static void MC_avg_xy_8_vis (uint8_t * dest, const uint8_t * ref,
1901 const ptrdiff_t stride, int height)
1903 unsigned long off = (unsigned long) ref & 0x7;
1904 unsigned long off_plus_1 = off + 1;
1905 int stride_8 = stride + 8;
1907 vis_set_gsr(4 << VIS_GSR_SCALEFACT_SHIFT);
1909 ref = vis_alignaddr(ref);
1911 vis_ld64(ref[0], TMP0);
1914 vis_ld64_2(ref, 8, TMP2);
1916 vis_ld64(constants6[0], CONST_6);
1918 vis_ld64(constants256_1024[0], CONST_256);
1919 vis_faligndata(TMP0, TMP2, REF_S0);
1922 vis_alignaddr_g0((void *)off_plus_1);
1923 vis_faligndata(TMP0, TMP2, REF_S2);
1925 vis_src1(TMP2, REF_S2);
1929 do { /* 31 cycles */
1930 vis_ld64_2(ref, stride, TMP0);
1931 vis_mul8x16au(REF_S0, CONST_256, TMP8);
1932 vis_pmerge(ZERO, REF_S0_1, TMP10);
1934 vis_ld64_2(ref, stride_8, TMP2);
1936 vis_mul8x16au(REF_S2, CONST_256, TMP12);
1937 vis_pmerge(ZERO, REF_S2_1, TMP14);
1939 vis_alignaddr_g0((void *)off);
1941 vis_ld64_2(ref, stride, TMP4);
1942 vis_faligndata(TMP0, TMP2, REF_S4);
1944 vis_ld64_2(ref, stride_8, TMP6);
1947 vis_ld64(dest[0], DST_0);
1948 vis_faligndata(TMP4, TMP6, REF_S0);
1950 vis_ld64_2(dest, stride, DST_2);
1953 vis_alignaddr_g0((void *)off_plus_1);
1954 vis_faligndata(TMP0, TMP2, REF_S6);
1955 vis_faligndata(TMP4, TMP6, REF_S2);
1957 vis_src1(TMP2, REF_S6);
1958 vis_src1(TMP6, REF_S2);
1961 vis_mul8x16al(DST_0, CONST_1024, TMP30);
1962 vis_pmerge(ZERO, REF_S4, TMP22);
1964 vis_mul8x16al(DST_1, CONST_1024, TMP32);
1965 vis_pmerge(ZERO, REF_S4_1, TMP24);
1967 vis_mul8x16au(REF_S6, CONST_256, TMP26);
1968 vis_pmerge(ZERO, REF_S6_1, TMP28);
1970 vis_mul8x16au(REF_S0, CONST_256, REF_S4);
1971 vis_padd16(TMP22, CONST_6, TMP22);
1973 vis_mul8x16au(REF_S0_1, CONST_256, REF_S6);
1974 vis_padd16(TMP24, CONST_6, TMP24);
1976 vis_mul8x16al(DST_2, CONST_1024, REF_0);
1977 vis_padd16(TMP22, TMP26, TMP22);
1979 vis_mul8x16al(DST_3, CONST_1024, REF_2);
1980 vis_padd16(TMP24, TMP28, TMP24);
1982 vis_mul8x16au(REF_S2, CONST_256, TMP26);
1983 vis_padd16(TMP8, TMP22, TMP8);
1985 vis_mul8x16au(REF_S2_1, CONST_256, TMP28);
1986 vis_padd16(TMP10, TMP24, TMP10);
1988 vis_padd16(TMP8, TMP12, TMP8);
1990 vis_padd16(TMP10, TMP14, TMP10);
1992 vis_padd16(TMP8, TMP30, TMP8);
1994 vis_padd16(TMP10, TMP32, TMP10);
1995 vis_pack16(TMP8, DST_0);
1997 vis_pack16(TMP10, DST_1);
1998 vis_st64(DST_0, dest[0]);
2001 vis_padd16(REF_S4, TMP22, TMP12);
2003 vis_padd16(REF_S6, TMP24, TMP14);
2005 vis_padd16(TMP12, TMP26, TMP12);
2007 vis_padd16(TMP14, TMP28, TMP14);
2009 vis_padd16(TMP12, REF_0, TMP12);
2011 vis_padd16(TMP14, REF_2, TMP14);
2012 vis_pack16(TMP12, DST_2);
2014 vis_pack16(TMP14, DST_3);
2015 vis_st64(DST_2, dest[0]);
2020 /* End of rounding code */
2022 /* Start of no rounding code */
2023 /* The trick used in some of this file is the formula from the MMX
2024 * motion comp code, which is:
2026 * (x+y)>>1 == (x&y)+((x^y)>>1)
2028 * This allows us to average 8 bytes at a time in a 64-bit FPU reg.
2029 * We avoid overflows by masking before we do the shift, and we
2030 * implement the shift by multiplying by 1/2 using mul8x16. So in
2031 * VIS this is (assume 'x' is in f0, 'y' is in f2, a repeating mask
2032 * of '0xfe' is in f4, a repeating mask of '0x7f' is in f6, and
2033 * the value 0x80808080 is in f8):
2037 * fmul8x16 f8, f10, f10
2040 * fpadd16 f12, f10, f10
2043 static void MC_put_no_round_o_16_vis (uint8_t * dest, const uint8_t * ref,
2044 const ptrdiff_t stride, int height)
2046 ref = vis_alignaddr(ref);
2048 vis_ld64(ref[0], TMP0);
2050 vis_ld64_2(ref, 8, TMP2);
2052 vis_ld64_2(ref, 16, TMP4);
2055 vis_faligndata(TMP0, TMP2, REF_0);
2056 vis_st64(REF_0, dest[0]);
2058 vis_faligndata(TMP2, TMP4, REF_2);
2059 vis_st64_2(REF_2, dest, 8);
2064 static void MC_put_no_round_o_8_vis (uint8_t * dest, const uint8_t * ref,
2065 const ptrdiff_t stride, int height)
2067 ref = vis_alignaddr(ref);
2069 vis_ld64(ref[0], TMP0);
2071 vis_ld64(ref[8], TMP2);
2076 vis_faligndata(TMP0, TMP2, REF_0);
2077 vis_st64(REF_0, dest[0]);
2083 static void MC_avg_no_round_o_16_vis (uint8_t * dest, const uint8_t * ref,
2084 const ptrdiff_t stride, int height)
2086 int stride_8 = stride + 8;
2088 ref = vis_alignaddr(ref);
2090 vis_ld64(ref[0], TMP0);
2092 vis_ld64(ref[8], TMP2);
2094 vis_ld64(ref[16], TMP4);
2096 vis_ld64(dest[0], DST_0);
2098 vis_ld64(dest[8], DST_2);
2100 vis_ld64(constants_fe[0], MASK_fe);
2101 vis_faligndata(TMP0, TMP2, REF_0);
2103 vis_ld64(constants_7f[0], MASK_7f);
2104 vis_faligndata(TMP2, TMP4, REF_2);
2106 vis_ld64(constants128[0], CONST_128);
2109 height = (height >> 1) - 1;
2111 do { /* 24 cycles */
2112 vis_ld64(ref[0], TMP0);
2113 vis_xor(DST_0, REF_0, TMP6);
2115 vis_ld64_2(ref, 8, TMP2);
2116 vis_and(TMP6, MASK_fe, TMP6);
2118 vis_ld64_2(ref, 16, TMP4);
2120 vis_mul8x16(CONST_128, TMP6, TMP6);
2121 vis_xor(DST_2, REF_2, TMP8);
2123 vis_and(TMP8, MASK_fe, TMP8);
2125 vis_and(DST_0, REF_0, TMP10);
2126 vis_ld64_2(dest, stride, DST_0);
2127 vis_mul8x16(CONST_128, TMP8, TMP8);
2129 vis_and(DST_2, REF_2, TMP12);
2130 vis_ld64_2(dest, stride_8, DST_2);
2132 vis_ld64(ref[0], TMP14);
2133 vis_and(TMP6, MASK_7f, TMP6);
2135 vis_and(TMP8, MASK_7f, TMP8);
2137 vis_padd16(TMP10, TMP6, TMP6);
2138 vis_st64(TMP6, dest[0]);
2140 vis_padd16(TMP12, TMP8, TMP8);
2141 vis_st64_2(TMP8, dest, 8);
2144 vis_ld64_2(ref, 8, TMP16);
2145 vis_faligndata(TMP0, TMP2, REF_0);
2147 vis_ld64_2(ref, 16, TMP18);
2148 vis_faligndata(TMP2, TMP4, REF_2);
2151 vis_xor(DST_0, REF_0, TMP20);
2153 vis_and(TMP20, MASK_fe, TMP20);
2155 vis_xor(DST_2, REF_2, TMP22);
2156 vis_mul8x16(CONST_128, TMP20, TMP20);
2158 vis_and(TMP22, MASK_fe, TMP22);
2160 vis_and(DST_0, REF_0, TMP24);
2161 vis_mul8x16(CONST_128, TMP22, TMP22);
2163 vis_and(DST_2, REF_2, TMP26);
2165 vis_ld64_2(dest, stride, DST_0);
2166 vis_faligndata(TMP14, TMP16, REF_0);
2168 vis_ld64_2(dest, stride_8, DST_2);
2169 vis_faligndata(TMP16, TMP18, REF_2);
2171 vis_and(TMP20, MASK_7f, TMP20);
2173 vis_and(TMP22, MASK_7f, TMP22);
2175 vis_padd16(TMP24, TMP20, TMP20);
2176 vis_st64(TMP20, dest[0]);
2178 vis_padd16(TMP26, TMP22, TMP22);
2179 vis_st64_2(TMP22, dest, 8);
2183 vis_ld64(ref[0], TMP0);
2184 vis_xor(DST_0, REF_0, TMP6);
2186 vis_ld64_2(ref, 8, TMP2);
2187 vis_and(TMP6, MASK_fe, TMP6);
2189 vis_ld64_2(ref, 16, TMP4);
2190 vis_mul8x16(CONST_128, TMP6, TMP6);
2191 vis_xor(DST_2, REF_2, TMP8);
2193 vis_and(TMP8, MASK_fe, TMP8);
2195 vis_and(DST_0, REF_0, TMP10);
2196 vis_ld64_2(dest, stride, DST_0);
2197 vis_mul8x16(CONST_128, TMP8, TMP8);
2199 vis_and(DST_2, REF_2, TMP12);
2200 vis_ld64_2(dest, stride_8, DST_2);
2202 vis_ld64(ref[0], TMP14);
2203 vis_and(TMP6, MASK_7f, TMP6);
2205 vis_and(TMP8, MASK_7f, TMP8);
2207 vis_padd16(TMP10, TMP6, TMP6);
2208 vis_st64(TMP6, dest[0]);
2210 vis_padd16(TMP12, TMP8, TMP8);
2211 vis_st64_2(TMP8, dest, 8);
2214 vis_faligndata(TMP0, TMP2, REF_0);
2216 vis_faligndata(TMP2, TMP4, REF_2);
2218 vis_xor(DST_0, REF_0, TMP20);
2220 vis_and(TMP20, MASK_fe, TMP20);
2222 vis_xor(DST_2, REF_2, TMP22);
2223 vis_mul8x16(CONST_128, TMP20, TMP20);
2225 vis_and(TMP22, MASK_fe, TMP22);
2227 vis_and(DST_0, REF_0, TMP24);
2228 vis_mul8x16(CONST_128, TMP22, TMP22);
2230 vis_and(DST_2, REF_2, TMP26);
2232 vis_and(TMP20, MASK_7f, TMP20);
2234 vis_and(TMP22, MASK_7f, TMP22);
2236 vis_padd16(TMP24, TMP20, TMP20);
2237 vis_st64(TMP20, dest[0]);
2239 vis_padd16(TMP26, TMP22, TMP22);
2240 vis_st64_2(TMP22, dest, 8);
2243 static void MC_put_no_round_x_16_vis (uint8_t * dest, const uint8_t * ref,
2244 const ptrdiff_t stride, int height)
2246 unsigned long off = (unsigned long) ref & 0x7;
2247 unsigned long off_plus_1 = off + 1;
2249 ref = vis_alignaddr(ref);
2251 vis_ld64(ref[0], TMP0);
2253 vis_ld64_2(ref, 8, TMP2);
2255 vis_ld64_2(ref, 16, TMP4);
2257 vis_ld64(constants_fe[0], MASK_fe);
2259 vis_ld64(constants_7f[0], MASK_7f);
2260 vis_faligndata(TMP0, TMP2, REF_0);
2262 vis_ld64(constants128[0], CONST_128);
2263 vis_faligndata(TMP2, TMP4, REF_4);
2266 vis_alignaddr_g0((void *)off_plus_1);
2267 vis_faligndata(TMP0, TMP2, REF_2);
2268 vis_faligndata(TMP2, TMP4, REF_6);
2270 vis_src1(TMP2, REF_2);
2271 vis_src1(TMP4, REF_6);
2275 height = (height >> 1) - 1;
2277 do { /* 34 cycles */
2278 vis_ld64(ref[0], TMP0);
2279 vis_xor(REF_0, REF_2, TMP6);
2281 vis_ld64_2(ref, 8, TMP2);
2282 vis_xor(REF_4, REF_6, TMP8);
2284 vis_ld64_2(ref, 16, TMP4);
2285 vis_and(TMP6, MASK_fe, TMP6);
2288 vis_ld64(ref[0], TMP14);
2289 vis_mul8x16(CONST_128, TMP6, TMP6);
2290 vis_and(TMP8, MASK_fe, TMP8);
2292 vis_ld64_2(ref, 8, TMP16);
2293 vis_mul8x16(CONST_128, TMP8, TMP8);
2294 vis_and(REF_0, REF_2, TMP10);
2296 vis_ld64_2(ref, 16, TMP18);
2298 vis_and(REF_4, REF_6, TMP12);
2300 vis_alignaddr_g0((void *)off);
2302 vis_faligndata(TMP0, TMP2, REF_0);
2304 vis_faligndata(TMP2, TMP4, REF_4);
2307 vis_alignaddr_g0((void *)off_plus_1);
2308 vis_faligndata(TMP0, TMP2, REF_2);
2309 vis_faligndata(TMP2, TMP4, REF_6);
2311 vis_src1(TMP2, REF_2);
2312 vis_src1(TMP4, REF_6);
2315 vis_and(TMP6, MASK_7f, TMP6);
2317 vis_and(TMP8, MASK_7f, TMP8);
2319 vis_padd16(TMP10, TMP6, TMP6);
2320 vis_st64(TMP6, dest[0]);
2322 vis_padd16(TMP12, TMP8, TMP8);
2323 vis_st64_2(TMP8, dest, 8);
2326 vis_xor(REF_0, REF_2, TMP6);
2328 vis_xor(REF_4, REF_6, TMP8);
2330 vis_and(TMP6, MASK_fe, TMP6);
2332 vis_mul8x16(CONST_128, TMP6, TMP6);
2333 vis_and(TMP8, MASK_fe, TMP8);
2335 vis_mul8x16(CONST_128, TMP8, TMP8);
2336 vis_and(REF_0, REF_2, TMP10);
2338 vis_and(REF_4, REF_6, TMP12);
2340 vis_alignaddr_g0((void *)off);
2342 vis_faligndata(TMP14, TMP16, REF_0);
2344 vis_faligndata(TMP16, TMP18, REF_4);
2347 vis_alignaddr_g0((void *)off_plus_1);
2348 vis_faligndata(TMP14, TMP16, REF_2);
2349 vis_faligndata(TMP16, TMP18, REF_6);
2351 vis_src1(TMP16, REF_2);
2352 vis_src1(TMP18, REF_6);
2355 vis_and(TMP6, MASK_7f, TMP6);
2357 vis_and(TMP8, MASK_7f, TMP8);
2359 vis_padd16(TMP10, TMP6, TMP6);
2360 vis_st64(TMP6, dest[0]);
2362 vis_padd16(TMP12, TMP8, TMP8);
2363 vis_st64_2(TMP8, dest, 8);
2367 vis_ld64(ref[0], TMP0);
2368 vis_xor(REF_0, REF_2, TMP6);
2370 vis_ld64_2(ref, 8, TMP2);
2371 vis_xor(REF_4, REF_6, TMP8);
2373 vis_ld64_2(ref, 16, TMP4);
2374 vis_and(TMP6, MASK_fe, TMP6);
2376 vis_mul8x16(CONST_128, TMP6, TMP6);
2377 vis_and(TMP8, MASK_fe, TMP8);
2379 vis_mul8x16(CONST_128, TMP8, TMP8);
2380 vis_and(REF_0, REF_2, TMP10);
2382 vis_and(REF_4, REF_6, TMP12);
2384 vis_alignaddr_g0((void *)off);
2386 vis_faligndata(TMP0, TMP2, REF_0);
2388 vis_faligndata(TMP2, TMP4, REF_4);
2391 vis_alignaddr_g0((void *)off_plus_1);
2392 vis_faligndata(TMP0, TMP2, REF_2);
2393 vis_faligndata(TMP2, TMP4, REF_6);
2395 vis_src1(TMP2, REF_2);
2396 vis_src1(TMP4, REF_6);
2399 vis_and(TMP6, MASK_7f, TMP6);
2401 vis_and(TMP8, MASK_7f, TMP8);
2403 vis_padd16(TMP10, TMP6, TMP6);
2404 vis_st64(TMP6, dest[0]);
2406 vis_padd16(TMP12, TMP8, TMP8);
2407 vis_st64_2(TMP8, dest, 8);
2410 vis_xor(REF_0, REF_2, TMP6);
2412 vis_xor(REF_4, REF_6, TMP8);
2414 vis_and(TMP6, MASK_fe, TMP6);
2416 vis_mul8x16(CONST_128, TMP6, TMP6);
2417 vis_and(TMP8, MASK_fe, TMP8);
2419 vis_mul8x16(CONST_128, TMP8, TMP8);
2420 vis_and(REF_0, REF_2, TMP10);
2422 vis_and(REF_4, REF_6, TMP12);
2424 vis_and(TMP6, MASK_7f, TMP6);
2426 vis_and(TMP8, MASK_7f, TMP8);
2428 vis_padd16(TMP10, TMP6, TMP6);
2429 vis_st64(TMP6, dest[0]);
2431 vis_padd16(TMP12, TMP8, TMP8);
2432 vis_st64_2(TMP8, dest, 8);
2435 static void MC_put_no_round_x_8_vis (uint8_t * dest, const uint8_t * ref,
2436 const ptrdiff_t stride, int height)
2438 unsigned long off = (unsigned long) ref & 0x7;
2439 unsigned long off_plus_1 = off + 1;
2441 ref = vis_alignaddr(ref);
2443 vis_ld64(ref[0], TMP0);
2445 vis_ld64(ref[8], TMP2);
2447 vis_ld64(constants_fe[0], MASK_fe);
2449 vis_ld64(constants_7f[0], MASK_7f);
2451 vis_ld64(constants128[0], CONST_128);
2452 vis_faligndata(TMP0, TMP2, REF_0);
2455 vis_alignaddr_g0((void *)off_plus_1);
2456 vis_faligndata(TMP0, TMP2, REF_2);
2458 vis_src1(TMP2, REF_2);
2462 height = (height >> 1) - 1;
2464 do { /* 20 cycles */
2465 vis_ld64(ref[0], TMP0);
2466 vis_xor(REF_0, REF_2, TMP4);
2468 vis_ld64_2(ref, 8, TMP2);
2469 vis_and(TMP4, MASK_fe, TMP4);
2472 vis_ld64(ref[0], TMP8);
2473 vis_and(REF_0, REF_2, TMP6);
2474 vis_mul8x16(CONST_128, TMP4, TMP4);
2476 vis_alignaddr_g0((void *)off);
2478 vis_ld64_2(ref, 8, TMP10);
2480 vis_faligndata(TMP0, TMP2, REF_0);
2483 vis_alignaddr_g0((void *)off_plus_1);
2484 vis_faligndata(TMP0, TMP2, REF_2);
2486 vis_src1(TMP2, REF_2);
2489 vis_and(TMP4, MASK_7f, TMP4);
2491 vis_padd16(TMP6, TMP4, DST_0);
2492 vis_st64(DST_0, dest[0]);
2495 vis_xor(REF_0, REF_2, TMP12);
2497 vis_and(TMP12, MASK_fe, TMP12);
2499 vis_and(REF_0, REF_2, TMP14);
2500 vis_mul8x16(CONST_128, TMP12, TMP12);
2502 vis_alignaddr_g0((void *)off);
2503 vis_faligndata(TMP8, TMP10, REF_0);
2505 vis_alignaddr_g0((void *)off_plus_1);
2506 vis_faligndata(TMP8, TMP10, REF_2);
2508 vis_src1(TMP10, REF_2);
2511 vis_and(TMP12, MASK_7f, TMP12);
2513 vis_padd16(TMP14, TMP12, DST_0);
2514 vis_st64(DST_0, dest[0]);
2518 vis_ld64(ref[0], TMP0);
2519 vis_xor(REF_0, REF_2, TMP4);
2521 vis_ld64_2(ref, 8, TMP2);
2522 vis_and(TMP4, MASK_fe, TMP4);
2524 vis_and(REF_0, REF_2, TMP6);
2525 vis_mul8x16(CONST_128, TMP4, TMP4);
2527 vis_alignaddr_g0((void *)off);
2529 vis_faligndata(TMP0, TMP2, REF_0);
2532 vis_alignaddr_g0((void *)off_plus_1);
2533 vis_faligndata(TMP0, TMP2, REF_2);
2535 vis_src1(TMP2, REF_2);
2538 vis_and(TMP4, MASK_7f, TMP4);
2540 vis_padd16(TMP6, TMP4, DST_0);
2541 vis_st64(DST_0, dest[0]);
2544 vis_xor(REF_0, REF_2, TMP12);
2546 vis_and(TMP12, MASK_fe, TMP12);
2548 vis_and(REF_0, REF_2, TMP14);
2549 vis_mul8x16(CONST_128, TMP12, TMP12);
2551 vis_and(TMP12, MASK_7f, TMP12);
2553 vis_padd16(TMP14, TMP12, DST_0);
2554 vis_st64(DST_0, dest[0]);
2558 static void MC_avg_no_round_x_16_vis (uint8_t * dest, const uint8_t * ref,
2559 const ptrdiff_t stride, int height)
2561 unsigned long off = (unsigned long) ref & 0x7;
2562 unsigned long off_plus_1 = off + 1;
2564 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
2566 vis_ld64(constants3[0], CONST_3);
2568 vis_ld64(constants256_512[0], CONST_256);
2570 ref = vis_alignaddr(ref);
2571 do { /* 26 cycles */
2572 vis_ld64(ref[0], TMP0);
2574 vis_ld64(ref[8], TMP2);
2576 vis_alignaddr_g0((void *)off);
2578 vis_ld64(ref[16], TMP4);
2580 vis_ld64(dest[0], DST_0);
2581 vis_faligndata(TMP0, TMP2, REF_0);
2583 vis_ld64(dest[8], DST_2);
2584 vis_faligndata(TMP2, TMP4, REF_4);
2587 vis_alignaddr_g0((void *)off_plus_1);
2588 vis_faligndata(TMP0, TMP2, REF_2);
2589 vis_faligndata(TMP2, TMP4, REF_6);
2591 vis_src1(TMP2, REF_2);
2592 vis_src1(TMP4, REF_6);
2595 vis_mul8x16au(REF_0, CONST_256, TMP0);
2597 vis_pmerge(ZERO, REF_2, TMP4);
2598 vis_mul8x16au(REF_0_1, CONST_256, TMP2);
2600 vis_pmerge(ZERO, REF_2_1, TMP6);
2602 vis_padd16(TMP0, TMP4, TMP0);
2604 vis_mul8x16al(DST_0, CONST_512, TMP4);
2605 vis_padd16(TMP2, TMP6, TMP2);
2607 vis_mul8x16al(DST_1, CONST_512, TMP6);
2609 vis_mul8x16au(REF_6, CONST_256, TMP12);
2611 vis_padd16(TMP0, TMP4, TMP0);
2612 vis_mul8x16au(REF_6_1, CONST_256, TMP14);
2614 vis_padd16(TMP2, TMP6, TMP2);
2615 vis_mul8x16au(REF_4, CONST_256, TMP16);
2617 vis_padd16(TMP0, CONST_3, TMP8);
2618 vis_mul8x16au(REF_4_1, CONST_256, TMP18);
2620 vis_padd16(TMP2, CONST_3, TMP10);
2621 vis_pack16(TMP8, DST_0);
2623 vis_pack16(TMP10, DST_1);
2624 vis_padd16(TMP16, TMP12, TMP0);
2626 vis_st64(DST_0, dest[0]);
2627 vis_mul8x16al(DST_2, CONST_512, TMP4);
2628 vis_padd16(TMP18, TMP14, TMP2);
2630 vis_mul8x16al(DST_3, CONST_512, TMP6);
2631 vis_padd16(TMP0, CONST_3, TMP0);
2633 vis_padd16(TMP2, CONST_3, TMP2);
2635 vis_padd16(TMP0, TMP4, TMP0);
2637 vis_padd16(TMP2, TMP6, TMP2);
2638 vis_pack16(TMP0, DST_2);
2640 vis_pack16(TMP2, DST_3);
2641 vis_st64(DST_2, dest[8]);
2648 static void MC_put_no_round_y_16_vis (uint8_t * dest, const uint8_t * ref,
2649 const ptrdiff_t stride, int height)
2651 ref = vis_alignaddr(ref);
2652 vis_ld64(ref[0], TMP0);
2654 vis_ld64_2(ref, 8, TMP2);
2656 vis_ld64_2(ref, 16, TMP4);
2659 vis_ld64(ref[0], TMP6);
2660 vis_faligndata(TMP0, TMP2, REF_0);
2662 vis_ld64_2(ref, 8, TMP8);
2663 vis_faligndata(TMP2, TMP4, REF_4);
2665 vis_ld64_2(ref, 16, TMP10);
2668 vis_ld64(constants_fe[0], MASK_fe);
2669 vis_faligndata(TMP6, TMP8, REF_2);
2671 vis_ld64(constants_7f[0], MASK_7f);
2672 vis_faligndata(TMP8, TMP10, REF_6);
2674 vis_ld64(constants128[0], CONST_128);
2675 height = (height >> 1) - 1;
2676 do { /* 24 cycles */
2677 vis_ld64(ref[0], TMP0);
2678 vis_xor(REF_0, REF_2, TMP12);
2680 vis_ld64_2(ref, 8, TMP2);
2681 vis_xor(REF_4, REF_6, TMP16);
2683 vis_ld64_2(ref, 16, TMP4);
2685 vis_and(REF_0, REF_2, TMP14);
2687 vis_ld64(ref[0], TMP6);
2688 vis_and(REF_4, REF_6, TMP18);
2690 vis_ld64_2(ref, 8, TMP8);
2691 vis_faligndata(TMP0, TMP2, REF_0);
2693 vis_ld64_2(ref, 16, TMP10);
2695 vis_faligndata(TMP2, TMP4, REF_4);
2697 vis_and(TMP12, MASK_fe, TMP12);
2699 vis_and(TMP16, MASK_fe, TMP16);
2700 vis_mul8x16(CONST_128, TMP12, TMP12);
2702 vis_mul8x16(CONST_128, TMP16, TMP16);
2703 vis_xor(REF_0, REF_2, TMP0);
2705 vis_xor(REF_4, REF_6, TMP2);
2707 vis_and(REF_0, REF_2, TMP20);
2709 vis_and(TMP12, MASK_7f, TMP12);
2711 vis_and(TMP16, MASK_7f, TMP16);
2713 vis_padd16(TMP14, TMP12, TMP12);
2714 vis_st64(TMP12, dest[0]);
2716 vis_padd16(TMP18, TMP16, TMP16);
2717 vis_st64_2(TMP16, dest, 8);
2720 vis_and(REF_4, REF_6, TMP18);
2722 vis_and(TMP0, MASK_fe, TMP0);
2724 vis_and(TMP2, MASK_fe, TMP2);
2725 vis_mul8x16(CONST_128, TMP0, TMP0);
2727 vis_faligndata(TMP6, TMP8, REF_2);
2728 vis_mul8x16(CONST_128, TMP2, TMP2);
2730 vis_faligndata(TMP8, TMP10, REF_6);
2732 vis_and(TMP0, MASK_7f, TMP0);
2734 vis_and(TMP2, MASK_7f, TMP2);
2736 vis_padd16(TMP20, TMP0, TMP0);
2737 vis_st64(TMP0, dest[0]);
2739 vis_padd16(TMP18, TMP2, TMP2);
2740 vis_st64_2(TMP2, dest, 8);
2744 vis_ld64(ref[0], TMP0);
2745 vis_xor(REF_0, REF_2, TMP12);
2747 vis_ld64_2(ref, 8, TMP2);
2748 vis_xor(REF_4, REF_6, TMP16);
2750 vis_ld64_2(ref, 16, TMP4);
2751 vis_and(REF_0, REF_2, TMP14);
2753 vis_and(REF_4, REF_6, TMP18);
2755 vis_faligndata(TMP0, TMP2, REF_0);
2757 vis_faligndata(TMP2, TMP4, REF_4);
2759 vis_and(TMP12, MASK_fe, TMP12);
2761 vis_and(TMP16, MASK_fe, TMP16);
2762 vis_mul8x16(CONST_128, TMP12, TMP12);
2764 vis_mul8x16(CONST_128, TMP16, TMP16);
2765 vis_xor(REF_0, REF_2, TMP0);
2767 vis_xor(REF_4, REF_6, TMP2);
2769 vis_and(REF_0, REF_2, TMP20);
2771 vis_and(TMP12, MASK_7f, TMP12);
2773 vis_and(TMP16, MASK_7f, TMP16);
2775 vis_padd16(TMP14, TMP12, TMP12);
2776 vis_st64(TMP12, dest[0]);
2778 vis_padd16(TMP18, TMP16, TMP16);
2779 vis_st64_2(TMP16, dest, 8);
2782 vis_and(REF_4, REF_6, TMP18);
2784 vis_and(TMP0, MASK_fe, TMP0);
2786 vis_and(TMP2, MASK_fe, TMP2);
2787 vis_mul8x16(CONST_128, TMP0, TMP0);
2789 vis_mul8x16(CONST_128, TMP2, TMP2);
2791 vis_and(TMP0, MASK_7f, TMP0);
2793 vis_and(TMP2, MASK_7f, TMP2);
2795 vis_padd16(TMP20, TMP0, TMP0);
2796 vis_st64(TMP0, dest[0]);
2798 vis_padd16(TMP18, TMP2, TMP2);
2799 vis_st64_2(TMP2, dest, 8);
2802 static void MC_put_no_round_y_8_vis (uint8_t * dest, const uint8_t * ref,
2803 const ptrdiff_t stride, int height)
2805 ref = vis_alignaddr(ref);
2806 vis_ld64(ref[0], TMP0);
2808 vis_ld64_2(ref, 8, TMP2);
2811 vis_ld64(ref[0], TMP4);
2813 vis_ld64_2(ref, 8, TMP6);
2816 vis_ld64(constants_fe[0], MASK_fe);
2817 vis_faligndata(TMP0, TMP2, REF_0);
2819 vis_ld64(constants_7f[0], MASK_7f);
2820 vis_faligndata(TMP4, TMP6, REF_2);
2822 vis_ld64(constants128[0], CONST_128);
2823 height = (height >> 1) - 1;
2824 do { /* 12 cycles */
2825 vis_ld64(ref[0], TMP0);
2826 vis_xor(REF_0, REF_2, TMP4);
2828 vis_ld64_2(ref, 8, TMP2);
2830 vis_and(TMP4, MASK_fe, TMP4);
2832 vis_and(REF_0, REF_2, TMP6);
2833 vis_mul8x16(CONST_128, TMP4, TMP4);
2835 vis_faligndata(TMP0, TMP2, REF_0);
2836 vis_ld64(ref[0], TMP0);
2838 vis_ld64_2(ref, 8, TMP2);
2840 vis_xor(REF_0, REF_2, TMP12);
2842 vis_and(TMP4, MASK_7f, TMP4);
2844 vis_and(TMP12, MASK_fe, TMP12);
2846 vis_mul8x16(CONST_128, TMP12, TMP12);
2847 vis_and(REF_0, REF_2, TMP14);
2849 vis_padd16(TMP6, TMP4, DST_0);
2850 vis_st64(DST_0, dest[0]);
2853 vis_faligndata(TMP0, TMP2, REF_2);
2855 vis_and(TMP12, MASK_7f, TMP12);
2857 vis_padd16(TMP14, TMP12, DST_0);
2858 vis_st64(DST_0, dest[0]);
2862 vis_ld64(ref[0], TMP0);
2863 vis_xor(REF_0, REF_2, TMP4);
2865 vis_ld64_2(ref, 8, TMP2);
2866 vis_and(TMP4, MASK_fe, TMP4);
2868 vis_and(REF_0, REF_2, TMP6);
2869 vis_mul8x16(CONST_128, TMP4, TMP4);
2871 vis_faligndata(TMP0, TMP2, REF_0);
2873 vis_xor(REF_0, REF_2, TMP12);
2875 vis_and(TMP4, MASK_7f, TMP4);
2877 vis_and(TMP12, MASK_fe, TMP12);
2879 vis_mul8x16(CONST_128, TMP12, TMP12);
2880 vis_and(REF_0, REF_2, TMP14);
2882 vis_padd16(TMP6, TMP4, DST_0);
2883 vis_st64(DST_0, dest[0]);
2886 vis_and(TMP12, MASK_7f, TMP12);
2888 vis_padd16(TMP14, TMP12, DST_0);
2889 vis_st64(DST_0, dest[0]);
2892 static void MC_avg_no_round_y_16_vis (uint8_t * dest, const uint8_t * ref,
2893 const ptrdiff_t stride, int height)
2895 int stride_8 = stride + 8;
2896 int stride_16 = stride + 16;
2898 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
2900 ref = vis_alignaddr(ref);
2902 vis_ld64(ref[ 0], TMP0);
2905 vis_ld64(ref[ 8], TMP2);
2907 vis_ld64(ref[16], TMP4);
2909 vis_ld64(constants3[0], CONST_3);
2910 vis_faligndata(TMP0, TMP2, REF_2);
2912 vis_ld64(constants256_512[0], CONST_256);
2913 vis_faligndata(TMP2, TMP4, REF_6);
2916 do { /* 31 cycles */
2917 vis_ld64_2(ref, stride, TMP0);
2918 vis_pmerge(ZERO, REF_2, TMP12);
2919 vis_mul8x16au(REF_2_1, CONST_256, TMP14);
2921 vis_ld64_2(ref, stride_8, TMP2);
2922 vis_pmerge(ZERO, REF_6, TMP16);
2923 vis_mul8x16au(REF_6_1, CONST_256, TMP18);
2925 vis_ld64_2(ref, stride_16, TMP4);
2928 vis_ld64(dest[0], DST_0);
2929 vis_faligndata(TMP0, TMP2, REF_0);
2931 vis_ld64_2(dest, 8, DST_2);
2932 vis_faligndata(TMP2, TMP4, REF_4);
2934 vis_ld64_2(ref, stride, TMP6);
2935 vis_pmerge(ZERO, REF_0, TMP0);
2936 vis_mul8x16au(REF_0_1, CONST_256, TMP2);
2938 vis_ld64_2(ref, stride_8, TMP8);
2939 vis_pmerge(ZERO, REF_4, TMP4);
2941 vis_ld64_2(ref, stride_16, TMP10);
2944 vis_ld64_2(dest, stride, REF_S0/*DST_4*/);
2945 vis_faligndata(TMP6, TMP8, REF_2);
2946 vis_mul8x16au(REF_4_1, CONST_256, TMP6);
2948 vis_ld64_2(dest, stride_8, REF_S2/*DST_6*/);
2949 vis_faligndata(TMP8, TMP10, REF_6);
2950 vis_mul8x16al(DST_0, CONST_512, TMP20);
2952 vis_padd16(TMP0, CONST_3, TMP0);
2953 vis_mul8x16al(DST_1, CONST_512, TMP22);
2955 vis_padd16(TMP2, CONST_3, TMP2);
2956 vis_mul8x16al(DST_2, CONST_512, TMP24);
2958 vis_padd16(TMP4, CONST_3, TMP4);
2959 vis_mul8x16al(DST_3, CONST_512, TMP26);
2961 vis_padd16(TMP6, CONST_3, TMP6);
2963 vis_padd16(TMP12, TMP20, TMP12);
2964 vis_mul8x16al(REF_S0, CONST_512, TMP20);
2966 vis_padd16(TMP14, TMP22, TMP14);
2967 vis_mul8x16al(REF_S0_1, CONST_512, TMP22);
2969 vis_padd16(TMP16, TMP24, TMP16);
2970 vis_mul8x16al(REF_S2, CONST_512, TMP24);
2972 vis_padd16(TMP18, TMP26, TMP18);
2973 vis_mul8x16al(REF_S2_1, CONST_512, TMP26);
2975 vis_padd16(TMP12, TMP0, TMP12);
2976 vis_mul8x16au(REF_2, CONST_256, TMP28);
2978 vis_padd16(TMP14, TMP2, TMP14);
2979 vis_mul8x16au(REF_2_1, CONST_256, TMP30);
2981 vis_padd16(TMP16, TMP4, TMP16);
2982 vis_mul8x16au(REF_6, CONST_256, REF_S4);
2984 vis_padd16(TMP18, TMP6, TMP18);
2985 vis_mul8x16au(REF_6_1, CONST_256, REF_S6);
2987 vis_pack16(TMP12, DST_0);
2988 vis_padd16(TMP28, TMP0, TMP12);
2990 vis_pack16(TMP14, DST_1);
2991 vis_st64(DST_0, dest[0]);
2992 vis_padd16(TMP30, TMP2, TMP14);
2994 vis_pack16(TMP16, DST_2);
2995 vis_padd16(REF_S4, TMP4, TMP16);
2997 vis_pack16(TMP18, DST_3);
2998 vis_st64_2(DST_2, dest, 8);
3000 vis_padd16(REF_S6, TMP6, TMP18);
3002 vis_padd16(TMP12, TMP20, TMP12);
3004 vis_padd16(TMP14, TMP22, TMP14);
3005 vis_pack16(TMP12, DST_0);
3007 vis_padd16(TMP16, TMP24, TMP16);
3008 vis_pack16(TMP14, DST_1);
3009 vis_st64(DST_0, dest[0]);
3011 vis_padd16(TMP18, TMP26, TMP18);
3012 vis_pack16(TMP16, DST_2);
3014 vis_pack16(TMP18, DST_3);
3015 vis_st64_2(DST_2, dest, 8);
3020 static void MC_put_no_round_xy_16_vis (uint8_t * dest, const uint8_t * ref,
3021 const ptrdiff_t stride, int height)
3023 unsigned long off = (unsigned long) ref & 0x7;
3024 unsigned long off_plus_1 = off + 1;
3025 int stride_8 = stride + 8;
3026 int stride_16 = stride + 16;
3028 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
3030 ref = vis_alignaddr(ref);
3032 vis_ld64(ref[ 0], TMP0);
3035 vis_ld64(ref[ 8], TMP2);
3037 vis_ld64(ref[16], TMP4);
3039 vis_ld64(constants1[0], CONST_1);
3040 vis_faligndata(TMP0, TMP2, REF_S0);
3042 vis_ld64(constants256_512[0], CONST_256);
3043 vis_faligndata(TMP2, TMP4, REF_S4);
3046 vis_alignaddr_g0((void *)off_plus_1);
3047 vis_faligndata(TMP0, TMP2, REF_S2);
3048 vis_faligndata(TMP2, TMP4, REF_S6);
3050 vis_src1(TMP2, REF_S2);
3051 vis_src1(TMP4, REF_S6);
3056 vis_ld64_2(ref, stride, TMP0);
3057 vis_mul8x16au(REF_S0, CONST_256, TMP12);
3058 vis_pmerge(ZERO, REF_S0_1, TMP14);
3060 vis_alignaddr_g0((void *)off);
3062 vis_ld64_2(ref, stride_8, TMP2);
3063 vis_mul8x16au(REF_S2, CONST_256, TMP16);
3064 vis_pmerge(ZERO, REF_S2_1, TMP18);
3066 vis_ld64_2(ref, stride_16, TMP4);
3068 vis_mul8x16au(REF_S4, CONST_256, TMP20);
3069 vis_pmerge(ZERO, REF_S4_1, TMP22);
3071 vis_ld64_2(ref, stride, TMP6);
3072 vis_mul8x16au(REF_S6, CONST_256, TMP24);
3073 vis_pmerge(ZERO, REF_S6_1, TMP26);
3075 vis_ld64_2(ref, stride_8, TMP8);
3076 vis_faligndata(TMP0, TMP2, REF_0);
3078 vis_ld64_2(ref, stride_16, TMP10);
3080 vis_faligndata(TMP2, TMP4, REF_4);
3082 vis_faligndata(TMP6, TMP8, REF_S0);
3084 vis_faligndata(TMP8, TMP10, REF_S4);
3087 vis_alignaddr_g0((void *)off_plus_1);
3088 vis_faligndata(TMP0, TMP2, REF_2);
3089 vis_faligndata(TMP2, TMP4, REF_6);
3090 vis_faligndata(TMP6, TMP8, REF_S2);
3091 vis_faligndata(TMP8, TMP10, REF_S6);
3093 vis_src1(TMP2, REF_2);
3094 vis_src1(TMP4, REF_6);
3095 vis_src1(TMP8, REF_S2);
3096 vis_src1(TMP10, REF_S6);
3099 vis_mul8x16au(REF_0, CONST_256, TMP0);
3100 vis_pmerge(ZERO, REF_0_1, TMP2);
3102 vis_mul8x16au(REF_2, CONST_256, TMP4);
3103 vis_pmerge(ZERO, REF_2_1, TMP6);
3105 vis_padd16(TMP0, CONST_2, TMP8);
3106 vis_mul8x16au(REF_4, CONST_256, TMP0);
3108 vis_padd16(TMP2, CONST_1, TMP10);
3109 vis_mul8x16au(REF_4_1, CONST_256, TMP2);
3111 vis_padd16(TMP8, TMP4, TMP8);
3112 vis_mul8x16au(REF_6, CONST_256, TMP4);
3114 vis_padd16(TMP10, TMP6, TMP10);
3115 vis_mul8x16au(REF_6_1, CONST_256, TMP6);
3117 vis_padd16(TMP12, TMP8, TMP12);
3119 vis_padd16(TMP14, TMP10, TMP14);
3121 vis_padd16(TMP12, TMP16, TMP12);
3123 vis_padd16(TMP14, TMP18, TMP14);
3124 vis_pack16(TMP12, DST_0);
3126 vis_pack16(TMP14, DST_1);
3127 vis_st64(DST_0, dest[0]);
3128 vis_padd16(TMP0, CONST_1, TMP12);
3130 vis_mul8x16au(REF_S0, CONST_256, TMP0);
3131 vis_padd16(TMP2, CONST_1, TMP14);
3133 vis_mul8x16au(REF_S0_1, CONST_256, TMP2);
3134 vis_padd16(TMP12, TMP4, TMP12);
3136 vis_mul8x16au(REF_S2, CONST_256, TMP4);
3137 vis_padd16(TMP14, TMP6, TMP14);
3139 vis_mul8x16au(REF_S2_1, CONST_256, TMP6);
3140 vis_padd16(TMP20, TMP12, TMP20);
3142 vis_padd16(TMP22, TMP14, TMP22);
3144 vis_padd16(TMP20, TMP24, TMP20);
3146 vis_padd16(TMP22, TMP26, TMP22);
3147 vis_pack16(TMP20, DST_2);
3149 vis_pack16(TMP22, DST_3);
3150 vis_st64_2(DST_2, dest, 8);
3152 vis_padd16(TMP0, TMP4, TMP24);
3154 vis_mul8x16au(REF_S4, CONST_256, TMP0);
3155 vis_padd16(TMP2, TMP6, TMP26);
3157 vis_mul8x16au(REF_S4_1, CONST_256, TMP2);
3158 vis_padd16(TMP24, TMP8, TMP24);
3160 vis_padd16(TMP26, TMP10, TMP26);
3161 vis_pack16(TMP24, DST_0);
3163 vis_pack16(TMP26, DST_1);
3164 vis_st64(DST_0, dest[0]);
3165 vis_pmerge(ZERO, REF_S6, TMP4);
3167 vis_pmerge(ZERO, REF_S6_1, TMP6);
3169 vis_padd16(TMP0, TMP4, TMP0);
3171 vis_padd16(TMP2, TMP6, TMP2);
3173 vis_padd16(TMP0, TMP12, TMP0);
3175 vis_padd16(TMP2, TMP14, TMP2);
3176 vis_pack16(TMP0, DST_2);
3178 vis_pack16(TMP2, DST_3);
3179 vis_st64_2(DST_2, dest, 8);
3184 static void MC_put_no_round_xy_8_vis (uint8_t * dest, const uint8_t * ref,
3185 const ptrdiff_t stride, int height)
3187 unsigned long off = (unsigned long) ref & 0x7;
3188 unsigned long off_plus_1 = off + 1;
3189 int stride_8 = stride + 8;
3191 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
3193 ref = vis_alignaddr(ref);
3195 vis_ld64(ref[ 0], TMP0);
3198 vis_ld64(ref[ 8], TMP2);
3200 vis_ld64(constants1[0], CONST_1);
3202 vis_ld64(constants256_512[0], CONST_256);
3203 vis_faligndata(TMP0, TMP2, REF_S0);
3206 vis_alignaddr_g0((void *)off_plus_1);
3207 vis_faligndata(TMP0, TMP2, REF_S2);
3209 vis_src1(TMP2, REF_S2);
3213 do { /* 26 cycles */
3214 vis_ld64_2(ref, stride, TMP0);
3215 vis_mul8x16au(REF_S0, CONST_256, TMP8);
3216 vis_pmerge(ZERO, REF_S2, TMP12);
3218 vis_alignaddr_g0((void *)off);
3220 vis_ld64_2(ref, stride_8, TMP2);
3222 vis_mul8x16au(REF_S0_1, CONST_256, TMP10);
3223 vis_pmerge(ZERO, REF_S2_1, TMP14);
3225 vis_ld64_2(ref, stride, TMP4);
3227 vis_ld64_2(ref, stride_8, TMP6);
3229 vis_faligndata(TMP0, TMP2, REF_S4);
3231 vis_pmerge(ZERO, REF_S4, TMP18);
3233 vis_pmerge(ZERO, REF_S4_1, TMP20);
3235 vis_faligndata(TMP4, TMP6, REF_S0);
3238 vis_alignaddr_g0((void *)off_plus_1);
3239 vis_faligndata(TMP0, TMP2, REF_S6);
3240 vis_faligndata(TMP4, TMP6, REF_S2);
3242 vis_src1(TMP2, REF_S6);
3243 vis_src1(TMP6, REF_S2);
3246 vis_padd16(TMP18, CONST_1, TMP18);
3247 vis_mul8x16au(REF_S6, CONST_256, TMP22);
3249 vis_padd16(TMP20, CONST_1, TMP20);
3250 vis_mul8x16au(REF_S6_1, CONST_256, TMP24);
3252 vis_mul8x16au(REF_S0, CONST_256, TMP26);
3253 vis_pmerge(ZERO, REF_S0_1, TMP28);
3255 vis_mul8x16au(REF_S2, CONST_256, TMP30);
3256 vis_padd16(TMP18, TMP22, TMP18);
3258 vis_mul8x16au(REF_S2_1, CONST_256, TMP32);
3259 vis_padd16(TMP20, TMP24, TMP20);
3261 vis_padd16(TMP8, TMP18, TMP8);
3263 vis_padd16(TMP10, TMP20, TMP10);
3265 vis_padd16(TMP8, TMP12, TMP8);
3267 vis_padd16(TMP10, TMP14, TMP10);
3268 vis_pack16(TMP8, DST_0);
3270 vis_pack16(TMP10, DST_1);
3271 vis_st64(DST_0, dest[0]);
3273 vis_padd16(TMP18, TMP26, TMP18);
3275 vis_padd16(TMP20, TMP28, TMP20);
3277 vis_padd16(TMP18, TMP30, TMP18);
3279 vis_padd16(TMP20, TMP32, TMP20);
3280 vis_pack16(TMP18, DST_2);
3282 vis_pack16(TMP20, DST_3);
3283 vis_st64(DST_2, dest[0]);
3288 static void MC_avg_no_round_xy_16_vis (uint8_t * dest, const uint8_t * ref,
3289 const ptrdiff_t stride, int height)
3291 unsigned long off = (unsigned long) ref & 0x7;
3292 unsigned long off_plus_1 = off + 1;
3293 int stride_8 = stride + 8;
3294 int stride_16 = stride + 16;
3296 vis_set_gsr(4 << VIS_GSR_SCALEFACT_SHIFT);
3298 ref = vis_alignaddr(ref);
3300 vis_ld64(ref[ 0], TMP0);
3303 vis_ld64(ref[ 8], TMP2);
3305 vis_ld64(ref[16], TMP4);
3307 vis_ld64(constants6[0], CONST_6);
3308 vis_faligndata(TMP0, TMP2, REF_S0);
3310 vis_ld64(constants256_1024[0], CONST_256);
3311 vis_faligndata(TMP2, TMP4, REF_S4);
3314 vis_alignaddr_g0((void *)off_plus_1);
3315 vis_faligndata(TMP0, TMP2, REF_S2);
3316 vis_faligndata(TMP2, TMP4, REF_S6);
3318 vis_src1(TMP2, REF_S2);
3319 vis_src1(TMP4, REF_S6);
3323 do { /* 55 cycles */
3324 vis_ld64_2(ref, stride, TMP0);
3325 vis_mul8x16au(REF_S0, CONST_256, TMP12);
3326 vis_pmerge(ZERO, REF_S0_1, TMP14);
3328 vis_alignaddr_g0((void *)off);
3330 vis_ld64_2(ref, stride_8, TMP2);
3331 vis_mul8x16au(REF_S2, CONST_256, TMP16);
3332 vis_pmerge(ZERO, REF_S2_1, TMP18);
3334 vis_ld64_2(ref, stride_16, TMP4);
3336 vis_mul8x16au(REF_S4, CONST_256, TMP20);
3337 vis_pmerge(ZERO, REF_S4_1, TMP22);
3339 vis_ld64_2(ref, stride, TMP6);
3340 vis_mul8x16au(REF_S6, CONST_256, TMP24);
3341 vis_pmerge(ZERO, REF_S6_1, TMP26);
3343 vis_ld64_2(ref, stride_8, TMP8);
3344 vis_faligndata(TMP0, TMP2, REF_0);
3346 vis_ld64_2(ref, stride_16, TMP10);
3348 vis_faligndata(TMP2, TMP4, REF_4);
3350 vis_ld64(dest[0], DST_0);
3351 vis_faligndata(TMP6, TMP8, REF_S0);
3353 vis_ld64_2(dest, 8, DST_2);
3354 vis_faligndata(TMP8, TMP10, REF_S4);
3357 vis_alignaddr_g0((void *)off_plus_1);
3358 vis_faligndata(TMP0, TMP2, REF_2);
3359 vis_faligndata(TMP2, TMP4, REF_6);
3360 vis_faligndata(TMP6, TMP8, REF_S2);
3361 vis_faligndata(TMP8, TMP10, REF_S6);
3363 vis_src1(TMP2, REF_2);
3364 vis_src1(TMP4, REF_6);
3365 vis_src1(TMP8, REF_S2);
3366 vis_src1(TMP10, REF_S6);
3369 vis_mul8x16al(DST_0, CONST_1024, TMP30);
3370 vis_pmerge(ZERO, REF_0, TMP0);
3372 vis_mul8x16al(DST_1, CONST_1024, TMP32);
3373 vis_pmerge(ZERO, REF_0_1, TMP2);
3375 vis_mul8x16au(REF_2, CONST_256, TMP4);
3376 vis_pmerge(ZERO, REF_2_1, TMP6);
3378 vis_mul8x16al(DST_2, CONST_1024, REF_0);
3379 vis_padd16(TMP0, CONST_6, TMP0);
3381 vis_mul8x16al(DST_3, CONST_1024, REF_2);
3382 vis_padd16(TMP2, CONST_6, TMP2);
3384 vis_padd16(TMP0, TMP4, TMP0);
3385 vis_mul8x16au(REF_4, CONST_256, TMP4);
3387 vis_padd16(TMP2, TMP6, TMP2);
3388 vis_mul8x16au(REF_4_1, CONST_256, TMP6);
3390 vis_padd16(TMP12, TMP0, TMP12);
3391 vis_mul8x16au(REF_6, CONST_256, TMP8);
3393 vis_padd16(TMP14, TMP2, TMP14);
3394 vis_mul8x16au(REF_6_1, CONST_256, TMP10);
3396 vis_padd16(TMP12, TMP16, TMP12);
3397 vis_mul8x16au(REF_S0, CONST_256, REF_4);
3399 vis_padd16(TMP14, TMP18, TMP14);
3400 vis_mul8x16au(REF_S0_1, CONST_256, REF_6);
3402 vis_padd16(TMP12, TMP30, TMP12);
3404 vis_padd16(TMP14, TMP32, TMP14);
3405 vis_pack16(TMP12, DST_0);
3407 vis_pack16(TMP14, DST_1);
3408 vis_st64(DST_0, dest[0]);
3409 vis_padd16(TMP4, CONST_6, TMP4);
3411 vis_ld64_2(dest, stride, DST_0);
3412 vis_padd16(TMP6, CONST_6, TMP6);
3413 vis_mul8x16au(REF_S2, CONST_256, TMP12);
3415 vis_padd16(TMP4, TMP8, TMP4);
3416 vis_mul8x16au(REF_S2_1, CONST_256, TMP14);
3418 vis_padd16(TMP6, TMP10, TMP6);
3420 vis_padd16(TMP20, TMP4, TMP20);
3422 vis_padd16(TMP22, TMP6, TMP22);
3424 vis_padd16(TMP20, TMP24, TMP20);
3426 vis_padd16(TMP22, TMP26, TMP22);
3428 vis_padd16(TMP20, REF_0, TMP20);
3429 vis_mul8x16au(REF_S4, CONST_256, REF_0);
3431 vis_padd16(TMP22, REF_2, TMP22);
3432 vis_pack16(TMP20, DST_2);
3434 vis_pack16(TMP22, DST_3);
3435 vis_st64_2(DST_2, dest, 8);
3438 vis_ld64_2(dest, 8, DST_2);
3439 vis_mul8x16al(DST_0, CONST_1024, TMP30);
3440 vis_pmerge(ZERO, REF_S4_1, REF_2);
3442 vis_mul8x16al(DST_1, CONST_1024, TMP32);
3443 vis_padd16(REF_4, TMP0, TMP8);
3445 vis_mul8x16au(REF_S6, CONST_256, REF_4);
3446 vis_padd16(REF_6, TMP2, TMP10);
3448 vis_mul8x16au(REF_S6_1, CONST_256, REF_6);
3449 vis_padd16(TMP8, TMP12, TMP8);
3451 vis_padd16(TMP10, TMP14, TMP10);
3453 vis_padd16(TMP8, TMP30, TMP8);
3455 vis_padd16(TMP10, TMP32, TMP10);
3456 vis_pack16(TMP8, DST_0);
3458 vis_pack16(TMP10, DST_1);
3459 vis_st64(DST_0, dest[0]);
3461 vis_padd16(REF_0, TMP4, REF_0);
3463 vis_mul8x16al(DST_2, CONST_1024, TMP30);
3464 vis_padd16(REF_2, TMP6, REF_2);
3466 vis_mul8x16al(DST_3, CONST_1024, TMP32);
3467 vis_padd16(REF_0, REF_4, REF_0);
3469 vis_padd16(REF_2, REF_6, REF_2);
3471 vis_padd16(REF_0, TMP30, REF_0);
3475 vis_padd16(REF_2, TMP32, REF_2);
3476 vis_pack16(REF_0, DST_2);
3478 vis_pack16(REF_2, DST_3);
3479 vis_st64_2(DST_2, dest, 8);
3484 /* End of no rounding code */
3486 #define ACCEL_SPARC_VIS 1
3487 #define ACCEL_SPARC_VIS2 2
3489 static int vis_level(void)
3492 accel |= ACCEL_SPARC_VIS;
3493 accel |= ACCEL_SPARC_VIS2;
3497 /* libavcodec initialization code */
3498 av_cold void ff_dsputil_init_vis(DSPContext *c, AVCodecContext *avctx)
3500 /* VIS-specific optimizations */
3501 int accel = vis_level ();
3502 const int high_bit_depth = avctx->bits_per_raw_sample > 8;
3504 if (accel & ACCEL_SPARC_VIS) {
3505 if (avctx->bits_per_raw_sample <= 8 &&
3506 avctx->idct_algo == FF_IDCT_SIMPLEVIS) {
3507 c->idct_put = ff_simple_idct_put_vis;
3508 c->idct_add = ff_simple_idct_add_vis;
3509 c->idct = ff_simple_idct_vis;
3510 c->idct_permutation_type = FF_TRANSPOSE_IDCT_PERM;
3513 if (!high_bit_depth) {
3514 c->put_pixels_tab[0][0] = MC_put_o_16_vis;
3515 c->put_pixels_tab[0][1] = MC_put_x_16_vis;
3516 c->put_pixels_tab[0][2] = MC_put_y_16_vis;
3517 c->put_pixels_tab[0][3] = MC_put_xy_16_vis;
3519 c->put_pixels_tab[1][0] = MC_put_o_8_vis;
3520 c->put_pixels_tab[1][1] = MC_put_x_8_vis;
3521 c->put_pixels_tab[1][2] = MC_put_y_8_vis;
3522 c->put_pixels_tab[1][3] = MC_put_xy_8_vis;
3524 c->avg_pixels_tab[0][0] = MC_avg_o_16_vis;
3525 c->avg_pixels_tab[0][1] = MC_avg_x_16_vis;
3526 c->avg_pixels_tab[0][2] = MC_avg_y_16_vis;
3527 c->avg_pixels_tab[0][3] = MC_avg_xy_16_vis;
3529 c->avg_pixels_tab[1][0] = MC_avg_o_8_vis;
3530 c->avg_pixels_tab[1][1] = MC_avg_x_8_vis;
3531 c->avg_pixels_tab[1][2] = MC_avg_y_8_vis;
3532 c->avg_pixels_tab[1][3] = MC_avg_xy_8_vis;
3534 c->put_no_rnd_pixels_tab[0][0] = MC_put_no_round_o_16_vis;
3535 c->put_no_rnd_pixels_tab[0][1] = MC_put_no_round_x_16_vis;
3536 c->put_no_rnd_pixels_tab[0][2] = MC_put_no_round_y_16_vis;
3537 c->put_no_rnd_pixels_tab[0][3] = MC_put_no_round_xy_16_vis;
3539 c->put_no_rnd_pixels_tab[1][0] = MC_put_no_round_o_8_vis;
3540 c->put_no_rnd_pixels_tab[1][1] = MC_put_no_round_x_8_vis;
3541 c->put_no_rnd_pixels_tab[1][2] = MC_put_no_round_y_8_vis;
3542 c->put_no_rnd_pixels_tab[1][3] = MC_put_no_round_xy_8_vis;
3544 c->avg_no_rnd_pixels_tab[0] = MC_avg_no_round_o_16_vis;
3545 c->avg_no_rnd_pixels_tab[1] = MC_avg_no_round_x_16_vis;
3546 c->avg_no_rnd_pixels_tab[2] = MC_avg_no_round_y_16_vis;
3547 c->avg_no_rnd_pixels_tab[3] = MC_avg_no_round_xy_16_vis;