315 const uint8_t *
src,
const int16_t *
filter,
316 const int32_t *filterPos,
int filterSize)
319 int max = (1 << 15) - 1;
321 if (filterSize == 8) {
323 __m256i src8, src9, src10, src11, src12, src13, src14, src15;
325 __m256i filter4, filter5, filter6, filter7;
326 __m256i vmax = __lasx_xvreplgr2vr_w(
max);
327 __m256i shuf = {0x0000000400000000, 0x0000000500000001,
328 0x0000000600000002, 0x0000000700000003};
337 __lasx_xvstelm_d(
src0,
dst, 0, 0);
338 __lasx_xvstelm_d(
src0,
dst, 8, 2);
344 __lasx_xvstelm_d(
src0,
dst, 0, 0);
352 src0 = __lasx_xvldrepl_d(
src + filterPos[0], 0);
358 val = __lasx_xvpickve2gr_w(
src0, 0);
361 }
else if (filterSize == 4) {
363 __m256i src8, src9, src10, src11, src12, src13, src14, src15;
365 __m256i vmax = __lasx_xvreplgr2vr_w(
max);
366 __m256i shuf = {0x0000000400000000, 0x0000000500000001,
367 0x0000000600000002, 0x0000000700000003};
377 __lasx_xvstelm_d(
src0,
dst, 0, 0);
378 __lasx_xvstelm_d(
src0,
dst, 8, 1);
384 __lasx_xvstelm_d(
src0,
dst, 0, 0);
392 const uint8_t *srcPos =
src + filterPos[0];
394 for (
int j = 0; j < filterSize; j++) {
399 }
else if (filterSize > 8) {
400 int filterlen = filterSize - 7;
403 __m256i
zero = __lasx_xvldi(0);
409 const uint8_t *srcPos1 =
src + filterPos[0];
410 const uint8_t *srcPos2 =
src + filterPos[1];
411 const uint8_t *srcPos3 =
src + filterPos[2];
412 const uint8_t *srcPos4 =
src + filterPos[3];
413 const int16_t *filterStart1 =
filter;
414 const int16_t *filterStart2 = filterStart1 + filterSize;
415 const int16_t *filterStart3 = filterStart2 + filterSize;
416 const int16_t *filterStart4 = filterStart3 + filterSize;
417 int j, val1 = 0, val2 = 0, val3 = 0, val4 = 0;
419 for (j = 0; j < filterlen; j += 8) {
422 val1 = __lasx_xvpickve2gr_w(
out, 0);
423 val2 = __lasx_xvpickve2gr_w(
out, 4);
424 val3 = __lasx_xvpickve2gr_w(
out, 2);
425 val4 = __lasx_xvpickve2gr_w(
out, 6);
426 for (; j < filterSize; j++) {
427 val1 += ((int)srcPos1[j]) * filterStart1[j];
428 val2 += ((int)srcPos2[j]) * filterStart2[j];
429 val3 += ((int)srcPos3[j]) * filterStart3[j];
430 val4 += ((int)srcPos4[j]) * filterStart4[j];
438 filter = filterStart4 + filterSize;
440 for(
i = 0;
i < res;
i++) {
442 const uint8_t *srcPos =
src + filterPos[
i];
445 for (j = 0; j < filterlen; j += 8) {
446 src1 = __lasx_xvldrepl_d((srcPos + j), 0);
450 out0 = __lasx_xvhaddw_d_w(out0, out0);
451 out0 = __lasx_xvhaddw_q_d(out0, out0);
452 val += __lasx_xvpickve2gr_w(out0, 0);
454 for (; j < filterSize; j++) {
461 for (
i = 0;
i < dstW;
i++) {
463 const uint8_t *srcPos =
src + filterPos[
i];
465 for (
int j = 0; j < filterSize; j++) {
475 const uint8_t *
src,
const int16_t *
filter,
476 const int32_t *filterPos,
int filterSize)
479 int max = (1 << 19) - 1;
482 if (filterSize == 8) {
485 __m256i vmax = __lasx_xvreplgr2vr_w(
max);
486 __m256i shuf = {0x0000000400000000, 0x0000000500000001,
487 0x0000000600000002, 0x0000000700000003};
497 __lasx_xvstelm_d(
src0,
dst, 0, 0);
498 __lasx_xvstelm_d(
src0,
dst, 8, 1);
508 src0 = __lasx_xvldrepl_d(
src + filterPos[0], 0);
512 out0 = __lasx_xvhaddw_d_w(out0, out0);
513 out0 = __lasx_xvhaddw_q_d(out0, out0);
514 val = __lasx_xvpickve2gr_w(out0, 0);
517 }
else if (filterSize == 4) {
520 __m256i vmax = __lasx_xvreplgr2vr_w(
max);
521 __m256i shuf = {0x0000000100000000, 0x0000000500000004,
522 0x0000000300000002, 0x0000000700000006};
533 __lasx_xvstelm_d(
src0,
dst, 0, 0);
534 __lasx_xvstelm_d(
src0,
dst, 8, 1);
542 const uint8_t *srcPos =
src + filterPos[0];
544 for (
int j = 0; j < filterSize; j++) {
549 }
else if (filterSize > 8) {
552 int filterlen = filterSize - 7;
553 __m256i
zero = __lasx_xvldi(0);
559 const uint8_t *srcPos1 =
src + filterPos[0];
560 const uint8_t *srcPos2 =
src + filterPos[1];
561 const uint8_t *srcPos3 =
src + filterPos[2];
562 const uint8_t *srcPos4 =
src + filterPos[3];
563 const int16_t *filterStart1 =
filter;
564 const int16_t *filterStart2 = filterStart1 + filterSize;
565 const int16_t *filterStart3 = filterStart2 + filterSize;
566 const int16_t *filterStart4 = filterStart3 + filterSize;
567 int j, val1 = 0, val2 = 0, val3 = 0, val4 = 0;
569 for (j = 0; j < filterlen; j += 8) {
572 val1 = __lasx_xvpickve2gr_w(
out, 0);
573 val2 = __lasx_xvpickve2gr_w(
out, 4);
574 val3 = __lasx_xvpickve2gr_w(
out, 2);
575 val4 = __lasx_xvpickve2gr_w(
out, 6);
576 for (; j < filterSize; j++) {
577 val1 += ((int)srcPos1[j]) * filterStart1[j];
578 val2 += ((int)srcPos2[j]) * filterStart2[j];
579 val3 += ((int)srcPos3[j]) * filterStart3[j];
580 val4 += ((int)srcPos4[j]) * filterStart4[j];
588 filter = filterStart4 + filterSize;
590 for (
i = 0;
i < res;
i++) {
592 const uint8_t *srcPos =
src + filterPos[
i];
595 for (j = 0; j < filterlen; j += 8) {
596 src1 = __lasx_xvldrepl_d((srcPos + j), 0);
600 out0 = __lasx_xvhaddw_d_w(out0, out0);
601 out0 = __lasx_xvhaddw_q_d(out0, out0);
602 val += __lasx_xvpickve2gr_w(out0, 0);
604 for (; j < filterSize; j++) {
611 for (
i = 0;
i < dstW;
i++) {
613 const uint8_t *srcPos =
src + filterPos[
i];
615 for (
int j = 0; j < filterSize; j++) {
678 const int32_t *filterPos,
int filterSize)
682 const uint16_t *
src = (
const uint16_t *)
_src;
683 int sh =
desc->comp[0].depth - 1;
684 int max = (1 << 15) - 1;
688 __m256i
zero = __lasx_xvldi(0);
692 (
desc->comp[0].depth - 1);
696 shift = __lasx_xvreplgr2vr_w(sh);
698 if (filterSize == 8) {
699 __m256i v_max = __lasx_xvreplgr2vr_w(
max);
700 for (
i = 0;
i <
len;
i++) {
703 for (
i = 0;
i < res;
i++) {
707 src0 = __lasx_xvld(
src + filterPos[
i], 0);
710 out0 = __lasx_xvhaddw_d_w(out0, out0);
711 out0 = __lasx_xvhaddw_q_d(out0, out0);
712 val = __lasx_xvpickve2gr_w(out0, 0);
716 }
else if (filterSize == 4) {
717 __m256i v_max = __lasx_xvreplgr2vr_w(
max);
718 for (
i = 0;
i <
len;
i++) {
721 src1 = __lasx_xvldrepl_d(
src + filterPos[0], 0);
722 src2 = __lasx_xvldrepl_d(
src + filterPos[1], 0);
723 src3 = __lasx_xvldrepl_d(
src + filterPos[2], 0);
724 src4 = __lasx_xvldrepl_d(
src + filterPos[3], 0);
727 src3 = __lasx_xvextrins_d(src3, src4, 0x10);
728 src0 = __lasx_xvpermi_q(
src1, src3, 0x02);
730 out0 = __lasx_xvhaddw_d_w(out0, out0);
731 out0 = __lasx_xvsra_w(out0,
shift);
732 out0 = __lasx_xvmin_w(out0, v_max);
733 dst[0] = __lasx_xvpickve2gr_w(out0, 0);
734 dst[1] = __lasx_xvpickve2gr_w(out0, 2);
735 dst[2] = __lasx_xvpickve2gr_w(out0, 4);
736 dst[3] = __lasx_xvpickve2gr_w(out0, 6);
741 for (
i = 0;
i < res;
i++) {
743 const uint16_t *srcPos =
src + filterPos[
i];
745 for (
int j = 0; j < filterSize; j++) {
751 }
else if (filterSize > 8) {
752 int filterlen = filterSize - 7;
754 for (
i = 0;
i <
len;
i++) {
758 const uint16_t *srcPos1 =
src + filterPos[0];
759 const uint16_t *srcPos2 =
src + filterPos[1];
760 const uint16_t *srcPos3 =
src + filterPos[2];
761 const uint16_t *srcPos4 =
src + filterPos[3];
762 const int16_t *filterStart1 =
filter;
763 const int16_t *filterStart2 = filterStart1 + filterSize;
764 const int16_t *filterStart3 = filterStart2 + filterSize;
765 const int16_t *filterStart4 = filterStart3 + filterSize;
766 int j, val1 = 0, val2 = 0, val3 = 0, val4 = 0;
768 for (j = 0; j < filterlen; j += 8) {
771 val1 = __lasx_xvpickve2gr_w(
out, 0);
772 val2 = __lasx_xvpickve2gr_w(
out, 4);
773 val3 = __lasx_xvpickve2gr_w(
out, 2);
774 val4 = __lasx_xvpickve2gr_w(
out, 6);
775 for (; j < filterSize; j++) {
776 val1 += ((int)srcPos1[j]) * filterStart1[j];
777 val2 += ((int)srcPos2[j]) * filterStart2[j];
778 val3 += ((int)srcPos3[j]) * filterStart3[j];
779 val4 += ((int)srcPos4[j]) * filterStart4[j];
787 filter = filterStart4 + filterSize;
789 for (
i = 0;
i < res;
i++) {
791 const uint16_t *srcPos =
src + filterPos[
i];
794 for (j = 0; j < filterlen; j += 8) {
796 src0 = __lasx_xvldx(srcPos, dex);
799 out0 = __lasx_xvhaddw_d_w(out0, out0);
800 out0 = __lasx_xvhaddw_q_d(out0, out0);
801 val += __lasx_xvpickve2gr_w(out0, 0);
803 for (; j < filterSize; j++) {
810 for (
i = 0;
i < dstW;
i++) {
812 const uint16_t *srcPos =
src + filterPos[
i];
814 for (
int j = 0; j < filterSize; j++) {
825 const int32_t *filterPos,
int filterSize)
830 const uint16_t *
src = (
const uint16_t *)
_src;
831 int sh =
desc->comp[0].depth - 5;
832 int max = (1 << 19) - 1;
836 __m256i
zero = __lasx_xvldi(0);
839 &&
desc->comp[0].depth<16) {
844 shift = __lasx_xvreplgr2vr_w(sh);
846 if (filterSize == 8) {
847 __m256i v_max = __lasx_xvreplgr2vr_w(
max);
848 for (
i = 0;
i <
len;
i++) {
851 for (
i = 0;
i < res;
i++) {
855 src0 = __lasx_xvld(
src + filterPos[
i], 0);
858 out0 = __lasx_xvhaddw_d_w(out0, out0);
859 out0 = __lasx_xvhaddw_q_d(out0, out0);
860 val = __lasx_xvpickve2gr_w(out0, 0);
864 }
else if (filterSize == 4) {
865 __m256i v_max = __lasx_xvreplgr2vr_w(
max);
866 for (
i = 0;
i <
len;
i++) {
869 src1 = __lasx_xvldrepl_d(
src + filterPos[0], 0);
870 src2 = __lasx_xvldrepl_d(
src + filterPos[1], 0);
871 src3 = __lasx_xvldrepl_d(
src + filterPos[2], 0);
872 src4 = __lasx_xvldrepl_d(
src + filterPos[3], 0);
875 src3 = __lasx_xvextrins_d(src3, src4, 0x10);
876 src0 = __lasx_xvpermi_q(
src1, src3, 0x02);
878 out0 = __lasx_xvhaddw_d_w(out0, out0);
879 out0 = __lasx_xvsra_w(out0,
shift);
880 out0 = __lasx_xvmin_w(out0, v_max);
881 dst[0] = __lasx_xvpickve2gr_w(out0, 0);
882 dst[1] = __lasx_xvpickve2gr_w(out0, 2);
883 dst[2] = __lasx_xvpickve2gr_w(out0, 4);
884 dst[3] = __lasx_xvpickve2gr_w(out0, 6);
889 for (
i = 0;
i < res;
i++) {
891 const uint16_t *srcPos =
src + filterPos[
i];
893 for (
int j = 0; j < filterSize; j++) {
899 }
else if (filterSize > 8) {
900 int filterlen = filterSize - 7;
902 for (
i = 0;
i <
len;
i ++) {
906 const uint16_t *srcPos1 =
src + filterPos[0];
907 const uint16_t *srcPos2 =
src + filterPos[1];
908 const uint16_t *srcPos3 =
src + filterPos[2];
909 const uint16_t *srcPos4 =
src + filterPos[3];
910 const int16_t *filterStart1 =
filter;
911 const int16_t *filterStart2 = filterStart1 + filterSize;
912 const int16_t *filterStart3 = filterStart2 + filterSize;
913 const int16_t *filterStart4 = filterStart3 + filterSize;
914 int j, val1 = 0, val2 = 0, val3 = 0, val4 = 0;
916 for (j = 0; j < filterlen; j += 8) {
919 val1 = __lasx_xvpickve2gr_w(
out, 0);
920 val2 = __lasx_xvpickve2gr_w(
out, 4);
921 val3 = __lasx_xvpickve2gr_w(
out, 2);
922 val4 = __lasx_xvpickve2gr_w(
out, 6);
923 for (; j < filterSize; j++) {
924 val1 += ((int)srcPos1[j]) * filterStart1[j];
925 val2 += ((int)srcPos2[j]) * filterStart2[j];
926 val3 += ((int)srcPos3[j]) * filterStart3[j];
927 val4 += ((int)srcPos4[j]) * filterStart4[j];
935 filter = filterStart4 + filterSize;
937 for (
i = 0;
i < res;
i++) {
939 const uint16_t *srcPos =
src + filterPos[
i];
942 for (j = 0; j < filterlen; j += 8) {
944 src0 = __lasx_xvldx(srcPos, dex);
947 out0 = __lasx_xvhaddw_d_w(out0, out0);
948 out0 = __lasx_xvhaddw_q_d(out0, out0);
949 val += __lasx_xvpickve2gr_w(out0, 0);
951 for (; j < filterSize; j++) {
958 for (
i = 0;
i < dstW;
i++) {
960 const uint16_t *srcPos =
src + filterPos[
i];
962 for (
int j = 0; j < filterSize; j++) {