Merge commit '009331303a6462d07cbe94aef9c446f1a1695519'
authorMichael Niedermayer <michaelni@gmx.at>
Sat, 5 Jul 2014 16:54:09 +0000 (18:54 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Sat, 5 Jul 2014 17:11:26 +0000 (19:11 +0200)
* commit '009331303a6462d07cbe94aef9c446f1a1695519':
  x86: huffyuvdsp: Move inline assembly to init file

Conflicts:
libavcodec/x86/Makefile
libavcodec/x86/huffyuvdsp.h
libavcodec/x86/huffyuvdsp_init.c
libavcodec/x86/huffyuvdsp_mmx.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/x86/Makefile
libavcodec/x86/huffyuvdsp_init.c

@@@ -56,11 -47,12 +56,10 @@@ OBJS-$(CONFIG_VP6_DECODER)             
  OBJS-$(CONFIG_VP7_DECODER)             += x86/vp8dsp_init.o
  OBJS-$(CONFIG_VP8_DECODER)             += x86/vp8dsp_init.o
  OBJS-$(CONFIG_VP9_DECODER)             += x86/vp9dsp_init.o
 +OBJS-$(CONFIG_WEBP_DECODER)            += x86/vp8dsp_init.o
  
 -MMX-OBJS-$(CONFIG_AUDIODSP)            += x86/audiodsp_mmx.o
 -MMX-OBJS-$(CONFIG_BLOCKDSP)            += x86/blockdsp_mmx.o
  MMX-OBJS-$(CONFIG_DSPUTIL)             += x86/dsputil_mmx.o
 -MMX-OBJS-$(CONFIG_HPELDSP)             += x86/fpel_mmx.o                \
 -                                          x86/hpeldsp_mmx.o
 +MMX-OBJS-$(CONFIG_DIRAC_DECODER)       += x86/dirac_dwt.o
- MMX-OBJS-$(CONFIG_HUFFYUVDSP)          += x86/huffyuvdsp_mmx.o
  MMX-OBJS-$(CONFIG_IDCTDSP)             += x86/idctdsp_mmx.o             \
                                            x86/idct_mmx_xvid.o           \
                                            x86/idct_sse2_xvid.o          \
@@@ -1,7 -1,9 +1,9 @@@
  /*
 - * This file is part of Libav.
+  * Copyright (c) 2009 Loren Merritt <lorenm@u.washington.edu>
+  *
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * 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.
  #include "libavutil/x86/asm.h"
  #include "libavutil/x86/cpu.h"
  #include "libavcodec/huffyuvdsp.h"
- #include "huffyuvdsp.h"
  
 +void ff_add_bytes_mmx(uint8_t *dst, uint8_t *src, intptr_t w);
 +void ff_add_bytes_sse2(uint8_t *dst, uint8_t *src, intptr_t w);
 +
  void ff_add_hfyu_median_pred_mmxext(uint8_t *dst, const uint8_t *top,
 -                                    const uint8_t *diff, int w,
 +                                    const uint8_t *diff, intptr_t w,
                                      int *left, int *left_top);
 +void ff_add_hfyu_median_pred_sse2(uint8_t *dst, const uint8_t *top,
 +                                  const uint8_t *diff, intptr_t w,
 +                                  int *left, int *left_top);
  
  int  ff_add_hfyu_left_pred_ssse3(uint8_t *dst, const uint8_t *src,
 -                                 int w, int left);
 +                                 intptr_t w, int left);
  int  ff_add_hfyu_left_pred_sse4(uint8_t *dst, const uint8_t *src,
 -                                int w, int left);
 +                                intptr_t w, int left);
  
 -#if HAVE_INLINE_ASM
 +void ff_add_hfyu_left_pred_bgr32_mmx(uint8_t *dst, const uint8_t *src,
 +                                     intptr_t w, uint8_t *left);
 +void ff_add_hfyu_left_pred_bgr32_sse2(uint8_t *dst, const uint8_t *src,
 +                                      intptr_t w, uint8_t *left);
  
 -#if HAVE_7REGS
++#if HAVE_INLINE_ASM && HAVE_7REGS && ARCH_X86_32
+ static void add_hfyu_median_pred_cmov(uint8_t *dst, const uint8_t *top,
 -                                      const uint8_t *diff, int w,
++                                      const uint8_t *diff, intptr_t w,
+                                       int *left, int *left_top)
+ {
+     x86_reg w2 = -w;
+     x86_reg x;
+     int l  = *left     & 0xff;
+     int tl = *left_top & 0xff;
+     int t;
+     __asm__ volatile (
+         "mov          %7, %3            \n"
+         "1:                             \n"
+         "movzbl (%3, %4), %2            \n"
+         "mov          %2, %k3           \n"
+         "sub         %b1, %b3           \n"
+         "add         %b0, %b3           \n"
+         "mov          %2, %1            \n"
+         "cmp          %0, %2            \n"
+         "cmovg        %0, %2            \n"
+         "cmovg        %1, %0            \n"
+         "cmp         %k3, %0            \n"
+         "cmovg       %k3, %0            \n"
+         "mov          %7, %3            \n"
+         "cmp          %2, %0            \n"
+         "cmovl        %2, %0            \n"
+         "add    (%6, %4), %b0           \n"
+         "mov         %b0, (%5, %4)      \n"
+         "inc          %4                \n"
+         "jl           1b                \n"
+         : "+&q"(l), "+&q"(tl), "=&r"(t), "=&q"(x), "+&r"(w2)
+         : "r"(dst + w), "r"(diff + w), "rm"(top + w)
+     );
+     *left     = l;
+     *left_top = tl;
+ }
 -#endif /* HAVE_7REGS */
 -
 -static void add_bytes_mmx(uint8_t *dst, uint8_t *src, int w)
 -{
 -    x86_reg i = 0;
 -
 -    __asm__ volatile (
 -        "jmp          2f                \n\t"
 -        "1:                             \n\t"
 -        "movq   (%1, %0), %%mm0         \n\t"
 -        "movq   (%2, %0), %%mm1         \n\t"
 -        "paddb     %%mm0, %%mm1         \n\t"
 -        "movq      %%mm1, (%2, %0)      \n\t"
 -        "movq  8(%1, %0), %%mm0         \n\t"
 -        "movq  8(%2, %0), %%mm1         \n\t"
 -        "paddb     %%mm0, %%mm1         \n\t"
 -        "movq      %%mm1, 8(%2, %0)     \n\t"
 -        "add         $16, %0            \n\t"
 -        "2:                             \n\t"
 -        "cmp          %3, %0            \n\t"
 -        "js           1b                \n\t"
 -        : "+r" (i)
 -        : "r" (src), "r" (dst), "r" ((x86_reg) w - 15));
 -
 -    for (; i < w; i++)
 -        dst[i + 0] += src[i + 0];
 -}
 -
 -#endif /* HAVE_INLINE_ASM */
++#endif
  av_cold void ff_huffyuvdsp_init_x86(HuffYUVDSPContext *c)
  {
      int cpu_flags = av_get_cpu_flags();
  
- #if HAVE_7REGS && HAVE_INLINE_ASM
-     if (ARCH_X86_32 && cpu_flags & AV_CPU_FLAG_CMOV)
-         c->add_hfyu_median_pred = ff_add_hfyu_median_pred_cmov;
 -#if HAVE_INLINE_ASM
 -#if HAVE_7REGS
++#if HAVE_INLINE_ASM && HAVE_7REGS && ARCH_X86_32
+     if (cpu_flags & AV_CPU_FLAG_CMOV)
+         c->add_hfyu_median_pred = add_hfyu_median_pred_cmov;
 -#endif /* HAVE_7REGS */
 +#endif
  
 -    if (INLINE_MMX(cpu_flags))
 -        c->add_bytes = add_bytes_mmx;
 -#endif /* HAVE_INLINE_ASM */
 +    if (ARCH_X86_32 && EXTERNAL_MMX(cpu_flags)) {
 +        c->add_bytes = ff_add_bytes_mmx;
 +        c->add_hfyu_left_pred_bgr32 = ff_add_hfyu_left_pred_bgr32_mmx;
 +    }
  
 -    if (EXTERNAL_MMXEXT(cpu_flags)) {
 +    if (ARCH_X86_32 && EXTERNAL_MMXEXT(cpu_flags)) {
          /* slower than cmov version on AMD */
          if (!(cpu_flags & AV_CPU_FLAG_3DNOW))
              c->add_hfyu_median_pred = ff_add_hfyu_median_pred_mmxext;