[x264-devel] x86inc: Make INIT_CPUFLAGS support an arbitrary number of cpuflags

Henrik Gramner git at videolan.org
Tue Aug 26 18:23:14 CEST 2014


x264 | branch: master | Henrik Gramner <henrik at gramner.com> | Tue Aug  5 01:42:55 2014 +0200| [91727d729a4a33a3f21188f838077040740cb353] | committer: Fiona Glaser

x86inc: Make INIT_CPUFLAGS support an arbitrary number of cpuflags

Previously there was a limit of two cpuflags.

> http://git.videolan.org/gitweb.cgi/x264.git/?a=commit;h=91727d729a4a33a3f21188f838077040740cb353
---

 common/x86/x86inc.asm |   41 ++++++++++++++++++++++-------------------
 1 file changed, 22 insertions(+), 19 deletions(-)

diff --git a/common/x86/x86inc.asm b/common/x86/x86inc.asm
index bfbfef1..4903439 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
 



More information about the x264-devel mailing list