|
|
|
@@ -1,7 +1,7 @@ |
|
|
|
;***************************************************************************** |
|
|
|
;* x86inc.asm: x264asm abstraction layer |
|
|
|
;***************************************************************************** |
|
|
|
;* Copyright (C) 2005-2015 x264 project |
|
|
|
;* Copyright (C) 2005-2016 x264 project |
|
|
|
;* |
|
|
|
;* Authors: Loren Merritt <lorenm@u.washington.edu> |
|
|
|
;* Anton Mitrofanov <BugMaster@narod.ru> |
|
|
|
@@ -1456,47 +1456,44 @@ FMA_INSTR pmadcswd, pmaddwd, paddd |
|
|
|
; This lets us use tzcnt without bumping the yasm version requirement yet. |
|
|
|
%define tzcnt rep bsf |
|
|
|
|
|
|
|
; convert FMA4 to FMA3 if possible |
|
|
|
%macro FMA4_INSTR 4 |
|
|
|
%macro %1 4-8 %1, %2, %3, %4 |
|
|
|
%if cpuflag(fma4) |
|
|
|
v%5 %1, %2, %3, %4 |
|
|
|
%elifidn %1, %2 |
|
|
|
v%6 %1, %4, %3 ; %1 = %1 * %3 + %4 |
|
|
|
%elifidn %1, %3 |
|
|
|
v%7 %1, %2, %4 ; %1 = %2 * %1 + %4 |
|
|
|
%elifidn %1, %4 |
|
|
|
v%8 %1, %2, %3 ; %1 = %2 * %3 + %1 |
|
|
|
%else |
|
|
|
%error fma3 emulation of ``%5 %1, %2, %3, %4'' is not supported |
|
|
|
%endif |
|
|
|
%endmacro |
|
|
|
; Macros for consolidating FMA3 and FMA4 using 4-operand (dst, src1, src2, src3) syntax. |
|
|
|
; FMA3 is only possible if dst is the same as one of the src registers. |
|
|
|
; Either src2 or src3 can be a memory operand. |
|
|
|
%macro FMA4_INSTR 2-* |
|
|
|
%push fma4_instr |
|
|
|
%xdefine %$prefix %1 |
|
|
|
%rep %0 - 1 |
|
|
|
%macro %$prefix%2 4-6 %$prefix, %2 |
|
|
|
%if notcpuflag(fma3) && notcpuflag(fma4) |
|
|
|
%error use of ``%5%6'' fma instruction in cpuname function: current_function |
|
|
|
%elif cpuflag(fma4) |
|
|
|
v%5%6 %1, %2, %3, %4 |
|
|
|
%elifidn %1, %2 |
|
|
|
; If %3 or %4 is a memory operand it needs to be encoded as the last operand. |
|
|
|
%ifid %3 |
|
|
|
v%{5}213%6 %2, %3, %4 |
|
|
|
%else |
|
|
|
v%{5}132%6 %2, %4, %3 |
|
|
|
%endif |
|
|
|
%elifidn %1, %3 |
|
|
|
v%{5}213%6 %3, %2, %4 |
|
|
|
%elifidn %1, %4 |
|
|
|
v%{5}231%6 %4, %2, %3 |
|
|
|
%else |
|
|
|
%error fma3 emulation of ``%5%6 %1, %2, %3, %4'' is not supported |
|
|
|
%endif |
|
|
|
%endmacro |
|
|
|
%rotate 1 |
|
|
|
%endrep |
|
|
|
%pop |
|
|
|
%endmacro |
|
|
|
|
|
|
|
FMA4_INSTR fmaddpd, fmadd132pd, fmadd213pd, fmadd231pd |
|
|
|
FMA4_INSTR fmaddps, fmadd132ps, fmadd213ps, fmadd231ps |
|
|
|
FMA4_INSTR fmaddsd, fmadd132sd, fmadd213sd, fmadd231sd |
|
|
|
FMA4_INSTR fmaddss, fmadd132ss, fmadd213ss, fmadd231ss |
|
|
|
|
|
|
|
FMA4_INSTR fmaddsubpd, fmaddsub132pd, fmaddsub213pd, fmaddsub231pd |
|
|
|
FMA4_INSTR fmaddsubps, fmaddsub132ps, fmaddsub213ps, fmaddsub231ps |
|
|
|
FMA4_INSTR fmsubaddpd, fmsubadd132pd, fmsubadd213pd, fmsubadd231pd |
|
|
|
FMA4_INSTR fmsubaddps, fmsubadd132ps, fmsubadd213ps, fmsubadd231ps |
|
|
|
|
|
|
|
FMA4_INSTR fmsubpd, fmsub132pd, fmsub213pd, fmsub231pd |
|
|
|
FMA4_INSTR fmsubps, fmsub132ps, fmsub213ps, fmsub231ps |
|
|
|
FMA4_INSTR fmsubsd, fmsub132sd, fmsub213sd, fmsub231sd |
|
|
|
FMA4_INSTR fmsubss, fmsub132ss, fmsub213ss, fmsub231ss |
|
|
|
|
|
|
|
FMA4_INSTR fnmaddpd, fnmadd132pd, fnmadd213pd, fnmadd231pd |
|
|
|
FMA4_INSTR fnmaddps, fnmadd132ps, fnmadd213ps, fnmadd231ps |
|
|
|
FMA4_INSTR fnmaddsd, fnmadd132sd, fnmadd213sd, fnmadd231sd |
|
|
|
FMA4_INSTR fnmaddss, fnmadd132ss, fnmadd213ss, fnmadd231ss |
|
|
|
|
|
|
|
FMA4_INSTR fnmsubpd, fnmsub132pd, fnmsub213pd, fnmsub231pd |
|
|
|
FMA4_INSTR fnmsubps, fnmsub132ps, fnmsub213ps, fnmsub231ps |
|
|
|
FMA4_INSTR fnmsubsd, fnmsub132sd, fnmsub213sd, fnmsub231sd |
|
|
|
FMA4_INSTR fnmsubss, fnmsub132ss, fnmsub213ss, fnmsub231ss |
|
|
|
FMA4_INSTR fmadd, pd, ps, sd, ss |
|
|
|
FMA4_INSTR fmaddsub, pd, ps |
|
|
|
FMA4_INSTR fmsub, pd, ps, sd, ss |
|
|
|
FMA4_INSTR fmsubadd, pd, ps |
|
|
|
FMA4_INSTR fnmadd, pd, ps, sd, ss |
|
|
|
FMA4_INSTR fnmsub, pd, ps, sd, ss |
|
|
|
|
|
|
|
; workaround: vpbroadcastq is broken in x86_32 due to a yasm bug (fixed in 1.3.0) |
|
|
|
%ifdef __YASM_VER__ |
|
|
|
|