From: Henrik Gramner Date: Mon, 4 Aug 2014 23:42:55 +0000 (+0200) Subject: x86inc: Make INIT_CPUFLAGS support an arbitrary number of cpuflags X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=91727d729a4a33a3f21188f838077040740cb353;p=libx264 x86inc: Make INIT_CPUFLAGS support an arbitrary number of cpuflags Previously there was a limit of two cpuflags. --- diff --git a/common/x86/x86inc.asm b/common/x86/x86inc.asm index bfbfef15..49034393 100644 --- a/common/x86/x86inc.asm +++ b/common/x86/x86inc.asm @@ -90,9 +90,6 @@ default rel %endif -; Always use long nops (reduces 0x90 spam in disassembly on x86_32) -CPU amdnop - ; Macros to eliminate most code duplication between x86_32 and x86_64: ; Currently this works only for leaf functions which load all their arguments ; into registers at the start, and make no other use of the stack. Luckily that @@ -756,19 +753,26 @@ SECTION .note.GNU-stack noalloc noexec nowrite progbits %define cpuflag(x) ((cpuflags & (cpuflags_ %+ x)) == (cpuflags_ %+ x)) %define notcpuflag(x) ((cpuflags & (cpuflags_ %+ x)) != (cpuflags_ %+ x)) -; Takes up to 2 cpuflags from the above list. +; Takes an arbitrary number of cpuflags from the above list. ; All subsequent functions (up to the next INIT_CPUFLAGS) is built for the specified cpu. ; You shouldn't need to invoke this macro directly, it's a subroutine for INIT_MMX &co. -%macro INIT_CPUFLAGS 0-2 - CPU amdnop +%macro INIT_CPUFLAGS 0-* + %xdefine SUFFIX + %undef cpuname + %assign cpuflags 0 + %if %0 >= 1 - %xdefine cpuname %1 - %assign cpuflags cpuflags_%1 - %if %0 >= 2 - %xdefine cpuname %1_%2 - %assign cpuflags cpuflags | cpuflags_%2 - %endif + %rep %0 + %ifdef cpuname + %xdefine cpuname cpuname %+ _%1 + %else + %xdefine cpuname %1 + %endif + %assign cpuflags cpuflags | cpuflags_%1 + %rotate 1 + %endrep %xdefine SUFFIX _ %+ cpuname + %if cpuflag(avx) %assign avx_enabled 1 %endif @@ -779,16 +783,15 @@ SECTION .note.GNU-stack noalloc noexec nowrite progbits %endif %if cpuflag(aligned) %define movu mova - %elifidn %1, sse3 + %elif cpuflag(sse3) && notcpuflag(ssse3) %define movu lddqu %endif - %if ARCH_X86_64 == 0 && notcpuflag(sse2) - CPU basicnop - %endif + %endif + + %if ARCH_X86_64 || cpuflag(sse2) + CPU amdnop %else - %xdefine SUFFIX - %undef cpuname - %undef cpuflags + CPU basicnop %endif %endmacro