2 * Copyright (C) 2003 David S. Miller <davem@redhat.com>
4 * This file is part of Libav.
6 * Libav is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * Libav is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with Libav; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 /* The *no_round* functions have been added by James A. Morrison, 2003,2004.
22 The vis code from libmpeg2 was adapted for libavcodec by James A. Morrison.
29 #include "libavcodec/dsputil.h"
30 #include "libavutil/mem.h"
31 #include "dsputil_vis.h"
35 /* The trick used in some of this file is the formula from the MMX
36 * motion comp code, which is:
38 * (x+y+1)>>1 == (x|y)-((x^y)>>1)
40 * This allows us to average 8 bytes at a time in a 64-bit FPU reg.
41 * We avoid overflows by masking before we do the shift, and we
42 * implement the shift by multiplying by 1/2 using mul8x16. So in
43 * VIS this is (assume 'x' is in f0, 'y' is in f2, a repeating mask
44 * of '0xfe' is in f4, a repeating mask of '0x7f' is in f6, and
45 * the value 0x80808080 is in f8):
49 * fmul8x16 f8, f10, f10
52 * fpsub16 f12, f10, f10
55 #define DUP4(x) {x, x, x, x}
56 #define DUP8(x) {x, x, x, x, x, x, x, x}
57 DECLARE_ALIGNED(8, static const int16_t, constants1
)[] = DUP4 (1);
58 DECLARE_ALIGNED(8, static const int16_t, constants2
)[] = DUP4 (2);
59 DECLARE_ALIGNED(8, static const int16_t, constants3
)[] = DUP4 (3);
60 DECLARE_ALIGNED(8, static const int16_t, constants6
)[] = DUP4 (6);
61 DECLARE_ALIGNED(8, static const int8_t, constants_fe
)[] = DUP8 (0xfe);
62 DECLARE_ALIGNED(8, static const int8_t, constants_7f
)[] = DUP8 (0x7f);
63 DECLARE_ALIGNED(8, static const int8_t, constants128
)[] = DUP8 (128);
64 DECLARE_ALIGNED(8, static const int16_t, constants256_512
)[] =
66 DECLARE_ALIGNED(8, static const int16_t, constants256_1024
)[] =
67 {256, 1024, 256, 1024};
122 static void MC_put_o_16_vis (uint8_t * dest
, const uint8_t * ref
,
123 const int stride
, int height
)
125 ref
= vis_alignaddr(ref
);
127 vis_ld64(ref
[0], TMP0
);
129 vis_ld64_2(ref
, 8, TMP2
);
131 vis_ld64_2(ref
, 16, TMP4
);
134 vis_faligndata(TMP0
, TMP2
, REF_0
);
135 vis_st64(REF_0
, dest
[0]);
137 vis_faligndata(TMP2
, TMP4
, REF_2
);
138 vis_st64_2(REF_2
, dest
, 8);
143 static void MC_put_o_8_vis (uint8_t * dest
, const uint8_t * ref
,
144 const int stride
, int height
)
146 ref
= vis_alignaddr(ref
);
148 vis_ld64(ref
[0], TMP0
);
150 vis_ld64(ref
[8], TMP2
);
155 vis_faligndata(TMP0
, TMP2
, REF_0
);
156 vis_st64(REF_0
, dest
[0]);
162 static void MC_avg_o_16_vis (uint8_t * dest
, const uint8_t * ref
,
163 const int stride
, int height
)
165 int stride_8
= stride
+ 8;
167 ref
= vis_alignaddr(ref
);
169 vis_ld64(ref
[0], TMP0
);
171 vis_ld64(ref
[8], TMP2
);
173 vis_ld64(ref
[16], TMP4
);
175 vis_ld64(dest
[0], DST_0
);
177 vis_ld64(dest
[8], DST_2
);
179 vis_ld64(constants_fe
[0], MASK_fe
);
180 vis_faligndata(TMP0
, TMP2
, REF_0
);
182 vis_ld64(constants_7f
[0], MASK_7f
);
183 vis_faligndata(TMP2
, TMP4
, REF_2
);
185 vis_ld64(constants128
[0], CONST_128
);
188 height
= (height
>> 1) - 1;
191 vis_ld64(ref
[0], TMP0
);
192 vis_xor(DST_0
, REF_0
, TMP6
);
194 vis_ld64_2(ref
, 8, TMP2
);
195 vis_and(TMP6
, MASK_fe
, TMP6
);
197 vis_ld64_2(ref
, 16, TMP4
);
199 vis_mul8x16(CONST_128
, TMP6
, TMP6
);
200 vis_xor(DST_2
, REF_2
, TMP8
);
202 vis_and(TMP8
, MASK_fe
, TMP8
);
204 vis_or(DST_0
, REF_0
, TMP10
);
205 vis_ld64_2(dest
, stride
, DST_0
);
206 vis_mul8x16(CONST_128
, TMP8
, TMP8
);
208 vis_or(DST_2
, REF_2
, TMP12
);
209 vis_ld64_2(dest
, stride_8
, DST_2
);
211 vis_ld64(ref
[0], TMP14
);
212 vis_and(TMP6
, MASK_7f
, TMP6
);
214 vis_and(TMP8
, MASK_7f
, TMP8
);
216 vis_psub16(TMP10
, TMP6
, TMP6
);
217 vis_st64(TMP6
, dest
[0]);
219 vis_psub16(TMP12
, TMP8
, TMP8
);
220 vis_st64_2(TMP8
, dest
, 8);
223 vis_ld64_2(ref
, 8, TMP16
);
224 vis_faligndata(TMP0
, TMP2
, REF_0
);
226 vis_ld64_2(ref
, 16, TMP18
);
227 vis_faligndata(TMP2
, TMP4
, REF_2
);
230 vis_xor(DST_0
, REF_0
, TMP20
);
232 vis_and(TMP20
, MASK_fe
, TMP20
);
234 vis_xor(DST_2
, REF_2
, TMP22
);
235 vis_mul8x16(CONST_128
, TMP20
, TMP20
);
237 vis_and(TMP22
, MASK_fe
, TMP22
);
239 vis_or(DST_0
, REF_0
, TMP24
);
240 vis_mul8x16(CONST_128
, TMP22
, TMP22
);
242 vis_or(DST_2
, REF_2
, TMP26
);
244 vis_ld64_2(dest
, stride
, DST_0
);
245 vis_faligndata(TMP14
, TMP16
, REF_0
);
247 vis_ld64_2(dest
, stride_8
, DST_2
);
248 vis_faligndata(TMP16
, TMP18
, REF_2
);
250 vis_and(TMP20
, MASK_7f
, TMP20
);
252 vis_and(TMP22
, MASK_7f
, TMP22
);
254 vis_psub16(TMP24
, TMP20
, TMP20
);
255 vis_st64(TMP20
, dest
[0]);
257 vis_psub16(TMP26
, TMP22
, TMP22
);
258 vis_st64_2(TMP22
, dest
, 8);
262 vis_ld64(ref
[0], TMP0
);
263 vis_xor(DST_0
, REF_0
, TMP6
);
265 vis_ld64_2(ref
, 8, TMP2
);
266 vis_and(TMP6
, MASK_fe
, TMP6
);
268 vis_ld64_2(ref
, 16, TMP4
);
269 vis_mul8x16(CONST_128
, TMP6
, TMP6
);
270 vis_xor(DST_2
, REF_2
, TMP8
);
272 vis_and(TMP8
, MASK_fe
, TMP8
);
274 vis_or(DST_0
, REF_0
, TMP10
);
275 vis_ld64_2(dest
, stride
, DST_0
);
276 vis_mul8x16(CONST_128
, TMP8
, TMP8
);
278 vis_or(DST_2
, REF_2
, TMP12
);
279 vis_ld64_2(dest
, stride_8
, DST_2
);
281 vis_ld64(ref
[0], TMP14
);
282 vis_and(TMP6
, MASK_7f
, TMP6
);
284 vis_and(TMP8
, MASK_7f
, TMP8
);
286 vis_psub16(TMP10
, TMP6
, TMP6
);
287 vis_st64(TMP6
, dest
[0]);
289 vis_psub16(TMP12
, TMP8
, TMP8
);
290 vis_st64_2(TMP8
, dest
, 8);
293 vis_faligndata(TMP0
, TMP2
, REF_0
);
295 vis_faligndata(TMP2
, TMP4
, REF_2
);
297 vis_xor(DST_0
, REF_0
, TMP20
);
299 vis_and(TMP20
, MASK_fe
, TMP20
);
301 vis_xor(DST_2
, REF_2
, TMP22
);
302 vis_mul8x16(CONST_128
, TMP20
, TMP20
);
304 vis_and(TMP22
, MASK_fe
, TMP22
);
306 vis_or(DST_0
, REF_0
, TMP24
);
307 vis_mul8x16(CONST_128
, TMP22
, TMP22
);
309 vis_or(DST_2
, REF_2
, TMP26
);
311 vis_and(TMP20
, MASK_7f
, TMP20
);
313 vis_and(TMP22
, MASK_7f
, TMP22
);
315 vis_psub16(TMP24
, TMP20
, TMP20
);
316 vis_st64(TMP20
, dest
[0]);
318 vis_psub16(TMP26
, TMP22
, TMP22
);
319 vis_st64_2(TMP22
, dest
, 8);
322 static void MC_avg_o_8_vis (uint8_t * dest
, const uint8_t * ref
,
323 const int stride
, int height
)
325 ref
= vis_alignaddr(ref
);
327 vis_ld64(ref
[0], TMP0
);
329 vis_ld64(ref
[8], TMP2
);
331 vis_ld64(dest
[0], DST_0
);
333 vis_ld64(constants_fe
[0], MASK_fe
);
335 vis_ld64(constants_7f
[0], MASK_7f
);
336 vis_faligndata(TMP0
, TMP2
, REF_0
);
338 vis_ld64(constants128
[0], CONST_128
);
341 height
= (height
>> 1) - 1;
344 vis_ld64(ref
[0], TMP0
);
345 vis_xor(DST_0
, REF_0
, TMP4
);
347 vis_ld64(ref
[8], TMP2
);
348 vis_and(TMP4
, MASK_fe
, TMP4
);
350 vis_or(DST_0
, REF_0
, TMP6
);
351 vis_ld64_2(dest
, stride
, DST_0
);
353 vis_mul8x16(CONST_128
, TMP4
, TMP4
);
355 vis_ld64(ref
[0], TMP12
);
356 vis_faligndata(TMP0
, TMP2
, REF_0
);
358 vis_ld64(ref
[8], TMP2
);
359 vis_xor(DST_0
, REF_0
, TMP0
);
362 vis_and(TMP0
, MASK_fe
, TMP0
);
364 vis_and(TMP4
, MASK_7f
, TMP4
);
366 vis_psub16(TMP6
, TMP4
, TMP4
);
367 vis_st64(TMP4
, dest
[0]);
369 vis_mul8x16(CONST_128
, TMP0
, TMP0
);
371 vis_or(DST_0
, REF_0
, TMP6
);
372 vis_ld64_2(dest
, stride
, DST_0
);
374 vis_faligndata(TMP12
, TMP2
, REF_0
);
376 vis_and(TMP0
, MASK_7f
, TMP0
);
378 vis_psub16(TMP6
, TMP0
, TMP4
);
379 vis_st64(TMP4
, dest
[0]);
383 vis_ld64(ref
[0], TMP0
);
384 vis_xor(DST_0
, REF_0
, TMP4
);
386 vis_ld64(ref
[8], TMP2
);
387 vis_and(TMP4
, MASK_fe
, TMP4
);
389 vis_or(DST_0
, REF_0
, TMP6
);
390 vis_ld64_2(dest
, stride
, DST_0
);
391 vis_mul8x16(CONST_128
, TMP4
, TMP4
);
393 vis_faligndata(TMP0
, TMP2
, REF_0
);
395 vis_xor(DST_0
, REF_0
, TMP0
);
397 vis_and(TMP0
, MASK_fe
, TMP0
);
399 vis_and(TMP4
, MASK_7f
, TMP4
);
401 vis_psub16(TMP6
, TMP4
, TMP4
);
402 vis_st64(TMP4
, dest
[0]);
404 vis_mul8x16(CONST_128
, TMP0
, TMP0
);
406 vis_or(DST_0
, REF_0
, TMP6
);
408 vis_and(TMP0
, MASK_7f
, TMP0
);
410 vis_psub16(TMP6
, TMP0
, TMP4
);
411 vis_st64(TMP4
, dest
[0]);
414 static void MC_put_x_16_vis (uint8_t * dest
, const uint8_t * ref
,
415 const int stride
, int height
)
417 unsigned long off
= (unsigned long) ref
& 0x7;
418 unsigned long off_plus_1
= off
+ 1;
420 ref
= vis_alignaddr(ref
);
422 vis_ld64(ref
[0], TMP0
);
424 vis_ld64_2(ref
, 8, TMP2
);
426 vis_ld64_2(ref
, 16, TMP4
);
428 vis_ld64(constants_fe
[0], MASK_fe
);
430 vis_ld64(constants_7f
[0], MASK_7f
);
431 vis_faligndata(TMP0
, TMP2
, REF_0
);
433 vis_ld64(constants128
[0], CONST_128
);
434 vis_faligndata(TMP2
, TMP4
, REF_4
);
437 vis_alignaddr_g0((void *)off_plus_1
);
438 vis_faligndata(TMP0
, TMP2
, REF_2
);
439 vis_faligndata(TMP2
, TMP4
, REF_6
);
441 vis_src1(TMP2
, REF_2
);
442 vis_src1(TMP4
, REF_6
);
446 height
= (height
>> 1) - 1;
449 vis_ld64(ref
[0], TMP0
);
450 vis_xor(REF_0
, REF_2
, TMP6
);
452 vis_ld64_2(ref
, 8, TMP2
);
453 vis_xor(REF_4
, REF_6
, TMP8
);
455 vis_ld64_2(ref
, 16, TMP4
);
456 vis_and(TMP6
, MASK_fe
, TMP6
);
459 vis_ld64(ref
[0], TMP14
);
460 vis_mul8x16(CONST_128
, TMP6
, TMP6
);
461 vis_and(TMP8
, MASK_fe
, TMP8
);
463 vis_ld64_2(ref
, 8, TMP16
);
464 vis_mul8x16(CONST_128
, TMP8
, TMP8
);
465 vis_or(REF_0
, REF_2
, TMP10
);
467 vis_ld64_2(ref
, 16, TMP18
);
469 vis_or(REF_4
, REF_6
, TMP12
);
471 vis_alignaddr_g0((void *)off
);
473 vis_faligndata(TMP0
, TMP2
, REF_0
);
475 vis_faligndata(TMP2
, TMP4
, REF_4
);
478 vis_alignaddr_g0((void *)off_plus_1
);
479 vis_faligndata(TMP0
, TMP2
, REF_2
);
480 vis_faligndata(TMP2
, TMP4
, REF_6
);
482 vis_src1(TMP2
, REF_2
);
483 vis_src1(TMP4
, REF_6
);
486 vis_and(TMP6
, MASK_7f
, TMP6
);
488 vis_and(TMP8
, MASK_7f
, TMP8
);
490 vis_psub16(TMP10
, TMP6
, TMP6
);
491 vis_st64(TMP6
, dest
[0]);
493 vis_psub16(TMP12
, TMP8
, TMP8
);
494 vis_st64_2(TMP8
, dest
, 8);
497 vis_xor(REF_0
, REF_2
, TMP6
);
499 vis_xor(REF_4
, REF_6
, TMP8
);
501 vis_and(TMP6
, MASK_fe
, TMP6
);
503 vis_mul8x16(CONST_128
, TMP6
, TMP6
);
504 vis_and(TMP8
, MASK_fe
, TMP8
);
506 vis_mul8x16(CONST_128
, TMP8
, TMP8
);
507 vis_or(REF_0
, REF_2
, TMP10
);
509 vis_or(REF_4
, REF_6
, TMP12
);
511 vis_alignaddr_g0((void *)off
);
513 vis_faligndata(TMP14
, TMP16
, REF_0
);
515 vis_faligndata(TMP16
, TMP18
, REF_4
);
518 vis_alignaddr_g0((void *)off_plus_1
);
519 vis_faligndata(TMP14
, TMP16
, REF_2
);
520 vis_faligndata(TMP16
, TMP18
, REF_6
);
522 vis_src1(TMP16
, REF_2
);
523 vis_src1(TMP18
, REF_6
);
526 vis_and(TMP6
, MASK_7f
, TMP6
);
528 vis_and(TMP8
, MASK_7f
, TMP8
);
530 vis_psub16(TMP10
, TMP6
, TMP6
);
531 vis_st64(TMP6
, dest
[0]);
533 vis_psub16(TMP12
, TMP8
, TMP8
);
534 vis_st64_2(TMP8
, dest
, 8);
538 vis_ld64(ref
[0], TMP0
);
539 vis_xor(REF_0
, REF_2
, TMP6
);
541 vis_ld64_2(ref
, 8, TMP2
);
542 vis_xor(REF_4
, REF_6
, TMP8
);
544 vis_ld64_2(ref
, 16, TMP4
);
545 vis_and(TMP6
, MASK_fe
, TMP6
);
547 vis_mul8x16(CONST_128
, TMP6
, TMP6
);
548 vis_and(TMP8
, MASK_fe
, TMP8
);
550 vis_mul8x16(CONST_128
, TMP8
, TMP8
);
551 vis_or(REF_0
, REF_2
, TMP10
);
553 vis_or(REF_4
, REF_6
, TMP12
);
555 vis_alignaddr_g0((void *)off
);
557 vis_faligndata(TMP0
, TMP2
, REF_0
);
559 vis_faligndata(TMP2
, TMP4
, REF_4
);
562 vis_alignaddr_g0((void *)off_plus_1
);
563 vis_faligndata(TMP0
, TMP2
, REF_2
);
564 vis_faligndata(TMP2
, TMP4
, REF_6
);
566 vis_src1(TMP2
, REF_2
);
567 vis_src1(TMP4
, REF_6
);
570 vis_and(TMP6
, MASK_7f
, TMP6
);
572 vis_and(TMP8
, MASK_7f
, TMP8
);
574 vis_psub16(TMP10
, TMP6
, TMP6
);
575 vis_st64(TMP6
, dest
[0]);
577 vis_psub16(TMP12
, TMP8
, TMP8
);
578 vis_st64_2(TMP8
, dest
, 8);
581 vis_xor(REF_0
, REF_2
, TMP6
);
583 vis_xor(REF_4
, REF_6
, TMP8
);
585 vis_and(TMP6
, MASK_fe
, TMP6
);
587 vis_mul8x16(CONST_128
, TMP6
, TMP6
);
588 vis_and(TMP8
, MASK_fe
, TMP8
);
590 vis_mul8x16(CONST_128
, TMP8
, TMP8
);
591 vis_or(REF_0
, REF_2
, TMP10
);
593 vis_or(REF_4
, REF_6
, TMP12
);
595 vis_and(TMP6
, MASK_7f
, TMP6
);
597 vis_and(TMP8
, MASK_7f
, TMP8
);
599 vis_psub16(TMP10
, TMP6
, TMP6
);
600 vis_st64(TMP6
, dest
[0]);
602 vis_psub16(TMP12
, TMP8
, TMP8
);
603 vis_st64_2(TMP8
, dest
, 8);
606 static void MC_put_x_8_vis (uint8_t * dest
, const uint8_t * ref
,
607 const int stride
, int height
)
609 unsigned long off
= (unsigned long) ref
& 0x7;
610 unsigned long off_plus_1
= off
+ 1;
612 ref
= vis_alignaddr(ref
);
614 vis_ld64(ref
[0], TMP0
);
616 vis_ld64(ref
[8], TMP2
);
618 vis_ld64(constants_fe
[0], MASK_fe
);
620 vis_ld64(constants_7f
[0], MASK_7f
);
622 vis_ld64(constants128
[0], CONST_128
);
623 vis_faligndata(TMP0
, TMP2
, REF_0
);
626 vis_alignaddr_g0((void *)off_plus_1
);
627 vis_faligndata(TMP0
, TMP2
, REF_2
);
629 vis_src1(TMP2
, REF_2
);
633 height
= (height
>> 1) - 1;
636 vis_ld64(ref
[0], TMP0
);
637 vis_xor(REF_0
, REF_2
, TMP4
);
639 vis_ld64_2(ref
, 8, TMP2
);
640 vis_and(TMP4
, MASK_fe
, TMP4
);
643 vis_ld64(ref
[0], TMP8
);
644 vis_or(REF_0
, REF_2
, TMP6
);
645 vis_mul8x16(CONST_128
, TMP4
, TMP4
);
647 vis_alignaddr_g0((void *)off
);
649 vis_ld64_2(ref
, 8, TMP10
);
651 vis_faligndata(TMP0
, TMP2
, REF_0
);
654 vis_alignaddr_g0((void *)off_plus_1
);
655 vis_faligndata(TMP0
, TMP2
, REF_2
);
657 vis_src1(TMP2
, REF_2
);
660 vis_and(TMP4
, MASK_7f
, TMP4
);
662 vis_psub16(TMP6
, TMP4
, DST_0
);
663 vis_st64(DST_0
, dest
[0]);
666 vis_xor(REF_0
, REF_2
, TMP12
);
668 vis_and(TMP12
, MASK_fe
, TMP12
);
670 vis_or(REF_0
, REF_2
, TMP14
);
671 vis_mul8x16(CONST_128
, TMP12
, TMP12
);
673 vis_alignaddr_g0((void *)off
);
674 vis_faligndata(TMP8
, TMP10
, REF_0
);
676 vis_alignaddr_g0((void *)off_plus_1
);
677 vis_faligndata(TMP8
, TMP10
, REF_2
);
679 vis_src1(TMP10
, REF_2
);
682 vis_and(TMP12
, MASK_7f
, TMP12
);
684 vis_psub16(TMP14
, TMP12
, DST_0
);
685 vis_st64(DST_0
, dest
[0]);
689 vis_ld64(ref
[0], TMP0
);
690 vis_xor(REF_0
, REF_2
, TMP4
);
692 vis_ld64_2(ref
, 8, TMP2
);
693 vis_and(TMP4
, MASK_fe
, TMP4
);
695 vis_or(REF_0
, REF_2
, TMP6
);
696 vis_mul8x16(CONST_128
, TMP4
, TMP4
);
698 vis_alignaddr_g0((void *)off
);
700 vis_faligndata(TMP0
, TMP2
, REF_0
);
703 vis_alignaddr_g0((void *)off_plus_1
);
704 vis_faligndata(TMP0
, TMP2
, REF_2
);
706 vis_src1(TMP2
, REF_2
);
709 vis_and(TMP4
, MASK_7f
, TMP4
);
711 vis_psub16(TMP6
, TMP4
, DST_0
);
712 vis_st64(DST_0
, dest
[0]);
715 vis_xor(REF_0
, REF_2
, TMP12
);
717 vis_and(TMP12
, MASK_fe
, TMP12
);
719 vis_or(REF_0
, REF_2
, TMP14
);
720 vis_mul8x16(CONST_128
, TMP12
, TMP12
);
722 vis_and(TMP12
, MASK_7f
, TMP12
);
724 vis_psub16(TMP14
, TMP12
, DST_0
);
725 vis_st64(DST_0
, dest
[0]);
729 static void MC_avg_x_16_vis (uint8_t * dest
, const uint8_t * ref
,
730 const int stride
, int height
)
732 unsigned long off
= (unsigned long) ref
& 0x7;
733 unsigned long off_plus_1
= off
+ 1;
735 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT
);
737 vis_ld64(constants3
[0], CONST_3
);
739 vis_ld64(constants256_512
[0], CONST_256
);
741 ref
= vis_alignaddr(ref
);
743 vis_ld64(ref
[0], TMP0
);
745 vis_ld64(ref
[8], TMP2
);
747 vis_alignaddr_g0((void *)off
);
749 vis_ld64(ref
[16], TMP4
);
751 vis_ld64(dest
[0], DST_0
);
752 vis_faligndata(TMP0
, TMP2
, REF_0
);
754 vis_ld64(dest
[8], DST_2
);
755 vis_faligndata(TMP2
, TMP4
, REF_4
);
758 vis_alignaddr_g0((void *)off_plus_1
);
759 vis_faligndata(TMP0
, TMP2
, REF_2
);
760 vis_faligndata(TMP2
, TMP4
, REF_6
);
762 vis_src1(TMP2
, REF_2
);
763 vis_src1(TMP4
, REF_6
);
766 vis_mul8x16au(REF_0
, CONST_256
, TMP0
);
768 vis_pmerge(ZERO
, REF_2
, TMP4
);
769 vis_mul8x16au(REF_0_1
, CONST_256
, TMP2
);
771 vis_pmerge(ZERO
, REF_2_1
, TMP6
);
773 vis_padd16(TMP0
, TMP4
, TMP0
);
775 vis_mul8x16al(DST_0
, CONST_512
, TMP4
);
776 vis_padd16(TMP2
, TMP6
, TMP2
);
778 vis_mul8x16al(DST_1
, CONST_512
, TMP6
);
780 vis_mul8x16au(REF_6
, CONST_256
, TMP12
);
782 vis_padd16(TMP0
, TMP4
, TMP0
);
783 vis_mul8x16au(REF_6_1
, CONST_256
, TMP14
);
785 vis_padd16(TMP2
, TMP6
, TMP2
);
786 vis_mul8x16au(REF_4
, CONST_256
, TMP16
);
788 vis_padd16(TMP0
, CONST_3
, TMP8
);
789 vis_mul8x16au(REF_4_1
, CONST_256
, TMP18
);
791 vis_padd16(TMP2
, CONST_3
, TMP10
);
792 vis_pack16(TMP8
, DST_0
);
794 vis_pack16(TMP10
, DST_1
);
795 vis_padd16(TMP16
, TMP12
, TMP0
);
797 vis_st64(DST_0
, dest
[0]);
798 vis_mul8x16al(DST_2
, CONST_512
, TMP4
);
799 vis_padd16(TMP18
, TMP14
, TMP2
);
801 vis_mul8x16al(DST_3
, CONST_512
, TMP6
);
802 vis_padd16(TMP0
, CONST_3
, TMP0
);
804 vis_padd16(TMP2
, CONST_3
, TMP2
);
806 vis_padd16(TMP0
, TMP4
, TMP0
);
808 vis_padd16(TMP2
, TMP6
, TMP2
);
809 vis_pack16(TMP0
, DST_2
);
811 vis_pack16(TMP2
, DST_3
);
812 vis_st64(DST_2
, dest
[8]);
819 static void MC_avg_x_8_vis (uint8_t * dest
, const uint8_t * ref
,
820 const int stride
, int height
)
822 unsigned long off
= (unsigned long) ref
& 0x7;
823 unsigned long off_plus_1
= off
+ 1;
824 int stride_times_2
= stride
<< 1;
826 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT
);
828 vis_ld64(constants3
[0], CONST_3
);
830 vis_ld64(constants256_512
[0], CONST_256
);
832 ref
= vis_alignaddr(ref
);
835 vis_ld64(ref
[0], TMP0
);
837 vis_ld64_2(ref
, 8, TMP2
);
840 vis_alignaddr_g0((void *)off
);
842 vis_ld64(ref
[0], TMP4
);
843 vis_faligndata(TMP0
, TMP2
, REF_0
);
845 vis_ld64_2(ref
, 8, TMP6
);
848 vis_ld64(ref
[0], TMP8
);
850 vis_ld64_2(ref
, 8, TMP10
);
852 vis_faligndata(TMP4
, TMP6
, REF_4
);
854 vis_ld64(ref
[0], TMP12
);
856 vis_ld64_2(ref
, 8, TMP14
);
858 vis_faligndata(TMP8
, TMP10
, REF_S0
);
860 vis_faligndata(TMP12
, TMP14
, REF_S4
);
863 vis_alignaddr_g0((void *)off_plus_1
);
865 vis_ld64(dest
[0], DST_0
);
866 vis_faligndata(TMP0
, TMP2
, REF_2
);
868 vis_ld64_2(dest
, stride
, DST_2
);
869 vis_faligndata(TMP4
, TMP6
, REF_6
);
871 vis_faligndata(TMP8
, TMP10
, REF_S2
);
873 vis_faligndata(TMP12
, TMP14
, REF_S6
);
875 vis_ld64(dest
[0], DST_0
);
876 vis_src1(TMP2
, REF_2
);
878 vis_ld64_2(dest
, stride
, DST_2
);
879 vis_src1(TMP6
, REF_6
);
881 vis_src1(TMP10
, REF_S2
);
883 vis_src1(TMP14
, REF_S6
);
886 vis_pmerge(ZERO
, REF_0
, TMP0
);
887 vis_mul8x16au(REF_0_1
, CONST_256
, TMP2
);
889 vis_pmerge(ZERO
, REF_2
, TMP4
);
890 vis_mul8x16au(REF_2_1
, CONST_256
, TMP6
);
892 vis_padd16(TMP0
, CONST_3
, TMP0
);
893 vis_mul8x16al(DST_0
, CONST_512
, TMP16
);
895 vis_padd16(TMP2
, CONST_3
, TMP2
);
896 vis_mul8x16al(DST_1
, CONST_512
, TMP18
);
898 vis_padd16(TMP0
, TMP4
, TMP0
);
899 vis_mul8x16au(REF_4
, CONST_256
, TMP8
);
901 vis_padd16(TMP2
, TMP6
, TMP2
);
902 vis_mul8x16au(REF_4_1
, CONST_256
, TMP10
);
904 vis_padd16(TMP0
, TMP16
, TMP0
);
905 vis_mul8x16au(REF_6
, CONST_256
, TMP12
);
907 vis_padd16(TMP2
, TMP18
, TMP2
);
908 vis_mul8x16au(REF_6_1
, CONST_256
, TMP14
);
910 vis_padd16(TMP8
, CONST_3
, TMP8
);
911 vis_mul8x16al(DST_2
, CONST_512
, TMP16
);
913 vis_padd16(TMP8
, TMP12
, TMP8
);
914 vis_mul8x16al(DST_3
, CONST_512
, TMP18
);
916 vis_padd16(TMP10
, TMP14
, TMP10
);
917 vis_pack16(TMP0
, DST_0
);
919 vis_pack16(TMP2
, DST_1
);
920 vis_st64(DST_0
, dest
[0]);
922 vis_padd16(TMP10
, CONST_3
, TMP10
);
924 vis_ld64_2(dest
, stride
, DST_0
);
925 vis_padd16(TMP8
, TMP16
, TMP8
);
927 vis_ld64_2(dest
, stride_times_2
, TMP4
/*DST_2*/);
928 vis_padd16(TMP10
, TMP18
, TMP10
);
929 vis_pack16(TMP8
, DST_2
);
931 vis_pack16(TMP10
, DST_3
);
932 vis_st64(DST_2
, dest
[0]);
935 vis_mul8x16au(REF_S0_1
, CONST_256
, TMP2
);
936 vis_pmerge(ZERO
, REF_S0
, TMP0
);
938 vis_pmerge(ZERO
, REF_S2
, TMP24
);
939 vis_mul8x16au(REF_S2_1
, CONST_256
, TMP6
);
941 vis_padd16(TMP0
, CONST_3
, TMP0
);
942 vis_mul8x16au(REF_S4
, CONST_256
, TMP8
);
944 vis_padd16(TMP2
, CONST_3
, TMP2
);
945 vis_mul8x16au(REF_S4_1
, CONST_256
, TMP10
);
947 vis_padd16(TMP0
, TMP24
, TMP0
);
948 vis_mul8x16au(REF_S6
, CONST_256
, TMP12
);
950 vis_padd16(TMP2
, TMP6
, TMP2
);
951 vis_mul8x16au(REF_S6_1
, CONST_256
, TMP14
);
953 vis_padd16(TMP8
, CONST_3
, TMP8
);
954 vis_mul8x16al(DST_0
, CONST_512
, TMP16
);
956 vis_padd16(TMP10
, CONST_3
, TMP10
);
957 vis_mul8x16al(DST_1
, CONST_512
, TMP18
);
959 vis_padd16(TMP8
, TMP12
, TMP8
);
960 vis_mul8x16al(TMP4
/*DST_2*/, CONST_512
, TMP20
);
962 vis_mul8x16al(TMP5
/*DST_3*/, CONST_512
, TMP22
);
963 vis_padd16(TMP0
, TMP16
, TMP0
);
965 vis_padd16(TMP2
, TMP18
, TMP2
);
966 vis_pack16(TMP0
, DST_0
);
968 vis_padd16(TMP10
, TMP14
, TMP10
);
969 vis_pack16(TMP2
, DST_1
);
970 vis_st64(DST_0
, dest
[0]);
973 vis_padd16(TMP8
, TMP20
, TMP8
);
975 vis_padd16(TMP10
, TMP22
, TMP10
);
976 vis_pack16(TMP8
, DST_2
);
978 vis_pack16(TMP10
, DST_3
);
979 vis_st64(DST_2
, dest
[0]);
984 static void MC_put_y_16_vis (uint8_t * dest
, const uint8_t * ref
,
985 const int stride
, int height
)
987 ref
= vis_alignaddr(ref
);
988 vis_ld64(ref
[0], TMP0
);
990 vis_ld64_2(ref
, 8, TMP2
);
992 vis_ld64_2(ref
, 16, TMP4
);
995 vis_ld64(ref
[0], TMP6
);
996 vis_faligndata(TMP0
, TMP2
, REF_0
);
998 vis_ld64_2(ref
, 8, TMP8
);
999 vis_faligndata(TMP2
, TMP4
, REF_4
);
1001 vis_ld64_2(ref
, 16, TMP10
);
1004 vis_ld64(constants_fe
[0], MASK_fe
);
1005 vis_faligndata(TMP6
, TMP8
, REF_2
);
1007 vis_ld64(constants_7f
[0], MASK_7f
);
1008 vis_faligndata(TMP8
, TMP10
, REF_6
);
1010 vis_ld64(constants128
[0], CONST_128
);
1011 height
= (height
>> 1) - 1;
1012 do { /* 24 cycles */
1013 vis_ld64(ref
[0], TMP0
);
1014 vis_xor(REF_0
, REF_2
, TMP12
);
1016 vis_ld64_2(ref
, 8, TMP2
);
1017 vis_xor(REF_4
, REF_6
, TMP16
);
1019 vis_ld64_2(ref
, 16, TMP4
);
1021 vis_or(REF_0
, REF_2
, TMP14
);
1023 vis_ld64(ref
[0], TMP6
);
1024 vis_or(REF_4
, REF_6
, TMP18
);
1026 vis_ld64_2(ref
, 8, TMP8
);
1027 vis_faligndata(TMP0
, TMP2
, REF_0
);
1029 vis_ld64_2(ref
, 16, TMP10
);
1031 vis_faligndata(TMP2
, TMP4
, REF_4
);
1033 vis_and(TMP12
, MASK_fe
, TMP12
);
1035 vis_and(TMP16
, MASK_fe
, TMP16
);
1036 vis_mul8x16(CONST_128
, TMP12
, TMP12
);
1038 vis_mul8x16(CONST_128
, TMP16
, TMP16
);
1039 vis_xor(REF_0
, REF_2
, TMP0
);
1041 vis_xor(REF_4
, REF_6
, TMP2
);
1043 vis_or(REF_0
, REF_2
, TMP20
);
1045 vis_and(TMP12
, MASK_7f
, TMP12
);
1047 vis_and(TMP16
, MASK_7f
, TMP16
);
1049 vis_psub16(TMP14
, TMP12
, TMP12
);
1050 vis_st64(TMP12
, dest
[0]);
1052 vis_psub16(TMP18
, TMP16
, TMP16
);
1053 vis_st64_2(TMP16
, dest
, 8);
1056 vis_or(REF_4
, REF_6
, TMP18
);
1058 vis_and(TMP0
, MASK_fe
, TMP0
);
1060 vis_and(TMP2
, MASK_fe
, TMP2
);
1061 vis_mul8x16(CONST_128
, TMP0
, TMP0
);
1063 vis_faligndata(TMP6
, TMP8
, REF_2
);
1064 vis_mul8x16(CONST_128
, TMP2
, TMP2
);
1066 vis_faligndata(TMP8
, TMP10
, REF_6
);
1068 vis_and(TMP0
, MASK_7f
, TMP0
);
1070 vis_and(TMP2
, MASK_7f
, TMP2
);
1072 vis_psub16(TMP20
, TMP0
, TMP0
);
1073 vis_st64(TMP0
, dest
[0]);
1075 vis_psub16(TMP18
, TMP2
, TMP2
);
1076 vis_st64_2(TMP2
, dest
, 8);
1080 vis_ld64(ref
[0], TMP0
);
1081 vis_xor(REF_0
, REF_2
, TMP12
);
1083 vis_ld64_2(ref
, 8, TMP2
);
1084 vis_xor(REF_4
, REF_6
, TMP16
);
1086 vis_ld64_2(ref
, 16, TMP4
);
1087 vis_or(REF_0
, REF_2
, TMP14
);
1089 vis_or(REF_4
, REF_6
, TMP18
);
1091 vis_faligndata(TMP0
, TMP2
, REF_0
);
1093 vis_faligndata(TMP2
, TMP4
, REF_4
);
1095 vis_and(TMP12
, MASK_fe
, TMP12
);
1097 vis_and(TMP16
, MASK_fe
, TMP16
);
1098 vis_mul8x16(CONST_128
, TMP12
, TMP12
);
1100 vis_mul8x16(CONST_128
, TMP16
, TMP16
);
1101 vis_xor(REF_0
, REF_2
, TMP0
);
1103 vis_xor(REF_4
, REF_6
, TMP2
);
1105 vis_or(REF_0
, REF_2
, TMP20
);
1107 vis_and(TMP12
, MASK_7f
, TMP12
);
1109 vis_and(TMP16
, MASK_7f
, TMP16
);
1111 vis_psub16(TMP14
, TMP12
, TMP12
);
1112 vis_st64(TMP12
, dest
[0]);
1114 vis_psub16(TMP18
, TMP16
, TMP16
);
1115 vis_st64_2(TMP16
, dest
, 8);
1118 vis_or(REF_4
, REF_6
, TMP18
);
1120 vis_and(TMP0
, MASK_fe
, TMP0
);
1122 vis_and(TMP2
, MASK_fe
, TMP2
);
1123 vis_mul8x16(CONST_128
, TMP0
, TMP0
);
1125 vis_mul8x16(CONST_128
, TMP2
, TMP2
);
1127 vis_and(TMP0
, MASK_7f
, TMP0
);
1129 vis_and(TMP2
, MASK_7f
, TMP2
);
1131 vis_psub16(TMP20
, TMP0
, TMP0
);
1132 vis_st64(TMP0
, dest
[0]);
1134 vis_psub16(TMP18
, TMP2
, TMP2
);
1135 vis_st64_2(TMP2
, dest
, 8);
1138 static void MC_put_y_8_vis (uint8_t * dest
, const uint8_t * ref
,
1139 const int stride
, int height
)
1141 ref
= vis_alignaddr(ref
);
1142 vis_ld64(ref
[0], TMP0
);
1144 vis_ld64_2(ref
, 8, TMP2
);
1147 vis_ld64(ref
[0], TMP4
);
1149 vis_ld64_2(ref
, 8, TMP6
);
1152 vis_ld64(constants_fe
[0], MASK_fe
);
1153 vis_faligndata(TMP0
, TMP2
, REF_0
);
1155 vis_ld64(constants_7f
[0], MASK_7f
);
1156 vis_faligndata(TMP4
, TMP6
, REF_2
);
1158 vis_ld64(constants128
[0], CONST_128
);
1159 height
= (height
>> 1) - 1;
1160 do { /* 12 cycles */
1161 vis_ld64(ref
[0], TMP0
);
1162 vis_xor(REF_0
, REF_2
, TMP4
);
1164 vis_ld64_2(ref
, 8, TMP2
);
1166 vis_and(TMP4
, MASK_fe
, TMP4
);
1168 vis_or(REF_0
, REF_2
, TMP6
);
1169 vis_mul8x16(CONST_128
, TMP4
, TMP4
);
1171 vis_faligndata(TMP0
, TMP2
, REF_0
);
1172 vis_ld64(ref
[0], TMP0
);
1174 vis_ld64_2(ref
, 8, TMP2
);
1176 vis_xor(REF_0
, REF_2
, TMP12
);
1178 vis_and(TMP4
, MASK_7f
, TMP4
);
1180 vis_and(TMP12
, MASK_fe
, TMP12
);
1182 vis_mul8x16(CONST_128
, TMP12
, TMP12
);
1183 vis_or(REF_0
, REF_2
, TMP14
);
1185 vis_psub16(TMP6
, TMP4
, DST_0
);
1186 vis_st64(DST_0
, dest
[0]);
1189 vis_faligndata(TMP0
, TMP2
, REF_2
);
1191 vis_and(TMP12
, MASK_7f
, TMP12
);
1193 vis_psub16(TMP14
, TMP12
, DST_0
);
1194 vis_st64(DST_0
, dest
[0]);
1198 vis_ld64(ref
[0], TMP0
);
1199 vis_xor(REF_0
, REF_2
, TMP4
);
1201 vis_ld64_2(ref
, 8, TMP2
);
1202 vis_and(TMP4
, MASK_fe
, TMP4
);
1204 vis_or(REF_0
, REF_2
, TMP6
);
1205 vis_mul8x16(CONST_128
, TMP4
, TMP4
);
1207 vis_faligndata(TMP0
, TMP2
, REF_0
);
1209 vis_xor(REF_0
, REF_2
, TMP12
);
1211 vis_and(TMP4
, MASK_7f
, TMP4
);
1213 vis_and(TMP12
, MASK_fe
, TMP12
);
1215 vis_mul8x16(CONST_128
, TMP12
, TMP12
);
1216 vis_or(REF_0
, REF_2
, TMP14
);
1218 vis_psub16(TMP6
, TMP4
, DST_0
);
1219 vis_st64(DST_0
, dest
[0]);
1222 vis_and(TMP12
, MASK_7f
, TMP12
);
1224 vis_psub16(TMP14
, TMP12
, DST_0
);
1225 vis_st64(DST_0
, dest
[0]);
1228 static void MC_avg_y_16_vis (uint8_t * dest
, const uint8_t * ref
,
1229 const int stride
, int height
)
1231 int stride_8
= stride
+ 8;
1232 int stride_16
= stride
+ 16;
1234 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT
);
1236 ref
= vis_alignaddr(ref
);
1238 vis_ld64(ref
[ 0], TMP0
);
1241 vis_ld64(ref
[ 8], TMP2
);
1243 vis_ld64(ref
[16], TMP4
);
1245 vis_ld64(constants3
[0], CONST_3
);
1246 vis_faligndata(TMP0
, TMP2
, REF_2
);
1248 vis_ld64(constants256_512
[0], CONST_256
);
1249 vis_faligndata(TMP2
, TMP4
, REF_6
);
1252 do { /* 31 cycles */
1253 vis_ld64_2(ref
, stride
, TMP0
);
1254 vis_pmerge(ZERO
, REF_2
, TMP12
);
1255 vis_mul8x16au(REF_2_1
, CONST_256
, TMP14
);
1257 vis_ld64_2(ref
, stride_8
, TMP2
);
1258 vis_pmerge(ZERO
, REF_6
, TMP16
);
1259 vis_mul8x16au(REF_6_1
, CONST_256
, TMP18
);
1261 vis_ld64_2(ref
, stride_16
, TMP4
);
1264 vis_ld64(dest
[0], DST_0
);
1265 vis_faligndata(TMP0
, TMP2
, REF_0
);
1267 vis_ld64_2(dest
, 8, DST_2
);
1268 vis_faligndata(TMP2
, TMP4
, REF_4
);
1270 vis_ld64_2(ref
, stride
, TMP6
);
1271 vis_pmerge(ZERO
, REF_0
, TMP0
);
1272 vis_mul8x16au(REF_0_1
, CONST_256
, TMP2
);
1274 vis_ld64_2(ref
, stride_8
, TMP8
);
1275 vis_pmerge(ZERO
, REF_4
, TMP4
);
1277 vis_ld64_2(ref
, stride_16
, TMP10
);
1280 vis_ld64_2(dest
, stride
, REF_S0
/*DST_4*/);
1281 vis_faligndata(TMP6
, TMP8
, REF_2
);
1282 vis_mul8x16au(REF_4_1
, CONST_256
, TMP6
);
1284 vis_ld64_2(dest
, stride_8
, REF_S2
/*DST_6*/);
1285 vis_faligndata(TMP8
, TMP10
, REF_6
);
1286 vis_mul8x16al(DST_0
, CONST_512
, TMP20
);
1288 vis_padd16(TMP0
, CONST_3
, TMP0
);
1289 vis_mul8x16al(DST_1
, CONST_512
, TMP22
);
1291 vis_padd16(TMP2
, CONST_3
, TMP2
);
1292 vis_mul8x16al(DST_2
, CONST_512
, TMP24
);
1294 vis_padd16(TMP4
, CONST_3
, TMP4
);
1295 vis_mul8x16al(DST_3
, CONST_512
, TMP26
);
1297 vis_padd16(TMP6
, CONST_3
, TMP6
);
1299 vis_padd16(TMP12
, TMP20
, TMP12
);
1300 vis_mul8x16al(REF_S0
, CONST_512
, TMP20
);
1302 vis_padd16(TMP14
, TMP22
, TMP14
);
1303 vis_mul8x16al(REF_S0_1
, CONST_512
, TMP22
);
1305 vis_padd16(TMP16
, TMP24
, TMP16
);
1306 vis_mul8x16al(REF_S2
, CONST_512
, TMP24
);
1308 vis_padd16(TMP18
, TMP26
, TMP18
);
1309 vis_mul8x16al(REF_S2_1
, CONST_512
, TMP26
);
1311 vis_padd16(TMP12
, TMP0
, TMP12
);
1312 vis_mul8x16au(REF_2
, CONST_256
, TMP28
);
1314 vis_padd16(TMP14
, TMP2
, TMP14
);
1315 vis_mul8x16au(REF_2_1
, CONST_256
, TMP30
);
1317 vis_padd16(TMP16
, TMP4
, TMP16
);
1318 vis_mul8x16au(REF_6
, CONST_256
, REF_S4
);
1320 vis_padd16(TMP18
, TMP6
, TMP18
);
1321 vis_mul8x16au(REF_6_1
, CONST_256
, REF_S6
);
1323 vis_pack16(TMP12
, DST_0
);
1324 vis_padd16(TMP28
, TMP0
, TMP12
);
1326 vis_pack16(TMP14
, DST_1
);
1327 vis_st64(DST_0
, dest
[0]);
1328 vis_padd16(TMP30
, TMP2
, TMP14
);
1330 vis_pack16(TMP16
, DST_2
);
1331 vis_padd16(REF_S4
, TMP4
, TMP16
);
1333 vis_pack16(TMP18
, DST_3
);
1334 vis_st64_2(DST_2
, dest
, 8);
1336 vis_padd16(REF_S6
, TMP6
, TMP18
);
1338 vis_padd16(TMP12
, TMP20
, TMP12
);
1340 vis_padd16(TMP14
, TMP22
, TMP14
);
1341 vis_pack16(TMP12
, DST_0
);
1343 vis_padd16(TMP16
, TMP24
, TMP16
);
1344 vis_pack16(TMP14
, DST_1
);
1345 vis_st64(DST_0
, dest
[0]);
1347 vis_padd16(TMP18
, TMP26
, TMP18
);
1348 vis_pack16(TMP16
, DST_2
);
1350 vis_pack16(TMP18
, DST_3
);
1351 vis_st64_2(DST_2
, dest
, 8);
1356 static void MC_avg_y_8_vis (uint8_t * dest
, const uint8_t * ref
,
1357 const int stride
, int height
)
1359 int stride_8
= stride
+ 8;
1361 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT
);
1363 ref
= vis_alignaddr(ref
);
1365 vis_ld64(ref
[ 0], TMP0
);
1368 vis_ld64(ref
[ 8], TMP2
);
1370 vis_ld64(constants3
[0], CONST_3
);
1371 vis_faligndata(TMP0
, TMP2
, REF_2
);
1373 vis_ld64(constants256_512
[0], CONST_256
);
1376 do { /* 20 cycles */
1377 vis_ld64_2(ref
, stride
, TMP0
);
1378 vis_pmerge(ZERO
, REF_2
, TMP8
);
1379 vis_mul8x16au(REF_2_1
, CONST_256
, TMP10
);
1381 vis_ld64_2(ref
, stride_8
, TMP2
);
1384 vis_ld64(dest
[0], DST_0
);
1386 vis_ld64_2(dest
, stride
, DST_2
);
1387 vis_faligndata(TMP0
, TMP2
, REF_0
);
1389 vis_ld64_2(ref
, stride
, TMP4
);
1390 vis_mul8x16al(DST_0
, CONST_512
, TMP16
);
1391 vis_pmerge(ZERO
, REF_0
, TMP12
);
1393 vis_ld64_2(ref
, stride_8
, TMP6
);
1395 vis_mul8x16al(DST_1
, CONST_512
, TMP18
);
1396 vis_pmerge(ZERO
, REF_0_1
, TMP14
);
1398 vis_padd16(TMP12
, CONST_3
, TMP12
);
1399 vis_mul8x16al(DST_2
, CONST_512
, TMP24
);
1401 vis_padd16(TMP14
, CONST_3
, TMP14
);
1402 vis_mul8x16al(DST_3
, CONST_512
, TMP26
);
1404 vis_faligndata(TMP4
, TMP6
, REF_2
);
1406 vis_padd16(TMP8
, TMP12
, TMP8
);
1408 vis_padd16(TMP10
, TMP14
, TMP10
);
1409 vis_mul8x16au(REF_2
, CONST_256
, TMP20
);
1411 vis_padd16(TMP8
, TMP16
, TMP0
);
1412 vis_mul8x16au(REF_2_1
, CONST_256
, TMP22
);
1414 vis_padd16(TMP10
, TMP18
, TMP2
);
1415 vis_pack16(TMP0
, DST_0
);
1417 vis_pack16(TMP2
, DST_1
);
1418 vis_st64(DST_0
, dest
[0]);
1420 vis_padd16(TMP12
, TMP20
, TMP12
);
1422 vis_padd16(TMP14
, TMP22
, TMP14
);
1424 vis_padd16(TMP12
, TMP24
, TMP0
);
1426 vis_padd16(TMP14
, TMP26
, TMP2
);
1427 vis_pack16(TMP0
, DST_2
);
1429 vis_pack16(TMP2
, DST_3
);
1430 vis_st64(DST_2
, dest
[0]);
1435 static void MC_put_xy_16_vis (uint8_t * dest
, const uint8_t * ref
,
1436 const int stride
, int height
)
1438 unsigned long off
= (unsigned long) ref
& 0x7;
1439 unsigned long off_plus_1
= off
+ 1;
1440 int stride_8
= stride
+ 8;
1441 int stride_16
= stride
+ 16;
1443 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT
);
1445 ref
= vis_alignaddr(ref
);
1447 vis_ld64(ref
[ 0], TMP0
);
1450 vis_ld64(ref
[ 8], TMP2
);
1452 vis_ld64(ref
[16], TMP4
);
1454 vis_ld64(constants2
[0], CONST_2
);
1455 vis_faligndata(TMP0
, TMP2
, REF_S0
);
1457 vis_ld64(constants256_512
[0], CONST_256
);
1458 vis_faligndata(TMP2
, TMP4
, REF_S4
);
1461 vis_alignaddr_g0((void *)off_plus_1
);
1462 vis_faligndata(TMP0
, TMP2
, REF_S2
);
1463 vis_faligndata(TMP2
, TMP4
, REF_S6
);
1465 vis_src1(TMP2
, REF_S2
);
1466 vis_src1(TMP4
, REF_S6
);
1471 vis_ld64_2(ref
, stride
, TMP0
);
1472 vis_mul8x16au(REF_S0
, CONST_256
, TMP12
);
1473 vis_pmerge(ZERO
, REF_S0_1
, TMP14
);
1475 vis_alignaddr_g0((void *)off
);
1477 vis_ld64_2(ref
, stride_8
, TMP2
);
1478 vis_mul8x16au(REF_S2
, CONST_256
, TMP16
);
1479 vis_pmerge(ZERO
, REF_S2_1
, TMP18
);
1481 vis_ld64_2(ref
, stride_16
, TMP4
);
1483 vis_mul8x16au(REF_S4
, CONST_256
, TMP20
);
1484 vis_pmerge(ZERO
, REF_S4_1
, TMP22
);
1486 vis_ld64_2(ref
, stride
, TMP6
);
1487 vis_mul8x16au(REF_S6
, CONST_256
, TMP24
);
1488 vis_pmerge(ZERO
, REF_S6_1
, TMP26
);
1490 vis_ld64_2(ref
, stride_8
, TMP8
);
1491 vis_faligndata(TMP0
, TMP2
, REF_0
);
1493 vis_ld64_2(ref
, stride_16
, TMP10
);
1495 vis_faligndata(TMP2
, TMP4
, REF_4
);
1497 vis_faligndata(TMP6
, TMP8
, REF_S0
);
1499 vis_faligndata(TMP8
, TMP10
, REF_S4
);
1502 vis_alignaddr_g0((void *)off_plus_1
);
1503 vis_faligndata(TMP0
, TMP2
, REF_2
);
1504 vis_faligndata(TMP2
, TMP4
, REF_6
);
1505 vis_faligndata(TMP6
, TMP8
, REF_S2
);
1506 vis_faligndata(TMP8
, TMP10
, REF_S6
);
1508 vis_src1(TMP2
, REF_2
);
1509 vis_src1(TMP4
, REF_6
);
1510 vis_src1(TMP8
, REF_S2
);
1511 vis_src1(TMP10
, REF_S6
);
1514 vis_mul8x16au(REF_0
, CONST_256
, TMP0
);
1515 vis_pmerge(ZERO
, REF_0_1
, TMP2
);
1517 vis_mul8x16au(REF_2
, CONST_256
, TMP4
);
1518 vis_pmerge(ZERO
, REF_2_1
, TMP6
);
1520 vis_padd16(TMP0
, CONST_2
, TMP8
);
1521 vis_mul8x16au(REF_4
, CONST_256
, TMP0
);
1523 vis_padd16(TMP2
, CONST_2
, TMP10
);
1524 vis_mul8x16au(REF_4_1
, CONST_256
, TMP2
);
1526 vis_padd16(TMP8
, TMP4
, TMP8
);
1527 vis_mul8x16au(REF_6
, CONST_256
, TMP4
);
1529 vis_padd16(TMP10
, TMP6
, TMP10
);
1530 vis_mul8x16au(REF_6_1
, CONST_256
, TMP6
);
1532 vis_padd16(TMP12
, TMP8
, TMP12
);
1534 vis_padd16(TMP14
, TMP10
, TMP14
);
1536 vis_padd16(TMP12
, TMP16
, TMP12
);
1538 vis_padd16(TMP14
, TMP18
, TMP14
);
1539 vis_pack16(TMP12
, DST_0
);
1541 vis_pack16(TMP14
, DST_1
);
1542 vis_st64(DST_0
, dest
[0]);
1543 vis_padd16(TMP0
, CONST_2
, TMP12
);
1545 vis_mul8x16au(REF_S0
, CONST_256
, TMP0
);
1546 vis_padd16(TMP2
, CONST_2
, TMP14
);
1548 vis_mul8x16au(REF_S0_1
, CONST_256
, TMP2
);
1549 vis_padd16(TMP12
, TMP4
, TMP12
);
1551 vis_mul8x16au(REF_S2
, CONST_256
, TMP4
);
1552 vis_padd16(TMP14
, TMP6
, TMP14
);
1554 vis_mul8x16au(REF_S2_1
, CONST_256
, TMP6
);
1555 vis_padd16(TMP20
, TMP12
, TMP20
);
1557 vis_padd16(TMP22
, TMP14
, TMP22
);
1559 vis_padd16(TMP20
, TMP24
, TMP20
);
1561 vis_padd16(TMP22
, TMP26
, TMP22
);
1562 vis_pack16(TMP20
, DST_2
);
1564 vis_pack16(TMP22
, DST_3
);
1565 vis_st64_2(DST_2
, dest
, 8);
1567 vis_padd16(TMP0
, TMP4
, TMP24
);
1569 vis_mul8x16au(REF_S4
, CONST_256
, TMP0
);
1570 vis_padd16(TMP2
, TMP6
, TMP26
);
1572 vis_mul8x16au(REF_S4_1
, CONST_256
, TMP2
);
1573 vis_padd16(TMP24
, TMP8
, TMP24
);
1575 vis_padd16(TMP26
, TMP10
, TMP26
);
1576 vis_pack16(TMP24
, DST_0
);
1578 vis_pack16(TMP26
, DST_1
);
1579 vis_st64(DST_0
, dest
[0]);
1580 vis_pmerge(ZERO
, REF_S6
, TMP4
);
1582 vis_pmerge(ZERO
, REF_S6_1
, TMP6
);
1584 vis_padd16(TMP0
, TMP4
, TMP0
);
1586 vis_padd16(TMP2
, TMP6
, TMP2
);
1588 vis_padd16(TMP0
, TMP12
, TMP0
);
1590 vis_padd16(TMP2
, TMP14
, TMP2
);
1591 vis_pack16(TMP0
, DST_2
);
1593 vis_pack16(TMP2
, DST_3
);
1594 vis_st64_2(DST_2
, dest
, 8);
1599 static void MC_put_xy_8_vis (uint8_t * dest
, const uint8_t * ref
,
1600 const int stride
, int height
)
1602 unsigned long off
= (unsigned long) ref
& 0x7;
1603 unsigned long off_plus_1
= off
+ 1;
1604 int stride_8
= stride
+ 8;
1606 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT
);
1608 ref
= vis_alignaddr(ref
);
1610 vis_ld64(ref
[ 0], TMP0
);
1613 vis_ld64(ref
[ 8], TMP2
);
1615 vis_ld64(constants2
[0], CONST_2
);
1617 vis_ld64(constants256_512
[0], CONST_256
);
1618 vis_faligndata(TMP0
, TMP2
, REF_S0
);
1621 vis_alignaddr_g0((void *)off_plus_1
);
1622 vis_faligndata(TMP0
, TMP2
, REF_S2
);
1624 vis_src1(TMP2
, REF_S2
);
1628 do { /* 26 cycles */
1629 vis_ld64_2(ref
, stride
, TMP0
);
1630 vis_mul8x16au(REF_S0
, CONST_256
, TMP8
);
1631 vis_pmerge(ZERO
, REF_S2
, TMP12
);
1633 vis_alignaddr_g0((void *)off
);
1635 vis_ld64_2(ref
, stride_8
, TMP2
);
1637 vis_mul8x16au(REF_S0_1
, CONST_256
, TMP10
);
1638 vis_pmerge(ZERO
, REF_S2_1
, TMP14
);
1640 vis_ld64_2(ref
, stride
, TMP4
);
1642 vis_ld64_2(ref
, stride_8
, TMP6
);
1644 vis_faligndata(TMP0
, TMP2
, REF_S4
);
1646 vis_pmerge(ZERO
, REF_S4
, TMP18
);
1648 vis_pmerge(ZERO
, REF_S4_1
, TMP20
);
1650 vis_faligndata(TMP4
, TMP6
, REF_S0
);
1653 vis_alignaddr_g0((void *)off_plus_1
);
1654 vis_faligndata(TMP0
, TMP2
, REF_S6
);
1655 vis_faligndata(TMP4
, TMP6
, REF_S2
);
1657 vis_src1(TMP2
, REF_S6
);
1658 vis_src1(TMP6
, REF_S2
);
1661 vis_padd16(TMP18
, CONST_2
, TMP18
);
1662 vis_mul8x16au(REF_S6
, CONST_256
, TMP22
);
1664 vis_padd16(TMP20
, CONST_2
, TMP20
);
1665 vis_mul8x16au(REF_S6_1
, CONST_256
, TMP24
);
1667 vis_mul8x16au(REF_S0
, CONST_256
, TMP26
);
1668 vis_pmerge(ZERO
, REF_S0_1
, TMP28
);
1670 vis_mul8x16au(REF_S2
, CONST_256
, TMP30
);
1671 vis_padd16(TMP18
, TMP22
, TMP18
);
1673 vis_mul8x16au(REF_S2_1
, CONST_256
, TMP32
);
1674 vis_padd16(TMP20
, TMP24
, TMP20
);
1676 vis_padd16(TMP8
, TMP18
, TMP8
);
1678 vis_padd16(TMP10
, TMP20
, TMP10
);
1680 vis_padd16(TMP8
, TMP12
, TMP8
);
1682 vis_padd16(TMP10
, TMP14
, TMP10
);
1683 vis_pack16(TMP8
, DST_0
);
1685 vis_pack16(TMP10
, DST_1
);
1686 vis_st64(DST_0
, dest
[0]);
1688 vis_padd16(TMP18
, TMP26
, TMP18
);
1690 vis_padd16(TMP20
, TMP28
, TMP20
);
1692 vis_padd16(TMP18
, TMP30
, TMP18
);
1694 vis_padd16(TMP20
, TMP32
, TMP20
);
1695 vis_pack16(TMP18
, DST_2
);
1697 vis_pack16(TMP20
, DST_3
);
1698 vis_st64(DST_2
, dest
[0]);
1703 static void MC_avg_xy_16_vis (uint8_t * dest
, const uint8_t * ref
,
1704 const int stride
, int height
)
1706 unsigned long off
= (unsigned long) ref
& 0x7;
1707 unsigned long off_plus_1
= off
+ 1;
1708 int stride_8
= stride
+ 8;
1709 int stride_16
= stride
+ 16;
1711 vis_set_gsr(4 << VIS_GSR_SCALEFACT_SHIFT
);
1713 ref
= vis_alignaddr(ref
);
1715 vis_ld64(ref
[ 0], TMP0
);
1718 vis_ld64(ref
[ 8], TMP2
);
1720 vis_ld64(ref
[16], TMP4
);
1722 vis_ld64(constants6
[0], CONST_6
);
1723 vis_faligndata(TMP0
, TMP2
, REF_S0
);
1725 vis_ld64(constants256_1024
[0], CONST_256
);
1726 vis_faligndata(TMP2
, TMP4
, REF_S4
);
1729 vis_alignaddr_g0((void *)off_plus_1
);
1730 vis_faligndata(TMP0
, TMP2
, REF_S2
);
1731 vis_faligndata(TMP2
, TMP4
, REF_S6
);
1733 vis_src1(TMP2
, REF_S2
);
1734 vis_src1(TMP4
, REF_S6
);
1738 do { /* 55 cycles */
1739 vis_ld64_2(ref
, stride
, TMP0
);
1740 vis_mul8x16au(REF_S0
, CONST_256
, TMP12
);
1741 vis_pmerge(ZERO
, REF_S0_1
, TMP14
);
1743 vis_alignaddr_g0((void *)off
);
1745 vis_ld64_2(ref
, stride_8
, TMP2
);
1746 vis_mul8x16au(REF_S2
, CONST_256
, TMP16
);
1747 vis_pmerge(ZERO
, REF_S2_1
, TMP18
);
1749 vis_ld64_2(ref
, stride_16
, TMP4
);
1751 vis_mul8x16au(REF_S4
, CONST_256
, TMP20
);
1752 vis_pmerge(ZERO
, REF_S4_1
, TMP22
);
1754 vis_ld64_2(ref
, stride
, TMP6
);
1755 vis_mul8x16au(REF_S6
, CONST_256
, TMP24
);
1756 vis_pmerge(ZERO
, REF_S6_1
, TMP26
);
1758 vis_ld64_2(ref
, stride_8
, TMP8
);
1759 vis_faligndata(TMP0
, TMP2
, REF_0
);
1761 vis_ld64_2(ref
, stride_16
, TMP10
);
1763 vis_faligndata(TMP2
, TMP4
, REF_4
);
1765 vis_ld64(dest
[0], DST_0
);
1766 vis_faligndata(TMP6
, TMP8
, REF_S0
);
1768 vis_ld64_2(dest
, 8, DST_2
);
1769 vis_faligndata(TMP8
, TMP10
, REF_S4
);
1772 vis_alignaddr_g0((void *)off_plus_1
);
1773 vis_faligndata(TMP0
, TMP2
, REF_2
);
1774 vis_faligndata(TMP2
, TMP4
, REF_6
);
1775 vis_faligndata(TMP6
, TMP8
, REF_S2
);
1776 vis_faligndata(TMP8
, TMP10
, REF_S6
);
1778 vis_src1(TMP2
, REF_2
);
1779 vis_src1(TMP4
, REF_6
);
1780 vis_src1(TMP8
, REF_S2
);
1781 vis_src1(TMP10
, REF_S6
);
1784 vis_mul8x16al(DST_0
, CONST_1024
, TMP30
);
1785 vis_pmerge(ZERO
, REF_0
, TMP0
);
1787 vis_mul8x16al(DST_1
, CONST_1024
, TMP32
);
1788 vis_pmerge(ZERO
, REF_0_1
, TMP2
);
1790 vis_mul8x16au(REF_2
, CONST_256
, TMP4
);
1791 vis_pmerge(ZERO
, REF_2_1
, TMP6
);
1793 vis_mul8x16al(DST_2
, CONST_1024
, REF_0
);
1794 vis_padd16(TMP0
, CONST_6
, TMP0
);
1796 vis_mul8x16al(DST_3
, CONST_1024
, REF_2
);
1797 vis_padd16(TMP2
, CONST_6
, TMP2
);
1799 vis_padd16(TMP0
, TMP4
, TMP0
);
1800 vis_mul8x16au(REF_4
, CONST_256
, TMP4
);
1802 vis_padd16(TMP2
, TMP6
, TMP2
);
1803 vis_mul8x16au(REF_4_1
, CONST_256
, TMP6
);
1805 vis_padd16(TMP12
, TMP0
, TMP12
);
1806 vis_mul8x16au(REF_6
, CONST_256
, TMP8
);
1808 vis_padd16(TMP14
, TMP2
, TMP14
);
1809 vis_mul8x16au(REF_6_1
, CONST_256
, TMP10
);
1811 vis_padd16(TMP12
, TMP16
, TMP12
);
1812 vis_mul8x16au(REF_S0
, CONST_256
, REF_4
);
1814 vis_padd16(TMP14
, TMP18
, TMP14
);
1815 vis_mul8x16au(REF_S0_1
, CONST_256
, REF_6
);
1817 vis_padd16(TMP12
, TMP30
, TMP12
);
1819 vis_padd16(TMP14
, TMP32
, TMP14
);
1820 vis_pack16(TMP12
, DST_0
);
1822 vis_pack16(TMP14
, DST_1
);
1823 vis_st64(DST_0
, dest
[0]);
1824 vis_padd16(TMP4
, CONST_6
, TMP4
);
1826 vis_ld64_2(dest
, stride
, DST_0
);
1827 vis_padd16(TMP6
, CONST_6
, TMP6
);
1828 vis_mul8x16au(REF_S2
, CONST_256
, TMP12
);
1830 vis_padd16(TMP4
, TMP8
, TMP4
);
1831 vis_mul8x16au(REF_S2_1
, CONST_256
, TMP14
);
1833 vis_padd16(TMP6
, TMP10
, TMP6
);
1835 vis_padd16(TMP20
, TMP4
, TMP20
);
1837 vis_padd16(TMP22
, TMP6
, TMP22
);
1839 vis_padd16(TMP20
, TMP24
, TMP20
);
1841 vis_padd16(TMP22
, TMP26
, TMP22
);
1843 vis_padd16(TMP20
, REF_0
, TMP20
);
1844 vis_mul8x16au(REF_S4
, CONST_256
, REF_0
);
1846 vis_padd16(TMP22
, REF_2
, TMP22
);
1847 vis_pack16(TMP20
, DST_2
);
1849 vis_pack16(TMP22
, DST_3
);
1850 vis_st64_2(DST_2
, dest
, 8);
1853 vis_ld64_2(dest
, 8, DST_2
);
1854 vis_mul8x16al(DST_0
, CONST_1024
, TMP30
);
1855 vis_pmerge(ZERO
, REF_S4_1
, REF_2
);
1857 vis_mul8x16al(DST_1
, CONST_1024
, TMP32
);
1858 vis_padd16(REF_4
, TMP0
, TMP8
);
1860 vis_mul8x16au(REF_S6
, CONST_256
, REF_4
);
1861 vis_padd16(REF_6
, TMP2
, TMP10
);
1863 vis_mul8x16au(REF_S6_1
, CONST_256
, REF_6
);
1864 vis_padd16(TMP8
, TMP12
, TMP8
);
1866 vis_padd16(TMP10
, TMP14
, TMP10
);
1868 vis_padd16(TMP8
, TMP30
, TMP8
);
1870 vis_padd16(TMP10
, TMP32
, TMP10
);
1871 vis_pack16(TMP8
, DST_0
);
1873 vis_pack16(TMP10
, DST_1
);
1874 vis_st64(DST_0
, dest
[0]);
1876 vis_padd16(REF_0
, TMP4
, REF_0
);
1878 vis_mul8x16al(DST_2
, CONST_1024
, TMP30
);
1879 vis_padd16(REF_2
, TMP6
, REF_2
);
1881 vis_mul8x16al(DST_3
, CONST_1024
, TMP32
);
1882 vis_padd16(REF_0
, REF_4
, REF_0
);
1884 vis_padd16(REF_2
, REF_6
, REF_2
);
1886 vis_padd16(REF_0
, TMP30
, REF_0
);
1890 vis_padd16(REF_2
, TMP32
, REF_2
);
1891 vis_pack16(REF_0
, DST_2
);
1893 vis_pack16(REF_2
, DST_3
);
1894 vis_st64_2(DST_2
, dest
, 8);
1899 static void MC_avg_xy_8_vis (uint8_t * dest
, const uint8_t * ref
,
1900 const int stride
, int height
)
1902 unsigned long off
= (unsigned long) ref
& 0x7;
1903 unsigned long off_plus_1
= off
+ 1;
1904 int stride_8
= stride
+ 8;
1906 vis_set_gsr(4 << VIS_GSR_SCALEFACT_SHIFT
);
1908 ref
= vis_alignaddr(ref
);
1910 vis_ld64(ref
[0], TMP0
);
1913 vis_ld64_2(ref
, 8, TMP2
);
1915 vis_ld64(constants6
[0], CONST_6
);
1917 vis_ld64(constants256_1024
[0], CONST_256
);
1918 vis_faligndata(TMP0
, TMP2
, REF_S0
);
1921 vis_alignaddr_g0((void *)off_plus_1
);
1922 vis_faligndata(TMP0
, TMP2
, REF_S2
);
1924 vis_src1(TMP2
, REF_S2
);
1928 do { /* 31 cycles */
1929 vis_ld64_2(ref
, stride
, TMP0
);
1930 vis_mul8x16au(REF_S0
, CONST_256
, TMP8
);
1931 vis_pmerge(ZERO
, REF_S0_1
, TMP10
);
1933 vis_ld64_2(ref
, stride_8
, TMP2
);
1935 vis_mul8x16au(REF_S2
, CONST_256
, TMP12
);
1936 vis_pmerge(ZERO
, REF_S2_1
, TMP14
);
1938 vis_alignaddr_g0((void *)off
);
1940 vis_ld64_2(ref
, stride
, TMP4
);
1941 vis_faligndata(TMP0
, TMP2
, REF_S4
);
1943 vis_ld64_2(ref
, stride_8
, TMP6
);
1946 vis_ld64(dest
[0], DST_0
);
1947 vis_faligndata(TMP4
, TMP6
, REF_S0
);
1949 vis_ld64_2(dest
, stride
, DST_2
);
1952 vis_alignaddr_g0((void *)off_plus_1
);
1953 vis_faligndata(TMP0
, TMP2
, REF_S6
);
1954 vis_faligndata(TMP4
, TMP6
, REF_S2
);
1956 vis_src1(TMP2
, REF_S6
);
1957 vis_src1(TMP6
, REF_S2
);
1960 vis_mul8x16al(DST_0
, CONST_1024
, TMP30
);
1961 vis_pmerge(ZERO
, REF_S4
, TMP22
);
1963 vis_mul8x16al(DST_1
, CONST_1024
, TMP32
);
1964 vis_pmerge(ZERO
, REF_S4_1
, TMP24
);
1966 vis_mul8x16au(REF_S6
, CONST_256
, TMP26
);
1967 vis_pmerge(ZERO
, REF_S6_1
, TMP28
);
1969 vis_mul8x16au(REF_S0
, CONST_256
, REF_S4
);
1970 vis_padd16(TMP22
, CONST_6
, TMP22
);
1972 vis_mul8x16au(REF_S0_1
, CONST_256
, REF_S6
);
1973 vis_padd16(TMP24
, CONST_6
, TMP24
);
1975 vis_mul8x16al(DST_2
, CONST_1024
, REF_0
);
1976 vis_padd16(TMP22
, TMP26
, TMP22
);
1978 vis_mul8x16al(DST_3
, CONST_1024
, REF_2
);
1979 vis_padd16(TMP24
, TMP28
, TMP24
);
1981 vis_mul8x16au(REF_S2
, CONST_256
, TMP26
);
1982 vis_padd16(TMP8
, TMP22
, TMP8
);
1984 vis_mul8x16au(REF_S2_1
, CONST_256
, TMP28
);
1985 vis_padd16(TMP10
, TMP24
, TMP10
);
1987 vis_padd16(TMP8
, TMP12
, TMP8
);
1989 vis_padd16(TMP10
, TMP14
, TMP10
);
1991 vis_padd16(TMP8
, TMP30
, TMP8
);
1993 vis_padd16(TMP10
, TMP32
, TMP10
);
1994 vis_pack16(TMP8
, DST_0
);
1996 vis_pack16(TMP10
, DST_1
);
1997 vis_st64(DST_0
, dest
[0]);
2000 vis_padd16(REF_S4
, TMP22
, TMP12
);
2002 vis_padd16(REF_S6
, TMP24
, TMP14
);
2004 vis_padd16(TMP12
, TMP26
, TMP12
);
2006 vis_padd16(TMP14
, TMP28
, TMP14
);
2008 vis_padd16(TMP12
, REF_0
, TMP12
);
2010 vis_padd16(TMP14
, REF_2
, TMP14
);
2011 vis_pack16(TMP12
, DST_2
);
2013 vis_pack16(TMP14
, DST_3
);
2014 vis_st64(DST_2
, dest
[0]);
2019 /* End of rounding code */
2021 /* Start of no rounding code */
2022 /* The trick used in some of this file is the formula from the MMX
2023 * motion comp code, which is:
2025 * (x+y)>>1 == (x&y)+((x^y)>>1)
2027 * This allows us to average 8 bytes at a time in a 64-bit FPU reg.
2028 * We avoid overflows by masking before we do the shift, and we
2029 * implement the shift by multiplying by 1/2 using mul8x16. So in
2030 * VIS this is (assume 'x' is in f0, 'y' is in f2, a repeating mask
2031 * of '0xfe' is in f4, a repeating mask of '0x7f' is in f6, and
2032 * the value 0x80808080 is in f8):
2036 * fmul8x16 f8, f10, f10
2039 * fpadd16 f12, f10, f10
2042 static void MC_put_no_round_o_16_vis (uint8_t * dest
, const uint8_t * ref
,
2043 const int stride
, int height
)
2045 ref
= vis_alignaddr(ref
);
2047 vis_ld64(ref
[0], TMP0
);
2049 vis_ld64_2(ref
, 8, TMP2
);
2051 vis_ld64_2(ref
, 16, TMP4
);
2054 vis_faligndata(TMP0
, TMP2
, REF_0
);
2055 vis_st64(REF_0
, dest
[0]);
2057 vis_faligndata(TMP2
, TMP4
, REF_2
);
2058 vis_st64_2(REF_2
, dest
, 8);
2063 static void MC_put_no_round_o_8_vis (uint8_t * dest
, const uint8_t * ref
,
2064 const int stride
, int height
)
2066 ref
= vis_alignaddr(ref
);
2068 vis_ld64(ref
[0], TMP0
);
2070 vis_ld64(ref
[8], TMP2
);
2075 vis_faligndata(TMP0
, TMP2
, REF_0
);
2076 vis_st64(REF_0
, dest
[0]);
2082 static void MC_avg_no_round_o_16_vis (uint8_t * dest
, const uint8_t * ref
,
2083 const int stride
, int height
)
2085 int stride_8
= stride
+ 8;
2087 ref
= vis_alignaddr(ref
);
2089 vis_ld64(ref
[0], TMP0
);
2091 vis_ld64(ref
[8], TMP2
);
2093 vis_ld64(ref
[16], TMP4
);
2095 vis_ld64(dest
[0], DST_0
);
2097 vis_ld64(dest
[8], DST_2
);
2099 vis_ld64(constants_fe
[0], MASK_fe
);
2100 vis_faligndata(TMP0
, TMP2
, REF_0
);
2102 vis_ld64(constants_7f
[0], MASK_7f
);
2103 vis_faligndata(TMP2
, TMP4
, REF_2
);
2105 vis_ld64(constants128
[0], CONST_128
);
2108 height
= (height
>> 1) - 1;
2110 do { /* 24 cycles */
2111 vis_ld64(ref
[0], TMP0
);
2112 vis_xor(DST_0
, REF_0
, TMP6
);
2114 vis_ld64_2(ref
, 8, TMP2
);
2115 vis_and(TMP6
, MASK_fe
, TMP6
);
2117 vis_ld64_2(ref
, 16, TMP4
);
2119 vis_mul8x16(CONST_128
, TMP6
, TMP6
);
2120 vis_xor(DST_2
, REF_2
, TMP8
);
2122 vis_and(TMP8
, MASK_fe
, TMP8
);
2124 vis_and(DST_0
, REF_0
, TMP10
);
2125 vis_ld64_2(dest
, stride
, DST_0
);
2126 vis_mul8x16(CONST_128
, TMP8
, TMP8
);
2128 vis_and(DST_2
, REF_2
, TMP12
);
2129 vis_ld64_2(dest
, stride_8
, DST_2
);
2131 vis_ld64(ref
[0], TMP14
);
2132 vis_and(TMP6
, MASK_7f
, TMP6
);
2134 vis_and(TMP8
, MASK_7f
, TMP8
);
2136 vis_padd16(TMP10
, TMP6
, TMP6
);
2137 vis_st64(TMP6
, dest
[0]);
2139 vis_padd16(TMP12
, TMP8
, TMP8
);
2140 vis_st64_2(TMP8
, dest
, 8);
2143 vis_ld64_2(ref
, 8, TMP16
);
2144 vis_faligndata(TMP0
, TMP2
, REF_0
);
2146 vis_ld64_2(ref
, 16, TMP18
);
2147 vis_faligndata(TMP2
, TMP4
, REF_2
);
2150 vis_xor(DST_0
, REF_0
, TMP20
);
2152 vis_and(TMP20
, MASK_fe
, TMP20
);
2154 vis_xor(DST_2
, REF_2
, TMP22
);
2155 vis_mul8x16(CONST_128
, TMP20
, TMP20
);
2157 vis_and(TMP22
, MASK_fe
, TMP22
);
2159 vis_and(DST_0
, REF_0
, TMP24
);
2160 vis_mul8x16(CONST_128
, TMP22
, TMP22
);
2162 vis_and(DST_2
, REF_2
, TMP26
);
2164 vis_ld64_2(dest
, stride
, DST_0
);
2165 vis_faligndata(TMP14
, TMP16
, REF_0
);
2167 vis_ld64_2(dest
, stride_8
, DST_2
);
2168 vis_faligndata(TMP16
, TMP18
, REF_2
);
2170 vis_and(TMP20
, MASK_7f
, TMP20
);
2172 vis_and(TMP22
, MASK_7f
, TMP22
);
2174 vis_padd16(TMP24
, TMP20
, TMP20
);
2175 vis_st64(TMP20
, dest
[0]);
2177 vis_padd16(TMP26
, TMP22
, TMP22
);
2178 vis_st64_2(TMP22
, dest
, 8);
2182 vis_ld64(ref
[0], TMP0
);
2183 vis_xor(DST_0
, REF_0
, TMP6
);
2185 vis_ld64_2(ref
, 8, TMP2
);
2186 vis_and(TMP6
, MASK_fe
, TMP6
);
2188 vis_ld64_2(ref
, 16, TMP4
);
2189 vis_mul8x16(CONST_128
, TMP6
, TMP6
);
2190 vis_xor(DST_2
, REF_2
, TMP8
);
2192 vis_and(TMP8
, MASK_fe
, TMP8
);
2194 vis_and(DST_0
, REF_0
, TMP10
);
2195 vis_ld64_2(dest
, stride
, DST_0
);
2196 vis_mul8x16(CONST_128
, TMP8
, TMP8
);
2198 vis_and(DST_2
, REF_2
, TMP12
);
2199 vis_ld64_2(dest
, stride_8
, DST_2
);
2201 vis_ld64(ref
[0], TMP14
);
2202 vis_and(TMP6
, MASK_7f
, TMP6
);
2204 vis_and(TMP8
, MASK_7f
, TMP8
);
2206 vis_padd16(TMP10
, TMP6
, TMP6
);
2207 vis_st64(TMP6
, dest
[0]);
2209 vis_padd16(TMP12
, TMP8
, TMP8
);
2210 vis_st64_2(TMP8
, dest
, 8);
2213 vis_faligndata(TMP0
, TMP2
, REF_0
);
2215 vis_faligndata(TMP2
, TMP4
, REF_2
);
2217 vis_xor(DST_0
, REF_0
, TMP20
);
2219 vis_and(TMP20
, MASK_fe
, TMP20
);
2221 vis_xor(DST_2
, REF_2
, TMP22
);
2222 vis_mul8x16(CONST_128
, TMP20
, TMP20
);
2224 vis_and(TMP22
, MASK_fe
, TMP22
);
2226 vis_and(DST_0
, REF_0
, TMP24
);
2227 vis_mul8x16(CONST_128
, TMP22
, TMP22
);
2229 vis_and(DST_2
, REF_2
, TMP26
);
2231 vis_and(TMP20
, MASK_7f
, TMP20
);
2233 vis_and(TMP22
, MASK_7f
, TMP22
);
2235 vis_padd16(TMP24
, TMP20
, TMP20
);
2236 vis_st64(TMP20
, dest
[0]);
2238 vis_padd16(TMP26
, TMP22
, TMP22
);
2239 vis_st64_2(TMP22
, dest
, 8);
2242 static void MC_avg_no_round_o_8_vis (uint8_t * dest
, const uint8_t * ref
,
2243 const int stride
, int height
)
2245 ref
= vis_alignaddr(ref
);
2247 vis_ld64(ref
[0], TMP0
);
2249 vis_ld64(ref
[8], TMP2
);
2251 vis_ld64(dest
[0], DST_0
);
2253 vis_ld64(constants_fe
[0], MASK_fe
);
2255 vis_ld64(constants_7f
[0], MASK_7f
);
2256 vis_faligndata(TMP0
, TMP2
, REF_0
);
2258 vis_ld64(constants128
[0], CONST_128
);
2261 height
= (height
>> 1) - 1;
2263 do { /* 12 cycles */
2264 vis_ld64(ref
[0], TMP0
);
2265 vis_xor(DST_0
, REF_0
, TMP4
);
2267 vis_ld64(ref
[8], TMP2
);
2268 vis_and(TMP4
, MASK_fe
, TMP4
);
2270 vis_and(DST_0
, REF_0
, TMP6
);
2271 vis_ld64_2(dest
, stride
, DST_0
);
2273 vis_mul8x16(CONST_128
, TMP4
, TMP4
);
2275 vis_ld64(ref
[0], TMP12
);
2276 vis_faligndata(TMP0
, TMP2
, REF_0
);
2278 vis_ld64(ref
[8], TMP2
);
2279 vis_xor(DST_0
, REF_0
, TMP0
);
2282 vis_and(TMP0
, MASK_fe
, TMP0
);
2284 vis_and(TMP4
, MASK_7f
, TMP4
);
2286 vis_padd16(TMP6
, TMP4
, TMP4
);
2287 vis_st64(TMP4
, dest
[0]);
2289 vis_mul8x16(CONST_128
, TMP0
, TMP0
);
2291 vis_and(DST_0
, REF_0
, TMP6
);
2292 vis_ld64_2(dest
, stride
, DST_0
);
2294 vis_faligndata(TMP12
, TMP2
, REF_0
);
2296 vis_and(TMP0
, MASK_7f
, TMP0
);
2298 vis_padd16(TMP6
, TMP0
, TMP4
);
2299 vis_st64(TMP4
, dest
[0]);
2303 vis_ld64(ref
[0], TMP0
);
2304 vis_xor(DST_0
, REF_0
, TMP4
);
2306 vis_ld64(ref
[8], TMP2
);
2307 vis_and(TMP4
, MASK_fe
, TMP4
);
2309 vis_and(DST_0
, REF_0
, TMP6
);
2310 vis_ld64_2(dest
, stride
, DST_0
);
2311 vis_mul8x16(CONST_128
, TMP4
, TMP4
);
2313 vis_faligndata(TMP0
, TMP2
, REF_0
);
2315 vis_xor(DST_0
, REF_0
, TMP0
);
2317 vis_and(TMP0
, MASK_fe
, TMP0
);
2319 vis_and(TMP4
, MASK_7f
, TMP4
);
2321 vis_padd16(TMP6
, TMP4
, TMP4
);
2322 vis_st64(TMP4
, dest
[0]);
2324 vis_mul8x16(CONST_128
, TMP0
, TMP0
);
2326 vis_and(DST_0
, REF_0
, TMP6
);
2328 vis_and(TMP0
, MASK_7f
, TMP0
);
2330 vis_padd16(TMP6
, TMP0
, TMP4
);
2331 vis_st64(TMP4
, dest
[0]);
2334 static void MC_put_no_round_x_16_vis (uint8_t * dest
, const uint8_t * ref
,
2335 const int stride
, int height
)
2337 unsigned long off
= (unsigned long) ref
& 0x7;
2338 unsigned long off_plus_1
= off
+ 1;
2340 ref
= vis_alignaddr(ref
);
2342 vis_ld64(ref
[0], TMP0
);
2344 vis_ld64_2(ref
, 8, TMP2
);
2346 vis_ld64_2(ref
, 16, TMP4
);
2348 vis_ld64(constants_fe
[0], MASK_fe
);
2350 vis_ld64(constants_7f
[0], MASK_7f
);
2351 vis_faligndata(TMP0
, TMP2
, REF_0
);
2353 vis_ld64(constants128
[0], CONST_128
);
2354 vis_faligndata(TMP2
, TMP4
, REF_4
);
2357 vis_alignaddr_g0((void *)off_plus_1
);
2358 vis_faligndata(TMP0
, TMP2
, REF_2
);
2359 vis_faligndata(TMP2
, TMP4
, REF_6
);
2361 vis_src1(TMP2
, REF_2
);
2362 vis_src1(TMP4
, REF_6
);
2366 height
= (height
>> 1) - 1;
2368 do { /* 34 cycles */
2369 vis_ld64(ref
[0], TMP0
);
2370 vis_xor(REF_0
, REF_2
, TMP6
);
2372 vis_ld64_2(ref
, 8, TMP2
);
2373 vis_xor(REF_4
, REF_6
, TMP8
);
2375 vis_ld64_2(ref
, 16, TMP4
);
2376 vis_and(TMP6
, MASK_fe
, TMP6
);
2379 vis_ld64(ref
[0], TMP14
);
2380 vis_mul8x16(CONST_128
, TMP6
, TMP6
);
2381 vis_and(TMP8
, MASK_fe
, TMP8
);
2383 vis_ld64_2(ref
, 8, TMP16
);
2384 vis_mul8x16(CONST_128
, TMP8
, TMP8
);
2385 vis_and(REF_0
, REF_2
, TMP10
);
2387 vis_ld64_2(ref
, 16, TMP18
);
2389 vis_and(REF_4
, REF_6
, TMP12
);
2391 vis_alignaddr_g0((void *)off
);
2393 vis_faligndata(TMP0
, TMP2
, REF_0
);
2395 vis_faligndata(TMP2
, TMP4
, REF_4
);
2398 vis_alignaddr_g0((void *)off_plus_1
);
2399 vis_faligndata(TMP0
, TMP2
, REF_2
);
2400 vis_faligndata(TMP2
, TMP4
, REF_6
);
2402 vis_src1(TMP2
, REF_2
);
2403 vis_src1(TMP4
, REF_6
);
2406 vis_and(TMP6
, MASK_7f
, TMP6
);
2408 vis_and(TMP8
, MASK_7f
, TMP8
);
2410 vis_padd16(TMP10
, TMP6
, TMP6
);
2411 vis_st64(TMP6
, dest
[0]);
2413 vis_padd16(TMP12
, TMP8
, TMP8
);
2414 vis_st64_2(TMP8
, dest
, 8);
2417 vis_xor(REF_0
, REF_2
, TMP6
);
2419 vis_xor(REF_4
, REF_6
, TMP8
);
2421 vis_and(TMP6
, MASK_fe
, TMP6
);
2423 vis_mul8x16(CONST_128
, TMP6
, TMP6
);
2424 vis_and(TMP8
, MASK_fe
, TMP8
);
2426 vis_mul8x16(CONST_128
, TMP8
, TMP8
);
2427 vis_and(REF_0
, REF_2
, TMP10
);
2429 vis_and(REF_4
, REF_6
, TMP12
);
2431 vis_alignaddr_g0((void *)off
);
2433 vis_faligndata(TMP14
, TMP16
, REF_0
);
2435 vis_faligndata(TMP16
, TMP18
, REF_4
);
2438 vis_alignaddr_g0((void *)off_plus_1
);
2439 vis_faligndata(TMP14
, TMP16
, REF_2
);
2440 vis_faligndata(TMP16
, TMP18
, REF_6
);
2442 vis_src1(TMP16
, REF_2
);
2443 vis_src1(TMP18
, REF_6
);
2446 vis_and(TMP6
, MASK_7f
, TMP6
);
2448 vis_and(TMP8
, MASK_7f
, TMP8
);
2450 vis_padd16(TMP10
, TMP6
, TMP6
);
2451 vis_st64(TMP6
, dest
[0]);
2453 vis_padd16(TMP12
, TMP8
, TMP8
);
2454 vis_st64_2(TMP8
, dest
, 8);
2458 vis_ld64(ref
[0], TMP0
);
2459 vis_xor(REF_0
, REF_2
, TMP6
);
2461 vis_ld64_2(ref
, 8, TMP2
);
2462 vis_xor(REF_4
, REF_6
, TMP8
);
2464 vis_ld64_2(ref
, 16, TMP4
);
2465 vis_and(TMP6
, MASK_fe
, TMP6
);
2467 vis_mul8x16(CONST_128
, TMP6
, TMP6
);
2468 vis_and(TMP8
, MASK_fe
, TMP8
);
2470 vis_mul8x16(CONST_128
, TMP8
, TMP8
);
2471 vis_and(REF_0
, REF_2
, TMP10
);
2473 vis_and(REF_4
, REF_6
, TMP12
);
2475 vis_alignaddr_g0((void *)off
);
2477 vis_faligndata(TMP0
, TMP2
, REF_0
);
2479 vis_faligndata(TMP2
, TMP4
, REF_4
);
2482 vis_alignaddr_g0((void *)off_plus_1
);
2483 vis_faligndata(TMP0
, TMP2
, REF_2
);
2484 vis_faligndata(TMP2
, TMP4
, REF_6
);
2486 vis_src1(TMP2
, REF_2
);
2487 vis_src1(TMP4
, REF_6
);
2490 vis_and(TMP6
, MASK_7f
, TMP6
);
2492 vis_and(TMP8
, MASK_7f
, TMP8
);
2494 vis_padd16(TMP10
, TMP6
, TMP6
);
2495 vis_st64(TMP6
, dest
[0]);
2497 vis_padd16(TMP12
, TMP8
, TMP8
);
2498 vis_st64_2(TMP8
, dest
, 8);
2501 vis_xor(REF_0
, REF_2
, TMP6
);
2503 vis_xor(REF_4
, REF_6
, TMP8
);
2505 vis_and(TMP6
, MASK_fe
, TMP6
);
2507 vis_mul8x16(CONST_128
, TMP6
, TMP6
);
2508 vis_and(TMP8
, MASK_fe
, TMP8
);
2510 vis_mul8x16(CONST_128
, TMP8
, TMP8
);
2511 vis_and(REF_0
, REF_2
, TMP10
);
2513 vis_and(REF_4
, REF_6
, TMP12
);
2515 vis_and(TMP6
, MASK_7f
, TMP6
);
2517 vis_and(TMP8
, MASK_7f
, TMP8
);
2519 vis_padd16(TMP10
, TMP6
, TMP6
);
2520 vis_st64(TMP6
, dest
[0]);
2522 vis_padd16(TMP12
, TMP8
, TMP8
);
2523 vis_st64_2(TMP8
, dest
, 8);
2526 static void MC_put_no_round_x_8_vis (uint8_t * dest
, const uint8_t * ref
,
2527 const int stride
, int height
)
2529 unsigned long off
= (unsigned long) ref
& 0x7;
2530 unsigned long off_plus_1
= off
+ 1;
2532 ref
= vis_alignaddr(ref
);
2534 vis_ld64(ref
[0], TMP0
);
2536 vis_ld64(ref
[8], TMP2
);
2538 vis_ld64(constants_fe
[0], MASK_fe
);
2540 vis_ld64(constants_7f
[0], MASK_7f
);
2542 vis_ld64(constants128
[0], CONST_128
);
2543 vis_faligndata(TMP0
, TMP2
, REF_0
);
2546 vis_alignaddr_g0((void *)off_plus_1
);
2547 vis_faligndata(TMP0
, TMP2
, REF_2
);
2549 vis_src1(TMP2
, REF_2
);
2553 height
= (height
>> 1) - 1;
2555 do { /* 20 cycles */
2556 vis_ld64(ref
[0], TMP0
);
2557 vis_xor(REF_0
, REF_2
, TMP4
);
2559 vis_ld64_2(ref
, 8, TMP2
);
2560 vis_and(TMP4
, MASK_fe
, TMP4
);
2563 vis_ld64(ref
[0], TMP8
);
2564 vis_and(REF_0
, REF_2
, TMP6
);
2565 vis_mul8x16(CONST_128
, TMP4
, TMP4
);
2567 vis_alignaddr_g0((void *)off
);
2569 vis_ld64_2(ref
, 8, TMP10
);
2571 vis_faligndata(TMP0
, TMP2
, REF_0
);
2574 vis_alignaddr_g0((void *)off_plus_1
);
2575 vis_faligndata(TMP0
, TMP2
, REF_2
);
2577 vis_src1(TMP2
, REF_2
);
2580 vis_and(TMP4
, MASK_7f
, TMP4
);
2582 vis_padd16(TMP6
, TMP4
, DST_0
);
2583 vis_st64(DST_0
, dest
[0]);
2586 vis_xor(REF_0
, REF_2
, TMP12
);
2588 vis_and(TMP12
, MASK_fe
, TMP12
);
2590 vis_and(REF_0
, REF_2
, TMP14
);
2591 vis_mul8x16(CONST_128
, TMP12
, TMP12
);
2593 vis_alignaddr_g0((void *)off
);
2594 vis_faligndata(TMP8
, TMP10
, REF_0
);
2596 vis_alignaddr_g0((void *)off_plus_1
);
2597 vis_faligndata(TMP8
, TMP10
, REF_2
);
2599 vis_src1(TMP10
, REF_2
);
2602 vis_and(TMP12
, MASK_7f
, TMP12
);
2604 vis_padd16(TMP14
, TMP12
, DST_0
);
2605 vis_st64(DST_0
, dest
[0]);
2609 vis_ld64(ref
[0], TMP0
);
2610 vis_xor(REF_0
, REF_2
, TMP4
);
2612 vis_ld64_2(ref
, 8, TMP2
);
2613 vis_and(TMP4
, MASK_fe
, TMP4
);
2615 vis_and(REF_0
, REF_2
, TMP6
);
2616 vis_mul8x16(CONST_128
, TMP4
, TMP4
);
2618 vis_alignaddr_g0((void *)off
);
2620 vis_faligndata(TMP0
, TMP2
, REF_0
);
2623 vis_alignaddr_g0((void *)off_plus_1
);
2624 vis_faligndata(TMP0
, TMP2
, REF_2
);
2626 vis_src1(TMP2
, REF_2
);
2629 vis_and(TMP4
, MASK_7f
, TMP4
);
2631 vis_padd16(TMP6
, TMP4
, DST_0
);
2632 vis_st64(DST_0
, dest
[0]);
2635 vis_xor(REF_0
, REF_2
, TMP12
);
2637 vis_and(TMP12
, MASK_fe
, TMP12
);
2639 vis_and(REF_0
, REF_2
, TMP14
);
2640 vis_mul8x16(CONST_128
, TMP12
, TMP12
);
2642 vis_and(TMP12
, MASK_7f
, TMP12
);
2644 vis_padd16(TMP14
, TMP12
, DST_0
);
2645 vis_st64(DST_0
, dest
[0]);
2649 static void MC_avg_no_round_x_16_vis (uint8_t * dest
, const uint8_t * ref
,
2650 const int stride
, int height
)
2652 unsigned long off
= (unsigned long) ref
& 0x7;
2653 unsigned long off_plus_1
= off
+ 1;
2655 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT
);
2657 vis_ld64(constants3
[0], CONST_3
);
2659 vis_ld64(constants256_512
[0], CONST_256
);
2661 ref
= vis_alignaddr(ref
);
2662 do { /* 26 cycles */
2663 vis_ld64(ref
[0], TMP0
);
2665 vis_ld64(ref
[8], TMP2
);
2667 vis_alignaddr_g0((void *)off
);
2669 vis_ld64(ref
[16], TMP4
);
2671 vis_ld64(dest
[0], DST_0
);
2672 vis_faligndata(TMP0
, TMP2
, REF_0
);
2674 vis_ld64(dest
[8], DST_2
);
2675 vis_faligndata(TMP2
, TMP4
, REF_4
);
2678 vis_alignaddr_g0((void *)off_plus_1
);
2679 vis_faligndata(TMP0
, TMP2
, REF_2
);
2680 vis_faligndata(TMP2
, TMP4
, REF_6
);
2682 vis_src1(TMP2
, REF_2
);
2683 vis_src1(TMP4
, REF_6
);
2686 vis_mul8x16au(REF_0
, CONST_256
, TMP0
);
2688 vis_pmerge(ZERO
, REF_2
, TMP4
);
2689 vis_mul8x16au(REF_0_1
, CONST_256
, TMP2
);
2691 vis_pmerge(ZERO
, REF_2_1
, TMP6
);
2693 vis_padd16(TMP0
, TMP4
, TMP0
);
2695 vis_mul8x16al(DST_0
, CONST_512
, TMP4
);
2696 vis_padd16(TMP2
, TMP6
, TMP2
);
2698 vis_mul8x16al(DST_1
, CONST_512
, TMP6
);
2700 vis_mul8x16au(REF_6
, CONST_256
, TMP12
);
2702 vis_padd16(TMP0
, TMP4
, TMP0
);
2703 vis_mul8x16au(REF_6_1
, CONST_256
, TMP14
);
2705 vis_padd16(TMP2
, TMP6
, TMP2
);
2706 vis_mul8x16au(REF_4
, CONST_256
, TMP16
);
2708 vis_padd16(TMP0
, CONST_3
, TMP8
);
2709 vis_mul8x16au(REF_4_1
, CONST_256
, TMP18
);
2711 vis_padd16(TMP2
, CONST_3
, TMP10
);
2712 vis_pack16(TMP8
, DST_0
);
2714 vis_pack16(TMP10
, DST_1
);
2715 vis_padd16(TMP16
, TMP12
, TMP0
);
2717 vis_st64(DST_0
, dest
[0]);
2718 vis_mul8x16al(DST_2
, CONST_512
, TMP4
);
2719 vis_padd16(TMP18
, TMP14
, TMP2
);
2721 vis_mul8x16al(DST_3
, CONST_512
, TMP6
);
2722 vis_padd16(TMP0
, CONST_3
, TMP0
);
2724 vis_padd16(TMP2
, CONST_3
, TMP2
);
2726 vis_padd16(TMP0
, TMP4
, TMP0
);
2728 vis_padd16(TMP2
, TMP6
, TMP2
);
2729 vis_pack16(TMP0
, DST_2
);
2731 vis_pack16(TMP2
, DST_3
);
2732 vis_st64(DST_2
, dest
[8]);
2739 static void MC_avg_no_round_x_8_vis (uint8_t * dest
, const uint8_t * ref
,
2740 const int stride
, int height
)
2742 unsigned long off
= (unsigned long) ref
& 0x7;
2743 unsigned long off_plus_1
= off
+ 1;
2744 int stride_times_2
= stride
<< 1;
2746 vis_set_gsr(5 << VIS_GSR_SCALEFACT_SHIFT
);
2748 vis_ld64(constants3
[0], CONST_3
);
2750 vis_ld64(constants256_512
[0], CONST_256
);
2752 ref
= vis_alignaddr(ref
);
2754 do { /* 47 cycles */
2755 vis_ld64(ref
[0], TMP0
);
2757 vis_ld64_2(ref
, 8, TMP2
);
2760 vis_alignaddr_g0((void *)off
);
2762 vis_ld64(ref
[0], TMP4
);
2763 vis_faligndata(TMP0
, TMP2
, REF_0
);
2765 vis_ld64_2(ref
, 8, TMP6
);
2768 vis_ld64(ref
[0], TMP8
);
2770 vis_ld64_2(ref
, 8, TMP10
);
2772 vis_faligndata(TMP4
, TMP6
, REF_4
);
2774 vis_ld64(ref
[0], TMP12
);
2776 vis_ld64_2(ref
, 8, TMP14
);
2778 vis_faligndata(TMP8
, TMP10
, REF_S0
);
2780 vis_faligndata(TMP12
, TMP14
, REF_S4
);
2783 vis_alignaddr_g0((void *)off_plus_1
);
2785 vis_ld64(dest
[0], DST_0
);
2786 vis_faligndata(TMP0
, TMP2
, REF_2
);
2788 vis_ld64_2(dest
, stride
, DST_2
);
2789 vis_faligndata(TMP4
, TMP6
, REF_6
);
2791 vis_faligndata(TMP8
, TMP10
, REF_S2
);
2793 vis_faligndata(TMP12
, TMP14
, REF_S6
);
2795 vis_ld64(dest
[0], DST_0
);
2796 vis_src1(TMP2
, REF_2
);
2798 vis_ld64_2(dest
, stride
, DST_2
);
2799 vis_src1(TMP6
, REF_6
);
2801 vis_src1(TMP10
, REF_S2
);
2803 vis_src1(TMP14
, REF_S6
);
2806 vis_pmerge(ZERO
, REF_0
, TMP0
);
2807 vis_mul8x16au(REF_0_1
, CONST_256
, TMP2
);
2809 vis_pmerge(ZERO
, REF_2
, TMP4
);
2810 vis_mul8x16au(REF_2_1
, CONST_256
, TMP6
);
2812 vis_padd16(TMP0
, CONST_3
, TMP0
);
2813 vis_mul8x16al(DST_0
, CONST_512
, TMP16
);
2815 vis_padd16(TMP2
, CONST_3
, TMP2
);
2816 vis_mul8x16al(DST_1
, CONST_512
, TMP18
);
2818 vis_padd16(TMP0
, TMP4
, TMP0
);
2819 vis_mul8x16au(REF_4
, CONST_256
, TMP8
);
2821 vis_padd16(TMP2
, TMP6
, TMP2
);
2822 vis_mul8x16au(REF_4_1
, CONST_256
, TMP10
);
2824 vis_padd16(TMP0
, TMP16
, TMP0
);
2825 vis_mul8x16au(REF_6
, CONST_256
, TMP12
);
2827 vis_padd16(TMP2
, TMP18
, TMP2
);
2828 vis_mul8x16au(REF_6_1
, CONST_256
, TMP14
);
2830 vis_padd16(TMP8
, CONST_3
, TMP8
);
2831 vis_mul8x16al(DST_2
, CONST_512
, TMP16
);
2833 vis_padd16(TMP8
, TMP12
, TMP8
);
2834 vis_mul8x16al(DST_3
, CONST_512
, TMP18
);
2836 vis_padd16(TMP10
, TMP14
, TMP10
);
2837 vis_pack16(TMP0
, DST_0
);
2839 vis_pack16(TMP2
, DST_1
);
2840 vis_st64(DST_0
, dest
[0]);
2842 vis_padd16(TMP10
, CONST_3
, TMP10
);
2844 vis_ld64_2(dest
, stride
, DST_0
);
2845 vis_padd16(TMP8
, TMP16
, TMP8
);
2847 vis_ld64_2(dest
, stride_times_2
, TMP4
/*DST_2*/);
2848 vis_padd16(TMP10
, TMP18
, TMP10
);
2849 vis_pack16(TMP8
, DST_2
);
2851 vis_pack16(TMP10
, DST_3
);
2852 vis_st64(DST_2
, dest
[0]);
2855 vis_mul8x16au(REF_S0_1
, CONST_256
, TMP2
);
2856 vis_pmerge(ZERO
, REF_S0
, TMP0
);
2858 vis_pmerge(ZERO
, REF_S2
, TMP24
);
2859 vis_mul8x16au(REF_S2_1
, CONST_256
, TMP6
);
2861 vis_padd16(TMP0
, CONST_3
, TMP0
);
2862 vis_mul8x16au(REF_S4
, CONST_256
, TMP8
);
2864 vis_padd16(TMP2
, CONST_3
, TMP2
);
2865 vis_mul8x16au(REF_S4_1
, CONST_256
, TMP10
);
2867 vis_padd16(TMP0
, TMP24
, TMP0
);
2868 vis_mul8x16au(REF_S6
, CONST_256
, TMP12
);
2870 vis_padd16(TMP2
, TMP6
, TMP2
);
2871 vis_mul8x16au(REF_S6_1
, CONST_256
, TMP14
);
2873 vis_padd16(TMP8
, CONST_3
, TMP8
);
2874 vis_mul8x16al(DST_0
, CONST_512
, TMP16
);
2876 vis_padd16(TMP10
, CONST_3
, TMP10
);
2877 vis_mul8x16al(DST_1
, CONST_512
, TMP18
);
2879 vis_padd16(TMP8
, TMP12
, TMP8
);
2880 vis_mul8x16al(TMP4
/*DST_2*/, CONST_512
, TMP20
);
2882 vis_mul8x16al(TMP5
/*DST_3*/, CONST_512
, TMP22
);
2883 vis_padd16(TMP0
, TMP16
, TMP0
);
2885 vis_padd16(TMP2
, TMP18
, TMP2
);
2886 vis_pack16(TMP0
, DST_0
);
2888 vis_padd16(TMP10
, TMP14
, TMP10
);
2889 vis_pack16(TMP2
, DST_1
);
2890 vis_st64(DST_0
, dest
[0]);
2893 vis_padd16(TMP8
, TMP20
, TMP8
);
2895 vis_padd16(TMP10
, TMP22
, TMP10
);
2896 vis_pack16(TMP8
, DST_2
);
2898 vis_pack16(TMP10
, DST_3
);
2899 vis_st64(DST_2
, dest
[0]);
2904 static void MC_put_no_round_y_16_vis (uint8_t * dest
, const uint8_t * ref
,
2905 const int stride
, int height
)
2907 ref
= vis_alignaddr(ref
);
2908 vis_ld64(ref
[0], TMP0
);
2910 vis_ld64_2(ref
, 8, TMP2
);
2912 vis_ld64_2(ref
, 16, TMP4
);
2915 vis_ld64(ref
[0], TMP6
);
2916 vis_faligndata(TMP0
, TMP2
, REF_0
);
2918 vis_ld64_2(ref
, 8, TMP8
);
2919 vis_faligndata(TMP2
, TMP4
, REF_4
);
2921 vis_ld64_2(ref
, 16, TMP10
);
2924 vis_ld64(constants_fe
[0], MASK_fe
);
2925 vis_faligndata(TMP6
, TMP8
, REF_2
);
2927 vis_ld64(constants_7f
[0], MASK_7f
);
2928 vis_faligndata(TMP8
, TMP10
, REF_6
);
2930 vis_ld64(constants128
[0], CONST_128
);
2931 height
= (height
>> 1) - 1;
2932 do { /* 24 cycles */
2933 vis_ld64(ref
[0], TMP0
);
2934 vis_xor(REF_0
, REF_2
, TMP12
);
2936 vis_ld64_2(ref
, 8, TMP2
);
2937 vis_xor(REF_4
, REF_6
, TMP16
);
2939 vis_ld64_2(ref
, 16, TMP4
);
2941 vis_and(REF_0
, REF_2
, TMP14
);
2943 vis_ld64(ref
[0], TMP6
);
2944 vis_and(REF_4
, REF_6
, TMP18
);
2946 vis_ld64_2(ref
, 8, TMP8
);
2947 vis_faligndata(TMP0
, TMP2
, REF_0
);
2949 vis_ld64_2(ref
, 16, TMP10
);
2951 vis_faligndata(TMP2
, TMP4
, REF_4
);
2953 vis_and(TMP12
, MASK_fe
, TMP12
);
2955 vis_and(TMP16
, MASK_fe
, TMP16
);
2956 vis_mul8x16(CONST_128
, TMP12
, TMP12
);
2958 vis_mul8x16(CONST_128
, TMP16
, TMP16
);
2959 vis_xor(REF_0
, REF_2
, TMP0
);
2961 vis_xor(REF_4
, REF_6
, TMP2
);
2963 vis_and(REF_0
, REF_2
, TMP20
);
2965 vis_and(TMP12
, MASK_7f
, TMP12
);
2967 vis_and(TMP16
, MASK_7f
, TMP16
);
2969 vis_padd16(TMP14
, TMP12
, TMP12
);
2970 vis_st64(TMP12
, dest
[0]);
2972 vis_padd16(TMP18
, TMP16
, TMP16
);
2973 vis_st64_2(TMP16
, dest
, 8);
2976 vis_and(REF_4
, REF_6
, TMP18
);
2978 vis_and(TMP0
, MASK_fe
, TMP0
);
2980 vis_and(TMP2
, MASK_fe
, TMP2
);
2981 vis_mul8x16(CONST_128
, TMP0
, TMP0
);
2983 vis_faligndata(TMP6
, TMP8
, REF_2
);
2984 vis_mul8x16(CONST_128
, TMP2
, TMP2
);
2986 vis_faligndata(TMP8
, TMP10
, REF_6
);
2988 vis_and(TMP0
, MASK_7f
, TMP0
);
2990 vis_and(TMP2
, MASK_7f
, TMP2
);
2992 vis_padd16(TMP20
, TMP0
, TMP0
);
2993 vis_st64(TMP0
, dest
[0]);
2995 vis_padd16(TMP18
, TMP2
, TMP2
);
2996 vis_st64_2(TMP2
, dest
, 8);
3000 vis_ld64(ref
[0], TMP0
);
3001 vis_xor(REF_0
, REF_2
, TMP12
);
3003 vis_ld64_2(ref
, 8, TMP2
);
3004 vis_xor(REF_4
, REF_6
, TMP16
);
3006 vis_ld64_2(ref
, 16, TMP4
);
3007 vis_and(REF_0
, REF_2
, TMP14
);
3009 vis_and(REF_4
, REF_6
, TMP18
);
3011 vis_faligndata(TMP0
, TMP2
, REF_0
);
3013 vis_faligndata(TMP2
, TMP4
, REF_4
);
3015 vis_and(TMP12
, MASK_fe
, TMP12
);
3017 vis_and(TMP16
, MASK_fe
, TMP16
);
3018 vis_mul8x16(CONST_128
, TMP12
, TMP12
);
3020 vis_mul8x16(CONST_128
, TMP16
, TMP16
);
3021 vis_xor(REF_0
, REF_2
, TMP0
);
3023 vis_xor(REF_4
, REF_6
, TMP2
);
3025 vis_and(REF_0
, REF_2
, TMP20
);
3027 vis_and(TMP12
, MASK_7f
, TMP12
);
3029 vis_and(TMP16
, MASK_7f
, TMP16
);
3031 vis_padd16(TMP14
, TMP12
, TMP12
);
3032 vis_st64(TMP12
, dest
[0]);
3034 vis_padd16(TMP18
, TMP16
, TMP16
);
3035 vis_st64_2(TMP16
, dest
, 8);
3038 vis_and(REF_4
, REF_6
, TMP18
);
3040 vis_and(TMP0
, MASK_fe
, TMP0
);
3042 vis_and(TMP2
, MASK_fe
, TMP2
);
3043 vis_mul8x16(CONST_128
, TMP0
, TMP0
);
3045 vis_mul8x16(CONST_128
, TMP2
, TMP2
);
3047 vis_and(TMP0
, MASK_7f
, TMP0
);
3049 vis_and(TMP2
, MASK_7f
, TMP2
);
3051 vis_padd16(TMP20
, TMP0
, TMP0
);
3052 vis_st64(TMP0
, dest
[0]);
3054 vis_padd16(TMP18
, TMP2
, TMP2
);
3055 vis_st64_2(TMP2
, dest
, 8);
3058 static void MC_put_no_round_y_8_vis (uint8_t * dest
, const uint8_t * ref
,
3059 const int stride
, int height
)
3061 ref
= vis_alignaddr(ref
);
3062 vis_ld64(ref
[0], TMP0
);
3064 vis_ld64_2(ref
, 8, TMP2
);
3067 vis_ld64(ref
[0], TMP4
);
3069 vis_ld64_2(ref
, 8, TMP6
);
3072 vis_ld64(constants_fe
[0], MASK_fe
);
3073 vis_faligndata(TMP0
, TMP2
, REF_0
);
3075 vis_ld64(constants_7f
[0], MASK_7f
);
3076 vis_faligndata(TMP4
, TMP6
, REF_2
);
3078 vis_ld64(constants128
[0], CONST_128
);
3079 height
= (height
>> 1) - 1;
3080 do { /* 12 cycles */
3081 vis_ld64(ref
[0], TMP0
);
3082 vis_xor(REF_0
, REF_2
, TMP4
);
3084 vis_ld64_2(ref
, 8, TMP2
);
3086 vis_and(TMP4
, MASK_fe
, TMP4
);
3088 vis_and(REF_0
, REF_2
, TMP6
);
3089 vis_mul8x16(CONST_128
, TMP4
, TMP4
);
3091 vis_faligndata(TMP0
, TMP2
, REF_0
);
3092 vis_ld64(ref
[0], TMP0
);
3094 vis_ld64_2(ref
, 8, TMP2
);
3096 vis_xor(REF_0
, REF_2
, TMP12
);
3098 vis_and(TMP4
, MASK_7f
, TMP4
);
3100 vis_and(TMP12
, MASK_fe
, TMP12
);
3102 vis_mul8x16(CONST_128
, TMP12
, TMP12
);
3103 vis_and(REF_0
, REF_2
, TMP14
);
3105 vis_padd16(TMP6
, TMP4
, DST_0
);
3106 vis_st64(DST_0
, dest
[0]);
3109 vis_faligndata(TMP0
, TMP2
, REF_2
);
3111 vis_and(TMP12
, MASK_7f
, TMP12
);
3113 vis_padd16(TMP14
, TMP12
, DST_0
);
3114 vis_st64(DST_0
, dest
[0]);
3118 vis_ld64(ref
[0], TMP0
);
3119 vis_xor(REF_0
, REF_2
, TMP4
);
3121 vis_ld64_2(ref
, 8, TMP2
);
3122 vis_and(TMP4
, MASK_fe
, TMP4
);
3124 vis_and(REF_0
, REF_2
, TMP6
);
3125 vis_mul8x16(CONST_128
, TMP4
, TMP4
);
3127 vis_faligndata(TMP0
, TMP2
, REF_0
);
3129 vis_xor(REF_0
, REF_2
, TMP12
);
3131 vis_and(TMP4
, MASK_7f
, TMP4
);
3133 vis_and(TMP12
, MASK_fe
, TMP12
);
3135 vis_mul8x16(CONST_128
, TMP12
, TMP12
);
3136 vis_and(REF_0
, REF_2
, TMP14
);
3138 vis_padd16(TMP6
, TMP4
, DST_0
);
3139 vis_st64(DST_0
, dest
[0]);
3142 vis_and(TMP12
, MASK_7f
, TMP12
);
3144 vis_padd16(TMP14
, TMP12
, DST_0
);