This commit uses the instruction `vpdpbusd` introduced by AVX512 VNNI to calculate the horizontal filter. ff_hevc_put_hevc_qpel_h8_8_sse4 1039169 ff_hevc_put_hevc_qpel_h8_8_avx512icl 677153 ff_hevc_put_hevc_qpel_hv8_8_sse4 3603511 ff_hevc_put_hevc_qpel_hv8_8_avx512icl 2995354
Showing the changes to libavcodec (3 of 3 files). Show all
Unified · Split
| @@ -87,6 +87,26 @@ QPEL_TABLE 12, 4, w, sse4 · 86 unmodified lines | ||
| 87 | 87 | QPEL_TABLE 8,16, b, avx2 |
| 88 | 88 | QPEL_TABLE 10, 8, w, avx2 |
| 89 | 89 | |
| 90 | +QPEL_TABLE 8, 1, b, avx512icl_h | |
| 91 | +QPEL_TABLE 8, 1, d, avx512icl_v | |
| 92 | + | |
| 93 | +pb_qpel_shuffle_index: db 0, 1, 2, 3 | |
| 94 | + db 1, 2, 3, 4 | |
| 95 | + db 2, 3, 4, 5 | |
| 96 | + db 3, 4, 5, 6 | |
| 97 | + db 4, 5, 6, 7 | |
| 98 | + db 5, 6, 7, 8 | |
| 99 | + db 6, 7, 8, 9 | |
| 100 | + db 7, 8, 9, 10 | |
| 101 | + db 4, 5, 6, 7 | |
| 102 | + db 5, 6, 7, 8 | |
| 103 | + db 6, 7, 8, 9 | |
| 104 | + db 7, 8, 9, 10 | |
| 105 | + db 8, 9, 10, 11 | |
| 106 | + db 9, 10, 11, 12 | |
| 107 | + db 10, 11, 12, 13 | |
| 108 | + db 11, 12, 13, 14 | |
| 109 | + | |
| 90 | 110 | SECTION .text |
| 91 | 111 | |
| 92 | 112 | %define MAX_PB_SIZE 64 |
| @@ -1670,3 +1690,120 @@ HEVC_PUT_HEVC_QPEL_HV 16, 10 · 1577 unmodified lines | ||
| 1670 | 1690 | |
| 1671 | 1691 | %endif ;AVX2 |
| 1672 | 1692 | %endif ; ARCH_X86_64 |
| 1693 | + | |
| 1694 | +%macro QPEL_FILTER_H 5 | |
| 1695 | +%define %%table hevc_qpel_filters_avx512icl_h_%1 | |
| 1696 | +%assign %%offset 4 | |
| 1697 | + dec %2q | |
| 1698 | + shl %2q, 3 | |
| 1699 | +%ifdef PIC | |
| 1700 | + lea %5q, [%%table] | |
| 1701 | + %define FILTER %5q | |
| 1702 | +%else | |
| 1703 | + %define FILTER %%table | |
| 1704 | +%endif | |
| 1705 | + vpbroadcastd m%3, [FILTER + %2q + 0*%%offset] | |
| 1706 | + vpbroadcastd m%4, [FILTER + %2q + 1*%%offset] | |
| 1707 | +%endmacro | |
| 1708 | + | |
| 1709 | +%macro QPEL_FILTER_V 5 | |
| 1710 | + vpbroadcastd m%3, [%5 + %2q + 4*%4] | |
| 1711 | +%endmacro | |
| 1712 | + | |
| 1713 | +%macro QPEL_LOAD_SHUF 2 | |
| 1714 | + movu m%1, [pb_qpel_shuffle_index + 0] | |
| 1715 | + movu m%2, [pb_qpel_shuffle_index + 32] | |
| 1716 | +%endmacro | |
| 1717 | + | |
| 1718 | +; required: m0-m5 | |
| 1719 | +; %1: dst register index | |
| 1720 | +; %2: name for src | |
| 1721 | +%macro QPEL_H_LOAD_COMPUTE 2 | |
| 1722 | + pxor m%1, m%1 | |
| 1723 | + movu xm4, [%2q - 3] | |
| 1724 | + vpermb m5, m2, m4 | |
| 1725 | + vpermb m4, m3, m4 | |
| 1726 | + vpdpbusd m%1, m5, m0 | |
| 1727 | + vpdpbusd m%1, m4, m1 | |
| 1728 | +%endmacro | |
| 1729 | + | |
| 1730 | +%macro HEVC_PUT_HEVC_QPEL_AVX512ICL 2 | |
| 1731 | +cglobal hevc_put_hevc_qpel_h%1_%2, 5, 6, 8, dst, src, srcstride, height, mx, tmp | |
| 1732 | + QPEL_FILTER_H %1, mx, 0, 1, tmp | |
| 1733 | + QPEL_LOAD_SHUF 2, 3 | |
| 1734 | +.loop: | |
| 1735 | + QPEL_H_LOAD_COMPUTE 6, src | |
| 1736 | + vpmovdw [dstq], m6 | |
| 1737 | + LOOP_END dst, src, srcstride | |
| 1738 | + RET | |
| 1739 | +%endmacro | |
| 1740 | + | |
| 1741 | +%macro HEVC_PUT_HEVC_QPEL_HV_AVX512ICL 2 | |
| 1742 | +cglobal hevc_put_hevc_qpel_hv%1_%2, 6, 7, 27, dst, src, srcstride, height, mx, my, tmp | |
| 1743 | +%assign %%shift 6 | |
| 1744 | +%assign %%extra 7 | |
| 1745 | + QPEL_FILTER_H %1, mx, 0, 1, tmp | |
| 1746 | + QPEL_LOAD_SHUF 2, 3 | |
| 1747 | + lea tmpq, [srcstrideq*3] | |
| 1748 | + sub srcq, tmpq | |
| 1749 | + sub myq, 1 | |
| 1750 | + shl myq, 5 | |
| 1751 | +%ifdef PIC | |
| 1752 | +%define %%table hevc_qpel_filters_avx512icl_v_%1 | |
| 1753 | + lea tmpq, [%%table] | |
| 1754 | + %define FILTER tmpq | |
| 1755 | +%else | |
| 1756 | + %define FILTER %%table | |
| 1757 | +%endif | |
| 1758 | +%assign %%i 6 | |
| 1759 | +%assign %%j 0 | |
| 1760 | +%rep %1 | |
| 1761 | + QPEL_FILTER_V %1, my, %%i, %%j, FILTER | |
| 1762 | + %assign %%i %%i+1 | |
| 1763 | + %assign %%j %%j+1 | |
| 1764 | +%endrep | |
| 1765 | +%rep %%extra | |
| 1766 | + QPEL_H_LOAD_COMPUTE %%i, src | |
| 1767 | + add srcq, srcstrideq | |
| 1768 | +%assign %%i %%i+1 | |
| 1769 | +%endrep | |
| 1770 | +.loop: | |
| 1771 | + QPEL_H_LOAD_COMPUTE %%i, src | |
| 1772 | + vpmulld m22, m14, m6 | |
| 1773 | + vpmulld m23, m15, m7 | |
| 1774 | + vpmulld m24, m16, m8 | |
| 1775 | + vpmulld m25, m17, m9 | |
| 1776 | + vpaddd m26, m22, m23 | |
| 1777 | + vpaddd m24, m25 | |
| 1778 | + vpaddd m26, m24 | |
| 1779 | + vpmulld m22, m18, m10 | |
| 1780 | + vpmulld m23, m19, m11 | |
| 1781 | + vpmulld m24, m20, m12 | |
| 1782 | + vpmulld m25, m21, m13 | |
| 1783 | + vpaddd m22, m22, m23 | |
| 1784 | + vpaddd m24, m25 | |
| 1785 | + vpaddd m26, m24 | |
| 1786 | + vpaddd m22, m26 | |
| 1787 | + mova m14, m15 | |
| 1788 | + mova m15, m16 | |
| 1789 | + mova m16, m17 | |
| 1790 | + mova m17, m18 | |
| 1791 | + mova m18, m19 | |
| 1792 | + mova m19, m20 | |
| 1793 | + mova m20, m21 | |
| 1794 | + vpsrad m22, %%shift | |
| 1795 | + vpmovdw [dstq], m22 | |
| 1796 | + LOOP_END dst, src, srcstride | |
| 1797 | + | |
| 1798 | + RET | |
| 1799 | +%endmacro | |
| 1800 | + | |
| 1801 | +%if ARCH_X86_64 | |
| 1802 | +%if HAVE_AVX512ICL_EXTERNAL | |
| 1803 | + | |
| 1804 | +INIT_YMM avx512icl | |
| 1805 | +HEVC_PUT_HEVC_QPEL_AVX512ICL 8, 8 | |
| 1806 | +HEVC_PUT_HEVC_QPEL_HV_AVX512ICL 8, 8 | |
| 1807 | + | |
| 1808 | +%endif | |
| 1809 | +%endif | |
| @@ -233,6 +233,9 @@ WEIGHTING_PROTOTYPES(8, sse4); · 232 unmodified lines | ||
| 233 | 233 | WEIGHTING_PROTOTYPES(10, sse4); |
| 234 | 234 | WEIGHTING_PROTOTYPES(12, sse4); |
| 235 | 235 | |
| 236 | +void ff_hevc_put_hevc_qpel_h8_8_avx512icl(int16_t *dst, uint8_t *_src, ptrdiff_t _srcstride, int height, intptr_t mx, intptr_t my, int width); | |
| 237 | +void ff_hevc_put_hevc_qpel_hv8_8_avx512icl(int16_t *dst, uint8_t *_src, ptrdiff_t _srcstride, int height, intptr_t mx, intptr_t my, int width); | |
| 238 | + | |
| 236 | 239 | /////////////////////////////////////////////////////////////////////////////// |
| 237 | 240 | // TRANSFORM_ADD |
| 238 | 241 | /////////////////////////////////////////////////////////////////////////////// |
| @@ -878,6 +878,10 @@ void ff_hevc_dsp_init_x86(HEVCDSPContext *c, const int bit_depth) · 877 unmodified lines | ||
| 878 | 878 | |
| 879 | 879 | c->add_residual[3] = ff_hevc_add_residual_32_8_avx2; |
| 880 | 880 | } |
| 881 | + if (EXTERNAL_AVX512ICL(cpu_flags) && ARCH_X86_64) { | |
| 882 | + c->put_hevc_qpel[3][0][1] = ff_hevc_put_hevc_qpel_h8_8_avx512icl; | |
| 883 | + c->put_hevc_qpel[3][1][1] = ff_hevc_put_hevc_qpel_hv8_8_avx512icl; | |
| 884 | + } | |
| 881 | 885 | } else if (bit_depth == 10) { |
| 882 | 886 | if (EXTERNAL_MMXEXT(cpu_flags)) { |
| 883 | 887 | c->add_residual[0] = ff_hevc_add_residual_4_10_mmxext; |