History

avcodec/x86/hevc_mc: add qpel_h8_8_avx512icl and qpel_hv8_8_avx512icl

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

Wu Jianhua committed 4 years ago

Commit d4cd8831 parent fe85afb3 files · +144 −0Browse files

Showing the changes to libavcodec (3 of 3 files). Show all

Unified · Split

3 files
  1. libavcodec/x86/hevc_mc.asm +137 −0
  2. libavcodec/x86/hevcdsp.h +3 −0
  3. libavcodec/x86/hevcdsp_init.c +4 −0
libavcodec/x86/hevc_mc.asm+137−0
@@ -87,6 +87,26 @@ QPEL_TABLE 12, 4, w, sse4 · 86 unmodified lines
87QPEL_TABLE 8,16, b, avx287QPEL_TABLE 8,16, b, avx2
88QPEL_TABLE 10, 8, w, avx288QPEL_TABLE 10, 8, w, avx2
89 89
90QPEL_TABLE 8, 1, b, avx512icl_h
91QPEL_TABLE 8, 1, d, avx512icl_v
92
93pb_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
90SECTION .text110SECTION .text
91 111
92%define MAX_PB_SIZE 64112%define MAX_PB_SIZE 64
@@ -1670,3 +1690,120 @@ HEVC_PUT_HEVC_QPEL_HV 16, 10 · 1577 unmodified lines
1670 1690
1671%endif ;AVX21691%endif ;AVX2
1672%endif ; ARCH_X86_641692%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
1731cglobal 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
1742cglobal 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
1804INIT_YMM avx512icl
1805HEVC_PUT_HEVC_QPEL_AVX512ICL 8, 8
1806HEVC_PUT_HEVC_QPEL_HV_AVX512ICL 8, 8
1807
1808%endif
1809%endif
libavcodec/x86/hevcdsp.h+3−0
@@ -233,6 +233,9 @@ WEIGHTING_PROTOTYPES(8, sse4); · 232 unmodified lines
233WEIGHTING_PROTOTYPES(10, sse4);233WEIGHTING_PROTOTYPES(10, sse4);
234WEIGHTING_PROTOTYPES(12, sse4);234WEIGHTING_PROTOTYPES(12, sse4);
235 235
236void 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);
237void 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_ADD240// TRANSFORM_ADD
238///////////////////////////////////////////////////////////////////////////////241///////////////////////////////////////////////////////////////////////////////
libavcodec/x86/hevcdsp_init.c+4−0
@@ -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;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t