Merge commit 'c166148409fe8f0dbccef2fe684286a40ba1e37d'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 7 Jul 2014 13:27:11 +0000 (15:27 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 7 Jul 2014 13:36:58 +0000 (15:36 +0200)
* commit 'c166148409fe8f0dbccef2fe684286a40ba1e37d':
  dsputil: Move pix_sum, pix_norm1, shrink function pointers to mpegvideoenc

Conflicts:
libavcodec/dsputil.c
libavcodec/mpegvideo_enc.c
libavcodec/x86/dsputilenc.asm
libavcodec/x86/dsputilenc_mmx.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
21 files changed:
1  2 
libavcodec/arm/Makefile
libavcodec/arm/dsputil_armv6.S
libavcodec/arm/dsputil_init_armv6.c
libavcodec/arm/mpegvideoencdsp_armv6.S
libavcodec/arm/mpegvideoencdsp_init_arm.c
libavcodec/dnxhdenc.c
libavcodec/dsputil.c
libavcodec/dsputil.h
libavcodec/motion_est.c
libavcodec/mpegvideo_enc.c
libavcodec/mpegvideoencdsp.c
libavcodec/mpegvideoencdsp.h
libavcodec/ppc/Makefile
libavcodec/ppc/dsputil_altivec.c
libavcodec/ppc/mpegvideoencdsp.c
libavcodec/svq1enc.c
libavcodec/x86/Makefile
libavcodec/x86/dsputilenc.asm
libavcodec/x86/dsputilenc_mmx.c
libavcodec/x86/mpegvideoencdsp.asm
libavcodec/x86/mpegvideoencdsp_init.c

@@@ -19,9 -19,9 +19,10 @@@ OBJS-$(CONFIG_IDCTDSP)                 
                                            arm/idctdsp_arm.o             \
                                            arm/jrevdct_arm.o             \
                                            arm/simple_idct_arm.o
 +OBJS-$(CONFIG_LLAUDDSP)                += arm/lossless_audiodsp_init_arm.o
  OBJS-$(CONFIG_MPEGAUDIODSP)            += arm/mpegaudiodsp_init_arm.o
  OBJS-$(CONFIG_MPEGVIDEO)               += arm/mpegvideo_arm.o
+ OBJS-$(CONFIG_MPEGVIDEOENC)            += arm/mpegvideoencdsp_init_arm.o
  OBJS-$(CONFIG_NEON_CLOBBER_TEST)       += arm/neontest.o
  OBJS-$(CONFIG_VIDEODSP)                += arm/videodsp_init_arm.o
  OBJS-$(CONFIG_VP3DSP)                  += arm/vp3dsp_init_arm.o
@@@ -61,10 -61,9 +62,11 @@@ ARMV6-OBJS-$(CONFIG_IDCTDSP)           
                                            arm/idctdsp_armv6.o           \
                                            arm/simple_idct_armv6.o
  ARMV6-OBJS-$(CONFIG_MPEGAUDIODSP)      += arm/mpegaudiodsp_fixed_armv6.o
+ ARMV6-OBJS-$(CONFIG_MPEGVIDEOENC)      += arm/mpegvideoencdsp_armv6.o
  
  ARMV6-OBJS-$(CONFIG_MLP_DECODER)       += arm/mlpdsp_armv6.o
 +ARMV6-OBJS-$(CONFIG_VC1_DECODER)       += arm/startcode_armv6.o
 +ARMV6-OBJS-$(CONFIG_VC1_PARSER)        += arm/startcode_armv6.o
  ARMV6-OBJS-$(CONFIG_VP7_DECODER)       += arm/vp8_armv6.o               \
                                            arm/vp8dsp_init_armv6.o       \
                                            arm/vp8dsp_armv6.o
Simple merge
Simple merge
index 0000000,99db501..ab0dad7
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,76 +1,76 @@@
 - * This file is part of Libav.
+ /*
+  * Copyright (c) 2009 Mans Rullgard <mans@mansr.com>
+  *
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * 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.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * 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 "libavutil/arm/asm.S"
+ function ff_pix_norm1_armv6, export=1
+         push            {r4-r6, lr}
+         mov             r12, #16
+         mov             lr,  #0
+ 1:
+         ldm             r0,  {r2-r5}
+         uxtb16          r6,  r2
+         uxtb16          r2,  r2,  ror #8
+         smlad           lr,  r6,  r6,  lr
+         uxtb16          r6,  r3
+         smlad           lr,  r2,  r2,  lr
+         uxtb16          r3,  r3,  ror #8
+         smlad           lr,  r6,  r6,  lr
+         uxtb16          r6,  r4
+         smlad           lr,  r3,  r3,  lr
+         uxtb16          r4,  r4,  ror #8
+         smlad           lr,  r6,  r6,  lr
+         uxtb16          r6,  r5
+         smlad           lr,  r4,  r4,  lr
+         uxtb16          r5,  r5,  ror #8
+         smlad           lr,  r6,  r6,  lr
+         subs            r12, r12, #1
+         add             r0,  r0,  r1
+         smlad           lr,  r5,  r5,  lr
+         bgt             1b
+         mov             r0,  lr
+         pop             {r4-r6, pc}
+ endfunc
+ function ff_pix_sum_armv6, export=1
+         push            {r4-r7, lr}
+         mov             r12, #16
+         mov             r2,  #0
+         mov             r3,  #0
+         mov             lr,  #0
+         ldr             r4,  [r0]
+ 1:
+         subs            r12, r12, #1
+         ldr             r5,  [r0, #4]
+         usada8          r2,  r4,  lr,  r2
+         ldr             r6,  [r0, #8]
+         usada8          r3,  r5,  lr,  r3
+         ldr             r7,  [r0, #12]
+         usada8          r2,  r6,  lr,  r2
+         beq             2f
+         ldr_pre         r4,  r0,  r1
+         usada8          r3,  r7,  lr,  r3
+         bgt             1b
+ 2:
+         usada8          r3,  r7,  lr,  r3
+         add             r0,  r2,  r3
+         pop             {r4-r7, pc}
+ endfunc
index 0000000,ab9ba3e..4bfe835
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,38 +1,38 @@@
 - * This file is part of Libav.
+ /*
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * 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.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * 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 <stdint.h>
+ #include "libavutil/cpu.h"
+ #include "libavutil/arm/cpu.h"
+ #include "libavcodec/avcodec.h"
+ #include "libavcodec/mpegvideoencdsp.h"
+ int ff_pix_norm1_armv6(uint8_t *pix, int line_size);
+ int ff_pix_sum_armv6(uint8_t *pix, int line_size);
+ av_cold void ff_mpegvideoencdsp_init_arm(MpegvideoEncDSPContext *c,
+                                          AVCodecContext *avctx)
+ {
+     int cpu_flags = av_get_cpu_flags();
+     if (have_armv6(cpu_flags)) {
+         c->pix_norm1 = ff_pix_norm1_armv6;
+         c->pix_sum   = ff_pix_sum_armv6;
+     }
+ }
@@@ -322,10 -307,10 +322,11 @@@ static av_cold int dnxhd_encode_init(AV
      avctx->bits_per_raw_sample = ctx->cid_table->bit_depth;
  
      ff_blockdsp_init(&ctx->bdsp, avctx);
 -    ff_dsputil_init(&ctx->m.dsp, avctx);
      ff_idctdsp_init(&ctx->m.idsp, avctx);
+     ff_mpegvideoencdsp_init(&ctx->m.mpvencdsp, avctx);
      ff_dct_common_init(&ctx->m);
 +    ff_dct_encode_init(&ctx->m);
 +
      if (!ctx->m.dct_quantize)
          ctx->m.dct_quantize = ff_dct_quantize_c;
  
@@@ -26,8 -26,6 +26,7 @@@
   */
  
  #include "libavutil/attributes.h"
- #include "libavutil/imgutils.h"
 +#include "libavutil/internal.h"
  #include "avcodec.h"
  #include "copy_block.h"
  #include "dct.h"
@@@ -1137,15 -1022,7 +1063,10 @@@ av_cold void ff_dsputil_init(DSPContex
      c->vsse[5] = vsse_intra8_c;
      c->nsse[0] = nsse16_c;
      c->nsse[1] = nsse8_c;
 +#if CONFIG_SNOW_DECODER || CONFIG_SNOW_ENCODER
 +    ff_dsputil_init_dwt(c);
 +#endif
  
-     c->shrink[0] = av_image_copy_plane;
-     c->shrink[1] = ff_shrink22;
-     c->shrink[2] = ff_shrink44;
-     c->shrink[3] = ff_shrink88;
      c->draw_edges = draw_edges_8_c;
  
      switch (avctx->bits_per_raw_sample) {
Simple merge
Simple merge
@@@ -1270,23 -1131,28 +1270,29 @@@ static int estimate_best_b_count(MpegEn
  
          if (pre_input_ptr && (!i || s->input_picture[i - 1])) {
              pre_input = *pre_input_ptr;
 +            memcpy(data, pre_input_ptr->f->data, sizeof(data));
  
              if (!pre_input.shared && i) {
 -                pre_input.f->data[0] += INPLACE_OFFSET;
 -                pre_input.f->data[1] += INPLACE_OFFSET;
 -                pre_input.f->data[2] += INPLACE_OFFSET;
 +                data[0] += INPLACE_OFFSET;
 +                data[1] += INPLACE_OFFSET;
 +                data[2] += INPLACE_OFFSET;
              }
  
-             s->dsp.shrink[scale](s->tmp_frames[i]->data[0], s->tmp_frames[i]->linesize[0],
-                                  data[0], pre_input.f->linesize[0],
-                                  c->width,      c->height);
-             s->dsp.shrink[scale](s->tmp_frames[i]->data[1], s->tmp_frames[i]->linesize[1],
-                                  data[1], pre_input.f->linesize[1],
-                                  c->width >> 1, c->height >> 1);
-             s->dsp.shrink[scale](s->tmp_frames[i]->data[2], s->tmp_frames[i]->linesize[2],
-                                  data[2], pre_input.f->linesize[2],
-                                  c->width >> 1, c->height >> 1);
+             s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[0],
+                                        s->tmp_frames[i]->linesize[0],
 -                                       pre_input.f->data[0],
++                                       data[0],
+                                        pre_input.f->linesize[0],
+                                        c->width, c->height);
+             s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[1],
+                                        s->tmp_frames[i]->linesize[1],
 -                                       pre_input.f->data[1],
++                                       data[1],
+                                        pre_input.f->linesize[1],
+                                        c->width >> 1, c->height >> 1);
+             s->mpvencdsp.shrink[scale](s->tmp_frames[i]->data[2],
+                                        s->tmp_frames[i]->linesize[2],
 -                                       pre_input.f->data[2],
++                                       data[2],
+                                        pre_input.f->linesize[2],
+                                        c->width >> 1, c->height >> 1);
          }
      }
  
  #include <stdint.h>
  
  #include "config.h"
 +#include "libavutil/avassert.h"
  #include "libavutil/attributes.h"
+ #include "libavutil/imgutils.h"
  #include "avcodec.h"
+ #include "dsputil.h"
+ #include "imgconvert.h"
  #include "mpegvideoencdsp.h"
  
  static int try_8x8basis_c(int16_t rem[64], int16_t weight[64],
Simple merge
Simple merge
Simple merge
index 0000000,b5348e6..00ae2a6
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,103 +1,103 @@@
 - * This file is part of Libav.
+ /*
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * 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.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * 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 <stdint.h>
+ #if HAVE_ALTIVEC_H
+ #include <altivec.h>
+ #endif
+ #include "libavutil/attributes.h"
+ #include "libavutil/cpu.h"
+ #include "libavutil/ppc/cpu.h"
+ #include "libavutil/ppc/types_altivec.h"
+ #include "libavutil/ppc/util_altivec.h"
+ #include "libavcodec/mpegvideoencdsp.h"
+ #if HAVE_ALTIVEC
+ static int pix_norm1_altivec(uint8_t *pix, int line_size)
+ {
+     int i, s = 0;
+     const vector unsigned int zero =
+         (const vector unsigned int) vec_splat_u32(0);
+     vector unsigned char perm = vec_lvsl(0, pix);
+     vector unsigned int sv = (vector unsigned int) vec_splat_u32(0);
+     vector signed int sum;
+     for (i = 0; i < 16; i++) {
+         /* Read the potentially unaligned pixels. */
+         vector unsigned char pixl = vec_ld(0,  pix);
+         vector unsigned char pixr = vec_ld(15, pix);
+         vector unsigned char pixv = vec_perm(pixl, pixr, perm);
+         /* Square the values, and add them to our sum. */
+         sv = vec_msum(pixv, pixv, sv);
+         pix += line_size;
+     }
+     /* Sum up the four partial sums, and put the result into s. */
+     sum = vec_sums((vector signed int) sv, (vector signed int) zero);
+     sum = vec_splat(sum, 3);
+     vec_ste(sum, 0, &s);
+     return s;
+ }
+ static int pix_sum_altivec(uint8_t *pix, int line_size)
+ {
+     int i, s;
+     const vector unsigned int zero =
+         (const vector unsigned int) vec_splat_u32(0);
+     vector unsigned char perm = vec_lvsl(0, pix);
+     vector unsigned int sad = (vector unsigned int) vec_splat_u32(0);
+     vector signed int sumdiffs;
+     for (i = 0; i < 16; i++) {
+         /* Read the potentially unaligned 16 pixels into t1. */
+         vector unsigned char pixl = vec_ld(0,  pix);
+         vector unsigned char pixr = vec_ld(15, pix);
+         vector unsigned char t1   = vec_perm(pixl, pixr, perm);
+         /* Add each 4 pixel group together and put 4 results into sad. */
+         sad = vec_sum4s(t1, sad);
+         pix += line_size;
+     }
+     /* Sum up the four partial sums, and put the result into s. */
+     sumdiffs = vec_sums((vector signed int) sad, (vector signed int) zero);
+     sumdiffs = vec_splat(sumdiffs, 3);
+     vec_ste(sumdiffs, 0, &s);
+     return s;
+ }
+ #endif /* HAVE_ALTIVEC */
+ av_cold void ff_mpegvideoencdsp_init_ppc(MpegvideoEncDSPContext *c,
+                                          AVCodecContext *avctx)
+ {
+ #if HAVE_ALTIVEC
+     if (!PPC_ALTIVEC(av_get_cpu_flags()))
+         return;
+     c->pix_norm1 = pix_norm1_altivec;
+     c->pix_sum   = pix_sum_altivec;
+ #endif /* HAVE_ALTIVEC */
+ }
Simple merge
@@@ -105,10 -91,8 +105,11 @@@ YASM-OBJS-$(CONFIG_HEVC_DECODER)       
  YASM-OBJS-$(CONFIG_HPELDSP)            += x86/fpel.o                    \
                                            x86/hpeldsp.o
  YASM-OBJS-$(CONFIG_HUFFYUVDSP)         += x86/huffyuvdsp.o
 +YASM-OBJS-$(CONFIG_IDCTDSP)            += x86/idctdsp.o
 +YASM-OBJS-$(CONFIG_LLAUDDSP)           += x86/lossless_audiodsp.o
 +YASM-OBJS-$(CONFIG_LLVIDDSP)           += x86/lossless_videodsp.o
  YASM-OBJS-$(CONFIG_MPEGAUDIODSP)       += x86/imdct36.o
+ YASM-OBJS-$(CONFIG_MPEGVIDEOENC)       += x86/mpegvideoencdsp.o
  YASM-OBJS-$(CONFIG_QPELDSP)            += x86/qpeldsp.o                 \
                                            x86/fpel.o                    \
                                            x86/qpel.o
@@@ -439,249 -418,3 +435,142 @@@ cglobal diff_pixels, 4,
      add          r4, 16
      jne .loop
      REP_RET
- ; int ff_pix_sum16_mmx(uint8_t *pix, int line_size)
- ; %1 = number of xmm registers used
- ; %2 = number of loops
- ; %3 = number of GPRs used
- %macro PIX_SUM16 4
- cglobal pix_sum16, 2, %3, %1
-     movsxdifnidn r1, r1d
-     mov          r2, %2
- %if cpuflag(xop)
-     lea          r3, [r1*3]
- %else
-     pxor         m5, m5
- %endif
-     pxor         m4, m4
- .loop:
- %if cpuflag(xop)
-     vphaddubq    m0, [r0]
-     vphaddubq    m1, [r0+r1]
-     vphaddubq    m2, [r0+r1*2]
-     vphaddubq    m3, [r0+r3]
- %else
-     mova         m0, [r0]
- %if mmsize == 8
-     mova         m1, [r0+8]
- %else
-     mova         m1, [r0+r1]
- %endif
-     punpckhbw    m2, m0, m5
-     punpcklbw    m0, m5
-     punpckhbw    m3, m1, m5
-     punpcklbw    m1, m5
- %endif ; cpuflag(xop)
-     paddw        m1, m0
-     paddw        m3, m2
-     paddw        m3, m1
-     paddw        m4, m3
- %if mmsize == 8
-     add          r0, r1
- %else
-     lea          r0, [r0+r1*%4]
- %endif
-     dec r2
-     jne .loop
- %if cpuflag(xop)
-     pshufd       m0, m4, q0032
-     paddd        m4, m0
- %else
-     HADDW        m4, m5
- %endif
-     movd        eax, m4
-     RET
- %endmacro
- INIT_MMX mmx
- PIX_SUM16 0, 16, 3, 0
- INIT_XMM sse2
- PIX_SUM16 6, 8,  3, 2
- %if HAVE_XOP_EXTERNAL
- INIT_XMM xop
- PIX_SUM16 5, 4,  4, 4
- %endif
- ; int ff_pix_norm1_mmx(uint8_t *pix, int line_size)
- ; %1 = number of xmm registers used
- ; %2 = number of loops
- %macro PIX_NORM1 2
- cglobal pix_norm1, 2, 3, %1
-     movsxdifnidn r1, r1d
-     mov          r2, %2
-     pxor         m0, m0
-     pxor         m5, m5
- .loop:
-     mova         m2, [r0+0]
- %if mmsize == 8
-     mova         m3, [r0+8]
- %else
-     mova         m3, [r0+r1]
- %endif
-     punpckhbw    m1, m2, m0
-     punpcklbw    m2, m0
-     punpckhbw    m4, m3, m0
-     punpcklbw    m3, m0
-     pmaddwd      m1, m1
-     pmaddwd      m2, m2
-     pmaddwd      m3, m3
-     pmaddwd      m4, m4
-     paddd        m2, m1
-     paddd        m4, m3
-     paddd        m5, m2
-     paddd        m5, m4
- %if mmsize == 8
-     add          r0, r1
- %else
-     lea          r0, [r0+r1*2]
- %endif
-     dec r2
-     jne .loop
-     HADDD        m5, m1
-     movd        eax, m5
-     RET
- %endmacro
- INIT_MMX mmx
- PIX_NORM1 0, 16
- INIT_XMM sse2
- PIX_NORM1 6, 8
 +
 +INIT_XMM sse2
 +cglobal diff_pixels, 4, 5, 5
 +    movsxdifnidn r3, r3d
 +    pxor         m4, m4
 +    add          r0,  128
 +    mov          r4, -128
 +.loop:
 +    movh         m0, [r1]
 +    movh         m2, [r2]
 +    movh         m1, [r1+r3]
 +    movh         m3, [r2+r3]
 +    punpcklbw    m0, m4
 +    punpcklbw    m1, m4
 +    punpcklbw    m2, m4
 +    punpcklbw    m3, m4
 +    psubw        m0, m2
 +    psubw        m1, m3
 +    mova [r0+r4+0 ], m0
 +    mova [r0+r4+16], m1
 +    lea          r1, [r1+r3*2]
 +    lea          r2, [r2+r3*2]
 +    add          r4, 32
 +    jne .loop
 +    RET
 +
 +;-----------------------------------------------
 +;int ff_sum_abs_dctelem(int16_t *block)
 +;-----------------------------------------------
 +; %1 = number of xmm registers used
 +; %2 = number of inline loops
 +
 +%macro SUM_ABS_DCTELEM 2
 +cglobal sum_abs_dctelem, 1, 1, %1, block
 +    pxor    m0, m0
 +    pxor    m1, m1
 +%assign %%i 0
 +%rep %2
 +    mova      m2, [blockq+mmsize*(0+%%i)]
 +    mova      m3, [blockq+mmsize*(1+%%i)]
 +    mova      m4, [blockq+mmsize*(2+%%i)]
 +    mova      m5, [blockq+mmsize*(3+%%i)]
 +    ABS1_SUM  m2, m6, m0
 +    ABS1_SUM  m3, m6, m1
 +    ABS1_SUM  m4, m6, m0
 +    ABS1_SUM  m5, m6, m1
 +%assign %%i %%i+4
 +%endrep
 +    paddusw m0, m1
 +    HSUM    m0, m1, eax
 +    and     eax, 0xFFFF
 +    RET
 +%endmacro
 +
 +INIT_MMX mmx
 +SUM_ABS_DCTELEM 0, 4
 +INIT_MMX mmxext
 +SUM_ABS_DCTELEM 0, 4
 +INIT_XMM sse2
 +SUM_ABS_DCTELEM 7, 2
 +INIT_XMM ssse3
 +SUM_ABS_DCTELEM 6, 2
 +
 +;------------------------------------------------------------------------------
 +; int ff_hf_noise*_mmx(uint8_t *pix1, int lsize, int h)
 +;------------------------------------------------------------------------------
 +; %1 = 8/16. %2-5=m#
 +%macro HF_NOISE_PART1 5
 +    mova      m%2, [pix1q]
 +%if %1 == 8
 +    mova      m%3, m%2
 +    psllq     m%2, 8
 +    psrlq     m%3, 8
 +    psrlq     m%2, 8
 +%else
 +    mova      m%3, [pix1q+1]
 +%endif
 +    mova      m%4, m%2
 +    mova      m%5, m%3
 +    punpcklbw m%2, m7
 +    punpcklbw m%3, m7
 +    punpckhbw m%4, m7
 +    punpckhbw m%5, m7
 +    psubw     m%2, m%3
 +    psubw     m%4, m%5
 +%endmacro
 +
 +; %1-2 = m#
 +%macro HF_NOISE_PART2 4
 +    psubw     m%1, m%3
 +    psubw     m%2, m%4
 +    pxor       m3, m3
 +    pxor       m1, m1
 +    pcmpgtw    m3, m%1
 +    pcmpgtw    m1, m%2
 +    pxor      m%1, m3
 +    pxor      m%2, m1
 +    psubw     m%1, m3
 +    psubw     m%2, m1
 +    paddw     m%2, m%1
 +    paddw      m6, m%2
 +%endmacro
 +
 +; %1 = 8/16
 +%macro HF_NOISE 1
 +cglobal hf_noise%1, 3,3,0, pix1, lsize, h
 +    movsxdifnidn lsizeq, lsized
 +    sub        hd, 2
 +    pxor       m7, m7
 +    pxor       m6, m6
 +    HF_NOISE_PART1 %1, 0, 1, 2, 3
 +    add     pix1q, lsizeq
 +    HF_NOISE_PART1 %1, 4, 1, 5, 3
 +    HF_NOISE_PART2     0, 2, 4, 5
 +    add     pix1q, lsizeq
 +.loop:
 +    HF_NOISE_PART1 %1, 0, 1, 2, 3
 +    HF_NOISE_PART2     4, 5, 0, 2
 +    add     pix1q, lsizeq
 +    HF_NOISE_PART1 %1, 4, 1, 5, 3
 +    HF_NOISE_PART2     0, 2, 4, 5
 +    add     pix1q, lsizeq
 +    sub        hd, 2
 +        jne .loop
 +
 +    mova       m0, m6
 +    punpcklwd  m0, m7
 +    punpckhwd  m6, m7
 +    paddd      m6, m0
 +    mova       m0, m6
 +    psrlq      m6, 32
 +    paddd      m0, m6
 +    movd      eax, m0   ; eax = result of hf_noise8;
 +    REP_RET                 ; return eax;
 +%endmacro
 +
 +INIT_MMX mmx
 +HF_NOISE 8
 +HF_NOISE 16
@@@ -35,38 -35,382 +35,33 @@@ void ff_get_pixels_mmx(int16_t *block, 
  void ff_get_pixels_sse2(int16_t *block, const uint8_t *pixels, int line_size);
  void ff_diff_pixels_mmx(int16_t *block, const uint8_t *s1, const uint8_t *s2,
                          int stride);
- int ff_pix_sum16_mmx(uint8_t *pix, int line_size);
- int ff_pix_sum16_sse2(uint8_t *pix, int line_size);
- int ff_pix_sum16_xop(uint8_t *pix, int line_size);
- int ff_pix_norm1_mmx(uint8_t *pix, int line_size);
- int ff_pix_norm1_sse2(uint8_t *pix, int line_size);
 +void ff_diff_pixels_sse2(int16_t *block, const uint8_t *s1, const uint8_t *s2,
 +                         int stride);
 +int ff_sum_abs_dctelem_mmx(int16_t *block);
 +int ff_sum_abs_dctelem_mmxext(int16_t *block);
 +int ff_sum_abs_dctelem_sse2(int16_t *block);
 +int ff_sum_abs_dctelem_ssse3(int16_t *block);
 +int ff_sse8_mmx(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2,
 +                int line_size, int h);
 +int ff_sse16_mmx(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2,
 +                 int line_size, int h);
 +int ff_sse16_sse2(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2,
 +                  int line_size, int h);
 +int ff_hf_noise8_mmx(uint8_t *pix1, int lsize, int h);
 +int ff_hf_noise16_mmx(uint8_t *pix1, int lsize, int h);
  
 -#if HAVE_INLINE_ASM
 -
 -static int sse8_mmx(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2,
 -                    int line_size, int h)
 -{
 -    int tmp;
 -
 -    __asm__ volatile (
 -        "movl         %4, %%ecx          \n"
 -        "shr          $1, %%ecx          \n"
 -        "pxor      %%mm0, %%mm0          \n" /* mm0 = 0 */
 -        "pxor      %%mm7, %%mm7          \n" /* mm7 holds the sum */
 -        "1:                              \n"
 -        "movq       (%0), %%mm1          \n" /* mm1 = pix1[0][0 - 7] */
 -        "movq       (%1), %%mm2          \n" /* mm2 = pix2[0][0 - 7] */
 -        "movq   (%0, %3), %%mm3          \n" /* mm3 = pix1[1][0 - 7] */
 -        "movq   (%1, %3), %%mm4          \n" /* mm4 = pix2[1][0 - 7] */
 -
 -        /* todo: mm1-mm2, mm3-mm4 */
 -        /* algo: subtract mm1 from mm2 with saturation and vice versa */
 -        /*       OR the results to get absolute difference */
 -        "movq      %%mm1, %%mm5          \n"
 -        "movq      %%mm3, %%mm6          \n"
 -        "psubusb   %%mm2, %%mm1          \n"
 -        "psubusb   %%mm4, %%mm3          \n"
 -        "psubusb   %%mm5, %%mm2          \n"
 -        "psubusb   %%mm6, %%mm4          \n"
 -
 -        "por       %%mm1, %%mm2          \n"
 -        "por       %%mm3, %%mm4          \n"
 -
 -        /* now convert to 16-bit vectors so we can square them */
 -        "movq      %%mm2, %%mm1          \n"
 -        "movq      %%mm4, %%mm3          \n"
 -
 -        "punpckhbw %%mm0, %%mm2          \n"
 -        "punpckhbw %%mm0, %%mm4          \n"
 -        "punpcklbw %%mm0, %%mm1          \n" /* mm1 now spread over (mm1, mm2) */
 -        "punpcklbw %%mm0, %%mm3          \n" /* mm4 now spread over (mm3, mm4) */
 -
 -        "pmaddwd   %%mm2, %%mm2          \n"
 -        "pmaddwd   %%mm4, %%mm4          \n"
 -        "pmaddwd   %%mm1, %%mm1          \n"
 -        "pmaddwd   %%mm3, %%mm3          \n"
 -
 -        "lea (%0, %3, 2), %0             \n" /* pix1 += 2 * line_size */
 -        "lea (%1, %3, 2), %1             \n" /* pix2 += 2 * line_size */
 -
 -        "paddd     %%mm2, %%mm1          \n"
 -        "paddd     %%mm4, %%mm3          \n"
 -        "paddd     %%mm1, %%mm7          \n"
 -        "paddd     %%mm3, %%mm7          \n"
 -
 -        "decl      %%ecx                 \n"
 -        "jnz       1b                    \n"
 -
 -        "movq      %%mm7, %%mm1          \n"
 -        "psrlq       $32, %%mm7          \n" /* shift hi dword to lo */
 -        "paddd     %%mm7, %%mm1          \n"
 -        "movd      %%mm1, %2             \n"
 -        : "+r" (pix1), "+r" (pix2), "=r" (tmp)
 -        : "r" ((x86_reg) line_size), "m" (h)
 -        : "%ecx");
 -
 -    return tmp;
 -}
 -
 -static int sse16_mmx(MpegEncContext *v, uint8_t *pix1, uint8_t *pix2,
 -                     int line_size, int h)
 -{
 -    int tmp;
 -
 -    __asm__ volatile (
 -        "movl %4, %%ecx\n"
 -        "pxor %%mm0, %%mm0\n"    /* mm0 = 0 */
 -        "pxor %%mm7, %%mm7\n"    /* mm7 holds the sum */
 -        "1:\n"
 -        "movq (%0), %%mm1\n"     /* mm1 = pix1[0 -  7] */
 -        "movq (%1), %%mm2\n"     /* mm2 = pix2[0 -  7] */
 -        "movq 8(%0), %%mm3\n"    /* mm3 = pix1[8 - 15] */
 -        "movq 8(%1), %%mm4\n"    /* mm4 = pix2[8 - 15] */
 -
 -        /* todo: mm1-mm2, mm3-mm4 */
 -        /* algo: subtract mm1 from mm2 with saturation and vice versa */
 -        /*       OR the results to get absolute difference */
 -        "movq %%mm1, %%mm5\n"
 -        "movq %%mm3, %%mm6\n"
 -        "psubusb %%mm2, %%mm1\n"
 -        "psubusb %%mm4, %%mm3\n"
 -        "psubusb %%mm5, %%mm2\n"
 -        "psubusb %%mm6, %%mm4\n"
 -
 -        "por %%mm1, %%mm2\n"
 -        "por %%mm3, %%mm4\n"
 -
 -        /* now convert to 16-bit vectors so we can square them */
 -        "movq %%mm2, %%mm1\n"
 -        "movq %%mm4, %%mm3\n"
 -
 -        "punpckhbw %%mm0, %%mm2\n"
 -        "punpckhbw %%mm0, %%mm4\n"
 -        "punpcklbw %%mm0, %%mm1\n" /* mm1 now spread over (mm1, mm2) */
 -        "punpcklbw %%mm0, %%mm3\n" /* mm4 now spread over (mm3, mm4) */
 -
 -        "pmaddwd %%mm2, %%mm2\n"
 -        "pmaddwd %%mm4, %%mm4\n"
 -        "pmaddwd %%mm1, %%mm1\n"
 -        "pmaddwd %%mm3, %%mm3\n"
 -
 -        "add %3, %0\n"
 -        "add %3, %1\n"
 -
 -        "paddd %%mm2, %%mm1\n"
 -        "paddd %%mm4, %%mm3\n"
 -        "paddd %%mm1, %%mm7\n"
 -        "paddd %%mm3, %%mm7\n"
 -
 -        "decl %%ecx\n"
 -        "jnz 1b\n"
 -
 -        "movq %%mm7, %%mm1\n"
 -        "psrlq $32, %%mm7\n"    /* shift hi dword to lo */
 -        "paddd %%mm7, %%mm1\n"
 -        "movd %%mm1, %2\n"
 -        : "+r" (pix1), "+r" (pix2), "=r" (tmp)
 -        : "r" ((x86_reg) line_size), "m" (h)
 -        : "%ecx");
 -
 -    return tmp;
 -}
 -
 -static int hf_noise8_mmx(uint8_t *pix1, int line_size, int h)
 -{
 -    int tmp;
 -
 -    __asm__ volatile (
 -        "movl %3, %%ecx\n"
 -        "pxor %%mm7, %%mm7\n"
 -        "pxor %%mm6, %%mm6\n"
 -
 -        "movq (%0), %%mm0\n"
 -        "movq %%mm0, %%mm1\n"
 -        "psllq $8, %%mm0\n"
 -        "psrlq $8, %%mm1\n"
 -        "psrlq $8, %%mm0\n"
 -        "movq %%mm0, %%mm2\n"
 -        "movq %%mm1, %%mm3\n"
 -        "punpcklbw %%mm7, %%mm0\n"
 -        "punpcklbw %%mm7, %%mm1\n"
 -        "punpckhbw %%mm7, %%mm2\n"
 -        "punpckhbw %%mm7, %%mm3\n"
 -        "psubw %%mm1, %%mm0\n"
 -        "psubw %%mm3, %%mm2\n"
 -
 -        "add %2, %0\n"
 -
 -        "movq (%0), %%mm4\n"
 -        "movq %%mm4, %%mm1\n"
 -        "psllq $8, %%mm4\n"
 -        "psrlq $8, %%mm1\n"
 -        "psrlq $8, %%mm4\n"
 -        "movq %%mm4, %%mm5\n"
 -        "movq %%mm1, %%mm3\n"
 -        "punpcklbw %%mm7, %%mm4\n"
 -        "punpcklbw %%mm7, %%mm1\n"
 -        "punpckhbw %%mm7, %%mm5\n"
 -        "punpckhbw %%mm7, %%mm3\n"
 -        "psubw %%mm1, %%mm4\n"
 -        "psubw %%mm3, %%mm5\n"
 -        "psubw %%mm4, %%mm0\n"
 -        "psubw %%mm5, %%mm2\n"
 -        "pxor %%mm3, %%mm3\n"
 -        "pxor %%mm1, %%mm1\n"
 -        "pcmpgtw %%mm0, %%mm3\n\t"
 -        "pcmpgtw %%mm2, %%mm1\n\t"
 -        "pxor %%mm3, %%mm0\n"
 -        "pxor %%mm1, %%mm2\n"
 -        "psubw %%mm3, %%mm0\n"
 -        "psubw %%mm1, %%mm2\n"
 -        "paddw %%mm0, %%mm2\n"
 -        "paddw %%mm2, %%mm6\n"
 -
 -        "add %2, %0\n"
 -        "1:\n"
 -
 -        "movq (%0), %%mm0\n"
 -        "movq %%mm0, %%mm1\n"
 -        "psllq $8, %%mm0\n"
 -        "psrlq $8, %%mm1\n"
 -        "psrlq $8, %%mm0\n"
 -        "movq %%mm0, %%mm2\n"
 -        "movq %%mm1, %%mm3\n"
 -        "punpcklbw %%mm7, %%mm0\n"
 -        "punpcklbw %%mm7, %%mm1\n"
 -        "punpckhbw %%mm7, %%mm2\n"
 -        "punpckhbw %%mm7, %%mm3\n"
 -        "psubw %%mm1, %%mm0\n"
 -        "psubw %%mm3, %%mm2\n"
 -        "psubw %%mm0, %%mm4\n"
 -        "psubw %%mm2, %%mm5\n"
 -        "pxor  %%mm3, %%mm3\n"
 -        "pxor  %%mm1, %%mm1\n"
 -        "pcmpgtw %%mm4, %%mm3\n\t"
 -        "pcmpgtw %%mm5, %%mm1\n\t"
 -        "pxor  %%mm3, %%mm4\n"
 -        "pxor  %%mm1, %%mm5\n"
 -        "psubw %%mm3, %%mm4\n"
 -        "psubw %%mm1, %%mm5\n"
 -        "paddw %%mm4, %%mm5\n"
 -        "paddw %%mm5, %%mm6\n"
 -
 -        "add %2, %0\n"
 -
 -        "movq (%0), %%mm4\n"
 -        "movq      %%mm4, %%mm1\n"
 -        "psllq $8, %%mm4\n"
 -        "psrlq $8, %%mm1\n"
 -        "psrlq $8, %%mm4\n"
 -        "movq      %%mm4, %%mm5\n"
 -        "movq      %%mm1, %%mm3\n"
 -        "punpcklbw %%mm7, %%mm4\n"
 -        "punpcklbw %%mm7, %%mm1\n"
 -        "punpckhbw %%mm7, %%mm5\n"
 -        "punpckhbw %%mm7, %%mm3\n"
 -        "psubw     %%mm1, %%mm4\n"
 -        "psubw     %%mm3, %%mm5\n"
 -        "psubw     %%mm4, %%mm0\n"
 -        "psubw     %%mm5, %%mm2\n"
 -        "pxor      %%mm3, %%mm3\n"
 -        "pxor      %%mm1, %%mm1\n"
 -        "pcmpgtw   %%mm0, %%mm3\n\t"
 -        "pcmpgtw   %%mm2, %%mm1\n\t"
 -        "pxor      %%mm3, %%mm0\n"
 -        "pxor      %%mm1, %%mm2\n"
 -        "psubw     %%mm3, %%mm0\n"
 -        "psubw     %%mm1, %%mm2\n"
 -        "paddw     %%mm0, %%mm2\n"
 -        "paddw     %%mm2, %%mm6\n"
 -
 -        "add  %2, %0\n"
 -        "subl $2, %%ecx\n"
 -        " jnz 1b\n"
 -
 -        "movq      %%mm6, %%mm0\n"
 -        "punpcklwd %%mm7, %%mm0\n"
 -        "punpckhwd %%mm7, %%mm6\n"
 -        "paddd     %%mm0, %%mm6\n"
 -
 -        "movq  %%mm6, %%mm0\n"
 -        "psrlq $32,   %%mm6\n"
 -        "paddd %%mm6, %%mm0\n"
 -        "movd  %%mm0, %1\n"
 -        : "+r" (pix1), "=r" (tmp)
 -        : "r" ((x86_reg) line_size), "g" (h - 2)
 -        : "%ecx");
 -
 -    return tmp;
 -}
 -
 -static int hf_noise16_mmx(uint8_t *pix1, int line_size, int h)
 -{
 -    int tmp;
 -    uint8_t *pix = pix1;
 -
 -    __asm__ volatile (
 -        "movl %3, %%ecx\n"
 -        "pxor %%mm7, %%mm7\n"
 -        "pxor %%mm6, %%mm6\n"
 -
 -        "movq (%0), %%mm0\n"
 -        "movq 1(%0), %%mm1\n"
 -        "movq %%mm0, %%mm2\n"
 -        "movq %%mm1, %%mm3\n"
 -        "punpcklbw %%mm7, %%mm0\n"
 -        "punpcklbw %%mm7, %%mm1\n"
 -        "punpckhbw %%mm7, %%mm2\n"
 -        "punpckhbw %%mm7, %%mm3\n"
 -        "psubw %%mm1, %%mm0\n"
 -        "psubw %%mm3, %%mm2\n"
 -
 -        "add %2, %0\n"
 -
 -        "movq (%0), %%mm4\n"
 -        "movq 1(%0), %%mm1\n"
 -        "movq %%mm4, %%mm5\n"
 -        "movq %%mm1, %%mm3\n"
 -        "punpcklbw %%mm7, %%mm4\n"
 -        "punpcklbw %%mm7, %%mm1\n"
 -        "punpckhbw %%mm7, %%mm5\n"
 -        "punpckhbw %%mm7, %%mm3\n"
 -        "psubw %%mm1, %%mm4\n"
 -        "psubw %%mm3, %%mm5\n"
 -        "psubw %%mm4, %%mm0\n"
 -        "psubw %%mm5, %%mm2\n"
 -        "pxor %%mm3, %%mm3\n"
 -        "pxor %%mm1, %%mm1\n"
 -        "pcmpgtw %%mm0, %%mm3\n\t"
 -        "pcmpgtw %%mm2, %%mm1\n\t"
 -        "pxor %%mm3, %%mm0\n"
 -        "pxor %%mm1, %%mm2\n"
 -        "psubw %%mm3, %%mm0\n"
 -        "psubw %%mm1, %%mm2\n"
 -        "paddw %%mm0, %%mm2\n"
 -        "paddw %%mm2, %%mm6\n"
 -
 -        "add %2, %0\n"
 -        "1:\n"
 -
 -        "movq (%0), %%mm0\n"
 -        "movq 1(%0), %%mm1\n"
 -        "movq %%mm0, %%mm2\n"
 -        "movq %%mm1, %%mm3\n"
 -        "punpcklbw %%mm7, %%mm0\n"
 -        "punpcklbw %%mm7, %%mm1\n"
 -        "punpckhbw %%mm7, %%mm2\n"
 -        "punpckhbw %%mm7, %%mm3\n"
 -        "psubw %%mm1, %%mm0\n"
 -        "psubw %%mm3, %%mm2\n"
 -        "psubw %%mm0, %%mm4\n"
 -        "psubw %%mm2, %%mm5\n"
 -        "pxor %%mm3, %%mm3\n"
 -        "pxor %%mm1, %%mm1\n"
 -        "pcmpgtw %%mm4, %%mm3\n\t"
 -        "pcmpgtw %%mm5, %%mm1\n\t"
 -        "pxor %%mm3, %%mm4\n"
 -        "pxor %%mm1, %%mm5\n"
 -        "psubw %%mm3, %%mm4\n"
 -        "psubw %%mm1, %%mm5\n"
 -        "paddw %%mm4, %%mm5\n"
 -        "paddw %%mm5, %%mm6\n"
 -
 -        "add %2, %0\n"
 -
 -        "movq (%0), %%mm4\n"
 -        "movq 1(%0), %%mm1\n"
 -        "movq %%mm4, %%mm5\n"
 -        "movq %%mm1, %%mm3\n"
 -        "punpcklbw %%mm7, %%mm4\n"
 -        "punpcklbw %%mm7, %%mm1\n"
 -        "punpckhbw %%mm7, %%mm5\n"
 -        "punpckhbw %%mm7, %%mm3\n"
 -        "psubw %%mm1, %%mm4\n"
 -        "psubw %%mm3, %%mm5\n"
 -        "psubw %%mm4, %%mm0\n"
 -        "psubw %%mm5, %%mm2\n"
 -        "pxor %%mm3, %%mm3\n"
 -        "pxor %%mm1, %%mm1\n"
 -        "pcmpgtw %%mm0, %%mm3\n\t"
 -        "pcmpgtw %%mm2, %%mm1\n\t"
 -        "pxor %%mm3, %%mm0\n"
 -        "pxor %%mm1, %%mm2\n"
 -        "psubw %%mm3, %%mm0\n"
 -        "psubw %%mm1, %%mm2\n"
 -        "paddw %%mm0, %%mm2\n"
 -        "paddw %%mm2, %%mm6\n"
 -
 -        "add %2, %0\n"
 -        "subl $2, %%ecx\n"
 -        " jnz 1b\n"
 -
 -        "movq %%mm6, %%mm0\n"
 -        "punpcklwd %%mm7, %%mm0\n"
 -        "punpckhwd %%mm7, %%mm6\n"
 -        "paddd %%mm0, %%mm6\n"
 +#define hadamard_func(cpu)                                              \
 +    int ff_hadamard8_diff_ ## cpu(MpegEncContext *s, uint8_t *src1,     \
 +                                  uint8_t *src2, int stride, int h);    \
 +    int ff_hadamard8_diff16_ ## cpu(MpegEncContext *s, uint8_t *src1,   \
 +                                    uint8_t *src2, int stride, int h);
  
 -        "movq %%mm6, %%mm0\n"
 -        "psrlq $32, %%mm6\n"
 -        "paddd %%mm6, %%mm0\n"
 -        "movd %%mm0, %1\n"
 -        : "+r" (pix1), "=r" (tmp)
 -        : "r" ((x86_reg) line_size), "g" (h - 2)
 -        : "%ecx");
 +hadamard_func(mmx)
 +hadamard_func(mmxext)
 +hadamard_func(sse2)
 +hadamard_func(ssse3)
  
 -    return tmp + hf_noise8_mmx(pix + 8, line_size, h);
 -}
 +#if HAVE_YASM
  
  static int nsse16_mmx(MpegEncContext *c, uint8_t *pix1, uint8_t *pix2,
                        int line_size, int h)
@@@ -429,10 -894,6 +422,8 @@@ av_cold void ff_dsputilenc_init_mmx(DSP
  
      if (EXTERNAL_SSE2(cpu_flags)) {
          c->sse[0] = ff_sse16_sse2;
-         c->pix_sum     = ff_pix_sum16_sse2;
-         c->pix_norm1   = ff_pix_norm1_sse2;
 +        c->sum_abs_dctelem   = ff_sum_abs_dctelem_sse2;
 +        c->diff_pixels = ff_diff_pixels_sse2;
  
  #if HAVE_ALIGNED_STACK
          c->hadamard8_diff[0] = ff_hadamard8_diff16_sse2;
  #endif
      }
  
 -    if (EXTERNAL_SSSE3(cpu_flags) && HAVE_ALIGNED_STACK) {
 +    if (EXTERNAL_SSSE3(cpu_flags)) {
 +        c->sum_abs_dctelem   = ff_sum_abs_dctelem_ssse3;
 +#if HAVE_ALIGNED_STACK
          c->hadamard8_diff[0] = ff_hadamard8_diff16_ssse3;
          c->hadamard8_diff[1] = ff_hadamard8_diff_ssse3;
 +#endif
      }
  
-     if (EXTERNAL_XOP(cpu_flags)) {
-         c->pix_sum           = ff_pix_sum16_xop;
-     }
      ff_dsputil_init_pix_mmx(c, avctx);
  }
index 0000000,9326ee7..4fe6cfe
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,95 +1,137 @@@
 -;* This file is part of Libav.
+ ;*****************************************************************************
+ ;* SIMD-optimized MPEG encoding functions
+ ;*****************************************************************************
+ ;* Copyright (c) 2000, 2001 Fabrice Bellard
+ ;* Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
+ ;*
 -;* Libav is free software; you can redistribute it and/or
++;* This file is part of FFmpeg.
+ ;*
 -;* Libav is distributed in the hope that it will be useful,
++;* 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.
+ ;*
 -;* License along with Libav; if not, write to the Free Software
++;* 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
 -SECTION .text
++;* License along with FFmpeg; if not, write to the Free Software
+ ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ ;*****************************************************************************
+ %include "libavutil/x86/x86util.asm"
 -INIT_MMX mmx
++SECTION_RODATA
 -cglobal pix_sum16, 2, 3
++cextern pw_1
++
++SECTION .text
+ ; int ff_pix_sum16_mmx(uint8_t *pix, int line_size)
 -    mov          r2, r1
 -    neg          r2
 -    shl          r2, 4
 -    sub          r0, r2
 -    pxor         m7, m7
 -    pxor         m6, m6
++; %1 = number of xmm registers used
++; %2 = number of loops
++; %3 = number of GPRs used
++%macro PIX_SUM16 4
++cglobal pix_sum16, 2, %3, %1
+     movsxdifnidn r1, r1d
 -    mova         m0, [r0+r2+0]
 -    mova         m1, [r0+r2+0]
 -    mova         m2, [r0+r2+8]
 -    mova         m3, [r0+r2+8]
 -    punpcklbw    m0, m7
 -    punpckhbw    m1, m7
 -    punpcklbw    m2, m7
 -    punpckhbw    m3, m7
++    mov          r2, %2
++%if cpuflag(xop)
++    lea          r3, [r1*3]
++%else
++    pxor         m5, m5
++%endif
++    pxor         m4, m4
+ .loop:
 -    paddw        m6, m3
 -    add          r2, r1
 -    js .loop
 -    mova         m5, m6
 -    psrlq        m6, 32
 -    paddw        m6, m5
 -    mova         m5, m6
 -    psrlq        m6, 16
 -    paddw        m6, m5
 -    movd        eax, m6
 -    and         eax, 0xffff
++%if cpuflag(xop)
++    vphaddubq    m0, [r0]
++    vphaddubq    m1, [r0+r1]
++    vphaddubq    m2, [r0+r1*2]
++    vphaddubq    m3, [r0+r3]
++%else
++    mova         m0, [r0]
++%if mmsize == 8
++    mova         m1, [r0+8]
++%else
++    mova         m1, [r0+r1]
++%endif
++    punpckhbw    m2, m0, m5
++    punpcklbw    m0, m5
++    punpckhbw    m3, m1, m5
++    punpcklbw    m1, m5
++%endif ; cpuflag(xop)
+     paddw        m1, m0
+     paddw        m3, m2
+     paddw        m3, m1
 -cglobal pix_norm1, 2, 4
++    paddw        m4, m3
++%if mmsize == 8
++    add          r0, r1
++%else
++    lea          r0, [r0+r1*%4]
++%endif
++    dec r2
++    jne .loop
++%if cpuflag(xop)
++    pshufd       m0, m4, q0032
++    paddd        m4, m0
++%else
++    HADDW        m4, m5
++%endif
++    movd        eax, m4
+     RET
++%endmacro
+ INIT_MMX mmx
++PIX_SUM16 0, 16, 3, 0
++INIT_XMM sse2
++PIX_SUM16 6, 8,  3, 2
++%if HAVE_XOP_EXTERNAL
++INIT_XMM xop
++PIX_SUM16 5, 4,  4, 4
++%endif
++
+ ; int ff_pix_norm1_mmx(uint8_t *pix, int line_size)
 -    mov          r2, 16
++; %1 = number of xmm registers used
++; %2 = number of loops
++%macro PIX_NORM1 2
++cglobal pix_norm1, 2, 3, %1
+     movsxdifnidn r1, r1d
 -    pxor         m7, m7
++    mov          r2, %2
+     pxor         m0, m0
 -    mova         m1, m2
 -    punpckhbw    m1, m0
++    pxor         m5, m5
+ .loop:
+     mova         m2, [r0+0]
++%if mmsize == 8
+     mova         m3, [r0+8]
 -    mova         m4, m3
 -    punpckhbw    m3, m0
 -    punpcklbw    m4, m0
++%else
++    mova         m3, [r0+r1]
++%endif
++    punpckhbw    m1, m2, m0
+     punpcklbw    m2, m0
 -    paddd        m7, m2
++    punpckhbw    m4, m3, m0
++    punpcklbw    m3, m0
+     pmaddwd      m1, m1
+     pmaddwd      m2, m2
+     pmaddwd      m3, m3
+     pmaddwd      m4, m4
+     paddd        m2, m1
+     paddd        m4, m3
 -    paddd        m7, m4
++    paddd        m5, m2
++    paddd        m5, m4
++%if mmsize == 8
+     add          r0, r1
 -    mova         m1, m7
 -    psrlq        m7, 32
 -    paddd        m1, m7
 -    movd        eax, m1
++%else
++    lea          r0, [r0+r1*2]
++%endif
+     dec r2
+     jne .loop
++    HADDD        m5, m1
++    movd        eax, m5
+     RET
++%endmacro
++
++INIT_MMX mmx
++PIX_NORM1 0, 16
++INIT_XMM sse2
++PIX_NORM1 6, 8
  #include "libavcodec/avcodec.h"
  #include "libavcodec/mpegvideoencdsp.h"
  
+ int ff_pix_sum16_mmx(uint8_t *pix, int line_size);
++int ff_pix_sum16_sse2(uint8_t *pix, int line_size);
++int ff_pix_sum16_xop(uint8_t *pix, int line_size);
+ int ff_pix_norm1_mmx(uint8_t *pix, int line_size);
++int ff_pix_norm1_sse2(uint8_t *pix, int line_size);
  #if HAVE_INLINE_ASM
  
  #define PHADDD(a, t)                            \
  av_cold void ff_mpegvideoencdsp_init_x86(MpegvideoEncDSPContext *c,
                                           AVCodecContext *avctx)
  {
- #if HAVE_INLINE_ASM
      int cpu_flags = av_get_cpu_flags();
  
+     if (EXTERNAL_MMX(cpu_flags)) {
+         c->pix_sum   = ff_pix_sum16_mmx;
+         c->pix_norm1 = ff_pix_norm1_mmx;
+     }
++    if (EXTERNAL_SSE2(cpu_flags)) {
++        c->pix_sum     = ff_pix_sum16_sse2;
++        c->pix_norm1   = ff_pix_norm1_sse2;
++    }
++
++    if (EXTERNAL_XOP(cpu_flags)) {
++        c->pix_sum     = ff_pix_sum16_xop;
++    }
++
+ #if HAVE_INLINE_ASM
      if (INLINE_MMX(cpu_flags)) {
          if (!(avctx->flags & CODEC_FLAG_BITEXACT)) {
              c->try_8x8basis = try_8x8basis_mmx;