]> git.sesse.net Git - x264/blobdiff - common/x86/x86util.asm
x86: Avoid some bypass delays and false dependencies
[x264] / common / x86 / x86util.asm
index 8a5365e0344d5ea4ffe7548d75e07e047f376622..ea8b2cf3e3fbec9ead26e033701b0639b6d8acbd 100644 (file)
@@ -1,7 +1,7 @@
 ;*****************************************************************************
 ;* x86util.asm: x86 utility macros
 ;*****************************************************************************
-;* Copyright (C) 2008-2013 x264 project
+;* Copyright (C) 2008-2015 x264 project
 ;*
 ;* Authors: Holger Lubitz <holger@lubitz.org>
 ;*          Loren Merritt <lorenm@u.washington.edu>
     pminsw %1, %3
 %endmacro
 
+%macro MOVHL 2 ; dst, src
+%ifidn %1, %2
+    punpckhqdq %1, %2
+%elif cpuflag(avx)
+    punpckhqdq %1, %2, %2
+%elif cpuflag(sse4)
+    pshufd     %1, %2, q3232 ; pshufd is slow on some older CPUs, so only use it on more modern ones
+%else
+    movhlps    %1, %2        ; may cause an int/float domain transition and has a dependency on dst
+%endif
+%endmacro
+
 %macro HADDD 2 ; sum junk
 %if sizeof%1 == 32
 %define %2 xmm%2
     paddd   %1, %2
 %endif
 %if mmsize >= 16
-    movhlps %2, %1
+    MOVHL   %2, %1
     paddd   %1, %2
 %endif
+%if cpuflag(xop) && sizeof%1 == 16
+    vphadddq %1, %1
+%else
     PSHUFLW %2, %1, q0032
     paddd   %1, %2
+%endif
 %undef %1
 %undef %2
 %endmacro
 %macro HADDW 2 ; reg, tmp
 %if cpuflag(xop) && sizeof%1 == 16
     vphaddwq  %1, %1
-    movhlps   %2, %1
+    MOVHL     %2, %1
     paddd     %1, %2
 %else
-    pmaddwd %1, [pw_1]
-    HADDD   %1, %2
+    pmaddwd   %1, [pw_1]
+    HADDD     %1, %2
 %endif
 %endmacro
 
 %macro HADDUW 2
 %if cpuflag(xop) && sizeof%1 == 16
     vphadduwq %1, %1
-    movhlps   %2, %1
+    MOVHL     %2, %1
     paddd     %1, %2
 %else
     HADDUWD   %1, %2