mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-24 13:56:33 +02:00
x86inc: Speed up assembling with Yasm
Work around Yasm's inefficiency with handling large numbers of variables in the global scope. Signed-off-by: Diego Biurrun <diego@biurrun.de>
This commit is contained in:
parent
50ecf15712
commit
b7d0d10a1d
@ -1050,25 +1050,25 @@ INIT_XMM
|
|||||||
;%5+: operands
|
;%5+: operands
|
||||||
%macro RUN_AVX_INSTR 5-8+
|
%macro RUN_AVX_INSTR 5-8+
|
||||||
%ifnum sizeof%6
|
%ifnum sizeof%6
|
||||||
%assign %%sizeofreg sizeof%6
|
%assign __sizeofreg sizeof%6
|
||||||
%elifnum sizeof%5
|
%elifnum sizeof%5
|
||||||
%assign %%sizeofreg sizeof%5
|
%assign __sizeofreg sizeof%5
|
||||||
%else
|
%else
|
||||||
%assign %%sizeofreg mmsize
|
%assign __sizeofreg mmsize
|
||||||
%endif
|
%endif
|
||||||
%assign %%emulate_avx 0
|
%assign __emulate_avx 0
|
||||||
%if avx_enabled && %%sizeofreg >= 16
|
%if avx_enabled && __sizeofreg >= 16
|
||||||
%xdefine %%instr v%1
|
%xdefine __instr v%1
|
||||||
%else
|
%else
|
||||||
%xdefine %%instr %1
|
%xdefine __instr %1
|
||||||
%if %0 >= 7+%3
|
%if %0 >= 7+%3
|
||||||
%assign %%emulate_avx 1
|
%assign __emulate_avx 1
|
||||||
%endif
|
%endif
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
%if %%emulate_avx
|
%if __emulate_avx
|
||||||
%xdefine %%src1 %6
|
%xdefine __src1 %6
|
||||||
%xdefine %%src2 %7
|
%xdefine __src2 %7
|
||||||
%ifnidn %5, %6
|
%ifnidn %5, %6
|
||||||
%if %0 >= 8
|
%if %0 >= 8
|
||||||
CHECK_AVX_INSTR_EMU {%1 %5, %6, %7, %8}, %5, %7, %8
|
CHECK_AVX_INSTR_EMU {%1 %5, %6, %7, %8}, %5, %7, %8
|
||||||
@ -1080,31 +1080,31 @@ INIT_XMM
|
|||||||
; 3-operand AVX instructions with a memory arg can only have it in src2,
|
; 3-operand AVX instructions with a memory arg can only have it in src2,
|
||||||
; whereas SSE emulation prefers to have it in src1 (i.e. the mov).
|
; whereas SSE emulation prefers to have it in src1 (i.e. the mov).
|
||||||
; So, if the instruction is commutative with a memory arg, swap them.
|
; So, if the instruction is commutative with a memory arg, swap them.
|
||||||
%xdefine %%src1 %7
|
%xdefine __src1 %7
|
||||||
%xdefine %%src2 %6
|
%xdefine __src2 %6
|
||||||
%endif
|
%endif
|
||||||
%endif
|
%endif
|
||||||
%if %%sizeofreg == 8
|
%if __sizeofreg == 8
|
||||||
MOVQ %5, %%src1
|
MOVQ %5, __src1
|
||||||
%elif %2
|
%elif %2
|
||||||
MOVAPS %5, %%src1
|
MOVAPS %5, __src1
|
||||||
%else
|
%else
|
||||||
MOVDQA %5, %%src1
|
MOVDQA %5, __src1
|
||||||
%endif
|
%endif
|
||||||
%endif
|
%endif
|
||||||
%if %0 >= 8
|
%if %0 >= 8
|
||||||
%1 %5, %%src2, %8
|
%1 %5, __src2, %8
|
||||||
%else
|
%else
|
||||||
%1 %5, %%src2
|
%1 %5, __src2
|
||||||
%endif
|
%endif
|
||||||
%elif %0 >= 8
|
%elif %0 >= 8
|
||||||
%%instr %5, %6, %7, %8
|
__instr %5, %6, %7, %8
|
||||||
%elif %0 == 7
|
%elif %0 == 7
|
||||||
%%instr %5, %6, %7
|
__instr %5, %6, %7
|
||||||
%elif %0 == 6
|
%elif %0 == 6
|
||||||
%%instr %5, %6
|
__instr %5, %6
|
||||||
%else
|
%else
|
||||||
%%instr %5
|
__instr %5
|
||||||
%endif
|
%endif
|
||||||
%endmacro
|
%endmacro
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user