| @@ -3854,6 +3854,291 @@ WELS_EXTERN GeneralBilinearAccurateDownsampler_sse41 · 3853 unmodified lines |
| 3854 | 3854 | vpaddw ymm_xfrac1, ymm_xfrac1, ymm_xfrac_inc |
| 3855 | 3855 | %endmacro |
| 3856 | 3856 | |
| 3857 | +; xpos_int=%1 xpos_frac=%2 inc_int=%3 inc_frac=%4 7FFFh=%5 tmp=%6,%7 |
| 3858 | +%macro AVX2_BilinearIncXposw 7 |
| 3859 | + vpaddb %1, %1, %3 |
| 3860 | + vpaddw %6, %2, %4 |
| 3861 | + vpcmpgtw %7, %2, %6 |
| 3862 | + vpsubb %1, %1, %7 ; add carry |
| 3863 | + vpand %2, %6, %5 |
| 3864 | +%endmacro |
| 3865 | + |
| 3866 | +; res>>29=%1 data0=%2 data1=%3 frac0=%4 frac1=%5 tmp=%6 |
| 3867 | +%macro AVX2_LinearAccurateInterpolateVerticalDwords 6 |
| 3868 | + vpshufd %1, %2, 10110001b |
| 3869 | + vpshufd %6, %3, 10110001b |
| 3870 | + vpmuludq %1, %1, %4 |
| 3871 | + vpmuludq %6, %6, %5 |
| 3872 | + vpaddq %1, %1, %6 |
| 3873 | + vpmuludq %2, %2, %4 |
| 3874 | + vpmuludq %3, %3, %5 |
| 3875 | + vpaddq %2, %2, %3 |
| 3876 | + vpsllq %1, %1, 3 |
| 3877 | + vpsrlq %2, %2, 29 |
| 3878 | + vpblendd %1, %1, %2, 01010101b |
| 3879 | +%endmacro |
| 3880 | + |
| 3881 | +%macro AVX2_BilinearAccurateDownsample2xOrLess_16px 0 |
| 3882 | + vpshufb ymm_tmp0, ymm_xpos_int, ymm_0 |
| 3883 | + vpsubb ymm_xpos_int, ymm_xpos_int, ymm_tmp0 |
| 3884 | + AVX2_UnpckXFrac ymm_tmp0, ymm_tmp1, ymm_xpos_frac, ymm_7fff |
| 3885 | + mov r_tmp0, i_xpos |
| 3886 | + shr r_tmp0, 16 |
| 3887 | + vmovdqu xmm_tmp4, [p_src_row0 + r_tmp0] |
| 3888 | + vmovdqu xmm_tmp5, [p_src_row1 + r_tmp0] |
| 3889 | + lea r_tmp0, [i_xpos + 4 * i_scalex2] |
| 3890 | + lea i_xpos, [i_xpos + 8 * i_scalex2] |
| 3891 | + shr r_tmp0, 16 |
| 3892 | + vinserti128 ymm_tmp4, ymm_tmp4, [p_src_row0 + r_tmp0], 1 |
| 3893 | + vinserti128 ymm_tmp5, ymm_tmp5, [p_src_row1 + r_tmp0], 1 |
| 3894 | + vpshufb ymm_tmp4, ymm_tmp4, ymm_xpos_int |
| 3895 | + vpshufb ymm_tmp5, ymm_tmp5, ymm_xpos_int |
| 3896 | + vpunpcklbw ymm_tmp2, ymm_tmp4, ymm_0 |
| 3897 | + vpunpcklbw ymm_tmp3, ymm_tmp5, ymm_0 |
| 3898 | + vpunpckhbw ymm_tmp4, ymm_tmp4, ymm_0 |
| 3899 | + vpunpckhbw ymm_tmp5, ymm_tmp5, ymm_0 |
| 3900 | + vpmaddwd ymm_tmp2, ymm_tmp2, ymm_tmp0 |
| 3901 | + vpmaddwd ymm_tmp3, ymm_tmp3, ymm_tmp0 |
| 3902 | + vpmaddwd ymm_tmp4, ymm_tmp4, ymm_tmp1 |
| 3903 | + vpmaddwd ymm_tmp5, ymm_tmp5, ymm_tmp1 |
| 3904 | + AVX2_LinearAccurateInterpolateVerticalDwords ymm_tmp0, ymm_tmp2, ymm_tmp3, ymm_yfrac0, ymm_yfrac1, ymm_tmp1 |
| 3905 | + AVX2_LinearAccurateInterpolateVerticalDwords ymm_tmp1, ymm_tmp4, ymm_tmp5, ymm_yfrac0, ymm_yfrac1, ymm_tmp2 |
| 3906 | + vpackssdw ymm_tmp0, ymm_tmp0, ymm_tmp1 |
| 3907 | + vpavgw ymm_tmp0, ymm_tmp0, ymm_0 |
| 3908 | + vpackuswb ymm_tmp0, ymm_tmp0, ymm_tmp0 |
| 3909 | + vmovlps [p_dst], xmm_tmp0 |
| 3910 | + vextracti128 [p_dst + 8], ymm_tmp0, 1 |
| 3911 | + add p_dst, 16 |
| 3912 | + AVX2_BilinearIncXposw ymm_xpos_int, ymm_xpos_frac, ymm_xpos_int_inc, ymm_xpos_frac_inc, ymm_7fff, ymm_tmp0, ymm_tmp1 |
| 3913 | +%endmacro |
| 3914 | + |
| 3915 | +%macro AVX2_BilinearAccurateDownsample4xOrLess_16px 0 |
| 3916 | + vbroadcasti128 ymm_tmp0, [shufb_0000000088888888] |
| 3917 | + vpshufb ymm_tmp0, ymm_xpos_int, ymm_tmp0 |
| 3918 | + vpsubb ymm_xpos_int, ymm_xpos_int, ymm_tmp0 |
| 3919 | + AVX2_UnpckXFrac ymm_tmp0, ymm_tmp1, ymm_xpos_frac, ymm_7fff |
| 3920 | + mov r_tmp0, i_xpos |
| 3921 | + shr r_tmp0, 16 |
| 3922 | + vmovdqu xmm_tmp4, [p_src_row0 + r_tmp0] |
| 3923 | + vmovdqu xmm_tmp2, [p_src_row1 + r_tmp0] |
| 3924 | + lea r_tmp0, [i_xpos + 4 * i_scalex2] |
| 3925 | + shr r_tmp0, 16 |
| 3926 | + vinserti128 ymm_tmp4, ymm_tmp4, [p_src_row0 + r_tmp0], 1 |
| 3927 | + vinserti128 ymm_tmp2, ymm_tmp2, [p_src_row1 + r_tmp0], 1 |
| 3928 | + lea r_tmp0, [i_xpos + 2 * i_scalex2] |
| 3929 | + lea i_xpos, [r_tmp0 + 4 * i_scalex2] |
| 3930 | + shr r_tmp0, 16 |
| 3931 | + vpunpcklbw ymm_tmp3, ymm_xpos_int, [db80h_256] |
| 3932 | + vpshufb ymm_tmp4, ymm_tmp4, ymm_tmp3 |
| 3933 | + vpshufb ymm_tmp2, ymm_tmp2, ymm_tmp3 |
| 3934 | + vpmaddwd ymm_tmp4, ymm_tmp4, ymm_tmp0 |
| 3935 | + vpmaddwd ymm_tmp2, ymm_tmp2, ymm_tmp0 |
| 3936 | + AVX2_LinearAccurateInterpolateVerticalDwords ymm_tmp0, ymm_tmp4, ymm_tmp2, ymm_yfrac0, ymm_yfrac1, ymm_tmp3 |
| 3937 | + vmovdqu xmm_tmp4, [p_src_row0 + r_tmp0] |
| 3938 | + vmovdqu xmm_tmp2, [p_src_row1 + r_tmp0] |
| 3939 | + mov r_tmp0, i_xpos |
| 3940 | + lea i_xpos, [i_xpos + 2 * i_scalex2] |
| 3941 | + shr r_tmp0, 16 |
| 3942 | + vinserti128 ymm_tmp4, ymm_tmp4, [p_src_row0 + r_tmp0], 1 |
| 3943 | + vinserti128 ymm_tmp2, ymm_tmp2, [p_src_row1 + r_tmp0], 1 |
| 3944 | + vpunpckhbw ymm_tmp3, ymm_xpos_int, [db80h_256] |
| 3945 | + vpshufb ymm_tmp4, ymm_tmp4, ymm_tmp3 |
| 3946 | + vpshufb ymm_tmp2, ymm_tmp2, ymm_tmp3 |
| 3947 | + vpmaddwd ymm_tmp4, ymm_tmp4, ymm_tmp1 |
| 3948 | + vpmaddwd ymm_tmp2, ymm_tmp2, ymm_tmp1 |
| 3949 | + AVX2_LinearAccurateInterpolateVerticalDwords ymm_tmp1, ymm_tmp4, ymm_tmp2, ymm_yfrac0, ymm_yfrac1, ymm_tmp3 |
| 3950 | + vpackssdw ymm_tmp0, ymm_tmp0, ymm_tmp1 |
| 3951 | + vpavgw ymm_tmp0, ymm_tmp0, ymm_0 |
| 3952 | + vpackuswb ymm_tmp0, ymm_tmp0, ymm_tmp0 |
| 3953 | + vmovlps [p_dst], xmm_tmp0 |
| 3954 | + vextracti128 [p_dst + 8], ymm_tmp0, 1 |
| 3955 | + add p_dst, 16 |
| 3956 | + AVX2_BilinearIncXposw ymm_xpos_int, ymm_xpos_frac, ymm_xpos_int_inc, ymm_xpos_frac_inc, ymm_7fff, ymm_tmp0, ymm_tmp1 |
| 3957 | +%endmacro |
| 3958 | + |
| 3959 | +%macro AVX2_BilinearAccurateDownsample8xOrLess_16px 0 |
| 3960 | + vbroadcasti128 ymm_tmp0, [shufb_000044448888CCCC] |
| 3961 | + vpshufb ymm_tmp0, ymm_xpos_int, ymm_tmp0 |
| 3962 | + vpsubb ymm_xpos_int, ymm_xpos_int, ymm_tmp0 |
| 3963 | + mov r_tmp0, i_xpos |
| 3964 | + shr r_tmp0, 16 |
| 3965 | + vmovdqu xmm_tmp4, [p_src_row0 + r_tmp0] |
| 3966 | + vmovdqu xmm_tmp5, [p_src_row1 + r_tmp0] |
| 3967 | + lea r_tmp0, [i_xpos + 4 * i_scalex2] |
| 3968 | + add i_xpos, i_scalex2 |
| 3969 | + shr r_tmp0, 16 |
| 3970 | + vinserti128 ymm_tmp4, ymm_tmp4, [p_src_row0 + r_tmp0], 1 |
| 3971 | + vinserti128 ymm_tmp5, ymm_tmp5, [p_src_row1 + r_tmp0], 1 |
| 3972 | + mov r_tmp0, i_xpos |
| 3973 | + shr r_tmp0, 16 |
| 3974 | + vmovdqu xmm_tmp0, [p_src_row0 + r_tmp0] |
| 3975 | + vmovdqu xmm_tmp1, [p_src_row1 + r_tmp0] |
| 3976 | + lea r_tmp0, [i_xpos + 4 * i_scalex2] |
| 3977 | + add i_xpos, i_scalex2 |
| 3978 | + shr r_tmp0, 16 |
| 3979 | + vinserti128 ymm_tmp0, ymm_tmp0, [p_src_row0 + r_tmp0], 1 |
| 3980 | + vinserti128 ymm_tmp1, ymm_tmp1, [p_src_row1 + r_tmp0], 1 |
| 3981 | + vpunpcklbw ymm_tmp3, ymm_xpos_int, [db80h_256] |
| 3982 | + vpshufb ymm_tmp4, ymm_tmp4, ymm_tmp3 |
| 3983 | + vpshufb ymm_tmp5, ymm_tmp5, ymm_tmp3 |
| 3984 | + vpshufb ymm_tmp0, ymm_tmp0, ymm_tmp3 |
| 3985 | + vpshufb ymm_tmp1, ymm_tmp1, ymm_tmp3 |
| 3986 | + vpblendd ymm_tmp4, ymm_tmp4, ymm_tmp0, 11001100b |
| 3987 | + vpblendd ymm_tmp5, ymm_tmp5, ymm_tmp1, 11001100b |
| 3988 | + AVX2_UnpckXFrac ymm_tmp0, ymm_tmp1, ymm_xpos_frac, ymm_7fff |
| 3989 | + vpmaddwd ymm_tmp4, ymm_tmp4, ymm_tmp0 |
| 3990 | + vpmaddwd ymm_tmp5, ymm_tmp5, ymm_tmp0 |
| 3991 | + AVX2_LinearAccurateInterpolateVerticalDwords ymm_tmp0, ymm_tmp4, ymm_tmp5, ymm_yfrac0, ymm_yfrac1, ymm_tmp3 |
| 3992 | + mov r_tmp0, i_xpos |
| 3993 | + shr r_tmp0, 16 |
| 3994 | + vmovdqu xmm_tmp4, [p_src_row0 + r_tmp0] |
| 3995 | + vmovdqu xmm_tmp5, [p_src_row1 + r_tmp0] |
| 3996 | + lea r_tmp0, [i_xpos + 4 * i_scalex2] |
| 3997 | + add i_xpos, i_scalex2 |
| 3998 | + shr r_tmp0, 16 |
| 3999 | + vinserti128 ymm_tmp4, ymm_tmp4, [p_src_row0 + r_tmp0], 1 |
| 4000 | + vinserti128 ymm_tmp5, ymm_tmp5, [p_src_row1 + r_tmp0], 1 |
| 4001 | + mov r_tmp0, i_xpos |
| 4002 | + lea i_xpos, [i_xpos + 4 * i_scalex2] |
| 4003 | + shr r_tmp0, 16 |
| 4004 | + vmovdqu xmm_tmp2, [p_src_row0 + r_tmp0] |
| 4005 | + vmovdqu xmm_tmp3, [p_src_row1 + r_tmp0] |
| 4006 | + mov r_tmp0, i_xpos |
| 4007 | + add i_xpos, i_scalex2 |
| 4008 | + shr r_tmp0, 16 |
| 4009 | + vinserti128 ymm_tmp2, ymm_tmp2, [p_src_row0 + r_tmp0], 1 |
| 4010 | + vinserti128 ymm_tmp3, ymm_tmp3, [p_src_row1 + r_tmp0], 1 |
| 4011 | + vpshufb ymm_tmp4, ymm_tmp4, ymm_xpos_int |
| 4012 | + vpshufb ymm_tmp5, ymm_tmp5, ymm_xpos_int |
| 4013 | + vpshufb ymm_tmp2, ymm_tmp2, ymm_xpos_int |
| 4014 | + vpshufb ymm_tmp3, ymm_tmp3, ymm_xpos_int |
| 4015 | + vpblendd ymm_tmp4, ymm_tmp4, ymm_tmp2, 10001000b |
| 4016 | + vpblendd ymm_tmp5, ymm_tmp5, ymm_tmp3, 10001000b |
| 4017 | + vpunpckhbw ymm_tmp4, ymm_tmp4, ymm_0 |
| 4018 | + vpunpckhbw ymm_tmp5, ymm_tmp5, ymm_0 |
| 4019 | + vpmaddwd ymm_tmp4, ymm_tmp4, ymm_tmp1 |
| 4020 | + vpmaddwd ymm_tmp5, ymm_tmp5, ymm_tmp1 |
| 4021 | + AVX2_LinearAccurateInterpolateVerticalDwords ymm_tmp1, ymm_tmp4, ymm_tmp5, ymm_yfrac0, ymm_yfrac1, ymm_tmp3 |
| 4022 | + vpackssdw ymm_tmp0, ymm_tmp0, ymm_tmp1 |
| 4023 | + vpavgw ymm_tmp0, ymm_tmp0, ymm_0 |
| 4024 | + vpackuswb ymm_tmp0, ymm_tmp0, ymm_tmp0 |
| 4025 | + vmovlps [p_dst], xmm_tmp0 |
| 4026 | + vextracti128 [p_dst + 8], ymm_tmp0, 1 |
| 4027 | + add p_dst, 16 |
| 4028 | + AVX2_BilinearIncXposw ymm_xpos_int, ymm_xpos_frac, ymm_xpos_int_inc, ymm_xpos_frac_inc, ymm_7fff, ymm_tmp0, ymm_tmp1 |
| 4029 | +%endmacro |
| 4030 | + |
| 4031 | +%macro AVX2_GeneralBilinearAccurateDownsample_16px 0 |
| 4032 | + mov r_tmp0, i_xpos |
| 4033 | + shr r_tmp0, 16 |
| 4034 | + vpbroadcastd ymm_tmp4, [p_src_row0 + r_tmp0] |
| 4035 | + vpbroadcastd ymm_tmp5, [p_src_row1 + r_tmp0] |
| 4036 | + lea r_tmp0, [i_xpos + 1 * i_scalex] |
| 4037 | + shr r_tmp0, 16 |
| 4038 | + vpbroadcastd ymm_tmp0, [p_src_row0 + r_tmp0] |
| 4039 | + vpunpcklwd ymm_tmp4, ymm_tmp4, ymm_tmp0 |
| 4040 | + vpbroadcastd ymm_tmp0, [p_src_row1 + r_tmp0] |
| 4041 | + vpunpcklwd ymm_tmp5, ymm_tmp5, ymm_tmp0 |
| 4042 | + lea r_tmp0, [i_xpos + 2 * i_scalex] |
| 4043 | + lea i_xpos, [i_xpos + 4 * i_scalex] |
| 4044 | + shr r_tmp0, 16 |
| 4045 | + vpbroadcastd ymm_tmp0, [p_src_row0 + r_tmp0] |
| 4046 | + vpblendd ymm_tmp4, ymm_tmp4, ymm_tmp0, 00100010b |
| 4047 | + vpbroadcastd ymm_tmp0, [p_src_row1 + r_tmp0] |
| 4048 | + vpblendd ymm_tmp5, ymm_tmp5, ymm_tmp0, 00100010b |
| 4049 | + mov r_tmp0, i_xpos |
| 4050 | + sub r_tmp0, i_scalex |
| 4051 | + shr r_tmp0, 16 |
| 4052 | + vpbroadcastd ymm_tmp0, [p_src_row0 + r_tmp0 - 2] |
| 4053 | + vpblendw ymm_tmp4, ymm_tmp4, ymm_tmp0, 1000b |
| 4054 | + vpbroadcastd ymm_tmp0, [p_src_row1 + r_tmp0 - 2] |
| 4055 | + vpblendw ymm_tmp5, ymm_tmp5, ymm_tmp0, 1000b |
| 4056 | + mov r_tmp0, i_xpos |
| 4057 | + shr r_tmp0, 16 |
| 4058 | + vpbroadcastd ymm_tmp2, [p_src_row0 + r_tmp0] |
| 4059 | + vpbroadcastd ymm_tmp3, [p_src_row1 + r_tmp0] |
| 4060 | + lea r_tmp0, [i_xpos + 1 * i_scalex] |
| 4061 | + shr r_tmp0, 16 |
| 4062 | + vpbroadcastd ymm_tmp0, [p_src_row0 + r_tmp0] |
| 4063 | + vpunpcklwd ymm_tmp2, ymm_tmp2, ymm_tmp0 |
| 4064 | + vpbroadcastd ymm_tmp0, [p_src_row1 + r_tmp0] |
| 4065 | + vpunpcklwd ymm_tmp3, ymm_tmp3, ymm_tmp0 |
| 4066 | + lea r_tmp0, [i_xpos + 2 * i_scalex] |
| 4067 | + lea i_xpos, [i_xpos + 4 * i_scalex] |
| 4068 | + shr r_tmp0, 16 |
| 4069 | + vpbroadcastd ymm_tmp0, [p_src_row0 + r_tmp0] |
| 4070 | + vpblendd ymm_tmp2, ymm_tmp2, ymm_tmp0, 00100010b |
| 4071 | + vpbroadcastd ymm_tmp0, [p_src_row1 + r_tmp0] |
| 4072 | + vpblendd ymm_tmp3, ymm_tmp3, ymm_tmp0, 00100010b |
| 4073 | + mov r_tmp0, i_xpos |
| 4074 | + sub r_tmp0, i_scalex |
| 4075 | + shr r_tmp0, 16 |
| 4076 | + vpbroadcastd ymm_tmp0, [p_src_row0 + r_tmp0 - 2] |
| 4077 | + vpblendw ymm_tmp2, ymm_tmp2, ymm_tmp0, 1000b |
| 4078 | + vpbroadcastd ymm_tmp0, [p_src_row1 + r_tmp0 - 2] |
| 4079 | + vpblendw ymm_tmp3, ymm_tmp3, ymm_tmp0, 1000b |
| 4080 | + mov r_tmp0, i_xpos |
| 4081 | + shr r_tmp0, 16 |
| 4082 | + vmovd xmm_tmp0, [p_src_row0 + r_tmp0] |
| 4083 | + vmovd xmm_tmp1, [p_src_row1 + r_tmp0] |
| 4084 | + lea r_tmp0, [i_xpos + i_scalex] |
| 4085 | + shr r_tmp0, 16 |
| 4086 | + vpinsrw xmm_tmp0, [p_src_row0 + r_tmp0], 1 |
| 4087 | + vpinsrw xmm_tmp1, [p_src_row1 + r_tmp0], 1 |
| 4088 | + lea r_tmp0, [i_xpos + 2 * i_scalex] |
| 4089 | + lea i_xpos, [i_xpos + 4 * i_scalex] |
| 4090 | + shr r_tmp0, 16 |
| 4091 | + vpinsrw xmm_tmp0, [p_src_row0 + r_tmp0], 2 |
| 4092 | + vpinsrw xmm_tmp1, [p_src_row1 + r_tmp0], 2 |
| 4093 | + mov r_tmp0, i_xpos |
| 4094 | + sub r_tmp0, i_scalex |
| 4095 | + shr r_tmp0, 16 |
| 4096 | + vpinsrw xmm_tmp0, [p_src_row0 + r_tmp0], 3 |
| 4097 | + vpinsrw xmm_tmp1, [p_src_row1 + r_tmp0], 3 |
| 4098 | + vpblendd ymm_tmp4, ymm_tmp4, ymm_tmp0, 00001111b |
| 4099 | + vpblendd ymm_tmp5, ymm_tmp5, ymm_tmp1, 00001111b |
| 4100 | + mov r_tmp0, i_xpos |
| 4101 | + shr r_tmp0, 16 |
| 4102 | + vmovd xmm_tmp0, [p_src_row0 + r_tmp0] |
| 4103 | + vmovd xmm_tmp1, [p_src_row1 + r_tmp0] |
| 4104 | + lea r_tmp0, [i_xpos + i_scalex] |
| 4105 | + shr r_tmp0, 16 |
| 4106 | + vpinsrw xmm_tmp0, [p_src_row0 + r_tmp0], 1 |
| 4107 | + vpinsrw xmm_tmp1, [p_src_row1 + r_tmp0], 1 |
| 4108 | + lea r_tmp0, [i_xpos + 2 * i_scalex] |
| 4109 | + lea i_xpos, [i_xpos + 4 * i_scalex] |
| 4110 | + shr r_tmp0, 16 |
| 4111 | + vpinsrw xmm_tmp0, [p_src_row0 + r_tmp0], 2 |
| 4112 | + vpinsrw xmm_tmp1, [p_src_row1 + r_tmp0], 2 |
| 4113 | + mov r_tmp0, i_xpos |
| 4114 | + sub r_tmp0, i_scalex |
| 4115 | + shr r_tmp0, 16 |
| 4116 | + vpinsrw xmm_tmp0, [p_src_row0 + r_tmp0], 3 |
| 4117 | + vpinsrw xmm_tmp1, [p_src_row1 + r_tmp0], 3 |
| 4118 | + vpblendd ymm_tmp2, ymm_tmp2, ymm_tmp0, 00001111b |
| 4119 | + vpblendd ymm_tmp3, ymm_tmp3, ymm_tmp1, 00001111b |
| 4120 | + vpunpcklbw ymm_tmp4, ymm_tmp4, ymm_0 |
| 4121 | + vpunpcklbw ymm_tmp5, ymm_tmp5, ymm_0 |
| 4122 | + vpmaddwd ymm_tmp4, ymm_tmp4, ymm_xfrac0 |
| 4123 | + vpmaddwd ymm_tmp5, ymm_tmp5, ymm_xfrac0 |
| 4124 | + AVX2_LinearAccurateInterpolateVerticalDwords ymm_tmp0, ymm_tmp4, ymm_tmp5, ymm_yfrac0, ymm_yfrac1, ymm_tmp1 |
| 4125 | + vpunpcklbw ymm_tmp4, ymm_tmp2, ymm_0 |
| 4126 | + vpunpcklbw ymm_tmp5, ymm_tmp3, ymm_0 |
| 4127 | + vpmaddwd ymm_tmp4, ymm_tmp4, ymm_xfrac1 |
| 4128 | + vpmaddwd ymm_tmp5, ymm_tmp5, ymm_xfrac1 |
| 4129 | + AVX2_LinearAccurateInterpolateVerticalDwords ymm_tmp1, ymm_tmp4, ymm_tmp5, ymm_yfrac0, ymm_yfrac1, ymm_tmp2 |
| 4130 | + vpackssdw ymm_tmp0, ymm_tmp0, ymm_tmp1 |
| 4131 | + vpavgw ymm_tmp0, ymm_tmp0, ymm_0 |
| 4132 | + vpackuswb ymm_tmp0, ymm_tmp0, ymm_tmp0 |
| 4133 | + vextracti128 [p_dst], ymm_tmp0, 1 |
| 4134 | + vmovlps [p_dst + 8], xmm_tmp0 |
| 4135 | + add p_dst, 16 |
| 4136 | + vpaddw ymm_xfrac0, ymm_xfrac0, ymm_xfrac_inc |
| 4137 | + vpaddw ymm_xfrac1, ymm_xfrac1, ymm_xfrac_inc |
| 4138 | + vpand ymm_xfrac0, ymm_xfrac0, ymm_7fff |
| 4139 | + vpand ymm_xfrac1, ymm_xfrac1, ymm_7fff |
| 4140 | +%endmacro |
| 4141 | + |
| 3857 | 4142 | ; downsample_16px_macro=%1 b_fast=%2 |
| 3858 | 4143 | %macro AVX2_GeneralBilinearDownsampler_loop 2 |
| 3859 | 4144 | %%height: |
| @@ -4254,3 +4539,326 @@ WELS_EXTERN GeneralBilinearFastDownsampler_avx2 · 394 unmodified lines |
| 4254 | 4539 | %undef ymm_xfrac0_begin |
| 4255 | 4540 | %undef ymm_xfrac1_begin |
| 4256 | 4541 | %undef ymm_xfrac_inc |
| 4542 | + |
| 4543 | +;************************************************************************************************************** |
| 4544 | +;void GeneralBilinearAccurateDownsampler_avx2 (uint8_t* pDst, int32_t iDstStride, int32_t iDstWidth, |
| 4545 | +; int32_t iDstHeight, uint8_t* pSrc, int32_t iSrcStride, uint32_t uiScaleX, |
| 4546 | +; uint32_t uiScaleY); |
| 4547 | +; |
| 4548 | +;************************************************************************************************************** |
| 4549 | + |
| 4550 | +WELS_EXTERN GeneralBilinearAccurateDownsampler_avx2 |
| 4551 | + %assign push_num 0 |
| 4552 | +%ifndef X86_32 |
| 4553 | + push r12 |
| 4554 | + push r13 |
| 4555 | + push rbx |
| 4556 | + push rbp |
| 4557 | + %assign push_num 4 |
| 4558 | +%ifdef WIN64 |
| 4559 | + push rdi |
| 4560 | + push rsi |
| 4561 | + %assign push_num push_num + 2 |
| 4562 | +%endif |
| 4563 | +%endif |
| 4564 | + LOAD_7_PARA |
| 4565 | + PUSH_XMM 16 |
| 4566 | + SIGN_EXTENSION r1, r1d |
| 4567 | + SIGN_EXTENSION r2, r2d |
| 4568 | + SIGN_EXTENSION r3, r3d |
| 4569 | + SIGN_EXTENSION r5, r5d |
| 4570 | + ZERO_EXTENSION r6d |
| 4571 | + sub r1, r2 ; dst_stride - dst_width |
| 4572 | + add r6, r6 ; 2 * scalex |
| 4573 | +%ifdef X86_32 |
| 4574 | + vmovd xmm0, arg8 |
| 4575 | + vmovd xmm1, esp |
| 4576 | + and esp, -32 |
| 4577 | + sub esp, 8 * 4 + 8 * 32 |
| 4578 | + vmovd [esp], xmm1 |
| 4579 | + %define p_dst r0 |
| 4580 | + %define i_dst_stride_less_width [esp + 1 * 4] |
| 4581 | + %define i_dst_width [esp + 2 * 4] |
| 4582 | + %define i_dst_height dword [esp + 3 * 4] |
| 4583 | + %define p_src [esp + 4 * 4] |
| 4584 | + %define i_src_stride [esp + 5 * 4] |
| 4585 | + %define i_scalex r6 |
| 4586 | + %define i_scalexd r6d |
| 4587 | + %define i_scaleyd [esp + 6 * 4] |
| 4588 | + %define i_xpos r2 |
| 4589 | + %define i_ypos [esp + 7 * 4] |
| 4590 | + %define i_yposd dword [esp + 7 * 4] |
| 4591 | + %define p_src_row0 r3 |
| 4592 | + %define p_src_row1 r4 |
| 4593 | + %define i_width_cnt r5 |
| 4594 | + %define r_tmp0 r1 |
| 4595 | + %define r_tmp0b r1b |
| 4596 | + %define ymm_xpos_frac ymm1 |
| 4597 | + %define ymm_xpos_frac_inc [esp + 8 * 4] |
| 4598 | + %define ymm_xpos_int ymm3 |
| 4599 | + %define ymm_xpos_int_inc [esp + 8 * 4 + 1 * 32] |
| 4600 | + %define ymm_yfrac0 [esp + 8 * 4 + 2 * 32] |
| 4601 | + %define ymm_yfrac1 [esp + 8 * 4 + 3 * 32] |
| 4602 | + %define xmm_tmp0 xmm7 |
| 4603 | + %define ymm_tmp0 ymm7 |
| 4604 | + %define xmm_tmp1 xmm0 |
| 4605 | + %define ymm_tmp1 ymm0 |
| 4606 | + %define xmm_tmp2 xmm2 |
| 4607 | + %define ymm_tmp2 ymm2 |
| 4608 | + %define xmm_tmp3 xmm4 |
| 4609 | + %define ymm_tmp3 ymm4 |
| 4610 | + %define xmm_tmp4 xmm5 |
| 4611 | + %define ymm_tmp4 ymm5 |
| 4612 | + %define xmm_tmp5 xmm6 |
| 4613 | + %define ymm_tmp5 ymm6 |
| 4614 | + %define ymm_0 [esp + 8 * 4 + 4 * 32] |
| 4615 | + %define ymm_7fff [esp + 8 * 4 + 5 * 32] |
| 4616 | + %define ymm_xpos_int_begin [esp + 8 * 4 + 6 * 32] |
| 4617 | + %define ymm_xpos_frac_begin [esp + 8 * 4 + 7 * 32] |
| 4618 | + mov i_dst_stride_less_width, r1 |
| 4619 | + mov i_dst_width, r2 |
| 4620 | + mov i_dst_height, r3 |
| 4621 | + mov p_src, r4 |
| 4622 | + mov i_src_stride, r5 |
| 4623 | + vmovd i_scaleyd, xmm0 |
| 4624 | + vpxor xmm0, xmm0, xmm0 |
| 4625 | + vmovdqa ymm_0, ymm0 |
| 4626 | + vpcmpeqw ymm0, ymm0, ymm0 |
| 4627 | + vpsrlw ymm0, ymm0, 1 |
| 4628 | + vmovdqa ymm_7fff, ymm0 |
| 4629 | +%else |
| 4630 | + %define p_dst r0 |
| 4631 | + %define i_dst_stride_less_width r1 |
| 4632 | + %define i_dst_width r2 |
| 4633 | + %define i_dst_height r3 |
| 4634 | + %define p_src r4 |
| 4635 | + %define i_src_stride r5 |
| 4636 | + %define i_scalex r6 |
| 4637 | + %define i_scalexd r6d |
| 4638 | + %define i_scaleyd dword arg8d |
| 4639 | + %define i_xpos r12 |
| 4640 | + %define i_ypos r13 |
| 4641 | + %define i_yposd r13d |
| 4642 | + %define p_src_row0 rbp |
| 4643 | +%ifdef WIN64 |
| 4644 | + %define p_src_row1 rsi |
| 4645 | + %define i_width_cnt rdi |
| 4646 | +%else |
| 4647 | + %define p_src_row1 r11 |
| 4648 | + %define i_width_cnt rax |
| 4649 | +%endif |
| 4650 | + %define r_tmp0 rbx |
| 4651 | + %define r_tmp0b bl |
| 4652 | + %define ymm_0 ymm0 |
| 4653 | + %define ymm_xpos_frac ymm1 |
| 4654 | + %define ymm_xpos_int ymm3 |
| 4655 | + %define ymm_xpos_frac_inc ymm2 |
| 4656 | + %define ymm_xpos_int_inc ymm4 |
| 4657 | + %define ymm_yfrac0 ymm5 |
| 4658 | + %define ymm_yfrac1 ymm6 |
| 4659 | + %define xmm_tmp0 xmm7 |
| 4660 | + %define ymm_tmp0 ymm7 |
| 4661 | + %define xmm_tmp1 xmm8 |
| 4662 | + %define ymm_tmp1 ymm8 |
| 4663 | + %define xmm_tmp2 xmm9 |
| 4664 | + %define ymm_tmp2 ymm9 |
| 4665 | + %define xmm_tmp3 xmm10 |
| 4666 | + %define ymm_tmp3 ymm10 |
| 4667 | + %define xmm_tmp4 xmm11 |
| 4668 | + %define ymm_tmp4 ymm11 |
| 4669 | + %define xmm_tmp5 xmm12 |
| 4670 | + %define ymm_tmp5 ymm12 |
| 4671 | + %define ymm_7fff ymm13 |
| 4672 | + %define ymm_xpos_int_begin ymm14 |
| 4673 | + %define ymm_xpos_frac_begin ymm15 |
| 4674 | + vpxor ymm_0, ymm_0, ymm_0 |
| 4675 | + vpcmpeqw ymm_7fff, ymm_7fff, ymm_7fff |
| 4676 | + vpsrlw ymm_7fff, ymm_7fff, 1 |
| 4677 | +%endif |
| 4678 | + |
| 4679 | + sub i_dst_height, 1 |
| 4680 | + je .final_row |
| 4681 | + jl .done |
| 4682 | + |
| 4683 | + mov i_yposd, 1 << 14 |
| 4684 | + vmovd xmm_tmp0, i_scalexd |
| 4685 | + vpbroadcastd ymm_tmp0, xmm_tmp0 |
| 4686 | + vpslld ymm_tmp1, ymm_tmp0, 2 |
| 4687 | + vpslld ymm_tmp2, ymm_tmp0, 3 |
| 4688 | + vpaddd ymm_tmp3, ymm_tmp1, ymm_tmp2 |
| 4689 | + vpxor ymm_tmp4, ymm_tmp4, ymm_tmp4 |
| 4690 | + vpblendd ymm_tmp1, ymm_tmp4, ymm_tmp1, 11110000b |
| 4691 | + vpblendd ymm_tmp2, ymm_tmp2, ymm_tmp3, 11110000b |
| 4692 | + vpaddd ymm_tmp3, ymm_tmp0, ymm_tmp0 |
| 4693 | + vpblendd ymm_tmp3, ymm_tmp4, ymm_tmp3, 11001100b |
| 4694 | + vpblendd ymm_tmp0, ymm_tmp4, ymm_tmp0, 10101010b |
| 4695 | + vpaddd ymm_tmp0, ymm_tmp3, ymm_tmp0 |
| 4696 | + vpaddd ymm_tmp1, ymm_tmp1, ymm_tmp0 |
| 4697 | + vpaddd ymm_tmp2, ymm_tmp2, ymm_tmp0 |
| 4698 | + vpcmpeqw ymm_tmp3, ymm_tmp3, ymm_tmp3 |
| 4699 | + vpsrld ymm_tmp3, ymm_tmp3, 31 |
| 4700 | + vpslld ymm_tmp3, ymm_tmp3, 15 |
| 4701 | + vpaddd ymm_tmp1, ymm_tmp1, ymm_tmp3 |
| 4702 | + vpaddd ymm_tmp2, ymm_tmp2, ymm_tmp3 |
| 4703 | + vpsrld ymm_xpos_int, ymm_tmp1, 16 |
| 4704 | + vpsrld ymm_tmp0, ymm_tmp2, 16 |
| 4705 | + vpackssdw ymm_xpos_int, ymm_xpos_int, ymm_tmp0 |
| 4706 | + vpermq ymm_xpos_int, ymm_xpos_int, 11011000b |
| 4707 | + vpackuswb ymm_xpos_int, ymm_xpos_int, ymm_xpos_int |
| 4708 | + vpcmpeqw ymm_tmp3, ymm_tmp3, ymm_tmp3 |
| 4709 | + vpsubb ymm_tmp0, ymm_xpos_int, ymm_tmp3 |
| 4710 | + vpunpcklbw ymm_xpos_int, ymm_xpos_int, ymm_tmp0 |
| 4711 | + vpslld ymm_tmp1, ymm_tmp1, 16 |
| 4712 | + vpsrld ymm_tmp1, ymm_tmp1, 16 |
| 4713 | + vpslld ymm_tmp2, ymm_tmp2, 16 |
| 4714 | + vpsrld ymm_tmp2, ymm_tmp2, 16 |
| 4715 | + vpackusdw ymm_xpos_frac, ymm_tmp1, ymm_tmp2 |
| 4716 | + vpermq ymm_xpos_frac, ymm_xpos_frac, 11011000b |
| 4717 | + vpsrlw ymm_xpos_frac, ymm_xpos_frac, 1 |
| 4718 | + vmovd xmm_tmp0, i_scalexd |
| 4719 | + vpslld xmm_tmp0, xmm_tmp0, 4 |
| 4720 | + vpbroadcastw ymm_tmp1, xmm_tmp0 |
| 4721 | + vpsrlw ymm_tmp1, ymm_tmp1, 1 |
| 4722 | + vmovdqa ymm_xpos_frac_inc, ymm_tmp1 |
| 4723 | + vpsrld xmm_tmp0, xmm_tmp0, 16 |
| 4724 | + vpsubw ymm_tmp0, ymm_tmp0, ymm_tmp3 |
| 4725 | + vpbroadcastb ymm_tmp0, xmm_tmp0 |
| 4726 | + vmovdqa ymm_xpos_int_inc, ymm_tmp0 |
| 4727 | + vmovdqa ymm_xpos_int_begin, ymm_xpos_int |
| 4728 | + vmovdqa ymm_xpos_frac_begin, ymm_xpos_frac |
| 4729 | + |
| 4730 | + cmp i_scalex, 4 << 16 |
| 4731 | + ja .scalex_above4 |
| 4732 | + cmp i_scalex, 2 << 16 |
| 4733 | + ja .scalex_above2_beloweq4 |
| 4734 | + add i_scalex, i_scalex |
| 4735 | +%xdefine i_scalex2 i_scalex |
| 4736 | +%undef i_scalex |
| 4737 | + AVX2_GeneralBilinearDownsampler_loop AVX2_BilinearAccurateDownsample2xOrLess_16px, 0 |
| 4738 | + shr i_scalex2, 1 |
| 4739 | +%xdefine i_scalex i_scalex2 |
| 4740 | +%undef i_scalex2 |
| 4741 | + jmp .final_row |
| 4742 | +.scalex_above2_beloweq4: |
| 4743 | + add i_scalex, i_scalex |
| 4744 | +%xdefine i_scalex2 i_scalex |
| 4745 | +%undef i_scalex |
| 4746 | + AVX2_GeneralBilinearDownsampler_loop AVX2_BilinearAccurateDownsample4xOrLess_16px, 0 |
| 4747 | + shr i_scalex2, 1 |
| 4748 | +%xdefine i_scalex i_scalex2 |
| 4749 | +%undef i_scalex2 |
| 4750 | + jmp .final_row |
| 4751 | +.scalex_above4: |
| 4752 | + cmp i_scalex, 8 << 16 |
| 4753 | + ja .scalex_above8 |
| 4754 | + add i_scalex, i_scalex |
| 4755 | +%xdefine i_scalex2 i_scalex |
| 4756 | +%undef i_scalex |
| 4757 | + AVX2_GeneralBilinearDownsampler_loop AVX2_BilinearAccurateDownsample8xOrLess_16px, 0 |
| 4758 | + shr i_scalex2, 1 |
| 4759 | +%xdefine i_scalex i_scalex2 |
| 4760 | +%undef i_scalex2 |
| 4761 | + jmp .final_row |
| 4762 | +.scalex_above8: |
| 4763 | +%xdefine ymm_xfrac0 ymm_xpos_frac |
| 4764 | +%xdefine ymm_xfrac1 ymm_xpos_int |
| 4765 | +%xdefine ymm_xfrac0_begin ymm_xpos_int_begin |
| 4766 | +%xdefine ymm_xfrac1_begin ymm_xpos_frac_begin |
| 4767 | +%xdefine ymm_xfrac_inc ymm_xpos_frac_inc |
| 4768 | +%undef ymm_xpos_int |
| 4769 | +%undef ymm_xpos_frac |
| 4770 | +%undef ymm_xpos_int_begin |
| 4771 | +%undef ymm_xpos_frac_begin |
| 4772 | +%undef ymm_xpos_int_inc |
| 4773 | +%undef ymm_xpos_frac_inc |
| 4774 | + AVX2_UnpckXFrac ymm_tmp0, ymm_xfrac1, ymm_xfrac0, ymm_7fff |
| 4775 | + vpermq ymm_xfrac0, ymm_tmp0, 01001110b |
| 4776 | + vpermq ymm_xfrac1, ymm_xfrac1, 01001110b |
| 4777 | + vmovdqa ymm_xfrac0_begin, ymm_xfrac0 |
| 4778 | + vmovdqa ymm_xfrac1_begin, ymm_xfrac1 |
| 4779 | + vpcmpeqw ymm_tmp0, ymm_tmp0, ymm_tmp0 |
| 4780 | + vpmullw ymm_tmp0, ymm_tmp0, ymm_xfrac_inc |
| 4781 | + vpunpcklwd ymm_tmp0, ymm_tmp0, ymm_xfrac_inc |
| 4782 | + vmovdqa ymm_xfrac_inc, ymm_tmp0 |
| 4783 | + AVX2_GeneralBilinearDownsampler_loop AVX2_GeneralBilinearAccurateDownsample_16px, 0 |
| 4784 | + |
| 4785 | +.final_row: |
| 4786 | + mov p_src_row0, i_ypos |
| 4787 | + shr p_src_row0, 15 |
| 4788 | + imul p_src_row0, i_src_stride |
| 4789 | + add p_src_row0, p_src |
| 4790 | + mov i_xpos, 1 << 15 |
| 4791 | + mov i_width_cnt, i_dst_width |
| 4792 | + |
| 4793 | +.final_row_width: |
| 4794 | + mov r_tmp0, i_xpos |
| 4795 | + shr r_tmp0, 16 |
| 4796 | + movzx r_tmp0, byte [p_src_row0 + r_tmp0] |
| 4797 | + mov [p_dst], r_tmp0b |
| 4798 | + add p_dst, 1 |
| 4799 | + add i_xpos, i_scalex |
| 4800 | + sub i_width_cnt, 1 |
| 4801 | + jg .final_row_width |
| 4802 | + |
| 4803 | +.done: |
| 4804 | + vzeroupper |
| 4805 | +%ifdef X86_32 |
| 4806 | + mov esp, [esp] |
| 4807 | +%endif |
| 4808 | + POP_XMM |
| 4809 | + LOAD_7_PARA_POP |
| 4810 | +%ifndef X86_32 |
| 4811 | +%ifdef WIN64 |
| 4812 | + pop rsi |
| 4813 | + pop rdi |
| 4814 | +%endif |
| 4815 | + pop rbp |
| 4816 | + pop rbx |
| 4817 | + pop r13 |
| 4818 | + pop r12 |
| 4819 | +%endif |
| 4820 | + ret |
| 4821 | +%undef p_dst |
| 4822 | +%undef i_dst_stride_less_width |
| 4823 | +%undef i_dst_width |
| 4824 | +%undef i_dst_height |
| 4825 | +%undef p_src |
| 4826 | +%undef i_src_stride |
| 4827 | +%undef i_scalex |
| 4828 | +%undef i_scalexd |
| 4829 | +%undef i_scaleyd |
| 4830 | +%undef i_xpos |
| 4831 | +%undef i_ypos |
| 4832 | +%undef i_yposd |
| 4833 | +%undef p_src_row0 |
| 4834 | +%undef p_src_row1 |
| 4835 | +%undef i_width_cnt |
| 4836 | +%undef r_tmp0 |
| 4837 | +%undef r_tmp0b |
| 4838 | +%undef ymm_xpos_frac |
| 4839 | +%undef ymm_xpos_frac_inc |
| 4840 | +%undef ymm_xpos_int |
| 4841 | +%undef ymm_xpos_int_inc |
| 4842 | +%undef ymm_yfrac0 |
| 4843 | +%undef ymm_yfrac1 |
| 4844 | +%undef xmm_tmp0 |
| 4845 | +%undef ymm_tmp0 |
| 4846 | +%undef xmm_tmp1 |
| 4847 | +%undef ymm_tmp1 |
| 4848 | +%undef xmm_tmp2 |
| 4849 | +%undef ymm_tmp2 |
| 4850 | +%undef xmm_tmp3 |
| 4851 | +%undef ymm_tmp3 |
| 4852 | +%undef xmm_tmp4 |
| 4853 | +%undef ymm_tmp4 |
| 4854 | +%undef xmm_tmp5 |
| 4855 | +%undef ymm_tmp5 |
| 4856 | +%undef ymm_0 |
| 4857 | +%undef ymm_7fff |
| 4858 | +%undef ymm_xpos_int_begin |
| 4859 | +%undef ymm_xpos_frac_begin |
| 4860 | +%undef ymm_xfrac0 |
| 4861 | +%undef ymm_xfrac1 |
| 4862 | +%undef ymm_xfrac0_begin |
| 4863 | +%undef ymm_xfrac1_begin |
| 4864 | +%undef ymm_xfrac_inc |