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

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
8787 QPEL_TABLE 8,16, b, avx2
8888 QPEL_TABLE 10, 8, w, avx2
8989
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+
90110 SECTION .text
91111
92112 %define MAX_PB_SIZE 64
@@ -1670,3 +1690,120 @@ HEVC_PUT_HEVC_QPEL_HV 16, 10 · 1577 unmodified lines
16701690
16711691 %endif ;AVX2
16721692 %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
libavcodec/x86/hevcdsp.h+3−0
@@ -233,6 +233,9 @@ WEIGHTING_PROTOTYPES(8, sse4); · 232 unmodified lines
233233 WEIGHTING_PROTOTYPES(10, sse4);
234234 WEIGHTING_PROTOTYPES(12, sse4);
235235
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+
236239 ///////////////////////////////////////////////////////////////////////////////
237240 // TRANSFORM_ADD
238241 ///////////////////////////////////////////////////////////////////////////////
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
878878
879879 c->add_residual[3] = ff_hevc_add_residual_32_8_avx2;
880880 }
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+ }
881885 } else if (bit_depth == 10) {
882886 if (EXTERNAL_MMXEXT(cpu_flags)) {
883887 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