Advertisement
Guest User

Untitled

a guest
Jul 21st, 2017
459
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 114.65 KB | None | 0 0
  1. From 4b02d14340062021871b44a010396855c991183f Mon Sep 17 00:00:00 2001
  2. From: Daniel Kang <daniel.d.kang@gmail.com>
  3. Date: Sat, 15 Jan 2011 13:44:45 -0500
  4. Subject: [PATCH] Add AVX functions where 3+ arg commands are useful.
  5.  
  6. TODO in later patches:
  7. Change functions to use the move approach in AVX SUMSUB*
  8.  
  9. AVX palignr
  10.  
  11. Port predict functions to avx
  12. ---
  13. common/bitstream.c         |    3 +
  14.  common/dct.c               |   29 ++++++
  15.  common/deblock.c           |   26 ++++++
  16.  common/pixel.c             |   24 +++++
  17.  common/quant.c             |    3 +
  18.  common/x86/bitstream-a.asm |   18 ++--
  19.  common/x86/dct-32.asm      |   50 ++++-------
  20.  common/x86/dct-64.asm      |   31 +++----
  21.  common/x86/dct-a.asm       |  150 ++++++++++++++++---------------
  22.  common/x86/dct.h           |    8 ++
  23.  common/x86/deblock-a.asm   |  209 +++++++++++++++++++++++++-----------------
  24.  common/x86/mc-a.asm        |   65 ++++++++------
  25.  common/x86/mc-a2.asm       |  153 ++++++++++++++++---------------
  26.  common/x86/mc-c.c          |   47 ++++++++++-
  27.  common/x86/pixel-a.asm     |  140 ++++++++++++++++-------------
  28.  common/x86/pixel.h         |   16 +++-
  29.  common/x86/predict-a.asm   |  216 ++++++++++++++++++++++----------------------
  30.  common/x86/predict-c.c     |   40 ++++++++
  31.  common/x86/quant-a.asm     |   23 +++--
  32.  common/x86/quant.h         |    3 +
  33.  common/x86/sad-a.asm       |   21 ++---
  34.  common/x86/x86inc.asm      |    2 +
  35.  common/x86/x86util.asm     |   69 ++++++++++-----
  36.  23 files changed, 808 insertions(+), 538 deletions(-)
  37.  
  38. diff --git a/common/bitstream.c b/common/bitstream.c
  39. index 5acffd0..d7c2c51 100644
  40. --- a/common/bitstream.c
  41. +++ b/common/bitstream.c
  42. @@ -42,6 +42,7 @@ static uint8_t *x264_nal_escape_c( uint8_t *dst, uint8_t *src, uint8_t *end )
  43.  #if HAVE_MMX
  44.  uint8_t *x264_nal_escape_mmxext( uint8_t *dst, uint8_t *src, uint8_t *end );
  45.  uint8_t *x264_nal_escape_sse2( uint8_t *dst, uint8_t *src, uint8_t *end );
  46. +uint8_t *x264_nal_escape_avx( uint8_t *dst, uint8_t *src, uint8_t *end );
  47.  #endif
  48.  
  49.  /****************************************************************************
  50. @@ -93,5 +94,7 @@ void x264_bitstream_init( int cpu, x264_bitstream_function_t *pf )
  51.          pf->nal_escape = x264_nal_escape_mmxext;
  52.      if( (cpu&X264_CPU_SSE2) && (cpu&X264_CPU_SSE2_IS_FAST) )
  53.          pf->nal_escape = x264_nal_escape_sse2;
  54. +    if( cpu&X264_CPU_AVX )
  55. +        pf->nal_escape = x264_nal_escape_avx;
  56.  #endif
  57.  }
  58. diff --git a/common/dct.c b/common/dct.c
  59. index fef004e..22bd4d7 100644
  60. --- a/common/dct.c
  61. +++ b/common/dct.c
  62. @@ -738,6 +738,8 @@ void x264_zigzag_init( int cpu, x264_zigzag_function_t *pf, int b_interlaced )
  63.              pf->scan_4x4 = x264_zigzag_scan_4x4_field_sse2;
  64.          if( cpu&X264_CPU_SSE4 )
  65.              pf->scan_8x8 = x264_zigzag_scan_8x8_field_sse4;
  66. +        if( cpu&X264_CPU_AVX )
  67. +            pf->scan_8x8 = x264_zigzag_scan_8x8_field_avx;
  68.  #endif // HAVE_MMX
  69.  #else
  70.  #if HAVE_MMX
  71. @@ -751,6 +753,13 @@ void x264_zigzag_init( int cpu, x264_zigzag_function_t *pf, int b_interlaced )
  72.              pf->sub_4x4  = x264_zigzag_sub_4x4_field_ssse3;
  73.              pf->sub_4x4ac= x264_zigzag_sub_4x4ac_field_ssse3;
  74.          }
  75. +        if( cpu&X264_CPU_AVX )
  76. +        {
  77. +            pf->sub_4x4  = x264_zigzag_sub_4x4_field_avx;
  78. +#if ARCH_X86_64
  79. +            pf->sub_4x4ac= x264_zigzag_sub_4x4ac_field_avx;
  80. +#endif
  81. +        }
  82.  #endif // HAVE_MMX
  83.  #if HAVE_ALTIVEC
  84.          if( cpu&X264_CPU_ALTIVEC )
  85. @@ -772,6 +781,13 @@ void x264_zigzag_init( int cpu, x264_zigzag_function_t *pf, int b_interlaced )
  86.              pf->scan_4x4 = x264_zigzag_scan_4x4_frame_sse2;
  87.              pf->scan_8x8 = x264_zigzag_scan_8x8_frame_sse2;
  88.          }
  89. +#if ARCH_X86_64
  90. +        if( cpu&X264_CPU_AVX )
  91. +        {
  92. +            pf->scan_4x4 = x264_zigzag_scan_4x4_frame_avx;
  93. +            pf->scan_8x8 = x264_zigzag_scan_8x8_frame_avx;
  94. +        }
  95. +#endif // ARCH_X86_64
  96.  #endif // HAVE_MMX
  97.  #else
  98.  #if HAVE_MMX
  99. @@ -789,6 +805,15 @@ void x264_zigzag_init( int cpu, x264_zigzag_function_t *pf, int b_interlaced )
  100.              if( cpu&X264_CPU_SHUFFLE_IS_FAST )
  101.                  pf->scan_4x4 = x264_zigzag_scan_4x4_frame_ssse3;
  102.          }
  103. +        if( cpu&X264_CPU_AVX )
  104. +        {
  105. +            pf->sub_4x4  = x264_zigzag_sub_4x4_frame_avx;
  106. +#if ARCH_X86_64
  107. +            pf->sub_4x4ac= x264_zigzag_sub_4x4ac_frame_avx;
  108. +#endif
  109. +            if( cpu&X264_CPU_SHUFFLE_IS_FAST )
  110. +                pf->scan_4x4 = x264_zigzag_scan_4x4_frame_avx; // review please, I don't actually know what X264_CPU_SHUFFLE_IS_FAST is
  111. +        }
  112.  #endif // HAVE_MMX
  113.  #if HAVE_ALTIVEC
  114.          if( cpu&X264_CPU_ALTIVEC )
  115. @@ -806,11 +831,15 @@ void x264_zigzag_init( int cpu, x264_zigzag_function_t *pf, int b_interlaced )
  116.  #if HIGH_BIT_DEPTH
  117.      if( cpu&X264_CPU_SSE2 )
  118.          pf->interleave_8x8_cavlc = x264_zigzag_interleave_8x8_cavlc_sse2;
  119. +    if( cpu&X264_CPU_AVX )
  120. +        pf->interleave_8x8_cavlc = x264_zigzag_interleave_8x8_cavlc_avx;
  121.  #else
  122.      if( cpu&X264_CPU_MMX )
  123.          pf->interleave_8x8_cavlc = x264_zigzag_interleave_8x8_cavlc_mmx;
  124.      if( cpu&X264_CPU_SHUFFLE_IS_FAST )
  125.          pf->interleave_8x8_cavlc = x264_zigzag_interleave_8x8_cavlc_sse2;
  126. +    if( cpu&X264_CPU_AVX )
  127. +        pf->interleave_8x8_cavlc = x264_zigzag_interleave_8x8_cavlc_avx;
  128.  #endif // HIGH_BIT_DEPTH
  129.  #endif
  130.  }
  131. diff --git a/common/deblock.c b/common/deblock.c
  132. index ff7c99f..5122068 100644
  133. --- a/common/deblock.c
  134. +++ b/common/deblock.c
  135. @@ -437,12 +437,20 @@ void x264_macroblock_deblock( x264_t *h )
  136.  
  137.  #if HAVE_MMX
  138.  void x264_deblock_v_luma_sse2( pixel *pix, int stride, int alpha, int beta, int8_t *tc0 );
  139. +void x264_deblock_v_luma_avx ( pixel *pix, int stride, int alpha, int beta, int8_t *tc0 );
  140.  void x264_deblock_h_luma_sse2( pixel *pix, int stride, int alpha, int beta, int8_t *tc0 );
  141. +void x264_deblock_h_luma_avx ( pixel *pix, int stride, int alpha, int beta, int8_t *tc0 );
  142. +void x264_deblock_v_chroma_avx ( pixel *pix, int stride, int alpha, int beta, int8_t *tc0 );
  143.  void x264_deblock_v_chroma_sse2( pixel *pix, int stride, int alpha, int beta, int8_t *tc0 );
  144. +void x264_deblock_h_chroma_avx ( pixel *pix, int stride, int alpha, int beta, int8_t *tc0 );
  145.  void x264_deblock_h_chroma_sse2( pixel *pix, int stride, int alpha, int beta, int8_t *tc0 );
  146. +void x264_deblock_v_luma_intra_avx ( pixel *pix, int stride, int alpha, int beta );
  147.  void x264_deblock_v_luma_intra_sse2( pixel *pix, int stride, int alpha, int beta );
  148. +void x264_deblock_h_luma_intra_avx ( pixel *pix, int stride, int alpha, int beta );
  149.  void x264_deblock_h_luma_intra_sse2( pixel *pix, int stride, int alpha, int beta );
  150. +void x264_deblock_v_chroma_intra_avx ( pixel *pix, int stride, int alpha, int beta );
  151.  void x264_deblock_v_chroma_intra_sse2( pixel *pix, int stride, int alpha, int beta );
  152. +void x264_deblock_h_chroma_intra_avx ( pixel *pix, int stride, int alpha, int beta );
  153.  void x264_deblock_h_chroma_intra_sse2( pixel *pix, int stride, int alpha, int beta );
  154.  void x264_deblock_strength_mmxext( uint8_t nnz[X264_SCAN8_SIZE], int8_t ref[2][X264_SCAN8_LUMA_SIZE],
  155.                                     int16_t mv[2][X264_SCAN8_LUMA_SIZE][2], uint8_t bs[2][4][4],
  156. @@ -453,6 +461,9 @@ void x264_deblock_strength_sse2  ( uint8_t nnz[X264_SCAN8_SIZE], int8_t ref[2][X
  157.  void x264_deblock_strength_ssse3 ( uint8_t nnz[X264_SCAN8_SIZE], int8_t ref[2][X264_SCAN8_LUMA_SIZE],
  158.                                     int16_t mv[2][X264_SCAN8_LUMA_SIZE][2], uint8_t bs[2][4][4],
  159.                                     int mvy_limit, int bframe );
  160. +void x264_deblock_strength_avx   ( uint8_t nnz[X264_SCAN8_SIZE], int8_t ref[2][X264_SCAN8_LUMA_SIZE],
  161. +                                   int16_t mv[2][X264_SCAN8_LUMA_SIZE][2], uint8_t bs[2][4][4],
  162. +                                   int mvy_limit, int bframe );
  163.  #if ARCH_X86
  164.  void x264_deblock_h_luma_mmxext( pixel *pix, int stride, int alpha, int beta, int8_t *tc0 );
  165.  void x264_deblock_v8_luma_mmxext( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 );
  166. @@ -537,6 +548,21 @@ void x264_deblock_init( int cpu, x264_deblock_function_t *pf )
  167.          }
  168.          if( cpu&X264_CPU_SSSE3 )
  169.              pf->deblock_strength = x264_deblock_strength_ssse3;
  170. +        if( cpu&X264_CPU_AVX )
  171. +        {
  172. +            pf->deblock_strength = x264_deblock_strength_avx;
  173. +            if( !(cpu&X264_CPU_STACK_MOD4) )
  174. +            {
  175. +                pf->deblock_luma[1] = x264_deblock_v_luma_avx;
  176. +                pf->deblock_luma[0] = x264_deblock_h_luma_avx;
  177. +                pf->deblock_chroma[1] = x264_deblock_v_chroma_avx;
  178. +                pf->deblock_chroma[0] = x264_deblock_h_chroma_avx;
  179. +                pf->deblock_luma_intra[1] = x264_deblock_v_luma_intra_avx;
  180. +                pf->deblock_luma_intra[0] = x264_deblock_h_luma_intra_avx;
  181. +                pf->deblock_chroma_intra[1] = x264_deblock_v_chroma_intra_avx;
  182. +                pf->deblock_chroma_intra[0] = x264_deblock_h_chroma_intra_avx;
  183. +            }
  184. +        }
  185.      }
  186.  #endif
  187.  
  188. diff --git a/common/pixel.c b/common/pixel.c
  189. index 979c731..ebc0570 100644
  190. --- a/common/pixel.c
  191. +++ b/common/pixel.c
  192. @@ -488,6 +488,7 @@ SATD_X_DECL7( _mmxext )
  193.  SATD_X_DECL6( _sse2 )
  194.  SATD_X_DECL7( _ssse3 )
  195.  SATD_X_DECL7( _sse4 )
  196. +SATD_X_DECL7( _avx )
  197.  #endif // !HIGH_BIT_DEPTH
  198.  #endif
  199.  
  200. @@ -1030,6 +1031,29 @@ void x264_pixel_init( int cpu, x264_pixel_function_t *pixf )
  201.          /* Slower on Conroe, so only enable under SSE4 */
  202.          pixf->intra_sad_x3_8x8  = x264_intra_sad_x3_8x8_ssse3;
  203.      }
  204. +
  205. +    if( cpu&X264_CPU_AVX )
  206. +    {
  207. +        INIT7( satd, _avx );
  208. +        INIT7( satd_x3, _avx );
  209. +        INIT7( satd_x4, _avx );
  210. +        pixf->ads[PIXEL_16x16] = x264_pixel_ads4_avx;
  211. +        pixf->ads[PIXEL_16x8]  = x264_pixel_ads2_avx;
  212. +        if( !(cpu&X264_CPU_STACK_MOD4) )
  213. +        {
  214. +            INIT4( hadamard_ac, _avx );
  215. +        }
  216. +        INIT5( ssd, _avx );
  217. +#if ARCH_X86_64
  218. +        pixf->sa8d[PIXEL_16x16]= x264_pixel_sa8d_16x16_avx;
  219. +        pixf->sa8d[PIXEL_8x8]  = x264_pixel_sa8d_8x8_avx;
  220. +        pixf->intra_sa8d_x3_8x8= x264_intra_sa8d_x3_8x8_avx;
  221. +#endif
  222. +        pixf->ssd_nv12_core    = x264_pixel_ssd_nv12_core_avx;
  223. +        pixf->var[PIXEL_16x16] = x264_pixel_var_16x16_avx;
  224. +        pixf->var[PIXEL_8x8]   = x264_pixel_var_8x8_avx;
  225. +        pixf->ssim_end4        = x264_pixel_ssim_end4_avx;
  226. +    }
  227.  #endif //HAVE_MMX
  228.  
  229.  #if HAVE_ARMV6
  230. diff --git a/common/quant.c b/common/quant.c
  231. index afc50a3..54d9b5c 100644
  232. --- a/common/quant.c
  233. +++ b/common/quant.c
  234. @@ -477,6 +477,9 @@ void x264_quant_init( x264_t *h, int cpu, x264_quant_function_t *pf )
  235.  
  236.      if( cpu&X264_CPU_AVX )
  237.      {
  238. +        pf->dequant_4x4 = x264_dequant_4x4_avx;
  239. +        pf->dequant_8x8 = x264_dequant_8x8_avx;
  240. +        pf->dequant_4x4_dc = x264_dequant_4x4dc_avx;
  241.          pf->denoise_dct = x264_denoise_dct_avx;
  242.      }
  243.  #endif // HAVE_MMX
  244. diff --git a/common/x86/bitstream-a.asm b/common/x86/bitstream-a.asm
  245. index c80b925..97c7500 100644
  246. --- a/common/x86/bitstream-a.asm
  247. +++ b/common/x86/bitstream-a.asm
  248. @@ -44,19 +44,17 @@ SECTION .text
  249.      jmp %1_continue
  250.  ALIGN 16
  251.  %1:
  252. -    mova      m3, m1
  253. -    mova      m2, m0
  254. -    pcmpeqb   m1, m4
  255. -    pcmpeqb   m0, m4
  256. -    pmovmskb r3d, m1
  257. -    %2   [r0+r1], m2
  258. -    pmovmskb r4d, m0
  259. +    pcmpeqb   m3, m1, m4
  260. +    pcmpeqb   m2, m0, m4
  261. +    pmovmskb r3d, m3
  262. +    %2   [r0+r1], m0
  263. +    pmovmskb r4d, m2
  264.      shl      r3d, mmsize
  265.      mova      m0, [r1+r2+2*mmsize]
  266.      or       r4d, r3d
  267. -    mova      m1, [r1+r2+3*mmsize]
  268. +    %2 [r0+r1+mmsize], m1
  269.      lea      r3d, [r4+r4+1]
  270. -    %2 [r0+r1+mmsize], m3
  271. +    mova      m1, [r1+r2+3*mmsize]
  272.      and      r4d, r3d
  273.      jnz %1_escape
  274.  %1_continue:
  275. @@ -129,3 +127,5 @@ INIT_MMX
  276.  NAL_ESCAPE mmxext
  277.  INIT_XMM
  278.  NAL_ESCAPE sse2
  279. +INIT_AVX
  280. +NAL_ESCAPE avx
  281. diff --git a/common/x86/dct-32.asm b/common/x86/dct-32.asm
  282. index f766f8c..fa106c0 100644
  283. --- a/common/x86/dct-32.asm
  284. +++ b/common/x86/dct-32.asm
  285. @@ -48,39 +48,30 @@ cextern hsub_mul
  286.      SUMSUB_BA w, m%6, m%5    ; %6 = dst0, %5 = dst4
  287.      mova    [%9+0x00], m%6
  288.      mova    [%9+0x40], m%5
  289. -    mova    m%6, m%7         ; a3
  290. -    psraw   m%6, 1           ; a3>>1
  291. +    psraw   m%6, m%7, 1      ; a3>>1
  292.      paddw   m%6, m%8         ; a2 + (a3>>1)
  293.      psraw   m%8, 1           ; a2>>1
  294.      psubw   m%8, m%7         ; (a2>>1) - a3
  295.      mova    [%9+0x60], m%8
  296. -    mova    m%5, m%3
  297. -    psraw   m%5, 1
  298. +    psraw   m%5, m%3, 1
  299.      paddw   m%5, m%3         ; d25+(d25>>1)
  300. -    mova    m%7, m%1
  301. -    psubw   m%7, m%4         ; a5 = d07-d34-(d25+(d25>>1))
  302. +    psubw   m%7, m%1, m%4    ; a5 = d07-d34-(d25+(d25>>1))
  303.      psubw   m%7, m%5
  304. -    mova    m%5, m%2
  305. -    psraw   m%5, 1
  306. +    psraw   m%5, m%2, 1
  307.      paddw   m%5, m%2         ; d16+(d16>>1)
  308. -    mova    m%8, m%1
  309. -    paddw   m%8, m%4
  310. +    paddw   m%8, m%1, m%4
  311.      psubw   m%8, m%5         ; a6 = d07+d34-(d16+(d16>>1))
  312. -    mova    m%5, m%1
  313. -    psraw   m%5, 1
  314. +    psraw   m%5, m%1, 1
  315.      paddw   m%5, m%1         ; d07+(d07>>1)
  316.      paddw   m%5, m%2
  317.      paddw   m%5, m%3         ; a4 = d16+d25+(d07+(d07>>1))
  318. -    mova    m%1, m%4
  319. -    psraw   m%1, 1
  320. +    psraw   m%1, m%4, 1
  321.      paddw   m%1, m%4         ; d34+(d34>>1)
  322.      paddw   m%1, m%2
  323.      psubw   m%1, m%3         ; a7 = d16-d25+(d34+(d34>>1))
  324. -    mova    m%4, m%1
  325. -    psraw   m%4, 2
  326. +    psraw   m%4, m%1, 2
  327.      paddw   m%4, m%5         ; a4 + (a7>>2)
  328. -    mova    m%3, m%8
  329. -    psraw   m%3, 2
  330. +    psraw   m%3, m%8, 2
  331.      paddw   m%3, m%7         ; a5 + (a6>>2)
  332.      psraw   m%5, 2
  333.      psraw   m%7, 2
  334. @@ -92,19 +83,17 @@ cextern hsub_mul
  335.  ; in: 0,4 in mem, rest in regs
  336.  ; out: m0..m7
  337.  %macro IDCT8_1D 9
  338. -    mova      m%1, m%3
  339. -    mova      m%5, m%7
  340. -    psraw     m%3, 1
  341. -    psraw     m%7, 1
  342. +    psraw     m%1, m%3, 1
  343. +    SWAP      m%1, m%3
  344. +    psraw     m%5, m%7, 1
  345. +    SWAP      m%5, m%7
  346.      psubw     m%3, m%5
  347.      paddw     m%7, m%1
  348. -    mova      m%5, m%2
  349. -    psraw     m%5, 1
  350. +    psraw     m%5, m%2, 1
  351.      paddw     m%5, m%2
  352.      paddw     m%5, m%4
  353.      paddw     m%5, m%6
  354. -    mova      m%1, m%6
  355. -    psraw     m%1, 1
  356. +    psraw     m%1, m%6, 1
  357.      paddw     m%1, m%6
  358.      paddw     m%1, m%8
  359.      psubw     m%1, m%2
  360. @@ -116,10 +105,8 @@ cextern hsub_mul
  361.      psraw     m%8, 1
  362.      psubw     m%2, m%4
  363.      psubw     m%6, m%8
  364. -    mova      m%4, m%5
  365. -    mova      m%8, m%1
  366. -    psraw     m%4, 2
  367. -    psraw     m%8, 2
  368. +    psraw     m%4, m%5, 2
  369. +    psraw     m%8, m%1, 2
  370.      paddw     m%4, m%6
  371.      paddw     m%8, m%2
  372.      psraw     m%6, 2
  373. @@ -246,9 +233,8 @@ idct8_mmx:
  374.  
  375.  %macro ADD_STORE_ROW 3
  376.      movq  m1, [r0+%1*FDEC_STRIDE]
  377. -    movq  m2, m1
  378. +    punpckhbw m2, m1, m0
  379.      punpcklbw m1, m0
  380. -    punpckhbw m2, m0
  381.      paddw m1, %2
  382.      paddw m2, %3
  383.      packuswb m1, m2
  384. diff --git a/common/x86/dct-64.asm b/common/x86/dct-64.asm
  385. index 112c7ba..fe404d9 100644
  386. --- a/common/x86/dct-64.asm
  387. +++ b/common/x86/dct-64.asm
  388. @@ -45,14 +45,12 @@ INIT_XMM
  389.      SUMSUB_BA w, m%6, m%7, m%10 ; %6=a1, %7=a3
  390.      SUMSUB_BA w, m%5, m%8, m%10 ; %5=a0, %8=a2
  391.  
  392. -    movdqa  m%9, m%1
  393. -    psraw   m%9, 1
  394. +    psraw   m%9, m%1, 1
  395.      paddw   m%9, m%1
  396.      paddw   m%9, m%2
  397.      paddw   m%9, m%3 ; %9=a4
  398.  
  399. -    movdqa  m%10, m%4
  400. -    psraw   m%10, 1
  401. +    psraw   m%10, m%4, 1
  402.      paddw   m%10, m%4
  403.      paddw   m%10, m%2
  404.      psubw   m%10, m%3 ; %10=a7
  405. @@ -65,22 +63,19 @@ INIT_XMM
  406.      psubw   m%1, m%3 ; %1=a5
  407.      psubw   m%4, m%2 ; %4=a6
  408.  
  409. -    movdqa  m%2, m%10
  410. -    psraw   m%2, 2
  411. +    psraw   m%2, m%10, 2
  412.      paddw   m%2, m%9 ; %2=b1
  413.      psraw   m%9, 2
  414.      psubw   m%9, m%10 ; %9=b7
  415.  
  416.      SUMSUB_BA w, m%6, m%5, m%10 ; %6=b0, %5=b4
  417.  
  418. -    movdqa  m%3, m%7
  419. -    psraw   m%3, 1
  420. +    psraw   m%3, m%7, 1
  421.      paddw   m%3, m%8 ; %3=b2
  422.      psraw   m%8, 1
  423.      psubw   m%8, m%7 ; %8=b6
  424.  
  425. -    movdqa  m%7, m%4
  426. -    psraw   m%7, 2
  427. +    psraw   m%7, m%4, 2
  428.      paddw   m%7, m%1 ; %7=b3
  429.      psraw   m%1, 2
  430.      psubw   m%4, m%1 ; %4=b5
  431. @@ -91,20 +86,18 @@ INIT_XMM
  432.  %macro IDCT8_1D 10
  433.      SUMSUB_BA w, m%5, m%1, m%9 ; %5=a0, %1=a2
  434.  
  435. -    movdqa  m%9, m%2
  436. -    psraw   m%9, 1
  437. +    psraw   m%9, m%2, 1
  438.      paddw   m%9, m%2
  439.      paddw   m%9, m%4
  440.      paddw   m%9, m%6 ; %9=a7
  441.  
  442. -    movdqa  m%10, m%3
  443. -    psraw   m%3, 1
  444. +    psraw   m%10, m%3, 1
  445. +    SWAP    m%10, m%3
  446.      psubw   m%3, m%7 ; %3=a4
  447.      psraw   m%7, 1
  448.      paddw   m%7, m%10 ; %7=a6
  449.  
  450. -    movdqa  m%10, m%6
  451. -    psraw   m%10, 1
  452. +    psraw   m%10, m%6, 1
  453.      paddw   m%10, m%6
  454.      paddw   m%10, m%8
  455.      psubw   m%10, m%2 ; %10=a5
  456. @@ -118,8 +111,7 @@ INIT_XMM
  457.      psubw   m%2, m%4 ; %2=a3
  458.      psubw   m%6, m%8 ; %6=a1
  459.  
  460. -    movdqa  m%4, m%9
  461. -    psraw   m%4, 2
  462. +    psraw   m%4, m%9, 2
  463.      paddw   m%4, m%6 ; %4=b1
  464.      psraw   m%6, 2
  465.      psubw   m%9, m%6 ; %9=b7
  466. @@ -127,8 +119,7 @@ INIT_XMM
  467.      SUMSUB_BA w, m%7, m%5, m%6 ; %7=b0, %5=b6
  468.      SUMSUB_BA w, m%3, m%1, m%6 ; %3=b2, %1=b4
  469.  
  470. -    movdqa  m%8, m%10
  471. -    psraw   m%8, 2
  472. +    psraw   m%8, m%10, 2
  473.      paddw   m%8, m%2 ; %8=b3
  474.      psraw   m%2, 2
  475.      psubw   m%2, m%10 ; %2=b5
  476. diff --git a/common/x86/dct-a.asm b/common/x86/dct-a.asm
  477. index ab33a59..f320823 100644
  478. --- a/common/x86/dct-a.asm
  479. +++ b/common/x86/dct-a.asm
  480. @@ -285,10 +285,10 @@ INIT_XMM
  481.  cglobal add4x4_idct_sse4, 2,2,6
  482.      mova      m0, [r1+0x00]     ; row1/row0
  483.      mova      m2, [r1+0x10]     ; row3/row2
  484. -    mova      m1, m0            ; row1/row0
  485. -    psraw     m0, 1             ; row1>>1/...
  486. -    mova      m3, m2            ; row3/row2
  487. -    psraw     m2, 1             ; row3>>1/...
  488. +    psraw     m1, m0, 1         ; row1>>1/...
  489. +    psraw     m3, m2, 1         ; row3>>1/...
  490. +    SWAP      m0, m1
  491. +    SWAP      m2, m3
  492.      movsd     m0, m1            ; row1>>1/row0
  493.      movsd     m2, m3            ; row3>>1/row2
  494.      psubw     m0, m3            ; row1>>1-row3/row0-2
  495. @@ -304,8 +304,8 @@ cglobal add4x4_idct_sse4, 2,2,6
  496.      mova      m1, [pw_32_0]
  497.      paddw     m1, m0            ; row1/row0 corrected
  498.      psraw     m0, 1             ; row1>>1/...
  499. -    mova      m3, m2            ; row3/row2
  500. -    psraw     m2, 1             ; row3>>1/...
  501. +    psraw     m3, m2, 1         ; row3>>1/...
  502. +    SWAP      m2, m3
  503.      movsd     m0, m1            ; row1>>1/row0
  504.      movsd     m2, m3            ; row3>>1/row2
  505.      psubw     m0, m3            ; row1>>1-row3/row0-2
  506. @@ -638,22 +638,19 @@ cglobal add16x16_idct_dc_sse2, 2,2,8
  507.      add       r1, 16
  508.      punpcklwd xmm0, xmm0
  509.      punpcklwd xmm2, xmm2
  510. -    pxor      xmm1, xmm1
  511.      pxor      xmm3, xmm3
  512.      paddw     xmm0, [pw_32]
  513.      paddw     xmm2, [pw_32]
  514.      psraw     xmm0, 6
  515.      psraw     xmm2, 6
  516. -    psubw     xmm1, xmm0
  517. -    psubw     xmm3, xmm2
  518. +    psubw     xmm1, xmm3, xmm0
  519.      packuswb  xmm0, xmm1
  520. +    psubw     xmm3, xmm2
  521. +    punpckhbw xmm1, xmm0, xmm0
  522.      packuswb  xmm2, xmm3
  523. -    movdqa    xmm1, xmm0
  524. -    movdqa    xmm3, xmm2
  525. +    punpckhbw xmm3, xmm2, xmm2
  526.      punpcklbw xmm0, xmm0
  527.      punpcklbw xmm2, xmm2
  528. -    punpckhbw xmm1, xmm1
  529. -    punpckhbw xmm3, xmm3
  530.      IDCT_DC_STORE FDEC_STRIDE*-4, xmm0, xmm1
  531.      IDCT_DC_STORE 0, xmm2, xmm3
  532.      ret
  533. @@ -677,12 +674,10 @@ cglobal add16x16_idct_dc_ssse3, 2,2,8
  534.      movdqa    xmm6, [pb_idctdc_unpack2]
  535.      packuswb  xmm0, xmm0
  536.      packuswb  xmm1, xmm1
  537. -    movdqa    xmm2, xmm0
  538. -    movdqa    xmm3, xmm1
  539. +    pshufb    xmm2, xmm0, xmm6
  540.      pshufb    xmm0, xmm5
  541. -    pshufb    xmm2, xmm6
  542. +    pshufb    xmm3, xmm1, xmm6
  543.      pshufb    xmm1, xmm5
  544. -    pshufb    xmm3, xmm6
  545.      IDCT_DC_STORE FDEC_STRIDE*-4, xmm0, xmm1
  546.      IDCT_DC_STORE 0, xmm2, xmm3
  547.      ret
  548. @@ -835,7 +830,7 @@ cglobal zigzag_scan_8x8_frame_%1, 2,2,8
  549.      movdq2q    mm5, xmm5
  550.      PALIGNR   xmm6, xmm6, 10, xmm3
  551.      movdq2q    mm6, xmm6
  552. -%ifidn %1, ssse3
  553. +%ifnidn %1, sse2
  554.      PALIGNR   xmm7, xmm7, 8, xmm3
  555.      movdq2q    mm7, xmm7
  556.  %else
  557. @@ -868,12 +863,10 @@ cglobal zigzag_scan_8x8_frame_%1, 2,2,8
  558.      movq [r0+2*56], mm5
  559.      movq [r0+2*60], mm3
  560.  
  561. -    movdqa    xmm3, xmm0
  562. -    movdqa    xmm7, xmm4
  563. +    punpckhdq xmm3, xmm0, xmm2
  564.      punpckldq xmm0, xmm2
  565. +    punpckhdq xmm7, xmm4, xmm6
  566.      punpckldq xmm4, xmm6
  567. -    punpckhdq xmm3, xmm2
  568. -    punpckhdq xmm7, xmm6
  569.      pshufhw   xmm0, xmm0, 0x1b
  570.      pshuflw   xmm4, xmm4, 0x1b
  571.      pshufhw   xmm3, xmm3, 0x1b
  572. @@ -909,14 +902,12 @@ cglobal zigzag_scan_8x8_frame_%1, 2,2,8*(mmsize/16)
  573.      movu        m2, [r1+14*SIZEOF_DCTCOEF]
  574.      movu        m3, [r1+21*SIZEOF_DCTCOEF]
  575.      mova        m4, [r1+28*SIZEOF_DCTCOEF]
  576. -    mova        m5, m0
  577. -    mova        m6, m1
  578. +    punpckl%5   m5, m0, m1
  579.      psrl%3      m0, %2
  580. +    punpckh%5   m6, m1, m0
  581. +    punpckl%4   m5, m0
  582.      punpckl%4   m1, m1
  583. -    punpckl%5   m5, m6
  584.      punpckh%5   m1, m3
  585. -    punpckh%5   m6, m0
  586. -    punpckl%4   m5, m0
  587.      mova        m7, [r1+52*SIZEOF_DCTCOEF]
  588.      mova        m0, [r1+60*SIZEOF_DCTCOEF]
  589.      punpckh%5   m1, m2
  590. @@ -936,10 +927,9 @@ cglobal zigzag_scan_8x8_frame_%1, 2,2,8*(mmsize/16)
  591.      movu [r0+47*SIZEOF_DCTCOEF], m4
  592.      punpckh%5   m7, m0
  593.      psll%3      m0, %2
  594. -    mova        m3, m5
  595. +    punpckh%4   m3, m5, m5
  596.      punpckl%5   m5, m1
  597.      punpckh%5   m1, m2
  598. -    punpckh%4   m3, m3
  599.      mova [r0+52*SIZEOF_DCTCOEF], m6
  600.      movu [r0+13*SIZEOF_DCTCOEF], m5
  601.      movu        m4, [r1+11*SIZEOF_DCTCOEF]
  602. @@ -957,12 +947,10 @@ cglobal zigzag_scan_8x8_frame_%1, 2,2,8*(mmsize/16)
  603.      punpckl%5   m6, m7
  604.      punpckh%5   m1, m3
  605.      punpckh%5   m5, m7
  606. -    mova        m3, m6
  607. -    mova        m7, m5
  608. +    punpckh%4   m3, m6, m4
  609. +    punpckh%4   m7, m5, m1
  610.      punpckl%4   m6, m4
  611.      punpckl%4   m5, m1
  612. -    punpckh%4   m3, m4
  613. -    punpckh%4   m7, m1
  614.      movu        m4, [r1+35*SIZEOF_DCTCOEF]
  615.      movu        m1, [r1+49*SIZEOF_DCTCOEF]
  616.      pshuf%6     m6, m6, 0x1b
  617. @@ -975,18 +963,14 @@ cglobal zigzag_scan_8x8_frame_%1, 2,2,8*(mmsize/16)
  618.      mova [r0+32*SIZEOF_DCTCOEF], m7
  619.      movu [r0+10*SIZEOF_DCTCOEF], m6
  620.      movu [r0+21*SIZEOF_DCTCOEF], m5
  621. -    mova        m3, m0
  622. -    mova        m7, m2
  623. +    punpckh%5   m3, m0, m4
  624. +    punpckh%5   m7, m2, m1
  625.      punpckl%5   m0, m4
  626.      punpckl%5   m2, m1
  627. -    punpckh%5   m3, m4
  628. -    punpckh%5   m7, m1
  629. -    mova        m4, m2
  630. -    mova        m1, m7
  631. +    punpckl%4   m4, m2, m0
  632. +    punpckl%4   m1, m7, m3
  633.      punpckh%4   m2, m0
  634.      punpckh%4   m7, m3
  635. -    punpckl%4   m4, m0
  636. -    punpckl%4   m1, m3
  637.      pshuf%6     m2, m2, 0x1b
  638.      pshuf%6     m7, m7, 0x1b
  639.      mova [r0+28*SIZEOF_DCTCOEF], m4
  640. @@ -999,6 +983,8 @@ cglobal zigzag_scan_8x8_frame_%1, 2,2,8*(mmsize/16)
  641.  %ifdef HIGH_BIT_DEPTH
  642.  INIT_XMM
  643.  SCAN_8x8_FRAME sse2  , 4 , dq, qdq, dq, d
  644. +INIT_AVX
  645. +SCAN_8x8_FRAME avx   , 4 , dq, qdq, dq, d
  646.  %else
  647.  INIT_MMX
  648.  SCAN_8x8_FRAME mmxext, 16, q , dq , wd, w
  649. @@ -1013,7 +999,7 @@ cglobal zigzag_scan_4x4_frame_%1, 2,2,8*(mmsize)/16
  650.      mova       m1, [r1+ 4*SIZEOF_DCTCOEF]
  651.      mova       m2, [r1+ 8*SIZEOF_DCTCOEF]
  652.      mova       m3, [r1+12*SIZEOF_DCTCOEF]
  653. -    mova       m4, m0
  654. +    punpckl%5  m4, m0, m1
  655.      mova       m5, m1
  656.      mova       m6, m2
  657.      mova       m7, m3
  658. @@ -1021,7 +1007,6 @@ cglobal zigzag_scan_4x4_frame_%1, 2,2,8*(mmsize)/16
  659.      psrl%3     m0, %2
  660.      punpckl%4  m2, m2
  661.      punpckh%4  m1, m1
  662. -    punpckl%5  m4, m5
  663.      punpckl%5  m5, m3
  664.      punpckl%4  m4, m0
  665.      punpckh%5  m5, m2
  666. @@ -1039,27 +1024,35 @@ cglobal zigzag_scan_4x4_frame_%1, 2,2,8*(mmsize)/16
  667.  %ifdef HIGH_BIT_DEPTH
  668.  INIT_XMM
  669.  SCAN_4x4 sse2, 4 , dq, qdq, dq
  670. +INIT_AVX
  671. +SCAN_4x4 avx , 4 , dq, qdq, dq
  672.  %else
  673.  INIT_MMX
  674.  SCAN_4x4 mmx , 16, q , dq , wd
  675. -%endif
  676.  
  677.  ;-----------------------------------------------------------------------------
  678.  ; void zigzag_scan_4x4_frame( int16_t level[16], int16_t dct[4][4] )
  679.  ;-----------------------------------------------------------------------------
  680. -cglobal zigzag_scan_4x4_frame_ssse3, 2,2
  681. +%macro SCAN_4x4_FRAME 1
  682. +cglobal zigzag_scan_4x4_frame_%1, 2,2
  683.      movdqa    xmm1, [r1+16]
  684.      movdqa    xmm0, [r1]
  685.      pshufb    xmm1, [pb_scan4frameb]
  686.      pshufb    xmm0, [pb_scan4framea]
  687. -    movdqa    xmm2, xmm1
  688. -    psrldq    xmm1, 6
  689. -    palignr   xmm2, xmm0, 6
  690. +    psrldq    xmm2, xmm1, 6
  691. +    palignr   xmm1, xmm0, 6
  692.      pslldq    xmm0, 10
  693. -    palignr   xmm1, xmm0, 10
  694. -    movdqa    [r0], xmm2
  695. -    movdqa [r0+16], xmm1
  696. +    palignr   xmm2, xmm0, 10
  697. +    movdqa    [r0], xmm1
  698. +    movdqa [r0+16], xmm2
  699.      RET
  700. +%endmacro
  701. +
  702. +INIT_XMM
  703. +SCAN_4x4_FRAME ssse3
  704. +INIT_AVX
  705. +SCAN_4x4_FRAME avx
  706. +%endif ; !HIGH_BIT_DEPTH
  707.  
  708.  %ifdef HIGH_BIT_DEPTH
  709.  INIT_XMM
  710. @@ -1121,25 +1114,23 @@ cglobal zigzag_scan_8x8_field_%1, 2,3,8*(mmsize/16)
  711.      pshuf%2    m2, m2, 000111001b               ; 08 11 10 09
  712.      punpckl%3  m3, m1                           ; 05 03 04 03
  713.      pinsr%2    m0, r2d, 3                       ; 08 02 01 00
  714. -    mova       m4, m2
  715. -    punpckl%3  m2, m3                           ; 04 10 03 09
  716. -    pshuf%2    m2, m2, 010110100b               ; 10 04 03 09
  717. +    punpckl%3  m4, m2, m3                           ; 04 10 03 09
  718. +    pshuf%2    m4, m4, 010110100b               ; 10 04 03 09
  719.      mova  [r0+ 0*SIZEOF_DCTCOEF], m0            ; 08 02 01 00
  720. -    mova  [r0+ 4*SIZEOF_DCTCOEF], m2            ; 10 04 03 09
  721. +    mova  [r0+ 4*SIZEOF_DCTCOEF], m4            ; 10 04 03 09
  722.      mova       m3, [r1+12*SIZEOF_DCTCOEF]       ; 15 14 13 12
  723.      mova       m5, [r1+16*SIZEOF_DCTCOEF]       ; 19 18 17 16
  724.      punpckl%4  m6, m5                           ; 17 16 XX XX
  725.      psrl%5     m1, %6                           ; XX 07 06 05
  726. -    punpckh%3  m6, m4                           ; 08 17 11 16
  727. +    punpckh%3  m6, m2                           ; 08 17 11 16
  728.      punpckl%4  m6, m1                           ; 06 05 11 16
  729.      mova  [r0+ 8*SIZEOF_DCTCOEF], m6            ; 06 05 11 16
  730.      psrl%5     m1, %6                           ; XX XX 07 06
  731.      punpckl%3  m1, m5                           ; 17 07 16 06
  732.      mova       m0, [r1+20*SIZEOF_DCTCOEF]       ; 23 22 21 20
  733.      mova       m2, [r1+24*SIZEOF_DCTCOEF]       ; 27 26 25 24
  734. -    mova       m6, m3
  735.      punpckh%4  m1, m1                           ; 17 07 17 07
  736. -    punpckl%3  m6, m2                           ; 25 13 24 12
  737. +    punpckl%3  m6, m3, m2                       ; 25 13 24 12
  738.      pextr%2    r2d, m5, 2
  739.      mova [r0+24*SIZEOF_DCTCOEF], m0             ; 23 22 21 20
  740.      punpckl%3  m1, m6                           ; 24 17 12 07
  741. @@ -1181,9 +1172,8 @@ cglobal zigzag_scan_8x8_field_%1, 2,3,8*(mmsize/16)
  742.      mova [r0+48*SIZEOF_DCTCOEF], m7
  743.      mova        m0, [r1+56*SIZEOF_DCTCOEF]      ; 59 58 57 56
  744.      mova        m1, [r1+52*SIZEOF_DCTCOEF]      ; 55 54 53 52
  745. -    mova        m2, m0
  746.      mova        m7, [r1+60*SIZEOF_DCTCOEF]
  747. -    punpckl%4   m2, m1                          ; 53 52 57 56
  748. +    punpckl%4   m2, m0, m1                      ; 53 52 57 56
  749.      punpckh%4   m1, m0                          ; 59 58 55 54
  750.      mova [r0+52*SIZEOF_DCTCOEF], m2
  751.      mova [r0+56*SIZEOF_DCTCOEF], m1
  752. @@ -1193,6 +1183,8 @@ cglobal zigzag_scan_8x8_field_%1, 2,3,8*(mmsize/16)
  753.  %ifdef HIGH_BIT_DEPTH
  754.  INIT_XMM
  755.  SCAN_8x8 sse4  , d, dq, qdq, dq, 4
  756. +INIT_AVX
  757. +SCAN_8x8 avx   , d, dq, qdq, dq, 4
  758.  %else
  759.  INIT_MMX
  760.  SCAN_8x8 mmxext, w, wd, dq , q , 16
  761. @@ -1201,11 +1193,11 @@ SCAN_8x8 mmxext, w, wd, dq , q , 16
  762.  ;-----------------------------------------------------------------------------
  763.  ; void zigzag_sub_4x4_frame( int16_t level[16], const uint8_t *src, uint8_t *dst )
  764.  ;-----------------------------------------------------------------------------
  765. -%macro ZIGZAG_SUB_4x4 2
  766. +%macro ZIGZAG_SUB_4x4 3
  767.  %ifidn %1, ac
  768. -cglobal zigzag_sub_4x4%1_%2_ssse3, 4,4,8
  769. +cglobal zigzag_sub_4x4%1_%2_%3, 4,4,8
  770.  %else
  771. -cglobal zigzag_sub_4x4%1_%2_ssse3, 3,3,8
  772. +cglobal zigzag_sub_4x4%1_%2_%3, 3,3,8
  773.  %endif
  774.      movd      xmm0, [r1+0*FENC_STRIDE]
  775.      movd      xmm1, [r1+1*FENC_STRIDE]
  776. @@ -1233,12 +1225,10 @@ cglobal zigzag_sub_4x4%1_%2_ssse3, 3,3,8
  777.      pshufb    xmm0, xmm7
  778.      pshufb    xmm4, xmm7
  779.      pxor      xmm6, xmm6
  780. -    movdqa    xmm1, xmm0
  781. -    movdqa    xmm5, xmm4
  782. +    punpckhbw xmm1, xmm0, xmm6
  783. +    punpckhbw xmm5, xmm4, xmm6
  784.      punpcklbw xmm0, xmm6
  785. -    punpckhbw xmm1, xmm6
  786.      punpcklbw xmm4, xmm6
  787. -    punpckhbw xmm5, xmm6
  788.      psubw     xmm0, xmm4
  789.      psubw     xmm1, xmm5
  790.  %ifidn %1, ac
  791. @@ -1259,10 +1249,16 @@ cglobal zigzag_sub_4x4%1_%2_ssse3, 3,3,8
  792.      RET
  793.  %endmacro
  794.  
  795. -ZIGZAG_SUB_4x4   , frame
  796. -ZIGZAG_SUB_4x4 ac, frame
  797. -ZIGZAG_SUB_4x4   , field
  798. -ZIGZAG_SUB_4x4 ac, field
  799. +INIT_XMM
  800. +ZIGZAG_SUB_4x4   , frame, ssse3
  801. +ZIGZAG_SUB_4x4 ac, frame, ssse3
  802. +ZIGZAG_SUB_4x4   , field, ssse3
  803. +ZIGZAG_SUB_4x4 ac, field, ssse3
  804. +INIT_AVX
  805. +ZIGZAG_SUB_4x4   , frame, avx
  806. +ZIGZAG_SUB_4x4 ac, frame, avx
  807. +ZIGZAG_SUB_4x4   , field, avx
  808. +ZIGZAG_SUB_4x4 ac, field, avx
  809.  
  810.  ;-----------------------------------------------------------------------------
  811.  ; void zigzag_interleave_8x8_cavlc( int16_t *dst, int16_t *src, uint8_t *nnz )
  812. @@ -1314,6 +1310,8 @@ cglobal zigzag_interleave_8x8_cavlc_%1, 3,3,8*(mmsize/16)
  813.  %ifdef HIGH_BIT_DEPTH
  814.  INIT_XMM
  815.  ZIGZAG_8x8_CAVLC sse2, D
  816. +INIT_AVX
  817. +ZIGZAG_8x8_CAVLC avx , D
  818.  %else
  819.  INIT_MMX
  820.  ZIGZAG_8x8_CAVLC mmx , W
  821. @@ -1350,8 +1348,8 @@ ZIGZAG_8x8_CAVLC mmx , W
  822.  %endmacro
  823.  
  824.  %ifndef HIGH_BIT_DEPTH
  825. -INIT_XMM
  826. -cglobal zigzag_interleave_8x8_cavlc_sse2, 3,3,8
  827. +%macro ZIGZAG_8x8_CAVLC 1
  828. +cglobal zigzag_interleave_8x8_cavlc_%1, 3,3,8
  829.      INTERLEAVE_XMM  0
  830.      INTERLEAVE_XMM 16
  831.      packsswb m2, m3
  832. @@ -1365,4 +1363,10 @@ cglobal zigzag_interleave_8x8_cavlc_sse2, 3,3,8
  833.      shr     r0d, 16
  834.      mov  [r2+8], r0w
  835.      RET
  836. +%endmacro
  837. +
  838. +INIT_XMM
  839. +ZIGZAG_8x8_CAVLC sse2
  840. +INIT_AVX
  841. +ZIGZAG_8x8_CAVLC avx
  842.  %endif ; !HIGH_BIT_DEPTH
  843. diff --git a/common/x86/dct.h b/common/x86/dct.h
  844. index 9361132..d6e3b68 100644
  845. --- a/common/x86/dct.h
  846. +++ b/common/x86/dct.h
  847. @@ -71,21 +71,29 @@ void x264_add16x16_idct8_mmx ( uint8_t *dst, int16_t dct[4][64] );
  848.  void x264_add8x8_idct8_sse2  ( uint8_t *dst, int16_t dct   [64] );
  849.  void x264_add16x16_idct8_sse2( uint8_t *dst, int16_t dct[4][64] );
  850.  
  851. +void x264_zigzag_scan_8x8_frame_avx   ( dctcoef level[64], dctcoef dct[64] );
  852.  void x264_zigzag_scan_8x8_frame_ssse3 ( int16_t level[64], int16_t dct[64] );
  853.  void x264_zigzag_scan_8x8_frame_sse2  ( dctcoef level[64], dctcoef dct[64] );
  854.  void x264_zigzag_scan_8x8_frame_mmxext( int16_t level[64], int16_t dct[64] );
  855. +void x264_zigzag_scan_4x4_frame_avx   ( dctcoef level[16], dctcoef dct[16] );
  856.  void x264_zigzag_scan_4x4_frame_ssse3 ( int16_t level[16], int16_t dct[16] );
  857.  void x264_zigzag_scan_4x4_frame_sse2  ( int32_t level[16], int32_t dct[16] );
  858.  void x264_zigzag_scan_4x4_frame_mmx   ( int16_t level[16], int16_t dct[16] );
  859.  void x264_zigzag_scan_4x4_field_sse2  ( int32_t level[16], int32_t dct[16] );
  860.  void x264_zigzag_scan_4x4_field_mmxext( int16_t level[16], int16_t dct[16] );
  861. +void x264_zigzag_scan_8x8_field_avx   ( int32_t level[64], int32_t dct[64] );
  862.  void x264_zigzag_scan_8x8_field_sse4  ( int32_t level[64], int32_t dct[64] );
  863.  void x264_zigzag_scan_8x8_field_mmxext( int16_t level[64], int16_t dct[64] );
  864. +int  x264_zigzag_sub_4x4_frame_avx    ( int16_t level[16], const uint8_t *src, uint8_t *dst );
  865.  int  x264_zigzag_sub_4x4_frame_ssse3  ( int16_t level[16], const uint8_t *src, uint8_t *dst );
  866. +int  x264_zigzag_sub_4x4ac_frame_avx  ( int16_t level[16], const uint8_t *src, uint8_t *dst, int16_t *dc );
  867.  int  x264_zigzag_sub_4x4ac_frame_ssse3( int16_t level[16], const uint8_t *src, uint8_t *dst, int16_t *dc );
  868. +int  x264_zigzag_sub_4x4_field_avx    ( int16_t level[16], const uint8_t *src, uint8_t *dst );
  869.  int  x264_zigzag_sub_4x4_field_ssse3  ( int16_t level[16], const uint8_t *src, uint8_t *dst );
  870. +int  x264_zigzag_sub_4x4ac_field_avx  ( int16_t level[16], const uint8_t *src, uint8_t *dst, int16_t *dc );
  871.  int  x264_zigzag_sub_4x4ac_field_ssse3( int16_t level[16], const uint8_t *src, uint8_t *dst, int16_t *dc );
  872.  void x264_zigzag_interleave_8x8_cavlc_mmx( int16_t *dst, int16_t *src, uint8_t *nnz );
  873.  void x264_zigzag_interleave_8x8_cavlc_sse2( dctcoef *dst, dctcoef *src, uint8_t *nnz );
  874. +void x264_zigzag_interleave_8x8_cavlc_avx( dctcoef *dst, dctcoef *src, uint8_t *nnz );
  875.  
  876.  #endif
  877. diff --git a/common/x86/deblock-a.asm b/common/x86/deblock-a.asm
  878. index 42cafa9..80d803d 100644
  879. --- a/common/x86/deblock-a.asm
  880. +++ b/common/x86/deblock-a.asm
  881. @@ -47,20 +47,16 @@ cextern pw_pixel_max
  882.  ; out: %4 = |%1-%2|-%3
  883.  ; clobbers: %5
  884.  %macro ABS_SUB 5
  885. -    mova    %5, %2
  886. -    mova    %4, %1
  887. -    psubusw %5, %1
  888. -    psubusw %4, %2
  889. +    psubusw %5, %2, %1
  890. +    psubusw %4, %1, %2
  891.      por     %4, %5
  892.      psubw   %4, %3
  893.  %endmacro
  894.  
  895.  ; out: %4 = |%1-%2|<%3
  896.  %macro DIFF_LT   5
  897. -    mova    %4, %2
  898. -    mova    %5, %1
  899. -    psubusw %4, %1
  900. -    psubusw %5, %2
  901. +    psubusw %4, %2, %1
  902. +    psubusw %5, %1, %2
  903.      por     %5, %4 ; |%1-%2|
  904.      pxor    %4, %4
  905.      psubw   %5, %3 ; |%1-%2|-%3
  906. @@ -105,11 +101,10 @@ cextern pw_pixel_max
  907.  ; out: %1=p0', m2=q0'
  908.  %macro DEBLOCK_P0_Q0 7
  909.      psubw   %3, %4
  910. -    mova    %6, %2
  911.      pxor    %7, %7
  912.      paddw   %3, [pw_4]
  913.      psubw   %7, %5
  914. -    psubw   %6, %1
  915. +    psubw   %6, %2, %1
  916.      psllw   %6, 2
  917.      paddw   %3, %6
  918.      psraw   %3, 3
  919. @@ -124,8 +119,7 @@ cextern pw_pixel_max
  920.  
  921.  ; in: %1=x2, %2=x1, %3=p0, %4=q0 %5=mask&tc, %6=tmp
  922.  %macro LUMA_Q1 6
  923. -    mova        %6, %3
  924. -    pavgw       %6, %4      ; (p0+q0+1)>>1
  925. +    pavgw       %6, %3, %4      ; (p0+q0+1)>>1
  926.      paddw       %1, %6
  927.      pxor        %6, %6
  928.      psraw       %1, 1
  929. @@ -350,7 +344,8 @@ INIT_XMM
  930.      SWAP        m3, m9
  931.  %endmacro
  932.  
  933. -cglobal deblock_v_luma_sse2, 5,5,15
  934. +%macro DEBLOCK_LUMA_64 1
  935. +cglobal deblock_v_luma_%1, 5,5,15
  936.      %define p2 m8
  937.      %define p1 m0
  938.      %define p0 m1
  939. @@ -386,7 +381,7 @@ cglobal deblock_v_luma_sse2, 5,5,15
  940.      jg .loop
  941.      REP_RET
  942.  
  943. -cglobal deblock_h_luma_sse2, 5,7,15
  944. +cglobal deblock_h_luma_%1, 5,7,15
  945.      add         r1, r1
  946.      LOAD_AB    m12, m13, r2, r3
  947.      mov         r2, r1
  948. @@ -423,6 +418,12 @@ cglobal deblock_h_luma_sse2, 5,7,15
  949.      dec         r6
  950.      jg .loop
  951.      REP_RET
  952. +%endmacro
  953. +
  954. +INIT_XMM
  955. +DEBLOCK_LUMA_64 sse2
  956. +INIT_AVX
  957. +DEBLOCK_LUMA_64 avx
  958.  %endif
  959.  
  960.  %macro SWAPMOVA 2
  961. @@ -437,10 +438,16 @@ cglobal deblock_h_luma_sse2, 5,7,15
  962.  ;     %1=p0 %2=p1 %3=p2 %4=p3 %5=q0 %6=q1 %7=mask0
  963.  ;     %8=mask1p %9=2 %10=p0' %11=p1' %12=p2'
  964.  %macro LUMA_INTRA_P012 12 ; p0..p3 in memory
  965. +%ifdef ARCH_X86_64
  966. +    paddw     t0, %3, %2
  967. +    mova      t2, %4
  968. +    paddw     t2, %3
  969. +%else
  970.      mova      t0, %3
  971.      mova      t2, %4
  972.      paddw     t0, %2
  973.      paddw     t2, %3
  974. +%endif
  975.      paddw     t0, %1
  976.      paddw     t2, t2
  977.      paddw     t0, %5
  978. @@ -448,9 +455,8 @@ cglobal deblock_h_luma_sse2, 5,7,15
  979.      paddw     t0, %9    ; (p2 + p1 + p0 + q0 + 2)
  980.      paddw     t2, t0    ; (2*p3 + 3*p2 + p1 + p0 + q0 + 4)
  981.  
  982. -    mova      t1, t0
  983.      psrlw     t2, 3
  984. -    psrlw     t1, 2
  985. +    psrlw     t1, t0, 2
  986.      psubw     t2, %3
  987.      psubw     t1, %2
  988.      pand      t2, %8
  989. @@ -459,8 +465,7 @@ cglobal deblock_h_luma_sse2, 5,7,15
  990.      paddw     t1, %2
  991.      SWAPMOVA %11, t1
  992.  
  993. -    mova      t1, t0
  994. -    psubw     t1, %3
  995. +    psubw     t1, t0, %3
  996.      paddw     t0, t0
  997.      psubw     t1, %5
  998.      psubw     t0, %3
  999. @@ -500,9 +505,14 @@ cglobal deblock_h_luma_sse2, 5,7,15
  1000.      LOAD_AB t0, t1, r2d, r3d
  1001.      mova    %1, t0
  1002.      LOAD_MASK m0, m1, m2, m3, %1, t1, t0, t2, t3
  1003. +%ifdef ARCH_X86_64
  1004. +    mova    %2, t0        ; mask0
  1005. +    psrlw   t3, %1, 2
  1006. +%else
  1007.      mova    t3, %1
  1008.      mova    %2, t0        ; mask0
  1009.      psrlw   t3, 2
  1010. +%endif
  1011.      paddw   t3, [pw_2]    ; alpha/4+2
  1012.      DIFF_LT m1, m2, t3, t2, t0 ; t2 = |p0-q0| < alpha/4+2
  1013.      pand    t2, %2
  1014. @@ -593,11 +603,11 @@ cglobal deblock_h_luma_sse2, 5,7,15
  1015.  %endmacro
  1016.  
  1017.  %ifdef ARCH_X86_64
  1018. -INIT_XMM
  1019.  ;-----------------------------------------------------------------------------
  1020.  ; void deblock_v_luma_intra( uint16_t *pix, int stride, int alpha, int beta )
  1021.  ;-----------------------------------------------------------------------------
  1022. -cglobal deblock_v_luma_intra_sse2, 4,7,16
  1023. +%macro DEBLOCK_LUMA_INTRA_64 1
  1024. +cglobal deblock_v_luma_intra_%1, 4,7,16
  1025.      %define t0 m1
  1026.      %define t1 m2
  1027.      %define t2 m4
  1028. @@ -646,7 +656,7 @@ cglobal deblock_v_luma_intra_sse2, 4,7,16
  1029.  ;-----------------------------------------------------------------------------
  1030.  ; void deblock_h_luma_intra( uint16_t *pix, int stride, int alpha, int beta )
  1031.  ;-----------------------------------------------------------------------------
  1032. -cglobal deblock_h_luma_intra_sse2, 4,7,16
  1033. +cglobal deblock_h_luma_intra_%1, 4,7,16
  1034.      %define t0 m15
  1035.      %define t1 m14
  1036.      %define t2 m2
  1037. @@ -702,6 +712,13 @@ cglobal deblock_h_luma_intra_sse2, 4,7,16
  1038.      jg .loop
  1039.      ADD    rsp, pad
  1040.      RET
  1041. +%endmacro
  1042. +
  1043. +INIT_XMM
  1044. +DEBLOCK_LUMA_INTRA_64 sse2
  1045. +INIT_AVX
  1046. +DEBLOCK_LUMA_INTRA_64 avx
  1047. +
  1048.  %endif
  1049.  
  1050.  %macro DEBLOCK_LUMA_INTRA 1
  1051. @@ -780,6 +797,9 @@ DEBLOCK_LUMA_INTRA mmxext
  1052.  INIT_XMM
  1053.  DEBLOCK_LUMA sse2
  1054.  DEBLOCK_LUMA_INTRA sse2
  1055. +INIT_AVX
  1056. +DEBLOCK_LUMA avx
  1057. +DEBLOCK_LUMA_INTRA avx
  1058.  %endif
  1059.  %endif ; HIGH_BIT_DEPTH
  1060.  
  1061. @@ -815,28 +835,23 @@ DEBLOCK_LUMA_INTRA sse2
  1062.      punpckl%2  m4, m5
  1063.      punpckh%2  m6, m5
  1064.  
  1065. -    mova       m1, m0
  1066. -    mova       m3, m2
  1067. +    punpckh%3  m1, m0, m4
  1068. +    punpckh%3  m3, m2, m6
  1069.      punpckl%3  m0, m4
  1070. -    punpckh%3  m1, m4
  1071.      punpckl%3  m2, m6
  1072. -    punpckh%3  m3, m6
  1073.  %endmacro
  1074.  
  1075.  ; in: 4 rows of 8 bytes in m0..m3
  1076.  ; out: 8 rows of 4 bytes in %1..%8
  1077.  %macro TRANSPOSE8x4B_STORE 8
  1078. -    mova       m4, m0
  1079. -    mova       m5, m1
  1080. -    mova       m6, m2
  1081. -    punpckhdq  m4, m4
  1082. -    punpckhdq  m5, m5
  1083. -    punpckhdq  m6, m6
  1084. +    punpckhdq  m4, m0, m0
  1085. +    punpckhdq  m5, m1, m1
  1086. +    punpckhdq  m6, m2, m2
  1087.  
  1088.      punpcklbw  m0, m1
  1089.      punpcklbw  m2, m3
  1090. -    mova       m1, m0
  1091. -    punpcklwd  m0, m2
  1092. +    punpcklwd  m1, m0, m2
  1093. +    SWAP       m0, m1
  1094.      punpckhwd  m1, m2
  1095.      movh       %1, m0
  1096.      punpckhdq  m0, m0
  1097. @@ -848,8 +863,8 @@ DEBLOCK_LUMA_INTRA sse2
  1098.      punpckhdq  m3, m3
  1099.      punpcklbw  m4, m5
  1100.      punpcklbw  m6, m3
  1101. -    mova       m5, m4
  1102. -    punpcklwd  m4, m6
  1103. +    punpcklwd  m5, m4, m6
  1104. +    SWAP       m4, m5
  1105.      punpckhwd  m5, m6
  1106.      movh       %5, m4
  1107.      punpckhdq  m4, m4
  1108. @@ -877,19 +892,18 @@ DEBLOCK_LUMA_INTRA sse2
  1109.  %endmacro
  1110.  
  1111.  %macro TRANSPOSE8x2W_STORE 8
  1112. -    mova       m0, m1
  1113. +    punpckhwd  m0, m1, m2
  1114.      punpcklwd  m1, m2
  1115. -    punpckhwd  m0, m2
  1116.  %if mmsize==8
  1117. -    movd       %1, m1
  1118.      movd       %3, m0
  1119. +    movd       %1, m1
  1120.      psrlq      m1, 32
  1121.      psrlq      m0, 32
  1122.      movd       %2, m1
  1123.      movd       %4, m0
  1124.  %else
  1125. -    movd       %1, m1
  1126.      movd       %5, m0
  1127. +    movd       %1, m1
  1128.      psrldq     m1, 4
  1129.      psrldq     m0, 4
  1130.      movd       %2, m1
  1131. @@ -906,9 +920,8 @@ DEBLOCK_LUMA_INTRA sse2
  1132.  %endmacro
  1133.  
  1134.  %macro SBUTTERFLY3 4
  1135. -    movq       %4, %2
  1136. +    punpckh%1  %4, %2, %3
  1137.      punpckl%1  %2, %3
  1138. -    punpckh%1  %4, %3
  1139.  %endmacro
  1140.  
  1141.  ; in: 8 rows of 8 (only the middle 6 pels are used) in %1..%8
  1142. @@ -984,10 +997,15 @@ DEBLOCK_LUMA_INTRA sse2
  1143.  ; out: %4 = |%1-%2|>%3
  1144.  ; clobbers: %5
  1145.  %macro DIFF_GT 5
  1146. +%if avx_enabled == 0
  1147.      mova    %5, %2
  1148.      mova    %4, %1
  1149.      psubusb %5, %1
  1150.      psubusb %4, %2
  1151. +%else
  1152. +    psubusb %5, %2, %1
  1153. +    psubusb %4, %1, %2
  1154. +%endif
  1155.      por     %4, %5
  1156.      psubusb %4, %3
  1157.  %endmacro
  1158. @@ -995,10 +1013,15 @@ DEBLOCK_LUMA_INTRA sse2
  1159.  ; out: %4 = |%1-%2|>%3
  1160.  ; clobbers: %5
  1161.  %macro DIFF_GT2 5
  1162. +%ifdef ARCH_X86_64
  1163. +    psubusb %5, %2, %1
  1164. +    psubusb %4, %1, %2
  1165. +%else
  1166.      mova    %5, %2
  1167.      mova    %4, %1
  1168.      psubusb %5, %1
  1169.      psubusb %4, %2
  1170. +%endif
  1171.      psubusb %5, %3
  1172.      psubusb %4, %3
  1173.      pcmpeqb %4, %5
  1174. @@ -1030,8 +1053,7 @@ DEBLOCK_LUMA_INTRA sse2
  1175.  ; out: m1=p0' m2=q0'
  1176.  ; clobbers: m0,3-6
  1177.  %macro DEBLOCK_P0_Q0 0
  1178. -    mova    m5, m1
  1179. -    pxor    m5, m2       ; p0^q0
  1180. +    pxor    m5, m1, m2   ; p0^q0
  1181.      pand    m5, [pb_1]   ; (p0^q0)&1
  1182.      pcmpeqb m4, m4
  1183.      pxor    m3, m4
  1184. @@ -1057,14 +1079,12 @@ DEBLOCK_LUMA_INTRA sse2
  1185.  ; out: [q1] = clip( (q2+((p0+q0+1)>>1))>>1, q1-tc0, q1+tc0 )
  1186.  ; clobbers: q2, tmp, tc0
  1187.  %macro LUMA_Q1 6
  1188. -    mova    %6, m1
  1189. -    pavgb   %6, m2
  1190. +    pavgb   %6, m1, m2
  1191.      pavgb   %2, %6       ; avg(p2,avg(p0,q0))
  1192.      pxor    %6, %3
  1193.      pand    %6, [pb_1]   ; (p2^avg(p0,q0))&1
  1194.      psubusb %2, %6       ; (p2+((p0+q0+1)>>1))>>1
  1195. -    mova    %6, %1
  1196. -    psubusb %6, %5
  1197. +    psubusb %6, %1, %5
  1198.      paddusb %5, %1
  1199.      pmaxub  %2, %6
  1200.      pminub  %2, %5
  1201. @@ -1075,8 +1095,8 @@ DEBLOCK_LUMA_INTRA sse2
  1202.  ;-----------------------------------------------------------------------------
  1203.  ; void deblock_v_luma( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
  1204.  ;-----------------------------------------------------------------------------
  1205. -INIT_XMM
  1206. -cglobal deblock_v_luma_sse2, 5,5,10
  1207. +%macro DEBLOCK_LUMA 1
  1208. +cglobal deblock_v_luma_%1, 5,5,10
  1209.      movd    m8, [r4] ; tc0
  1210.      lea     r4, [r1*3]
  1211.      dec     r2d        ; alpha-1
  1212. @@ -1100,8 +1120,7 @@ cglobal deblock_v_luma_sse2, 5,5,10
  1213.      movdqa  m3, [r4] ; p2
  1214.      DIFF_GT2 m1, m3, m5, m6, m7 ; |p2-p0| > beta-1
  1215.      pand    m6, m9
  1216. -    mova    m7, m8
  1217. -    psubb   m7, m6
  1218. +    psubb   m7, m8, m6
  1219.      pand    m6, m8
  1220.      LUMA_Q1 m0, m3, [r4], [r4+r1], m6, m4
  1221.  
  1222. @@ -1122,7 +1141,7 @@ cglobal deblock_v_luma_sse2, 5,5,10
  1223.  ; void deblock_h_luma( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
  1224.  ;-----------------------------------------------------------------------------
  1225.  INIT_MMX
  1226. -cglobal deblock_h_luma_sse2, 5,7
  1227. +cglobal deblock_h_luma_%1, 5,7
  1228.      movsxd r10, r1d
  1229.      lea    r11, [r10+r10*2]
  1230.      lea    r6,  [r0-4]
  1231. @@ -1149,7 +1168,7 @@ cglobal deblock_h_luma_sse2, 5,7
  1232.  %ifdef WIN64
  1233.      mov    [rsp+0x20], r4
  1234.  %endif
  1235. -    call   deblock_v_luma_sse2
  1236. +    call   deblock_v_luma_%1
  1237.  
  1238.      ; transpose 16x4 -> original space  (only the middle 4 rows were changed by the filter)
  1239.      add    r6, 2
  1240. @@ -1176,6 +1195,12 @@ cglobal deblock_h_luma_sse2, 5,7
  1241.      add    rsp, 0x68
  1242.  %endif
  1243.      RET
  1244. +%endmacro
  1245. +
  1246. +INIT_XMM
  1247. +DEBLOCK_LUMA sse2
  1248. +INIT_AVX
  1249. +DEBLOCK_LUMA avx
  1250.  
  1251.  %else
  1252.  
  1253. @@ -1212,8 +1237,7 @@ cglobal deblock_%2_luma_%1, 5,5
  1254.      DIFF_GT2 m1, m3, m5, m6, m7 ; |p2-p0| > beta-1
  1255.      pand    m6, m4
  1256.      pand    m4, [esp+%3] ; tc
  1257. -    mova    m7, m4
  1258. -    psubb   m7, m6
  1259. +    psubb   m7, m4, m6
  1260.      pand    m6, m4
  1261.      LUMA_Q1 m0, m3, [r4], [r4+r1], m6, m4
  1262.  
  1263. @@ -1295,22 +1319,34 @@ INIT_MMX
  1264.  DEBLOCK_LUMA mmxext, v8, 8
  1265.  INIT_XMM
  1266.  DEBLOCK_LUMA sse2, v, 16
  1267. +INIT_AVX
  1268. +DEBLOCK_LUMA avx, v, 16
  1269.  
  1270.  %endif ; ARCH
  1271.  
  1272.  
  1273.  
  1274.  %macro LUMA_INTRA_P012 4 ; p0..p3 in memory
  1275. +%ifdef ARCH_X86_64
  1276. +    pavgb t0, p2, p1
  1277. +    pavgb t1, p0, q0
  1278. +%else
  1279.      mova  t0, p2
  1280.      mova  t1, p0
  1281.      pavgb t0, p1
  1282.      pavgb t1, q0
  1283. +%endif
  1284.      pavgb t0, t1 ; ((p2+p1+1)/2 + (p0+q0+1)/2 + 1)/2
  1285.      mova  t5, t1
  1286. +%ifdef ARCH_X86_64
  1287. +    paddb t2, p2, p1
  1288. +    paddb t3, p0, q0
  1289. +%else
  1290.      mova  t2, p2
  1291.      mova  t3, p0
  1292.      paddb t2, p1
  1293.      paddb t3, q0
  1294. +%endif
  1295.      paddb t2, t3
  1296.      mova  t3, t2
  1297.      mova  t4, t2
  1298. @@ -1320,10 +1356,15 @@ DEBLOCK_LUMA sse2, v, 16
  1299.      pand  t2, mpb_1
  1300.      psubb t0, t2 ; p1' = (p2+p1+p0+q0+2)/4;
  1301.  
  1302. +%ifdef ARCH_X86_64
  1303. +    pavgb t1, p2, q1
  1304. +    psubb t2, p2, q1
  1305. +%else
  1306.      mova  t1, p2
  1307.      mova  t2, p2
  1308.      pavgb t1, q1
  1309.      psubb t2, q1
  1310. +%endif
  1311.      paddb t3, t3
  1312.      psubb t3, t2 ; p2+2*p1+2*p0+2*q0+q1
  1313.      pand  t2, mpb_1
  1314. @@ -1336,10 +1377,8 @@ DEBLOCK_LUMA sse2, v, 16
  1315.      pand  t3, mpb_1
  1316.      psubb t1, t3 ; p0'a = (p2+2*p1+2*p0+2*q0+q1+4)/8
  1317.  
  1318. -    mova  t3, p0
  1319. -    mova  t2, p0
  1320. -    pxor  t3, q1
  1321. -    pavgb t2, q1
  1322. +    pxor  t3, p0, q1
  1323. +    pavgb t2, p0, q1
  1324.      pand  t3, mpb_1
  1325.      psubb t2, t3
  1326.      pavgb t2, p1 ; p0'b = (2*p1+p0+q0+2)/4
  1327. @@ -1353,9 +1392,8 @@ DEBLOCK_LUMA sse2, v, 16
  1328.      mova  %1, t1 ; store p0
  1329.  
  1330.      mova  t1, %4 ; p3
  1331. -    mova  t2, t1
  1332. +    paddb t2, t1, p2
  1333.      pavgb t1, p2
  1334. -    paddb t2, p2
  1335.      pavgb t1, t0 ; (p3+p2+1)/2 + (p2+p1+p0+q0+2)/4
  1336.      paddb t2, t2
  1337.      paddb t2, t4 ; 2*p3+3*p2+p1+p0+q0
  1338. @@ -1553,6 +1591,8 @@ cglobal deblock_h_luma_intra_%1, 2,4
  1339.  
  1340.  INIT_XMM
  1341.  DEBLOCK_LUMA_INTRA sse2, v
  1342. +INIT_AVX
  1343. +DEBLOCK_LUMA_INTRA avx , v
  1344.  %ifndef ARCH_X86_64
  1345.  INIT_MMX
  1346.  DEBLOCK_LUMA_INTRA mmxext, v8
  1347. @@ -1566,9 +1606,8 @@ DEBLOCK_LUMA_INTRA mmxext, v8
  1348.      mova    %6, [pw_2]
  1349.      paddw   %6, %3
  1350.      paddw   %6, %4
  1351. -    mova    %7, %6
  1352. +    paddw   %7, %6, %2
  1353.      paddw   %6, %1
  1354. -    paddw   %7, %2
  1355.      paddw   %6, %3
  1356.      paddw   %7, %4
  1357.      psraw   %6, 2
  1358. @@ -1604,12 +1643,10 @@ DEBLOCK_LUMA_INTRA mmxext, v8
  1359.      punpckldq   m2, m7 ; q0 ... q1 ...
  1360.      punpckldq   m4, m1
  1361.      punpckldq   m6, m3
  1362. -    mova        m1, m0
  1363. -    mova        m3, m2
  1364. +    punpckhqdq  m1, m0, m4 ; p0
  1365.      punpcklqdq  m0, m4 ; p1
  1366. -    punpckhqdq  m1, m4 ; p0
  1367. +    punpckhqdq  m3, m2, m6 ; q1
  1368.      punpcklqdq  m2, m6 ; q0
  1369. -    punpckhqdq  m3, m6 ; q1
  1370.  %endif
  1371.  %endmacro
  1372.  
  1373. @@ -1743,6 +1780,8 @@ DEBLOCK_CHROMA mmxext
  1374.  %endif
  1375.  INIT_XMM
  1376.  DEBLOCK_CHROMA sse2
  1377. +INIT_AVX
  1378. +DEBLOCK_CHROMA avx
  1379.  %endif ; HIGH_BIT_DEPTH
  1380.  
  1381.  %ifndef HIGH_BIT_DEPTH
  1382. @@ -1839,6 +1878,8 @@ chroma_inter_body_%1:
  1383.  
  1384.  INIT_XMM
  1385.  DEBLOCK_CHROMA sse2
  1386. +INIT_AVX
  1387. +DEBLOCK_CHROMA avx
  1388.  %ifndef ARCH_X86_64
  1389.  INIT_MMX
  1390.  DEBLOCK_CHROMA mmxext
  1391. @@ -1848,12 +1889,11 @@ DEBLOCK_CHROMA mmxext
  1392.  ; in: %1=p0 %2=p1 %3=q1
  1393.  ; out: p0 = (p0 + q1 + 2*p1 + 2) >> 2
  1394.  %macro CHROMA_INTRA_P0 3
  1395. -    mova    m4, %1
  1396. -    pxor    m4, %3
  1397. +    pxor    m4, %1, %3
  1398.      pand    m4, [pb_1] ; m4 = (p0^q1)&1
  1399.      pavgb   %1, %3
  1400.      psubusb %1, m4
  1401. -    pavgb   %1, %2      ; dst = avg(p1, avg(p0,q1) - ((p0^q1)&1))
  1402. +    pavgb   %1, %2     ; dst = avg(p1, avg(p0,q1) - ((p0^q1)&1))
  1403.  %endmacro
  1404.  
  1405.  %define t5 r4
  1406. @@ -1905,6 +1945,8 @@ chroma_intra_body_%1:
  1407.  
  1408.  INIT_XMM
  1409.  DEBLOCK_CHROMA_INTRA sse2
  1410. +INIT_AVX
  1411. +DEBLOCK_CHROMA_INTRA avx
  1412.  %ifndef ARCH_X86_64
  1413.  INIT_MMX
  1414.  DEBLOCK_CHROMA_INTRA mmxext
  1415. @@ -1993,9 +2035,8 @@ DEBLOCK_CHROMA_INTRA mmxext
  1416.      shufps    m2, m1, 0xdd ; cur nnz, all rows
  1417.      pslldq    m1, 1
  1418.      shufps    m0, m1, 0xdd ; left neighbors
  1419. -    mova      m1, m2
  1420. +    pslldq    m1, m2, 4
  1421.      movd      m3, [%1-8] ; could be palignr if nnz was aligned
  1422. -    pslldq    m1, 4
  1423.      por       m1, m3 ; top neighbors
  1424.  %endmacro
  1425.  
  1426. @@ -2065,23 +2106,19 @@ cglobal deblock_strength_%1, 6,6,8
  1427.      por       m5, m1
  1428.  
  1429.      ; Check mvs
  1430. -%ifidn %1, ssse3
  1431. -    mova      m3, [mv+4*8*0]
  1432. -    mova      m2, [mv+4*8*1]
  1433. -    mova      m0, m3
  1434. -    mova      m1, m2
  1435. -    palignr   m3, [mv+4*8*0-16], 12
  1436. -    palignr   m2, [mv+4*8*1-16], 12
  1437. +%ifidn %1, ssse3 || %1, avx
  1438. +    mova      m0, [mv+4*8*0]
  1439. +    mova      m1, [mv+4*8*1]
  1440. +    palignr   m3, m0, [mv+4*8*0-16], 12
  1441. +    palignr   m2, m1, [mv+4*8*1-16], 12
  1442.      psubw     m0, m3
  1443.      psubw     m1, m2
  1444.      packsswb  m0, m1
  1445.  
  1446. -    mova      m3, [mv+4*8*2]
  1447. -    mova      m7, [mv+4*8*3]
  1448. -    mova      m2, m3
  1449. -    mova      m1, m7
  1450. -    palignr   m3, [mv+4*8*2-16], 12
  1451. -    palignr   m7, [mv+4*8*3-16], 12
  1452. +    mova      m2, [mv+4*8*2]
  1453. +    mova      m1, [mv+4*8*3]
  1454. +    palignr   m3, m2, [mv+4*8*2-16], 12
  1455. +    palignr   m7, m1, [mv+4*8*3-16], 12
  1456.      psubw     m2, m3
  1457.      psubw     m1, m7
  1458.      packsswb  m2, m1
  1459. @@ -2153,3 +2190,5 @@ INIT_XMM
  1460.  DEBLOCK_STRENGTH_XMM sse2
  1461.  %define ABSB2 ABSB2_SSSE3
  1462.  DEBLOCK_STRENGTH_XMM ssse3
  1463. +INIT_AVX
  1464. +DEBLOCK_STRENGTH_XMM avx
  1465. diff --git a/common/x86/mc-a.asm b/common/x86/mc-a.asm
  1466. index 121d14e..e7cbf19 100644
  1467. --- a/common/x86/mc-a.asm
  1468. +++ b/common/x86/mc-a.asm
  1469. @@ -155,7 +155,6 @@ cextern pd_32
  1470.  %endmacro
  1471.  
  1472.  %ifdef HIGH_BIT_DEPTH
  1473. -
  1474.  %macro BIWEIGHT_ROW 4
  1475.      BIWEIGHT   [%2], [%3]
  1476.  %if %4==mmsize/4
  1477. @@ -456,6 +455,11 @@ WEIGHTER 16, sse2
  1478.  WEIGHTER 20, sse2
  1479.  %ifdef HIGH_BIT_DEPTH
  1480.  WEIGHTER 12, sse2
  1481. +INIT_AVX
  1482. +WEIGHTER  8, avx
  1483. +WEIGHTER 12, avx
  1484. +WEIGHTER 16, avx
  1485. +WEIGHTER 20, avx
  1486.  %else
  1487.  %define WEIGHT WEIGHT_SSSE3
  1488.  %define WEIGHT_START WEIGHT_START_SSSE3
  1489. @@ -465,6 +469,10 @@ INIT_XMM
  1490.  WEIGHTER  8, ssse3
  1491.  WEIGHTER 16, ssse3
  1492.  WEIGHTER 20, ssse3
  1493. +INIT_AVX
  1494. +WEIGHTER  8, avx
  1495. +WEIGHTER 16, avx
  1496. +WEIGHTER 20, avx
  1497.  %endif
  1498.  
  1499.  %macro OFFSET_OP 7
  1500. @@ -541,8 +549,15 @@ INIT_XMM
  1501.  OFFSETPN 12, sse2
  1502.  OFFSETPN 16, sse2
  1503.  OFFSETPN 20, sse2
  1504. +INIT_AVX
  1505. +OFFSETPN 12, avx
  1506. +OFFSETPN 16, avx
  1507. +OFFSETPN 20, avx
  1508.  %ifdef HIGH_BIT_DEPTH
  1509. +INIT_XMM
  1510.  OFFSETPN  8, sse2
  1511. +INIT_AVX
  1512. +OFFSETPN  8, avx
  1513.  %endif
  1514.  %undef LOAD_HEIGHT
  1515.  %undef HEIGHT_REG
  1516. @@ -616,7 +631,6 @@ AVGH 16, 16, mmxext
  1517.  AVGH 16,  8, mmxext
  1518.  
  1519.  INIT_XMM
  1520. -
  1521.  AVG_FUNC 4, movq, movq, sse2
  1522.  AVGH  4, 8, sse2
  1523.  AVGH  4, 4, sse2
  1524. @@ -1450,16 +1464,15 @@ cglobal prefetch_ref_mmxext, 3,3
  1525.  %macro UNPACK_UNALIGNED 4
  1526.      movu       %1, [%4+0]
  1527.      movu       %2, [%4+4]
  1528. -    mova       %3, %1
  1529. +    punpckhwd  %3, %1, %2
  1530.      punpcklwd  %1, %2
  1531. -    punpckhwd  %3, %2
  1532. -    mova       %2, %1
  1533.  %if mmsize == 8
  1534. +    mova       %2, %1
  1535.      punpcklwd  %1, %3
  1536.      punpckhwd  %2, %3
  1537.  %else
  1538. +    shufps     %2, %1, %3, 11011101b
  1539.      shufps     %1, %3, 10001000b
  1540. -    shufps     %2, %3, 11011101b
  1541.  %endif
  1542.  %endmacro
  1543.  %else ; !HIGH_BIT_DEPTH
  1544. @@ -1620,12 +1633,10 @@ ALIGN 4
  1545.      movu       m1, [r3+mmsize/2]
  1546.      UNPACK_UNALIGNED m0, m2, [r3+2]
  1547.      UNPACK_UNALIGNED m1, m3, [r3+2+mmsize/2]
  1548. -    mova       m2, m0
  1549. -    mova       m3, m1
  1550. +    psrlw      m2, m0, 8
  1551. +    psrlw      m3, m1, 8
  1552.      pand       m0, [pw_00ff]
  1553.      pand       m1, [pw_00ff]
  1554. -    psrlw      m2, 8
  1555. -    psrlw      m3, 8
  1556.  %endif
  1557.      pmaddwd    m0, m7
  1558.      pmaddwd    m2, m7
  1559. @@ -1652,12 +1663,10 @@ ALIGN 4
  1560.      movu       m1, [r3+mmsize/2]
  1561.      UNPACK_UNALIGNED m0, m2, [r3+2]
  1562.      UNPACK_UNALIGNED m1, m3, [r3+2+mmsize/2]
  1563. -    mova       m2, m0
  1564. -    mova       m3, m1
  1565. +    psrlw      m2, m0, 8
  1566. +    psrlw      m3, m1, 8
  1567.      pand       m0, [pw_00ff]
  1568.      pand       m1, [pw_00ff]
  1569. -    psrlw      m2, 8
  1570. -    psrlw      m3, 8
  1571.      pmaddwd    m0, m7
  1572.      pmaddwd    m2, m7
  1573.      pmaddwd    m1, m7
  1574. @@ -1668,9 +1677,8 @@ ALIGN 4
  1575.      pmullw     m4, m6
  1576.      pmullw     m5, m6
  1577.      mova       m2, [pw_32]
  1578. -    mova       m3, m2
  1579. +    paddw      m3, m2, m5
  1580.      paddw      m2, m4
  1581. -    paddw      m3, m5
  1582.      mova       m4, m0
  1583.      mova       m5, m1
  1584.      pmullw     m0, multy0
  1585. @@ -1799,12 +1807,10 @@ ALIGN 4
  1586.      movhps     m0, [r3]
  1587.      movhps     m1, [r3+r6]
  1588.  %endif
  1589. -    mova       m2, m0
  1590. -    mova       m3, m1
  1591. +    psrlw      m2, m0, 8
  1592. +    psrlw      m3, m1, 8
  1593.      pand       m0, [pw_00ff]
  1594.      pand       m1, [pw_00ff]
  1595. -    psrlw      m2, 8
  1596. -    psrlw      m3, 8
  1597.  %endif ; HIGH_BIT_DEPTH
  1598.      pmullw     m0, m4
  1599.      pmullw     m1, m5
  1600. @@ -1868,9 +1874,8 @@ ALIGN 4
  1601.  %endmacro ; MC_CHROMA
  1602.  
  1603.  
  1604. -%macro MC_CHROMA_SSSE3 0-1
  1605. -INIT_XMM
  1606. -cglobal mc_chroma_ssse3%1, 0,6,9
  1607. +%macro MC_CHROMA_SSSE3 1-2
  1608. +cglobal mc_chroma_%1, 0,6,9
  1609.      MC_CHROMA_START
  1610.      and       r5d, 7
  1611.      and       t2d, 7
  1612. @@ -1884,7 +1889,7 @@ cglobal mc_chroma_ssse3%1, 0,6,9
  1613.      imul      r5d, t0d ; (x*255+8)*(8-y)
  1614.      movd       m6, t2d
  1615.      movd       m7, r5d
  1616. -%ifidn %1, _cache64
  1617. +%ifidn %2, _cache64
  1618.      mov       t0d, r3d
  1619.      and       t0d, 7
  1620.  %ifdef PIC
  1621. @@ -1913,11 +1918,10 @@ cglobal mc_chroma_ssse3%1, 0,6,9
  1622.      pshufb     m1, m5
  1623.      movu       m3, [r3+r4*2]
  1624.      pshufb     m3, m5
  1625. -    mova       m2, m1
  1626.      mova       m4, m3
  1627.      pmaddubsw  m0, m7
  1628. +    pmaddubsw  m2, m1, m7
  1629.      pmaddubsw  m1, m6
  1630. -    pmaddubsw  m2, m7
  1631.      pmaddubsw  m3, m6
  1632.      paddw      m0, [pw_32]
  1633.      paddw      m2, [pw_32]
  1634. @@ -2008,6 +2012,8 @@ INIT_MMX
  1635.  MC_CHROMA mmxext
  1636.  INIT_XMM
  1637.  MC_CHROMA sse2
  1638. +INIT_AVX
  1639. +MC_CHROMA avx
  1640.  %else ; !HIGH_BIT_DEPTH
  1641.  INIT_MMX
  1642.  %define UNPACK_UNALIGNED UNPACK_UNALIGNED_MEM
  1643. @@ -2016,6 +2022,9 @@ INIT_XMM
  1644.  MC_CHROMA sse2_misalign
  1645.  %define UNPACK_UNALIGNED UNPACK_UNALIGNED_LOAD
  1646.  MC_CHROMA sse2
  1647. -MC_CHROMA_SSSE3
  1648. -MC_CHROMA_SSSE3 _cache64
  1649. +MC_CHROMA_SSSE3 ssse3
  1650. +MC_CHROMA_SSSE3 ssse3_cache64, _cache64
  1651. +INIT_AVX
  1652. +MC_CHROMA_SSSE3 avx
  1653. +MC_CHROMA_SSSE3 avx_cache64, _cache64
  1654.  %endif ; HIGH_BIT_DEPTH
  1655. diff --git a/common/x86/mc-a2.asm b/common/x86/mc-a2.asm
  1656. index cba9773..d472678 100644
  1657. --- a/common/x86/mc-a2.asm
  1658. +++ b/common/x86/mc-a2.asm
  1659. @@ -73,12 +73,10 @@ cextern pd_ffff
  1660.  %macro LOAD_ADD_2 6
  1661.      mova       %5, %3
  1662.      mova       %1, %4
  1663. -    mova       %6, %5
  1664. -    mova       %2, %1
  1665. +    punpckhbw  %6, %5, m0
  1666.      punpcklbw  %5, m0
  1667. +    punpckhbw  %2, %1, m0
  1668.      punpcklbw  %1, m0
  1669. -    punpckhbw  %6, m0
  1670. -    punpckhbw  %2, m0
  1671.      paddw      %1, %5
  1672.      paddw      %2, %6
  1673.  %endmacro
  1674. @@ -301,7 +299,7 @@ cglobal hpel_filter_h_%1, 3,4,8*(mmsize/16)
  1675.      mova      [r0+r2-mmsize*1], m4
  1676.      jl .loop
  1677.      REP_RET
  1678. -%endmacro
  1679. +%endmacro ; HPEL_FILTER
  1680.  
  1681.  INIT_MMX
  1682.  HPEL_FILTER mmxext
  1683. @@ -310,8 +308,6 @@ HPEL_FILTER sse2
  1684.  %endif ; HIGH_BIT_DEPTH
  1685.  
  1686.  %ifndef HIGH_BIT_DEPTH
  1687. -INIT_MMX
  1688. -
  1689.  %macro HPEL_V 1-2 0
  1690.  ;-----------------------------------------------------------------------------
  1691.  ; void hpel_filter_v( uint8_t *dst, uint8_t *src, int16_t *buf, int stride, int width );
  1692. @@ -326,13 +322,13 @@ cglobal hpel_filter_v_%1, 5,6,%2
  1693.      add r0, r4
  1694.      lea r2, [r2+r4*2]
  1695.      neg r4
  1696. -%ifnidn %1, ssse3
  1697. +%ifidn %1, sse2
  1698.      pxor m0, m0
  1699.  %else
  1700.      mova m0, [filt_mul15]
  1701.  %endif
  1702.  .loop:
  1703. -%ifidn %1, ssse3
  1704. +%ifnidn %1, sse2
  1705.      mova m1, [r1]
  1706.      mova m4, [r1+r3]
  1707.      mova m2, [r5+r3*2]
  1708. @@ -370,7 +366,6 @@ cglobal hpel_filter_v_%1, 5,6,%2
  1709.      jl .loop
  1710.      REP_RET
  1711.  %endmacro
  1712. -HPEL_V mmxext
  1713.  
  1714.  ;-----------------------------------------------------------------------------
  1715.  ; void hpel_filter_c( uint8_t *dst, int16_t *buf, int width );
  1716. @@ -585,19 +580,14 @@ cglobal hpel_filter_h_ssse3, 3,3
  1717.      mova      m7, [pw_16]
  1718.  .loop:
  1719.      mova      m2, [src+16]
  1720. -    mova      m3, m1
  1721. -    palignr   m3, m0, 14
  1722. -    mova      m4, m1
  1723. -    palignr   m4, m0, 15
  1724. -    mova      m0, m2
  1725. -    palignr   m0, m1, 2
  1726. +    palignr   m3, m1, m0, 14
  1727. +    palignr   m4, m1, m0, 15
  1728. +    palignr   m0, m2, m1, 2
  1729.      pmaddubsw m3, [filt_mul15]
  1730.      pmaddubsw m4, [filt_mul15]
  1731.      pmaddubsw m0, [filt_mul51]
  1732. -    mova      m5, m2
  1733. -    palignr   m5, m1, 1
  1734. -    mova      m6, m2
  1735. -    palignr   m6, m1, 3
  1736. +    palignr   m5, m2, m1, 1
  1737. +    palignr   m6, m2, m1, 3
  1738.      paddw     m3, m0
  1739.      mova      m0, m1
  1740.      pmaddubsw m1, [filt_mul20]
  1741. @@ -613,9 +603,12 @@ cglobal hpel_filter_h_ssse3, 3,3
  1742.      add r2, 16
  1743.      jl .loop
  1744.      REP_RET
  1745. -%endif
  1746. +%endif ; !ARCH_X86_64
  1747.  
  1748.  %define PALIGNR PALIGNR_MMX
  1749. +INIT_MMX
  1750. +HPEL_V mmxext
  1751. +INIT_XMM
  1752.  %ifndef ARCH_X86_64
  1753.  HPEL_C sse2
  1754.  %endif
  1755. @@ -624,9 +617,11 @@ HPEL_C sse2_misalign
  1756.  %define PALIGNR PALIGNR_SSSE3
  1757.  HPEL_C ssse3
  1758.  HPEL_V ssse3
  1759. +INIT_AVX
  1760. +HPEL_C avx
  1761. +HPEL_V avx
  1762.  
  1763.  %ifdef ARCH_X86_64
  1764. -
  1765.  %macro DO_FILT_V 6
  1766.      ;The optimum prefetch distance is difficult to determine in checkasm:
  1767.      ;any prefetch seems slower than not prefetching.
  1768. @@ -634,22 +629,19 @@ HPEL_V ssse3
  1769.      ;+16 is picked somewhat arbitrarily here based on the fact that even one
  1770.      ;loop iteration is going to take longer than the prefetch.
  1771.      prefetcht0 [r1+r2*2+16]
  1772. -%ifidn %6, ssse3
  1773. +%ifnidn %6, sse2
  1774.      mova m1, [r3]
  1775.      mova m2, [r3+r2]
  1776.      mova %3, [r3+r2*2]
  1777.      mova m3, [r1]
  1778.      mova %1, [r1+r2]
  1779.      mova %2, [r1+r2*2]
  1780. -    mova m4, m1
  1781. +    punpckhbw m4, m1, m2
  1782.      punpcklbw m1, m2
  1783. -    punpckhbw m4, m2
  1784. -    mova m2, %1
  1785. +    punpckhbw m2, %1, %2
  1786.      punpcklbw %1, %2
  1787. -    punpckhbw m2, %2
  1788. -    mova %2, m3
  1789. +    punpckhbw %2, m3, %3
  1790.      punpcklbw m3, %3
  1791. -    punpckhbw %2, %3
  1792.  
  1793.      pmaddubsw m1, m12
  1794.      pmaddubsw m4, m12
  1795. @@ -677,7 +669,18 @@ HPEL_V ssse3
  1796.      movntps  [r11+r4+%5], m1
  1797.  %endmacro
  1798.  
  1799. -%macro FILT_C 4
  1800. +%macro FILT_C 5
  1801. +%ifidn %5, avx
  1802. +    palignr   m1, %2, %1, 12
  1803. +    palignr   m2, %2, %1, 14
  1804. +    palignr   m3, %3, %2, 4
  1805. +    palignr   m4, %3, %2, 2
  1806. +    paddw     m3, m2
  1807. +    mova      %1, %3
  1808. +    PALIGNR   %3, %2, 6, m2
  1809. +    paddw     m4, %2
  1810. +    paddw     %3, m1
  1811. +%else
  1812.      mova      m1, %2
  1813.      PALIGNR   m1, %1, 12, m2
  1814.      mova      m2, %2
  1815. @@ -691,28 +694,34 @@ HPEL_V ssse3
  1816.      PALIGNR   %3, %2, 6, m2
  1817.      paddw     m4, %2
  1818.      paddw     %3, m1
  1819. +%endif
  1820.      FILT_H    %3, m3, m4
  1821.  %endmacro
  1822.  
  1823. -%macro DO_FILT_C 4
  1824. -    FILT_C %1, %2, %3, 6
  1825. -    FILT_C %2, %1, %4, 6
  1826. +%macro DO_FILT_C 5
  1827. +    FILT_C %1, %2, %3, 6, %5
  1828. +    FILT_C %2, %1, %4, 6, %5
  1829.      FILT_PACK %3, %4, 6, m15
  1830.      movntps   [r5+r4], %3
  1831.  %endmacro
  1832.  
  1833.  %macro ADD8TO16 5
  1834. -    mova      %3, %1
  1835. -    mova      %4, %2
  1836. +    punpckhbw %3, %1, %5
  1837.      punpcklbw %1, %5
  1838. +    punpcklbw %4, %2, %5
  1839.      punpckhbw %2, %5
  1840. -    punpckhbw %3, %5
  1841. -    punpcklbw %4, %5
  1842.      paddw     %2, %3
  1843.      paddw     %1, %4
  1844.  %endmacro
  1845.  
  1846.  %macro DO_FILT_H 4
  1847. +%ifidn %4, avx
  1848. +    palignr   m1, %2, %1, 14
  1849. +    palignr   m2, %2, %1, 15
  1850. +    palignr   m4, %3, %2, 1
  1851. +    palignr   m5, %3, %2, 2
  1852. +    palignr   m6, %3, %2, 3
  1853. +%else
  1854.      mova      m1, %2
  1855.      PALIGNR   m1, %1, 14, m3
  1856.      mova      m2, %2
  1857. @@ -723,6 +732,7 @@ HPEL_V ssse3
  1858.      PALIGNR   m5, %2, 2 , m3
  1859.      mova      m6, %3
  1860.      PALIGNR   m6, %2, 3 , m3
  1861. +%endif
  1862.      mova      %1, %2
  1863.  %ifidn %4, sse2
  1864.      ADD8TO16  m1, m6, m12, m3, m0 ; a
  1865. @@ -730,7 +740,7 @@ HPEL_V ssse3
  1866.      ADD8TO16  %2, m4, m12, m3, m0 ; c
  1867.      FILT_V2   m1, m2, %2, m6, m5, m4
  1868.      FILT_PACK m1, m6, 5, m15
  1869. -%else ; ssse3
  1870. +%else ; ssse3, avx
  1871.      pmaddubsw m1, m12
  1872.      pmaddubsw m2, m12
  1873.      pmaddubsw %2, m14
  1874. @@ -790,7 +800,7 @@ cglobal hpel_filter_%1, 7,7,16
  1875.      DO_FILT_V m6, m5, m11, m12, 16, %1
  1876.  .lastx:
  1877.      paddw   m15, m15 ; pw_32
  1878. -    DO_FILT_C m9, m8, m7, m6
  1879. +    DO_FILT_C m9, m8, m7, m6, %1
  1880.      psrlw   m15, 1 ; pw_16
  1881.      movdqa   m7, m5
  1882.      DO_FILT_H m10, m13, m11, %1
  1883. @@ -813,11 +823,14 @@ cglobal hpel_filter_%1, 7,7,16
  1884.      RET
  1885.  %endmacro
  1886.  
  1887. +INIT_XMM
  1888.  %define PALIGNR PALIGNR_MMX
  1889.  HPEL sse2
  1890.  %define PALIGNR PALIGNR_SSSE3
  1891.  HPEL ssse3
  1892. -%endif
  1893. +INIT_AVX
  1894. +HPEL avx
  1895. +%endif ; ARCH_X86_64
  1896.  
  1897.  %undef movntq
  1898.  %undef movntps
  1899. @@ -890,9 +903,8 @@ cglobal plane_copy_core_mmxext, 6,7
  1900.  %rep 16/mmsize
  1901.      mov%4     m0, [%2+(x/2)*mmsize]
  1902.      mov%4     m1, [%3+(x/2)*mmsize]
  1903. -    mova      m2, m0
  1904. +    punpckhwd m2, m0, m1
  1905.      punpcklwd m0, m1
  1906. -    punpckhwd m2, m1
  1907.      mov%5a    [%1+(x+0)*mmsize], m0
  1908.      mov%5a    [%1+(x+1)*mmsize], m2
  1909.      %assign x (x+2)
  1910. @@ -909,9 +921,8 @@ cglobal plane_copy_core_mmxext, 6,7
  1911.      mov%5a [%1], m0
  1912.  %else
  1913.      movq   m1, [%3]
  1914. -    mova   m2, m0
  1915. +    punpckhbw m2, m0, m1
  1916.      punpcklbw m0, m1
  1917. -    punpckhbw m2, m1
  1918.      mov%5a [%1+0], m0
  1919.      mov%5a [%1+8], m2
  1920.  %endif
  1921. @@ -924,12 +935,10 @@ cglobal plane_copy_core_mmxext, 6,7
  1922.  %rep 16/mmsize
  1923.      mova     m0, [%3+(n+0)*mmsize]
  1924.      mova     m1, [%3+(n+1)*mmsize]
  1925. -    mova     m2, m0
  1926. -    mova     m3, m1
  1927. +    psrld    m2, m0, 16
  1928. +    psrld    m3, m1, 16
  1929.      pand     m0, %6
  1930.      pand     m1, %6
  1931. -    psrld    m2, 16
  1932. -    psrld    m3, 16
  1933.      packssdw m0, m1
  1934.      packssdw m2, m3
  1935.      mov%7    [%1+(n/2)*mmsize], m0
  1936. @@ -1142,6 +1151,9 @@ PLANE_DEINTERLEAVE mmx
  1937.  INIT_XMM
  1938.  PLANE_INTERLEAVE sse2
  1939.  PLANE_DEINTERLEAVE sse2
  1940. +INIT_AVX
  1941. +PLANE_INTERLEAVE avx
  1942. +PLANE_DEINTERLEAVE avx
  1943.  %else
  1944.  INIT_MMX
  1945.  PLANE_INTERLEAVE mmxext
  1946. @@ -1258,7 +1270,8 @@ cglobal integral_init4h_sse4, 3,4
  1947.      jl .loop
  1948.      REP_RET
  1949.  
  1950. -cglobal integral_init8h_sse4, 3,4
  1951. +%macro INTEGRAL_INIT8H 1
  1952. +cglobal integral_init8h_%1, 3,4
  1953.      lea     r3, [r0+r2*2]
  1954.      add     r1, r2
  1955.      neg     r2
  1956. @@ -1267,12 +1280,10 @@ cglobal integral_init8h_sse4, 3,4
  1957.      movdqa  m0, [r1+r2]
  1958.      movdqa  m1, [r1+r2+16]
  1959.      palignr m1, m0, 8
  1960. -    movdqa  m2, m0
  1961. -    movdqa  m3, m1
  1962. +    mpsadbw m2, m0, m4, 4
  1963. +    mpsadbw m3, m1, m4, 4
  1964.      mpsadbw m0, m4, 0
  1965.      mpsadbw m1, m4, 0
  1966. -    mpsadbw m2, m4, 4
  1967. -    mpsadbw m3, m4, 4
  1968.      paddw   m0, [r0+r2*2]
  1969.      paddw   m1, [r0+r2*2+16]
  1970.      paddw   m0, m2
  1971. @@ -1282,6 +1293,12 @@ cglobal integral_init8h_sse4, 3,4
  1972.      add     r2, 16
  1973.      jl .loop
  1974.      REP_RET
  1975. +%endmacro
  1976. +
  1977. +INIT_XMM
  1978. +INTEGRAL_INIT8H sse4
  1979. +INIT_AVX
  1980. +INTEGRAL_INIT8H avx
  1981.  
  1982.  %macro INTEGRAL_INIT_8V 1
  1983.  ;-----------------------------------------------------------------------------
  1984. @@ -1394,12 +1411,10 @@ cglobal integral_init4v_ssse3, 3,5
  1985.      PALIGNR   %2, %4, 1, m6
  1986.      pavgb     %1, %3
  1987.      pavgb     %2, %4
  1988. -    mova      %5, %1
  1989. -    mova      %6, %2
  1990. +    psrlw     %5, %1, 8
  1991. +    psrlw     %6, %2, 8
  1992.      pand      %1, m7
  1993.      pand      %2, m7
  1994. -    psrlw     %5, 8
  1995. -    psrlw     %6, 8
  1996.  %endmacro
  1997.  
  1998.  %macro FILT16x2 4
  1999. @@ -1411,12 +1426,10 @@ cglobal integral_init4v_ssse3, 3,5
  2000.      pavgb     %1, m3
  2001.      PALIGNR   m3, m2, 1, m6
  2002.      pavgb     m3, m2
  2003. -    mova      m5, m3
  2004. -    mova      m4, %1
  2005. +    psrlw     m5, m3, 8
  2006. +    psrlw     m4, %1, 8
  2007.      pand      m3, m7
  2008.      pand      %1, m7
  2009. -    psrlw     m5, 8
  2010. -    psrlw     m4, 8
  2011.      packuswb  m3, %1
  2012.      packuswb  m5, m4
  2013.      mova    [%2], m3
  2014. @@ -1435,12 +1448,10 @@ cglobal integral_init4v_ssse3, 3,5
  2015.      pavgb     m0, [r0+%3+r5+1]
  2016.      pavgb     m1, m3
  2017.      pavgb     m0, m2
  2018. -    mova      m3, m1
  2019. -    mova      m2, m0
  2020. +    psrlw     m3, m1, 8
  2021. +    psrlw     m2, m0, 8
  2022.      pand      m1, m7
  2023.      pand      m0, m7
  2024. -    psrlw     m3, 8
  2025. -    psrlw     m2, 8
  2026.      packuswb  m0, m1
  2027.      packuswb  m2, m3
  2028.      mova    [%1], m0
  2029. @@ -1458,12 +1469,10 @@ cglobal integral_init4v_ssse3, 3,5
  2030.      pavgw     m0, [r0+%3+r5+2]
  2031.      pavgw     m1, m3
  2032.      pavgw     m0, m2
  2033. -    mova      m3, m1
  2034. -    mova      m2, m0
  2035. +    psrld     m3, m1, 16
  2036. +    psrld     m2, m0, 16
  2037.      pand      m1, m7
  2038.      pand      m0, m7
  2039. -    psrld     m3, 16
  2040. -    psrld     m2, 16
  2041.      packssdw  m0, m1
  2042.      packssdw  m2, m3
  2043.      movu    [%1], m0
  2044. @@ -1479,12 +1488,10 @@ cglobal integral_init4v_ssse3, 3,5
  2045.      pavgw     %1, m3
  2046.      PALIGNR   m3, m2, 2, m6
  2047.      pavgw     m3, m2
  2048. -    mova      m5, m3
  2049. -    mova      m4, %1
  2050. +    psrld     m5, m3, 16
  2051. +    psrld     m4, %1, 16
  2052.      pand      m3, m7
  2053.      pand      %1, m7
  2054. -    psrld     m5, 16
  2055. -    psrld     m4, 16
  2056.      packssdw  m3, %1
  2057.      packssdw  m5, m4
  2058.      mova    [%2], m3
  2059. diff --git a/common/x86/mc-c.c b/common/x86/mc-c.c
  2060. index 16097a2..f5116f1 100644
  2061. --- a/common/x86/mc-c.c
  2062. +++ b/common/x86/mc-c.c
  2063. @@ -71,6 +71,11 @@ MC_WEIGHT( 8, ssse3 )
  2064.  MC_WEIGHT( 12, ssse3 )
  2065.  MC_WEIGHT( 16, ssse3 )
  2066.  MC_WEIGHT( 20, ssse3 )
  2067. +MC_WEIGHT( 4, avx )
  2068. +MC_WEIGHT( 8, avx )
  2069. +MC_WEIGHT( 12, avx )
  2070. +MC_WEIGHT( 16, avx )
  2071. +MC_WEIGHT( 20, avx )
  2072.  #undef MC_OFFSET
  2073.  #undef MC_WEIGHT
  2074.  
  2075. @@ -92,6 +97,9 @@ void x264_plane_copy_interleave_core_mmxext( pixel *dst, int i_dst,
  2076.  void x264_plane_copy_interleave_core_sse2( pixel *dst, int i_dst,
  2077.                                             pixel *srcu, int i_srcu,
  2078.                                             pixel *srcv, int i_srcv, int w, int h );
  2079. +void x264_plane_copy_interleave_core_avx( pixel *dst, int i_dst,
  2080. +                                           pixel *srcu, int i_srcu,
  2081. +                                           pixel *srcv, int i_srcv, int w, int h );
  2082.  void x264_plane_copy_interleave_c( pixel *dst, int i_dst,
  2083.                                     pixel *srcu, int i_srcu,
  2084.                                     pixel *srcv, int i_srcv, int w, int h );
  2085. @@ -104,20 +112,27 @@ void x264_plane_copy_deinterleave_sse2( pixel *dstu, int i_dstu,
  2086.  void x264_plane_copy_deinterleave_ssse3( uint8_t *dstu, int i_dstu,
  2087.                                           uint8_t *dstv, int i_dstv,
  2088.                                           uint8_t *src, int i_src, int w, int h );
  2089. +void x264_plane_copy_deinterleave_avx( uint16_t *dstu, int i_dstu,
  2090. +                                         uint16_t *dstv, int i_dstv,
  2091. +                                         uint16_t *src, int i_src, int w, int h );
  2092.  void x264_store_interleave_8x8x2_mmxext( pixel *dst, int i_dst, pixel *srcu, pixel *srcv );
  2093.  void x264_store_interleave_8x8x2_sse2( pixel *dst, int i_dst, pixel *srcu, pixel *srcv );
  2094. +void x264_store_interleave_8x8x2_avx( pixel *dst, int i_dst, pixel *srcu, pixel *srcv );
  2095.  void x264_load_deinterleave_8x8x2_fenc_mmx( pixel *dst, pixel *src, int i_src );
  2096.  void x264_load_deinterleave_8x8x2_fenc_sse2( pixel *dst, pixel *src, int i_src );
  2097.  void x264_load_deinterleave_8x8x2_fenc_ssse3( uint8_t *dst, uint8_t *src, int i_src );
  2098. +void x264_load_deinterleave_8x8x2_fenc_avx( uint16_t *dst, uint16_t *src, int i_src );
  2099.  void x264_load_deinterleave_8x8x2_fdec_mmx( pixel *dst, pixel *src, int i_src );
  2100.  void x264_load_deinterleave_8x8x2_fdec_sse2( pixel *dst, pixel *src, int i_src );
  2101.  void x264_load_deinterleave_8x8x2_fdec_ssse3( uint8_t *dst, uint8_t *src, int i_src );
  2102. +void x264_load_deinterleave_8x8x2_fdec_avx( uint16_t *dst, uint16_t *src, int i_src );
  2103.  void *x264_memcpy_aligned_mmx( void * dst, const void * src, size_t n );
  2104.  void *x264_memcpy_aligned_sse2( void * dst, const void * src, size_t n );
  2105.  void x264_memzero_aligned_mmx( void * dst, int n );
  2106.  void x264_memzero_aligned_sse2( void * dst, int n );
  2107.  void x264_integral_init4h_sse4( uint16_t *sum, uint8_t *pix, int stride );
  2108.  void x264_integral_init8h_sse4( uint16_t *sum, uint8_t *pix, int stride );
  2109. +void x264_integral_init8h_avx ( uint16_t *sum, uint8_t *pix, int stride );
  2110.  void x264_integral_init4v_mmx( uint16_t *sum8, uint16_t *sum4, int stride );
  2111.  void x264_integral_init4v_sse2( uint16_t *sum8, uint16_t *sum4, int stride );
  2112.  void x264_integral_init8v_mmx( uint16_t *sum8, int stride );
  2113. @@ -135,6 +150,8 @@ MC_CHROMA(sse2)
  2114.  MC_CHROMA(sse2_misalign)
  2115.  MC_CHROMA(ssse3)
  2116.  MC_CHROMA(ssse3_cache64)
  2117. +MC_CHROMA(avx)
  2118. +MC_CHROMA(avx_cache64)
  2119.  
  2120.  #define LOWRES(cpu)\
  2121.  void x264_frame_init_lowres_core_##cpu( pixel *src0, pixel *dst0, pixel *dsth, pixel *dstv, pixel *dstc,\
  2122. @@ -415,15 +432,17 @@ static void x264_hpel_filter_##cpu( pixel *dsth, pixel *dstv, pixel *dstc, pixel
  2123.  
  2124.  HPEL(8, mmxext, mmxext, mmxext, mmxext)
  2125.  #if HIGH_BIT_DEPTH
  2126. -HPEL(16, sse2, sse2, sse2, sse2 )
  2127. +HPEL(16, sse2, sse2, sse2, sse2)
  2128.  #else // !HIGH_BIT_DEPTH
  2129.  HPEL(16, sse2_amd, mmxext, mmxext, sse2)
  2130.  #if ARCH_X86_64
  2131.  void x264_hpel_filter_sse2( uint8_t *dsth, uint8_t *dstv, uint8_t *dstc, uint8_t *src, int stride, int width, int height, int16_t *buf );
  2132.  void x264_hpel_filter_ssse3( uint8_t *dsth, uint8_t *dstv, uint8_t *dstc, uint8_t *src, int stride, int width, int height, int16_t *buf );
  2133. +void x264_hpel_filter_avx( uint8_t *dsth, uint8_t *dstv, uint8_t *dstc, uint8_t *src, int stride, int width, int height, int16_t *buf );
  2134.  #else
  2135.  HPEL(16, sse2, sse2, sse2, sse2)
  2136.  HPEL(16, ssse3, ssse3, ssse3, ssse3)
  2137. +HPEL(16, avx, avx, avx, ssse3)
  2138.  #endif
  2139.  HPEL(16, sse2_misalign, sse2, sse2_misalign, sse2)
  2140.  #endif // HIGH_BIT_DEPTH
  2141. @@ -465,6 +484,9 @@ static void x264_plane_copy_interleave_##cpu( pixel *dst, int i_dst,\
  2142.  
  2143.  PLANE_INTERLEAVE(mmxext)
  2144.  PLANE_INTERLEAVE(sse2)
  2145. +#if HIGH_BIT_DEPTH
  2146. +PLANE_INTERLEAVE(avx)
  2147. +#endif
  2148.  
  2149.  void x264_mc_init_mmx( int cpu, x264_mc_functions_t *pf )
  2150.  {
  2151. @@ -570,6 +592,18 @@ void x264_mc_init_mmx( int cpu, x264_mc_functions_t *pf )
  2152.  
  2153.      if( (cpu&X264_CPU_SHUFFLE_IS_FAST) && !(cpu&X264_CPU_SLOW_ATOM) )
  2154.          pf->integral_init4v = x264_integral_init4v_ssse3;
  2155. +
  2156. +    if( !(cpu&X264_CPU_AVX) )
  2157. +        return;
  2158. +
  2159. +    pf->load_deinterleave_8x8x2_fenc = x264_load_deinterleave_8x8x2_fenc_avx;
  2160. +    pf->load_deinterleave_8x8x2_fdec = x264_load_deinterleave_8x8x2_fdec_avx;
  2161. +    pf->plane_copy_interleave        = x264_plane_copy_interleave_avx;
  2162. +    pf->plane_copy_deinterleave      = x264_plane_copy_deinterleave_avx;
  2163. +    pf->store_interleave_8x8x2       = x264_store_interleave_8x8x2_avx;
  2164. +
  2165. +    if( !(cpu&X264_CPU_STACK_MOD4) )
  2166. +        pf->mc_chroma = x264_mc_chroma_avx;
  2167.  #else // !HIGH_BIT_DEPTH
  2168.      pf->prefetch_fenc = x264_prefetch_fenc_mmxext;
  2169.      pf->prefetch_ref  = x264_prefetch_ref_mmxext;
  2170. @@ -685,5 +719,16 @@ void x264_mc_init_mmx( int cpu, x264_mc_functions_t *pf )
  2171.  
  2172.      pf->integral_init4h = x264_integral_init4h_sse4;
  2173.      pf->integral_init8h = x264_integral_init8h_sse4;
  2174. +
  2175. +    if( !(cpu&X264_CPU_AVX) )
  2176. +        return;
  2177. +
  2178. +    pf->integral_init8h = x264_integral_init8h_avx;
  2179. +    pf->hpel_filter = x264_hpel_filter_avx;
  2180. +    if( !(cpu&X264_CPU_STACK_MOD4) )
  2181. +        pf->mc_chroma = x264_mc_chroma_avx;
  2182. +
  2183. +    if( cpu&X264_CPU_CACHELINE_64 && !(cpu&X264_CPU_STACK_MOD4) )
  2184. +        pf->mc_chroma = x264_mc_chroma_avx_cache64;
  2185.  #endif // HIGH_BIT_DEPTH
  2186.  }
  2187. diff --git a/common/x86/pixel-a.asm b/common/x86/pixel-a.asm
  2188. index 4858bf0..67d52c0 100644
  2189. --- a/common/x86/pixel-a.asm
  2190. +++ b/common/x86/pixel-a.asm
  2191. @@ -231,12 +231,10 @@ SSD_ONE    16, 16, sse2
  2192.      psubusb   m%3, m%7
  2193.      por       m%1, m%2
  2194.      por       m%3, m%4
  2195. -    mova      m%2, m%1
  2196. -    mova      m%4, m%3
  2197. +    punpcklbw m%2, m%1, m%5
  2198.      punpckhbw m%1, m%5
  2199. -    punpcklbw m%2, m%5
  2200. +    punpcklbw m%4, m%3, m%5
  2201.      punpckhbw m%3, m%5
  2202. -    punpcklbw m%4, m%5
  2203.  %endif
  2204.      pmaddwd   m%1, m%1
  2205.      pmaddwd   m%2, m%2
  2206. @@ -263,12 +261,10 @@ SSD_ONE    16, 16, sse2
  2207.  
  2208.  %macro SSD_CORE_SSSE3 7-8
  2209.  %ifidn %8, FULL
  2210. -    mova      m%6, m%1
  2211. -    mova      m%7, m%3
  2212. +    punpckhbw m%6, m%1, m%2
  2213. +    punpckhbw m%7, m%3, m%4
  2214.      punpcklbw m%1, m%2
  2215.      punpcklbw m%3, m%4
  2216. -    punpckhbw m%6, m%2
  2217. -    punpckhbw m%7, m%4
  2218.      SWAP %6, %2, %3
  2219.      SWAP %7, %4
  2220.  %endif
  2221. @@ -324,6 +320,8 @@ cglobal pixel_ssd_%1x%2_%3, 0,0,0
  2222.  
  2223.  %ifidn %3, ssse3
  2224.      mova    m7, [hsub_mul]
  2225. +%elifidn %3, avx
  2226. +    mova    m7, [hsub_mul]
  2227.  %elifidn %3, sse2
  2228.      mova    m7, [pw_00ff]
  2229.  %elif %1 >= mmsize
  2230. @@ -376,6 +374,12 @@ SSD  8,  8, ssse3, 8
  2231.  SSD 16,  8, ssse3, 8
  2232.  SSD  8, 16, ssse3, 8
  2233.  SSD  8,  4, ssse3, 8
  2234. +INIT_AVX
  2235. +SSD 16, 16, avx, 8
  2236. +SSD  8,  8, avx, 8
  2237. +SSD 16,  8, avx, 8
  2238. +SSD  8, 16, avx, 8
  2239. +SSD  8,  4, avx, 8
  2240.  INIT_MMX
  2241.  SSD  4,  4, ssse3
  2242.  SSD  4,  8, ssse3
  2243. @@ -432,12 +436,10 @@ cglobal pixel_ssd_nv12_core_%1, 6,7,7*(mmsize/16)
  2244.      jl .loopx
  2245.  %if mmsize==16 ; using HADDD would remove the mmsize/32 part from the
  2246.                 ; equation above, putting the width limit at 8208
  2247. -    mova        m0, m2
  2248. -    mova        m1, m3
  2249. +    punpckhdq   m0, m2, m6
  2250. +    punpckhdq   m1, m3, m6
  2251.      punpckldq   m2, m6
  2252.      punpckldq   m3, m6
  2253. -    punpckhdq   m0, m6
  2254. -    punpckhdq   m1, m6
  2255.      paddq       m3, m2
  2256.      paddq       m1, m0
  2257.      paddq       m4, m3
  2258. @@ -506,14 +508,13 @@ cglobal pixel_ssd_nv12_core_%1, 6,7
  2259.      psubusb m0, m1
  2260.      psubusb m1, [r0+r6]
  2261.      por     m0, m1
  2262. -    mova    m2, m0
  2263. +    psrlw   m2, m0, 8
  2264. +    add     r6, mmsize
  2265.      pand    m0, m5
  2266. -    psrlw   m2, 8
  2267. -    pmaddwd m0, m0
  2268.      pmaddwd m2, m2
  2269. +    pmaddwd m0, m0
  2270.      paddd   m3, m0
  2271.      paddd   m4, m2
  2272. -    add     r6, mmsize
  2273.      jl .loopx
  2274.      add     r0, r1
  2275.      add     r2, r3
  2276. @@ -530,12 +531,14 @@ cglobal pixel_ssd_nv12_core_%1, 6,7
  2277.      movq  [r4], m4
  2278.      RET
  2279.  %endmacro ; SSD_NV12
  2280. -%endif ; !X264_HIGHT_BIT_DEPTH
  2281. +%endif ; !HIGH_BIT_DEPTH
  2282.  
  2283.  INIT_MMX
  2284.  SSD_NV12 mmxext
  2285.  INIT_XMM
  2286.  SSD_NV12 sse2
  2287. +INIT_AVX
  2288. +SSD_NV12 avx
  2289.  
  2290.  ;=============================================================================
  2291.  ; variance
  2292. @@ -598,11 +601,10 @@ SSD_NV12 sse2
  2293.      mova      m4, [r0+%1+mmsize]
  2294.  %else ; !HIGH_BIT_DEPTH
  2295.      mova      m0, [r0]
  2296. -    mova      m1, m0
  2297. +    punpckhbw m1, m0, m7
  2298.      mova      m3, [r0+%1]
  2299.      mova      m4, m3
  2300.      punpcklbw m0, m7
  2301. -    punpckhbw m1, m7
  2302.  %endif ; HIGH_BIT_DEPTH
  2303.  %ifidn %1, r1
  2304.      lea       r0, [r0+%1*2]
  2305. @@ -634,15 +636,15 @@ cglobal pixel_var_8x8_mmxext, 2,3
  2306.      VAR_2ROW r1, 4
  2307.      VAR_END 8, 8
  2308.  
  2309. -INIT_XMM
  2310.  %ifdef HIGH_BIT_DEPTH
  2311. -cglobal pixel_var_16x16_sse2, 2,3,8
  2312. +%macro VAR 1
  2313. +cglobal pixel_var_16x16_%1, 2,3,8
  2314.      FIX_STRIDES r1
  2315.      VAR_START 0
  2316.      VAR_2ROW r1, 8
  2317.      VAR_END 16, 16
  2318.  
  2319. -cglobal pixel_var_8x8_sse2, 2,3,8
  2320. +cglobal pixel_var_8x8_%1, 2,3,8
  2321.      lea       r2, [r1*3]
  2322.      VAR_START 0
  2323.      mova      m0, [r0]
  2324. @@ -657,10 +659,17 @@ cglobal pixel_var_8x8_sse2, 2,3,8
  2325.      mova      m4, [r0+r2*2]
  2326.      VAR_CORE
  2327.      VAR_END 8, 8
  2328. +%endmacro ; VAR
  2329. +
  2330. +INIT_XMM
  2331. +VAR sse2
  2332. +INIT_AVX
  2333. +VAR avx
  2334.  %endif ; HIGH_BIT_DEPTH
  2335.  
  2336.  %ifndef HIGH_BIT_DEPTH
  2337. -cglobal pixel_var_16x16_sse2, 2,3,8
  2338. +%macro VAR 1
  2339. +cglobal pixel_var_16x16_%1, 2,3,8
  2340.      VAR_START 1
  2341.      mov      r2d, 8
  2342.  .loop:
  2343. @@ -673,7 +682,7 @@ cglobal pixel_var_16x16_sse2, 2,3,8
  2344.      jg .loop
  2345.      VAR_END 16, 16
  2346.  
  2347. -cglobal pixel_var_8x8_sse2, 2,4,8
  2348. +cglobal pixel_var_8x8_%1, 2,4,8
  2349.      VAR_START 1
  2350.      mov      r2d, 2
  2351.      lea       r3, [r1*3]
  2352. @@ -688,6 +697,12 @@ cglobal pixel_var_8x8_sse2, 2,4,8
  2353.      dec r2d
  2354.      jg .loop
  2355.      VAR_END 8, 8
  2356. +%endmacro ; VAR
  2357. +
  2358. +INIT_XMM
  2359. +VAR sse2
  2360. +INIT_AVX
  2361. +VAR avx
  2362.  %endif ; !HIGH_BIT_DEPTH
  2363.  
  2364.  %macro VAR2_END 0
  2365. @@ -1144,7 +1159,6 @@ cglobal pixel_satd_4x4_mmxext, 4,6
  2366.  ; int pixel_satd_8x4( uint8_t *, int, uint8_t *, int )
  2367.  ;-----------------------------------------------------------------------------
  2368.  %macro SATDS_SSE2 1
  2369. -INIT_XMM
  2370.  %ifnidn %1, sse2
  2371.  cglobal pixel_satd_4x4_%1, 4, 6, 6
  2372.      SATD_START_MMX
  2373. @@ -1520,7 +1534,6 @@ cglobal pixel_sa8d_16x16_%1, 4,7
  2374.  
  2375.  %macro INTRA_SA8D_SSE2 1
  2376.  %ifdef ARCH_X86_64
  2377. -INIT_XMM
  2378.  ;-----------------------------------------------------------------------------
  2379.  ; void intra_sa8d_x3_8x8_core( uint8_t *fenc, int16_t edges[2][8], int *res )
  2380.  ;-----------------------------------------------------------------------------
  2381. @@ -1576,7 +1589,6 @@ cglobal intra_sa8d_x3_8x8_core_%1, 3,3,16
  2382.      paddusw     m8,  m9
  2383.      paddusw     m15, m10
  2384.      paddusw     m15, m8
  2385. -    movdqa      m14, m15 ; 7x8 sum
  2386.  
  2387.      movdqa      m8,  [r1+0] ; left edge
  2388.      movd        m9,  r0d
  2389. @@ -1585,7 +1597,7 @@ cglobal intra_sa8d_x3_8x8_core_%1, 3,3,16
  2390.      psubw       m9,  m0
  2391.      ABS1        m8,  m10
  2392.      ABS1        m9,  m11 ; 1x8 sum
  2393. -    paddusw     m14, m8
  2394. +    paddusw     m14, m15, m8
  2395.      paddusw     m15, m9
  2396.      punpcklwd   m0,  m1
  2397.      punpcklwd   m2,  m3
  2398. @@ -1595,9 +1607,8 @@ cglobal intra_sa8d_x3_8x8_core_%1, 3,3,16
  2399.      punpckldq   m4,  m6
  2400.      punpcklqdq  m0,  m4 ; transpose
  2401.      movdqa      m1,  [r1+16] ; top edge
  2402. -    movdqa      m2,  m15
  2403.      psllw       m1,  3
  2404. -    psrldq      m2,  2     ; 8x7 sum
  2405. +    psrldq      m2,  m15, 2  ; 8x7 sum
  2406.      psubw       m0,  m1  ; 8x1 sum
  2407.      ABS1        m0,  m1
  2408.      paddusw     m2,  m0
  2409. @@ -1607,15 +1618,13 @@ cglobal intra_sa8d_x3_8x8_core_%1, 3,3,16
  2410.      pmaddwd     m2,  m7
  2411.      pmaddwd     m14, m7
  2412.      pmaddwd     m15, m7
  2413. -    movdqa      m3,  m2
  2414. +    punpckhdq   m3,  m2, m14
  2415.      punpckldq   m2,  m14
  2416. -    punpckhdq   m3,  m14
  2417.      pshufd      m5,  m15, 0xf5
  2418.      paddd       m2,  m3
  2419.      paddd       m5,  m15
  2420. -    movdqa      m3,  m2
  2421. +    punpckhqdq  m3,  m2, m5
  2422.      punpcklqdq  m2,  m5
  2423. -    punpckhqdq  m3,  m5
  2424.      pavgw       m3,  m2
  2425.      pxor        m0,  m0
  2426.      pavgw       m3,  m0
  2427. @@ -1757,7 +1766,6 @@ cglobal hadamard_load
  2428.  %endmacro
  2429.  
  2430.  %macro INTRA_SATDS_MMX 1
  2431. -INIT_MMX
  2432.  ;-----------------------------------------------------------------------------
  2433.  ; void intra_satd_x3_4x4( uint8_t *fenc, uint8_t *fdec, int *res )
  2434.  ;-----------------------------------------------------------------------------
  2435. @@ -2241,7 +2249,6 @@ HADAMARD_AC_WXH_MMX  8,  8
  2436.  %endmacro
  2437.  
  2438.  %macro HADAMARD_AC_SSE2 1
  2439. -INIT_XMM
  2440.  ; in:  r0=pix, r1=stride, r2=stride*3
  2441.  ; out: [esp+16]=sa8d, [esp+32]=satd, r0+=stride*4
  2442.  cglobal hadamard_ac_8x8_%1
  2443. @@ -2455,8 +2462,10 @@ SA8D sse2
  2444.  SATDS_SSE2 sse2
  2445.  INTRA_SA8D_SSE2 sse2
  2446.  %ifndef HIGH_BIT_DEPTH
  2447. +INIT_MMX
  2448.  INTRA_SATDS_MMX mmxext
  2449.  %endif
  2450. +INIT_XMM
  2451.  HADAMARD_AC_SSE2 sse2
  2452.  
  2453.  %define ABS1 ABS1_SSSE3
  2454. @@ -2470,6 +2479,7 @@ HADAMARD_AC_SSE2 sse2
  2455.  %define LOAD_SUMSUB_8x4P LOAD_SUMSUB_8x4P_SSSE3
  2456.  %define LOAD_SUMSUB_16P  LOAD_SUMSUB_16P_SSSE3
  2457.  %endif
  2458. +INIT_XMM
  2459.  SATDS_SSE2 ssse3
  2460.  SA8D ssse3
  2461.  HADAMARD_AC_SSE2 ssse3
  2462. @@ -2477,14 +2487,21 @@ HADAMARD_AC_SSE2 ssse3
  2463.  %undef movdqu ; movups
  2464.  %undef punpcklqdq ; or movlhps
  2465.  INTRA_SA8D_SSE2 ssse3
  2466. +INIT_MMX
  2467.  INTRA_SATDS_MMX ssse3
  2468.  
  2469.  %define TRANS TRANS_SSE4
  2470.  %define JDUP JDUP_PENRYN
  2471.  %define LOAD_DUP_4x8P LOAD_DUP_4x8P_PENRYN
  2472. +INIT_XMM
  2473.  SATDS_SSE2 sse4
  2474.  SA8D sse4
  2475.  HADAMARD_AC_SSE2 sse4
  2476. +INIT_AVX
  2477. +SATDS_SSE2 avx
  2478. +SA8D avx
  2479. +INTRA_SA8D_SSE2 avx
  2480. +HADAMARD_AC_SSE2 avx
  2481.  
  2482.  ;=============================================================================
  2483.  ; SSIM
  2484. @@ -2494,7 +2511,7 @@ HADAMARD_AC_SSE2 sse4
  2485.  ; void pixel_ssim_4x4x2_core( const uint8_t *pix1, int stride1,
  2486.  ;                             const uint8_t *pix2, int stride2, int sums[2][4] )
  2487.  ;-----------------------------------------------------------------------------
  2488. -
  2489. +INIT_XMM
  2490.  %macro SSIM_ITER 1
  2491.  %ifdef HIGH_BIT_DEPTH
  2492.      movdqu    m5, [r0+(%1&1)*r1]
  2493. @@ -2516,9 +2533,8 @@ HADAMARD_AC_SSE2 sse4
  2494.      paddw     m1, m5
  2495.      paddw     m2, m6
  2496.  %endif
  2497. -    movdqa    m7, m5
  2498. +    pmaddwd   m7, m5, m6
  2499.      pmaddwd   m5, m5
  2500. -    pmaddwd   m7, m6
  2501.      pmaddwd   m6, m6
  2502.  %if %1==0
  2503.      SWAP      m3, m5
  2504. @@ -2549,9 +2565,8 @@ cglobal pixel_ssim_4x4x2_core_sse2, 4,4,8
  2505.      pshufd    m1, m1, 0xd8
  2506.      paddd     m4, m6
  2507.      pmaddwd   m1, m7
  2508. -    movdqa    m5, m3
  2509. +    punpckhdq m5, m3, m4
  2510.      punpckldq m3, m4
  2511. -    punpckhdq m5, m4
  2512.  
  2513.  %ifdef UNIX64
  2514.      %define t0 r4
  2515. @@ -2569,7 +2584,8 @@ cglobal pixel_ssim_4x4x2_core_sse2, 4,4,8
  2516.  ;-----------------------------------------------------------------------------
  2517.  ; float pixel_ssim_end( int sum0[5][4], int sum1[5][4], int width )
  2518.  ;-----------------------------------------------------------------------------
  2519. -cglobal pixel_ssim_end4_sse2, 3,3,7
  2520. +%macro SSIM_END4 1
  2521. +cglobal pixel_ssim_end4_%1, 3,3,7
  2522.      movdqa    m0, [r0+ 0]
  2523.      movdqa    m1, [r0+16]
  2524.      movdqa    m2, [r0+32]
  2525. @@ -2609,9 +2625,8 @@ cglobal pixel_ssim_end4_sse2, 3,3,7
  2526.      addps     m2, m6      ; vars + ssim_c2
  2527.      addps     m3, m6      ; covar*2 + ssim_c2
  2528.  %else
  2529. -    movdqa    m4, m1
  2530. +    pmaddwd   m4, m1, m0  ; s1*s2
  2531.      pslld     m1, 16
  2532. -    pmaddwd   m4, m0  ; s1*s2
  2533.      por       m0, m1
  2534.      pmaddwd   m0, m0  ; s1*s1 + s2*s2
  2535.      pslld     m4, 1
  2536. @@ -2652,8 +2667,12 @@ cglobal pixel_ssim_end4_sse2, 3,3,7
  2537.      fld     dword r0m
  2538.  %endif
  2539.      RET
  2540. +%endmacro ; SSIM_END4
  2541.  
  2542. -
  2543. +INIT_XMM
  2544. +SSIM_END4 sse2
  2545. +INIT_AVX
  2546. +SSIM_END4 avx
  2547.  
  2548.  ;=============================================================================
  2549.  ; Successive Elimination ADS
  2550. @@ -2776,27 +2795,22 @@ cglobal pixel_ads4_%1, 6,7,12
  2551.      movdqu  xmm10, [r1]
  2552.      movdqu  xmm11, [r1+r2]
  2553.  .loop:
  2554. -    movdqa  xmm0, xmm10
  2555. -    movdqu  xmm1, [r1+16]
  2556. -    movdqa  xmm10, xmm1
  2557. -    psubw   xmm0, xmm7
  2558. -    psubw   xmm1, xmm6
  2559. +    psubw   xmm0, xmm10, xmm7
  2560. +    movdqu xmm10, [r1+16]
  2561. +    psubw   xmm1, xmm10, xmm6
  2562.      ABS1    xmm0, xmm2
  2563.      ABS1    xmm1, xmm3
  2564. -    movdqa  xmm2, xmm11
  2565. -    movdqu  xmm3, [r1+r2+16]
  2566. -    movdqa  xmm11, xmm3
  2567. -    psubw   xmm2, xmm5
  2568. -    psubw   xmm3, xmm4
  2569. +    psubw   xmm2, xmm11, xmm5
  2570. +    movdqu xmm11, [r1+r2+16]
  2571.      paddw   xmm0, xmm1
  2572. +    psubw   xmm3, xmm11, xmm4
  2573.      movdqu  xmm9, [r3]
  2574.      ABS1    xmm2, xmm1
  2575.      ABS1    xmm3, xmm1
  2576.      paddw   xmm0, xmm2
  2577.      paddw   xmm0, xmm3
  2578.      paddusw xmm0, xmm9
  2579. -    movdqa  xmm1, xmm8
  2580. -    psubusw xmm1, xmm0
  2581. +    psubusw xmm1, xmm8, xmm0
  2582.      packsswb xmm1, xmm1
  2583.      movq    [r6], xmm1
  2584.  %else
  2585. @@ -2848,8 +2862,7 @@ cglobal pixel_ads2_%1, 6,7,8
  2586.      ABS1    xmm1, xmm3
  2587.      paddw   xmm0, xmm1
  2588.      paddusw xmm0, xmm4
  2589. -    movdqa  xmm1, xmm5
  2590. -    psubusw xmm1, xmm0
  2591. +    psubusw xmm1, xmm5, xmm0
  2592.      packsswb xmm1, xmm1
  2593.      movq    [r6], xmm1
  2594.      ADS_END 2
  2595. @@ -2873,18 +2886,19 @@ cglobal pixel_ads1_%1, 6,7,8
  2596.      ABS1    xmm1, xmm5
  2597.      paddusw xmm0, xmm2
  2598.      paddusw xmm1, xmm3
  2599. -    movdqa  xmm4, xmm6
  2600. -    movdqa  xmm5, xmm6
  2601. -    psubusw xmm4, xmm0
  2602. -    psubusw xmm5, xmm1
  2603. +    psubusw xmm4, xmm6, xmm0
  2604. +    psubusw xmm5, xmm6, xmm1
  2605.      packsswb xmm4, xmm5
  2606.      movdqa  [r6], xmm4
  2607.      ADS_END 4
  2608.  %endmacro
  2609.  
  2610. +INIT_XMM
  2611.  ADS_SSE2 sse2
  2612.  %define ABS1 ABS1_SSSE3
  2613.  ADS_SSE2 ssse3
  2614. +INIT_AVX
  2615. +ADS_SSE2 avx
  2616.  
  2617.  ; int pixel_ads_mvs( int16_t *mvs, uint8_t *masks, int width )
  2618.  ; {
  2619. diff --git a/common/x86/pixel.h b/common/x86/pixel.h
  2620. index f0901e9..8a7dc74 100644
  2621. --- a/common/x86/pixel.h
  2622. +++ b/common/x86/pixel.h
  2623. @@ -60,14 +60,17 @@ DECL_X1( ssd, mmxext )
  2624.  DECL_X1( ssd, sse2slow )
  2625.  DECL_X1( ssd, sse2 )
  2626.  DECL_X1( ssd, ssse3 )
  2627. +DECL_X1( ssd, avx )
  2628.  DECL_X1( satd, mmxext )
  2629.  DECL_X1( satd, sse2 )
  2630.  DECL_X1( satd, ssse3 )
  2631.  DECL_X1( satd, sse4 )
  2632. +DECL_X1( satd, avx )
  2633.  DECL_X1( sa8d, mmxext )
  2634.  DECL_X1( sa8d, sse2 )
  2635.  DECL_X1( sa8d, ssse3 )
  2636. -DECL_X1( sa8d, sse4)
  2637. +DECL_X1( sa8d, sse4 )
  2638. +DECL_X1( sa8d, avx )
  2639.  DECL_X1( sad, cache32_mmxext );
  2640.  DECL_X1( sad, cache64_mmxext );
  2641.  DECL_X1( sad, cache64_sse2 );
  2642. @@ -79,10 +82,12 @@ DECL_X4( sad, cache64_ssse3 );
  2643.  
  2644.  DECL_PIXELS( uint64_t, var, mmxext, ( pixel *pix, int i_stride ))
  2645.  DECL_PIXELS( uint64_t, var, sse2,   ( pixel *pix, int i_stride ))
  2646. +DECL_PIXELS( uint64_t, var, avx,   ( pixel *pix, int i_stride ))
  2647.  DECL_PIXELS( uint64_t, hadamard_ac, mmxext, ( pixel *pix, int i_stride ))
  2648.  DECL_PIXELS( uint64_t, hadamard_ac, sse2,   ( pixel *pix, int i_stride ))
  2649.  DECL_PIXELS( uint64_t, hadamard_ac, ssse3,  ( pixel *pix, int i_stride ))
  2650.  DECL_PIXELS( uint64_t, hadamard_ac, sse4,   ( pixel *pix, int i_stride ))
  2651. +DECL_PIXELS( uint64_t, hadamard_ac, avx,    ( pixel *pix, int i_stride ))
  2652.  
  2653.  
  2654.  void x264_intra_satd_x3_4x4_mmxext  ( pixel   *, pixel   *, int * );
  2655. @@ -102,12 +107,14 @@ void x264_intra_sad_x3_16x16_ssse3  ( pixel   *, pixel   *, int * );
  2656.  void x264_intra_sa8d_x3_8x8_mmxext  ( uint8_t *, uint8_t *, int * );
  2657.  void x264_intra_sa8d_x3_8x8_sse2    ( pixel   *, pixel   *, int * );
  2658.  void x264_intra_sa8d_x3_8x8_ssse3   ( uint8_t *, uint8_t *, int * );
  2659. +void x264_intra_sa8d_x3_8x8_avx     ( uint8_t *, uint8_t *, int * );
  2660.  void x264_intra_sad_x3_8x8_mmxext   ( pixel   *, pixel   *, int * );
  2661.  void x264_intra_sad_x3_8x8_sse2     ( pixel   *, pixel   *, int * );
  2662.  void x264_intra_sad_x3_8x8_ssse3    ( pixel   *, pixel   *, int * );
  2663.  void x264_intra_sa8d_x3_8x8_core_mmxext( uint8_t *, int16_t [2][8], int * );
  2664.  void x264_intra_sa8d_x3_8x8_core_sse2  ( uint8_t *, int16_t [2][8], int * );
  2665.  void x264_intra_sa8d_x3_8x8_core_ssse3 ( uint8_t *, int16_t [2][8], int * );
  2666. +void x264_intra_sa8d_x3_8x8_core_avx   ( uint8_t *, int16_t [2][8], int * );
  2667.  
  2668.  void x264_pixel_ssd_nv12_core_mmxext( pixel *pixuv1, int stride1,
  2669.                                        pixel *pixuv2, int stride2, int width,
  2670. @@ -115,11 +122,15 @@ void x264_pixel_ssd_nv12_core_mmxext( pixel *pixuv1, int stride1,
  2671.  void x264_pixel_ssd_nv12_core_sse2( pixel *pixuv1, int stride1,
  2672.                                      pixel *pixuv2, int stride2, int width,
  2673.                                      int height, uint64_t *ssd_u, uint64_t *ssd_v );
  2674. +void x264_pixel_ssd_nv12_core_avx( pixel *pixuv1, int stride1,
  2675. +                                    pixel *pixuv2, int stride2, int width,
  2676. +                                    int height, uint64_t *ssd_u, uint64_t *ssd_v );
  2677.  void x264_pixel_ssim_4x4x2_core_mmxext( const uint8_t *pix1, int stride1,
  2678.                                          const uint8_t *pix2, int stride2, int sums[2][4] );
  2679.  void x264_pixel_ssim_4x4x2_core_sse2( const pixel *pix1, int stride1,
  2680.                                        const pixel *pix2, int stride2, int sums[2][4] );
  2681.  float x264_pixel_ssim_end4_sse2( int sum0[5][4], int sum1[5][4], int width );
  2682. +float x264_pixel_ssim_end4_avx( int sum0[5][4], int sum1[5][4], int width );
  2683.  int  x264_pixel_var2_8x8_mmxext( pixel *, int, pixel *, int, int * );
  2684.  int  x264_pixel_var2_8x8_sse2( pixel *, int, pixel *, int, int * );
  2685.  int  x264_pixel_var2_8x8_ssse3( uint8_t *, int, uint8_t *, int, int * );
  2686. @@ -136,6 +147,9 @@ DECL_ADS( 1, sse2 )
  2687.  DECL_ADS( 4, ssse3 )
  2688.  DECL_ADS( 2, ssse3 )
  2689.  DECL_ADS( 1, ssse3 )
  2690. +DECL_ADS( 4, avx )
  2691. +DECL_ADS( 2, avx )
  2692. +DECL_ADS( 1, avx )
  2693.  
  2694.  #undef DECL_PIXELS
  2695.  #undef DECL_X1
  2696. diff --git a/common/x86/predict-a.asm b/common/x86/predict-a.asm
  2697. index aefc638..669873e 100644
  2698. --- a/common/x86/predict-a.asm
  2699. +++ b/common/x86/predict-a.asm
  2700. @@ -134,18 +134,16 @@ cextern pw_pixel_max
  2701.  ; output: %1 = (t[n-1] + t[n]*2 + t[n+1] + 2) >> 2
  2702.  %macro PRED8x8_LOWPASS 5-6
  2703.  %ifidn %1, w
  2704. -    mova        %2, %5
  2705.      paddw       %3, %4
  2706.      psrlw       %3, 1
  2707. -    pavgw       %2, %3
  2708. +    pavgw       %2, %5, %3
  2709.  %else
  2710.      mova        %6, %3
  2711.      pavgb       %3, %4
  2712.      pxor        %4, %6
  2713. -    mova        %2, %5
  2714.      pand        %4, [pb_1]
  2715.      psubusb     %3, %4
  2716. -    pavgb       %2, %3
  2717. +    pavgb       %2, %5, %3
  2718.  %endif
  2719.  %endmacro
  2720.  
  2721. @@ -170,14 +168,13 @@ cextern pw_pixel_max
  2722.  %macro PREDICT_4x4_DDL 4
  2723.  cglobal predict_4x4_ddl_%1, 1,1
  2724.      movu    m1, [r0-FDEC_STRIDEB]
  2725. -    mova    m2, m1
  2726. +    psll%2  m2, m1, %3
  2727.      mova    m3, m1
  2728.      mova    m4, m1
  2729. -    psll%2  m1, %3
  2730. -    pxor    m2, m1
  2731. -    psrl%2  m2, %3
  2732. -    pxor    m3, m2
  2733. -    PRED8x8_LOWPASS %4, m0, m1, m3, m4, m5
  2734. +    pxor    m1, m2
  2735. +    psrl%2  m1, %3
  2736. +    pxor    m3, m1
  2737. +    PRED8x8_LOWPASS %4, m0, m2, m3, m4, m5
  2738.  
  2739.  %assign Y 0
  2740.  %rep 4
  2741. @@ -192,6 +189,8 @@ cglobal predict_4x4_ddl_%1, 1,1
  2742.  %ifdef HIGH_BIT_DEPTH
  2743.  INIT_XMM
  2744.  PREDICT_4x4_DDL sse2, dq, 2, w
  2745. +INIT_AVX
  2746. +PREDICT_4x4_DDL avx , dq, 2, w
  2747.  INIT_MMX
  2748.  %define PALIGNR PALIGNR_MMX
  2749.  cglobal predict_4x4_ddl_mmxext, 1,2
  2750. @@ -284,9 +283,8 @@ cglobal predict_4x4_vr_%1, 1,1,6*(mmsize/16)
  2751.      PALIGNR m0, [r0+2*FDEC_STRIDEB-8*SIZEOF_PIXEL], 7*SIZEOF_PIXEL, m3    ; t3t2t1t0ltl0l1l2
  2752.  %endif
  2753.      PRED8x8_LOWPASS %5, m3, m1, m0, m2, m4
  2754. -    mova    m1, m3
  2755. +    psll%4  m1, m3, %7*6
  2756.      psrl%4  m3, %7*2
  2757. -    psll%4  m1, %7*6
  2758.      movh    [r0+0*FDEC_STRIDEB], m5
  2759.      movh    [r0+1*FDEC_STRIDEB], m3
  2760.      PALIGNR m5, m1, 7*SIZEOF_PIXEL, m2
  2761. @@ -318,12 +316,9 @@ cglobal predict_4x4_hd_%1, 1,1,6*(mmsize/16)
  2762.  %endif
  2763.      punpckh%3 m1, m2                                 ; l0 l1 l2 l3
  2764.      punpckh%6 m1, m0                                 ; t2 t1 t0 lt l0 l1 l2 l3
  2765. -    mova      m0, m1
  2766. -    mova      m2, m1
  2767. -    mova      m5, m1
  2768. -    psrl%4    m0, %7*2                               ; .. .. t2 t1 t0 lt l0 l1
  2769. -    psrl%4    m2, %7                                 ; .. t2 t1 t0 lt l0 l1 l2
  2770. -    pavg%5    m5, m2
  2771. +    psrl%4    m2, m1, %7                             ; .. t2 t1 t0 lt l0 l1 l2
  2772. +    psrl%4    m0, m1, %7*2                           ; .. .. t2 t1 t0 lt l0 l1
  2773. +    pavg%5    m5, m1, m2
  2774.      PRED8x8_LOWPASS %5, m3, m1, m0, m2, m4
  2775.      punpckl%2 m5, m3
  2776.      psrl%4    m3, %7*4
  2777. @@ -419,6 +414,8 @@ INIT_XMM
  2778.  PREDICT_4x4 sse2  , wd, dq, dq, w, qdq, 2
  2779.  %define PALIGNR PALIGNR_SSSE3
  2780.  PREDICT_4x4 ssse3 , wd, dq, dq, w, qdq, 2
  2781. +INIT_AVX
  2782. +PREDICT_4x4 avx   , wd, dq, dq, w, qdq, 2
  2783.  %else
  2784.  INIT_MMX
  2785.  %define PALIGNR PALIGNR_MMX
  2786. @@ -496,12 +493,9 @@ cglobal predict_4x4_hu_mmxext, 1,1
  2787.  %macro PREDICT_4x4_V1 4
  2788.  cglobal predict_4x4_vl_%1, 1,1,6*(mmsize/16)
  2789.      movu        m1, [r0-FDEC_STRIDEB]
  2790. -    mova        m3, m1
  2791. -    mova        m2, m1
  2792. -    psrl%2      m3, %3
  2793. -    psrl%2      m2, %3*2
  2794. -    mova        m4, m3
  2795. -    pavg%4      m4, m1
  2796. +    psrl%2      m3, m1, %3
  2797. +    psrl%2      m2, m1, %3*2
  2798. +    pavg%4      m4, m3, m1
  2799.      PRED8x8_LOWPASS %4, m0, m1, m2, m3, m5
  2800.  
  2801.      movh        [r0+0*FDEC_STRIDEB], m4
  2802. @@ -516,6 +510,8 @@ cglobal predict_4x4_vl_%1, 1,1,6*(mmsize/16)
  2803.  %ifdef HIGH_BIT_DEPTH
  2804.  INIT_XMM
  2805.  PREDICT_4x4_V1 sse2, dq, 2, w
  2806. +INIT_AVX
  2807. +PREDICT_4x4_V1 avx , dq, 2, w
  2808.  
  2809.  INIT_MMX
  2810.  %define PALIGNR PALIGNR_MMX
  2811. @@ -664,10 +660,9 @@ cglobal predict_8x8_filter_%1, 4,5,7*(mmsize/16)
  2812.      test        r2b, 0x04
  2813.      je .fix_tr_2
  2814.      mova        m0, [src-1*FDEC_STRIDEB+8*SIZEOF_PIXEL]
  2815. -    mova        m5, m0
  2816.      mova        m2, m0
  2817.      mova        m4, m0
  2818. -    psrl%5      m5, 7*%6
  2819. +    psrl%5      m5, m0, 7*%6
  2820.      PALIGNR     m2, m3, 7*SIZEOF_PIXEL, m3
  2821.      PALIGNR     m5, m4, 1*SIZEOF_PIXEL, m4
  2822.      PRED8x8_LOWPASS %2, m1, m2, m5, m0, m4
  2823. @@ -683,23 +678,20 @@ cglobal predict_8x8_filter_%1, 4,5,7*(mmsize/16)
  2824.  .done:
  2825.      REP_RET
  2826.  .fix_lt_1:
  2827. -    mova        m5, m3
  2828. -    pxor        m5, m4
  2829. +    pxor        m5, m3, m4
  2830.      psrl%5      m5, 7*%6
  2831.      psll%5      m5, 6*%6
  2832.      pxor        m1, m5
  2833.      jmp .do_left
  2834.  .fix_lt_2:
  2835. -    mova        m5, m3
  2836. -    pxor        m5, m2
  2837. +    pxor        m5, m3, m2
  2838.      psll%5      m5, 7*%6
  2839.      psrl%5      m5, 7*%6
  2840.      pxor        m2, m5
  2841.      test       r2b, 0x04
  2842.      jne .do_top
  2843.  .fix_tr_1:
  2844. -    mova        m5, m3
  2845. -    pxor        m5, m1
  2846. +    pxor        m5, m3, m1
  2847.      psrl%5      m5, 7*%6
  2848.      psll%5      m5, 7*%6
  2849.      pxor        m1, m5
  2850. @@ -712,6 +704,8 @@ INIT_XMM
  2851.  PREDICT_FILTER sse2  , w, d, q, dq, 2
  2852.  %define PALIGNR PALIGNR_SSSE3
  2853.  PREDICT_FILTER ssse3 , w, d, q, dq, 2
  2854. +INIT_AVX
  2855. +PREDICT_FILTER avx   , w, d, q, dq, 2
  2856.  %else
  2857.  INIT_MMX
  2858.  %define PALIGNR PALIGNR_MMX
  2859. @@ -745,9 +739,8 @@ PREDICT_8x8_V mmxext
  2860.  cglobal predict_8x8_h_%1, 2,2
  2861.      movu      m1, [r1+7*SIZEOF_PIXEL]
  2862.      add       r0, 4*FDEC_STRIDEB
  2863. -    mova      m2, m1
  2864. +    punpckl%2 m2, m1, m1
  2865.      punpckh%2 m1, m1
  2866. -    punpckl%2 m2, m2
  2867.  %assign n 0
  2868.  %rep 8
  2869.  %assign i 1+n/4
  2870. @@ -844,17 +837,21 @@ cglobal predict_8x8_ddl_%1, 2,2,8*(mmsize/16)
  2871.      movu        m2, [r1+17*SIZEOF_PIXEL]
  2872.      movu        m3, [r1+23*SIZEOF_PIXEL]
  2873.      movu        m4, [r1+25*SIZEOF_PIXEL]
  2874. -    mova        m1, m5
  2875. -    psll%3      m1, %4
  2876. +    psll%3      m1, m5, %4
  2877.      add         r0, FDEC_STRIDEB*4
  2878.      PRED8x8_LOWPASS %2, m0, m1, m2, m5, m7
  2879. +%if avx_enabled == 1
  2880. +    INIT_XMM
  2881.      PRED8x8_LOWPASS %2, m1, m3, m4, [r1+24*SIZEOF_PIXEL], m6
  2882. +    INIT_AVX
  2883. +%else
  2884. +    PRED8x8_LOWPASS %2, m1, m3, m4, [r1+24*SIZEOF_PIXEL], m6
  2885. +%endif
  2886.  %assign Y 3
  2887.  %rep 6
  2888.      mova        [r0+Y*FDEC_STRIDEB], m1
  2889. -    mova        m2, m0
  2890.      psll%3      m1, %4
  2891. -    psrl%3      m2, 7*%4
  2892. +    psrl%3      m2, m0, 7*%4
  2893.      psll%3      m0, %4
  2894.      por         m1, m2
  2895.  %assign Y (Y-1)
  2896. @@ -870,6 +867,7 @@ cglobal predict_8x8_ddl_%1, 2,2,8*(mmsize/16)
  2897.  ;-----------------------------------------------------------------------------
  2898.  ; void predict_8x8_ddr( pixel *src, pixel *edge )
  2899.  ;-----------------------------------------------------------------------------
  2900. +%if avx_enabled == 0
  2901.  cglobal predict_8x8_ddr_%1, 2,2,7*(mmsize/16)
  2902.      movu        m1, [r1+ 7*SIZEOF_PIXEL]
  2903.      movu        m2, [r1+ 9*SIZEOF_PIXEL]
  2904. @@ -881,9 +879,8 @@ cglobal predict_8x8_ddr_%1, 2,2,7*(mmsize/16)
  2905.  %assign Y 3
  2906.  %rep 6
  2907.      mova        [r0+Y*FDEC_STRIDEB], m0
  2908. -    mova        m2, m1
  2909.      psrl%3      m0, %4
  2910. -    psll%3      m2, 7*%4
  2911. +    psll%3      m2, m1, 7*%4
  2912.      psrl%3      m1, %4
  2913.      por         m0, m2
  2914.  %assign Y (Y-1)
  2915. @@ -895,11 +892,14 @@ cglobal predict_8x8_ddr_%1, 2,2,7*(mmsize/16)
  2916.  %assign Y (Y-1)
  2917.      mova        [r0+Y*FDEC_STRIDEB], m0
  2918.      RET
  2919. +%endif
  2920.  %endmacro ; PREDICT_8x8
  2921.  
  2922.  %ifdef HIGH_BIT_DEPTH
  2923.  INIT_XMM
  2924.  PREDICT_8x8 sse2  , w, dq, 2
  2925. +INIT_AVX
  2926. +PREDICT_8x8 avx   , w, dq, 2
  2927.  %elifndef ARCH_X86_64
  2928.  INIT_MMX
  2929.  PREDICT_8x8 mmxext, b, q , 8
  2930. @@ -918,19 +918,17 @@ cglobal predict_8x8_hu_%1, 2,2,8*(mmsize/16)
  2931.      psll%4    m0, 8*SIZEOF_PIXEL
  2932.      psrl%4    m2, 8*SIZEOF_PIXEL
  2933.      por       m2, m0                  ; l7 l6 l5 l4 l3 l2 l1 l0
  2934. -    mova      m3, m2
  2935.      mova      m4, m2
  2936.      mova      m5, m2
  2937. +    psrl%3    m3, m2, 2*%6
  2938.      psrl%3    m2, %6
  2939. -    psrl%3    m3, 2*%6
  2940.      por       m2, m1                  ; l7 l7 l6 l5 l4 l3 l2 l1
  2941.      punpckh%5 m1, m1
  2942.      por       m3, m1                  ; l7 l7 l7 l6 l5 l4 l3 l2
  2943.      pavg%2    m4, m2
  2944.      PRED8x8_LOWPASS %2, m1, m3, m5, m2, m6
  2945. -    mova      m5, m4
  2946. +    punpckh%5 m5, m4, m1              ; p8 p7 p6 p5
  2947.      punpckl%5 m4, m1                  ; p4 p3 p2 p1
  2948. -    punpckh%5 m5, m1                  ; p8 p7 p6 p5
  2949.      mova      m6, m5
  2950.      mova      m7, m5
  2951.      mova      m0, m5
  2952. @@ -957,6 +955,8 @@ INIT_XMM
  2953.  PREDICT_8x8_HU sse2  , w, dq, d, wd, 2
  2954.  %define PALIGNR PALIGNR_SSSE3
  2955.  PREDICT_8x8_HU ssse3 , w, dq, d, wd, 2
  2956. +INIT_AVX
  2957. +PREDICT_8x8_HU avx   , w, dq, d, wd, 2
  2958.  %elifndef ARCH_X86_64
  2959.  INIT_MMX
  2960.  %define PALIGNR PALIGNR_MMX
  2961. @@ -971,14 +971,13 @@ cglobal predict_8x8_vr_%1, 2,3,7*(mmsize/16)
  2962.      mova        m2, [r1+16*SIZEOF_PIXEL]
  2963.      movu        m3, [r1+15*SIZEOF_PIXEL]
  2964.      movu        m1, [r1+14*SIZEOF_PIXEL]
  2965. -    mova        m4, m3
  2966. -    pavg%2      m3, m2
  2967. +    pavg%2      m4, m3, m2
  2968.      add         r0, FDEC_STRIDEB*4
  2969. -    PRED8x8_LOWPASS %2, m0, m1, m2, m4, m5
  2970. -    mova        [r0-4*FDEC_STRIDEB], m3
  2971. +    PRED8x8_LOWPASS %2, m0, m1, m2, m3, m5
  2972. +    mova        [r0-4*FDEC_STRIDEB], m4
  2973.      mova        [r0-3*FDEC_STRIDEB], m0
  2974.      mova        m5, m0
  2975. -    mova        m6, m3
  2976. +    mova        m6, m4
  2977.      mova        m1, [r1+8*SIZEOF_PIXEL]
  2978.      mova        m2, m1
  2979.      psll%3      m2, %4
  2980. @@ -1005,6 +1004,8 @@ INIT_XMM
  2981.  PREDICT_8x8_VR sse2  , w, dq, 2
  2982.  %define PALIGNR PALIGNR_SSSE3
  2983.  PREDICT_8x8_VR ssse3 , w, dq, 2
  2984. +INIT_AVX
  2985. +PREDICT_8x8_VR avx   , w, dq, 2
  2986.  %else
  2987.  INIT_MMX
  2988.  %define PALIGNR PALIGNR_MMX
  2989. @@ -1042,8 +1043,8 @@ ALIGN 4
  2990.      REP_RET
  2991.  %endif ; !ARCH_X86_64
  2992.  
  2993. -INIT_XMM
  2994. -cglobal predict_8x8c_p_core_sse2, 1,1
  2995. +%macro PREDICT_8x8C_P 1
  2996. +cglobal predict_8x8c_p_core_%1, 1,1
  2997.      movd        m0, r1m
  2998.      movd        m2, r2m
  2999.      movd        m4, r3m
  3000. @@ -1058,8 +1059,7 @@ cglobal predict_8x8c_p_core_sse2, 1,1
  3001.  %ifdef HIGH_BIT_DEPTH
  3002.      mov        r1d, 8
  3003.  .loop:
  3004. -    mova        m5, m0
  3005. -    paddsw      m5, m2
  3006. +    paddsw      m5, m0, m2
  3007.      psraw       m5, 5
  3008.      CLIPW       m5, m1, m3
  3009.      mova      [r0], m5
  3010. @@ -1069,32 +1069,31 @@ cglobal predict_8x8c_p_core_sse2, 1,1
  3011.      jg .loop
  3012.  %else ;!HIGH_BIT_DEPTH
  3013.      paddsw      m0, m2        ; m0 = {i+0*b, i+1*b, i+2*b, i+3*b, i+4*b, i+5*b, i+6*b, i+7*b}
  3014. -    mova        m3, m0
  3015. -    paddsw      m3, m4
  3016. +    paddsw      m3, m0, m4
  3017.      paddsw      m4, m4
  3018.  call .loop
  3019.      add         r0, FDEC_STRIDE*4
  3020.  .loop:
  3021. -    mova        m5, m0
  3022. -    mova        m1, m3
  3023. -    psraw       m0, 5
  3024. +    paddsw      m1, m3, m4
  3025. +    paddsw      m5, m0, m4
  3026.      psraw       m3, 5
  3027. +    psraw       m0, 5
  3028.      packuswb    m0, m3
  3029.      movq        [r0+FDEC_STRIDE*0], m0
  3030.      movhps      [r0+FDEC_STRIDE*1], m0
  3031. -    paddsw      m5, m4
  3032. -    paddsw      m1, m4
  3033. -    mova        m0, m5
  3034. -    mova        m3, m1
  3035. +    paddsw      m0, m5, m4
  3036. +    paddsw      m3, m1, m4
  3037.      psraw       m5, 5
  3038.      psraw       m1, 5
  3039.      packuswb    m5, m1
  3040.      movq        [r0+FDEC_STRIDE*2], m5
  3041.      movhps      [r0+FDEC_STRIDE*3], m5
  3042. -    paddsw      m0, m4
  3043. -    paddsw      m3, m4
  3044.  %endif ;!HIGH_BIT_DEPTH
  3045.      RET
  3046. +%endmacro ; PREDICT_8x8C_P
  3047. +
  3048. +INIT_XMM
  3049. +PREDICT_8x8C_P sse2
  3050.  
  3051.  ;-----------------------------------------------------------------------------
  3052.  ; void predict_16x16_p_core( uint8_t *src, int i00, int b, int c )
  3053. @@ -1140,8 +1139,8 @@ ALIGN 4
  3054.      REP_RET
  3055.  %endif ; !ARCH_X86_64
  3056.  
  3057. -INIT_XMM
  3058. -cglobal predict_16x16_p_core_sse2, 1,2,8
  3059. +%macro PREDICT_16x16_P 1
  3060. +cglobal predict_16x16_p_core_%1, 1,2,8
  3061.      movd     m0, r1m
  3062.      movd     m1, r2m
  3063.      movd     m2, r3m
  3064. @@ -1152,19 +1151,15 @@ cglobal predict_16x16_p_core_sse2, 1,2,8
  3065.      SPLATW   m0, m0, 0
  3066.      SPLATW   m1, m1, 0
  3067.      SPLATW   m2, m2, 0
  3068. -    mova     m3, m1
  3069. -    pmullw   m3, [pw_76543210]
  3070. +    pmullw   m3, m1, [pw_76543210]
  3071.      psllw    m1, 3
  3072.  %ifdef HIGH_BIT_DEPTH
  3073.      mov     r1d, 16
  3074.  .loop:
  3075. -    mova     m4, m0
  3076. -    mova     m5, m0
  3077. -    mova     m7, m3
  3078. -    paddsw   m7, m6
  3079. -    paddsw   m4, m7
  3080. +    paddsw   m7, m3, m6
  3081. +    paddsw   m4, m0, m7
  3082.      paddsw   m7, m1
  3083. -    paddsw   m5, m7
  3084. +    paddsw   m5, m0, m7
  3085.      psraw    m4, 5
  3086.      psraw    m5, 5
  3087.      CLIPW    m4, [pb_0], [pw_pixel_max]
  3088. @@ -1178,19 +1173,16 @@ cglobal predict_16x16_p_core_sse2, 1,2,8
  3089.  %else ;!HIGH_BIT_DEPTH
  3090.      paddsw   m0, m3  ; m0 = {i+ 0*b, i+ 1*b, i+ 2*b, i+ 3*b, i+ 4*b, i+ 5*b, i+ 6*b, i+ 7*b}
  3091.      paddsw   m1, m0  ; m1 = {i+ 8*b, i+ 9*b, i+10*b, i+11*b, i+12*b, i+13*b, i+14*b, i+15*b}
  3092. -    mova     m7, m2
  3093. -    paddsw   m7, m7
  3094. +    paddsw   m7, m2, m7
  3095.      mov     r1d, 8
  3096.  ALIGN 4
  3097.  .loop:
  3098.      mova     m3, m0
  3099.      mova     m4, m1
  3100. -    mova     m5, m0
  3101. -    mova     m6, m1
  3102.      psraw    m3, 5
  3103.      psraw    m4, 5
  3104. -    paddsw   m5, m2
  3105. -    paddsw   m6, m2
  3106. +    paddsw   m5, m0, m2
  3107. +    paddsw   m6, m1, m2
  3108.      psraw    m5, 5
  3109.      psraw    m6, 5
  3110.      packuswb m3, m4
  3111. @@ -1204,17 +1196,22 @@ ALIGN 4
  3112.      jg       .loop
  3113.  %endif ;!HIGH_BIT_DEPTH
  3114.      REP_RET
  3115. +%endmacro ; PREDICT_16x16_P
  3116.  
  3117. -%ifndef HIGH_BIT_DEPTH
  3118.  INIT_XMM
  3119. +PREDICT_16x16_P sse2
  3120. +INIT_AVX
  3121. +PREDICT_16x16_P avx
  3122. +
  3123. +%ifndef HIGH_BIT_DEPTH
  3124. +%macro PREDICT_8x8 1
  3125.  ;-----------------------------------------------------------------------------
  3126.  ; void predict_8x8_ddl( uint8_t *src, uint8_t *edge )
  3127.  ;-----------------------------------------------------------------------------
  3128. -cglobal predict_8x8_ddl_sse2, 2,2
  3129. +cglobal predict_8x8_ddl_%1, 2,2
  3130.      movdqa      xmm3, [r1+16]
  3131.      movdqu      xmm2, [r1+17]
  3132. -    movdqa      xmm1, xmm3
  3133. -    pslldq      xmm1, 1
  3134. +    pslldq      xmm1, xmm3, 1
  3135.      add          r0, FDEC_STRIDE*4
  3136.      PRED8x8_LOWPASS b, xmm0, xmm1, xmm2, xmm3, xmm4
  3137.  
  3138. @@ -1229,16 +1226,14 @@ cglobal predict_8x8_ddl_sse2, 2,2
  3139.  ;-----------------------------------------------------------------------------
  3140.  ; void predict_8x8_ddr( uint8_t *src, uint8_t *edge )
  3141.  ;-----------------------------------------------------------------------------
  3142. -cglobal predict_8x8_ddr_sse2, 2,2
  3143. +cglobal predict_8x8_ddr_%1, 2,2
  3144.      movdqu      xmm3, [r1+8]
  3145.      movdqu      xmm1, [r1+7]
  3146. -    movdqa      xmm2, xmm3
  3147. -    psrldq      xmm2, 1
  3148. +    psrldq      xmm2, xmm3, 1
  3149.      add           r0, FDEC_STRIDE*4
  3150.      PRED8x8_LOWPASS b, xmm0, xmm1, xmm2, xmm3, xmm4
  3151.  
  3152. -    movdqa      xmm1, xmm0
  3153. -    psrldq      xmm1, 1
  3154. +    psrldq      xmm1, xmm0, 1
  3155.  %assign Y 3
  3156.  %rep 3
  3157.      movq        [r0+Y*FDEC_STRIDE], xmm0
  3158. @@ -1250,19 +1245,15 @@ cglobal predict_8x8_ddr_sse2, 2,2
  3159.      movq        [r0-3*FDEC_STRIDE], xmm0
  3160.      movq        [r0-4*FDEC_STRIDE], xmm1
  3161.      RET
  3162. -%endif ; !HIGH_BIT_DEPTH
  3163.  
  3164.  ;-----------------------------------------------------------------------------
  3165.  ; void predict_8x8_vl( uint8_t *src, uint8_t *edge )
  3166.  ;-----------------------------------------------------------------------------
  3167. -cglobal predict_8x8_vl_sse2, 2,2
  3168. +cglobal predict_8x8_vl_%1, 2,2
  3169.      movdqa      xmm4, [r1+16]
  3170. -    movdqa      xmm2, xmm4
  3171. -    movdqa      xmm1, xmm4
  3172. -    movdqa      xmm3, xmm4
  3173. -    psrldq      xmm2, 1
  3174. -    pslldq      xmm1, 1
  3175. -    pavgb       xmm3, xmm2
  3176. +    pslldq      xmm1, xmm4, 1
  3177. +    psrldq      xmm2, xmm4, 1
  3178. +    pavgb       xmm3, xmm4, xmm2
  3179.      add           r0, FDEC_STRIDE*4
  3180.      PRED8x8_LOWPASS b, xmm0, xmm1, xmm2, xmm4, xmm5
  3181.  ; xmm0: (t0 + 2*t1 + t2 + 2) >> 2
  3182. @@ -1282,19 +1273,17 @@ cglobal predict_8x8_vl_sse2, 2,2
  3183.  
  3184.      RET
  3185.  
  3186. -%ifndef HIGH_BIT_DEPTH
  3187.  ;-----------------------------------------------------------------------------
  3188.  ; void predict_8x8_vr( uint8_t *src, uint8_t *edge )
  3189.  ;-----------------------------------------------------------------------------
  3190. -cglobal predict_8x8_vr_sse2, 2,2,7
  3191. +cglobal predict_8x8_vr_%1, 2,2,7
  3192.      movdqu      xmm0, [r1+8]
  3193.      movdqa      xmm6, [pw_ff00]
  3194.      add         r0, 4*FDEC_STRIDE
  3195. -    movdqa      xmm1, xmm0
  3196.      movdqa      xmm2, xmm0
  3197.      movdqa      xmm3, xmm0
  3198. +    pslldq      xmm1, xmm0, 2
  3199.      pslldq      xmm0, 1
  3200. -    pslldq      xmm1, 2
  3201.      pavgb       xmm2, xmm0
  3202.      PRED8x8_LOWPASS b, xmm4, xmm3, xmm1, xmm0, xmm5
  3203.      pandn       xmm6, xmm4
  3204. @@ -1317,7 +1306,14 @@ cglobal predict_8x8_vr_sse2, 2,2,7
  3205.  %assign Y (Y-2)
  3206.  %endrep
  3207.      RET
  3208. -%endif
  3209. +%endmacro ; PREDICT_8x8
  3210. +
  3211. +INIT_XMM
  3212. +PREDICT_8x8 sse2
  3213. +INIT_AVX
  3214. +PREDICT_8x8 avx
  3215. +
  3216. +%endif ; !HIGH_BIT_DEPTH
  3217.  
  3218.  ;-----------------------------------------------------------------------------
  3219.  ; void predict_8x8_hd( pixel *src, pixel *edge )
  3220. @@ -1336,15 +1332,12 @@ cglobal predict_8x8_hd_%1, 2,2,8*(mmsize/16)
  3221.      mova      m5, m3
  3222.      pavg%2    m3, m1
  3223.      PRED8x8_LOWPASS %2, m0, m4, m1, m5, m7
  3224. -    mova      m4, m2
  3225. -    mova      m1, m2                       ; t6 t5 t4 t3 t2 t1 t0 lt
  3226. -    psrl%3    m4, 2*%5                     ; .. .. t6 t5 t4 t3 t2 t1
  3227. -    psrl%3    m1, %5                       ; .. t6 t5 t4 t3 t2 t1 t0
  3228. +    psrl%3    m4, m2, 2*%5                 ; .. .. t6 t5 t4 t3 t2 t1
  3229. +    psrl%3    m1, m2, %5                   ; .. t6 t5 t4 t3 t2 t1 t0
  3230.      PRED8x8_LOWPASS %2, m6, m4, m2, m1, m5
  3231.                                             ; .. p11 p10 p9
  3232. -    mova      m7, m3
  3233. +    punpckh%4 m7, m3, m0                   ; p8 p7 p6 p5
  3234.      punpckl%4 m3, m0                       ; p4 p3 p2 p1
  3235. -    punpckh%4 m7, m0                       ; p8 p7 p6 p5
  3236.      mova      m1, m7
  3237.      mova      m0, m7
  3238.      mova      m4, m7
  3239. @@ -1373,6 +1366,8 @@ INIT_XMM
  3240.  PREDICT_8x8_HD sse2  , w, dq, wd, 2
  3241.  %define PALIGNR PALIGNR_SSSE3
  3242.  PREDICT_8x8_HD ssse3 , w, dq, wd, 2
  3243. +INIT_AVX
  3244. +PREDICT_8x8_HD avx   , w, dq, wd, 2
  3245.  %else
  3246.  INIT_MMX
  3247.  %define PALIGNR PALIGNR_MMX
  3248. @@ -1391,8 +1386,7 @@ cglobal predict_8x8_hd_%1, 2,2
  3249.      PALIGNR xmm1, xmm0, 7, xmm4
  3250.      PALIGNR xmm2, xmm0, 9, xmm5
  3251.      PALIGNR xmm3, xmm0, 8, xmm0
  3252. -    movdqa  xmm4, xmm1
  3253. -    pavgb   xmm4, xmm3
  3254. +    pavgb   xmm4, xmm1, xmm3
  3255.      PRED8x8_LOWPASS b, xmm0, xmm1, xmm2, xmm3, xmm5
  3256.      punpcklbw xmm4, xmm0
  3257.      movhlps xmm0, xmm4
  3258. @@ -1414,6 +1408,8 @@ INIT_XMM
  3259.  PREDICT_8x8_HD sse2
  3260.  %define PALIGNR PALIGNR_SSSE3
  3261.  PREDICT_8x8_HD ssse3
  3262. +INIT_AVX
  3263. +PREDICT_8x8_HD avx
  3264.  INIT_MMX
  3265.  %define PALIGNR PALIGNR_MMX
  3266.  %endif ; HIGH_BIT_DEPTH
  3267. diff --git a/common/x86/predict-c.c b/common/x86/predict-c.c
  3268. index b83a0a5..9a8d99d 100644
  3269. --- a/common/x86/predict-c.c
  3270. +++ b/common/x86/predict-c.c
  3271. @@ -43,6 +43,7 @@
  3272.   void x264_predict_16x16_dc_top_ssse3( uint16_t *src );
  3273.   void x264_predict_16x16_p_core_mmxext( uint8_t *src, int i00, int b, int c );
  3274.   void x264_predict_16x16_p_core_sse2( pixel *src, int i00, int b, int c );
  3275. + void x264_predict_16x16_p_core_avx( pixel *src, int i00, int b, int c );
  3276.   void x264_predict_8x8c_p_core_mmxext( uint8_t *src, int i00, int b, int c );
  3277.   void x264_predict_8x8c_p_core_sse2( pixel *src, int i00, int b, int c );
  3278.   void x264_predict_8x8c_dc_mmxext( pixel *src );
  3279. @@ -70,31 +71,43 @@
  3280.   void x264_predict_8x8_ddr_mmxext( uint8_t *src, uint8_t edge[33] );
  3281.   void x264_predict_8x8_ddl_sse2( pixel *src, pixel edge[33] );
  3282.   void x264_predict_8x8_ddr_sse2( pixel *src, pixel edge[33] );
  3283. + void x264_predict_8x8_ddl_avx( pixel *src, pixel edge[33] );
  3284. + void x264_predict_8x8_ddr_avx( pixel *src, pixel edge[33] );
  3285.   void x264_predict_8x8_vl_sse2( uint8_t *src, uint8_t edge[33] );
  3286. + void x264_predict_8x8_vl_avx( uint8_t *src, uint8_t edge[33] );
  3287.   void x264_predict_8x8_vr_mmxext( uint8_t *src, uint8_t edge[33] );
  3288.   void x264_predict_8x8_vr_sse2( pixel *src, pixel edge[33] );
  3289.   void x264_predict_8x8_vr_ssse3( uint16_t *src, uint16_t edge[33] );
  3290. + void x264_predict_8x8_vr_avx( pixel *src, pixel edge[33] );
  3291.   void x264_predict_8x8_hu_sse2( pixel *src, pixel edge[33] );
  3292.   void x264_predict_8x8_hu_ssse3( pixel *src, pixel edge[33] );
  3293. + void x264_predict_8x8_hu_avx( pixel *src, pixel edge[33] );
  3294.   void x264_predict_8x8_hd_sse2( pixel *src, pixel edge[33] );
  3295.   void x264_predict_8x8_hd_ssse3( pixel *src, pixel edge[33] );
  3296. + void x264_predict_8x8_hd_avx( pixel *src, pixel edge[33] );
  3297.   void x264_predict_8x8_filter_mmxext( uint8_t *src, uint8_t edge[33], int i_neighbor, int i_filters );
  3298.   void x264_predict_8x8_filter_sse2( uint16_t *src, uint16_t edge[33], int i_neighbor, int i_filters );
  3299.   void x264_predict_8x8_filter_ssse3( pixel *src, pixel edge[33], int i_neighbor, int i_filters );
  3300. + void x264_predict_8x8_filter_avx( uint16_t *src, uint16_t edge[33], int i_neighbor, int i_filters );
  3301.   void x264_predict_4x4_ddl_mmxext( pixel *src );
  3302.   void x264_predict_4x4_ddl_sse2( uint16_t *src );
  3303. + void x264_predict_4x4_ddl_avx( uint16_t *src );
  3304.   void x264_predict_4x4_ddr_mmxext( pixel *src );
  3305.   void x264_predict_4x4_vl_mmxext( pixel *src );
  3306.   void x264_predict_4x4_vl_sse2( uint16_t *src );
  3307. + void x264_predict_4x4_vl_avx( uint16_t *src );
  3308.   void x264_predict_4x4_vr_mmxext( uint8_t *src );
  3309.   void x264_predict_4x4_vr_sse2( uint16_t *src );
  3310.   void x264_predict_4x4_vr_ssse3( pixel *src );
  3311. + void x264_predict_4x4_vr_avx( uint16_t *src );
  3312.   void x264_predict_4x4_hd_mmxext( pixel *src );
  3313.   void x264_predict_4x4_hd_sse2( uint16_t *src );
  3314.   void x264_predict_4x4_hd_ssse3( pixel *src );
  3315. + void x264_predict_4x4_hd_avx( uint16_t *src );
  3316.   void x264_predict_4x4_dc_mmxext( pixel *src );
  3317.   void x264_predict_4x4_ddr_sse2( uint16_t *src );
  3318.   void x264_predict_4x4_ddr_ssse3( pixel *src );
  3319. + void x264_predict_4x4_ddr_avx( uint16_t *src );
  3320.   void x264_predict_4x4_hu_mmxext( pixel *src );
  3321.  
  3322.  #define PREDICT_16x16_DC(name)\
  3323. @@ -164,6 +177,7 @@ static void x264_predict_16x16_p_##name( pixel *src )\
  3324.  PREDICT_16x16_P( mmxext )
  3325.  #endif
  3326.  PREDICT_16x16_P( sse2   )
  3327. +PREDICT_16x16_P( avx    )
  3328.  #endif //!HIGH_BIT_DEPTH
  3329.  
  3330.  #ifdef __GNUC__
  3331. @@ -387,6 +401,7 @@ void x264_intra_sa8d_x3_8x8_##cpu( uint8_t *fenc, uint8_t edge[33], int res[3] )
  3332.  #if ARCH_X86_64
  3333.  INTRA_SA8D_X3(sse2)
  3334.  INTRA_SA8D_X3(ssse3)
  3335. +INTRA_SA8D_X3(avx)
  3336.  #else
  3337.  INTRA_SA8D_X3(mmxext)
  3338.  #endif
  3339. @@ -432,6 +447,9 @@ void x264_predict_16x16_init_mmx( int cpu, x264_predict_t pf[7] )
  3340.      if( !(cpu&X264_CPU_SSSE3) )
  3341.          return;
  3342.      pf[I_PRED_16x16_H]       = x264_predict_16x16_h_ssse3;
  3343. +    if( !(cpu&X264_CPU_AVX) )
  3344. +        return;
  3345. +    pf[I_PRED_16x16_P]       = x264_predict_16x16_p_avx;
  3346.  #ifdef __GNUC__
  3347.      pf[I_PRED_16x16_P]       = x264_predict_16x16_p_ssse3;
  3348.  #endif
  3349. @@ -503,6 +521,13 @@ void x264_predict_8x8_init_mmx( int cpu, x264_predict8x8_t pf[12], x264_predict_
  3350.      pf[I_PRED_8x8_HU]     = x264_predict_8x8_hu_ssse3;
  3351.      pf[I_PRED_8x8_VR]     = x264_predict_8x8_vr_ssse3;
  3352.      *predict_8x8_filter   = x264_predict_8x8_filter_ssse3;
  3353. +    if( !(cpu&X264_CPU_AVX) )
  3354. +        return;
  3355. +    pf[I_PRED_8x8_DDL]    = x264_predict_8x8_ddl_avx;
  3356. +    pf[I_PRED_8x8_HD]     = x264_predict_8x8_hd_avx;
  3357. +    pf[I_PRED_8x8_HU]     = x264_predict_8x8_hu_avx;
  3358. +    pf[I_PRED_8x8_VR]     = x264_predict_8x8_vr_avx;
  3359. +    *predict_8x8_filter   = x264_predict_8x8_filter_avx;
  3360.  #else
  3361.      pf[I_PRED_8x8_V]      = x264_predict_8x8_v_mmxext;
  3362.      pf[I_PRED_8x8_H]      = x264_predict_8x8_h_mmxext;
  3363. @@ -530,6 +555,12 @@ void x264_predict_8x8_init_mmx( int cpu, x264_predict8x8_t pf[12], x264_predict_
  3364.      pf[I_PRED_8x8_HD]   = x264_predict_8x8_hd_ssse3;
  3365.      pf[I_PRED_8x8_HU]   = x264_predict_8x8_hu_ssse3;
  3366.      *predict_8x8_filter = x264_predict_8x8_filter_ssse3;
  3367. +    if( !(cpu&X264_CPU_AVX) )
  3368. +        return;
  3369. +    pf[I_PRED_8x8_DDL]  = x264_predict_8x8_ddl_avx;
  3370. +    pf[I_PRED_8x8_DDR]  = x264_predict_8x8_ddr_avx;
  3371. +    pf[I_PRED_8x8_VL]   = x264_predict_8x8_vl_avx;
  3372. +    pf[I_PRED_8x8_VR]   = x264_predict_8x8_vr_avx;
  3373.  #endif // HIGH_BIT_DEPTH
  3374.  }
  3375.  
  3376. @@ -551,6 +582,15 @@ void x264_predict_4x4_init_mmx( int cpu, x264_predict_t pf[12] )
  3377.      pf[I_PRED_4x4_HD]  = x264_predict_4x4_hd_sse2;
  3378.      pf[I_PRED_4x4_VL]  = x264_predict_4x4_vl_sse2;
  3379.      pf[I_PRED_4x4_VR]  = x264_predict_4x4_vr_sse2;
  3380. +    if( !(cpu&X264_CPU_AVX) )
  3381. +        return;
  3382. +    pf[I_PRED_4x4_DDL] = x264_predict_4x4_ddl_avx;
  3383. +    pf[I_PRED_4x4_DDR] = x264_predict_4x4_ddr_avx;
  3384. +    pf[I_PRED_4x4_HD]  = x264_predict_4x4_hd_avx;
  3385. +#if ARCH_X86_64
  3386. +    pf[I_PRED_4x4_VL]  = x264_predict_4x4_vl_avx;
  3387. +#endif
  3388. +    pf[I_PRED_4x4_VR]  = x264_predict_4x4_vr_avx;
  3389.  #else
  3390.      pf[I_PRED_4x4_VR]  = x264_predict_4x4_vr_mmxext;
  3391.  #endif // HIGH_BIT_DEPTH
  3392. diff --git a/common/x86/quant-a.asm b/common/x86/quant-a.asm
  3393. index 96ba712..5bc9b6e 100644
  3394. --- a/common/x86/quant-a.asm
  3395. +++ b/common/x86/quant-a.asm
  3396. @@ -492,9 +492,8 @@ QUANT_AC quant_8x8_sse4, 8
  3397.      paddd     m0, m3
  3398.      psrad     m0, m2
  3399.  %else
  3400. -    mova      m1, m0
  3401. +    punpckhwd m1, m0, m4
  3402.      punpcklwd m0, m4
  3403. -    punpckhwd m1, m4
  3404.      pmaddwd   m0, %2
  3405.      pmaddwd   m1, %3
  3406.      paddd     m0, m3
  3407. @@ -586,6 +585,7 @@ cglobal dequant_%2x%2_%1, 0,3,6*(mmsize/16)
  3408.      psrld m3, 1
  3409.      DEQUANT_LOOP DEQUANT32_R, %2*%2/4, %4
  3410.  
  3411. +%ifnidn %1, avx
  3412.  cglobal dequant_%2x%2_flat16_%1, 0,3
  3413.      movifnidn t2d, r2m
  3414.  %if %2 == 8
  3415. @@ -625,6 +625,7 @@ cglobal dequant_%2x%2_flat16_%1, 0,3
  3416.      DEQUANT16_FLAT [r1+32], 32, 96
  3417.  %endif
  3418.      RET
  3419. +%endif ; !AVX
  3420.  %endmacro ; DEQUANT
  3421.  
  3422.  %ifdef HIGH_BIT_DEPTH
  3423. @@ -642,6 +643,9 @@ DEQUANT mmx, 8, 6, 1
  3424.  INIT_XMM
  3425.  DEQUANT sse2, 4, 4, 2
  3426.  DEQUANT sse2, 8, 6, 2
  3427. +INIT_AVX
  3428. +DEQUANT avx, 4, 4, 2
  3429. +DEQUANT avx, 8, 6, 2
  3430.  %endif
  3431.  
  3432.  %macro DEQUANT_DC 2
  3433. @@ -714,9 +718,8 @@ cglobal dequant_4x4dc_%1, 0,3,6*(mmsize/16)
  3434.      punpcklwd m2, m4
  3435.  %rep SIZEOF_PIXEL*32/mmsize
  3436.      mova      m0, [r0+x]
  3437. -    mova      m1, m0
  3438. +    punpckhwd m1, m0, m5
  3439.      punpcklwd m0, m5
  3440. -    punpckhwd m1, m5
  3441.      pmaddwd   m0, m2
  3442.      pmaddwd   m1, m2
  3443.      psrad     m0, m3
  3444. @@ -733,11 +736,15 @@ cglobal dequant_4x4dc_%1, 0,3,6*(mmsize/16)
  3445.  INIT_XMM
  3446.  DEQUANT_DC sse2  , d
  3447.  DEQUANT_DC sse4  , d
  3448. +INIT_AVX
  3449. +DEQUANT_DC avx   , d
  3450.  %else
  3451.  INIT_MMX
  3452.  DEQUANT_DC mmxext, w
  3453.  INIT_XMM
  3454.  DEQUANT_DC sse2  , w
  3455. +INIT_AVX
  3456. +DEQUANT_DC avx   , w
  3457.  %endif
  3458.  
  3459.  %ifdef HIGH_BIT_DEPTH
  3460. @@ -757,11 +764,9 @@ cglobal denoise_dct_%1, 4,4,%2
  3461.      mova      m5, m1
  3462.      psubd     m0, [r2+r3*4+0*mmsize]
  3463.      psubd     m1, [r2+r3*4+1*mmsize]
  3464. -    mova      m7, m0
  3465. -    pcmpgtd   m7, m6
  3466. +    pcmpgtd   m7, m0, m6
  3467.      pand      m0, m7
  3468. -    mova      m7, m1
  3469. -    pcmpgtd   m7, m6
  3470. +    pcmpgtd   m7, m1, m6
  3471.      pand      m1, m7
  3472.      PSIGND    m0, m2
  3473.      PSIGND    m1, m3
  3474. @@ -786,6 +791,8 @@ DENOISE_DCT sse2, 8
  3475.  %define PABSD PABSD_SSSE3
  3476.  %define PSIGND PSIGND_SSSE3
  3477.  DENOISE_DCT ssse3, 8
  3478. +INIT_AVX
  3479. +DENOISE_DCT avx  , 8
  3480.  
  3481.  %else ; !HIGH_BIT_DEPTH
  3482.  
  3483. diff --git a/common/x86/quant.h b/common/x86/quant.h
  3484. index de2b10b..d8f0edd 100644
  3485. --- a/common/x86/quant.h
  3486. +++ b/common/x86/quant.h
  3487. @@ -50,6 +50,9 @@ void x264_dequant_8x8_mmx( int16_t dct[64], int dequant_mf[6][64], int i_qp );
  3488.  void x264_dequant_4x4_sse2( dctcoef dct[16], int dequant_mf[6][16], int i_qp );
  3489.  void x264_dequant_4x4dc_sse2( dctcoef dct[16], int dequant_mf[6][16], int i_qp );
  3490.  void x264_dequant_8x8_sse2( dctcoef dct[64], int dequant_mf[6][64], int i_qp );
  3491. +void x264_dequant_4x4_avx( dctcoef dct[16], int dequant_mf[6][16], int i_qp );
  3492. +void x264_dequant_4x4dc_avx( dctcoef dct[16], int dequant_mf[6][16], int i_qp );
  3493. +void x264_dequant_8x8_avx( dctcoef dct[64], int dequant_mf[6][64], int i_qp );
  3494.  void x264_dequant_4x4_flat16_mmx( int16_t dct[16], int dequant_mf[6][16], int i_qp );
  3495.  void x264_dequant_8x8_flat16_mmx( int16_t dct[64], int dequant_mf[6][64], int i_qp );
  3496.  void x264_dequant_4x4_flat16_sse2( int16_t dct[16], int dequant_mf[6][16], int i_qp );
  3497. diff --git a/common/x86/sad-a.asm b/common/x86/sad-a.asm
  3498. index 4d23b82..36455cc 100644
  3499. --- a/common/x86/sad-a.asm
  3500. +++ b/common/x86/sad-a.asm
  3501. @@ -326,11 +326,10 @@ cglobal intra_sad_x3_4x4_sse4, 3,3
  3502.      pinsrd     xmm4, [r1+FDEC_STRIDE*3-4], 3
  3503.      movd       xmm2, [r1-FDEC_STRIDE]
  3504.      pxor       xmm3, xmm3
  3505. -    movdqa     xmm5, xmm4
  3506. -    pshufb     xmm4, [h4x4_pred_shuf2] ; EFGH
  3507. -    pshufb     xmm5, [h4x4_pred_shuf]  ; EEEEFFFFGGGGHHHH
  3508. -    pshufd     xmm0, xmm2, 0           ; ABCDABCDABCDABCD
  3509. -    punpckldq  xmm2, xmm4              ; ABCDEFGH
  3510. +    pshufb     xmm5, xmm4, [h4x4_pred_shuf] ; EEEEFFFFGGGGHHHH
  3511. +    pshufb     xmm4, [h4x4_pred_shuf2]      ; EFGH
  3512. +    pshufd     xmm0, xmm2, 0                ; ABCDABCDABCDABCD
  3513. +    punpckldq  xmm2, xmm4                   ; ABCDEFGH
  3514.      psadbw     xmm2, xmm3
  3515.      movd       xmm1, [r0+FENC_STRIDE*0]
  3516.      pinsrd     xmm1, [r0+FENC_STRIDE*1], 1
  3517. @@ -341,9 +340,8 @@ cglobal intra_sad_x3_4x4_sse4, 3,3
  3518.      psraw      xmm2, 2
  3519.      pavgw      xmm2, xmm3
  3520.      pshufb     xmm2, xmm3              ; DC prediction
  3521. -    movdqa     xmm3, xmm0
  3522. +    punpckhqdq xmm3, xmm0, xmm5
  3523.      punpcklqdq xmm0, xmm5
  3524. -    punpckhqdq xmm3, xmm5
  3525.      psadbw     xmm2, xmm1
  3526.      paddw      xmm0, xmm3
  3527.      movhlps    xmm4, xmm2
  3528. @@ -446,12 +444,10 @@ cglobal intra_sad_x3_8x8_ssse3, 3,4,9
  3529.  .loop:
  3530.      movq        m6, [r0+FENC_STRIDE*0]
  3531.      movhps      m6, [r0+FENC_STRIDE*1]
  3532. -    movdqa      m7, m0
  3533. -    pshufb      m7, [shuf+r3*8] ; H prediction
  3534. +    pshufb      m7, m0, [shuf+r3*8] ; H prediction
  3535.  %ifdef ARCH_X86_64
  3536. -    movdqa      m8, m1
  3537.      psadbw      m7, m6
  3538. -    psadbw      m8, m6
  3539. +    psadbw      m8, m1, m6
  3540.      psadbw      m6, m2
  3541.      paddw       m4, m7
  3542.      paddw       m3, m8
  3543. @@ -459,8 +455,7 @@ cglobal intra_sad_x3_8x8_ssse3, 3,4,9
  3544.  %else
  3545.      psadbw      m7, m6
  3546.      paddw       m4, m7
  3547. -    movdqa      m7, m1
  3548. -    psadbw      m7, m6
  3549. +    psadbw      m7, m1, m6
  3550.      psadbw      m6, m2
  3551.      paddw       m3, m7
  3552.      paddw       m5, m6
  3553. diff --git a/common/x86/x86inc.asm b/common/x86/x86inc.asm
  3554. index 7ddc1c2..d56c312 100644
  3555. --- a/common/x86/x86inc.asm
  3556. +++ b/common/x86/x86inc.asm
  3557. @@ -547,6 +547,7 @@ SECTION .note.GNU-stack noalloc noexec nowrite progbits
  3558.  %macro INIT_AVX 0
  3559.      INIT_XMM
  3560.      %assign avx_enabled 1
  3561. +    %define PALIGNR PALIGNR_SSSE3
  3562.      %define RESET_MM_PERMUTATION INIT_AVX
  3563.  %endmacro
  3564.  
  3565. @@ -870,6 +871,7 @@ AVX_INSTR punpcklwd, 0, 0
  3566.  AVX_INSTR punpckldq, 0, 0
  3567.  AVX_INSTR punpcklqdq, 0, 0
  3568.  AVX_INSTR pxor, 0, 0
  3569. +AVX_INSTR shufps, 0, 1
  3570.  AVX_INSTR subpd, 1, 0
  3571.  AVX_INSTR subps, 1, 0
  3572.  AVX_INSTR subsd, 1, 0
  3573. diff --git a/common/x86/x86util.asm b/common/x86/x86util.asm
  3574. index 4e25448..34177bd 100644
  3575. --- a/common/x86/x86util.asm
  3576. +++ b/common/x86/x86util.asm
  3577. @@ -42,16 +42,20 @@
  3578.  %assign PIXEL_MAX ((1 << BIT_DEPTH)-1)
  3579.  
  3580.  %macro SBUTTERFLY 4
  3581. +%if avx_enabled == 0
  3582.      mova      m%4, m%2
  3583.      punpckl%1 m%2, m%3
  3584.      punpckh%1 m%4, m%3
  3585. +%else
  3586. +    punpckh%1 m%4, m%2, m%3
  3587. +    punpckl%1 m%2, m%3
  3588. +%endif
  3589.      SWAP %3, %4
  3590.  %endmacro
  3591.  
  3592.  %macro SBUTTERFLY2 4
  3593. -    mova      m%4, m%2
  3594. -    punpckh%1 m%2, m%3
  3595. -    punpckl%1 m%4, m%3
  3596. +    punpckl%1 m%4, m%2, m%3
  3597. +    punpckh%1 m%2, m%2, m%3
  3598.      SWAP %2, %4, %3
  3599.  %endmacro
  3600.  
  3601. @@ -229,16 +233,15 @@
  3602.  
  3603.  %macro DEINTB 5 ; mask, reg1, mask, reg2, optional src to fill masks from
  3604.  %ifnum %5
  3605. -    mova   m%1, m%5
  3606. -    mova   m%3, m%5
  3607. +    pand   m%3, m%5, m%4 ; src .. y6 .. y4
  3608. +    pand   m%1, m%5, m%2 ; dst .. y6 .. y4
  3609.  %else
  3610.      mova   m%1, %5
  3611. -    mova   m%3, m%1
  3612. +    pand   m%3, m%1, m%4 ; src .. y6 .. y4
  3613. +    pand   m%1, m%1, m%2 ; dst .. y6 .. y4
  3614.  %endif
  3615. -    pand   m%1, m%2 ; dst .. y6 .. y4
  3616. -    pand   m%3, m%4 ; src .. y6 .. y4
  3617. -    psrlw  m%2, 8   ; dst .. y7 .. y5
  3618. -    psrlw  m%4, 8   ; src .. y7 .. y5
  3619. +    psrlw  m%2, 8        ; dst .. y7 .. y5
  3620. +    psrlw  m%4, 8        ; src .. y7 .. y5
  3621.  %endmacro
  3622.  
  3623.  %macro SUMSUB_BA 3-4
  3624. @@ -317,23 +320,31 @@
  3625.  
  3626.  %macro TRANS_SSE4 5-6 ; see above
  3627.  %ifidn %1, d
  3628. -    mova   m%5, m%3
  3629.  %ifidn %2, ord
  3630. -    psrl%1 m%3, 16
  3631. -%endif
  3632. +    psrl%1  m%5, m%3, 16
  3633. +    SWAP     %3,  %5
  3634.      pblendw m%3, m%4, 10101010b
  3635. -    psll%1 m%4, 16
  3636. -%ifidn %2, ord
  3637. +    psll%1  m%4, 16
  3638.      pblendw m%4, m%5, 01010101b
  3639.  %else
  3640. -    psrl%1 m%5, 16
  3641. -    por    m%4, m%5
  3642. +%if avx_enabled == 0
  3643. +    mova    m%5, m%3
  3644. +    pblendw m%3, m%4, 10101010b
  3645. +    psll%1  m%4, 16
  3646. +    psrl%1  m%5, 16
  3647. +    por     m%4, m%5
  3648. +%else
  3649. +    pblendw m%5, m%3, m%4, 10101010b
  3650. +    psll%1  m%4, 16
  3651. +    psrl%1  m%3, 16
  3652. +    por     m%4, m%3
  3653. +    SWAP     %3, %5
  3654. +%endif
  3655.  %endif
  3656.  %elifidn %1, q
  3657. -    mova   m%5, m%3
  3658. +    shufps m%5, m%3, m%4, 11011101b
  3659.      shufps m%3, m%4, 10001000b
  3660. -    shufps m%5, m%4, 11011101b
  3661. -    SWAP   %4, %5
  3662. +    SWAP    %4, %5
  3663.  %endif
  3664.  %endmacro
  3665.  
  3666. @@ -427,19 +438,34 @@
  3667.  %endmacro
  3668.  
  3669.  %macro SUMSUB2_AB 4
  3670. +%if avx_enabled == 0
  3671.      mova    %4, %2
  3672.      padd%1  %2, %2
  3673.      padd%1  %2, %3
  3674.      psub%1  %4, %3
  3675.      psub%1  %4, %3
  3676. +%else
  3677. +    psub%1  %4, %2, %3
  3678. +    psub%1  %4, %3
  3679. +    padd%1  %2, %2
  3680. +    padd%1  %2, %3
  3681. +%endif
  3682.  %endmacro
  3683.  
  3684.  %macro SUMSUB2_BA 4
  3685. +%if avx_enabled == 0
  3686.      mova    m%4, m%2
  3687.      padd%1  m%2, m%3
  3688.      padd%1  m%2, m%3
  3689.      psub%1  m%3, m%4
  3690.      psub%1  m%3, m%4
  3691. +%else
  3692. +    padd%1  m%4, m%2, m%3
  3693. +    padd%1  m%4, m%3
  3694. +    psub%1  m%3, m%2
  3695. +    psub%1  m%3, m%2
  3696. +    SWAP    m%2, m%4
  3697. +%endif
  3698.  %endmacro
  3699.  
  3700.  %macro SUMSUBD2_AB 5
  3701. @@ -616,9 +642,8 @@
  3702.  %endmacro
  3703.  
  3704.  %macro HADDUW 2
  3705. -    mova  %2, %1
  3706. +    psrld %2, %1, 16
  3707.      pslld %1, 16
  3708. -    psrld %2, 16
  3709.      psrld %1, 16
  3710.      paddd %1, %2
  3711.      HADDD %1, %2
  3712. --
  3713. 1.7.2.3
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement