;*****************************************************************************
;* 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