From: Jason Garrett-Glaser <[email protected]>

Signed-off-by: Derek Buitenhuis <[email protected]>
---
 libavresample/x86/audio_mix.asm | 18 +++++++++---------
 libavutil/x86/x86inc.asm        | 42 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 51 insertions(+), 9 deletions(-)

diff --git a/libavresample/x86/audio_mix.asm b/libavresample/x86/audio_mix.asm
index 4710bb1..1f4157d 100644
--- a/libavresample/x86/audio_mix.asm
+++ b/libavresample/x86/audio_mix.asm
@@ -384,10 +384,10 @@ cglobal mix_%1_to_%2_%3_flt, 
3,in_channels+2,needed_mmregs+matrix_elements_mm, n
     S16_TO_S32_SX   4, 5
     cvtdq2ps       m4, m4
     cvtdq2ps       m5, m5
-    fmaddps        m2, m4, mx_1_ %+ %%i, m2, m6
-    fmaddps        m3, m5, mx_1_ %+ %%i, m3, m6
-    fmaddps        m0, m4, mx_0_ %+ %%i, m0, m4
-    fmaddps        m1, m5, mx_0_ %+ %%i, m1, m5
+    fmaddps        m2, m4, mx_1_ %+ %%i, m2
+    fmaddps        m3, m5, mx_1_ %+ %%i, m3
+    fmaddps        m0, m4, mx_0_ %+ %%i, m0
+    fmaddps        m1, m5, mx_0_ %+ %%i, m1
     %else
     %if copy_src_from_stack
     mov       src_ptr, src %+ %%i %+ m
@@ -396,8 +396,8 @@ cglobal mix_%1_to_%2_%3_flt, 
3,in_channels+2,needed_mmregs+matrix_elements_mm, n
     S16_TO_S32_SX   2, 3
     cvtdq2ps       m2, m2
     cvtdq2ps       m3, m3
-    fmaddps        m0, m2, mx_0_ %+ %%i, m0, m4
-    fmaddps        m1, m3, mx_0_ %+ %%i, m1, m4
+    fmaddps        m0, m2, mx_0_ %+ %%i, m0
+    fmaddps        m1, m3, mx_0_ %+ %%i, m1
     %endif
     %assign %%i %%i+1
 %endrep
@@ -437,12 +437,12 @@ cglobal mix_%1_to_%2_%3_flt, 
3,in_channels+2,needed_mmregs+matrix_elements_mm, n
     mova           m2, [src_ptr+lenq]
     %endif
     %if stereo
-    fmaddps        m1, m2, mx_1_ %+ %%i, m1, m3
+    fmaddps        m1, m2, mx_1_ %+ %%i, m1
     %endif
     %if stereo || mx_stack_0_ %+ %%i
-    fmaddps        m0, m2, mx_0_ %+ %%i, m0, m2
+    fmaddps        m0, m2, mx_0_ %+ %%i, m0
     %else
-    fmaddps        m0, mx_0_ %+ %%i, [src_ptr+lenq], m0, m1
+    fmaddps        m0, mx_0_ %+ %%i, [src_ptr+lenq], m0
     %endif
     %assign %%i %%i+1
 %endrep
diff --git a/libavutil/x86/x86inc.asm b/libavutil/x86/x86inc.asm
index 051ac58..1292758 100644
--- a/libavutil/x86/x86inc.asm
+++ b/libavutil/x86/x86inc.asm
@@ -1417,3 +1417,45 @@ FMA_INSTR pmadcswd, pmaddwd, paddd
 ; tzcnt is equivalent to "rep bsf" and is backwards-compatible with bsf.
 ; 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
+%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
-- 
1.8.4.rc3

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to