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 | QPEL_TABLE 8,16, b, avx2 | 87 | QPEL_TABLE 8,16, b, avx2 |
| 88 | QPEL_TABLE 10, 8, w, avx2 | 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 | SECTION .text | 110 | SECTION .text |
| 91 | 111 | ||
| 92 | %define MAX_PB_SIZE 64 | 112 | %define MAX_PB_SIZE 64 |
| @@ -1670,3 +1690,120 @@ HEVC_PUT_HEVC_QPEL_HV 16, 10 · 1577 unmodified lines | |||
| 1670 | 1690 | ||
| 1671 | %endif ;AVX2 | 1691 | %endif ;AVX2 |
| 1672 | %endif ; ARCH_X86_64 | 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 | WEIGHTING_PROTOTYPES(10, sse4); | 233 | WEIGHTING_PROTOTYPES(10, sse4); |
| 234 | WEIGHTING_PROTOTYPES(12, sse4); | 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 | // TRANSFORM_ADD | 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 | c->add_residual[3] = ff_hevc_add_residual_32_8_avx2; | 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 | } else if (bit_depth == 10) { | 885 | } else if (bit_depth == 10) { |
| 882 | if (EXTERNAL_MMXEXT(cpu_flags)) { | 886 | if (EXTERNAL_MMXEXT(cpu_flags)) { |
| 883 | c->add_residual[0] = ff_hevc_add_residual_4_10_mmxext; | 887 | c->add_residual[0] = ff_hevc_add_residual_4_10_mmxext; |