| @@ -53,15 +53,15 @@ · 52 unmodified lines |
| 53 | 53 | ; Local Data (Read Only) |
| 54 | 54 | ;*********************************************************************** |
| 55 | 55 | |
| 56 | | −SECTION .rodata align=16 |
| 56 | +SECTION .rodata align=32 |
| 57 | 57 | |
| 58 | 58 | ;*********************************************************************** |
| 59 | 59 | ; Various memory constants (trigonometric values or rounding values) |
| 60 | 60 | ;*********************************************************************** |
| 61 | 61 | |
| 62 | | −ALIGN 16 |
| 63 | | −db80h_128: |
| 64 | | − times 16 db 80h |
| 62 | +ALIGN 32 |
| 63 | +db80h_256: |
| 64 | + times 32 db 80h |
| 65 | 65 | shufb_0000000088888888: |
| 66 | 66 | times 8 db 0 |
| 67 | 67 | times 8 db 8 |
| @@ -2682,7 +2682,7 @@ WELS_EXTERN DyadicBilinearQuarterDownsampler_sse4 · 2614 unmodified lines |
| 2682 | 2682 | movdqu xmm_tmp3, [p_src_row0 + r_tmp0] |
| 2683 | 2683 | movdqu xmm_tmp4, [p_src_row1 + r_tmp0] |
| 2684 | 2684 | movdqa xmm_tmp2, xmm_xpos_int |
| 2685 | | − punpcklbw xmm_tmp2, [db80h_128] |
| 2685 | + punpcklbw xmm_tmp2, [db80h_256] |
| 2686 | 2686 | pshufb xmm_tmp3, xmm_tmp2 |
| 2687 | 2687 | pshufb xmm_tmp4, xmm_tmp2 |
| 2688 | 2688 | SSE2_BilinearFastCalcXYFrac xmm_tmp0, xmm_tmp2, xmm_yfrac0, xmm_yfrac1 |
| @@ -2695,7 +2695,7 @@ WELS_EXTERN DyadicBilinearQuarterDownsampler_sse4 · 6 unmodified lines |
| 2695 | 2695 | movdqu xmm_tmp3, [p_src_row0 + r_tmp0] |
| 2696 | 2696 | movdqu xmm_tmp4, [p_src_row1 + r_tmp0] |
| 2697 | 2697 | movdqa xmm_tmp2, xmm_xpos_int |
| 2698 | | − punpckhbw xmm_tmp2, [db80h_128] |
| 2698 | + punpckhbw xmm_tmp2, [db80h_256] |
| 2699 | 2699 | pshufb xmm_tmp3, xmm_tmp2 |
| 2700 | 2700 | pshufb xmm_tmp4, xmm_tmp2 |
| 2701 | 2701 | SSE2_BilinearFastCalcXYFrac xmm_tmp1, xmm_tmp2, xmm_yfrac0, xmm_yfrac1 |
| @@ -2840,7 +2840,7 @@ WELS_EXTERN DyadicBilinearQuarterDownsampler_sse4 · 138 unmodified lines |
| 2840 | 2840 | mov r_tmp0, i_xpos |
| 2841 | 2841 | shr r_tmp0, 16 |
| 2842 | 2842 | movdqa xmm_tmp3, xmm_xpos_int |
| 2843 | | − punpcklbw xmm_tmp3, [db80h_128] |
| 2843 | + punpcklbw xmm_tmp3, [db80h_256] |
| 2844 | 2844 | movdqu xmm_tmp4, [p_src_row0 + r_tmp0] |
| 2845 | 2845 | movdqu xmm_tmp2, [p_src_row1 + r_tmp0] |
| 2846 | 2846 | lea r_tmp0, [i_xpos + 4 * i_scalex] |
| @@ -2852,7 +2852,7 @@ WELS_EXTERN DyadicBilinearQuarterDownsampler_sse4 · 5 unmodified lines |
| 2852 | 2852 | pmaddwd xmm_tmp2, xmm_tmp0 |
| 2853 | 2853 | SSE41_LinearAccurateInterpolateVerticalDwords xmm_tmp0, xmm_tmp4, xmm_tmp2, xmm_yfrac0, xmm_yfrac1, xmm_tmp3 |
| 2854 | 2854 | movdqa xmm_tmp2, xmm_xpos_int |
| 2855 | | − punpckhbw xmm_tmp2, [db80h_128] |
| 2855 | + punpckhbw xmm_tmp2, [db80h_256] |
| 2856 | 2856 | movdqu xmm_tmp4, [p_src_row0 + r_tmp0] |
| 2857 | 2857 | movdqu xmm_tmp3, [p_src_row1 + r_tmp0] |
| 2858 | 2858 | pshufb xmm_tmp4, xmm_tmp2 |
| @@ -3563,3 +3563,694 @@ WELS_EXTERN GeneralBilinearAccurateDownsampler_sse41 · 704 unmodified lines |
| 3563 | 3563 | %undef xmm_xfrac0_begin |
| 3564 | 3564 | %undef xmm_xfrac1_begin |
| 3565 | 3565 | %undef xmm_xfrac_inc |
| 3566 | + |
| 3567 | +; xpos_int=%1 xpos_frac=%2 inc_int+1=%3 inc_frac=%4 tmp=%5 |
| 3568 | +%macro AVX2_BilinearIncXposuw 5 |
| 3569 | + vpaddusw %5, %2, %4 |
| 3570 | + vpaddw %2, %2, %4 |
| 3571 | + vpcmpeqw %5, %5, %2 |
| 3572 | + vpaddb %1, %1, %3 |
| 3573 | + vpaddb %1, %1, %5 ; subtract 1 if no carry |
| 3574 | +%endmacro |
| 3575 | + |
| 3576 | +; outl=%1 outh=%2 in=%3 FFFFh/7FFFh=%4 |
| 3577 | +%macro AVX2_UnpckXFrac 4 |
| 3578 | + vpxor %1, %3, %4 |
| 3579 | + vpunpckhwd %2, %1, %3 |
| 3580 | + vpunpcklwd %1, %1, %3 |
| 3581 | +%endmacro |
| 3582 | + |
| 3583 | +; out0=%1 out1=%2 xfrac=%3 yfrac0=%4 yfrac1=%5 |
| 3584 | +%macro AVX2_BilinearFastCalcXYFrac 5 |
| 3585 | + vpmulhuw %2, %3, %5 |
| 3586 | + vpmulhuw %1, %3, %4 |
| 3587 | +%endmacro |
| 3588 | + |
| 3589 | +; [in:dwordsl out:bytes] dwordsh=%2 zero=%3 |
| 3590 | +%macro AVX2_BilinearFastPackDwordsToBytes 3 |
| 3591 | + vpsrld %1, %1, 14 |
| 3592 | + vpsrld %2, %2, 14 |
| 3593 | + vpackssdw %1, %1, %2 |
| 3594 | + vpavgw %1, %1, %3 |
| 3595 | + vpackuswb %1, %1, %1 |
| 3596 | +%endmacro |
| 3597 | + |
| 3598 | +%macro AVX2_BilinearFastDownsample2xOrLess_16px 0 |
| 3599 | + vpshufb ymm_tmp0, ymm_xpos_int, ymm_0 |
| 3600 | + vpsubb ymm_xpos_int, ymm_xpos_int, ymm_tmp0 |
| 3601 | + AVX2_UnpckXFrac ymm_tmp0, ymm_tmp1, ymm_xpos_frac, ymm_ffff |
| 3602 | + mov r_tmp0, i_xpos |
| 3603 | + shr r_tmp0, 16 |
| 3604 | + vmovdqu xmm_tmp4, [p_src_row0 + r_tmp0] |
| 3605 | + vmovdqu xmm_tmp5, [p_src_row1 + r_tmp0] |
| 3606 | + lea r_tmp0, [i_xpos + 4 * i_scalex2] |
| 3607 | + lea i_xpos, [i_xpos + 8 * i_scalex2] |
| 3608 | + shr r_tmp0, 16 |
| 3609 | + vinserti128 ymm_tmp4, ymm_tmp4, [p_src_row0 + r_tmp0], 1 |
| 3610 | + vinserti128 ymm_tmp5, ymm_tmp5, [p_src_row1 + r_tmp0], 1 |
| 3611 | + vpshufb ymm_tmp4, ymm_tmp4, ymm_xpos_int |
| 3612 | + vpshufb ymm_tmp5, ymm_tmp5, ymm_xpos_int |
| 3613 | + AVX2_BilinearFastCalcXYFrac ymm_tmp0, ymm_tmp2, ymm_tmp0, ymm_yfrac0, ymm_yfrac1 |
| 3614 | + vpunpcklbw ymm_tmp3, ymm_tmp4, ymm_0 |
| 3615 | + vpmaddwd ymm_tmp0, ymm_tmp0, ymm_tmp3 |
| 3616 | + vpunpcklbw ymm_tmp3, ymm_tmp5, ymm_0 |
| 3617 | + vpmaddwd ymm_tmp2, ymm_tmp2, ymm_tmp3 |
| 3618 | + vpaddd ymm_tmp0, ymm_tmp0, ymm_tmp2 |
| 3619 | + AVX2_BilinearFastCalcXYFrac ymm_tmp1, ymm_tmp3, ymm_tmp1, ymm_yfrac0, ymm_yfrac1 |
| 3620 | + vpunpckhbw ymm_tmp2, ymm_tmp4, ymm_0 |
| 3621 | + vpmaddwd ymm_tmp1, ymm_tmp1, ymm_tmp2 |
| 3622 | + vpunpckhbw ymm_tmp2, ymm_tmp5, ymm_0 |
| 3623 | + vpmaddwd ymm_tmp3, ymm_tmp3, ymm_tmp2 |
| 3624 | + vpaddd ymm_tmp1, ymm_tmp1, ymm_tmp3 |
| 3625 | + AVX2_BilinearFastPackDwordsToBytes ymm_tmp0, ymm_tmp1, ymm_0 |
| 3626 | + vmovlps [p_dst], xmm_tmp0 |
| 3627 | + vextracti128 [p_dst + 8], ymm_tmp0, 1 |
| 3628 | + add p_dst, 16 |
| 3629 | + AVX2_BilinearIncXposuw ymm_xpos_int, ymm_xpos_frac, ymm_xpos_int_inc, ymm_xpos_frac_inc, ymm_tmp0 |
| 3630 | +%endmacro |
| 3631 | + |
| 3632 | +%macro AVX2_BilinearFastDownsample4xOrLess_16px 0 |
| 3633 | + vbroadcasti128 ymm_tmp0, [shufb_0000000088888888] |
| 3634 | + vpshufb ymm_tmp0, ymm_xpos_int, ymm_tmp0 |
| 3635 | + vpsubb ymm_xpos_int, ymm_xpos_int, ymm_tmp0 |
| 3636 | + AVX2_UnpckXFrac ymm_tmp0, ymm_tmp1, ymm_xpos_frac, ymm_ffff |
| 3637 | + mov r_tmp0, i_xpos |
| 3638 | + shr r_tmp0, 16 |
| 3639 | + vmovdqu xmm_tmp4, [p_src_row0 + r_tmp0] |
| 3640 | + vmovdqu xmm_tmp3, [p_src_row1 + r_tmp0] |
| 3641 | + lea r_tmp0, [i_xpos + 4 * i_scalex2] |
| 3642 | + shr r_tmp0, 16 |
| 3643 | + vinserti128 ymm_tmp4, ymm_tmp4, [p_src_row0 + r_tmp0], 1 |
| 3644 | + vinserti128 ymm_tmp3, ymm_tmp3, [p_src_row1 + r_tmp0], 1 |
| 3645 | + lea r_tmp0, [i_xpos + 2 * i_scalex2] |
| 3646 | + lea i_xpos, [r_tmp0 + 4 * i_scalex2] |
| 3647 | + shr r_tmp0, 16 |
| 3648 | + vpunpcklbw ymm_tmp2, ymm_xpos_int, ymm_ffff |
| 3649 | + vpshufb ymm_tmp4, ymm_tmp4, ymm_tmp2 |
| 3650 | + vpshufb ymm_tmp3, ymm_tmp3, ymm_tmp2 |
| 3651 | + AVX2_BilinearFastCalcXYFrac ymm_tmp0, ymm_tmp2, ymm_tmp0, ymm_yfrac0, ymm_yfrac1 |
| 3652 | + vpmaddwd ymm_tmp0, ymm_tmp0, ymm_tmp4 |
| 3653 | + vpmaddwd ymm_tmp2, ymm_tmp2, ymm_tmp3 |
| 3654 | + vpaddd ymm_tmp0, ymm_tmp0, ymm_tmp2 |
| 3655 | + vmovdqu xmm_tmp4, [p_src_row0 + r_tmp0] |
| 3656 | + vmovdqu xmm_tmp3, [p_src_row1 + r_tmp0] |
| 3657 | + mov r_tmp0, i_xpos |
| 3658 | + lea i_xpos, [i_xpos + 2 * i_scalex2] |
| 3659 | + shr r_tmp0, 16 |
| 3660 | + vinserti128 ymm_tmp4, ymm_tmp4, [p_src_row0 + r_tmp0], 1 |
| 3661 | + vinserti128 ymm_tmp3, ymm_tmp3, [p_src_row1 + r_tmp0], 1 |
| 3662 | + vpunpckhbw ymm_tmp2, ymm_xpos_int, ymm_ffff |
| 3663 | + vpshufb ymm_tmp4, ymm_tmp4, ymm_tmp2 |
| 3664 | + vpshufb ymm_tmp3, ymm_tmp3, ymm_tmp2 |
| 3665 | + AVX2_BilinearFastCalcXYFrac ymm_tmp1, ymm_tmp2, ymm_tmp1, ymm_yfrac0, ymm_yfrac1 |
| 3666 | + vpmaddwd ymm_tmp1, ymm_tmp1, ymm_tmp4 |
| 3667 | + vpmaddwd ymm_tmp2, ymm_tmp2, ymm_tmp3 |
| 3668 | + vpaddd ymm_tmp1, ymm_tmp1, ymm_tmp2 |
| 3669 | + AVX2_BilinearFastPackDwordsToBytes ymm_tmp0, ymm_tmp1, ymm_0 |
| 3670 | + vmovlps [p_dst], xmm_tmp0 |
| 3671 | + vextracti128 [p_dst + 8], ymm_tmp0, 1 |
| 3672 | + add p_dst, 16 |
| 3673 | + AVX2_BilinearIncXposuw ymm_xpos_int, ymm_xpos_frac, ymm_xpos_int_inc, ymm_xpos_frac_inc, ymm_tmp0 |
| 3674 | +%endmacro |
| 3675 | + |
| 3676 | +%macro AVX2_BilinearFastDownsample8xOrLess_16px 0 |
| 3677 | + vbroadcasti128 ymm_tmp0, [shufb_000044448888CCCC] |
| 3678 | + vpshufb ymm_tmp0, ymm_xpos_int, ymm_tmp0 |
| 3679 | + vpsubb ymm_xpos_int, ymm_xpos_int, ymm_tmp0 |
| 3680 | + mov r_tmp0, i_xpos |
| 3681 | + shr r_tmp0, 16 |
| 3682 | + vmovdqu xmm_tmp4, [p_src_row0 + r_tmp0] |
| 3683 | + vmovdqu xmm_tmp5, [p_src_row1 + r_tmp0] |
| 3684 | + lea r_tmp0, [i_xpos + 4 * i_scalex2] |
| 3685 | + add i_xpos, i_scalex2 |
| 3686 | + shr r_tmp0, 16 |
| 3687 | + vinserti128 ymm_tmp4, ymm_tmp4, [p_src_row0 + r_tmp0], 1 |
| 3688 | + vinserti128 ymm_tmp5, ymm_tmp5, [p_src_row1 + r_tmp0], 1 |
| 3689 | + mov r_tmp0, i_xpos |
| 3690 | + shr r_tmp0, 16 |
| 3691 | + vmovdqu xmm_tmp0, [p_src_row0 + r_tmp0] |
| 3692 | + vmovdqu xmm_tmp1, [p_src_row1 + r_tmp0] |
| 3693 | + lea r_tmp0, [i_xpos + 4 * i_scalex2] |
| 3694 | + add i_xpos, i_scalex2 |
| 3695 | + shr r_tmp0, 16 |
| 3696 | + vinserti128 ymm_tmp0, ymm_tmp0, [p_src_row0 + r_tmp0], 1 |
| 3697 | + vinserti128 ymm_tmp1, ymm_tmp1, [p_src_row1 + r_tmp0], 1 |
| 3698 | + vpunpcklbw ymm_tmp3, ymm_xpos_int, ymm_ffff |
| 3699 | + vpshufb ymm_tmp4, ymm_tmp4, ymm_tmp3 |
| 3700 | + vpshufb ymm_tmp5, ymm_tmp5, ymm_tmp3 |
| 3701 | + vpshufb ymm_tmp0, ymm_tmp0, ymm_tmp3 |
| 3702 | + vpshufb ymm_tmp1, ymm_tmp1, ymm_tmp3 |
| 3703 | + vpblendd ymm_tmp4, ymm_tmp4, ymm_tmp0, 11001100b |
| 3704 | + vpblendd ymm_tmp5, ymm_tmp5, ymm_tmp1, 11001100b |
| 3705 | + AVX2_UnpckXFrac ymm_tmp0, ymm_tmp1, ymm_xpos_frac, ymm_ffff |
| 3706 | + AVX2_BilinearFastCalcXYFrac ymm_tmp0, ymm_tmp2, ymm_tmp0, ymm_yfrac0, ymm_yfrac1 |
| 3707 | + vpmaddwd ymm_tmp0, ymm_tmp0, ymm_tmp4 |
| 3708 | + vpmaddwd ymm_tmp2, ymm_tmp2, ymm_tmp5 |
| 3709 | + vpaddd ymm_tmp0, ymm_tmp0, ymm_tmp2 |
| 3710 | + mov r_tmp0, i_xpos |
| 3711 | + shr r_tmp0, 16 |
| 3712 | + vmovdqu xmm_tmp4, [p_src_row0 + r_tmp0] |
| 3713 | + vmovdqu xmm_tmp5, [p_src_row1 + r_tmp0] |
| 3714 | + lea r_tmp0, [i_xpos + 4 * i_scalex2] |
| 3715 | + add i_xpos, i_scalex2 |
| 3716 | + shr r_tmp0, 16 |
| 3717 | + vinserti128 ymm_tmp4, ymm_tmp4, [p_src_row0 + r_tmp0], 1 |
| 3718 | + vinserti128 ymm_tmp5, ymm_tmp5, [p_src_row1 + r_tmp0], 1 |
| 3719 | + mov r_tmp0, i_xpos |
| 3720 | + lea i_xpos, [i_xpos + 4 * i_scalex2] |
| 3721 | + shr r_tmp0, 16 |
| 3722 | + vmovdqu xmm_tmp2, [p_src_row0 + r_tmp0] |
| 3723 | + vmovdqu xmm_tmp3, [p_src_row1 + r_tmp0] |
| 3724 | + mov r_tmp0, i_xpos |
| 3725 | + add i_xpos, i_scalex2 |
| 3726 | + shr r_tmp0, 16 |
| 3727 | + vinserti128 ymm_tmp2, ymm_tmp2, [p_src_row0 + r_tmp0], 1 |
| 3728 | + vinserti128 ymm_tmp3, ymm_tmp3, [p_src_row1 + r_tmp0], 1 |
| 3729 | + vpshufb ymm_tmp4, ymm_tmp4, ymm_xpos_int |
| 3730 | + vpshufb ymm_tmp5, ymm_tmp5, ymm_xpos_int |
| 3731 | + vpshufb ymm_tmp2, ymm_tmp2, ymm_xpos_int |
| 3732 | + vpshufb ymm_tmp3, ymm_tmp3, ymm_xpos_int |
| 3733 | + vpblendd ymm_tmp4, ymm_tmp4, ymm_tmp2, 10001000b |
| 3734 | + vpblendd ymm_tmp5, ymm_tmp5, ymm_tmp3, 10001000b |
| 3735 | + vpunpckhbw ymm_tmp4, ymm_tmp4, ymm_0 |
| 3736 | + vpunpckhbw ymm_tmp5, ymm_tmp5, ymm_0 |
| 3737 | + AVX2_BilinearFastCalcXYFrac ymm_tmp1, ymm_tmp3, ymm_tmp1, ymm_yfrac0, ymm_yfrac1 |
| 3738 | + vpmaddwd ymm_tmp1, ymm_tmp1, ymm_tmp4 |
| 3739 | + vpmaddwd ymm_tmp3, ymm_tmp3, ymm_tmp5 |
| 3740 | + vpaddd ymm_tmp1, ymm_tmp1, ymm_tmp3 |
| 3741 | + AVX2_BilinearFastPackDwordsToBytes ymm_tmp0, ymm_tmp1, ymm_0 |
| 3742 | + vmovlps [p_dst], xmm_tmp0 |
| 3743 | + vextracti128 [p_dst + 8], ymm_tmp0, 1 |
| 3744 | + add p_dst, 16 |
| 3745 | + AVX2_BilinearIncXposuw ymm_xpos_int, ymm_xpos_frac, ymm_xpos_int_inc, ymm_xpos_frac_inc, ymm_tmp0 |
| 3746 | +%endmacro |
| 3747 | + |
| 3748 | +%macro AVX2_GeneralBilinearFastDownsample_16px 0 |
| 3749 | + mov r_tmp0, i_xpos |
| 3750 | + shr r_tmp0, 16 |
| 3751 | + vpbroadcastd ymm_tmp4, [p_src_row0 + r_tmp0] |
| 3752 | + vpbroadcastd ymm_tmp5, [p_src_row1 + r_tmp0] |
| 3753 | + lea r_tmp0, [i_xpos + 1 * i_scalex] |
| 3754 | + shr r_tmp0, 16 |
| 3755 | + vpbroadcastd ymm_tmp0, [p_src_row0 + r_tmp0] |
| 3756 | + vpunpcklwd ymm_tmp4, ymm_tmp4, ymm_tmp0 |
| 3757 | + vpbroadcastd ymm_tmp0, [p_src_row1 + r_tmp0] |
| 3758 | + vpunpcklwd ymm_tmp5, ymm_tmp5, ymm_tmp0 |
| 3759 | + lea r_tmp0, [i_xpos + 2 * i_scalex] |
| 3760 | + lea i_xpos, [i_xpos + 4 * i_scalex] |
| 3761 | + shr r_tmp0, 16 |
| 3762 | + vpbroadcastd ymm_tmp0, [p_src_row0 + r_tmp0] |
| 3763 | + vpblendd ymm_tmp4, ymm_tmp4, ymm_tmp0, 00100010b |
| 3764 | + vpbroadcastd ymm_tmp0, [p_src_row1 + r_tmp0] |
| 3765 | + vpblendd ymm_tmp5, ymm_tmp5, ymm_tmp0, 00100010b |
| 3766 | + mov r_tmp0, i_xpos |
| 3767 | + sub r_tmp0, i_scalex |
| 3768 | + shr r_tmp0, 16 |
| 3769 | + vpbroadcastd ymm_tmp0, [p_src_row0 + r_tmp0 - 2] |
| 3770 | + vpblendw ymm_tmp4, ymm_tmp4, ymm_tmp0, 1000b |
| 3771 | + vpbroadcastd ymm_tmp0, [p_src_row1 + r_tmp0 - 2] |
| 3772 | + vpblendw ymm_tmp5, ymm_tmp5, ymm_tmp0, 1000b |
| 3773 | + mov r_tmp0, i_xpos |
| 3774 | + shr r_tmp0, 16 |
| 3775 | + vpbroadcastd ymm_tmp2, [p_src_row0 + r_tmp0] |
| 3776 | + vpbroadcastd ymm_tmp3, [p_src_row1 + r_tmp0] |
| 3777 | + lea r_tmp0, [i_xpos + 1 * i_scalex] |
| 3778 | + shr r_tmp0, 16 |
| 3779 | + vpbroadcastd ymm_tmp0, [p_src_row0 + r_tmp0] |
| 3780 | + vpunpcklwd ymm_tmp2, ymm_tmp2, ymm_tmp0 |
| 3781 | + vpbroadcastd ymm_tmp0, [p_src_row1 + r_tmp0] |
| 3782 | + vpunpcklwd ymm_tmp3, ymm_tmp3, ymm_tmp0 |
| 3783 | + lea r_tmp0, [i_xpos + 2 * i_scalex] |
| 3784 | + lea i_xpos, [i_xpos + 4 * i_scalex] |
| 3785 | + shr r_tmp0, 16 |
| 3786 | + vpbroadcastd ymm_tmp0, [p_src_row0 + r_tmp0] |
| 3787 | + vpblendd ymm_tmp2, ymm_tmp2, ymm_tmp0, 00100010b |
| 3788 | + vpbroadcastd ymm_tmp0, [p_src_row1 + r_tmp0] |
| 3789 | + vpblendd ymm_tmp3, ymm_tmp3, ymm_tmp0, 00100010b |
| 3790 | + mov r_tmp0, i_xpos |
| 3791 | + sub r_tmp0, i_scalex |
| 3792 | + shr r_tmp0, 16 |
| 3793 | + vpbroadcastd ymm_tmp0, [p_src_row0 + r_tmp0 - 2] |
| 3794 | + vpblendw ymm_tmp2, ymm_tmp2, ymm_tmp0, 1000b |
| 3795 | + vpbroadcastd ymm_tmp0, [p_src_row1 + r_tmp0 - 2] |
| 3796 | + vpblendw ymm_tmp3, ymm_tmp3, ymm_tmp0, 1000b |
| 3797 | + mov r_tmp0, i_xpos |
| 3798 | + shr r_tmp0, 16 |
| 3799 | + vmovd xmm_tmp0, [p_src_row0 + r_tmp0] |
| 3800 | + vmovd xmm_tmp1, [p_src_row1 + r_tmp0] |
| 3801 | + lea r_tmp0, [i_xpos + i_scalex] |
| 3802 | + shr r_tmp0, 16 |
| 3803 | + vpinsrw xmm_tmp0, [p_src_row0 + r_tmp0], 1 |
| 3804 | + vpinsrw xmm_tmp1, [p_src_row1 + r_tmp0], 1 |
| 3805 | + lea r_tmp0, [i_xpos + 2 * i_scalex] |
| 3806 | + lea i_xpos, [i_xpos + 4 * i_scalex] |
| 3807 | + shr r_tmp0, 16 |
| 3808 | + vpinsrw xmm_tmp0, [p_src_row0 + r_tmp0], 2 |
| 3809 | + vpinsrw xmm_tmp1, [p_src_row1 + r_tmp0], 2 |
| 3810 | + mov r_tmp0, i_xpos |
| 3811 | + sub r_tmp0, i_scalex |
| 3812 | + shr r_tmp0, 16 |
| 3813 | + vpinsrw xmm_tmp0, [p_src_row0 + r_tmp0], 3 |
| 3814 | + vpinsrw xmm_tmp1, [p_src_row1 + r_tmp0], 3 |
| 3815 | + vpblendd ymm_tmp4, ymm_tmp4, ymm_tmp0, 00001111b |
| 3816 | + vpblendd ymm_tmp5, ymm_tmp5, ymm_tmp1, 00001111b |
| 3817 | + mov r_tmp0, i_xpos |
| 3818 | + shr r_tmp0, 16 |
| 3819 | + vmovd xmm_tmp0, [p_src_row0 + r_tmp0] |
| 3820 | + vmovd xmm_tmp1, [p_src_row1 + r_tmp0] |
| 3821 | + lea r_tmp0, [i_xpos + i_scalex] |
| 3822 | + shr r_tmp0, 16 |
| 3823 | + vpinsrw xmm_tmp0, [p_src_row0 + r_tmp0], 1 |
| 3824 | + vpinsrw xmm_tmp1, [p_src_row1 + r_tmp0], 1 |
| 3825 | + lea r_tmp0, [i_xpos + 2 * i_scalex] |
| 3826 | + lea i_xpos, [i_xpos + 4 * i_scalex] |
| 3827 | + shr r_tmp0, 16 |
| 3828 | + vpinsrw xmm_tmp0, [p_src_row0 + r_tmp0], 2 |
| 3829 | + vpinsrw xmm_tmp1, [p_src_row1 + r_tmp0], 2 |
| 3830 | + mov r_tmp0, i_xpos |
| 3831 | + sub r_tmp0, i_scalex |
| 3832 | + shr r_tmp0, 16 |
| 3833 | + vpinsrw xmm_tmp0, [p_src_row0 + r_tmp0], 3 |
| 3834 | + vpinsrw xmm_tmp1, [p_src_row1 + r_tmp0], 3 |
| 3835 | + vpblendd ymm_tmp2, ymm_tmp2, ymm_tmp0, 00001111b |
| 3836 | + vpblendd ymm_tmp3, ymm_tmp3, ymm_tmp1, 00001111b |
| 3837 | + vpunpcklbw ymm_tmp4, ymm_tmp4, ymm_0 |
| 3838 | + vpunpcklbw ymm_tmp5, ymm_tmp5, ymm_0 |
| 3839 | + AVX2_BilinearFastCalcXYFrac ymm_tmp0, ymm_tmp1, ymm_xfrac0, ymm_yfrac0, ymm_yfrac1 |
| 3840 | + vpmaddwd ymm_tmp0, ymm_tmp0, ymm_tmp4 |
| 3841 | + vpmaddwd ymm_tmp1, ymm_tmp1, ymm_tmp5 |
| 3842 | + vpaddd ymm_tmp0, ymm_tmp0, ymm_tmp1 |
| 3843 | + vpunpcklbw ymm_tmp4, ymm_tmp2, ymm_0 |
| 3844 | + vpunpcklbw ymm_tmp5, ymm_tmp3, ymm_0 |
| 3845 | + AVX2_BilinearFastCalcXYFrac ymm_tmp1, ymm_tmp2, ymm_xfrac1, ymm_yfrac0, ymm_yfrac1 |
| 3846 | + vpmaddwd ymm_tmp1, ymm_tmp1, ymm_tmp4 |
| 3847 | + vpmaddwd ymm_tmp2, ymm_tmp2, ymm_tmp5 |
| 3848 | + vpaddd ymm_tmp1, ymm_tmp1, ymm_tmp2 |
| 3849 | + AVX2_BilinearFastPackDwordsToBytes ymm_tmp0, ymm_tmp1, ymm_0 |
| 3850 | + vpermq ymm_tmp0, ymm_tmp0, 0010b |
| 3851 | + vmovdqu [p_dst], xmm_tmp0 |
| 3852 | + add p_dst, 16 |
| 3853 | + vpaddw ymm_xfrac0, ymm_xfrac0, ymm_xfrac_inc |
| 3854 | + vpaddw ymm_xfrac1, ymm_xfrac1, ymm_xfrac_inc |
| 3855 | +%endmacro |
| 3856 | + |
| 3857 | +; downsample_16px_macro=%1 b_fast=%2 |
| 3858 | +%macro AVX2_GeneralBilinearDownsampler_loop 2 |
| 3859 | +%%height: |
| 3860 | + mov p_src_row0, i_ypos |
| 3861 | + shr p_src_row0, 15 |
| 3862 | + imul p_src_row0, i_src_stride |
| 3863 | + add p_src_row0, p_src |
| 3864 | + mov p_src_row1, p_src_row0 |
| 3865 | + add p_src_row1, i_src_stride |
| 3866 | +%ifdef X86_32 |
| 3867 | +%if %2 |
| 3868 | + vpbroadcastw ymm_tmp1, i_ypos |
| 3869 | + vpsllw ymm_tmp1, ymm_tmp1, 1 |
| 3870 | + vpsrlw ymm_tmp1, ymm_tmp1, 1 |
| 3871 | + vpcmpeqw ymm_tmp0, ymm_tmp0, ymm_tmp0 |
| 3872 | + vpsrlw ymm_tmp0, ymm_tmp0, 1 |
| 3873 | +%else |
| 3874 | + vpbroadcastd ymm_tmp1, i_ypos |
| 3875 | + vpslld ymm_tmp1, ymm_tmp1, 17 |
| 3876 | + vpsrld ymm_tmp1, ymm_tmp1, 17 |
| 3877 | + vpcmpeqw ymm_tmp0, ymm_tmp0, ymm_tmp0 |
| 3878 | + vpsrld ymm_tmp0, ymm_tmp0, 17 |
| 3879 | +%endif |
| 3880 | + vpxor ymm_tmp0, ymm_tmp0, ymm_tmp1 |
| 3881 | + vmovdqa ymm_yfrac0, ymm_tmp0 |
| 3882 | + vmovdqa ymm_yfrac1, ymm_tmp1 |
| 3883 | +%else |
| 3884 | + vmovd xmm_tmp0, i_yposd |
| 3885 | + vpbroadcastw ymm_yfrac1, xmm_tmp0 |
| 3886 | +%if %2 |
| 3887 | + vpsllw ymm_yfrac1, ymm_yfrac1, 1 |
| 3888 | + vpsrlw ymm_yfrac1, ymm_yfrac1, 1 |
| 3889 | + vpcmpeqw ymm_yfrac0, ymm_yfrac0, ymm_yfrac0 |
| 3890 | + vpsrlw ymm_yfrac0, ymm_yfrac0, 1 |
| 3891 | +%else |
| 3892 | + vpslld ymm_yfrac1, ymm_yfrac1, 17 |
| 3893 | + vpsrld ymm_yfrac1, ymm_yfrac1, 17 |
| 3894 | + vpcmpeqw ymm_yfrac0, ymm_yfrac0, ymm_yfrac0 |
| 3895 | + vpsrld ymm_yfrac0, ymm_yfrac0, 17 |
| 3896 | +%endif |
| 3897 | + vpxor ymm_yfrac0, ymm_yfrac0, ymm_yfrac1 |
| 3898 | +%endif |
| 3899 | + |
| 3900 | + mov i_xpos, 1 << 15 |
| 3901 | + mov i_width_cnt, i_dst_width |
| 3902 | + sub i_width_cnt, 1 |
| 3903 | + |
| 3904 | +%ifdef ymm_xpos_int |
| 3905 | + vmovdqa ymm_xpos_int, ymm_xpos_int_begin |
| 3906 | + vmovdqa ymm_xpos_frac, ymm_xpos_frac_begin |
| 3907 | +%else |
| 3908 | + vmovdqa ymm_xfrac0, ymm_xfrac0_begin |
| 3909 | + vmovdqa ymm_xfrac1, ymm_xfrac1_begin |
| 3910 | +%endif |
| 3911 | + |
| 3912 | +%%width: |
| 3913 | + %1 |
| 3914 | + sub i_width_cnt, 16 |
| 3915 | + jg %%width |
| 3916 | + |
| 3917 | + lea p_dst, [p_dst + i_width_cnt + 1] |
| 3918 | +%ifdef i_scalex2 |
| 3919 | + mov r_tmp0, i_scalex2 |
| 3920 | + shr r_tmp0, 1 |
| 3921 | + imul i_width_cnt, r_tmp0 |
| 3922 | +%else |
| 3923 | + imul i_width_cnt, i_scalex |
| 3924 | +%endif |
| 3925 | + add i_xpos, i_width_cnt |
| 3926 | + shr i_xpos, 16 |
| 3927 | + movzx r_tmp0, byte [p_src_row0 + i_xpos] |
| 3928 | + mov [p_dst - 1], r_tmp0b |
| 3929 | +%ifdef X86_32 |
| 3930 | + mov r_tmp0, i_scaleyd |
| 3931 | + add i_yposd, r_tmp0 |
| 3932 | +%else |
| 3933 | + add i_yposd, i_scaleyd |
| 3934 | +%endif |
| 3935 | + add p_dst, i_dst_stride_less_width |
| 3936 | + sub i_dst_height, 1 |
| 3937 | + jg %%height |
| 3938 | +%endmacro |
| 3939 | + |
| 3940 | +;************************************************************************************************************** |
| 3941 | +;void GeneralBilinearFastDownsampler_avx2 (uint8_t* pDst, int32_t iDstStride, int32_t iDstWidth, |
| 3942 | +; int32_t iDstHeight, uint8_t* pSrc, int32_t iSrcStride, uint32_t uiScaleX, |
| 3943 | +; uint32_t uiScaleY); |
| 3944 | +; |
| 3945 | +;************************************************************************************************************** |
| 3946 | + |
| 3947 | +WELS_EXTERN GeneralBilinearFastDownsampler_avx2 |
| 3948 | + %assign push_num 0 |
| 3949 | +%ifndef X86_32 |
| 3950 | + push r12 |
| 3951 | + push r13 |
| 3952 | + push rbx |
| 3953 | + push rbp |
| 3954 | + %assign push_num 4 |
| 3955 | +%ifdef WIN64 |
| 3956 | + push rdi |
| 3957 | + push rsi |
| 3958 | + %assign push_num push_num + 2 |
| 3959 | +%endif |
| 3960 | +%endif |
| 3961 | + LOAD_7_PARA |
| 3962 | + PUSH_XMM 16 |
| 3963 | + SIGN_EXTENSION r1, r1d |
| 3964 | + SIGN_EXTENSION r2, r2d |
| 3965 | + SIGN_EXTENSION r3, r3d |
| 3966 | + SIGN_EXTENSION r5, r5d |
| 3967 | + ZERO_EXTENSION r6d |
| 3968 | + sub r1, r2 ; dst_stride - dst_width |
| 3969 | +%ifdef X86_32 |
| 3970 | + vmovd xmm0, arg8 |
| 3971 | + vmovd xmm1, esp |
| 3972 | + and esp, -32 |
| 3973 | + sub esp, 8 * 4 + 8 * 32 |
| 3974 | + vmovd [esp], xmm1 |
| 3975 | + %define p_dst r0 |
| 3976 | + %define i_dst_stride_less_width [esp + 1 * 4] |
| 3977 | + %define i_dst_width [esp + 2 * 4] |
| 3978 | + %define i_dst_height dword [esp + 3 * 4] |
| 3979 | + %define p_src [esp + 4 * 4] |
| 3980 | + %define i_src_stride [esp + 5 * 4] |
| 3981 | + %define i_scalex r6 |
| 3982 | + %define i_scalexd r6d |
| 3983 | + %define i_scaleyd [esp + 6 * 4] |
| 3984 | + %define i_xpos r2 |
| 3985 | + %define i_ypos [esp + 7 * 4] |
| 3986 | + %define i_yposd dword [esp + 7 * 4] |
| 3987 | + %define p_src_row0 r3 |
| 3988 | + %define p_src_row1 r4 |
| 3989 | + %define i_width_cnt r5 |
| 3990 | + %define r_tmp0 r1 |
| 3991 | + %define r_tmp0b r1b |
| 3992 | + %define ymm_xpos_frac ymm1 |
| 3993 | + %define ymm_xpos_frac_inc [esp + 8 * 4] |
| 3994 | + %define ymm_xpos_int ymm3 |
| 3995 | + %define ymm_xpos_int_inc [esp + 8 * 4 + 1 * 32] |
| 3996 | + %define ymm_yfrac0 [esp + 8 * 4 + 2 * 32] |
| 3997 | + %define ymm_yfrac1 [esp + 8 * 4 + 3 * 32] |
| 3998 | + %define xmm_tmp0 xmm7 |
| 3999 | + %define ymm_tmp0 ymm7 |
| 4000 | + %define xmm_tmp1 xmm0 |
| 4001 | + %define ymm_tmp1 ymm0 |
| 4002 | + %define xmm_tmp2 xmm2 |
| 4003 | + %define ymm_tmp2 ymm2 |
| 4004 | + %define xmm_tmp3 xmm4 |
| 4005 | + %define ymm_tmp3 ymm4 |
| 4006 | + %define xmm_tmp4 xmm5 |
| 4007 | + %define ymm_tmp4 ymm5 |
| 4008 | + %define xmm_tmp5 xmm6 |
| 4009 | + %define ymm_tmp5 ymm6 |
| 4010 | + %define ymm_0 [esp + 8 * 4 + 4 * 32] |
| 4011 | + %define ymm_ffff [esp + 8 * 4 + 5 * 32] |
| 4012 | + %define ymm_xpos_int_begin [esp + 8 * 4 + 6 * 32] |
| 4013 | + %define ymm_xpos_frac_begin [esp + 8 * 4 + 7 * 32] |
| 4014 | + mov i_dst_stride_less_width, r1 |
| 4015 | + mov i_dst_width, r2 |
| 4016 | + mov i_dst_height, r3 |
| 4017 | + mov p_src, r4 |
| 4018 | + mov i_src_stride, r5 |
| 4019 | + vmovd i_scaleyd, xmm0 |
| 4020 | + vpxor xmm0, xmm0, xmm0 |
| 4021 | + vmovdqa ymm_0, ymm0 |
| 4022 | + vpcmpeqw ymm_tmp0, ymm_tmp0, ymm_tmp0 |
| 4023 | + vmovdqa ymm_ffff, ymm_tmp0 |
| 4024 | +%else |
| 4025 | + %define p_dst r0 |
| 4026 | + %define i_dst_stride_less_width r1 |
| 4027 | + %define i_dst_width r2 |
| 4028 | + %define i_dst_height r3 |
| 4029 | + %define p_src r4 |
| 4030 | + %define i_src_stride r5 |
| 4031 | + %define i_scalex r6 |
| 4032 | + %define i_scalexd r6d |
| 4033 | + %define i_scaleyd dword arg8d |
| 4034 | + %define i_xpos r12 |
| 4035 | + %define i_ypos r13 |
| 4036 | + %define i_yposd r13d |
| 4037 | + %define p_src_row0 rbp |
| 4038 | +%ifdef WIN64 |
| 4039 | + %define p_src_row1 rsi |
| 4040 | + %define i_width_cnt rdi |
| 4041 | +%else |
| 4042 | + %define p_src_row1 r11 |
| 4043 | + %define i_width_cnt rax |
| 4044 | +%endif |
| 4045 | + %define r_tmp0 rbx |
| 4046 | + %define r_tmp0b bl |
| 4047 | + %define ymm_0 ymm0 |
| 4048 | + %define ymm_xpos_frac ymm1 |
| 4049 | + %define ymm_xpos_frac_inc ymm2 |
| 4050 | + %define ymm_xpos_int ymm3 |
| 4051 | + %define ymm_xpos_int_inc ymm4 |
| 4052 | + %define ymm_yfrac0 ymm5 |
| 4053 | + %define ymm_yfrac1 ymm6 |
| 4054 | + %define xmm_tmp0 xmm7 |
| 4055 | + %define ymm_tmp0 ymm7 |
| 4056 | + %define xmm_tmp1 xmm8 |
| 4057 | + %define ymm_tmp1 ymm8 |
| 4058 | + %define xmm_tmp2 xmm9 |
| 4059 | + %define ymm_tmp2 ymm9 |
| 4060 | + %define xmm_tmp3 xmm10 |
| 4061 | + %define ymm_tmp3 ymm10 |
| 4062 | + %define xmm_tmp4 xmm11 |
| 4063 | + %define ymm_tmp4 ymm11 |
| 4064 | + %define xmm_tmp5 xmm12 |
| 4065 | + %define ymm_tmp5 ymm12 |
| 4066 | + %define ymm_ffff ymm13 |
| 4067 | + %define ymm_xpos_int_begin ymm14 |
| 4068 | + %define ymm_xpos_frac_begin ymm15 |
| 4069 | + vpxor ymm_0, ymm_0, ymm_0 |
| 4070 | + vpcmpeqw ymm_ffff, ymm_ffff, ymm_ffff |
| 4071 | +%endif |
| 4072 | + |
| 4073 | + sub i_dst_height, 1 |
| 4074 | + je .final_row |
| 4075 | + jl .done |
| 4076 | + |
| 4077 | + mov i_yposd, 1 << 14 |
| 4078 | + vmovd xmm_tmp0, i_scalexd |
| 4079 | + vpbroadcastd ymm_tmp0, xmm_tmp0 |
| 4080 | + vpslld ymm_tmp1, ymm_tmp0, 2 |
| 4081 | + vpslld ymm_tmp2, ymm_tmp0, 3 |
| 4082 | + vpaddd ymm_tmp3, ymm_tmp1, ymm_tmp2 |
| 4083 | + vpxor ymm_tmp4, ymm_tmp4, ymm_tmp4 |
| 4084 | + vpblendd ymm_tmp1, ymm_tmp4, ymm_tmp1, 11110000b |
| 4085 | + vpblendd ymm_tmp2, ymm_tmp2, ymm_tmp3, 11110000b |
| 4086 | + vpaddd ymm_tmp3, ymm_tmp0, ymm_tmp0 |
| 4087 | + vpblendd ymm_tmp3, ymm_tmp4, ymm_tmp3, 11001100b |
| 4088 | + vpblendd ymm_tmp0, ymm_tmp4, ymm_tmp0, 10101010b |
| 4089 | + vpaddd ymm_tmp0, ymm_tmp3, ymm_tmp0 |
| 4090 | + vpaddd ymm_tmp1, ymm_tmp1, ymm_tmp0 |
| 4091 | + vpaddd ymm_tmp2, ymm_tmp2, ymm_tmp0 |
| 4092 | + vpcmpeqw ymm_tmp3, ymm_tmp3, ymm_tmp3 |
| 4093 | + vpsrld ymm_tmp3, ymm_tmp3, 31 |
| 4094 | + vpslld ymm_tmp3, ymm_tmp3, 15 |
| 4095 | + vpaddd ymm_tmp1, ymm_tmp1, ymm_tmp3 |
| 4096 | + vpaddd ymm_tmp2, ymm_tmp2, ymm_tmp3 |
| 4097 | + vpsrld ymm_xpos_int, ymm_tmp1, 16 |
| 4098 | + vpsrld ymm_tmp0, ymm_tmp2, 16 |
| 4099 | + vpackssdw ymm_xpos_int, ymm_xpos_int, ymm_tmp0 |
| 4100 | + vpermq ymm_xpos_int, ymm_xpos_int, 11011000b |
| 4101 | + vpackuswb ymm_xpos_int, ymm_xpos_int, ymm_xpos_int |
| 4102 | + vpcmpeqw ymm_tmp3, ymm_tmp3, ymm_tmp3 |
| 4103 | + vpsubb ymm_tmp0, ymm_xpos_int, ymm_tmp3 |
| 4104 | + vpunpcklbw ymm_xpos_int, ymm_xpos_int, ymm_tmp0 |
| 4105 | + vpslld ymm_tmp1, ymm_tmp1, 16 |
| 4106 | + vpsrld ymm_tmp1, ymm_tmp1, 16 |
| 4107 | + vpslld ymm_tmp2, ymm_tmp2, 16 |
| 4108 | + vpsrld ymm_tmp2, ymm_tmp2, 16 |
| 4109 | + vpackusdw ymm_xpos_frac, ymm_tmp1, ymm_tmp2 |
| 4110 | + vpermq ymm_xpos_frac, ymm_xpos_frac, 11011000b |
| 4111 | + vmovd xmm_tmp0, i_scalexd |
| 4112 | + vpslld xmm_tmp0, xmm_tmp0, 4 |
| 4113 | + vpbroadcastw ymm_tmp1, xmm_tmp0 |
| 4114 | + vmovdqa ymm_xpos_frac_inc, ymm_tmp1 |
| 4115 | + vpsrld xmm_tmp0, xmm_tmp0, 16 |
| 4116 | + vpsubw ymm_tmp0, ymm_tmp0, ymm_tmp3 |
| 4117 | + vpbroadcastb ymm_tmp0, xmm_tmp0 |
| 4118 | + vmovdqa ymm_xpos_int_inc, ymm_tmp0 |
| 4119 | + vmovdqa ymm_xpos_int_begin, ymm_xpos_int |
| 4120 | + vmovdqa ymm_xpos_frac_begin, ymm_xpos_frac |
| 4121 | + |
| 4122 | + cmp i_scalex, 4 << 16 |
| 4123 | + ja .scalex_above4 |
| 4124 | + cmp i_scalex, 2 << 16 |
| 4125 | + ja .scalex_above2_beloweq4 |
| 4126 | + add i_scalex, i_scalex |
| 4127 | +%xdefine i_scalex2 i_scalex |
| 4128 | +%undef i_scalex |
| 4129 | + AVX2_GeneralBilinearDownsampler_loop AVX2_BilinearFastDownsample2xOrLess_16px, 1 |
| 4130 | + shr i_scalex2, 1 |
| 4131 | +%xdefine i_scalex i_scalex2 |
| 4132 | +%undef i_scalex2 |
| 4133 | + jmp .final_row |
| 4134 | +.scalex_above2_beloweq4: |
| 4135 | + add i_scalex, i_scalex |
| 4136 | +%xdefine i_scalex2 i_scalex |
| 4137 | +%undef i_scalex |
| 4138 | + AVX2_GeneralBilinearDownsampler_loop AVX2_BilinearFastDownsample4xOrLess_16px, 1 |
| 4139 | + shr i_scalex2, 1 |
| 4140 | +%xdefine i_scalex i_scalex2 |
| 4141 | +%undef i_scalex2 |
| 4142 | + jmp .final_row |
| 4143 | +.scalex_above4: |
| 4144 | + cmp i_scalex, 8 << 16 |
| 4145 | + ja .scalex_above8 |
| 4146 | + add i_scalex, i_scalex |
| 4147 | +%xdefine i_scalex2 i_scalex |
| 4148 | +%undef i_scalex |
| 4149 | + AVX2_GeneralBilinearDownsampler_loop AVX2_BilinearFastDownsample8xOrLess_16px, 1 |
| 4150 | + shr i_scalex2, 1 |
| 4151 | +%xdefine i_scalex i_scalex2 |
| 4152 | +%undef i_scalex2 |
| 4153 | + jmp .final_row |
| 4154 | +.scalex_above8: |
| 4155 | +%xdefine ymm_xfrac0 ymm_xpos_frac |
| 4156 | +%xdefine ymm_xfrac1 ymm_xpos_int |
| 4157 | +%xdefine ymm_xfrac0_begin ymm_xpos_int_begin |
| 4158 | +%xdefine ymm_xfrac1_begin ymm_xpos_frac_begin |
| 4159 | +%xdefine ymm_xfrac_inc ymm_xpos_frac_inc |
| 4160 | +%undef ymm_xpos_int |
| 4161 | +%undef ymm_xpos_frac |
| 4162 | +%undef ymm_xpos_int_begin |
| 4163 | +%undef ymm_xpos_frac_begin |
| 4164 | +%undef ymm_xpos_int_inc |
| 4165 | +%undef ymm_xpos_frac_inc |
| 4166 | + AVX2_UnpckXFrac ymm_tmp0, ymm_xfrac1, ymm_xfrac0, ymm_ffff |
| 4167 | + vpermq ymm_xfrac0, ymm_tmp0, 01001110b |
| 4168 | + vpermq ymm_xfrac1, ymm_xfrac1, 01001110b |
| 4169 | + vmovdqa ymm_xfrac0_begin, ymm_xfrac0 |
| 4170 | + vmovdqa ymm_xfrac1_begin, ymm_xfrac1 |
| 4171 | + vpcmpeqw ymm_tmp0, ymm_tmp0, ymm_tmp0 |
| 4172 | + vpmullw ymm_tmp0, ymm_tmp0, ymm_xfrac_inc |
| 4173 | + vpunpcklwd ymm_tmp0, ymm_tmp0, ymm_xfrac_inc |
| 4174 | + vmovdqa ymm_xfrac_inc, ymm_tmp0 |
| 4175 | + AVX2_GeneralBilinearDownsampler_loop AVX2_GeneralBilinearFastDownsample_16px, 1 |
| 4176 | + |
| 4177 | +.final_row: |
| 4178 | + mov p_src_row0, i_ypos |
| 4179 | + shr p_src_row0, 15 |
| 4180 | + imul p_src_row0, i_src_stride |
| 4181 | + add p_src_row0, p_src |
| 4182 | + mov i_xpos, 1 << 15 |
| 4183 | + mov i_width_cnt, i_dst_width |
| 4184 | + |
| 4185 | +.final_row_width: |
| 4186 | + mov r_tmp0, i_xpos |
| 4187 | + shr r_tmp0, 16 |
| 4188 | + movzx r_tmp0, byte [p_src_row0 + r_tmp0] |
| 4189 | + mov [p_dst], r_tmp0b |
| 4190 | + add p_dst, 1 |
| 4191 | + add i_xpos, i_scalex |
| 4192 | + sub i_width_cnt, 1 |
| 4193 | + jg .final_row_width |
| 4194 | + |
| 4195 | +.done: |
| 4196 | + vzeroupper |
| 4197 | +%ifdef X86_32 |
| 4198 | + mov esp, [esp] |
| 4199 | +%endif |
| 4200 | + POP_XMM |
| 4201 | + LOAD_7_PARA_POP |
| 4202 | +%ifndef X86_32 |
| 4203 | +%ifdef WIN64 |
| 4204 | + pop rsi |
| 4205 | + pop rdi |
| 4206 | +%endif |
| 4207 | + pop rbp |
| 4208 | + pop rbx |
| 4209 | + pop r13 |
| 4210 | + pop r12 |
| 4211 | +%endif |
| 4212 | + ret |
| 4213 | +%undef p_dst |
| 4214 | +%undef i_dst_stride_less_width |
| 4215 | +%undef i_dst_width |
| 4216 | +%undef i_dst_height |
| 4217 | +%undef p_src |
| 4218 | +%undef i_src_stride |
| 4219 | +%undef i_scalex |
| 4220 | +%undef i_scalexd |
| 4221 | +%undef i_scaleyd |
| 4222 | +%undef i_xpos |
| 4223 | +%undef i_ypos |
| 4224 | +%undef i_yposd |
| 4225 | +%undef p_src_row0 |
| 4226 | +%undef p_src_row1 |
| 4227 | +%undef i_width_cnt |
| 4228 | +%undef r_tmp0 |
| 4229 | +%undef r_tmp0b |
| 4230 | +%undef ymm_xpos_frac |
| 4231 | +%undef ymm_xpos_frac_inc |
| 4232 | +%undef ymm_xpos_int |
| 4233 | +%undef ymm_xpos_int_inc |
| 4234 | +%undef ymm_yfrac0 |
| 4235 | +%undef ymm_yfrac1 |
| 4236 | +%undef xmm_tmp0 |
| 4237 | +%undef ymm_tmp0 |
| 4238 | +%undef xmm_tmp1 |
| 4239 | +%undef ymm_tmp1 |
| 4240 | +%undef xmm_tmp2 |
| 4241 | +%undef ymm_tmp2 |
| 4242 | +%undef xmm_tmp3 |
| 4243 | +%undef ymm_tmp3 |
| 4244 | +%undef xmm_tmp4 |
| 4245 | +%undef ymm_tmp4 |
| 4246 | +%undef xmm_tmp5 |
| 4247 | +%undef ymm_tmp5 |
| 4248 | +%undef ymm_ffff |
| 4249 | +%undef ymm_0 |
| 4250 | +%undef ymm_xpos_int_begin |
| 4251 | +%undef ymm_xpos_frac_begin |
| 4252 | +%undef ymm_xfrac0 |
| 4253 | +%undef ymm_xfrac1 |
| 4254 | +%undef ymm_xfrac0_begin |
| 4255 | +%undef ymm_xfrac1_begin |
| 4256 | +%undef ymm_xfrac_inc |