x86/fixed_dsp: add ff_butterflies_fixed_sse2
authorJames Almer <jamrial@gmail.com>
Sat, 16 Jan 2016 01:04:09 +0000 (22:04 -0300)
committerJames Almer <jamrial@gmail.com>
Sun, 17 Jan 2016 00:09:38 +0000 (21:09 -0300)
Reviewed-by: Paul B Mahol <onemda@gmail.com>
Signed-off-by: James Almer <jamrial@gmail.com>
libavutil/fixed_dsp.c
libavutil/fixed_dsp.h
libavutil/x86/Makefile
libavutil/x86/fixed_dsp.asm [new file with mode: 0644]
libavutil/x86/fixed_dsp_init.c [new file with mode: 0644]

index c2f270d..8c01858 100644 (file)
@@ -160,5 +160,8 @@ AVFixedDSPContext * avpriv_alloc_fixed_dsp(int bit_exact)
     fdsp->butterflies_fixed = butterflies_fixed_c;
     fdsp->scalarproduct_fixed = scalarproduct_fixed_c;
 
+    if (ARCH_X86)
+        ff_fixed_dsp_init_x86(fdsp);
+
     return fdsp;
 }
index 03987ad..f554cb5 100644 (file)
@@ -161,6 +161,8 @@ typedef struct AVFixedDSPContext {
  */
 AVFixedDSPContext * avpriv_alloc_fixed_dsp(int strict);
 
+void ff_fixed_dsp_init_x86(AVFixedDSPContext *fdsp);
+
 /**
  * Calculate the square root
  *
index eb70a62..94d8832 100644 (file)
@@ -1,4 +1,5 @@
 OBJS += x86/cpu.o                                                       \
+        x86/fixed_dsp_init.o                                            \
         x86/float_dsp_init.o                                            \
         x86/lls_init.o                                                  \
 
@@ -8,6 +9,7 @@ EMMS_OBJS_$(HAVE_MMX_INLINE)_$(HAVE_MMX_EXTERNAL)_$(HAVE_MM_EMPTY) = x86/emms.o
 
 YASM-OBJS += x86/cpuid.o                                                \
              $(EMMS_OBJS__yes_)                                      \
+             x86/fixed_dsp.o                                            \
              x86/float_dsp.o                                            \
              x86/lls.o                                                  \
 
diff --git a/libavutil/x86/fixed_dsp.asm b/libavutil/x86/fixed_dsp.asm
new file mode 100644 (file)
index 0000000..979dd5c
--- /dev/null
@@ -0,0 +1,48 @@
+;*****************************************************************************
+;* x86-optimized Float DSP functions
+;*
+;* Copyright 2016 James Almer
+;*
+;* This file is part of FFmpeg.
+;*
+;* FFmpeg is free software; you can redistribute it and/or
+;* modify it under the terms of the GNU Lesser General Public
+;* License as published by the Free Software Foundation; either
+;* version 2.1 of the License, or (at your option) any later version.
+;*
+;* FFmpeg is distributed in the hope that it will be useful,
+;* but WITHOUT ANY WARRANTY; without even the implied warranty of
+;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;* Lesser General Public License for more details.
+;*
+;* You should have received a copy of the GNU Lesser General Public
+;* License along with FFmpeg; if not, write to the Free Software
+;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+;******************************************************************************
+
+%include "x86util.asm"
+
+SECTION .text
+
+;-----------------------------------------------------------------------------
+; void ff_butterflies_fixed(float *src0, float *src1, int len);
+;-----------------------------------------------------------------------------
+INIT_XMM sse2
+cglobal butterflies_fixed, 3,3,3, src0, src1, len
+    shl       lend, 2
+    add      src0q, lenq
+    add      src1q, lenq
+    neg       lenq
+
+align 16
+.loop:
+    mova        m0, [src0q + lenq]
+    mova        m1, [src1q + lenq]
+    mova        m2, m0
+    paddd       m0, m1
+    psubd       m2, m1
+    mova        [src0q + lenq], m0
+    mova        [src1q + lenq], m2
+    add       lenq, mmsize
+    jl .loop
+    RET
diff --git a/libavutil/x86/fixed_dsp_init.c b/libavutil/x86/fixed_dsp_init.c
new file mode 100644 (file)
index 0000000..303a2eb
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+
+#include "libavutil/attributes.h"
+#include "libavutil/cpu.h"
+#include "libavutil/fixed_dsp.h"
+#include "cpu.h"
+
+void ff_butterflies_fixed_sse2(int *src0, int *src1, int len);
+
+av_cold void ff_fixed_dsp_init_x86(AVFixedDSPContext *fdsp)
+{
+    int cpu_flags = av_get_cpu_flags();
+
+    if (EXTERNAL_SSE2(cpu_flags)) {
+        fdsp->butterflies_fixed = ff_butterflies_fixed_sse2;
+    }
+}