History

lavc/x86/videodsp: Drop MMX usage

Remove the MMX versions of these functions and modify the SSE implementations to avoid using MMX registers.

Frank Plowman committed 1 year ago

Commit 1e3dc701 parent 4de67e82 files · +59 −90Browse files

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

Unified · Split

2 files
  1. libavcodec/x86/videodsp.asm +15 −46
  2. libavcodec/x86/videodsp_init.c +44 −44
libavcodec/x86/videodsp.asm+15−46
@@ -123,54 +123,43 @@ hvar_fn · 122 unmodified lines
123; - if (%2 & 8) fills 8 bytes into xmm$next123; - if (%2 & 8) fills 8 bytes into xmm$next
124; - if (%2 & 4) fills 4 bytes into xmm$next124; - if (%2 & 4) fills 4 bytes into xmm$next
125; - if (%2 & 3) fills 1, 2 or 4 bytes in eax125; - if (%2 & 3) fills 1, 2 or 4 bytes in eax
126; on mmx, - fills mm0-7 for consecutive sets of 8 pixels
127; - if (%2 & 4) fills 4 bytes into mm$next
128; - if (%2 & 3) fills 1, 2 or 4 bytes in eax
129; writing data out is in the same way126; writing data out is in the same way
130%macro READ_NUM_BYTES 2127%macro READ_NUM_BYTES 2
131%assign %%off 0 ; offset in source buffer128%assign %%off 0 ; offset in source buffer
132%assign %%mmx_idx 0 ; mmx register index
133%assign %%xmm_idx 0 ; xmm register index129%assign %%xmm_idx 0 ; xmm register index
134 130
135%rep %2/mmsize131%rep %2/mmsize
136%if mmsize == 16
137 movu xmm %+ %%xmm_idx, [srcq+%%off]132 movu xmm %+ %%xmm_idx, [srcq+%%off]
138%assign %%xmm_idx %%xmm_idx+1133%assign %%xmm_idx %%xmm_idx+1
139%else ; mmx
140 movu mm %+ %%mmx_idx, [srcq+%%off]
141%assign %%mmx_idx %%mmx_idx+1
142%endif
143%assign %%off %%off+mmsize134%assign %%off %%off+mmsize
144%endrep ; %2/mmsize135%endrep ; %2/mmsize
145 136
146%if mmsize == 16
147%if (%2-%%off) >= 8137%if (%2-%%off) >= 8
148%if %2 > 16 && (%2-%%off) > 8138%if %2 > 16 && (%2-%%off) > 8
149 movu xmm %+ %%xmm_idx, [srcq+%2-16]139 movu xmm %+ %%xmm_idx, [srcq+%2-16]
150%assign %%xmm_idx %%xmm_idx+1140%assign %%xmm_idx %%xmm_idx+1
151%assign %%off %2141%assign %%off %2
152%else142%else
153 movq mm %+ %%mmx_idx, [srcq+%%off]143 movq xmm %+ %%xmm_idx, [srcq+%%off]
154%assign %%mmx_idx %%mmx_idx+1144%assign %%xmm_idx %%xmm_idx+1
155%assign %%off %%off+8145%assign %%off %%off+8
156%endif146%endif
157%endif ; (%2-%%off) >= 8147%endif ; (%2-%%off) >= 8
158%endif
159 148
160%if (%2-%%off) >= 4149%if (%2-%%off) >= 4
161%if %2 > 8 && (%2-%%off) > 4150%if %2 > 8 && (%2-%%off) > 4
162 movq mm %+ %%mmx_idx, [srcq+%2-8]151 movq xmm %+ %%xmm_idx, [srcq+%2-8]
163%assign %%off %2152%assign %%off %2
164%else153%else
165 movd mm %+ %%mmx_idx, [srcq+%%off]154 movd xmm %+ %%xmm_idx, [srcq+%%off]
166%assign %%off %%off+4155%assign %%off %%off+4
167%endif156%endif
168%assign %%mmx_idx %%mmx_idx+1157%assign %%xmm_idx %%xmm_idx+1
169%endif ; (%2-%%off) >= 4158%endif ; (%2-%%off) >= 4
170 159
171%if (%2-%%off) >= 1160%if (%2-%%off) >= 1
172%if %2 >= 4161%if %2 >= 4
173 movd mm %+ %%mmx_idx, [srcq+%2-4]162 movd xmm %+ %%xmm_idx, [srcq+%2-4]
174%elif (%2-%%off) == 1163%elif (%2-%%off) == 1
175 mov valb, [srcq+%2-1]164 mov valb, [srcq+%2-1]
176%elif (%2-%%off) == 2165%elif (%2-%%off) == 2
@@ -185,48 +174,40 @@ hvar_fn · 8 unmodified lines
185 174
186%macro WRITE_NUM_BYTES 2175%macro WRITE_NUM_BYTES 2
187%assign %%off 0 ; offset in destination buffer176%assign %%off 0 ; offset in destination buffer
188%assign %%mmx_idx 0 ; mmx register index
189%assign %%xmm_idx 0 ; xmm register index177%assign %%xmm_idx 0 ; xmm register index
190 178
191%rep %2/mmsize179%rep %2/mmsize
192%if mmsize == 16
193 movu [dstq+%%off], xmm %+ %%xmm_idx180 movu [dstq+%%off], xmm %+ %%xmm_idx
194%assign %%xmm_idx %%xmm_idx+1181%assign %%xmm_idx %%xmm_idx+1
195%else ; mmx
196 movu [dstq+%%off], mm %+ %%mmx_idx
197%assign %%mmx_idx %%mmx_idx+1
198%endif
199%assign %%off %%off+mmsize182%assign %%off %%off+mmsize
200%endrep ; %2/mmsize183%endrep ; %2/mmsize
201 184
202%if mmsize == 16
203%if (%2-%%off) >= 8185%if (%2-%%off) >= 8
204%if %2 > 16 && (%2-%%off) > 8186%if %2 > 16 && (%2-%%off) > 8
205 movu [dstq+%2-16], xmm %+ %%xmm_idx187 movu [dstq+%2-16], xmm %+ %%xmm_idx
206%assign %%xmm_idx %%xmm_idx+1188%assign %%xmm_idx %%xmm_idx+1
207%assign %%off %2189%assign %%off %2
208%else190%else
209 movq [dstq+%%off], mm %+ %%mmx_idx191 movq [dstq+%%off], xmm %+ %%xmm_idx
210%assign %%mmx_idx %%mmx_idx+1192%assign %%xmm_idx %%xmm_idx+1
211%assign %%off %%off+8193%assign %%off %%off+8
212%endif194%endif
213%endif ; (%2-%%off) >= 8195%endif ; (%2-%%off) >= 8
214%endif
215 196
216%if (%2-%%off) >= 4197%if (%2-%%off) >= 4
217%if %2 > 8 && (%2-%%off) > 4198%if %2 > 8 && (%2-%%off) > 4
218 movq [dstq+%2-8], mm %+ %%mmx_idx199 movq [dstq+%2-8], xmm %+ %%xmm_idx
219%assign %%off %2200%assign %%off %2
220%else201%else
221 movd [dstq+%%off], mm %+ %%mmx_idx202 movd [dstq+%%off], xmm %+ %%xmm_idx
222%assign %%off %%off+4203%assign %%off %%off+4
223%endif204%endif
224%assign %%mmx_idx %%mmx_idx+1205%assign %%xmm_idx %%xmm_idx+1
225%endif ; (%2-%%off) >= 4206%endif ; (%2-%%off) >= 4
226 207
227%if (%2-%%off) >= 1208%if (%2-%%off) >= 1
228%if %2 >= 4209%if %2 >= 4
229 movd [dstq+%2-4], mm %+ %%mmx_idx210 movd [dstq+%2-4], xmm %+ %%xmm_idx
230%elif (%2-%%off) == 1211%elif (%2-%%off) == 1
231 mov [dstq+%2-1], valb212 mov [dstq+%2-1], valb
232%elif (%2-%%off) == 2213%elif (%2-%%off) == 2
@@ -318,11 +299,8 @@ cglobal emu_edge_vfix %+ %%n, 1, 5, 1, dst, src, start_y, end_y, bh · 85 unmodified lines
318%endrep ; 1+%2-%1299%endrep ; 1+%2-%1
319%endmacro ; VERTICAL_EXTEND300%endmacro ; VERTICAL_EXTEND
320 301
321INIT_MMX mmx302INIT_XMM sse2
322VERTICAL_EXTEND 1, 15303VERTICAL_EXTEND 1, 22
323
324INIT_XMM sse
325VERTICAL_EXTEND 16, 22
326 304
327; left/right (horizontal) fast extend functions305; left/right (horizontal) fast extend functions
328; these are essentially identical to the vertical extend ones above,306; these are essentially identical to the vertical extend ones above,
@@ -337,11 +315,7 @@ VERTICAL_EXTEND 16, 22 · 8 unmodified lines
337 imul vald, 0x01010101315 imul vald, 0x01010101
338%if %1 >= 8316%if %1 >= 8
339 movd m0, vald317 movd m0, vald
340%if mmsize == 16
341 pshufd m0, m0, q0000318 pshufd m0, m0, q0000
342%else
343 punpckldq m0, m0
344%endif ; mmsize == 16
345%endif ; %1 > 16319%endif ; %1 > 16
346%endif ; avx2320%endif ; avx2
347%endmacro ; READ_V_PIXEL321%endmacro ; READ_V_PIXEL
@@ -356,7 +330,6 @@ VERTICAL_EXTEND 16, 22 · 8 unmodified lines
356%assign %%off %%off+mmsize330%assign %%off %%off+mmsize
357%endrep ; %1/mmsize331%endrep ; %1/mmsize
358 332
359%if mmsize == 16
360%if %1-%%off >= 8333%if %1-%%off >= 8
361%if %1 > 16 && %1-%%off > 8334%if %1 > 16 && %1-%%off > 8
362 movu [%2+%1-16], m0335 movu [%2+%1-16], m0
@@ -366,7 +339,6 @@ VERTICAL_EXTEND 16, 22 · 3 unmodified lines
366%assign %%off %%off+8339%assign %%off %%off+8
367%endif340%endif
368%endif ; %1-%%off >= 8341%endif ; %1-%%off >= 8
369%endif ; mmsize == 16
370 342
371%if %1-%%off >= 4343%if %1-%%off >= 4
372%if %1 > 8 && %1-%%off > 4344%if %1 > 8 && %1-%%off > 4
@@ -415,11 +387,8 @@ cglobal emu_edge_hfix %+ %%n, 4, 5, 1, dst, dst_stride, start_x, bh, val · 42 unmodified lines
415%endrep ; 1+(%2-%1)/2387%endrep ; 1+(%2-%1)/2
416%endmacro ; H_EXTEND388%endmacro ; H_EXTEND
417 389
418INIT_MMX mmx
419H_EXTEND 2, 14
420
421INIT_XMM sse2390INIT_XMM sse2
422H_EXTEND 16, 22391H_EXTEND 2, 22
423 392
424%if HAVE_AVX2_EXTERNAL393%if HAVE_AVX2_EXTERNAL
425INIT_XMM avx2394INIT_XMM avx2
libavcodec/x86/videodsp_init.c+44−44
@@ -37,37 +37,37 @@ typedef void emu_edge_vvar_func(uint8_t *dst, x86_reg dst_stride, · 36 unmodified lines
37 x86_reg start_y, x86_reg end_y, x86_reg bh,37 x86_reg start_y, x86_reg end_y, x86_reg bh,
38 x86_reg w);38 x86_reg w);
39 39
40extern emu_edge_vfix_func ff_emu_edge_vfix1_mmx;40extern emu_edge_vfix_func ff_emu_edge_vfix1_sse2;
41extern emu_edge_vfix_func ff_emu_edge_vfix2_mmx;41extern emu_edge_vfix_func ff_emu_edge_vfix2_sse2;
42extern emu_edge_vfix_func ff_emu_edge_vfix3_mmx;42extern emu_edge_vfix_func ff_emu_edge_vfix3_sse2;
43extern emu_edge_vfix_func ff_emu_edge_vfix4_mmx;43extern emu_edge_vfix_func ff_emu_edge_vfix4_sse2;
44extern emu_edge_vfix_func ff_emu_edge_vfix5_mmx;44extern emu_edge_vfix_func ff_emu_edge_vfix5_sse2;
45extern emu_edge_vfix_func ff_emu_edge_vfix6_mmx;45extern emu_edge_vfix_func ff_emu_edge_vfix6_sse2;
46extern emu_edge_vfix_func ff_emu_edge_vfix7_mmx;46extern emu_edge_vfix_func ff_emu_edge_vfix7_sse2;
47extern emu_edge_vfix_func ff_emu_edge_vfix8_mmx;47extern emu_edge_vfix_func ff_emu_edge_vfix8_sse2;
48extern emu_edge_vfix_func ff_emu_edge_vfix9_mmx;48extern emu_edge_vfix_func ff_emu_edge_vfix9_sse2;
49extern emu_edge_vfix_func ff_emu_edge_vfix10_mmx;49extern emu_edge_vfix_func ff_emu_edge_vfix10_sse2;
50extern emu_edge_vfix_func ff_emu_edge_vfix11_mmx;50extern emu_edge_vfix_func ff_emu_edge_vfix11_sse2;
51extern emu_edge_vfix_func ff_emu_edge_vfix12_mmx;51extern emu_edge_vfix_func ff_emu_edge_vfix12_sse2;
52extern emu_edge_vfix_func ff_emu_edge_vfix13_mmx;52extern emu_edge_vfix_func ff_emu_edge_vfix13_sse2;
53extern emu_edge_vfix_func ff_emu_edge_vfix14_mmx;53extern emu_edge_vfix_func ff_emu_edge_vfix14_sse2;
54extern emu_edge_vfix_func ff_emu_edge_vfix15_mmx;54extern emu_edge_vfix_func ff_emu_edge_vfix15_sse2;
55extern emu_edge_vfix_func ff_emu_edge_vfix16_sse;55extern emu_edge_vfix_func ff_emu_edge_vfix16_sse2;
56extern emu_edge_vfix_func ff_emu_edge_vfix17_sse;56extern emu_edge_vfix_func ff_emu_edge_vfix17_sse2;
57extern emu_edge_vfix_func ff_emu_edge_vfix18_sse;57extern emu_edge_vfix_func ff_emu_edge_vfix18_sse2;
58extern emu_edge_vfix_func ff_emu_edge_vfix19_sse;58extern emu_edge_vfix_func ff_emu_edge_vfix19_sse2;
59extern emu_edge_vfix_func ff_emu_edge_vfix20_sse;59extern emu_edge_vfix_func ff_emu_edge_vfix20_sse2;
60extern emu_edge_vfix_func ff_emu_edge_vfix21_sse;60extern emu_edge_vfix_func ff_emu_edge_vfix21_sse2;
61extern emu_edge_vfix_func ff_emu_edge_vfix22_sse;61extern emu_edge_vfix_func ff_emu_edge_vfix22_sse2;
62static emu_edge_vfix_func * const vfixtbl_sse[22] = {62static emu_edge_vfix_func * const vfixtbl_sse2[22] = {
63 ff_emu_edge_vfix1_mmx, ff_emu_edge_vfix2_mmx, ff_emu_edge_vfix3_mmx,63 ff_emu_edge_vfix1_sse2, ff_emu_edge_vfix2_sse2, ff_emu_edge_vfix3_sse2,
64 ff_emu_edge_vfix4_mmx, ff_emu_edge_vfix5_mmx, ff_emu_edge_vfix6_mmx,64 ff_emu_edge_vfix4_sse2, ff_emu_edge_vfix5_sse2, ff_emu_edge_vfix6_sse2,
65 ff_emu_edge_vfix7_mmx, ff_emu_edge_vfix8_mmx, ff_emu_edge_vfix9_mmx,65 ff_emu_edge_vfix7_sse2, ff_emu_edge_vfix8_sse2, ff_emu_edge_vfix9_sse2,
66 ff_emu_edge_vfix10_mmx, ff_emu_edge_vfix11_mmx, ff_emu_edge_vfix12_mmx,66 ff_emu_edge_vfix10_sse2, ff_emu_edge_vfix11_sse2, ff_emu_edge_vfix12_sse2,
67 ff_emu_edge_vfix13_mmx, ff_emu_edge_vfix14_mmx, ff_emu_edge_vfix15_mmx,67 ff_emu_edge_vfix13_sse2, ff_emu_edge_vfix14_sse2, ff_emu_edge_vfix15_sse2,
68 ff_emu_edge_vfix16_sse, ff_emu_edge_vfix17_sse, ff_emu_edge_vfix18_sse,68 ff_emu_edge_vfix16_sse2, ff_emu_edge_vfix17_sse2, ff_emu_edge_vfix18_sse2,
69 ff_emu_edge_vfix19_sse, ff_emu_edge_vfix20_sse, ff_emu_edge_vfix21_sse,69 ff_emu_edge_vfix19_sse2, ff_emu_edge_vfix20_sse2, ff_emu_edge_vfix21_sse2,
70 ff_emu_edge_vfix22_sse70 ff_emu_edge_vfix22_sse2
71};71};
72extern emu_edge_vvar_func ff_emu_edge_vvar_sse;72extern emu_edge_vvar_func ff_emu_edge_vvar_sse;
73 73
@@ -76,21 +76,21 @@ typedef void emu_edge_hfix_func(uint8_t *dst, x86_reg dst_stride, · 2 unmodified lines
76typedef void emu_edge_hvar_func(uint8_t *dst, x86_reg dst_stride,76typedef void emu_edge_hvar_func(uint8_t *dst, x86_reg dst_stride,
77 x86_reg start_x, x86_reg n_words, x86_reg bh);77 x86_reg start_x, x86_reg n_words, x86_reg bh);
78 78
79extern emu_edge_hfix_func ff_emu_edge_hfix2_mmx;79extern emu_edge_hfix_func ff_emu_edge_hfix2_sse2;
80extern emu_edge_hfix_func ff_emu_edge_hfix4_mmx;80extern emu_edge_hfix_func ff_emu_edge_hfix4_sse2;
81extern emu_edge_hfix_func ff_emu_edge_hfix6_mmx;81extern emu_edge_hfix_func ff_emu_edge_hfix6_sse2;
82extern emu_edge_hfix_func ff_emu_edge_hfix8_mmx;82extern emu_edge_hfix_func ff_emu_edge_hfix8_sse2;
83extern emu_edge_hfix_func ff_emu_edge_hfix10_mmx;83extern emu_edge_hfix_func ff_emu_edge_hfix10_sse2;
84extern emu_edge_hfix_func ff_emu_edge_hfix12_mmx;84extern emu_edge_hfix_func ff_emu_edge_hfix12_sse2;
85extern emu_edge_hfix_func ff_emu_edge_hfix14_mmx;85extern emu_edge_hfix_func ff_emu_edge_hfix14_sse2;
86extern emu_edge_hfix_func ff_emu_edge_hfix16_sse2;86extern emu_edge_hfix_func ff_emu_edge_hfix16_sse2;
87extern emu_edge_hfix_func ff_emu_edge_hfix18_sse2;87extern emu_edge_hfix_func ff_emu_edge_hfix18_sse2;
88extern emu_edge_hfix_func ff_emu_edge_hfix20_sse2;88extern emu_edge_hfix_func ff_emu_edge_hfix20_sse2;
89extern emu_edge_hfix_func ff_emu_edge_hfix22_sse2;89extern emu_edge_hfix_func ff_emu_edge_hfix22_sse2;
90static emu_edge_hfix_func * const hfixtbl_sse2[11] = {90static emu_edge_hfix_func * const hfixtbl_sse2[11] = {
91 ff_emu_edge_hfix2_mmx, ff_emu_edge_hfix4_mmx, ff_emu_edge_hfix6_mmx,91 ff_emu_edge_hfix2_sse2, ff_emu_edge_hfix4_sse2, ff_emu_edge_hfix6_sse2,
92 ff_emu_edge_hfix8_mmx, ff_emu_edge_hfix10_mmx, ff_emu_edge_hfix12_mmx,92 ff_emu_edge_hfix8_sse2, ff_emu_edge_hfix10_sse2, ff_emu_edge_hfix12_sse2,
93 ff_emu_edge_hfix14_mmx, ff_emu_edge_hfix16_sse2, ff_emu_edge_hfix18_sse2,93 ff_emu_edge_hfix14_sse2, ff_emu_edge_hfix16_sse2, ff_emu_edge_hfix18_sse2,
94 ff_emu_edge_hfix20_sse2, ff_emu_edge_hfix22_sse294 ff_emu_edge_hfix20_sse2, ff_emu_edge_hfix22_sse2
95};95};
96extern emu_edge_hvar_func ff_emu_edge_hvar_sse2;96extern emu_edge_hvar_func ff_emu_edge_hvar_sse2;
@@ -104,7 +104,7 @@ extern emu_edge_hfix_func ff_emu_edge_hfix18_avx2; · 7 unmodified lines
104extern emu_edge_hfix_func ff_emu_edge_hfix20_avx2;104extern emu_edge_hfix_func ff_emu_edge_hfix20_avx2;
105extern emu_edge_hfix_func ff_emu_edge_hfix22_avx2;105extern emu_edge_hfix_func ff_emu_edge_hfix22_avx2;
106static emu_edge_hfix_func * const hfixtbl_avx2[11] = {106static emu_edge_hfix_func * const hfixtbl_avx2[11] = {
107 ff_emu_edge_hfix2_mmx, ff_emu_edge_hfix4_mmx, ff_emu_edge_hfix6_mmx,107 ff_emu_edge_hfix2_sse2, ff_emu_edge_hfix4_sse2, ff_emu_edge_hfix6_sse2,
108 ff_emu_edge_hfix8_avx2, ff_emu_edge_hfix10_avx2, ff_emu_edge_hfix12_avx2,108 ff_emu_edge_hfix8_avx2, ff_emu_edge_hfix10_avx2, ff_emu_edge_hfix12_avx2,
109 ff_emu_edge_hfix14_avx2, ff_emu_edge_hfix16_avx2, ff_emu_edge_hfix18_avx2,109 ff_emu_edge_hfix14_avx2, ff_emu_edge_hfix16_avx2, ff_emu_edge_hfix18_avx2,
110 ff_emu_edge_hfix20_avx2, ff_emu_edge_hfix22_avx2110 ff_emu_edge_hfix20_avx2, ff_emu_edge_hfix22_avx2
@@ -196,7 +196,7 @@ static av_noinline void emulated_edge_mc_sse2(uint8_t *buf, const uint8_t *src, · 85 unmodified lines
196 int h)196 int h)
197{197{
198 emulated_edge_mc(buf, src, buf_stride, src_stride, block_w, block_h,198 emulated_edge_mc(buf, src, buf_stride, src_stride, block_w, block_h,
199 src_x, src_y, w, h, vfixtbl_sse, &ff_emu_edge_vvar_sse,199 src_x, src_y, w, h, vfixtbl_sse2, &ff_emu_edge_vvar_sse,
200 hfixtbl_sse2, &ff_emu_edge_hvar_sse2);200 hfixtbl_sse2, &ff_emu_edge_hvar_sse2);
201}201}
202 202
@@ -209,7 +209,7 @@ static av_noinline void emulated_edge_mc_avx2(uint8_t *buf, const uint8_t *src, · 6 unmodified lines
209 int h)209 int h)
210{210{
211 emulated_edge_mc(buf, src, buf_stride, src_stride, block_w, block_h,211 emulated_edge_mc(buf, src, buf_stride, src_stride, block_w, block_h,
212 src_x, src_y, w, h, vfixtbl_sse, &ff_emu_edge_vvar_sse,212 src_x, src_y, w, h, vfixtbl_sse2, &ff_emu_edge_vvar_sse,
213 hfixtbl_avx2, &ff_emu_edge_hvar_avx2);213 hfixtbl_avx2, &ff_emu_edge_hvar_avx2);
214}214}
215#endif /* HAVE_AVX2_EXTERNAL */215#endif /* HAVE_AVX2_EXTERNAL */

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