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 ffmpeg by James A. Morrison.
29 #include "libavcodec/dsputil.h"
33 void ff_simple_idct_put_vis(uint8_t *dest, int line_size, DCTELEM *data);
34 void ff_simple_idct_add_vis(uint8_t *dest, int line_size, DCTELEM *data);
35 void ff_simple_idct_vis(DCTELEM *data);
37 /* The trick used in some of this file is the formula from the MMX
38 * motion comp code, which is:
40 * (x+y+1)>>1 == (x|y)-((x^y)>>1)
42 * This allows us to average 8 bytes at a time in a 64-bit FPU reg.
43 * We avoid overflows by masking before we do the shift, and we
44 * implement the shift by multiplying by 1/2 using mul8x16. So in
45 * VIS this is (assume 'x' is in f0, 'y' is in f2, a repeating mask
46 * of '0xfe' is in f4, a repeating mask of '0x7f' is in f6, and
47 * the value 0x80808080 is in f8):
51 * fmul8x16 f8, f10, f10
54 * fpsub16 f12, f10, f10
57 #define ATTR_ALIGN(alignd) __attribute__ ((aligned(alignd)))
59 #define DUP4(x) {x, x, x, x}
60 #define DUP8(x) {x, x, x, x, x, x, x, x}
61 static const int16_t constants1[] ATTR_ALIGN(8) = DUP4 (1);
62 static const int16_t constants2[] ATTR_ALIGN(8) = DUP4 (2);
63 static const int16_t constants3[] ATTR_ALIGN(8) = DUP4 (3);
64 static const int16_t constants6[] ATTR_ALIGN(8) = DUP4 (6);
65 static const int8_t constants_fe[] ATTR_ALIGN(8) = DUP8 (0xfe);
66 static const int8_t constants_7f[] ATTR_ALIGN(8) = DUP8 (0x7f);
67 static const int8_t constants128[] ATTR_ALIGN(8) = DUP8 (128);
68 static const int16_t constants256_512[] ATTR_ALIGN(8) =
70 static const int16_t constants256_1024[] ATTR_ALIGN(8) =
71 {256, 1024, 256, 1024};
101 #define CONST_1024 22
126 static void MC_put_o_16_vis (uint8_t * dest, const uint8_t * _ref,
127 const int stride, int height)
129 uint8_t *ref = (uint8_t *) _ref;
131 ref = vis_alignaddr(ref);
133 vis_ld64(ref[0], TMP0);
135 vis_ld64_2(ref, 8, TMP2);
137 vis_ld64_2(ref, 16, TMP4);
140 vis_faligndata(TMP0, TMP2, REF_0);
141 vis_st64(REF_0, dest[0]);
143 vis_faligndata(TMP2, TMP4, REF_2);
144 vis_st64_2(REF_2, dest, 8);
149 static void MC_put_o_8_vis (uint8_t * dest, const uint8_t * _ref,
150 const int stride, int height)
152 uint8_t *ref = (uint8_t *) _ref;
154 ref = vis_alignaddr(ref);
156 vis_ld64(ref[0], TMP0);
158 vis_ld64(ref[8], TMP2);
163 vis_faligndata(TMP0, TMP2, REF_0);
164 vis_st64(REF_0, dest[0]);
170 static void MC_avg_o_16_vis (uint8_t * dest, const uint8_t * _ref,
171 const int stride, int height)
173 uint8_t *ref = (uint8_t *) _ref;
174 int stride_8 = stride + 8;
176 ref = vis_alignaddr(ref);
178 vis_ld64(ref[0], TMP0);
180 vis_ld64(ref[8], TMP2);
182 vis_ld64(ref[16], TMP4);
184 vis_ld64(dest[0], DST_0);
186 vis_ld64(dest[8], DST_2);
188 vis_ld64(constants_fe[0], MASK_fe);
189 vis_faligndata(TMP0, TMP2, REF_0);
191 vis_ld64(constants_7f[0], MASK_7f);
192 vis_faligndata(TMP2, TMP4, REF_2);
194 vis_ld64(constants128[0], CONST_128);
197 height = (height >> 1) - 1;
200 vis_ld64(ref[0], TMP0);
201 vis_xor(DST_0, REF_0, TMP6);
203 vis_ld64_2(ref, 8, TMP2);
204 vis_and(TMP6, MASK_fe, TMP6);
206 vis_ld64_2(ref, 16, TMP4);
208 vis_mul8x16(CONST_128, TMP6, TMP6);
209 vis_xor(DST_2, REF_2, TMP8);
211 vis_and(TMP8, MASK_fe, TMP8);
213 vis_or(DST_0, REF_0, TMP10);
214 vis_ld64_2(dest, stride, DST_0);
215 vis_mul8x16(CONST_128, TMP8, TMP8);
217 vis_or(DST_2, REF_2, TMP12);
218 vis_ld64_2(dest, stride_8, DST_2);
220 vis_ld64(ref[0], TMP14);
221 vis_and(TMP6, MASK_7f, TMP6);
223 vis_and(TMP8, MASK_7f, TMP8);
225 vis_psub16(TMP10, TMP6, TMP6);
226 vis_st64(TMP6, dest[0]);
228 vis_psub16(TMP12, TMP8, TMP8);
229 vis_st64_2(TMP8, dest, 8);
232 vis_ld64_2(ref, 8, TMP16);
233 vis_faligndata(TMP0, TMP2, REF_0);
235 vis_ld64_2(ref, 16, TMP18);
236 vis_faligndata(TMP2, TMP4, REF_2);
239 vis_xor(DST_0, REF_0, TMP20);
241 vis_and(TMP20, MASK_fe, TMP20);
243 vis_xor(DST_2, REF_2, TMP22);
244 vis_mul8x16(CONST_128, TMP20, TMP20);
246 vis_and(TMP22, MASK_fe, TMP22);
248 vis_or(DST_0, REF_0, TMP24);
249 vis_mul8x16(CONST_128, TMP22, TMP22);
251 vis_or(DST_2, REF_2, TMP26);
253 vis_ld64_2(dest, stride, DST_0);
254 vis_faligndata(TMP14, TMP16, REF_0);
256 vis_ld64_2(dest, stride_8, DST_2);
257 vis_faligndata(TMP16, TMP18, REF_2);
259 vis_and(TMP20, MASK_7f, TMP20);
261 vis_and(TMP22, MASK_7f, TMP22);
263 vis_psub16(TMP24, TMP20, TMP20);
264 vis_st64(TMP20, dest[0]);
266 vis_psub16(TMP26, TMP22, TMP22);
267 vis_st64_2(TMP22, dest, 8);
271 vis_ld64(ref[0], TMP0);
272 vis_xor(DST_0, REF_0, TMP6);
274 vis_ld64_2(ref, 8, TMP2);
275 vis_and(TMP6, MASK_fe, TMP6);
277 vis_ld64_2(ref, 16, TMP4);
278 vis_mul8x16(CONST_128, TMP6, TMP6);
279 vis_xor(DST_2, REF_2, TMP8);
281 vis_and(TMP8, MASK_fe, TMP8);
283 vis_or(DST_0, REF_0, TMP10);
284 vis_ld64_2(dest, stride, DST_0);
285 vis_mul8x16(CONST_128, TMP8, TMP8);
287 vis_or(DST_2, REF_2, TMP12);
288 vis_ld64_2(dest, stride_8, DST_2);
290 vis_ld64(ref[0], TMP14);
291 vis_and(TMP6, MASK_7f, TMP6);
293 vis_and(TMP8, MASK_7f, TMP8);
295 vis_psub16(TMP10, TMP6, TMP6);
296 vis_st64(TMP6, dest[0]);
298 vis_psub16(TMP12, TMP8, TMP8);
299 vis_st64_2(TMP8, dest, 8);
302 vis_faligndata(TMP0, TMP2, REF_0);
304 vis_faligndata(TMP2, TMP4, REF_2);
306 vis_xor(DST_0, REF_0, TMP20);
308 vis_and(TMP20, MASK_fe, TMP20);
310 vis_xor(DST_2, REF_2, TMP22);
311 vis_mul8x16(CONST_128, TMP20, TMP20);
313 vis_and(TMP22, MASK_fe, TMP22);
315 vis_or(DST_0, REF_0, TMP24);
316 vis_mul8x16(CONST_128, TMP22, TMP22);
318 vis_or(DST_2, REF_2, TMP26);
320 vis_and(TMP20, MASK_7f, TMP20);
322 vis_and(TMP22, MASK_7f, TMP22);
324 vis_psub16(TMP24, TMP20, TMP20);
325 vis_st64(TMP20, dest[0]);
327 vis_psub16(TMP26, TMP22, TMP22);
328 vis_st64_2(TMP22, dest, 8);
331 static void MC_avg_o_8_vis (uint8_t * dest, const uint8_t * _ref,
332 const int stride, int height)
334 uint8_t *ref = (uint8_t *) _ref;
336 ref = vis_alignaddr(ref);
338 vis_ld64(ref[0], TMP0);
340 vis_ld64(ref[8], TMP2);
342 vis_ld64(dest[0], DST_0);
344 vis_ld64(constants_fe[0], MASK_fe);
346 vis_ld64(constants_7f[0], MASK_7f);
347 vis_faligndata(TMP0, TMP2, REF_0);
349 vis_ld64(constants128[0], CONST_128);
352 height = (height >> 1) - 1;
355 vis_ld64(ref[0], TMP0);
356 vis_xor(DST_0, REF_0, TMP4);
358 vis_ld64(ref[8], TMP2);
359 vis_and(TMP4, MASK_fe, TMP4);
361 vis_or(DST_0, REF_0, TMP6);
362 vis_ld64_2(dest, stride, DST_0);
364 vis_mul8x16(CONST_128, TMP4, TMP4);
366 vis_ld64(ref[0], TMP12);
367 vis_faligndata(TMP0, TMP2, REF_0);
369 vis_ld64(ref[8], TMP2);
370 vis_xor(DST_0, REF_0, TMP0);
373 vis_and(TMP0, MASK_fe, TMP0);
375 vis_and(TMP4, MASK_7f, TMP4);
377 vis_psub16(TMP6, TMP4, TMP4);
378 vis_st64(TMP4, dest[0]);
380 vis_mul8x16(CONST_128, TMP0, TMP0);
382 vis_or(DST_0, REF_0, TMP6);
383 vis_ld64_2(dest, stride, DST_0);
385 vis_faligndata(TMP12, TMP2, REF_0);
387 vis_and(TMP0, MASK_7f, TMP0);
389 vis_psub16(TMP6, TMP0, TMP4);
390 vis_st64(TMP4, dest[0]);
394 vis_ld64(ref[0], TMP0);
395 vis_xor(DST_0, REF_0, TMP4);
397 vis_ld64(ref[8], TMP2);
398 vis_and(TMP4, MASK_fe, TMP4);
400 vis_or(DST_0, REF_0, TMP6);
401 vis_ld64_2(dest, stride, DST_0);
402 vis_mul8x16(CONST_128, TMP4, TMP4);
404 vis_faligndata(TMP0, TMP2, REF_0);
406 vis_xor(DST_0, REF_0, TMP0);
408 vis_and(TMP0, MASK_fe, TMP0);
410 vis_and(TMP4, MASK_7f, TMP4);
412 vis_psub16(TMP6, TMP4, TMP4);
413 vis_st64(TMP4, dest[0]);
415 vis_mul8x16(CONST_128, TMP0, TMP0);
417 vis_or(DST_0, REF_0, TMP6);
419 vis_and(TMP0, MASK_7f, TMP0);
421 vis_psub16(TMP6, TMP0, TMP4);
422 vis_st64(TMP4, dest[0]);
425 static void MC_put_x_16_vis (uint8_t * dest, const uint8_t * _ref,
426 const int stride, int height)
428 uint8_t *ref = (uint8_t *) _ref;
429 unsigned long off = (unsigned long) ref & 0x7;
430 unsigned long off_plus_1 = off + 1;
432 ref = vis_alignaddr(ref);
434 vis_ld64(ref[0], TMP0);
436 vis_ld64_2(ref, 8, TMP2);
438 vis_ld64_2(ref, 16, TMP4);
440 vis_ld64(constants_fe[0], MASK_fe);
442 vis_ld64(constants_7f[0], MASK_7f);
443 vis_faligndata(TMP0, TMP2, REF_0);
445 vis_ld64(constants128[0], CONST_128);
446 vis_faligndata(TMP2, TMP4, REF_4);
449 vis_alignaddr_g0((void *)off_plus_1);
450 vis_faligndata(TMP0, TMP2, REF_2);
451 vis_faligndata(TMP2, TMP4, REF_6);
453 vis_src1(TMP2, REF_2);
454 vis_src1(TMP4, REF_6);
458 height = (height >> 1) - 1;
461 vis_ld64(ref[0], TMP0);
462 vis_xor(REF_0, REF_2, TMP6);
464 vis_ld64_2(ref, 8, TMP2);
465 vis_xor(REF_4, REF_6, TMP8);
467 vis_ld64_2(ref, 16, TMP4);
468 vis_and(TMP6, MASK_fe, TMP6);
471 vis_ld64(ref[0], TMP14);
472 vis_mul8x16(CONST_128, TMP6, TMP6);
473 vis_and(TMP8, MASK_fe, TMP8);
475 vis_ld64_2(ref, 8, TMP16);
476 vis_mul8x16(CONST_128, TMP8, TMP8);
477 vis_or(REF_0, REF_2, TMP10);
479 vis_ld64_2(ref, 16, TMP18);
481 vis_or(REF_4, REF_6, TMP12);
483 vis_alignaddr_g0((void *)off);
485 vis_faligndata(TMP0, TMP2, REF_0);
487 vis_faligndata(TMP2, TMP4, REF_4);
490 vis_alignaddr_g0((void *)off_plus_1);
491 vis_faligndata(TMP0, TMP2, REF_2);
492 vis_faligndata(TMP2, TMP4, REF_6);
494 vis_src1(TMP2, REF_2);
495 vis_src1(TMP4, REF_6);
498 vis_and(TMP6, MASK_7f, TMP6);
500 vis_and(TMP8, MASK_7f, TMP8);
502 vis_psub16(TMP10, TMP6, TMP6);
503 vis_st64(TMP6, dest[0]);
505 vis_psub16(TMP12, TMP8, TMP8);
506 vis_st64_2(TMP8, dest, 8);
509 vis_xor(REF_0, REF_2, TMP6);
511 vis_xor(REF_4, REF_6, TMP8);
513 vis_and(TMP6, MASK_fe, TMP6);
515 vis_mul8x16(CONST_128, TMP6, TMP6);
516 vis_and(TMP8, MASK_fe, TMP8);
518 vis_mul8x16(CONST_128, TMP8, TMP8);
519 vis_or(REF_0, REF_2, TMP10);
521 vis_or(REF_4, REF_6, TMP12);
523 vis_alignaddr_g0((void *)off);
525 vis_faligndata(TMP14, TMP16, REF_0);
527 vis_faligndata(TMP16, TMP18, REF_4);
530 vis_alignaddr_g0((void *)off_plus_1);
531 vis_faligndata(TMP14, TMP16, REF_2);
532 vis_faligndata(TMP16, TMP18, REF_6);
534 vis_src1(TMP16, REF_2);
535 vis_src1(TMP18, REF_6);
538 vis_and(TMP6, MASK_7f, TMP6);
540 vis_and(TMP8, MASK_7f, TMP8);
542 vis_psub16(TMP10, TMP6, TMP6);
543 vis_st64(TMP6, dest[0]);
545 vis_psub16(TMP12, TMP8, TMP8);
546 vis_st64_2(TMP8, dest, 8);
550 vis_ld64(ref[0], TMP0);
551 vis_xor(REF_0, REF_2, TMP6);
553 vis_ld64_2(ref, 8, TMP2);
554 vis_xor(REF_4, REF_6, TMP8);
556 vis_ld64_2(ref, 16, TMP4);
557 vis_and(TMP6, MASK_fe, TMP6);
559 vis_mul8x16(CONST_128, TMP6, TMP6);
560 vis_and(TMP8, MASK_fe, TMP8);
562 vis_mul8x16(CONST_128, TMP8, TMP8);
563 vis_or(REF_0, REF_2, TMP10);
565 vis_or(REF_4, REF_6, TMP12);
567 vis_alignaddr_g0((void *)off);
569 vis_faligndata(TMP0, TMP2, REF_0);
571 vis_faligndata(TMP2, TMP4, REF_4);
574 vis_alignaddr_g0((void *)off_plus_1);
575 vis_faligndata(TMP0, TMP2, REF_2);
576 vis_faligndata(TMP2, TMP4, REF_6);
578 vis_src1(TMP2, REF_2);
579 vis_src1(TMP4, REF_6);
582 vis_and(TMP6, MASK_7f, TMP6);
584 vis_and(TMP8, MASK_7f, TMP8);
586 vis_psub16(TMP10, TMP6, TMP6);
587 vis_st64(TMP6, dest[0]);
589 vis_psub16(TMP12, TMP8, TMP8);
590 vis_st64_2(TMP8, dest, 8);
593 vis_xor(REF_0, REF_2, TMP6);
595 vis_xor(REF_4, REF_6, TMP8);
597 vis_and(TMP6, MASK_fe, TMP6);
599 vis_mul8x16(CONST_128, TMP6, TMP6);
600 vis_and(TMP8, MASK_fe, TMP8);
602 vis_mul8x16(CONST_128, TMP8, TMP8);
603 vis_or(REF_0, REF_2, TMP10);
605 vis_or(REF_4, REF_6, TMP12);
607 vis_and(TMP6, MASK_7f, TMP6);
609 vis_and(TMP8, MASK_7f, TMP8);
611 vis_psub16(TMP10, TMP6, TMP6);
612 vis_st64(TMP6, dest[0]);
614 vis_psub16(TMP12, TMP8, TMP8);
615 vis_st64_2(TMP8, dest, 8);
618 static void MC_put_x_8_vis (uint8_t * dest, const uint8_t * _ref,
619 const int stride, int height)
621 uint8_t *ref = (uint8_t *) _ref;
622 unsigned long off = (unsigned long) ref & 0x7;
623 unsigned long off_plus_1 = off + 1;
625 ref = vis_alignaddr(ref);
627 vis_ld64(ref[0], TMP0);
629 vis_ld64(ref[8], TMP2);
631 vis_ld64(constants_fe[0], MASK_fe);
633 vis_ld64(constants_7f[0], MASK_7f);
635 vis_ld64(constants128[0], CONST_128);
636 vis_faligndata(TMP0, TMP2, REF_0);
639 vis_alignaddr_g0((void *)off_plus_1);
640 vis_faligndata(TMP0, TMP2, REF_2);
642 vis_src1(TMP2, REF_2);
646 height = (height >> 1) - 1;
649 vis_ld64(ref[0], TMP0);
650 vis_xor(REF_0, REF_2, TMP4);
652 vis_ld64_2(ref, 8, TMP2);
653 vis_and(TMP4, MASK_fe, TMP4);
656 vis_ld64(ref[0], TMP8);
657 vis_or(REF_0, REF_2, TMP6);
658 vis_mul8x16(CONST_128, TMP4, TMP4);
660 vis_alignaddr_g0((void *)off);
662 vis_ld64_2(ref, 8, TMP10);
664 vis_faligndata(TMP0, TMP2, REF_0);
667 vis_alignaddr_g0((void *)off_plus_1);
668 vis_faligndata(TMP0, TMP2, REF_2);
670 vis_src1(TMP2, REF_2);
673 vis_and(TMP4, MASK_7f, TMP4);
675 vis_psub16(TMP6, TMP4, DST_0);
676 vis_st64(DST_0, dest[0]);
679 vis_xor(REF_0, REF_2, TMP12);
681 vis_and(TMP12, MASK_fe, TMP12);
683 vis_or(REF_0, REF_2, TMP14);
684 vis_mul8x16(CONST_128, TMP12, TMP12);
686 vis_alignaddr_g0((void *)off);
687 vis_faligndata(TMP8, TMP10, REF_0);
689 vis_alignaddr_g0((void *)off_plus_1);
690 vis_faligndata(TMP8, TMP10, REF_2);
692 vis_src1(TMP10, REF_2);
695 vis_and(TMP12, MASK_7f, TMP12);
697 vis_psub16(TMP14, TMP12, DST_0);
698 vis_st64(DST_0, dest[0]);
702 vis_ld64(ref[0], TMP0);
703 vis_xor(REF_0, REF_2, TMP4);
705 vis_ld64_2(ref, 8, TMP2);
706 vis_and(TMP4, MASK_fe, TMP4);
708 vis_or(REF_0, REF_2, TMP6);
709 vis_mul8x16(CONST_128, TMP4, TMP4);
711 vis_alignaddr_g0((void *)off);
713 vis_faligndata(TMP0, TMP2, REF_0);
716 vis_alignaddr_g0((void *)off_plus_1);
717 vis_faligndata(TMP0, TMP2, REF_2);
719 vis_src1(TMP2, REF_2);
722 vis_and(TMP4, MASK_7f, TMP4);
724 vis_psub16(TMP6, TMP4, DST_0);
725 vis_st64(DST_0, dest[0]);
728 vis_xor(REF_0, REF_2, TMP12);
730 vis_and(TMP12, MASK_fe, TMP12);
732 vis_or(REF_0, REF_2, TMP14);
733 vis_mul8x16(CONST_128, TMP12, TMP12);
735 vis_and(TMP12, MASK_7f, TMP12);
737 vis_psub16(TMP14, TMP12, DST_0);
738 vis_st64(DST_0, dest[0]);
742 static void MC_avg_x_16_vis (uint8_t * dest, const uint8_t * _ref,
743 const int stride, int height)
745 uint8_t *ref = (uint8_t *) _ref;
746 unsigned long off = (unsigned long) ref & 0x7;
747 unsigned long off_plus_1 = off + 1;
749 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
751 vis_ld64(constants3[0], CONST_3);
753 vis_ld64(constants256_512[0], CONST_256);
755 ref = vis_alignaddr(ref);
757 vis_ld64(ref[0], TMP0);
759 vis_ld64(ref[8], TMP2);
761 vis_alignaddr_g0((void *)off);
763 vis_ld64(ref[16], TMP4);
765 vis_ld64(dest[0], DST_0);
766 vis_faligndata(TMP0, TMP2, REF_0);
768 vis_ld64(dest[8], DST_2);
769 vis_faligndata(TMP2, TMP4, REF_4);
772 vis_alignaddr_g0((void *)off_plus_1);
773 vis_faligndata(TMP0, TMP2, REF_2);
774 vis_faligndata(TMP2, TMP4, REF_6);
776 vis_src1(TMP2, REF_2);
777 vis_src1(TMP4, REF_6);
780 vis_mul8x16au(REF_0, CONST_256, TMP0);
782 vis_pmerge(ZERO, REF_2, TMP4);
783 vis_mul8x16au(REF_0_1, CONST_256, TMP2);
785 vis_pmerge(ZERO, REF_2_1, TMP6);
787 vis_padd16(TMP0, TMP4, TMP0);
789 vis_mul8x16al(DST_0, CONST_512, TMP4);
790 vis_padd16(TMP2, TMP6, TMP2);
792 vis_mul8x16al(DST_1, CONST_512, TMP6);
794 vis_mul8x16au(REF_6, CONST_256, TMP12);
796 vis_padd16(TMP0, TMP4, TMP0);
797 vis_mul8x16au(REF_6_1, CONST_256, TMP14);
799 vis_padd16(TMP2, TMP6, TMP2);
800 vis_mul8x16au(REF_4, CONST_256, TMP16);
802 vis_padd16(TMP0, CONST_3, TMP8);
803 vis_mul8x16au(REF_4_1, CONST_256, TMP18);
805 vis_padd16(TMP2, CONST_3, TMP10);
806 vis_pack16(TMP8, DST_0);
808 vis_pack16(TMP10, DST_1);
809 vis_padd16(TMP16, TMP12, TMP0);
811 vis_st64(DST_0, dest[0]);
812 vis_mul8x16al(DST_2, CONST_512, TMP4);
813 vis_padd16(TMP18, TMP14, TMP2);
815 vis_mul8x16al(DST_3, CONST_512, TMP6);
816 vis_padd16(TMP0, CONST_3, TMP0);
818 vis_padd16(TMP2, CONST_3, TMP2);
820 vis_padd16(TMP0, TMP4, TMP0);
822 vis_padd16(TMP2, TMP6, TMP2);
823 vis_pack16(TMP0, DST_2);
825 vis_pack16(TMP2, DST_3);
826 vis_st64(DST_2, dest[8]);
833 static void MC_avg_x_8_vis (uint8_t * dest, const uint8_t * _ref,
834 const int stride, int height)
836 uint8_t *ref = (uint8_t *) _ref;
837 unsigned long off = (unsigned long) ref & 0x7;
838 unsigned long off_plus_1 = off + 1;
839 int stride_times_2 = stride << 1;
841 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
843 vis_ld64(constants3[0], CONST_3);
845 vis_ld64(constants256_512[0], CONST_256);
847 ref = vis_alignaddr(ref);
850 vis_ld64(ref[0], TMP0);
852 vis_ld64_2(ref, 8, TMP2);
855 vis_alignaddr_g0((void *)off);
857 vis_ld64(ref[0], TMP4);
858 vis_faligndata(TMP0, TMP2, REF_0);
860 vis_ld64_2(ref, 8, TMP6);
863 vis_ld64(ref[0], TMP8);
865 vis_ld64_2(ref, 8, TMP10);
867 vis_faligndata(TMP4, TMP6, REF_4);
869 vis_ld64(ref[0], TMP12);
871 vis_ld64_2(ref, 8, TMP14);
873 vis_faligndata(TMP8, TMP10, REF_S0);
875 vis_faligndata(TMP12, TMP14, REF_S4);
878 vis_alignaddr_g0((void *)off_plus_1);
880 vis_ld64(dest[0], DST_0);
881 vis_faligndata(TMP0, TMP2, REF_2);
883 vis_ld64_2(dest, stride, DST_2);
884 vis_faligndata(TMP4, TMP6, REF_6);
886 vis_faligndata(TMP8, TMP10, REF_S2);
888 vis_faligndata(TMP12, TMP14, REF_S6);
890 vis_ld64(dest[0], DST_0);
891 vis_src1(TMP2, REF_2);
893 vis_ld64_2(dest, stride, DST_2);
894 vis_src1(TMP6, REF_6);
896 vis_src1(TMP10, REF_S2);
898 vis_src1(TMP14, REF_S6);
901 vis_pmerge(ZERO, REF_0, TMP0);
902 vis_mul8x16au(REF_0_1, CONST_256, TMP2);
904 vis_pmerge(ZERO, REF_2, TMP4);
905 vis_mul8x16au(REF_2_1, CONST_256, TMP6);
907 vis_padd16(TMP0, CONST_3, TMP0);
908 vis_mul8x16al(DST_0, CONST_512, TMP16);
910 vis_padd16(TMP2, CONST_3, TMP2);
911 vis_mul8x16al(DST_1, CONST_512, TMP18);
913 vis_padd16(TMP0, TMP4, TMP0);
914 vis_mul8x16au(REF_4, CONST_256, TMP8);
916 vis_padd16(TMP2, TMP6, TMP2);
917 vis_mul8x16au(REF_4_1, CONST_256, TMP10);
919 vis_padd16(TMP0, TMP16, TMP0);
920 vis_mul8x16au(REF_6, CONST_256, TMP12);
922 vis_padd16(TMP2, TMP18, TMP2);
923 vis_mul8x16au(REF_6_1, CONST_256, TMP14);
925 vis_padd16(TMP8, CONST_3, TMP8);
926 vis_mul8x16al(DST_2, CONST_512, TMP16);
928 vis_padd16(TMP8, TMP12, TMP8);
929 vis_mul8x16al(DST_3, CONST_512, TMP18);
931 vis_padd16(TMP10, TMP14, TMP10);
932 vis_pack16(TMP0, DST_0);
934 vis_pack16(TMP2, DST_1);
935 vis_st64(DST_0, dest[0]);
937 vis_padd16(TMP10, CONST_3, TMP10);
939 vis_ld64_2(dest, stride, DST_0);
940 vis_padd16(TMP8, TMP16, TMP8);
942 vis_ld64_2(dest, stride_times_2, TMP4/*DST_2*/);
943 vis_padd16(TMP10, TMP18, TMP10);
944 vis_pack16(TMP8, DST_2);
946 vis_pack16(TMP10, DST_3);
947 vis_st64(DST_2, dest[0]);
950 vis_mul8x16au(REF_S0_1, CONST_256, TMP2);
951 vis_pmerge(ZERO, REF_S0, TMP0);
953 vis_pmerge(ZERO, REF_S2, TMP24);
954 vis_mul8x16au(REF_S2_1, CONST_256, TMP6);
956 vis_padd16(TMP0, CONST_3, TMP0);
957 vis_mul8x16au(REF_S4, CONST_256, TMP8);
959 vis_padd16(TMP2, CONST_3, TMP2);
960 vis_mul8x16au(REF_S4_1, CONST_256, TMP10);
962 vis_padd16(TMP0, TMP24, TMP0);
963 vis_mul8x16au(REF_S6, CONST_256, TMP12);
965 vis_padd16(TMP2, TMP6, TMP2);
966 vis_mul8x16au(REF_S6_1, CONST_256, TMP14);
968 vis_padd16(TMP8, CONST_3, TMP8);
969 vis_mul8x16al(DST_0, CONST_512, TMP16);
971 vis_padd16(TMP10, CONST_3, TMP10);
972 vis_mul8x16al(DST_1, CONST_512, TMP18);
974 vis_padd16(TMP8, TMP12, TMP8);
975 vis_mul8x16al(TMP4/*DST_2*/, CONST_512, TMP20);
977 vis_mul8x16al(TMP5/*DST_3*/, CONST_512, TMP22);
978 vis_padd16(TMP0, TMP16, TMP0);
980 vis_padd16(TMP2, TMP18, TMP2);
981 vis_pack16(TMP0, DST_0);
983 vis_padd16(TMP10, TMP14, TMP10);
984 vis_pack16(TMP2, DST_1);
985 vis_st64(DST_0, dest[0]);
988 vis_padd16(TMP8, TMP20, TMP8);
990 vis_padd16(TMP10, TMP22, TMP10);
991 vis_pack16(TMP8, DST_2);
993 vis_pack16(TMP10, DST_3);
994 vis_st64(DST_2, dest[0]);
999 static void MC_put_y_16_vis (uint8_t * dest, const uint8_t * _ref,
1000 const int stride, int height)
1002 uint8_t *ref = (uint8_t *) _ref;
1004 ref = vis_alignaddr(ref);
1005 vis_ld64(ref[0], TMP0);
1007 vis_ld64_2(ref, 8, TMP2);
1009 vis_ld64_2(ref, 16, TMP4);
1012 vis_ld64(ref[0], TMP6);
1013 vis_faligndata(TMP0, TMP2, REF_0);
1015 vis_ld64_2(ref, 8, TMP8);
1016 vis_faligndata(TMP2, TMP4, REF_4);
1018 vis_ld64_2(ref, 16, TMP10);
1021 vis_ld64(constants_fe[0], MASK_fe);
1022 vis_faligndata(TMP6, TMP8, REF_2);
1024 vis_ld64(constants_7f[0], MASK_7f);
1025 vis_faligndata(TMP8, TMP10, REF_6);
1027 vis_ld64(constants128[0], CONST_128);
1028 height = (height >> 1) - 1;
1029 do { /* 24 cycles */
1030 vis_ld64(ref[0], TMP0);
1031 vis_xor(REF_0, REF_2, TMP12);
1033 vis_ld64_2(ref, 8, TMP2);
1034 vis_xor(REF_4, REF_6, TMP16);
1036 vis_ld64_2(ref, 16, TMP4);
1038 vis_or(REF_0, REF_2, TMP14);
1040 vis_ld64(ref[0], TMP6);
1041 vis_or(REF_4, REF_6, TMP18);
1043 vis_ld64_2(ref, 8, TMP8);
1044 vis_faligndata(TMP0, TMP2, REF_0);
1046 vis_ld64_2(ref, 16, TMP10);
1048 vis_faligndata(TMP2, TMP4, REF_4);
1050 vis_and(TMP12, MASK_fe, TMP12);
1052 vis_and(TMP16, MASK_fe, TMP16);
1053 vis_mul8x16(CONST_128, TMP12, TMP12);
1055 vis_mul8x16(CONST_128, TMP16, TMP16);
1056 vis_xor(REF_0, REF_2, TMP0);
1058 vis_xor(REF_4, REF_6, TMP2);
1060 vis_or(REF_0, REF_2, TMP20);
1062 vis_and(TMP12, MASK_7f, TMP12);
1064 vis_and(TMP16, MASK_7f, TMP16);
1066 vis_psub16(TMP14, TMP12, TMP12);
1067 vis_st64(TMP12, dest[0]);
1069 vis_psub16(TMP18, TMP16, TMP16);
1070 vis_st64_2(TMP16, dest, 8);
1073 vis_or(REF_4, REF_6, TMP18);
1075 vis_and(TMP0, MASK_fe, TMP0);
1077 vis_and(TMP2, MASK_fe, TMP2);
1078 vis_mul8x16(CONST_128, TMP0, TMP0);
1080 vis_faligndata(TMP6, TMP8, REF_2);
1081 vis_mul8x16(CONST_128, TMP2, TMP2);
1083 vis_faligndata(TMP8, TMP10, REF_6);
1085 vis_and(TMP0, MASK_7f, TMP0);
1087 vis_and(TMP2, MASK_7f, TMP2);
1089 vis_psub16(TMP20, TMP0, TMP0);
1090 vis_st64(TMP0, dest[0]);
1092 vis_psub16(TMP18, TMP2, TMP2);
1093 vis_st64_2(TMP2, dest, 8);
1097 vis_ld64(ref[0], TMP0);
1098 vis_xor(REF_0, REF_2, TMP12);
1100 vis_ld64_2(ref, 8, TMP2);
1101 vis_xor(REF_4, REF_6, TMP16);
1103 vis_ld64_2(ref, 16, TMP4);
1104 vis_or(REF_0, REF_2, TMP14);
1106 vis_or(REF_4, REF_6, TMP18);
1108 vis_faligndata(TMP0, TMP2, REF_0);
1110 vis_faligndata(TMP2, TMP4, REF_4);
1112 vis_and(TMP12, MASK_fe, TMP12);
1114 vis_and(TMP16, MASK_fe, TMP16);
1115 vis_mul8x16(CONST_128, TMP12, TMP12);
1117 vis_mul8x16(CONST_128, TMP16, TMP16);
1118 vis_xor(REF_0, REF_2, TMP0);
1120 vis_xor(REF_4, REF_6, TMP2);
1122 vis_or(REF_0, REF_2, TMP20);
1124 vis_and(TMP12, MASK_7f, TMP12);
1126 vis_and(TMP16, MASK_7f, TMP16);
1128 vis_psub16(TMP14, TMP12, TMP12);
1129 vis_st64(TMP12, dest[0]);
1131 vis_psub16(TMP18, TMP16, TMP16);
1132 vis_st64_2(TMP16, dest, 8);
1135 vis_or(REF_4, REF_6, TMP18);
1137 vis_and(TMP0, MASK_fe, TMP0);
1139 vis_and(TMP2, MASK_fe, TMP2);
1140 vis_mul8x16(CONST_128, TMP0, TMP0);
1142 vis_mul8x16(CONST_128, TMP2, TMP2);
1144 vis_and(TMP0, MASK_7f, TMP0);
1146 vis_and(TMP2, MASK_7f, TMP2);
1148 vis_psub16(TMP20, TMP0, TMP0);
1149 vis_st64(TMP0, dest[0]);
1151 vis_psub16(TMP18, TMP2, TMP2);
1152 vis_st64_2(TMP2, dest, 8);
1155 static void MC_put_y_8_vis (uint8_t * dest, const uint8_t * _ref,
1156 const int stride, int height)
1158 uint8_t *ref = (uint8_t *) _ref;
1160 ref = vis_alignaddr(ref);
1161 vis_ld64(ref[0], TMP0);
1163 vis_ld64_2(ref, 8, TMP2);
1166 vis_ld64(ref[0], TMP4);
1168 vis_ld64_2(ref, 8, TMP6);
1171 vis_ld64(constants_fe[0], MASK_fe);
1172 vis_faligndata(TMP0, TMP2, REF_0);
1174 vis_ld64(constants_7f[0], MASK_7f);
1175 vis_faligndata(TMP4, TMP6, REF_2);
1177 vis_ld64(constants128[0], CONST_128);
1178 height = (height >> 1) - 1;
1179 do { /* 12 cycles */
1180 vis_ld64(ref[0], TMP0);
1181 vis_xor(REF_0, REF_2, TMP4);
1183 vis_ld64_2(ref, 8, TMP2);
1185 vis_and(TMP4, MASK_fe, TMP4);
1187 vis_or(REF_0, REF_2, TMP6);
1188 vis_mul8x16(CONST_128, TMP4, TMP4);
1190 vis_faligndata(TMP0, TMP2, REF_0);
1191 vis_ld64(ref[0], TMP0);
1193 vis_ld64_2(ref, 8, TMP2);
1195 vis_xor(REF_0, REF_2, TMP12);
1197 vis_and(TMP4, MASK_7f, TMP4);
1199 vis_and(TMP12, MASK_fe, TMP12);
1201 vis_mul8x16(CONST_128, TMP12, TMP12);
1202 vis_or(REF_0, REF_2, TMP14);
1204 vis_psub16(TMP6, TMP4, DST_0);
1205 vis_st64(DST_0, dest[0]);
1208 vis_faligndata(TMP0, TMP2, REF_2);
1210 vis_and(TMP12, MASK_7f, TMP12);
1212 vis_psub16(TMP14, TMP12, DST_0);
1213 vis_st64(DST_0, dest[0]);
1217 vis_ld64(ref[0], TMP0);
1218 vis_xor(REF_0, REF_2, TMP4);
1220 vis_ld64_2(ref, 8, TMP2);
1221 vis_and(TMP4, MASK_fe, TMP4);
1223 vis_or(REF_0, REF_2, TMP6);
1224 vis_mul8x16(CONST_128, TMP4, TMP4);
1226 vis_faligndata(TMP0, TMP2, REF_0);
1228 vis_xor(REF_0, REF_2, TMP12);
1230 vis_and(TMP4, MASK_7f, TMP4);
1232 vis_and(TMP12, MASK_fe, TMP12);
1234 vis_mul8x16(CONST_128, TMP12, TMP12);
1235 vis_or(REF_0, REF_2, TMP14);
1237 vis_psub16(TMP6, TMP4, DST_0);
1238 vis_st64(DST_0, dest[0]);
1241 vis_and(TMP12, MASK_7f, TMP12);
1243 vis_psub16(TMP14, TMP12, DST_0);
1244 vis_st64(DST_0, dest[0]);
1247 static void MC_avg_y_16_vis (uint8_t * dest, const uint8_t * _ref,
1248 const int stride, int height)
1250 uint8_t *ref = (uint8_t *) _ref;
1251 int stride_8 = stride + 8;
1252 int stride_16 = stride + 16;
1254 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
1256 ref = vis_alignaddr(ref);
1258 vis_ld64(ref[ 0], TMP0);
1261 vis_ld64(ref[ 8], TMP2);
1263 vis_ld64(ref[16], TMP4);
1265 vis_ld64(constants3[0], CONST_3);
1266 vis_faligndata(TMP0, TMP2, REF_2);
1268 vis_ld64(constants256_512[0], CONST_256);
1269 vis_faligndata(TMP2, TMP4, REF_6);
1272 do { /* 31 cycles */
1273 vis_ld64_2(ref, stride, TMP0);
1274 vis_pmerge(ZERO, REF_2, TMP12);
1275 vis_mul8x16au(REF_2_1, CONST_256, TMP14);
1277 vis_ld64_2(ref, stride_8, TMP2);
1278 vis_pmerge(ZERO, REF_6, TMP16);
1279 vis_mul8x16au(REF_6_1, CONST_256, TMP18);
1281 vis_ld64_2(ref, stride_16, TMP4);
1284 vis_ld64(dest[0], DST_0);
1285 vis_faligndata(TMP0, TMP2, REF_0);
1287 vis_ld64_2(dest, 8, DST_2);
1288 vis_faligndata(TMP2, TMP4, REF_4);
1290 vis_ld64_2(ref, stride, TMP6);
1291 vis_pmerge(ZERO, REF_0, TMP0);
1292 vis_mul8x16au(REF_0_1, CONST_256, TMP2);
1294 vis_ld64_2(ref, stride_8, TMP8);
1295 vis_pmerge(ZERO, REF_4, TMP4);
1297 vis_ld64_2(ref, stride_16, TMP10);
1300 vis_ld64_2(dest, stride, REF_S0/*DST_4*/);
1301 vis_faligndata(TMP6, TMP8, REF_2);
1302 vis_mul8x16au(REF_4_1, CONST_256, TMP6);
1304 vis_ld64_2(dest, stride_8, REF_S2/*DST_6*/);
1305 vis_faligndata(TMP8, TMP10, REF_6);
1306 vis_mul8x16al(DST_0, CONST_512, TMP20);
1308 vis_padd16(TMP0, CONST_3, TMP0);
1309 vis_mul8x16al(DST_1, CONST_512, TMP22);
1311 vis_padd16(TMP2, CONST_3, TMP2);
1312 vis_mul8x16al(DST_2, CONST_512, TMP24);
1314 vis_padd16(TMP4, CONST_3, TMP4);
1315 vis_mul8x16al(DST_3, CONST_512, TMP26);
1317 vis_padd16(TMP6, CONST_3, TMP6);
1319 vis_padd16(TMP12, TMP20, TMP12);
1320 vis_mul8x16al(REF_S0, CONST_512, TMP20);
1322 vis_padd16(TMP14, TMP22, TMP14);
1323 vis_mul8x16al(REF_S0_1, CONST_512, TMP22);
1325 vis_padd16(TMP16, TMP24, TMP16);
1326 vis_mul8x16al(REF_S2, CONST_512, TMP24);
1328 vis_padd16(TMP18, TMP26, TMP18);
1329 vis_mul8x16al(REF_S2_1, CONST_512, TMP26);
1331 vis_padd16(TMP12, TMP0, TMP12);
1332 vis_mul8x16au(REF_2, CONST_256, TMP28);
1334 vis_padd16(TMP14, TMP2, TMP14);
1335 vis_mul8x16au(REF_2_1, CONST_256, TMP30);
1337 vis_padd16(TMP16, TMP4, TMP16);
1338 vis_mul8x16au(REF_6, CONST_256, REF_S4);
1340 vis_padd16(TMP18, TMP6, TMP18);
1341 vis_mul8x16au(REF_6_1, CONST_256, REF_S6);
1343 vis_pack16(TMP12, DST_0);
1344 vis_padd16(TMP28, TMP0, TMP12);
1346 vis_pack16(TMP14, DST_1);
1347 vis_st64(DST_0, dest[0]);
1348 vis_padd16(TMP30, TMP2, TMP14);
1350 vis_pack16(TMP16, DST_2);
1351 vis_padd16(REF_S4, TMP4, TMP16);
1353 vis_pack16(TMP18, DST_3);
1354 vis_st64_2(DST_2, dest, 8);
1356 vis_padd16(REF_S6, TMP6, TMP18);
1358 vis_padd16(TMP12, TMP20, TMP12);
1360 vis_padd16(TMP14, TMP22, TMP14);
1361 vis_pack16(TMP12, DST_0);
1363 vis_padd16(TMP16, TMP24, TMP16);
1364 vis_pack16(TMP14, DST_1);
1365 vis_st64(DST_0, dest[0]);
1367 vis_padd16(TMP18, TMP26, TMP18);
1368 vis_pack16(TMP16, DST_2);
1370 vis_pack16(TMP18, DST_3);
1371 vis_st64_2(DST_2, dest, 8);
1376 static void MC_avg_y_8_vis (uint8_t * dest, const uint8_t * _ref,
1377 const int stride, int height)
1379 uint8_t *ref = (uint8_t *) _ref;
1380 int stride_8 = stride + 8;
1382 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
1384 ref = vis_alignaddr(ref);
1386 vis_ld64(ref[ 0], TMP0);
1389 vis_ld64(ref[ 8], TMP2);
1391 vis_ld64(constants3[0], CONST_3);
1392 vis_faligndata(TMP0, TMP2, REF_2);
1394 vis_ld64(constants256_512[0], CONST_256);
1397 do { /* 20 cycles */
1398 vis_ld64_2(ref, stride, TMP0);
1399 vis_pmerge(ZERO, REF_2, TMP8);
1400 vis_mul8x16au(REF_2_1, CONST_256, TMP10);
1402 vis_ld64_2(ref, stride_8, TMP2);
1405 vis_ld64(dest[0], DST_0);
1407 vis_ld64_2(dest, stride, DST_2);
1408 vis_faligndata(TMP0, TMP2, REF_0);
1410 vis_ld64_2(ref, stride, TMP4);
1411 vis_mul8x16al(DST_0, CONST_512, TMP16);
1412 vis_pmerge(ZERO, REF_0, TMP12);
1414 vis_ld64_2(ref, stride_8, TMP6);
1416 vis_mul8x16al(DST_1, CONST_512, TMP18);
1417 vis_pmerge(ZERO, REF_0_1, TMP14);
1419 vis_padd16(TMP12, CONST_3, TMP12);
1420 vis_mul8x16al(DST_2, CONST_512, TMP24);
1422 vis_padd16(TMP14, CONST_3, TMP14);
1423 vis_mul8x16al(DST_3, CONST_512, TMP26);
1425 vis_faligndata(TMP4, TMP6, REF_2);
1427 vis_padd16(TMP8, TMP12, TMP8);
1429 vis_padd16(TMP10, TMP14, TMP10);
1430 vis_mul8x16au(REF_2, CONST_256, TMP20);
1432 vis_padd16(TMP8, TMP16, TMP0);
1433 vis_mul8x16au(REF_2_1, CONST_256, TMP22);
1435 vis_padd16(TMP10, TMP18, TMP2);
1436 vis_pack16(TMP0, DST_0);
1438 vis_pack16(TMP2, DST_1);
1439 vis_st64(DST_0, dest[0]);
1441 vis_padd16(TMP12, TMP20, TMP12);
1443 vis_padd16(TMP14, TMP22, TMP14);
1445 vis_padd16(TMP12, TMP24, TMP0);
1447 vis_padd16(TMP14, TMP26, TMP2);
1448 vis_pack16(TMP0, DST_2);
1450 vis_pack16(TMP2, DST_3);
1451 vis_st64(DST_2, dest[0]);
1456 static void MC_put_xy_16_vis (uint8_t * dest, const uint8_t * _ref,
1457 const int stride, int height)
1459 uint8_t *ref = (uint8_t *) _ref;
1460 unsigned long off = (unsigned long) ref & 0x7;
1461 unsigned long off_plus_1 = off + 1;
1462 int stride_8 = stride + 8;
1463 int stride_16 = stride + 16;
1465 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
1467 ref = vis_alignaddr(ref);
1469 vis_ld64(ref[ 0], TMP0);
1472 vis_ld64(ref[ 8], TMP2);
1474 vis_ld64(ref[16], TMP4);
1476 vis_ld64(constants2[0], CONST_2);
1477 vis_faligndata(TMP0, TMP2, REF_S0);
1479 vis_ld64(constants256_512[0], CONST_256);
1480 vis_faligndata(TMP2, TMP4, REF_S4);
1483 vis_alignaddr_g0((void *)off_plus_1);
1484 vis_faligndata(TMP0, TMP2, REF_S2);
1485 vis_faligndata(TMP2, TMP4, REF_S6);
1487 vis_src1(TMP2, REF_S2);
1488 vis_src1(TMP4, REF_S6);
1493 vis_ld64_2(ref, stride, TMP0);
1494 vis_mul8x16au(REF_S0, CONST_256, TMP12);
1495 vis_pmerge(ZERO, REF_S0_1, TMP14);
1497 vis_alignaddr_g0((void *)off);
1499 vis_ld64_2(ref, stride_8, TMP2);
1500 vis_mul8x16au(REF_S2, CONST_256, TMP16);
1501 vis_pmerge(ZERO, REF_S2_1, TMP18);
1503 vis_ld64_2(ref, stride_16, TMP4);
1505 vis_mul8x16au(REF_S4, CONST_256, TMP20);
1506 vis_pmerge(ZERO, REF_S4_1, TMP22);
1508 vis_ld64_2(ref, stride, TMP6);
1509 vis_mul8x16au(REF_S6, CONST_256, TMP24);
1510 vis_pmerge(ZERO, REF_S6_1, TMP26);
1512 vis_ld64_2(ref, stride_8, TMP8);
1513 vis_faligndata(TMP0, TMP2, REF_0);
1515 vis_ld64_2(ref, stride_16, TMP10);
1517 vis_faligndata(TMP2, TMP4, REF_4);
1519 vis_faligndata(TMP6, TMP8, REF_S0);
1521 vis_faligndata(TMP8, TMP10, REF_S4);
1524 vis_alignaddr_g0((void *)off_plus_1);
1525 vis_faligndata(TMP0, TMP2, REF_2);
1526 vis_faligndata(TMP2, TMP4, REF_6);
1527 vis_faligndata(TMP6, TMP8, REF_S2);
1528 vis_faligndata(TMP8, TMP10, REF_S6);
1530 vis_src1(TMP2, REF_2);
1531 vis_src1(TMP4, REF_6);
1532 vis_src1(TMP8, REF_S2);
1533 vis_src1(TMP10, REF_S6);
1536 vis_mul8x16au(REF_0, CONST_256, TMP0);
1537 vis_pmerge(ZERO, REF_0_1, TMP2);
1539 vis_mul8x16au(REF_2, CONST_256, TMP4);
1540 vis_pmerge(ZERO, REF_2_1, TMP6);
1542 vis_padd16(TMP0, CONST_2, TMP8);
1543 vis_mul8x16au(REF_4, CONST_256, TMP0);
1545 vis_padd16(TMP2, CONST_2, TMP10);
1546 vis_mul8x16au(REF_4_1, CONST_256, TMP2);
1548 vis_padd16(TMP8, TMP4, TMP8);
1549 vis_mul8x16au(REF_6, CONST_256, TMP4);
1551 vis_padd16(TMP10, TMP6, TMP10);
1552 vis_mul8x16au(REF_6_1, CONST_256, TMP6);
1554 vis_padd16(TMP12, TMP8, TMP12);
1556 vis_padd16(TMP14, TMP10, TMP14);
1558 vis_padd16(TMP12, TMP16, TMP12);
1560 vis_padd16(TMP14, TMP18, TMP14);
1561 vis_pack16(TMP12, DST_0);
1563 vis_pack16(TMP14, DST_1);
1564 vis_st64(DST_0, dest[0]);
1565 vis_padd16(TMP0, CONST_2, TMP12);
1567 vis_mul8x16au(REF_S0, CONST_256, TMP0);
1568 vis_padd16(TMP2, CONST_2, TMP14);
1570 vis_mul8x16au(REF_S0_1, CONST_256, TMP2);
1571 vis_padd16(TMP12, TMP4, TMP12);
1573 vis_mul8x16au(REF_S2, CONST_256, TMP4);
1574 vis_padd16(TMP14, TMP6, TMP14);
1576 vis_mul8x16au(REF_S2_1, CONST_256, TMP6);
1577 vis_padd16(TMP20, TMP12, TMP20);
1579 vis_padd16(TMP22, TMP14, TMP22);
1581 vis_padd16(TMP20, TMP24, TMP20);
1583 vis_padd16(TMP22, TMP26, TMP22);
1584 vis_pack16(TMP20, DST_2);
1586 vis_pack16(TMP22, DST_3);
1587 vis_st64_2(DST_2, dest, 8);
1589 vis_padd16(TMP0, TMP4, TMP24);
1591 vis_mul8x16au(REF_S4, CONST_256, TMP0);
1592 vis_padd16(TMP2, TMP6, TMP26);
1594 vis_mul8x16au(REF_S4_1, CONST_256, TMP2);
1595 vis_padd16(TMP24, TMP8, TMP24);
1597 vis_padd16(TMP26, TMP10, TMP26);
1598 vis_pack16(TMP24, DST_0);
1600 vis_pack16(TMP26, DST_1);
1601 vis_st64(DST_0, dest[0]);
1602 vis_pmerge(ZERO, REF_S6, TMP4);
1604 vis_pmerge(ZERO, REF_S6_1, TMP6);
1606 vis_padd16(TMP0, TMP4, TMP0);
1608 vis_padd16(TMP2, TMP6, TMP2);
1610 vis_padd16(TMP0, TMP12, TMP0);
1612 vis_padd16(TMP2, TMP14, TMP2);
1613 vis_pack16(TMP0, DST_2);
1615 vis_pack16(TMP2, DST_3);
1616 vis_st64_2(DST_2, dest, 8);
1621 static void MC_put_xy_8_vis (uint8_t * dest, const uint8_t * _ref,
1622 const int stride, int height)
1624 uint8_t *ref = (uint8_t *) _ref;
1625 unsigned long off = (unsigned long) ref & 0x7;
1626 unsigned long off_plus_1 = off + 1;
1627 int stride_8 = stride + 8;
1629 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
1631 ref = vis_alignaddr(ref);
1633 vis_ld64(ref[ 0], TMP0);
1636 vis_ld64(ref[ 8], TMP2);
1638 vis_ld64(constants2[0], CONST_2);
1640 vis_ld64(constants256_512[0], CONST_256);
1641 vis_faligndata(TMP0, TMP2, REF_S0);
1644 vis_alignaddr_g0((void *)off_plus_1);
1645 vis_faligndata(TMP0, TMP2, REF_S2);
1647 vis_src1(TMP2, REF_S2);
1651 do { /* 26 cycles */
1652 vis_ld64_2(ref, stride, TMP0);
1653 vis_mul8x16au(REF_S0, CONST_256, TMP8);
1654 vis_pmerge(ZERO, REF_S2, TMP12);
1656 vis_alignaddr_g0((void *)off);
1658 vis_ld64_2(ref, stride_8, TMP2);
1660 vis_mul8x16au(REF_S0_1, CONST_256, TMP10);
1661 vis_pmerge(ZERO, REF_S2_1, TMP14);
1663 vis_ld64_2(ref, stride, TMP4);
1665 vis_ld64_2(ref, stride_8, TMP6);
1667 vis_faligndata(TMP0, TMP2, REF_S4);
1669 vis_pmerge(ZERO, REF_S4, TMP18);
1671 vis_pmerge(ZERO, REF_S4_1, TMP20);
1673 vis_faligndata(TMP4, TMP6, REF_S0);
1676 vis_alignaddr_g0((void *)off_plus_1);
1677 vis_faligndata(TMP0, TMP2, REF_S6);
1678 vis_faligndata(TMP4, TMP6, REF_S2);
1680 vis_src1(TMP2, REF_S6);
1681 vis_src1(TMP6, REF_S2);
1684 vis_padd16(TMP18, CONST_2, TMP18);
1685 vis_mul8x16au(REF_S6, CONST_256, TMP22);
1687 vis_padd16(TMP20, CONST_2, TMP20);
1688 vis_mul8x16au(REF_S6_1, CONST_256, TMP24);
1690 vis_mul8x16au(REF_S0, CONST_256, TMP26);
1691 vis_pmerge(ZERO, REF_S0_1, TMP28);
1693 vis_mul8x16au(REF_S2, CONST_256, TMP30);
1694 vis_padd16(TMP18, TMP22, TMP18);
1696 vis_mul8x16au(REF_S2_1, CONST_256, TMP32);
1697 vis_padd16(TMP20, TMP24, TMP20);
1699 vis_padd16(TMP8, TMP18, TMP8);
1701 vis_padd16(TMP10, TMP20, TMP10);
1703 vis_padd16(TMP8, TMP12, TMP8);
1705 vis_padd16(TMP10, TMP14, TMP10);
1706 vis_pack16(TMP8, DST_0);
1708 vis_pack16(TMP10, DST_1);
1709 vis_st64(DST_0, dest[0]);
1711 vis_padd16(TMP18, TMP26, TMP18);
1713 vis_padd16(TMP20, TMP28, TMP20);
1715 vis_padd16(TMP18, TMP30, TMP18);
1717 vis_padd16(TMP20, TMP32, TMP20);
1718 vis_pack16(TMP18, DST_2);
1720 vis_pack16(TMP20, DST_3);
1721 vis_st64(DST_2, dest[0]);
1726 static void MC_avg_xy_16_vis (uint8_t * dest, const uint8_t * _ref,
1727 const int stride, int height)
1729 uint8_t *ref = (uint8_t *) _ref;
1730 unsigned long off = (unsigned long) ref & 0x7;
1731 unsigned long off_plus_1 = off + 1;
1732 int stride_8 = stride + 8;
1733 int stride_16 = stride + 16;
1735 vis_set_gsr(4 << VIS_GSR_SCALEFACT_SHIFT);
1737 ref = vis_alignaddr(ref);
1739 vis_ld64(ref[ 0], TMP0);
1742 vis_ld64(ref[ 8], TMP2);
1744 vis_ld64(ref[16], TMP4);
1746 vis_ld64(constants6[0], CONST_6);
1747 vis_faligndata(TMP0, TMP2, REF_S0);
1749 vis_ld64(constants256_1024[0], CONST_256);
1750 vis_faligndata(TMP2, TMP4, REF_S4);
1753 vis_alignaddr_g0((void *)off_plus_1);
1754 vis_faligndata(TMP0, TMP2, REF_S2);
1755 vis_faligndata(TMP2, TMP4, REF_S6);
1757 vis_src1(TMP2, REF_S2);
1758 vis_src1(TMP4, REF_S6);
1762 do { /* 55 cycles */
1763 vis_ld64_2(ref, stride, TMP0);
1764 vis_mul8x16au(REF_S0, CONST_256, TMP12);
1765 vis_pmerge(ZERO, REF_S0_1, TMP14);
1767 vis_alignaddr_g0((void *)off);
1769 vis_ld64_2(ref, stride_8, TMP2);
1770 vis_mul8x16au(REF_S2, CONST_256, TMP16);
1771 vis_pmerge(ZERO, REF_S2_1, TMP18);
1773 vis_ld64_2(ref, stride_16, TMP4);
1775 vis_mul8x16au(REF_S4, CONST_256, TMP20);
1776 vis_pmerge(ZERO, REF_S4_1, TMP22);
1778 vis_ld64_2(ref, stride, TMP6);
1779 vis_mul8x16au(REF_S6, CONST_256, TMP24);
1780 vis_pmerge(ZERO, REF_S6_1, TMP26);
1782 vis_ld64_2(ref, stride_8, TMP8);
1783 vis_faligndata(TMP0, TMP2, REF_0);
1785 vis_ld64_2(ref, stride_16, TMP10);
1787 vis_faligndata(TMP2, TMP4, REF_4);
1789 vis_ld64(dest[0], DST_0);
1790 vis_faligndata(TMP6, TMP8, REF_S0);
1792 vis_ld64_2(dest, 8, DST_2);
1793 vis_faligndata(TMP8, TMP10, REF_S4);
1796 vis_alignaddr_g0((void *)off_plus_1);
1797 vis_faligndata(TMP0, TMP2, REF_2);
1798 vis_faligndata(TMP2, TMP4, REF_6);
1799 vis_faligndata(TMP6, TMP8, REF_S2);
1800 vis_faligndata(TMP8, TMP10, REF_S6);
1802 vis_src1(TMP2, REF_2);
1803 vis_src1(TMP4, REF_6);
1804 vis_src1(TMP8, REF_S2);
1805 vis_src1(TMP10, REF_S6);
1808 vis_mul8x16al(DST_0, CONST_1024, TMP30);
1809 vis_pmerge(ZERO, REF_0, TMP0);
1811 vis_mul8x16al(DST_1, CONST_1024, TMP32);
1812 vis_pmerge(ZERO, REF_0_1, TMP2);
1814 vis_mul8x16au(REF_2, CONST_256, TMP4);
1815 vis_pmerge(ZERO, REF_2_1, TMP6);
1817 vis_mul8x16al(DST_2, CONST_1024, REF_0);
1818 vis_padd16(TMP0, CONST_6, TMP0);
1820 vis_mul8x16al(DST_3, CONST_1024, REF_2);
1821 vis_padd16(TMP2, CONST_6, TMP2);
1823 vis_padd16(TMP0, TMP4, TMP0);
1824 vis_mul8x16au(REF_4, CONST_256, TMP4);
1826 vis_padd16(TMP2, TMP6, TMP2);
1827 vis_mul8x16au(REF_4_1, CONST_256, TMP6);
1829 vis_padd16(TMP12, TMP0, TMP12);
1830 vis_mul8x16au(REF_6, CONST_256, TMP8);
1832 vis_padd16(TMP14, TMP2, TMP14);
1833 vis_mul8x16au(REF_6_1, CONST_256, TMP10);
1835 vis_padd16(TMP12, TMP16, TMP12);
1836 vis_mul8x16au(REF_S0, CONST_256, REF_4);
1838 vis_padd16(TMP14, TMP18, TMP14);
1839 vis_mul8x16au(REF_S0_1, CONST_256, REF_6);
1841 vis_padd16(TMP12, TMP30, TMP12);
1843 vis_padd16(TMP14, TMP32, TMP14);
1844 vis_pack16(TMP12, DST_0);
1846 vis_pack16(TMP14, DST_1);
1847 vis_st64(DST_0, dest[0]);
1848 vis_padd16(TMP4, CONST_6, TMP4);
1850 vis_ld64_2(dest, stride, DST_0);
1851 vis_padd16(TMP6, CONST_6, TMP6);
1852 vis_mul8x16au(REF_S2, CONST_256, TMP12);
1854 vis_padd16(TMP4, TMP8, TMP4);
1855 vis_mul8x16au(REF_S2_1, CONST_256, TMP14);
1857 vis_padd16(TMP6, TMP10, TMP6);
1859 vis_padd16(TMP20, TMP4, TMP20);
1861 vis_padd16(TMP22, TMP6, TMP22);
1863 vis_padd16(TMP20, TMP24, TMP20);
1865 vis_padd16(TMP22, TMP26, TMP22);
1867 vis_padd16(TMP20, REF_0, TMP20);
1868 vis_mul8x16au(REF_S4, CONST_256, REF_0);
1870 vis_padd16(TMP22, REF_2, TMP22);
1871 vis_pack16(TMP20, DST_2);
1873 vis_pack16(TMP22, DST_3);
1874 vis_st64_2(DST_2, dest, 8);
1877 vis_ld64_2(dest, 8, DST_2);
1878 vis_mul8x16al(DST_0, CONST_1024, TMP30);
1879 vis_pmerge(ZERO, REF_S4_1, REF_2);
1881 vis_mul8x16al(DST_1, CONST_1024, TMP32);
1882 vis_padd16(REF_4, TMP0, TMP8);
1884 vis_mul8x16au(REF_S6, CONST_256, REF_4);
1885 vis_padd16(REF_6, TMP2, TMP10);
1887 vis_mul8x16au(REF_S6_1, CONST_256, REF_6);
1888 vis_padd16(TMP8, TMP12, TMP8);
1890 vis_padd16(TMP10, TMP14, TMP10);
1892 vis_padd16(TMP8, TMP30, TMP8);
1894 vis_padd16(TMP10, TMP32, TMP10);
1895 vis_pack16(TMP8, DST_0);
1897 vis_pack16(TMP10, DST_1);
1898 vis_st64(DST_0, dest[0]);
1900 vis_padd16(REF_0, TMP4, REF_0);
1902 vis_mul8x16al(DST_2, CONST_1024, TMP30);
1903 vis_padd16(REF_2, TMP6, REF_2);
1905 vis_mul8x16al(DST_3, CONST_1024, TMP32);
1906 vis_padd16(REF_0, REF_4, REF_0);
1908 vis_padd16(REF_2, REF_6, REF_2);
1910 vis_padd16(REF_0, TMP30, REF_0);
1914 vis_padd16(REF_2, TMP32, REF_2);
1915 vis_pack16(REF_0, DST_2);
1917 vis_pack16(REF_2, DST_3);
1918 vis_st64_2(DST_2, dest, 8);
1923 static void MC_avg_xy_8_vis (uint8_t * dest, const uint8_t * _ref,
1924 const int stride, int height)
1926 uint8_t *ref = (uint8_t *) _ref;
1927 unsigned long off = (unsigned long) ref & 0x7;
1928 unsigned long off_plus_1 = off + 1;
1929 int stride_8 = stride + 8;
1931 vis_set_gsr(4 << VIS_GSR_SCALEFACT_SHIFT);
1933 ref = vis_alignaddr(ref);
1935 vis_ld64(ref[0], TMP0);
1938 vis_ld64_2(ref, 8, TMP2);
1940 vis_ld64(constants6[0], CONST_6);
1942 vis_ld64(constants256_1024[0], CONST_256);
1943 vis_faligndata(TMP0, TMP2, REF_S0);
1946 vis_alignaddr_g0((void *)off_plus_1);
1947 vis_faligndata(TMP0, TMP2, REF_S2);
1949 vis_src1(TMP2, REF_S2);
1953 do { /* 31 cycles */
1954 vis_ld64_2(ref, stride, TMP0);
1955 vis_mul8x16au(REF_S0, CONST_256, TMP8);
1956 vis_pmerge(ZERO, REF_S0_1, TMP10);
1958 vis_ld64_2(ref, stride_8, TMP2);
1960 vis_mul8x16au(REF_S2, CONST_256, TMP12);
1961 vis_pmerge(ZERO, REF_S2_1, TMP14);
1963 vis_alignaddr_g0((void *)off);
1965 vis_ld64_2(ref, stride, TMP4);
1966 vis_faligndata(TMP0, TMP2, REF_S4);
1968 vis_ld64_2(ref, stride_8, TMP6);
1971 vis_ld64(dest[0], DST_0);
1972 vis_faligndata(TMP4, TMP6, REF_S0);
1974 vis_ld64_2(dest, stride, DST_2);
1977 vis_alignaddr_g0((void *)off_plus_1);
1978 vis_faligndata(TMP0, TMP2, REF_S6);
1979 vis_faligndata(TMP4, TMP6, REF_S2);
1981 vis_src1(TMP2, REF_S6);
1982 vis_src1(TMP6, REF_S2);
1985 vis_mul8x16al(DST_0, CONST_1024, TMP30);
1986 vis_pmerge(ZERO, REF_S4, TMP22);
1988 vis_mul8x16al(DST_1, CONST_1024, TMP32);
1989 vis_pmerge(ZERO, REF_S4_1, TMP24);
1991 vis_mul8x16au(REF_S6, CONST_256, TMP26);
1992 vis_pmerge(ZERO, REF_S6_1, TMP28);
1994 vis_mul8x16au(REF_S0, CONST_256, REF_S4);
1995 vis_padd16(TMP22, CONST_6, TMP22);
1997 vis_mul8x16au(REF_S0_1, CONST_256, REF_S6);
1998 vis_padd16(TMP24, CONST_6, TMP24);
2000 vis_mul8x16al(DST_2, CONST_1024, REF_0);
2001 vis_padd16(TMP22, TMP26, TMP22);
2003 vis_mul8x16al(DST_3, CONST_1024, REF_2);
2004 vis_padd16(TMP24, TMP28, TMP24);
2006 vis_mul8x16au(REF_S2, CONST_256, TMP26);
2007 vis_padd16(TMP8, TMP22, TMP8);
2009 vis_mul8x16au(REF_S2_1, CONST_256, TMP28);
2010 vis_padd16(TMP10, TMP24, TMP10);
2012 vis_padd16(TMP8, TMP12, TMP8);
2014 vis_padd16(TMP10, TMP14, TMP10);
2016 vis_padd16(TMP8, TMP30, TMP8);
2018 vis_padd16(TMP10, TMP32, TMP10);
2019 vis_pack16(TMP8, DST_0);
2021 vis_pack16(TMP10, DST_1);
2022 vis_st64(DST_0, dest[0]);
2025 vis_padd16(REF_S4, TMP22, TMP12);
2027 vis_padd16(REF_S6, TMP24, TMP14);
2029 vis_padd16(TMP12, TMP26, TMP12);
2031 vis_padd16(TMP14, TMP28, TMP14);
2033 vis_padd16(TMP12, REF_0, TMP12);
2035 vis_padd16(TMP14, REF_2, TMP14);
2036 vis_pack16(TMP12, DST_2);
2038 vis_pack16(TMP14, DST_3);
2039 vis_st64(DST_2, dest[0]);
2044 /* End of rounding code */
2046 /* Start of no rounding code */
2047 /* The trick used in some of this file is the formula from the MMX
2048 * motion comp code, which is:
2050 * (x+y)>>1 == (x&y)+((x^y)>>1)
2052 * This allows us to average 8 bytes at a time in a 64-bit FPU reg.
2053 * We avoid overflows by masking before we do the shift, and we
2054 * implement the shift by multiplying by 1/2 using mul8x16. So in
2055 * VIS this is (assume 'x' is in f0, 'y' is in f2, a repeating mask
2056 * of '0xfe' is in f4, a repeating mask of '0x7f' is in f6, and
2057 * the value 0x80808080 is in f8):
2061 * fmul8x16 f8, f10, f10
2064 * fpadd16 f12, f10, f10
2067 static void MC_put_no_round_o_16_vis (uint8_t * dest, const uint8_t * _ref,
2068 const int stride, int height)
2070 uint8_t *ref = (uint8_t *) _ref;
2072 ref = vis_alignaddr(ref);
2074 vis_ld64(ref[0], TMP0);
2076 vis_ld64_2(ref, 8, TMP2);
2078 vis_ld64_2(ref, 16, TMP4);
2081 vis_faligndata(TMP0, TMP2, REF_0);
2082 vis_st64(REF_0, dest[0]);
2084 vis_faligndata(TMP2, TMP4, REF_2);
2085 vis_st64_2(REF_2, dest, 8);
2090 static void MC_put_no_round_o_8_vis (uint8_t * dest, const uint8_t * _ref,
2091 const int stride, int height)
2093 uint8_t *ref = (uint8_t *) _ref;
2095 ref = vis_alignaddr(ref);
2097 vis_ld64(ref[0], TMP0);
2099 vis_ld64(ref[8], TMP2);
2104 vis_faligndata(TMP0, TMP2, REF_0);
2105 vis_st64(REF_0, dest[0]);
2111 static void MC_avg_no_round_o_16_vis (uint8_t * dest, const uint8_t * _ref,
2112 const int stride, int height)
2114 uint8_t *ref = (uint8_t *) _ref;
2115 int stride_8 = stride + 8;
2117 ref = vis_alignaddr(ref);
2119 vis_ld64(ref[0], TMP0);
2121 vis_ld64(ref[8], TMP2);
2123 vis_ld64(ref[16], TMP4);
2125 vis_ld64(dest[0], DST_0);
2127 vis_ld64(dest[8], DST_2);
2129 vis_ld64(constants_fe[0], MASK_fe);
2130 vis_faligndata(TMP0, TMP2, REF_0);
2132 vis_ld64(constants_7f[0], MASK_7f);
2133 vis_faligndata(TMP2, TMP4, REF_2);
2135 vis_ld64(constants128[0], CONST_128);
2138 height = (height >> 1) - 1;
2140 do { /* 24 cycles */
2141 vis_ld64(ref[0], TMP0);
2142 vis_xor(DST_0, REF_0, TMP6);
2144 vis_ld64_2(ref, 8, TMP2);
2145 vis_and(TMP6, MASK_fe, TMP6);
2147 vis_ld64_2(ref, 16, TMP4);
2149 vis_mul8x16(CONST_128, TMP6, TMP6);
2150 vis_xor(DST_2, REF_2, TMP8);
2152 vis_and(TMP8, MASK_fe, TMP8);
2154 vis_and(DST_0, REF_0, TMP10);
2155 vis_ld64_2(dest, stride, DST_0);
2156 vis_mul8x16(CONST_128, TMP8, TMP8);
2158 vis_and(DST_2, REF_2, TMP12);
2159 vis_ld64_2(dest, stride_8, DST_2);
2161 vis_ld64(ref[0], TMP14);
2162 vis_and(TMP6, MASK_7f, TMP6);
2164 vis_and(TMP8, MASK_7f, TMP8);
2166 vis_padd16(TMP10, TMP6, TMP6);
2167 vis_st64(TMP6, dest[0]);
2169 vis_padd16(TMP12, TMP8, TMP8);
2170 vis_st64_2(TMP8, dest, 8);
2173 vis_ld64_2(ref, 8, TMP16);
2174 vis_faligndata(TMP0, TMP2, REF_0);
2176 vis_ld64_2(ref, 16, TMP18);
2177 vis_faligndata(TMP2, TMP4, REF_2);
2180 vis_xor(DST_0, REF_0, TMP20);
2182 vis_and(TMP20, MASK_fe, TMP20);
2184 vis_xor(DST_2, REF_2, TMP22);
2185 vis_mul8x16(CONST_128, TMP20, TMP20);
2187 vis_and(TMP22, MASK_fe, TMP22);
2189 vis_and(DST_0, REF_0, TMP24);
2190 vis_mul8x16(CONST_128, TMP22, TMP22);
2192 vis_and(DST_2, REF_2, TMP26);
2194 vis_ld64_2(dest, stride, DST_0);
2195 vis_faligndata(TMP14, TMP16, REF_0);
2197 vis_ld64_2(dest, stride_8, DST_2);
2198 vis_faligndata(TMP16, TMP18, REF_2);
2200 vis_and(TMP20, MASK_7f, TMP20);
2202 vis_and(TMP22, MASK_7f, TMP22);
2204 vis_padd16(TMP24, TMP20, TMP20);
2205 vis_st64(TMP20, dest[0]);
2207 vis_padd16(TMP26, TMP22, TMP22);
2208 vis_st64_2(TMP22, dest, 8);
2212 vis_ld64(ref[0], TMP0);
2213 vis_xor(DST_0, REF_0, TMP6);
2215 vis_ld64_2(ref, 8, TMP2);
2216 vis_and(TMP6, MASK_fe, TMP6);
2218 vis_ld64_2(ref, 16, TMP4);
2219 vis_mul8x16(CONST_128, TMP6, TMP6);
2220 vis_xor(DST_2, REF_2, TMP8);
2222 vis_and(TMP8, MASK_fe, TMP8);
2224 vis_and(DST_0, REF_0, TMP10);
2225 vis_ld64_2(dest, stride, DST_0);
2226 vis_mul8x16(CONST_128, TMP8, TMP8);
2228 vis_and(DST_2, REF_2, TMP12);
2229 vis_ld64_2(dest, stride_8, DST_2);
2231 vis_ld64(ref[0], TMP14);
2232 vis_and(TMP6, MASK_7f, TMP6);
2234 vis_and(TMP8, MASK_7f, TMP8);
2236 vis_padd16(TMP10, TMP6, TMP6);
2237 vis_st64(TMP6, dest[0]);
2239 vis_padd16(TMP12, TMP8, TMP8);
2240 vis_st64_2(TMP8, dest, 8);
2243 vis_faligndata(TMP0, TMP2, REF_0);
2245 vis_faligndata(TMP2, TMP4, REF_2);
2247 vis_xor(DST_0, REF_0, TMP20);
2249 vis_and(TMP20, MASK_fe, TMP20);
2251 vis_xor(DST_2, REF_2, TMP22);
2252 vis_mul8x16(CONST_128, TMP20, TMP20);
2254 vis_and(TMP22, MASK_fe, TMP22);
2256 vis_and(DST_0, REF_0, TMP24);
2257 vis_mul8x16(CONST_128, TMP22, TMP22);
2259 vis_and(DST_2, REF_2, TMP26);
2261 vis_and(TMP20, MASK_7f, TMP20);
2263 vis_and(TMP22, MASK_7f, TMP22);
2265 vis_padd16(TMP24, TMP20, TMP20);
2266 vis_st64(TMP20, dest[0]);
2268 vis_padd16(TMP26, TMP22, TMP22);
2269 vis_st64_2(TMP22, dest, 8);
2272 static void MC_avg_no_round_o_8_vis (uint8_t * dest, const uint8_t * _ref,
2273 const int stride, int height)
2275 uint8_t *ref = (uint8_t *) _ref;
2277 ref = vis_alignaddr(ref);
2279 vis_ld64(ref[0], TMP0);
2281 vis_ld64(ref[8], TMP2);
2283 vis_ld64(dest[0], DST_0);
2285 vis_ld64(constants_fe[0], MASK_fe);
2287 vis_ld64(constants_7f[0], MASK_7f);
2288 vis_faligndata(TMP0, TMP2, REF_0);
2290 vis_ld64(constants128[0], CONST_128);
2293 height = (height >> 1) - 1;
2295 do { /* 12 cycles */
2296 vis_ld64(ref[0], TMP0);
2297 vis_xor(DST_0, REF_0, TMP4);
2299 vis_ld64(ref[8], TMP2);
2300 vis_and(TMP4, MASK_fe, TMP4);
2302 vis_and(DST_0, REF_0, TMP6);
2303 vis_ld64_2(dest, stride, DST_0);
2305 vis_mul8x16(CONST_128, TMP4, TMP4);
2307 vis_ld64(ref[0], TMP12);
2308 vis_faligndata(TMP0, TMP2, REF_0);
2310 vis_ld64(ref[8], TMP2);
2311 vis_xor(DST_0, REF_0, TMP0);
2314 vis_and(TMP0, MASK_fe, TMP0);
2316 vis_and(TMP4, MASK_7f, TMP4);
2318 vis_padd16(TMP6, TMP4, TMP4);
2319 vis_st64(TMP4, dest[0]);
2321 vis_mul8x16(CONST_128, TMP0, TMP0);
2323 vis_and(DST_0, REF_0, TMP6);
2324 vis_ld64_2(dest, stride, DST_0);
2326 vis_faligndata(TMP12, TMP2, REF_0);
2328 vis_and(TMP0, MASK_7f, TMP0);
2330 vis_padd16(TMP6, TMP0, TMP4);
2331 vis_st64(TMP4, dest[0]);
2335 vis_ld64(ref[0], TMP0);
2336 vis_xor(DST_0, REF_0, TMP4);
2338 vis_ld64(ref[8], TMP2);
2339 vis_and(TMP4, MASK_fe, TMP4);
2341 vis_and(DST_0, REF_0, TMP6);
2342 vis_ld64_2(dest, stride, DST_0);
2343 vis_mul8x16(CONST_128, TMP4, TMP4);
2345 vis_faligndata(TMP0, TMP2, REF_0);
2347 vis_xor(DST_0, REF_0, TMP0);
2349 vis_and(TMP0, MASK_fe, TMP0);
2351 vis_and(TMP4, MASK_7f, TMP4);
2353 vis_padd16(TMP6, TMP4, TMP4);
2354 vis_st64(TMP4, dest[0]);
2356 vis_mul8x16(CONST_128, TMP0, TMP0);
2358 vis_and(DST_0, REF_0, TMP6);
2360 vis_and(TMP0, MASK_7f, TMP0);
2362 vis_padd16(TMP6, TMP0, TMP4);
2363 vis_st64(TMP4, dest[0]);
2366 static void MC_put_no_round_x_16_vis (uint8_t * dest, const uint8_t * _ref,
2367 const int stride, int height)
2369 uint8_t *ref = (uint8_t *) _ref;
2370 unsigned long off = (unsigned long) ref & 0x7;
2371 unsigned long off_plus_1 = off + 1;
2373 ref = vis_alignaddr(ref);
2375 vis_ld64(ref[0], TMP0);
2377 vis_ld64_2(ref, 8, TMP2);
2379 vis_ld64_2(ref, 16, TMP4);
2381 vis_ld64(constants_fe[0], MASK_fe);
2383 vis_ld64(constants_7f[0], MASK_7f);
2384 vis_faligndata(TMP0, TMP2, REF_0);
2386 vis_ld64(constants128[0], CONST_128);
2387 vis_faligndata(TMP2, TMP4, REF_4);
2390 vis_alignaddr_g0((void *)off_plus_1);
2391 vis_faligndata(TMP0, TMP2, REF_2);
2392 vis_faligndata(TMP2, TMP4, REF_6);
2394 vis_src1(TMP2, REF_2);
2395 vis_src1(TMP4, REF_6);
2399 height = (height >> 1) - 1;
2401 do { /* 34 cycles */
2402 vis_ld64(ref[0], TMP0);
2403 vis_xor(REF_0, REF_2, TMP6);
2405 vis_ld64_2(ref, 8, TMP2);
2406 vis_xor(REF_4, REF_6, TMP8);
2408 vis_ld64_2(ref, 16, TMP4);
2409 vis_and(TMP6, MASK_fe, TMP6);
2412 vis_ld64(ref[0], TMP14);
2413 vis_mul8x16(CONST_128, TMP6, TMP6);
2414 vis_and(TMP8, MASK_fe, TMP8);
2416 vis_ld64_2(ref, 8, TMP16);
2417 vis_mul8x16(CONST_128, TMP8, TMP8);
2418 vis_and(REF_0, REF_2, TMP10);
2420 vis_ld64_2(ref, 16, TMP18);
2422 vis_and(REF_4, REF_6, TMP12);
2424 vis_alignaddr_g0((void *)off);
2426 vis_faligndata(TMP0, TMP2, REF_0);
2428 vis_faligndata(TMP2, TMP4, REF_4);
2431 vis_alignaddr_g0((void *)off_plus_1);
2432 vis_faligndata(TMP0, TMP2, REF_2);
2433 vis_faligndata(TMP2, TMP4, REF_6);
2435 vis_src1(TMP2, REF_2);
2436 vis_src1(TMP4, REF_6);
2439 vis_and(TMP6, MASK_7f, TMP6);
2441 vis_and(TMP8, MASK_7f, TMP8);
2443 vis_padd16(TMP10, TMP6, TMP6);
2444 vis_st64(TMP6, dest[0]);
2446 vis_padd16(TMP12, TMP8, TMP8);
2447 vis_st64_2(TMP8, dest, 8);
2450 vis_xor(REF_0, REF_2, TMP6);
2452 vis_xor(REF_4, REF_6, TMP8);
2454 vis_and(TMP6, MASK_fe, TMP6);
2456 vis_mul8x16(CONST_128, TMP6, TMP6);
2457 vis_and(TMP8, MASK_fe, TMP8);
2459 vis_mul8x16(CONST_128, TMP8, TMP8);
2460 vis_and(REF_0, REF_2, TMP10);
2462 vis_and(REF_4, REF_6, TMP12);
2464 vis_alignaddr_g0((void *)off);
2466 vis_faligndata(TMP14, TMP16, REF_0);
2468 vis_faligndata(TMP16, TMP18, REF_4);
2471 vis_alignaddr_g0((void *)off_plus_1);
2472 vis_faligndata(TMP14, TMP16, REF_2);
2473 vis_faligndata(TMP16, TMP18, REF_6);
2475 vis_src1(TMP16, REF_2);
2476 vis_src1(TMP18, REF_6);
2479 vis_and(TMP6, MASK_7f, TMP6);
2481 vis_and(TMP8, MASK_7f, TMP8);
2483 vis_padd16(TMP10, TMP6, TMP6);
2484 vis_st64(TMP6, dest[0]);
2486 vis_padd16(TMP12, TMP8, TMP8);
2487 vis_st64_2(TMP8, dest, 8);
2491 vis_ld64(ref[0], TMP0);
2492 vis_xor(REF_0, REF_2, TMP6);
2494 vis_ld64_2(ref, 8, TMP2);
2495 vis_xor(REF_4, REF_6, TMP8);
2497 vis_ld64_2(ref, 16, TMP4);
2498 vis_and(TMP6, MASK_fe, TMP6);
2500 vis_mul8x16(CONST_128, TMP6, TMP6);
2501 vis_and(TMP8, MASK_fe, TMP8);
2503 vis_mul8x16(CONST_128, TMP8, TMP8);
2504 vis_and(REF_0, REF_2, TMP10);
2506 vis_and(REF_4, REF_6, TMP12);
2508 vis_alignaddr_g0((void *)off);
2510 vis_faligndata(TMP0, TMP2, REF_0);
2512 vis_faligndata(TMP2, TMP4, REF_4);
2515 vis_alignaddr_g0((void *)off_plus_1);
2516 vis_faligndata(TMP0, TMP2, REF_2);
2517 vis_faligndata(TMP2, TMP4, REF_6);
2519 vis_src1(TMP2, REF_2);
2520 vis_src1(TMP4, REF_6);
2523 vis_and(TMP6, MASK_7f, TMP6);
2525 vis_and(TMP8, MASK_7f, TMP8);
2527 vis_padd16(TMP10, TMP6, TMP6);
2528 vis_st64(TMP6, dest[0]);
2530 vis_padd16(TMP12, TMP8, TMP8);
2531 vis_st64_2(TMP8, dest, 8);
2534 vis_xor(REF_0, REF_2, TMP6);
2536 vis_xor(REF_4, REF_6, TMP8);
2538 vis_and(TMP6, MASK_fe, TMP6);
2540 vis_mul8x16(CONST_128, TMP6, TMP6);
2541 vis_and(TMP8, MASK_fe, TMP8);
2543 vis_mul8x16(CONST_128, TMP8, TMP8);
2544 vis_and(REF_0, REF_2, TMP10);
2546 vis_and(REF_4, REF_6, TMP12);
2548 vis_and(TMP6, MASK_7f, TMP6);
2550 vis_and(TMP8, MASK_7f, TMP8);
2552 vis_padd16(TMP10, TMP6, TMP6);
2553 vis_st64(TMP6, dest[0]);
2555 vis_padd16(TMP12, TMP8, TMP8);
2556 vis_st64_2(TMP8, dest, 8);
2559 static void MC_put_no_round_x_8_vis (uint8_t * dest, const uint8_t * _ref,
2560 const int stride, int height)
2562 uint8_t *ref = (uint8_t *) _ref;
2563 unsigned long off = (unsigned long) ref & 0x7;
2564 unsigned long off_plus_1 = off + 1;
2566 ref = vis_alignaddr(ref);
2568 vis_ld64(ref[0], TMP0);
2570 vis_ld64(ref[8], TMP2);
2572 vis_ld64(constants_fe[0], MASK_fe);
2574 vis_ld64(constants_7f[0], MASK_7f);
2576 vis_ld64(constants128[0], CONST_128);
2577 vis_faligndata(TMP0, TMP2, REF_0);
2580 vis_alignaddr_g0((void *)off_plus_1);
2581 vis_faligndata(TMP0, TMP2, REF_2);
2583 vis_src1(TMP2, REF_2);
2587 height = (height >> 1) - 1;
2589 do { /* 20 cycles */
2590 vis_ld64(ref[0], TMP0);
2591 vis_xor(REF_0, REF_2, TMP4);
2593 vis_ld64_2(ref, 8, TMP2);
2594 vis_and(TMP4, MASK_fe, TMP4);
2597 vis_ld64(ref[0], TMP8);
2598 vis_and(REF_0, REF_2, TMP6);
2599 vis_mul8x16(CONST_128, TMP4, TMP4);
2601 vis_alignaddr_g0((void *)off);
2603 vis_ld64_2(ref, 8, TMP10);
2605 vis_faligndata(TMP0, TMP2, REF_0);
2608 vis_alignaddr_g0((void *)off_plus_1);
2609 vis_faligndata(TMP0, TMP2, REF_2);
2611 vis_src1(TMP2, REF_2);
2614 vis_and(TMP4, MASK_7f, TMP4);
2616 vis_padd16(TMP6, TMP4, DST_0);
2617 vis_st64(DST_0, dest[0]);
2620 vis_xor(REF_0, REF_2, TMP12);
2622 vis_and(TMP12, MASK_fe, TMP12);
2624 vis_and(REF_0, REF_2, TMP14);
2625 vis_mul8x16(CONST_128, TMP12, TMP12);
2627 vis_alignaddr_g0((void *)off);
2628 vis_faligndata(TMP8, TMP10, REF_0);
2630 vis_alignaddr_g0((void *)off_plus_1);
2631 vis_faligndata(TMP8, TMP10, REF_2);
2633 vis_src1(TMP10, REF_2);
2636 vis_and(TMP12, MASK_7f, TMP12);
2638 vis_padd16(TMP14, TMP12, DST_0);
2639 vis_st64(DST_0, dest[0]);
2643 vis_ld64(ref[0], TMP0);
2644 vis_xor(REF_0, REF_2, TMP4);
2646 vis_ld64_2(ref, 8, TMP2);
2647 vis_and(TMP4, MASK_fe, TMP4);
2649 vis_and(REF_0, REF_2, TMP6);
2650 vis_mul8x16(CONST_128, TMP4, TMP4);
2652 vis_alignaddr_g0((void *)off);
2654 vis_faligndata(TMP0, TMP2, REF_0);
2657 vis_alignaddr_g0((void *)off_plus_1);
2658 vis_faligndata(TMP0, TMP2, REF_2);
2660 vis_src1(TMP2, REF_2);
2663 vis_and(TMP4, MASK_7f, TMP4);
2665 vis_padd16(TMP6, TMP4, DST_0);
2666 vis_st64(DST_0, dest[0]);
2669 vis_xor(REF_0, REF_2, TMP12);
2671 vis_and(TMP12, MASK_fe, TMP12);
2673 vis_and(REF_0, REF_2, TMP14);
2674 vis_mul8x16(CONST_128, TMP12, TMP12);
2676 vis_and(TMP12, MASK_7f, TMP12);
2678 vis_padd16(TMP14, TMP12, DST_0);
2679 vis_st64(DST_0, dest[0]);
2683 static void MC_avg_no_round_x_16_vis (uint8_t * dest, const uint8_t * _ref,
2684 const int stride, int height)
2686 uint8_t *ref = (uint8_t *) _ref;
2687 unsigned long off = (unsigned long) ref & 0x7;
2688 unsigned long off_plus_1 = off + 1;
2690 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
2692 vis_ld64(constants3[0], CONST_3);
2694 vis_ld64(constants256_512[0], CONST_256);
2696 ref = vis_alignaddr(ref);
2697 do { /* 26 cycles */
2698 vis_ld64(ref[0], TMP0);
2700 vis_ld64(ref[8], TMP2);
2702 vis_alignaddr_g0((void *)off);
2704 vis_ld64(ref[16], TMP4);
2706 vis_ld64(dest[0], DST_0);
2707 vis_faligndata(TMP0, TMP2, REF_0);
2709 vis_ld64(dest[8], DST_2);
2710 vis_faligndata(TMP2, TMP4, REF_4);
2713 vis_alignaddr_g0((void *)off_plus_1);
2714 vis_faligndata(TMP0, TMP2, REF_2);
2715 vis_faligndata(TMP2, TMP4, REF_6);
2717 vis_src1(TMP2, REF_2);
2718 vis_src1(TMP4, REF_6);
2721 vis_mul8x16au(REF_0, CONST_256, TMP0);
2723 vis_pmerge(ZERO, REF_2, TMP4);
2724 vis_mul8x16au(REF_0_1, CONST_256, TMP2);
2726 vis_pmerge(ZERO, REF_2_1, TMP6);
2728 vis_padd16(TMP0, TMP4, TMP0);
2730 vis_mul8x16al(DST_0, CONST_512, TMP4);
2731 vis_padd16(TMP2, TMP6, TMP2);
2733 vis_mul8x16al(DST_1, CONST_512, TMP6);
2735 vis_mul8x16au(REF_6, CONST_256, TMP12);
2737 vis_padd16(TMP0, TMP4, TMP0);
2738 vis_mul8x16au(REF_6_1, CONST_256, TMP14);
2740 vis_padd16(TMP2, TMP6, TMP2);
2741 vis_mul8x16au(REF_4, CONST_256, TMP16);
2743 vis_padd16(TMP0, CONST_3, TMP8);
2744 vis_mul8x16au(REF_4_1, CONST_256, TMP18);
2746 vis_padd16(TMP2, CONST_3, TMP10);
2747 vis_pack16(TMP8, DST_0);
2749 vis_pack16(TMP10, DST_1);
2750 vis_padd16(TMP16, TMP12, TMP0);
2752 vis_st64(DST_0, dest[0]);
2753 vis_mul8x16al(DST_2, CONST_512, TMP4);
2754 vis_padd16(TMP18, TMP14, TMP2);
2756 vis_mul8x16al(DST_3, CONST_512, TMP6);
2757 vis_padd16(TMP0, CONST_3, TMP0);
2759 vis_padd16(TMP2, CONST_3, TMP2);
2761 vis_padd16(TMP0, TMP4, TMP0);
2763 vis_padd16(TMP2, TMP6, TMP2);
2764 vis_pack16(TMP0, DST_2);
2766 vis_pack16(TMP2, DST_3);
2767 vis_st64(DST_2, dest[8]);
2774 static void MC_avg_no_round_x_8_vis (uint8_t * dest, const uint8_t * _ref,
2775 const int stride, int height)
2777 uint8_t *ref = (uint8_t *) _ref;
2778 unsigned long off = (unsigned long) ref & 0x7;
2779 unsigned long off_plus_1 = off + 1;
2780 int stride_times_2 = stride << 1;
2782 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
2784 vis_ld64(constants3[0], CONST_3);
2786 vis_ld64(constants256_512[0], CONST_256);
2788 ref = vis_alignaddr(ref);
2790 do { /* 47 cycles */
2791 vis_ld64(ref[0], TMP0);
2793 vis_ld64_2(ref, 8, TMP2);
2796 vis_alignaddr_g0((void *)off);
2798 vis_ld64(ref[0], TMP4);
2799 vis_faligndata(TMP0, TMP2, REF_0);
2801 vis_ld64_2(ref, 8, TMP6);
2804 vis_ld64(ref[0], TMP8);
2806 vis_ld64_2(ref, 8, TMP10);
2808 vis_faligndata(TMP4, TMP6, REF_4);
2810 vis_ld64(ref[0], TMP12);
2812 vis_ld64_2(ref, 8, TMP14);
2814 vis_faligndata(TMP8, TMP10, REF_S0);
2816 vis_faligndata(TMP12, TMP14, REF_S4);
2819 vis_alignaddr_g0((void *)off_plus_1);
2821 vis_ld64(dest[0], DST_0);
2822 vis_faligndata(TMP0, TMP2, REF_2);
2824 vis_ld64_2(dest, stride, DST_2);
2825 vis_faligndata(TMP4, TMP6, REF_6);
2827 vis_faligndata(TMP8, TMP10, REF_S2);
2829 vis_faligndata(TMP12, TMP14, REF_S6);
2831 vis_ld64(dest[0], DST_0);
2832 vis_src1(TMP2, REF_2);
2834 vis_ld64_2(dest, stride, DST_2);
2835 vis_src1(TMP6, REF_6);
2837 vis_src1(TMP10, REF_S2);
2839 vis_src1(TMP14, REF_S6);
2842 vis_pmerge(ZERO, REF_0, TMP0);
2843 vis_mul8x16au(REF_0_1, CONST_256, TMP2);
2845 vis_pmerge(ZERO, REF_2, TMP4);
2846 vis_mul8x16au(REF_2_1, CONST_256, TMP6);
2848 vis_padd16(TMP0, CONST_3, TMP0);
2849 vis_mul8x16al(DST_0, CONST_512, TMP16);
2851 vis_padd16(TMP2, CONST_3, TMP2);
2852 vis_mul8x16al(DST_1, CONST_512, TMP18);
2854 vis_padd16(TMP0, TMP4, TMP0);
2855 vis_mul8x16au(REF_4, CONST_256, TMP8);
2857 vis_padd16(TMP2, TMP6, TMP2);
2858 vis_mul8x16au(REF_4_1, CONST_256, TMP10);
2860 vis_padd16(TMP0, TMP16, TMP0);
2861 vis_mul8x16au(REF_6, CONST_256, TMP12);
2863 vis_padd16(TMP2, TMP18, TMP2);
2864 vis_mul8x16au(REF_6_1, CONST_256, TMP14);
2866 vis_padd16(TMP8, CONST_3, TMP8);
2867 vis_mul8x16al(DST_2, CONST_512, TMP16);
2869 vis_padd16(TMP8, TMP12, TMP8);
2870 vis_mul8x16al(DST_3, CONST_512, TMP18);
2872 vis_padd16(TMP10, TMP14, TMP10);
2873 vis_pack16(TMP0, DST_0);
2875 vis_pack16(TMP2, DST_1);
2876 vis_st64(DST_0, dest[0]);
2878 vis_padd16(TMP10, CONST_3, TMP10);
2880 vis_ld64_2(dest, stride, DST_0);
2881 vis_padd16(TMP8, TMP16, TMP8);
2883 vis_ld64_2(dest, stride_times_2, TMP4/*DST_2*/);
2884 vis_padd16(TMP10, TMP18, TMP10);
2885 vis_pack16(TMP8, DST_2);
2887 vis_pack16(TMP10, DST_3);
2888 vis_st64(DST_2, dest[0]);
2891 vis_mul8x16au(REF_S0_1, CONST_256, TMP2);
2892 vis_pmerge(ZERO, REF_S0, TMP0);
2894 vis_pmerge(ZERO, REF_S2, TMP24);
2895 vis_mul8x16au(REF_S2_1, CONST_256, TMP6);
2897 vis_padd16(TMP0, CONST_3, TMP0);
2898 vis_mul8x16au(REF_S4, CONST_256, TMP8);
2900 vis_padd16(TMP2, CONST_3, TMP2);
2901 vis_mul8x16au(REF_S4_1, CONST_256, TMP10);
2903 vis_padd16(TMP0, TMP24, TMP0);
2904 vis_mul8x16au(REF_S6, CONST_256, TMP12);
2906 vis_padd16(TMP2, TMP6, TMP2);
2907 vis_mul8x16au(REF_S6_1, CONST_256, TMP14);
2909 vis_padd16(TMP8, CONST_3, TMP8);
2910 vis_mul8x16al(DST_0, CONST_512, TMP16);
2912 vis_padd16(TMP10, CONST_3, TMP10);
2913 vis_mul8x16al(DST_1, CONST_512, TMP18);
2915 vis_padd16(TMP8, TMP12, TMP8);
2916 vis_mul8x16al(TMP4/*DST_2*/, CONST_512, TMP20);
2918 vis_mul8x16al(TMP5/*DST_3*/, CONST_512, TMP22);
2919 vis_padd16(TMP0, TMP16, TMP0);
2921 vis_padd16(TMP2, TMP18, TMP2);
2922 vis_pack16(TMP0, DST_0);
2924 vis_padd16(TMP10, TMP14, TMP10);
2925 vis_pack16(TMP2, DST_1);
2926 vis_st64(DST_0, dest[0]);
2929 vis_padd16(TMP8, TMP20, TMP8);
2931 vis_padd16(TMP10, TMP22, TMP10);
2932 vis_pack16(TMP8, DST_2);
2934 vis_pack16(TMP10, DST_3);
2935 vis_st64(DST_2, dest[0]);
2940 static void MC_put_no_round_y_16_vis (uint8_t * dest, const uint8_t * _ref,
2941 const int stride, int height)
2943 uint8_t *ref = (uint8_t *) _ref;
2945 ref = vis_alignaddr(ref);
2946 vis_ld64(ref[0], TMP0);
2948 vis_ld64_2(ref, 8, TMP2);
2950 vis_ld64_2(ref, 16, TMP4);
2953 vis_ld64(ref[0], TMP6);
2954 vis_faligndata(TMP0, TMP2, REF_0);
2956 vis_ld64_2(ref, 8, TMP8);
2957 vis_faligndata(TMP2, TMP4, REF_4);
2959 vis_ld64_2(ref, 16, TMP10);
2962 vis_ld64(constants_fe[0], MASK_fe);
2963 vis_faligndata(TMP6, TMP8, REF_2);
2965 vis_ld64(constants_7f[0], MASK_7f);
2966 vis_faligndata(TMP8, TMP10, REF_6);
2968 vis_ld64(constants128[0], CONST_128);
2969 height = (height >> 1) - 1;
2970 do { /* 24 cycles */
2971 vis_ld64(ref[0], TMP0);
2972 vis_xor(REF_0, REF_2, TMP12);
2974 vis_ld64_2(ref, 8, TMP2);
2975 vis_xor(REF_4, REF_6, TMP16);
2977 vis_ld64_2(ref, 16, TMP4);
2979 vis_and(REF_0, REF_2, TMP14);
2981 vis_ld64(ref[0], TMP6);
2982 vis_and(REF_4, REF_6, TMP18);
2984 vis_ld64_2(ref, 8, TMP8);
2985 vis_faligndata(TMP0, TMP2, REF_0);
2987 vis_ld64_2(ref, 16, TMP10);
2989 vis_faligndata(TMP2, TMP4, REF_4);
2991 vis_and(TMP12, MASK_fe, TMP12);
2993 vis_and(TMP16, MASK_fe, TMP16);
2994 vis_mul8x16(CONST_128, TMP12, TMP12);
2996 vis_mul8x16(CONST_128, TMP16, TMP16);
2997 vis_xor(REF_0, REF_2, TMP0);
2999 vis_xor(REF_4, REF_6, TMP2);
3001 vis_and(REF_0, REF_2, TMP20);
3003 vis_and(TMP12, MASK_7f, TMP12);
3005 vis_and(TMP16, MASK_7f, TMP16);
3007 vis_padd16(TMP14, TMP12, TMP12);
3008 vis_st64(TMP12, dest[0]);
3010 vis_padd16(TMP18, TMP16, TMP16);
3011 vis_st64_2(TMP16, dest, 8);
3014 vis_and(REF_4, REF_6, TMP18);
3016 vis_and(TMP0, MASK_fe, TMP0);
3018 vis_and(TMP2, MASK_fe, TMP2);
3019 vis_mul8x16(CONST_128, TMP0, TMP0);
3021 vis_faligndata(TMP6, TMP8, REF_2);
3022 vis_mul8x16(CONST_128, TMP2, TMP2);
3024 vis_faligndata(TMP8, TMP10, REF_6);
3026 vis_and(TMP0, MASK_7f, TMP0);
3028 vis_and(TMP2, MASK_7f, TMP2);
3030 vis_padd16(TMP20, TMP0, TMP0);
3031 vis_st64(TMP0, dest[0]);
3033 vis_padd16(TMP18, TMP2, TMP2);
3034 vis_st64_2(TMP2, dest, 8);
3038 vis_ld64(ref[0], TMP0);
3039 vis_xor(REF_0, REF_2, TMP12);
3041 vis_ld64_2(ref, 8, TMP2);
3042 vis_xor(REF_4, REF_6, TMP16);
3044 vis_ld64_2(ref, 16, TMP4);
3045 vis_and(REF_0, REF_2, TMP14);
3047 vis_and(REF_4, REF_6, TMP18);
3049 vis_faligndata(TMP0, TMP2, REF_0);
3051 vis_faligndata(TMP2, TMP4, REF_4);
3053 vis_and(TMP12, MASK_fe, TMP12);
3055 vis_and(TMP16, MASK_fe, TMP16);
3056 vis_mul8x16(CONST_128, TMP12, TMP12);
3058 vis_mul8x16(CONST_128, TMP16, TMP16);
3059 vis_xor(REF_0, REF_2, TMP0);
3061 vis_xor(REF_4, REF_6, TMP2);
3063 vis_and(REF_0, REF_2, TMP20);
3065 vis_and(TMP12, MASK_7f, TMP12);
3067 vis_and(TMP16, MASK_7f, TMP16);
3069 vis_padd16(TMP14, TMP12, TMP12);
3070 vis_st64(TMP12, dest[0]);
3072 vis_padd16(TMP18, TMP16, TMP16);
3073 vis_st64_2(TMP16, dest, 8);
3076 vis_and(REF_4, REF_6, TMP18);
3078 vis_and(TMP0, MASK_fe, TMP0);
3080 vis_and(TMP2, MASK_fe, TMP2);
3081 vis_mul8x16(CONST_128, TMP0, TMP0);
3083 vis_mul8x16(CONST_128, TMP2, TMP2);
3085 vis_and(TMP0, MASK_7f, TMP0);
3087 vis_and(TMP2, MASK_7f, TMP2);
3089 vis_padd16(TMP20, TMP0, TMP0);
3090 vis_st64(TMP0, dest[0]);
3092 vis_padd16(TMP18, TMP2, TMP2);
3093 vis_st64_2(TMP2, dest, 8);
3096 static void MC_put_no_round_y_8_vis (uint8_t * dest, const uint8_t * _ref,
3097 const int stride, int height)
3099 uint8_t *ref = (uint8_t *) _ref;
3101 ref = vis_alignaddr(ref);
3102 vis_ld64(ref[0], TMP0);
3104 vis_ld64_2(ref, 8, TMP2);
3107 vis_ld64(ref[0], TMP4);
3109 vis_ld64_2(ref, 8, TMP6);
3112 vis_ld64(constants_fe[0], MASK_fe);
3113 vis_faligndata(TMP0, TMP2, REF_0);
3115 vis_ld64(constants_7f[0], MASK_7f);
3116 vis_faligndata(TMP4, TMP6, REF_2);
3118 vis_ld64(constants128[0], CONST_128);
3119 height = (height >> 1) - 1;
3120 do { /* 12 cycles */
3121 vis_ld64(ref[0], TMP0);
3122 vis_xor(REF_0, REF_2, TMP4);
3124 vis_ld64_2(ref, 8, TMP2);
3126 vis_and(TMP4, MASK_fe, TMP4);
3128 vis_and(REF_0, REF_2, TMP6);
3129 vis_mul8x16(CONST_128, TMP4, TMP4);
3131 vis_faligndata(TMP0, TMP2, REF_0);
3132 vis_ld64(ref[0], TMP0);
3134 vis_ld64_2(ref, 8, TMP2);
3136 vis_xor(REF_0, REF_2, TMP12);
3138 vis_and(TMP4, MASK_7f, TMP4);
3140 vis_and(TMP12, MASK_fe, TMP12);
3142 vis_mul8x16(CONST_128, TMP12, TMP12);
3143 vis_and(REF_0, REF_2, TMP14);
3145 vis_padd16(TMP6, TMP4, DST_0);
3146 vis_st64(DST_0, dest[0]);
3149 vis_faligndata(TMP0, TMP2, REF_2);
3151 vis_and(TMP12, MASK_7f, TMP12);
3153 vis_padd16(TMP14, TMP12, DST_0);
3154 vis_st64(DST_0, dest[0]);
3158 vis_ld64(ref[0], TMP0);
3159 vis_xor(REF_0, REF_2, TMP4);
3161 vis_ld64_2(ref, 8, TMP2);
3162 vis_and(TMP4, MASK_fe, TMP4);
3164 vis_and(REF_0, REF_2, TMP6);
3165 vis_mul8x16(CONST_128, TMP4, TMP4);
3167 vis_faligndata(TMP0, TMP2, REF_0);
3169 vis_xor(REF_0, REF_2, TMP12);
3171 vis_and(TMP4, MASK_7f, TMP4);
3173 vis_and(TMP12, MASK_fe, TMP12);
3175 vis_mul8x16(CONST_128, TMP12, TMP12);
3176 vis_and(REF_0, REF_2, TMP14);
3178 vis_padd16(TMP6, TMP4, DST_0);
3179 vis_st64(DST_0, dest[0]);
3182 vis_and(TMP12, MASK_7f, TMP12);
3184 vis_padd16(TMP14, TMP12, DST_0);
3185 vis_st64(DST_0, dest[0]);
3188 static void MC_avg_no_round_y_16_vis (uint8_t * dest, const uint8_t * _ref,
3189 const int stride, int height)
3191 uint8_t *ref = (uint8_t *) _ref;
3192 int stride_8 = stride + 8;
3193 int stride_16 = stride + 16;
3195 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
3197 ref = vis_alignaddr(ref);
3199 vis_ld64(ref[ 0], TMP0);
3202 vis_ld64(ref[ 8], TMP2);
3204 vis_ld64(ref[16], TMP4);
3206 vis_ld64(constants3[0], CONST_3);
3207 vis_faligndata(TMP0, TMP2, REF_2);
3209 vis_ld64(constants256_512[0], CONST_256);
3210 vis_faligndata(TMP2, TMP4, REF_6);
3213 do { /* 31 cycles */
3214 vis_ld64_2(ref, stride, TMP0);
3215 vis_pmerge(ZERO, REF_2, TMP12);
3216 vis_mul8x16au(REF_2_1, CONST_256, TMP14);
3218 vis_ld64_2(ref, stride_8, TMP2);
3219 vis_pmerge(ZERO, REF_6, TMP16);
3220 vis_mul8x16au(REF_6_1, CONST_256, TMP18);
3222 vis_ld64_2(ref, stride_16, TMP4);
3225 vis_ld64(dest[0], DST_0);
3226 vis_faligndata(TMP0, TMP2, REF_0);
3228 vis_ld64_2(dest, 8, DST_2);
3229 vis_faligndata(TMP2, TMP4, REF_4);
3231 vis_ld64_2(ref, stride, TMP6);
3232 vis_pmerge(ZERO, REF_0, TMP0);
3233 vis_mul8x16au(REF_0_1, CONST_256, TMP2);
3235 vis_ld64_2(ref, stride_8, TMP8);
3236 vis_pmerge(ZERO, REF_4, TMP4);
3238 vis_ld64_2(ref, stride_16, TMP10);
3241 vis_ld64_2(dest, stride, REF_S0/*DST_4*/);
3242 vis_faligndata(TMP6, TMP8, REF_2);
3243 vis_mul8x16au(REF_4_1, CONST_256, TMP6);
3245 vis_ld64_2(dest, stride_8, REF_S2/*DST_6*/);
3246 vis_faligndata(TMP8, TMP10, REF_6);
3247 vis_mul8x16al(DST_0, CONST_512, TMP20);
3249 vis_padd16(TMP0, CONST_3, TMP0);
3250 vis_mul8x16al(DST_1, CONST_512, TMP22);
3252 vis_padd16(TMP2, CONST_3, TMP2);
3253 vis_mul8x16al(DST_2, CONST_512, TMP24);
3255 vis_padd16(TMP4, CONST_3, TMP4);
3256 vis_mul8x16al(DST_3, CONST_512, TMP26);
3258 vis_padd16(TMP6, CONST_3, TMP6);
3260 vis_padd16(TMP12, TMP20, TMP12);
3261 vis_mul8x16al(REF_S0, CONST_512, TMP20);
3263 vis_padd16(TMP14, TMP22, TMP14);
3264 vis_mul8x16al(REF_S0_1, CONST_512, TMP22);
3266 vis_padd16(TMP16, TMP24, TMP16);
3267 vis_mul8x16al(REF_S2, CONST_512, TMP24);
3269 vis_padd16(TMP18, TMP26, TMP18);
3270 vis_mul8x16al(REF_S2_1, CONST_512, TMP26);
3272 vis_padd16(TMP12, TMP0, TMP12);
3273 vis_mul8x16au(REF_2, CONST_256, TMP28);
3275 vis_padd16(TMP14, TMP2, TMP14);
3276 vis_mul8x16au(REF_2_1, CONST_256, TMP30);
3278 vis_padd16(TMP16, TMP4, TMP16);
3279 vis_mul8x16au(REF_6, CONST_256, REF_S4);
3281 vis_padd16(TMP18, TMP6, TMP18);
3282 vis_mul8x16au(REF_6_1, CONST_256, REF_S6);
3284 vis_pack16(TMP12, DST_0);
3285 vis_padd16(TMP28, TMP0, TMP12);
3287 vis_pack16(TMP14, DST_1);
3288 vis_st64(DST_0, dest[0]);
3289 vis_padd16(TMP30, TMP2, TMP14);
3291 vis_pack16(TMP16, DST_2);
3292 vis_padd16(REF_S4, TMP4, TMP16);
3294 vis_pack16(TMP18, DST_3);
3295 vis_st64_2(DST_2, dest, 8);
3297 vis_padd16(REF_S6, TMP6, TMP18);
3299 vis_padd16(TMP12, TMP20, TMP12);
3301 vis_padd16(TMP14, TMP22, TMP14);
3302 vis_pack16(TMP12, DST_0);
3304 vis_padd16(TMP16, TMP24, TMP16);
3305 vis_pack16(TMP14, DST_1);
3306 vis_st64(DST_0, dest[0]);
3308 vis_padd16(TMP18, TMP26, TMP18);
3309 vis_pack16(TMP16, DST_2);
3311 vis_pack16(TMP18, DST_3);
3312 vis_st64_2(DST_2, dest, 8);
3317 static void MC_avg_no_round_y_8_vis (uint8_t * dest, const uint8_t * _ref,
3318 const int stride, int height)
3320 uint8_t *ref = (uint8_t *) _ref;
3321 int stride_8 = stride + 8;
3323 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
3325 ref = vis_alignaddr(ref);
3327 vis_ld64(ref[ 0], TMP0);
3330 vis_ld64(ref[ 8], TMP2);
3332 vis_ld64(constants3[0], CONST_3);
3333 vis_faligndata(TMP0, TMP2, REF_2);
3335 vis_ld64(constants256_512[0], CONST_256);
3338 do { /* 20 cycles */
3339 vis_ld64_2(ref, stride, TMP0);
3340 vis_pmerge(ZERO, REF_2, TMP8);
3341 vis_mul8x16au(REF_2_1, CONST_256, TMP10);
3343 vis_ld64_2(ref, stride_8, TMP2);
3346 vis_ld64(dest[0], DST_0);
3348 vis_ld64_2(dest, stride, DST_2);
3349 vis_faligndata(TMP0, TMP2, REF_0);
3351 vis_ld64_2(ref, stride, TMP4);
3352 vis_mul8x16al(DST_0, CONST_512, TMP16);
3353 vis_pmerge(ZERO, REF_0, TMP12);
3355 vis_ld64_2(ref, stride_8, TMP6);
3357 vis_mul8x16al(DST_1, CONST_512, TMP18);
3358 vis_pmerge(ZERO, REF_0_1, TMP14);
3360 vis_padd16(TMP12, CONST_3, TMP12);
3361 vis_mul8x16al(DST_2, CONST_512, TMP24);
3363 vis_padd16(TMP14, CONST_3, TMP14);
3364 vis_mul8x16al(DST_3, CONST_512, TMP26);
3366 vis_faligndata(TMP4, TMP6, REF_2);
3368 vis_padd16(TMP8, TMP12, TMP8);
3370 vis_padd16(TMP10, TMP14, TMP10);
3371 vis_mul8x16au(REF_2, CONST_256, TMP20);
3373 vis_padd16(TMP8, TMP16, TMP0);
3374 vis_mul8x16au(REF_2_1, CONST_256, TMP22);
3376 vis_padd16(TMP10, TMP18, TMP2);
3377 vis_pack16(TMP0, DST_0);
3379 vis_pack16(TMP2, DST_1);
3380 vis_st64(DST_0, dest[0]);
3382 vis_padd16(TMP12, TMP20, TMP12);
3384 vis_padd16(TMP14, TMP22, TMP14);
3386 vis_padd16(TMP12, TMP24, TMP0);
3388 vis_padd16(TMP14, TMP26, TMP2);
3389 vis_pack16(TMP0, DST_2);
3391 vis_pack16(TMP2, DST_3);
3392 vis_st64(DST_2, dest[0]);
3397 static void MC_put_no_round_xy_16_vis (uint8_t * dest, const uint8_t * _ref,
3398 const int stride, int height)
3400 uint8_t *ref = (uint8_t *) _ref;
3401 unsigned long off = (unsigned long) ref & 0x7;
3402 unsigned long off_plus_1 = off + 1;
3403 int stride_8 = stride + 8;
3404 int stride_16 = stride + 16;
3406 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
3408 ref = vis_alignaddr(ref);
3410 vis_ld64(ref[ 0], TMP0);
3413 vis_ld64(ref[ 8], TMP2);
3415 vis_ld64(ref[16], TMP4);
3417 vis_ld64(constants1[0], CONST_1);
3418 vis_faligndata(TMP0, TMP2, REF_S0);
3420 vis_ld64(constants256_512[0], CONST_256);
3421 vis_faligndata(TMP2, TMP4, REF_S4);
3424 vis_alignaddr_g0((void *)off_plus_1);
3425 vis_faligndata(TMP0, TMP2, REF_S2);
3426 vis_faligndata(TMP2, TMP4, REF_S6);
3428 vis_src1(TMP2, REF_S2);
3429 vis_src1(TMP4, REF_S6);
3434 vis_ld64_2(ref, stride, TMP0);
3435 vis_mul8x16au(REF_S0, CONST_256, TMP12);
3436 vis_pmerge(ZERO, REF_S0_1, TMP14);
3438 vis_alignaddr_g0((void *)off);
3440 vis_ld64_2(ref, stride_8, TMP2);
3441 vis_mul8x16au(REF_S2, CONST_256, TMP16);
3442 vis_pmerge(ZERO, REF_S2_1, TMP18);
3444 vis_ld64_2(ref, stride_16, TMP4);
3446 vis_mul8x16au(REF_S4, CONST_256, TMP20);
3447 vis_pmerge(ZERO, REF_S4_1, TMP22);
3449 vis_ld64_2(ref, stride, TMP6);
3450 vis_mul8x16au(REF_S6, CONST_256, TMP24);
3451 vis_pmerge(ZERO, REF_S6_1, TMP26);
3453 vis_ld64_2(ref, stride_8, TMP8);
3454 vis_faligndata(TMP0, TMP2, REF_0);
3456 vis_ld64_2(ref, stride_16, TMP10);
3458 vis_faligndata(TMP2, TMP4, REF_4);
3460 vis_faligndata(TMP6, TMP8, REF_S0);
3462 vis_faligndata(TMP8, TMP10, REF_S4);
3465 vis_alignaddr_g0((void *)off_plus_1);
3466 vis_faligndata(TMP0, TMP2, REF_2);
3467 vis_faligndata(TMP2, TMP4, REF_6);
3468 vis_faligndata(TMP6, TMP8, REF_S2);
3469 vis_faligndata(TMP8, TMP10, REF_S6);
3471 vis_src1(TMP2, REF_2);
3472 vis_src1(TMP4, REF_6);
3473 vis_src1(TMP8, REF_S2);
3474 vis_src1(TMP10, REF_S6);
3477 vis_mul8x16au(REF_0, CONST_256, TMP0);
3478 vis_pmerge(ZERO, REF_0_1, TMP2);
3480 vis_mul8x16au(REF_2, CONST_256, TMP4);
3481 vis_pmerge(ZERO, REF_2_1, TMP6);
3483 vis_padd16(TMP0, CONST_2, TMP8);
3484 vis_mul8x16au(REF_4, CONST_256, TMP0);
3486 vis_padd16(TMP2, CONST_1, TMP10);
3487 vis_mul8x16au(REF_4_1, CONST_256, TMP2);
3489 vis_padd16(TMP8, TMP4, TMP8);
3490 vis_mul8x16au(REF_6, CONST_256, TMP4);
3492 vis_padd16(TMP10, TMP6, TMP10);
3493 vis_mul8x16au(REF_6_1, CONST_256, TMP6);
3495 vis_padd16(TMP12, TMP8, TMP12);
3497 vis_padd16(TMP14, TMP10, TMP14);
3499 vis_padd16(TMP12, TMP16, TMP12);
3501 vis_padd16(TMP14, TMP18, TMP14);
3502 vis_pack16(TMP12, DST_0);
3504 vis_pack16(TMP14, DST_1);
3505 vis_st64(DST_0, dest[0]);
3506 vis_padd16(TMP0, CONST_1, TMP12);
3508 vis_mul8x16au(REF_S0, CONST_256, TMP0);
3509 vis_padd16(TMP2, CONST_1, TMP14);
3511 vis_mul8x16au(REF_S0_1, CONST_256, TMP2);
3512 vis_padd16(TMP12, TMP4, TMP12);
3514 vis_mul8x16au(REF_S2, CONST_256, TMP4);
3515 vis_padd16(TMP14, TMP6, TMP14);
3517 vis_mul8x16au(REF_S2_1, CONST_256, TMP6);
3518 vis_padd16(TMP20, TMP12, TMP20);
3520 vis_padd16(TMP22, TMP14, TMP22);
3522 vis_padd16(TMP20, TMP24, TMP20);
3524 vis_padd16(TMP22, TMP26, TMP22);
3525 vis_pack16(TMP20, DST_2);
3527 vis_pack16(TMP22, DST_3);
3528 vis_st64_2(DST_2, dest, 8);
3530 vis_padd16(TMP0, TMP4, TMP24);
3532 vis_mul8x16au(REF_S4, CONST_256, TMP0);
3533 vis_padd16(TMP2, TMP6, TMP26);
3535 vis_mul8x16au(REF_S4_1, CONST_256, TMP2);
3536 vis_padd16(TMP24, TMP8, TMP24);
3538 vis_padd16(TMP26, TMP10, TMP26);
3539 vis_pack16(TMP24, DST_0);
3541 vis_pack16(TMP26, DST_1);
3542 vis_st64(DST_0, dest[0]);
3543 vis_pmerge(ZERO, REF_S6, TMP4);
3545 vis_pmerge(ZERO, REF_S6_1, TMP6);
3547 vis_padd16(TMP0, TMP4, TMP0);
3549 vis_padd16(TMP2, TMP6, TMP2);
3551 vis_padd16(TMP0, TMP12, TMP0);
3553 vis_padd16(TMP2, TMP14, TMP2);
3554 vis_pack16(TMP0, DST_2);
3556 vis_pack16(TMP2, DST_3);
3557 vis_st64_2(DST_2, dest, 8);
3562 static void MC_put_no_round_xy_8_vis (uint8_t * dest, const uint8_t * _ref,
3563 const int stride, int height)
3565 uint8_t *ref = (uint8_t *) _ref;
3566 unsigned long off = (unsigned long) ref & 0x7;
3567 unsigned long off_plus_1 = off + 1;
3568 int stride_8 = stride + 8;
3570 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT);
3572 ref = vis_alignaddr(ref);
3574 vis_ld64(ref[ 0], TMP0);
3577 vis_ld64(ref[ 8], TMP2);
3579 vis_ld64(constants1[0], CONST_1);
3581 vis_ld64(constants256_512[0], CONST_256);
3582 vis_faligndata(TMP0, TMP2, REF_S0);
3585 vis_alignaddr_g0((void *)off_plus_1);
3586 vis_faligndata(TMP0, TMP2, REF_S2);
3588 vis_src1(TMP2, REF_S2);
3592 do { /* 26 cycles */
3593 vis_ld64_2(ref, stride, TMP0);
3594 vis_mul8x16au(REF_S0, CONST_256, TMP8);
3595 vis_pmerge(ZERO, REF_S2, TMP12);
3597 vis_alignaddr_g0((void *)off);
3599 vis_ld64_2(ref, stride_8, TMP2);
3601 vis_mul8x16au(REF_S0_1, CONST_256, TMP10);
3602 vis_pmerge(ZERO, REF_S2_1, TMP14);
3604 vis_ld64_2(ref, stride, TMP4);
3606 vis_ld64_2(ref, stride_8, TMP6);
3608 vis_faligndata(TMP0, TMP2, REF_S4);
3610 vis_pmerge(ZERO, REF_S4, TMP18);
3612 vis_pmerge(ZERO, REF_S4_1, TMP20);
3614 vis_faligndata(TMP4, TMP6, REF_S0);
3617 vis_alignaddr_g0((void *)off_plus_1);
3618 vis_faligndata(TMP0, TMP2, REF_S6);
3619 vis_faligndata(TMP4, TMP6, REF_S2);
3621 vis_src1(TMP2, REF_S6);
3622 vis_src1(TMP6, REF_S2);
3625 vis_padd16(TMP18, CONST_1, TMP18);
3626 vis_mul8x16au(REF_S6, CONST_256, TMP22);
3628 vis_padd16(TMP20, CONST_1, TMP20);
3629 vis_mul8x16au(REF_S6_1, CONST_256, TMP24);
3631 vis_mul8x16au(REF_S0, CONST_256, TMP26);
3632 vis_pmerge(ZERO, REF_S0_1, TMP28);
3634 vis_mul8x16au(REF_S2, CONST_256, TMP30);
3635 vis_padd16(TMP18, TMP22, TMP18);
3637 vis_mul8x16au(REF_S2_1, CONST_256, TMP32);
3638 vis_padd16(TMP20, TMP24, TMP20);
3640 vis_padd16(TMP8, TMP18, TMP8);
3642 vis_padd16(TMP10, TMP20, TMP10);
3644 vis_padd16(TMP8, TMP12, TMP8);
3646 vis_padd16(TMP10, TMP14, TMP10);
3647 vis_pack16(TMP8, DST_0);
3649 vis_pack16(TMP10, DST_1);
3650 vis_st64(DST_0, dest[0]);
3652 vis_padd16(TMP18, TMP26, TMP18);
3654 vis_padd16(TMP20, TMP28, TMP20);
3656 vis_padd16(TMP18, TMP30, TMP18);
3658 vis_padd16(TMP20, TMP32, TMP20);
3659 vis_pack16(TMP18, DST_2);
3661 vis_pack16(TMP20, DST_3);
3662 vis_st64(DST_2, dest[0]);
3667 static void MC_avg_no_round_xy_16_vis (uint8_t * dest, const uint8_t * _ref,
3668 const int stride, int height)
3670 uint8_t *ref = (uint8_t *) _ref;
3671 unsigned long off = (unsigned long) ref & 0x7;
3672 unsigned long off_plus_1 = off + 1;
3673 int stride_8 = stride + 8;
3674 int stride_16 = stride + 16;
3676 vis_set_gsr(4 << VIS_GSR_SCALEFACT_SHIFT);
3678 ref = vis_alignaddr(ref);
3680 vis_ld64(ref[ 0], TMP0);
3683 vis_ld64(ref[ 8], TMP2);
3685 vis_ld64(ref[16], TMP4);
3687 vis_ld64(constants6[0], CONST_6);
3688 vis_faligndata(TMP0, TMP2, REF_S0);
3690 vis_ld64(constants256_1024[0], CONST_256);
3691 vis_faligndata(TMP2, TMP4, REF_S4);
3694 vis_alignaddr_g0((void *)off_plus_1);
3695 vis_faligndata(TMP0, TMP2, REF_S2);
3696 vis_faligndata(TMP2, TMP4, REF_S6);
3698 vis_src1(TMP2, REF_S2);
3699 vis_src1(TMP4, REF_S6);
3703 do { /* 55 cycles */
3704 vis_ld64_2(ref, stride, TMP0);
3705 vis_mul8x16au(REF_S0, CONST_256, TMP12);
3706 vis_pmerge(ZERO, REF_S0_1, TMP14);
3708 vis_alignaddr_g0((void *)off);
3710 vis_ld64_2(ref, stride_8, TMP2);
3711 vis_mul8x16au(REF_S2, CONST_256, TMP16);
3712 vis_pmerge(ZERO, REF_S2_1, TMP18);
3714 vis_ld64_2(ref, stride_16, TMP4);
3716 vis_mul8x16au(REF_S4, CONST_256, TMP20);
3717 vis_pmerge(ZERO, REF_S4_1, TMP22);
3719 vis_ld64_2(ref, stride, TMP6);
3720 vis_mul8x16au(REF_S6, CONST_256, TMP24);
3721 vis_pmerge(ZERO, REF_S6_1, TMP26);
3723 vis_ld64_2(ref, stride_8, TMP8);
3724 vis_faligndata(TMP0, TMP2, REF_0);
3726 vis_ld64_2(ref, stride_16, TMP10);
3728 vis_faligndata(TMP2, TMP4, REF_4);
3730 vis_ld64(dest[0], DST_0);
3731 vis_faligndata(TMP6, TMP8, REF_S0);
3733 vis_ld64_2(dest, 8, DST_2);
3734 vis_faligndata(TMP8, TMP10, REF_S4);
3737 vis_alignaddr_g0((void *)off_plus_1);
3738 vis_faligndata(TMP0, TMP2, REF_2);
3739 vis_faligndata(TMP2, TMP4, REF_6);
3740 vis_faligndata(TMP6, TMP8, REF_S2);
3741 vis_faligndata(TMP8, TMP10, REF_S6);
3743 vis_src1(TMP2, REF_2);
3744 vis_src1(TMP4, REF_6);
3745 vis_src1(TMP8, REF_S2);
3746 vis_src1(TMP10, REF_S6);
3749 vis_mul8x16al(DST_0, CONST_1024, TMP30);
3750 vis_pmerge(ZERO, REF_0, TMP0);
3752 vis_mul8x16al(DST_1, CONST_1024, TMP32);
3753 vis_pmerge(ZERO, REF_0_1, TMP2);
3755 vis_mul8x16au(REF_2, CONST_256, TMP4);
3756 vis_pmerge(ZERO, REF_2_1, TMP6);
3758 vis_mul8x16al(DST_2, CONST_1024, REF_0);
3759 vis_padd16(TMP0, CONST_6, TMP0);
3761 vis_mul8x16al(DST_3, CONST_1024, REF_2);
3762 vis_padd16(TMP2, CONST_6, TMP2);
3764 vis_padd16(TMP0, TMP4, TMP0);
3765 vis_mul8x16au(REF_4, CONST_256, TMP4);
3767 vis_padd16(TMP2, TMP6, TMP2);
3768 vis_mul8x16au(REF_4_1, CONST_256, TMP6);
3770 vis_padd16(TMP12, TMP0, TMP12);
3771 vis_mul8x16au(REF_6, CONST_256, TMP8);
3773 vis_padd16(TMP14, TMP2, TMP14);
3774 vis_mul8x16au(REF_6_1, CONST_256, TMP10);
3776 vis_padd16(TMP12, TMP16, TMP12);
3777 vis_mul8x16au(REF_S0, CONST_256, REF_4);
3779 vis_padd16(TMP14, TMP18, TMP14);
3780 vis_mul8x16au(REF_S0_1, CONST_256, REF_6);
3782 vis_padd16(TMP12, TMP30, TMP12);
3784 vis_padd16(TMP14, TMP32, TMP14);
3785 vis_pack16(TMP12, DST_0);
3787 vis_pack16(TMP14, DST_1);
3788 vis_st64(DST_0, dest[0]);
3789 vis_padd16(TMP4, CONST_6, TMP4);
3791 vis_ld64_2(dest, stride, DST_0);
3792 vis_padd16(TMP6, CONST_6, TMP6);
3793 vis_mul8x16au(REF_S2, CONST_256, TMP12);
3795 vis_padd16(TMP4, TMP8, TMP4);
3796 vis_mul8x16au(REF_S2_1, CONST_256, TMP14);
3798 vis_padd16(TMP6, TMP10, TMP6);
3800 vis_padd16(TMP20, TMP4, TMP20);
3802 vis_padd16(TMP22, TMP6, TMP22);
3804 vis_padd16(TMP20, TMP24, TMP20);
3806 vis_padd16(TMP22, TMP26, TMP22);
3808 vis_padd16(TMP20, REF_0, TMP20);
3809 vis_mul8x16au(REF_S4, CONST_256, REF_0);
3811 vis_padd16(TMP22, REF_2, TMP22);
3812 vis_pack16(TMP20, DST_2);
3814 vis_pack16(TMP22, DST_3);
3815 vis_st64_2(DST_2, dest, 8);
3818 vis_ld64_2(dest, 8, DST_2);
3819 vis_mul8x16al(DST_0, CONST_1024, TMP30);
3820 vis_pmerge(ZERO, REF_S4_1, REF_2);
3822 vis_mul8x16al(DST_1, CONST_1024, TMP32);
3823 vis_padd16(REF_4, TMP0, TMP8);
3825 vis_mul8x16au(REF_S6, CONST_256, REF_4);
3826 vis_padd16(REF_6, TMP2, TMP10);
3828 vis_mul8x16au(REF_S6_1, CONST_256, REF_6);
3829 vis_padd16(TMP8, TMP12, TMP8);
3831 vis_padd16(TMP10, TMP14, TMP10);
3833 vis_padd16(TMP8, TMP30, TMP8);
3835 vis_padd16(TMP10, TMP32, TMP10);
3836 vis_pack16(TMP8, DST_0);
3838 vis_pack16(TMP10, DST_1);
3839 vis_st64(DST_0, dest[0]);
3841 vis_padd16(REF_0, TMP4, REF_0);
3843 vis_mul8x16al(DST_2, CONST_1024, TMP30);
3844 vis_padd16(REF_2, TMP6, REF_2);
3846 vis_mul8x16al(DST_3, CONST_1024, TMP32);
3847 vis_padd16(REF_0, REF_4, REF_0);
3849 vis_padd16(REF_2, REF_6, REF_2);
3851 vis_padd16(REF_0, TMP30, REF_0);
3855 vis_padd16(REF_2, TMP32, REF_2);
3856 vis_pack16(REF_0, DST_2);
3858 vis_pack16(REF_2, DST_3);
3859 vis_st64_2(DST_2, dest, 8);
3864 static void MC_avg_no_round_xy_8_vis (uint8_t * dest, const uint8_t * _ref,
3865 const int stride, int height)
3867 uint8_t *ref = (uint8_t *) _ref;
3868 unsigned long off = (unsigned long) ref & 0x7;
3869 unsigned long off_plus_1 = off + 1;
3870 int stride_8 = stride + 8;
3872 vis_set_gsr(4 << VIS_GSR_SCALEFACT_SHIFT);
3874 ref = vis_alignaddr(ref);
3876 vis_ld64(ref[0], TMP0);
3879 vis_ld64_2(ref, 8, TMP2);
3881 vis_ld64(constants6[0], CONST_6);
3883 vis_ld64(constants256_1024[0], CONST_256);
3884 vis_faligndata(TMP0, TMP2, REF_S0);
3887 vis_alignaddr_g0((void *)off_plus_1);
3888 vis_faligndata(TMP0, TMP2, REF_S2);
3890 vis_src1(TMP2, REF_S2);
3894 do { /* 31 cycles */
3895 vis_ld64_2(ref, stride, TMP0);
3896 vis_mul8x16au(REF_S0, CONST_256, TMP8);
3897 vis_pmerge(ZERO, REF_S0_1, TMP10);
3899 vis_ld64_2(ref, stride_8, TMP2);
3901 vis_mul8x16au(REF_S2, CONST_256, TMP12);
3902 vis_pmerge(ZERO, REF_S2_1, TMP14);
3904 vis_alignaddr_g0((void *)off);
3906 vis_ld64_2(ref, stride, TMP4);
3907 vis_faligndata(TMP0, TMP2, REF_S4);
3909 vis_ld64_2(ref, stride_8, TMP6);
3912 vis_ld64(dest[0], DST_0);
3913 vis_faligndata(TMP4, TMP6, REF_S0);
3915 vis_ld64_2(dest, stride, DST_2);
3918 vis_alignaddr_g0((void *)off_plus_1);
3919 vis_faligndata(TMP0, TMP2, REF_S6);
3920 vis_faligndata(TMP4, TMP6, REF_S2);
3922 vis_src1(TMP2, REF_S6);
3923 vis_src1(TMP6, REF_S2);
3926 vis_mul8x16al(DST_0, CONST_1024, TMP30);
3927 vis_pmerge(ZERO, REF_S4, TMP22);
3929 vis_mul8x16al(DST_1, CONST_1024, TMP32);
3930 vis_pmerge(ZERO, REF_S4_1, TMP24);
3932 vis_mul8x16au(REF_S6, CONST_256, TMP26);
3933 vis_pmerge(ZERO, REF_S6_1, TMP28);
3935 vis_mul8x16au(REF_S0, CONST_256, REF_S4);
3936 vis_padd16(TMP22, CONST_6, TMP22);
3938 vis_mul8x16au(REF_S0_1, CONST_256, REF_S6);
3939 vis_padd16(TMP24, CONST_6, TMP24);
3941 vis_mul8x16al(DST_2, CONST_1024, REF_0);
3942 vis_padd16(TMP22, TMP26, TMP22);
3944 vis_mul8x16al(DST_3, CONST_1024, REF_2);
3945 vis_padd16(TMP24, TMP28, TMP24);
3947 vis_mul8x16au(REF_S2, CONST_256, TMP26);
3948 vis_padd16(TMP8, TMP22, TMP8);
3950 vis_mul8x16au(REF_S2_1, CONST_256, TMP28);
3951 vis_padd16(TMP10, TMP24, TMP10);
3953 vis_padd16(TMP8, TMP12, TMP8);
3955 vis_padd16(TMP10, TMP14, TMP10);
3957 vis_padd16(TMP8, TMP30, TMP8);
3959 vis_padd16(TMP10, TMP32, TMP10);
3960 vis_pack16(TMP8, DST_0);
3962 vis_pack16(TMP10, DST_1);
3963 vis_st64(DST_0, dest[0]);
3966 vis_padd16(REF_S4, TMP22, TMP12);
3968 vis_padd16(REF_S6, TMP24, TMP14);
3970 vis_padd16(TMP12, TMP26, TMP12);
3972 vis_padd16(TMP14, TMP28, TMP14);
3974 vis_padd16(TMP12, REF_0, TMP12);
3976 vis_padd16(TMP14, REF_2, TMP14);
3977 vis_pack16(TMP12, DST_2);
3979 vis_pack16(TMP14, DST_3);
3980 vis_st64(DST_2, dest[0]);
3985 /* End of no rounding code */
3987 #define ACCEL_SPARC_VIS 1
3988 #define ACCEL_SPARC_VIS2 2
3990 static int vis_level(void)
3993 accel |= ACCEL_SPARC_VIS;
3994 accel |= ACCEL_SPARC_VIS2;
3998 /* libavcodec initialization code */
3999 void dsputil_init_vis(DSPContext* c, AVCodecContext *avctx)
4001 /* VIS-specific optimizations */
4002 int accel = vis_level ();
4004 if (accel & ACCEL_SPARC_VIS) {
4005 if(avctx->idct_algo==FF_IDCT_SIMPLEVIS){
4006 c->idct_put = ff_simple_idct_put_vis;
4007 c->idct_add = ff_simple_idct_add_vis;
4008 c->idct = ff_simple_idct_vis;
4009 c->idct_permutation_type = FF_TRANSPOSE_IDCT_PERM;
4012 c->put_pixels_tab[0][0] = MC_put_o_16_vis;
4013 c->put_pixels_tab[0][1] = MC_put_x_16_vis;
4014 c->put_pixels_tab[0][2] = MC_put_y_16_vis;
4015 c->put_pixels_tab[0][3] = MC_put_xy_16_vis;
4017 c->put_pixels_tab[1][0] = MC_put_o_8_vis;
4018 c->put_pixels_tab[1][1] = MC_put_x_8_vis;
4019 c->put_pixels_tab[1][2] = MC_put_y_8_vis;
4020 c->put_pixels_tab[1][3] = MC_put_xy_8_vis;
4022 c->avg_pixels_tab[0][0] = MC_avg_o_16_vis;
4023 c->avg_pixels_tab[0][1] = MC_avg_x_16_vis;
4024 c->avg_pixels_tab[0][2] = MC_avg_y_16_vis;
4025 c->avg_pixels_tab[0][3] = MC_avg_xy_16_vis;
4027 c->avg_pixels_tab[1][0] = MC_avg_o_8_vis;
4028 c->avg_pixels_tab[1][1] = MC_avg_x_8_vis;
4029 c->avg_pixels_tab[1][2] = MC_avg_y_8_vis;
4030 c->avg_pixels_tab[1][3] = MC_avg_xy_8_vis;
4032 c->put_no_rnd_pixels_tab[0][0] = MC_put_no_round_o_16_vis;
4033 c->put_no_rnd_pixels_tab[0][1] = MC_put_no_round_x_16_vis;
4034 c->put_no_rnd_pixels_tab[0][2] = MC_put_no_round_y_16_vis;
4035 c->put_no_rnd_pixels_tab[0][3] = MC_put_no_round_xy_16_vis;
4037 c->put_no_rnd_pixels_tab[1][0] = MC_put_no_round_o_8_vis;
4038 c->put_no_rnd_pixels_tab[1][1] = MC_put_no_round_x_8_vis;
4039 c->put_no_rnd_pixels_tab[1][2] = MC_put_no_round_y_8_vis;
4040 c->put_no_rnd_pixels_tab[1][3] = MC_put_no_round_xy_8_vis;
4042 c->avg_no_rnd_pixels_tab[0][0] = MC_avg_no_round_o_16_vis;
4043 c->avg_no_rnd_pixels_tab[0][1] = MC_avg_no_round_x_16_vis;
4044 c->avg_no_rnd_pixels_tab[0][2] = MC_avg_no_round_y_16_vis;
4045 c->avg_no_rnd_pixels_tab[0][3] = MC_avg_no_round_xy_16_vis;
4047 c->avg_no_rnd_pixels_tab[1][0] = MC_avg_no_round_o_8_vis;
4048 c->avg_no_rnd_pixels_tab[1][1] = MC_avg_no_round_x_8_vis;
4049 c->avg_no_rnd_pixels_tab[1][2] = MC_avg_no_round_y_8_vis;
4050 c->avg_no_rnd_pixels_tab[1][3] = MC_avg_no_round_xy_8_vis;