avfilter/x86/vf_hflip : add avx2 version for hflip_byte and hflip_short
authorMartin Vignali <martin.vignali@gmail.com>
Tue, 19 Dec 2017 20:06:01 +0000 (21:06 +0100)
committerMartin Vignali <martin.vignali@gmail.com>
Tue, 19 Dec 2017 20:10:09 +0000 (21:10 +0100)
libavfilter/x86/vf_hflip.asm
libavfilter/x86/vf_hflip_init.c

index 82e1154..6bd1782 100644 (file)
@@ -32,7 +32,7 @@ SECTION .text
 ;%1 byte or short, %2 b or w, %3 size in byte (1 for byte, 2 for short)
 %macro HFLIP 3
 cglobal hflip_%1, 3, 5, 3, src, dst, w, r, x
-    mova    m0, [pb_flip_%1]
+    VBROADCASTI128    m0, [pb_flip_%1]
     xor     xq, xq
 %if %3 == 1
     movsxdifnidn wq, wd
@@ -47,8 +47,13 @@ cglobal hflip_%1, 3, 5, 3, src, dst, w, r, x
 
     .loop0:
         neg     xq
+%if mmsize == 32
+        vpermq  m1, [srcq + xq -     mmsize + %3], 0x4e; flip each lane at load
+        vpermq  m2, [srcq + xq - 2 * mmsize + %3], 0x4e; flip each lane at load
+%else
         movu    m1, [srcq + xq -     mmsize + %3]
         movu    m2, [srcq + xq - 2 * mmsize + %3]
+%endif
         pshufb  m1, m0
         pshufb  m2, m0
         neg     xq
@@ -78,3 +83,8 @@ INIT_XMM ssse3
 HFLIP byte, b, 1
 HFLIP short, w, 2
 
+%if HAVE_AVX2_EXTERNAL
+INIT_YMM avx2
+HFLIP byte, b, 1
+HFLIP short, w, 2
+%endif
index 2b5c9d3..0ac399b 100644 (file)
@@ -24,7 +24,9 @@
 #include "libavfilter/hflip.h"
 
 void ff_hflip_byte_ssse3(const uint8_t *src, uint8_t *dst, int w);
+void ff_hflip_byte_avx2(const uint8_t *src, uint8_t *dst, int w);
 void ff_hflip_short_ssse3(const uint8_t *src, uint8_t *dst, int w);
+void ff_hflip_short_avx2(const uint8_t *src, uint8_t *dst, int w);
 
 av_cold void ff_hflip_init_x86(FlipContext *s, int step[4], int nb_planes)
 {
@@ -32,10 +34,20 @@ av_cold void ff_hflip_init_x86(FlipContext *s, int step[4], int nb_planes)
     int i;
 
     for (i = 0; i < nb_planes; i++) {
-        if (EXTERNAL_SSSE3(cpu_flags) && step[i] == 1) {
-            s->flip_line[i] = ff_hflip_byte_ssse3;
-        } else if (EXTERNAL_SSSE3(cpu_flags) && step[i] == 2) {
-            s->flip_line[i] = ff_hflip_short_ssse3;
+        if (step[i] == 1) {
+            if (EXTERNAL_SSSE3(cpu_flags)) {
+                s->flip_line[i] = ff_hflip_byte_ssse3;
+            }
+            if (EXTERNAL_AVX2_FAST(cpu_flags)) {
+                s->flip_line[i] = ff_hflip_byte_avx2;
+            }
+        } else if (step[i] == 2) {
+            if (EXTERNAL_SSSE3(cpu_flags)) {
+                s->flip_line[i] = ff_hflip_short_ssse3;
+            }
+            if (EXTERNAL_AVX2_FAST(cpu_flags)) {
+                s->flip_line[i] = ff_hflip_short_avx2;
+            }
         }
     }
 }