146 int __attribute__((aligned(16)))
s = 0;
147 const uint8_t *pix3 = pix2 +
stride;
148 const vector
unsigned char zero =
149 (
const vector
unsigned char) vec_splat_u8(0);
150 const vector
unsigned short two =
151 (
const vector
unsigned short) vec_splat_u16(2);
152 vector
unsigned char avgv, t5;
153 vector
unsigned char pix1v, pix3v, pix3iv;
154 vector
unsigned short pix3lv, pix3hv, pix3ilv, pix3ihv;
155 vector
unsigned short avghv, avglv;
156 vector
unsigned int sad = (vector
unsigned int) vec_splat_u32(0);
157 vector
signed int sumdiffs;
158 vector
unsigned char perm1, perm2, pix2v, pix2iv;
168 LOAD_PIX(pix2v, pix2iv, pix2, perm1, perm2);
169 vector
unsigned short pix2hv =
170 (vector
unsigned short) VEC_MERGEH(
zero, pix2v);
171 vector
unsigned short pix2lv =
172 (vector
unsigned short) VEC_MERGEL(
zero, pix2v);
173 vector
unsigned short pix2ihv =
174 (vector
unsigned short) VEC_MERGEH(
zero, pix2iv);
175 vector
unsigned short pix2ilv =
176 (vector
unsigned short) VEC_MERGEL(
zero, pix2iv);
178 vector
unsigned short t1 = vec_add(pix2hv, pix2ihv);
179 vector
unsigned short t2 = vec_add(pix2lv, pix2ilv);
180 vector
unsigned short t3, t4;
182 for (
i = 0;
i <
h;
i++) {
186 pix1v = vec_ld(0, pix1);
187 LOAD_PIX(pix3v, pix3iv, pix3, perm1, perm2);
196 pix3hv = (vector
unsigned short) VEC_MERGEH(
zero, pix3v);
197 pix3lv = (vector
unsigned short) VEC_MERGEL(
zero, pix3v);
198 pix3ihv = (vector
unsigned short) VEC_MERGEH(
zero, pix3iv);
199 pix3ilv = (vector
unsigned short) VEC_MERGEL(
zero, pix3iv);
202 t3 = vec_add(pix3hv, pix3ihv);
203 t4 = vec_add(pix3lv, pix3ilv);
205 avghv = vec_sr(vec_add(vec_add(t1, t3), two), two);
206 avglv = vec_sr(vec_add(vec_add(t2, t4), two), two);
209 avgv = vec_pack(avghv, avglv);
212 t5 = vec_sub(vec_max(pix1v, avgv), vec_min(pix1v, avgv));
215 sad = vec_sum4s(t5, sad);
224 sumdiffs = vec_sums((vector
signed int) sad, (vector
signed int)
zero);
225 sumdiffs = vec_splat(sumdiffs, 3);
226 vec_ste(sumdiffs, 0, &
s);
396 int __attribute__((aligned(16))) sum;
397 register const vector
unsigned char vzero =
398 (
const vector
unsigned char) vec_splat_u8(0);
399 register vector
signed short temp0, temp1, temp2, temp3, temp4,
402 register const vector
signed short vprod1 =
403 (
const vector
signed short) { 1, -1, 1, -1, 1, -1, 1, -1 };
404 register const vector
signed short vprod2 =
405 (
const vector
signed short) { 1, 1, -1, -1, 1, 1, -1, -1 };
406 register const vector
signed short vprod3 =
407 (
const vector
signed short) { 1, 1, 1, 1, -1, -1, -1, -1 };
408 register const vector
unsigned char perm1 =
409 (
const vector
unsigned char)
410 { 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05,
411 0x0A, 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D };
412 register const vector
unsigned char perm2 =
413 (
const vector
unsigned char)
414 { 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03,
415 0x0C, 0x0D, 0x0E, 0x0F, 0x08, 0x09, 0x0A, 0x0B };
416 register const vector
unsigned char perm3 =
417 (
const vector
unsigned char)
418 { 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
419 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
422#define ONEITERBUTTERFLY(i, res) \
424 register vector unsigned char srcO = unaligned_load(stride * i, src); \
425 register vector unsigned char dstO = unaligned_load(stride * i, dst);\
429 register vector signed short srcV = \
430 (vector signed short) VEC_MERGEH((vector signed char) vzero, \
431 (vector signed char) srcO); \
432 register vector signed short dstV = \
433 (vector signed short) VEC_MERGEH((vector signed char) vzero, \
434 (vector signed char) dstO); \
437 register vector signed short but0 = vec_sub(srcV, dstV); \
438 register vector signed short op1 = vec_perm(but0, but0, perm1); \
439 register vector signed short but1 = vec_mladd(but0, vprod1, op1); \
440 register vector signed short op2 = vec_perm(but1, but1, perm2); \
441 register vector signed short but2 = vec_mladd(but1, vprod2, op2); \
442 register vector signed short op3 = vec_perm(but2, but2, perm3); \
443 res = vec_mladd(but2, vprod3, op3); \
455#undef ONEITERBUTTERFLY
457 register vector
signed int vsum;
458 register vector
signed short line0 = vec_add(temp0, temp1);
459 register vector
signed short line1 = vec_sub(temp0, temp1);
460 register vector
signed short line2 = vec_add(temp2, temp3);
461 register vector
signed short line3 = vec_sub(temp2, temp3);
462 register vector
signed short line4 = vec_add(temp4, temp5);
463 register vector
signed short line5 = vec_sub(temp4, temp5);
464 register vector
signed short line6 = vec_add(temp6, temp7);
465 register vector
signed short line7 = vec_sub(temp6, temp7);
467 register vector
signed short line0B = vec_add(line0, line2);
468 register vector
signed short line2B = vec_sub(line0, line2);
469 register vector
signed short line1B = vec_add(line1, line3);
470 register vector
signed short line3B = vec_sub(line1, line3);
471 register vector
signed short line4B = vec_add(line4, line6);
472 register vector
signed short line6B = vec_sub(line4, line6);
473 register vector
signed short line5B = vec_add(line5, line7);
474 register vector
signed short line7B = vec_sub(line5, line7);
476 register vector
signed short line0C = vec_add(line0B, line4B);
477 register vector
signed short line4C = vec_sub(line0B, line4B);
478 register vector
signed short line1C = vec_add(line1B, line5B);
479 register vector
signed short line5C = vec_sub(line1B, line5B);
480 register vector
signed short line2C = vec_add(line2B, line6B);
481 register vector
signed short line6C = vec_sub(line2B, line6B);
482 register vector
signed short line3C = vec_add(line3B, line7B);
483 register vector
signed short line7C = vec_sub(line3B, line7B);
485 vsum = vec_sum4s(vec_abs(line0C), vec_splat_s32(0));
486 vsum = vec_sum4s(vec_abs(line1C), vsum);
487 vsum = vec_sum4s(vec_abs(line2C), vsum);
488 vsum = vec_sum4s(vec_abs(line3C), vsum);
489 vsum = vec_sum4s(vec_abs(line4C), vsum);
490 vsum = vec_sum4s(vec_abs(line5C), vsum);
491 vsum = vec_sum4s(vec_abs(line6C), vsum);
492 vsum = vec_sum4s(vec_abs(line7C), vsum);
493 vsum = vec_sums(vsum, (vector
signed int)
vzero);
494 vsum = vec_splat(vsum, 3);
496 vec_ste(vsum, 0, &sum);
522 int __attribute__((aligned(16))) sum;
523 register vector
signed short
532 register vector
signed short
541 register const vector
unsigned char vzero __asm__ (
"v31") =
542 (
const vector
unsigned char) vec_splat_u8(0);
544 register const vector
signed short vprod1
__asm__ (
"v16") =
545 (
const vector
signed short) { 1, -1, 1, -1, 1, -1, 1, -1 };
547 register const vector
signed short vprod2
__asm__ (
"v17") =
548 (
const vector
signed short) { 1, 1, -1, -1, 1, 1, -1, -1 };
550 register const vector
signed short vprod3
__asm__ (
"v18") =
551 (
const vector
signed short) { 1, 1, 1, 1, -1, -1, -1, -1 };
553 register const vector
unsigned char perm1
__asm__ (
"v19") =
554 (
const vector
unsigned char)
555 { 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05,
556 0x0A, 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D };
558 register const vector
unsigned char perm2
__asm__ (
"v20") =
559 (
const vector
unsigned char)
560 { 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03,
561 0x0C, 0x0D, 0x0E, 0x0F, 0x08, 0x09, 0x0A, 0x0B };
563 register const vector
unsigned char perm3
__asm__ (
"v21") =
564 (
const vector
unsigned char)
565 { 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
566 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
568#define ONEITERBUTTERFLY(i, res1, res2) \
570 register vector unsigned char srcO __asm__ ("v22") = \
571 unaligned_load(stride * i, src); \
572 register vector unsigned char dstO __asm__ ("v23") = \
573 unaligned_load(stride * i, dst);\
576 register vector signed short srcV __asm__ ("v24") = \
577 (vector signed short) VEC_MERGEH((vector signed char) vzero, \
578 (vector signed char) srcO); \
579 register vector signed short dstV __asm__ ("v25") = \
580 (vector signed short) VEC_MERGEH((vector signed char) vzero, \
581 (vector signed char) dstO); \
582 register vector signed short srcW __asm__ ("v26") = \
583 (vector signed short) VEC_MERGEL((vector signed char) vzero, \
584 (vector signed char) srcO); \
585 register vector signed short dstW __asm__ ("v27") = \
586 (vector signed short) VEC_MERGEL((vector signed char) vzero, \
587 (vector signed char) dstO); \
590 register vector signed short but0 __asm__ ("v28") = \
591 vec_sub(srcV, dstV); \
592 register vector signed short but0S __asm__ ("v29") = \
593 vec_sub(srcW, dstW); \
594 register vector signed short op1 __asm__ ("v30") = \
595 vec_perm(but0, but0, perm1); \
596 register vector signed short but1 __asm__ ("v22") = \
597 vec_mladd(but0, vprod1, op1); \
598 register vector signed short op1S __asm__ ("v23") = \
599 vec_perm(but0S, but0S, perm1); \
600 register vector signed short but1S __asm__ ("v24") = \
601 vec_mladd(but0S, vprod1, op1S); \
602 register vector signed short op2 __asm__ ("v25") = \
603 vec_perm(but1, but1, perm2); \
604 register vector signed short but2 __asm__ ("v26") = \
605 vec_mladd(but1, vprod2, op2); \
606 register vector signed short op2S __asm__ ("v27") = \
607 vec_perm(but1S, but1S, perm2); \
608 register vector signed short but2S __asm__ ("v28") = \
609 vec_mladd(but1S, vprod2, op2S); \
610 register vector signed short op3 __asm__ ("v29") = \
611 vec_perm(but2, but2, perm3); \
612 register vector signed short op3S __asm__ ("v30") = \
613 vec_perm(but2S, but2S, perm3); \
614 res1 = vec_mladd(but2, vprod3, op3); \
615 res2 = vec_mladd(but2S, vprod3, op3S); \
627#undef ONEITERBUTTERFLY
629 register vector
signed int vsum;
631 register vector
signed short line0 = vec_add(temp0, temp1);
632 register vector
signed short line1 = vec_sub(temp0, temp1);
633 register vector
signed short line2 = vec_add(temp2, temp3);
634 register vector
signed short line3 = vec_sub(temp2, temp3);
635 register vector
signed short line4 = vec_add(temp4, temp5);
636 register vector
signed short line5 = vec_sub(temp4, temp5);
637 register vector
signed short line6 = vec_add(temp6, temp7);
638 register vector
signed short line7 = vec_sub(temp6, temp7);
640 register vector
signed short line0B = vec_add(line0, line2);
641 register vector
signed short line2B = vec_sub(line0, line2);
642 register vector
signed short line1B = vec_add(line1, line3);
643 register vector
signed short line3B = vec_sub(line1, line3);
644 register vector
signed short line4B = vec_add(line4, line6);
645 register vector
signed short line6B = vec_sub(line4, line6);
646 register vector
signed short line5B = vec_add(line5, line7);
647 register vector
signed short line7B = vec_sub(line5, line7);
649 register vector
signed short line0C = vec_add(line0B, line4B);
650 register vector
signed short line4C = vec_sub(line0B, line4B);
651 register vector
signed short line1C = vec_add(line1B, line5B);
652 register vector
signed short line5C = vec_sub(line1B, line5B);
653 register vector
signed short line2C = vec_add(line2B, line6B);
654 register vector
signed short line6C = vec_sub(line2B, line6B);
655 register vector
signed short line3C = vec_add(line3B, line7B);
656 register vector
signed short line7C = vec_sub(line3B, line7B);
658 register vector
signed short line0S = vec_add(temp0S, temp1S);
659 register vector
signed short line1S = vec_sub(temp0S, temp1S);
660 register vector
signed short line2S = vec_add(temp2S, temp3S);
661 register vector
signed short line3S = vec_sub(temp2S, temp3S);
662 register vector
signed short line4S = vec_add(temp4S, temp5S);
663 register vector
signed short line5S = vec_sub(temp4S, temp5S);
664 register vector
signed short line6S = vec_add(temp6S, temp7S);
665 register vector
signed short line7S = vec_sub(temp6S, temp7S);
667 register vector
signed short line0BS = vec_add(line0S, line2S);
668 register vector
signed short line2BS = vec_sub(line0S, line2S);
669 register vector
signed short line1BS = vec_add(line1S, line3S);
670 register vector
signed short line3BS = vec_sub(line1S, line3S);
671 register vector
signed short line4BS = vec_add(line4S, line6S);
672 register vector
signed short line6BS = vec_sub(line4S, line6S);
673 register vector
signed short line5BS = vec_add(line5S, line7S);
674 register vector
signed short line7BS = vec_sub(line5S, line7S);
676 register vector
signed short line0CS = vec_add(line0BS, line4BS);
677 register vector
signed short line4CS = vec_sub(line0BS, line4BS);
678 register vector
signed short line1CS = vec_add(line1BS, line5BS);
679 register vector
signed short line5CS = vec_sub(line1BS, line5BS);
680 register vector
signed short line2CS = vec_add(line2BS, line6BS);
681 register vector
signed short line6CS = vec_sub(line2BS, line6BS);
682 register vector
signed short line3CS = vec_add(line3BS, line7BS);
683 register vector
signed short line7CS = vec_sub(line3BS, line7BS);
685 vsum = vec_sum4s(vec_abs(line0C), vec_splat_s32(0));
686 vsum = vec_sum4s(vec_abs(line1C), vsum);
687 vsum = vec_sum4s(vec_abs(line2C), vsum);
688 vsum = vec_sum4s(vec_abs(line3C), vsum);
689 vsum = vec_sum4s(vec_abs(line4C), vsum);
690 vsum = vec_sum4s(vec_abs(line5C), vsum);
691 vsum = vec_sum4s(vec_abs(line6C), vsum);
692 vsum = vec_sum4s(vec_abs(line7C), vsum);
694 vsum = vec_sum4s(vec_abs(line0CS), vsum);
695 vsum = vec_sum4s(vec_abs(line1CS), vsum);
696 vsum = vec_sum4s(vec_abs(line2CS), vsum);
697 vsum = vec_sum4s(vec_abs(line3CS), vsum);
698 vsum = vec_sum4s(vec_abs(line4CS), vsum);
699 vsum = vec_sum4s(vec_abs(line5CS), vsum);
700 vsum = vec_sum4s(vec_abs(line6CS), vsum);
701 vsum = vec_sum4s(vec_abs(line7CS), vsum);
702 vsum = vec_sums(vsum, (vector
signed int)
vzero);
703 vsum = vec_splat(vsum, 3);
705 vec_ste(vsum, 0, &sum);