Guest User

Untitled

a guest
Feb 19th, 2018
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 101.81 KB | None | 0 0
  1. From 255ae1e5c65c2d7aacd420aa5db656e88e938b80 Mon Sep 17 00:00:00 2001
  2. From: Daniel Kang <daniel.d.kang@gmail.com>
  3. Date: Sun, 23 Oct 2011 12:21:33 -0400
  4. Subject: [PATCH] h264 qpel WIP
  5.  
  6. ---
  7. libavcodec/x86/Makefile                   |    1 +
  8.  libavcodec/x86/dsputil_mmx.c              |  181 +---
  9.  libavcodec/x86/dsputil_mmx_avg_template.c |  128 ---
  10.  libavcodec/x86/h264_qpel.asm              |  812 +++++++++++++++++
  11.  libavcodec/x86/h264_qpel_mmx.c            | 1389 +++--------------------------
  12.  5 files changed, 997 insertions(+), 1514 deletions(-)
  13.  create mode 100644 libavcodec/x86/h264_qpel.asm
  14.  
  15. diff --git a/libavcodec/x86/Makefile b/libavcodec/x86/Makefile
  16. index ab13109..ab67045 100644
  17. --- a/libavcodec/x86/Makefile
  18. +++ b/libavcodec/x86/Makefile
  19. @@ -50,6 +50,7 @@ MMX-OBJS-$(HAVE_YASM)                  += x86/dsputil_yasm.o            \
  20.                                            x86/fmtconvert.o              \
  21.                                            x86/h264_chromamc.o           \
  22.                                            x86/h264_chromamc_10bit.o     \
  23. +                                          x86/h264_qpel.o               \
  24.                                            x86/h264_qpel_10bit.o         \
  25.                                            $(YASM-OBJS-yes)
  26.  
  27. diff --git a/libavcodec/x86/dsputil_mmx.c b/libavcodec/x86/dsputil_mmx.c
  28. index 58620d6..8d07d39 100644
  29. --- a/libavcodec/x86/dsputil_mmx.c
  30. +++ b/libavcodec/x86/dsputil_mmx.c
  31. @@ -222,12 +222,10 @@ DECLARE_ALIGNED(16, const double, ff_pd_2)[2] = { 2.0, 2.0 };
  32.  #define put_no_rnd_pixels8_mmx put_pixels8_mmx
  33.  #define put_pixels16_mmx2 put_pixels16_mmx
  34.  #define put_pixels8_mmx2 put_pixels8_mmx
  35. -#define put_pixels4_mmx2 put_pixels4_mmx
  36.  #define put_no_rnd_pixels16_mmx2 put_no_rnd_pixels16_mmx
  37.  #define put_no_rnd_pixels8_mmx2 put_no_rnd_pixels8_mmx
  38.  #define put_pixels16_3dnow put_pixels16_mmx
  39.  #define put_pixels8_3dnow put_pixels8_mmx
  40. -#define put_pixels4_3dnow put_pixels4_mmx
  41.  #define put_no_rnd_pixels16_3dnow put_no_rnd_pixels16_mmx
  42.  #define put_no_rnd_pixels8_3dnow put_no_rnd_pixels8_mmx
  43.  
  44. @@ -364,32 +362,6 @@ void ff_add_pixels_clamped_mmx(const DCTELEM *block, uint8_t *pixels, int line_s
  45.      } while (--i);
  46.  }
  47.  
  48. -static void put_pixels4_mmx(uint8_t *block, const uint8_t *pixels, int line_size, int h)
  49. -{
  50. -    __asm__ volatile(
  51. -         "lea (%3, %3), %%"REG_a"       \n\t"
  52. -         ".p2align 3                    \n\t"
  53. -         "1:                            \n\t"
  54. -         "movd (%1), %%mm0              \n\t"
  55. -         "movd (%1, %3), %%mm1          \n\t"
  56. -         "movd %%mm0, (%2)              \n\t"
  57. -         "movd %%mm1, (%2, %3)          \n\t"
  58. -         "add %%"REG_a", %1             \n\t"
  59. -         "add %%"REG_a", %2             \n\t"
  60. -         "movd (%1), %%mm0              \n\t"
  61. -         "movd (%1, %3), %%mm1          \n\t"
  62. -         "movd %%mm0, (%2)              \n\t"
  63. -         "movd %%mm1, (%2, %3)          \n\t"
  64. -         "add %%"REG_a", %1             \n\t"
  65. -         "add %%"REG_a", %2             \n\t"
  66. -         "subl $4, %0                   \n\t"
  67. -         "jnz 1b                        \n\t"
  68. -         : "+g"(h), "+r" (pixels),  "+r" (block)
  69. -         : "r"((x86_reg)line_size)
  70. -         : "%"REG_a, "memory"
  71. -        );
  72. -}
  73. -
  74.  static void put_pixels8_mmx(uint8_t *block, const uint8_t *pixels, int line_size, int h)
  75.  {
  76.      __asm__ volatile(
  77. @@ -450,54 +422,6 @@ static void put_pixels16_mmx(uint8_t *block, const uint8_t *pixels, int line_siz
  78.          );
  79.  }
  80.  
  81. -static void put_pixels16_sse2(uint8_t *block, const uint8_t *pixels, int line_size, int h)
  82. -{
  83. -    __asm__ volatile(
  84. -         "1:                            \n\t"
  85. -         "movdqu (%1), %%xmm0           \n\t"
  86. -         "movdqu (%1,%3), %%xmm1        \n\t"
  87. -         "movdqu (%1,%3,2), %%xmm2      \n\t"
  88. -         "movdqu (%1,%4), %%xmm3        \n\t"
  89. -         "lea (%1,%3,4), %1             \n\t"
  90. -         "movdqa %%xmm0, (%2)           \n\t"
  91. -         "movdqa %%xmm1, (%2,%3)        \n\t"
  92. -         "movdqa %%xmm2, (%2,%3,2)      \n\t"
  93. -         "movdqa %%xmm3, (%2,%4)        \n\t"
  94. -         "subl $4, %0                   \n\t"
  95. -         "lea (%2,%3,4), %2             \n\t"
  96. -         "jnz 1b                        \n\t"
  97. -         : "+g"(h), "+r" (pixels),  "+r" (block)
  98. -         : "r"((x86_reg)line_size), "r"((x86_reg)3L*line_size)
  99. -         : "memory"
  100. -        );
  101. -}
  102. -
  103. -static void avg_pixels16_sse2(uint8_t *block, const uint8_t *pixels, int line_size, int h)
  104. -{
  105. -    __asm__ volatile(
  106. -         "1:                            \n\t"
  107. -         "movdqu (%1), %%xmm0           \n\t"
  108. -         "movdqu (%1,%3), %%xmm1        \n\t"
  109. -         "movdqu (%1,%3,2), %%xmm2      \n\t"
  110. -         "movdqu (%1,%4), %%xmm3        \n\t"
  111. -         "lea (%1,%3,4), %1             \n\t"
  112. -         "pavgb  (%2), %%xmm0           \n\t"
  113. -         "pavgb  (%2,%3), %%xmm1        \n\t"
  114. -         "pavgb  (%2,%3,2), %%xmm2      \n\t"
  115. -         "pavgb  (%2,%4), %%xmm3        \n\t"
  116. -         "movdqa %%xmm0, (%2)           \n\t"
  117. -         "movdqa %%xmm1, (%2,%3)        \n\t"
  118. -         "movdqa %%xmm2, (%2,%3,2)      \n\t"
  119. -         "movdqa %%xmm3, (%2,%4)        \n\t"
  120. -         "subl $4, %0                   \n\t"
  121. -         "lea (%2,%3,4), %2             \n\t"
  122. -         "jnz 1b                        \n\t"
  123. -         : "+g"(h), "+r" (pixels),  "+r" (block)
  124. -         : "r"((x86_reg)line_size), "r"((x86_reg)3L*line_size)
  125. -         : "memory"
  126. -        );
  127. -}
  128. -
  129.  #define CLEAR_BLOCKS(name,n) \
  130.  static void name(DCTELEM *blocks)\
  131.  {\
  132. @@ -2635,16 +2559,30 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx)
  133.              SET_QPEL_FUNCS(avg_qpel, 0, 16, mmx2, );
  134.              SET_QPEL_FUNCS(avg_qpel, 1, 8, mmx2, );
  135.  
  136. +#define H264_QPEL_FUNCS_TMP(x, y, CPU)\
  137. +            c->put_h264_qpel_pixels_tab[0][x+y*4] = ff_put_h264_qpel16_mc##x##y##_##CPU;\
  138. +            c->put_h264_qpel_pixels_tab[1][x+y*4] = ff_put_h264_qpel8_mc##x##y##_##CPU;\
  139. +            c->put_h264_qpel_pixels_tab[2][x+y*4] = ff_put_h264_qpel4_mc##x##y##_##CPU;\
  140. +            c->avg_h264_qpel_pixels_tab[0][x+y*4] = ff_avg_h264_qpel16_mc##x##y##_##CPU;\
  141. +            c->avg_h264_qpel_pixels_tab[1][x+y*4] = ff_avg_h264_qpel8_mc##x##y##_##CPU;\
  142. +            c->avg_h264_qpel_pixels_tab[2][x+y*4] = ff_avg_h264_qpel4_mc##x##y##_##CPU;
  143. +
  144. +#define H264_QPEL_FUNCS_TMP48(x, y, CPU)\
  145. +            c->put_h264_qpel_pixels_tab[1][x+y*4] = ff_put_h264_qpel8_mc##x##y##_##CPU;\
  146. +            c->put_h264_qpel_pixels_tab[2][x+y*4] = ff_put_h264_qpel4_mc##x##y##_##CPU;\
  147. +            c->avg_h264_qpel_pixels_tab[1][x+y*4] = ff_avg_h264_qpel8_mc##x##y##_##CPU;\
  148. +            c->avg_h264_qpel_pixels_tab[2][x+y*4] = ff_avg_h264_qpel4_mc##x##y##_##CPU;
  149. +
  150. +#if HAVE_YASM
  151.              if (!high_bit_depth) {
  152. -            SET_QPEL_FUNCS(put_h264_qpel, 0, 16, mmx2, );
  153. -            SET_QPEL_FUNCS(put_h264_qpel, 1, 8, mmx2, );
  154. -            SET_QPEL_FUNCS(put_h264_qpel, 2, 4, mmx2, );
  155. -            SET_QPEL_FUNCS(avg_h264_qpel, 0, 16, mmx2, );
  156. -            SET_QPEL_FUNCS(avg_h264_qpel, 1, 8, mmx2, );
  157. -            SET_QPEL_FUNCS(avg_h264_qpel, 2, 4, mmx2, );
  158. +                SET_QPEL_FUNCS(put_h264_qpel, 0, 16, mmxext, );
  159. +                SET_QPEL_FUNCS(put_h264_qpel, 1,  8, mmxext, );
  160. +                SET_QPEL_FUNCS(put_h264_qpel, 2,  4, mmxext, );
  161. +                SET_QPEL_FUNCS(avg_h264_qpel, 0, 16, mmxext, );
  162. +                SET_QPEL_FUNCS(avg_h264_qpel, 1,  8, mmxext, );
  163. +                SET_QPEL_FUNCS(avg_h264_qpel, 2,  4, mmxext, );
  164.              }
  165.              else if (bit_depth == 10) {
  166. -#if HAVE_YASM
  167.  #if !ARCH_X86_64
  168.                  SET_QPEL_FUNCS(avg_h264_qpel, 0, 16, 10_mmxext, ff_);
  169.                  SET_QPEL_FUNCS(put_h264_qpel, 0, 16, 10_mmxext, ff_);
  170. @@ -2653,8 +2591,8 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx)
  171.  #endif
  172.                  SET_QPEL_FUNCS(put_h264_qpel, 2, 4,  10_mmxext, ff_);
  173.                  SET_QPEL_FUNCS(avg_h264_qpel, 2, 4,  10_mmxext, ff_);
  174. -#endif
  175.              }
  176. +#endif
  177.  
  178.              SET_QPEL_FUNCS(put_2tap_qpel, 0, 16, mmx2, );
  179.              SET_QPEL_FUNCS(put_2tap_qpel, 1, 8, mmx2, );
  180. @@ -2724,15 +2662,6 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx)
  181.              SET_QPEL_FUNCS(avg_qpel, 0, 16, 3dnow, );
  182.              SET_QPEL_FUNCS(avg_qpel, 1, 8, 3dnow, );
  183.  
  184. -            if (!high_bit_depth) {
  185. -            SET_QPEL_FUNCS(put_h264_qpel, 0, 16, 3dnow, );
  186. -            SET_QPEL_FUNCS(put_h264_qpel, 1, 8, 3dnow, );
  187. -            SET_QPEL_FUNCS(put_h264_qpel, 2, 4, 3dnow, );
  188. -            SET_QPEL_FUNCS(avg_h264_qpel, 0, 16, 3dnow, );
  189. -            SET_QPEL_FUNCS(avg_h264_qpel, 1, 8, 3dnow, );
  190. -            SET_QPEL_FUNCS(avg_h264_qpel, 2, 4, 3dnow, );
  191. -            }
  192. -
  193.              SET_QPEL_FUNCS(put_2tap_qpel, 0, 16, 3dnow, );
  194.              SET_QPEL_FUNCS(put_2tap_qpel, 1, 8, 3dnow, );
  195.              SET_QPEL_FUNCS(avg_2tap_qpel, 0, 16, 3dnow, );
  196. @@ -2747,37 +2676,33 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx)
  197.  #endif
  198.          }
  199.  
  200. -
  201. +#if HAVE_YASM
  202.  #define H264_QPEL_FUNCS(x, y, CPU)\
  203. -            c->put_h264_qpel_pixels_tab[0][x+y*4] = put_h264_qpel16_mc##x##y##_##CPU;\
  204. -            c->put_h264_qpel_pixels_tab[1][x+y*4] = put_h264_qpel8_mc##x##y##_##CPU;\
  205. -            c->avg_h264_qpel_pixels_tab[0][x+y*4] = avg_h264_qpel16_mc##x##y##_##CPU;\
  206. -            c->avg_h264_qpel_pixels_tab[1][x+y*4] = avg_h264_qpel8_mc##x##y##_##CPU;
  207. -        if((mm_flags & AV_CPU_FLAG_SSE2) && !(mm_flags & AV_CPU_FLAG_3DNOW)){
  208. -            // these functions are slower than mmx on AMD, but faster on Intel
  209. -            if (!high_bit_depth) {
  210. -            c->put_pixels_tab[0][0] = put_pixels16_sse2;
  211. -            c->put_no_rnd_pixels_tab[0][0] = put_pixels16_sse2;
  212. -            c->avg_pixels_tab[0][0] = avg_pixels16_sse2;
  213. -            H264_QPEL_FUNCS(0, 0, sse2);
  214. -            }
  215. -        }
  216. +            c->put_h264_qpel_pixels_tab[0][x+y*4] = ff_put_h264_qpel16_mc##x##y##_##CPU;\
  217. +            c->put_h264_qpel_pixels_tab[1][x+y*4] = ff_put_h264_qpel8_mc##x##y##_##CPU;\
  218. +            c->avg_h264_qpel_pixels_tab[0][x+y*4] = ff_avg_h264_qpel16_mc##x##y##_##CPU;\
  219. +            c->avg_h264_qpel_pixels_tab[1][x+y*4] = ff_avg_h264_qpel8_mc##x##y##_##CPU;
  220. +#define H264_QPEL_FUNCS8(x, y, CPU)\
  221. +            c->put_h264_qpel_pixels_tab[1][x+y*4] = ff_put_h264_qpel8_mc##x##y##_##CPU;
  222.          if(mm_flags & AV_CPU_FLAG_SSE2){
  223.              if (!high_bit_depth) {
  224. -            H264_QPEL_FUNCS(0, 1, sse2);
  225. -            H264_QPEL_FUNCS(0, 2, sse2);
  226. -            H264_QPEL_FUNCS(0, 3, sse2);
  227. -            H264_QPEL_FUNCS(1, 1, sse2);
  228. -            H264_QPEL_FUNCS(1, 2, sse2);
  229. -            H264_QPEL_FUNCS(1, 3, sse2);
  230. -            H264_QPEL_FUNCS(2, 1, sse2);
  231. -            H264_QPEL_FUNCS(2, 2, sse2);
  232. -            H264_QPEL_FUNCS(2, 3, sse2);
  233. -            H264_QPEL_FUNCS(3, 1, sse2);
  234. -            H264_QPEL_FUNCS(3, 2, sse2);
  235. -            H264_QPEL_FUNCS(3, 3, sse2);
  236. +               //H264_QPEL_FUNCS(0, 0, sse2);
  237. +                H264_QPEL_FUNCS(0, 1, sse2);
  238. +                H264_QPEL_FUNCS(0, 2, sse2);
  239. +                H264_QPEL_FUNCS(0, 3, sse2);
  240. +                H264_QPEL_FUNCS(1, 0, sse2);
  241. +                H264_QPEL_FUNCS(1, 1, sse2);
  242. +                H264_QPEL_FUNCS(1, 2, sse2);
  243. +                H264_QPEL_FUNCS(1, 3, sse2);
  244. +                H264_QPEL_FUNCS(2, 0, sse2);
  245. +                H264_QPEL_FUNCS(2, 1, sse2);
  246. +                H264_QPEL_FUNCS(2, 2, sse2);
  247. +                H264_QPEL_FUNCS(2, 3, sse2);
  248. +                H264_QPEL_FUNCS(3, 0, sse2);
  249. +                H264_QPEL_FUNCS(3, 1, sse2);
  250. +                H264_QPEL_FUNCS(3, 2, sse2);
  251. +                H264_QPEL_FUNCS(3, 3, sse2);
  252.              }
  253. -#if HAVE_YASM
  254.  #define H264_QPEL_FUNCS_10(x, y, CPU)\
  255.              c->put_h264_qpel_pixels_tab[0][x+y*4] = ff_put_h264_qpel16_mc##x##y##_10_##CPU;\
  256.              c->put_h264_qpel_pixels_tab[1][x+y*4] = ff_put_h264_qpel8_mc##x##y##_10_##CPU;\
  257. @@ -2799,22 +2724,8 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx)
  258.          }
  259.  #if HAVE_SSSE3
  260.          if(mm_flags & AV_CPU_FLAG_SSSE3){
  261. -            if (!high_bit_depth) {
  262. -            H264_QPEL_FUNCS(1, 0, ssse3);
  263. -            H264_QPEL_FUNCS(1, 1, ssse3);
  264. -            H264_QPEL_FUNCS(1, 2, ssse3);
  265. -            H264_QPEL_FUNCS(1, 3, ssse3);
  266. -            H264_QPEL_FUNCS(2, 0, ssse3);
  267. -            H264_QPEL_FUNCS(2, 1, ssse3);
  268. -            H264_QPEL_FUNCS(2, 2, ssse3);
  269. -            H264_QPEL_FUNCS(2, 3, ssse3);
  270. -            H264_QPEL_FUNCS(3, 0, ssse3);
  271. -            H264_QPEL_FUNCS(3, 1, ssse3);
  272. -            H264_QPEL_FUNCS(3, 2, ssse3);
  273. -            H264_QPEL_FUNCS(3, 3, ssse3);
  274. -            }
  275.  #if HAVE_YASM
  276. -            else if (bit_depth == 10) {
  277. +            if (bit_depth == 10) {
  278.                  H264_QPEL_FUNCS_10(1, 0, ssse3_cache64)
  279.                  H264_QPEL_FUNCS_10(2, 0, ssse3_cache64)
  280.                  H264_QPEL_FUNCS_10(3, 0, ssse3_cache64)
  281. diff --git a/libavcodec/x86/dsputil_mmx_avg_template.c b/libavcodec/x86/dsputil_mmx_avg_template.c
  282. index 8b116b7..6d5d12b 100644
  283. --- a/libavcodec/x86/dsputil_mmx_avg_template.c
  284. +++ b/libavcodec/x86/dsputil_mmx_avg_template.c
  285. @@ -55,57 +55,6 @@ static void DEF(put_pixels8_x2)(uint8_t *block, const uint8_t *pixels, int line_
  286.          :"%"REG_a, "memory");
  287.  }
  288.  
  289. -static void DEF(put_pixels4_l2)(uint8_t *dst, uint8_t *src1, uint8_t *src2, int dstStride, int src1Stride, int h)
  290. -{
  291. -    __asm__ volatile(
  292. -        "testl $1, %0                   \n\t"
  293. -            " jz 1f                     \n\t"
  294. -        "movd   (%1), %%mm0             \n\t"
  295. -        "movd   (%2), %%mm1             \n\t"
  296. -        "add    %4, %1                  \n\t"
  297. -        "add    $4, %2                  \n\t"
  298. -        PAVGB" %%mm1, %%mm0             \n\t"
  299. -        "movd   %%mm0, (%3)             \n\t"
  300. -        "add    %5, %3                  \n\t"
  301. -        "decl   %0                      \n\t"
  302. -        "1:                             \n\t"
  303. -        "movd   (%1), %%mm0             \n\t"
  304. -        "add    %4, %1                  \n\t"
  305. -        "movd   (%1), %%mm1             \n\t"
  306. -        "movd   (%2), %%mm2             \n\t"
  307. -        "movd   4(%2), %%mm3            \n\t"
  308. -        "add    %4, %1                  \n\t"
  309. -        PAVGB" %%mm2, %%mm0             \n\t"
  310. -        PAVGB" %%mm3, %%mm1             \n\t"
  311. -        "movd   %%mm0, (%3)             \n\t"
  312. -        "add    %5, %3                  \n\t"
  313. -        "movd   %%mm1, (%3)             \n\t"
  314. -        "add    %5, %3                  \n\t"
  315. -        "movd   (%1), %%mm0             \n\t"
  316. -        "add    %4, %1                  \n\t"
  317. -        "movd   (%1), %%mm1             \n\t"
  318. -        "movd   8(%2), %%mm2            \n\t"
  319. -        "movd   12(%2), %%mm3           \n\t"
  320. -        "add    %4, %1                  \n\t"
  321. -        PAVGB" %%mm2, %%mm0             \n\t"
  322. -        PAVGB" %%mm3, %%mm1             \n\t"
  323. -        "movd   %%mm0, (%3)             \n\t"
  324. -        "add    %5, %3                  \n\t"
  325. -        "movd   %%mm1, (%3)             \n\t"
  326. -        "add    %5, %3                  \n\t"
  327. -        "add    $16, %2                 \n\t"
  328. -        "subl   $4, %0                  \n\t"
  329. -        "jnz    1b                      \n\t"
  330. -#if !HAVE_EBX_AVAILABLE //Note "+bm" and "+mb" are buggy too (with gcc 3.2.2 at least) and cannot be used
  331. -        :"+m"(h), "+a"(src1), "+c"(src2), "+d"(dst)
  332. -#else
  333. -        :"+b"(h), "+a"(src1), "+c"(src2), "+d"(dst)
  334. -#endif
  335. -        :"S"((x86_reg)src1Stride), "D"((x86_reg)dstStride)
  336. -        :"memory");
  337. -}
  338. -
  339. -
  340.  static void DEF(put_pixels8_l2)(uint8_t *dst, uint8_t *src1, uint8_t *src2, int dstStride, int src1Stride, int h)
  341.  {
  342.      __asm__ volatile(
  343. @@ -226,58 +175,6 @@ static void DEF(put_no_rnd_pixels8_l2)(uint8_t *dst, uint8_t *src1, uint8_t *src
  344.          :"memory");*/
  345.  }
  346.  
  347. -static void DEF(avg_pixels4_l2)(uint8_t *dst, uint8_t *src1, uint8_t *src2, int dstStride, int src1Stride, int h)
  348. -{
  349. -    __asm__ volatile(
  350. -        "testl $1, %0                   \n\t"
  351. -            " jz 1f                     \n\t"
  352. -        "movd   (%1), %%mm0             \n\t"
  353. -        "movd   (%2), %%mm1             \n\t"
  354. -        "add    %4, %1                  \n\t"
  355. -        "add    $4, %2                  \n\t"
  356. -        PAVGB" %%mm1, %%mm0             \n\t"
  357. -        PAVGB" (%3), %%mm0              \n\t"
  358. -        "movd   %%mm0, (%3)             \n\t"
  359. -        "add    %5, %3                  \n\t"
  360. -        "decl   %0                      \n\t"
  361. -        "1:                             \n\t"
  362. -        "movd   (%1), %%mm0             \n\t"
  363. -        "add    %4, %1                  \n\t"
  364. -        "movd   (%1), %%mm1             \n\t"
  365. -        "add    %4, %1                  \n\t"
  366. -        PAVGB" (%2), %%mm0              \n\t"
  367. -        PAVGB" 4(%2), %%mm1             \n\t"
  368. -        PAVGB" (%3), %%mm0              \n\t"
  369. -        "movd   %%mm0, (%3)             \n\t"
  370. -        "add    %5, %3                  \n\t"
  371. -        PAVGB" (%3), %%mm1              \n\t"
  372. -        "movd   %%mm1, (%3)             \n\t"
  373. -        "add    %5, %3                  \n\t"
  374. -        "movd   (%1), %%mm0             \n\t"
  375. -        "add    %4, %1                  \n\t"
  376. -        "movd   (%1), %%mm1             \n\t"
  377. -        "add    %4, %1                  \n\t"
  378. -        PAVGB" 8(%2), %%mm0             \n\t"
  379. -        PAVGB" 12(%2), %%mm1            \n\t"
  380. -        PAVGB" (%3), %%mm0              \n\t"
  381. -        "movd   %%mm0, (%3)             \n\t"
  382. -        "add    %5, %3                  \n\t"
  383. -        PAVGB" (%3), %%mm1              \n\t"
  384. -        "movd   %%mm1, (%3)             \n\t"
  385. -        "add    %5, %3                  \n\t"
  386. -        "add    $16, %2                 \n\t"
  387. -        "subl   $4, %0                  \n\t"
  388. -        "jnz    1b                      \n\t"
  389. -#if !HAVE_EBX_AVAILABLE //Note "+bm" and "+mb" are buggy too (with gcc 3.2.2 at least) and cannot be used
  390. -        :"+m"(h), "+a"(src1), "+c"(src2), "+d"(dst)
  391. -#else
  392. -        :"+b"(h), "+a"(src1), "+c"(src2), "+d"(dst)
  393. -#endif
  394. -        :"S"((x86_reg)src1Stride), "D"((x86_reg)dstStride)
  395. -        :"memory");
  396. -}
  397. -
  398. -
  399.  static void DEF(avg_pixels8_l2)(uint8_t *dst, uint8_t *src1, uint8_t *src2, int dstStride, int src1Stride, int h)
  400.  {
  401.      __asm__ volatile(
  402. @@ -872,31 +769,6 @@ static void DEF(avg_pixels8_xy2)(uint8_t *block, const uint8_t *pixels, int line
  403.          :"%"REG_a,  "memory");
  404.  }
  405.  
  406. -static void DEF(avg_pixels4)(uint8_t *block, const uint8_t *pixels, int line_size, int h)
  407. -{
  408. -    do {
  409. -        __asm__ volatile(
  410. -            "movd (%1), %%mm0               \n\t"
  411. -            "movd (%1, %2), %%mm1           \n\t"
  412. -            "movd (%1, %2, 2), %%mm2        \n\t"
  413. -            "movd (%1, %3), %%mm3           \n\t"
  414. -            PAVGB" (%0), %%mm0              \n\t"
  415. -            PAVGB" (%0, %2), %%mm1          \n\t"
  416. -            PAVGB" (%0, %2, 2), %%mm2       \n\t"
  417. -            PAVGB" (%0, %3), %%mm3          \n\t"
  418. -            "movd %%mm0, (%1)               \n\t"
  419. -            "movd %%mm1, (%1, %2)           \n\t"
  420. -            "movd %%mm2, (%1, %2, 2)        \n\t"
  421. -            "movd %%mm3, (%1, %3)           \n\t"
  422. -            ::"S"(pixels), "D"(block),
  423. -             "r" ((x86_reg)line_size), "r"((x86_reg)3L*line_size)
  424. -            :"memory");
  425. -        block += 4*line_size;
  426. -        pixels += 4*line_size;
  427. -        h -= 4;
  428. -    } while(h > 0);
  429. -}
  430. -
  431.  //FIXME the following could be optimized too ...
  432.  static void DEF(put_no_rnd_pixels16_x2)(uint8_t *block, const uint8_t *pixels, int line_size, int h){
  433.      DEF(put_no_rnd_pixels8_x2)(block  , pixels  , line_size, h);
  434. diff --git a/libavcodec/x86/h264_qpel.asm b/libavcodec/x86/h264_qpel.asm
  435. new file mode 100644
  436. index 0000000..4fa7c64
  437. --- /dev/null
  438. +++ b/libavcodec/x86/h264_qpel.asm
  439. @@ -0,0 +1,812 @@
  440. +;*****************************************************************************
  441. +;* MMX/SSE2/AVX-optimized 10-bit H.264 qpel code
  442. +;*****************************************************************************
  443. +;* Copyright (C) 2011 Daniel Kang
  444. +;*
  445. +;* Authors: Daniel Kang <daniel.d.kang@gmail.com>
  446. +;*
  447. +;* This file is part of Libav.
  448. +;*
  449. +;* Libav is free software; you can redistribute it and/or
  450. +;* modify it under the terms of the GNU Lesser General Public
  451. +;* License as published by the Free Software Foundation; either
  452. +;* version 2.1 of the License, or (at your option) any later version.
  453. +;*
  454. +;* Libav is distributed in the hope that it will be useful,
  455. +;* but WITHOUT ANY WARRANTY; without even the implied warranty of
  456. +;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  457. +;* Lesser General Public License for more details.
  458. +;*
  459. +;* You should have received a copy of the GNU Lesser General Public
  460. +;* License along with Libav; if not, write to the Free Software
  461. +;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  462. +;******************************************************************************
  463. +
  464. +%include "x86inc.asm"
  465. +%include "x86util.asm"
  466. +
  467. +SECTION_RODATA 32
  468. +
  469. +cextern pw_16
  470. +cextern pw_5
  471. +cextern pb_0
  472. +
  473. +SECTION .text
  474. +
  475. +%macro AVG_MOV 2
  476. +; In the internal 16x16 calls, the pointer is incremented by 8 bytes.
  477. +; This breaks 16-byte alignment, so movement to mmx is required.
  478. +; Is there a way around this?
  479. +%if mmsize == 16
  480. +    movdq2q mm0, %2
  481. +    pavgb   mm0, %1
  482. +    movq     %1, mm0
  483. +%else
  484. +    pavgb    %2, %1
  485. +    MOV_OP   %1, %2
  486. +%endif
  487. +%endmacro
  488. +
  489. +%macro MC 1
  490. +%define OP_MOV movh
  491. +INIT_MMX
  492. +%1 mmxext, put, 4
  493. +INIT_XMM
  494. +%1 sse2  , put, 8
  495. +
  496. +%define OP_MOV AVG_MOV
  497. +INIT_MMX
  498. +%1 mmxext, avg, 4
  499. +INIT_XMM
  500. +%1 sse2  , avg, 8
  501. +%endmacro
  502. +
  503. +%macro MCAxA 9
  504. +%ifdef ARCH_X86_64
  505. +%ifnidn %1,mmxext
  506. +MCAxA_OP %1,%2,%3,%4,%5,%6,%7,%8,%9
  507. +%endif
  508. +%else
  509. +MCAxA_OP %1,%2,%3,%4,%5,%6,%7,%8,%9
  510. +%endif
  511. +%endmacro
  512. +
  513. +%macro MCAxA_OP 9
  514. +cglobal %2_h264_qpel%5_%3_%1, %6,%7,%8
  515. +%ifdef ARCH_X86_32
  516. +    mov r3d, %4*2
  517. +    call stub_%2_h264_qpel%4_%3_%1.skip_prologue
  518. +    mov  r0, r0m
  519. +    mov  r1, r1m
  520. +    add  r0, %4
  521. +    add  r1, %4
  522. +    mov r3d, %4*2
  523. +    call stub_%2_h264_qpel%4_%3_%1.skip_prologue
  524. +%if %9
  525. +    mov  r0, r0m
  526. +    mov  r1, r1m
  527. +    lea  r0, [r0+r2*%4]
  528. +    lea  r1, [r1+r2*%4]
  529. +    call stub_%2_h264_qpel%4_%3_%1.skip_prologue
  530. +    mov  r0, r0m
  531. +    mov  r1, r1m
  532. +    lea  r0, [r0+r2*%4+%4]
  533. +    lea  r1, [r1+r2*%4+%4]
  534. +    call stub_%2_h264_qpel%4_%3_%1.skip_prologue
  535. +%endif
  536. +    RET
  537. +%else ; ARCH_X86_64
  538. +    mov r10, r0
  539. +    mov r11, r1
  540. +    mov r3d, %4*2
  541. +    call stub_%2_h264_qpel%4_%3_%1.skip_prologue
  542. +    lea  r0, [r10+%4]
  543. +    lea  r1, [r11+%4]
  544. +    mov r3d, %4*2
  545. +%if %9
  546. +    call stub_%2_h264_qpel%4_%3_%1.skip_prologue
  547. +    lea  r0, [r10+r2*%4]
  548. +    lea  r1, [r11+r2*%4]
  549. +    call stub_%2_h264_qpel%4_%3_%1.skip_prologue
  550. +    lea  r0, [r10+r2*%4+%4]
  551. +    lea  r1, [r11+r2*%4+%4]
  552. +%endif ; %9
  553. +%ifndef UNIX64 ; fall through to function
  554. +    call stub_%2_h264_qpel%4_%3_%1.skip_prologue
  555. +    RET
  556. +%endif ; UNIX64
  557. +%endif ; ARCH
  558. +%endmacro
  559. +
  560. +;cpu, put/avg, mc, 4/8, cglobal args, call 2x or 4x
  561. +%macro cglobal_mc 7-8 1
  562. +%assign i %4*2
  563. +MCAxA %1, %2, %3, %4, i, %5,%6,%7, %8
  564. +
  565. +cglobal %2_h264_qpel%4_%3_%1, %5,%6,%7
  566. +%ifndef UNIX64 ; no prologue or epilogue for UNIX64
  567. +    call stub_%2_h264_qpel%4_%3_%1
  568. +    RET
  569. +%endif
  570. +
  571. +stub_%2_h264_qpel%4_%3_%1:
  572. +%endmacro
  573. +
  574. +;-----------------------------------------------------------------------------
  575. +; void h264_qpel_mc00(uint8_t *dst, uint8_t *src, int stride)
  576. +;-----------------------------------------------------------------------------
  577. +%macro COPY4 1
  578. +    %1            m0, [r1     ]
  579. +    OP_MOV [r0     ], m0
  580. +    %1            m0, [r1+r2  ]
  581. +    OP_MOV [r0+r2  ], m0
  582. +    %1            m0, [r1+r2*2]
  583. +    OP_MOV [r0+r2*2], m0
  584. +    %1            m0, [r1+r3  ]
  585. +    OP_MOV [r0+r3  ], m0
  586. +%endmacro
  587. +
  588. +%macro MC00 1
  589. +INIT_MMX
  590. +%define MOV_OP movh
  591. +cglobal %1_h264_qpel4_mc00_mmxext,3,4
  592. +    lea   r3, [r2*3   ]
  593. +    COPY4 movh
  594. +    RET
  595. +
  596. +%define MOV_OP mova
  597. +cglobal %1_h264_qpel8_mc00_mmxext,3,4
  598. +    lea   r3, [r2*3   ]
  599. +    COPY4 movu
  600. +    lea   r0, [r0+r2*4]
  601. +    lea   r1, [r1+r2*4]
  602. +    COPY4 movu
  603. +    RET
  604. +
  605. +INIT_XMM
  606. +cglobal %1_h264_qpel16_mc00_sse2,3,5
  607. +    lea   r3, [r2*3   ]
  608. +    mov  r4d, 4
  609. +.loop:
  610. +    COPY4 movu
  611. +    lea   r0, [r0+r2*4]
  612. +    lea   r1, [r1+r2*4]
  613. +    dec  r4d
  614. +    jg .loop
  615. +    REP_RET
  616. +%endmacro
  617. +
  618. +%macro AVG_MOV_MC00 2
  619. +; See AVG_MOV above why this is necessary -- any way around it?
  620. +    pavgb    %2, %1
  621. +    MOV_OP   %1, %2
  622. +%endmacro
  623. +
  624. +INIT_MMX
  625. +%define OP_MOV MOV_OP
  626. +MC00 put
  627. +
  628. +INIT_MMX
  629. +%define OP_MOV AVG_MOV_MC00
  630. +MC00 avg
  631. +
  632. +%define MOV_OP movh ; After mc00, it should be movh
  633. +
  634. +;-----------------------------------------------------------------------------
  635. +; void h264_qpel_mc20(uint8_t *dst, uint8_t *src, int stride)
  636. +;-----------------------------------------------------------------------------
  637. +%macro MC20 3
  638. +cglobal_mc %1, %2, mc20, %3, 3,4,8, 0
  639. +    mov      r3d, %3
  640. +.skip_prologue:
  641. +    pxor      m7, m7
  642. +    mova      m4, [pw_5]
  643. +    mova      m5, [pw_16]
  644. +.nextrow:
  645. +    movh      m1, [r1-1]
  646. +    movh      m2, [r1+0]
  647. +    movh      m3, [r1+1]
  648. +    movh      m0, [r1+2]
  649. +    punpcklbw m1, m7
  650. +    punpcklbw m2, m7
  651. +    punpcklbw m3, m7
  652. +    punpcklbw m0, m7
  653. +    paddw     m1, m0
  654. +    paddw     m2, m3
  655. +    movh      m0, [r1-2]
  656. +    movh      m3, [r1+3]
  657. +    punpcklbw m0, m7
  658. +    punpcklbw m3, m7
  659. +    paddw     m0, m3
  660. +    psllw     m2, 2
  661. +    psubw     m2, m1
  662. +    pmullw    m2, m4
  663. +    paddw     m0, m5
  664. +    paddw     m0, m2
  665. +    psraw     m0, 5
  666. +    packuswb  m0, m0
  667. +    OP_MOV  [r0], m0
  668. +    add       r0, r2
  669. +    add       r1, r2
  670. +    dec      r3d
  671. +    jg .nextrow
  672. +    rep ret
  673. +%endmacro
  674. +
  675. +MC MC20
  676. +
  677. +;-----------------------------------------------------------------------------
  678. +; void h264_qpel_mc30(uint8_t *dst, uint8_t *src, int stride)
  679. +;-----------------------------------------------------------------------------
  680. +%macro MC30 3
  681. +cglobal_mc %1, %2, mc30, %3, 3,5,8, 0
  682. +    mov      r3d, %3
  683. +.skip_prologue:
  684. +    lea r4, [r1+1]
  685. +    jmp stub_%2_h264_qpel%3_mc10_%1.body
  686. +%endmacro
  687. +
  688. +MC MC30
  689. +
  690. +;-----------------------------------------------------------------------------
  691. +; void h264_qpel_mc10(uint8_t *dst, uint8_t *src, int stride)
  692. +;-----------------------------------------------------------------------------
  693. +%macro MC10 3
  694. +cglobal_mc %1, %2, mc10, %3, 3,5,8, 0
  695. +    mov      r3d, %3
  696. +.skip_prologue:
  697. +    mov       r4, r1
  698. +.body:
  699. +    pxor      m7, m7
  700. +    mova      m4, [pw_5]
  701. +    mova      m5, [pw_16]
  702. +.nextrow:
  703. +    movh      m1, [r1-1]
  704. +    movh      m2, [r1+0]
  705. +    movh      m3, [r1+1]
  706. +    movh      m0, [r1+2]
  707. +    punpcklbw m1, m7
  708. +    punpcklbw m2, m7
  709. +    punpcklbw m3, m7
  710. +    punpcklbw m0, m7
  711. +    paddw     m1, m0
  712. +    paddw     m2, m3
  713. +    movh      m0, [r1-2]
  714. +    movh      m3, [r1+3]
  715. +    punpcklbw m0, m7
  716. +    punpcklbw m3, m7
  717. +    paddw     m0, m3
  718. +    psllw     m2, 2
  719. +    psubw     m2, m1
  720. +    pmullw    m2, m4
  721. +    paddw     m0, m5
  722. +    paddw     m0, m2
  723. +    psraw     m0, 5
  724. +    packuswb  m0, m0
  725. +    movh      m3, [r4]
  726. +    pavgb     m0, m3
  727. +    OP_MOV  [r0], m0
  728. +    add       r0, r2
  729. +    add       r1, r2
  730. +    add       r4, r2
  731. +    dec      r3d
  732. +    jg .nextrow
  733. +    rep ret
  734. +%endmacro
  735. +
  736. +MC MC10
  737. +
  738. +;-----------------------------------------------------------------------------
  739. +; void h264_qpel_mc02(uint8_t *dst, uint8_t *src, int stride)
  740. +;-----------------------------------------------------------------------------
  741. +%macro V_FILT 3
  742. +v_filt%1_%2_%3:
  743. +    add    r4, r2
  744. +.no_addr4:
  745. +    mova       m6, m2
  746. +    movh       m5, [r1]
  747. +    paddw      m6, m3
  748. +    psllw      m6, 2
  749. +    psubw      m6, m1
  750. +    psubw      m6, m4
  751. +    punpcklbw  m5, m7
  752. +    pmullw     m6, [pw_5]
  753. +    paddw      m0, [pw_16]
  754. +    paddw      m0, m5
  755. +    paddw      m0, m6
  756. +    psraw      m0, 5
  757. +    packuswb   m0, m0
  758. +    add    r1, r2
  759. +    add    r0, r2
  760. +    ret
  761. +%endmacro
  762. +
  763. +INIT_MMX
  764. +RESET_MM_PERMUTATION
  765. +%assign i 0
  766. +%rep 4
  767. +V_FILT 4, i, mmxext
  768. +SWAP 0,1,2,3,4,5
  769. +%assign i i+1
  770. +%endrep
  771. +
  772. +INIT_XMM
  773. +RESET_MM_PERMUTATION
  774. +%assign i 0
  775. +%rep 6
  776. +V_FILT 8, i, sse2
  777. +SWAP 0,1,2,3,4,5
  778. +%assign i i+1
  779. +%endrep
  780. +
  781. +%macro PRELOAD_V 0
  782. +    pxor      m7, m7
  783. +    lea       r3, [r2*3]
  784. +    sub       r1, r3
  785. +    movh      m0, [r1+r2]
  786. +    movh      m1, [r1+r2*2]
  787. +    add       r1, r3
  788. +    movu      m2, [r1]
  789. +    movu      m3, [r1+r2]
  790. +    movu      m4, [r1+r2*2]
  791. +    add       r1, r3
  792. +    punpcklbw m0, m7
  793. +    punpcklbw m1, m7
  794. +    punpcklbw m2, m7
  795. +    punpcklbw m3, m7
  796. +    punpcklbw m4, m7
  797. +%endmacro
  798. +
  799. +%macro MC02 3
  800. +cglobal_mc %1, %2, mc02, %3, 3,4,8
  801. +.skip_prologue:
  802. +    PRELOAD_V
  803. +
  804. +    sub      r0, r2
  805. +%assign j 0
  806. +%rep %3
  807. +    %assign i (j % 6)
  808. +    call v_filt%3_ %+ i %+ _%1.no_addr4
  809. +    OP_MOV [r0], m0
  810. +    SWAP 0,1,2,3,4,5
  811. +    %assign j j+1
  812. +%endrep
  813. +    ret
  814. +%endmacro
  815. +
  816. +MC MC02
  817. +
  818. +;-----------------------------------------------------------------------------
  819. +; void h264_qpel_mc01(uint8_t *dst, uint8_t *src, int stride)
  820. +;-----------------------------------------------------------------------------
  821. +%macro MC01 3
  822. +cglobal_mc %1, %2, mc01, %3, 3,5,8
  823. +.skip_prologue:
  824. +    mov      r4, r1
  825. +.body:
  826. +    PRELOAD_V
  827. +
  828. +    sub      r4, r2
  829. +    sub      r0, r2
  830. +%assign j 0
  831. +%rep %3
  832. +    %assign i (j % 6)
  833. +    call v_filt%3_ %+ i %+ _%1
  834. +    movu     m6, [r4]
  835. +    pavgb    m0, m6
  836. +    OP_MOV [r0], m0
  837. +    SWAP 0,1,2,3,4,5
  838. +    %assign j j+1
  839. +%endrep
  840. +    ret
  841. +%endmacro
  842. +
  843. +MC MC01
  844. +
  845. +;-----------------------------------------------------------------------------
  846. +; void h264_qpel_mc03(uint8_t *dst, uint8_t *src, int stride)
  847. +;-----------------------------------------------------------------------------
  848. +%macro MC03 3
  849. +cglobal_mc %1, %2, mc03, %3, 3,5,8
  850. +.skip_prologue:
  851. +    lea r4, [r1+r2]
  852. +    jmp stub_%2_h264_qpel%3_mc01_%1.body
  853. +%endmacro
  854. +
  855. +MC MC03
  856. +
  857. +;-----------------------------------------------------------------------------
  858. +; void h264_qpel_mc11(uint8_t *dst, uint8_t *src, int stride)
  859. +;-----------------------------------------------------------------------------
  860. +%macro H_FILT_AVG 3-4
  861. +h_filt%2_%3_%1:
  862. +;FILT_H with fewer registers and averaged with the FILT_V result
  863. +;m6,m7 are tmp registers, m0 is the FILT_V result, the rest are to be used next in the next iteration
  864. +;unfortunately I need three registers, so m5 will have to be re-read from memory
  865. +    movh      m6, [r4-1]
  866. +    movh      m5, [r4+2]
  867. +    punpcklbw m6, m7 ; still 0
  868. +    punpcklbw m5, m7
  869. +    paddw     m6, m5
  870. +    movh      m5, [r4+0]
  871. +    movh      m7, [r4+1]
  872. +    punpcklbw m5, [pb_0]
  873. +    punpcklbw m7, [pb_0]
  874. +    paddw     m7, m5
  875. +    psllw     m7, 2
  876. +    psubw     m7, m6
  877. +    pmullw    m7, [pw_5]
  878. +    movh      m5, [r4-2]
  879. +    movh      m6, [r4+3]
  880. +    punpcklbw m5, [pb_0]
  881. +    punpcklbw m6, [pb_0]
  882. +    paddw     m5, m6
  883. +    paddw     m5, [pw_16]
  884. +    paddw     m5, m7
  885. +    psraw     m5, 5
  886. +    packuswb  m5, m5
  887. +;avg FILT_V, FILT_H
  888. +    pavgb     m0, m5
  889. +%if %0!=4
  890. +    movh      m5, [r1+r5]
  891. +    punpcklbw m5, [pb_0]
  892. +%endif
  893. +    ret
  894. +%endmacro
  895. +
  896. +INIT_MMX
  897. +RESET_MM_PERMUTATION
  898. +%assign i 0
  899. +%rep 3
  900. +H_FILT_AVG mmxext, 4, i
  901. +SWAP 0,1,2,3,4,5
  902. +%assign i i+1
  903. +%endrep
  904. +H_FILT_AVG mmxext, 4, i, 0
  905. +
  906. +INIT_XMM
  907. +RESET_MM_PERMUTATION
  908. +%assign i 0
  909. +%rep 6
  910. +%if i==1
  911. +H_FILT_AVG sse2,   8, i, 0
  912. +%else
  913. +H_FILT_AVG sse2,   8, i
  914. +%endif
  915. +SWAP 0,1,2,3,4,5
  916. +%assign i i+1
  917. +%endrep
  918. +
  919. +%macro MC11 3
  920. +; this REALLY needs x86_64
  921. +cglobal_mc %1, %2, mc11, %3, 3,6,8
  922. +.skip_prologue:
  923. +    mov      r4, r1
  924. +.body:
  925. +    PRELOAD_V
  926. +
  927. +    sub      r0, r2
  928. +    sub      r4, r2
  929. +    mov      r5, r2
  930. +    neg      r5
  931. +%assign j 0
  932. +%rep %3
  933. +    %assign i (j % 6)
  934. +    call v_filt%3_ %+ i %+ _%1
  935. +    call h_filt%3_ %+ i %+ _%1
  936. +    pxor m7, m7
  937. +%if %3==8 && i==1
  938. +    movh      m5, [r1+r5]
  939. +    punpcklbw m5, m7
  940. +%endif
  941. +    OP_MOV [r0], m0
  942. +    SWAP 0,1,2,3,4,5
  943. +    %assign j j+1
  944. +%endrep
  945. +    ret
  946. +%endmacro
  947. +
  948. +MC MC11
  949. +
  950. +;-----------------------------------------------------------------------------
  951. +; void h264_qpel_mc31(uint8_t *dst, uint8_t *src, int stride)
  952. +;-----------------------------------------------------------------------------
  953. +%macro MC31 3
  954. +cglobal_mc %1, %2, mc31, %3, 3,6,8
  955. +.skip_prologue:
  956. +    mov r4, r1
  957. +    add r1, 1
  958. +    jmp stub_%2_h264_qpel%3_mc11_%1.body
  959. +%endmacro
  960. +
  961. +MC MC31
  962. +
  963. +;-----------------------------------------------------------------------------
  964. +; void h264_qpel_mc13(uint8_t *dst, uint8_t *src, int stride)
  965. +;-----------------------------------------------------------------------------
  966. +%macro MC13 3
  967. +cglobal_mc %1, %2, mc13, %3, 3,6,8
  968. +.skip_prologue:
  969. +    lea r4, [r1+r2]
  970. +    jmp stub_%2_h264_qpel%3_mc11_%1.body
  971. +%endmacro
  972. +
  973. +MC MC13
  974. +
  975. +;-----------------------------------------------------------------------------
  976. +; void h264_qpel_mc33(uint8_t *dst, uint8_t *src, int stride)
  977. +;-----------------------------------------------------------------------------
  978. +%macro MC33 3
  979. +cglobal_mc %1, %2, mc33, %3, 3,6,8
  980. +.skip_prologue:
  981. +    lea r4, [r1+r2]
  982. +    add r1, 1
  983. +    jmp stub_%2_h264_qpel%3_mc11_%1.body
  984. +%endmacro
  985. +
  986. +MC MC33
  987. +
  988. +;-----------------------------------------------------------------------------
  989. +; void h264_qpel_mc22(uint8_t *dst, uint8_t *src, int stride)
  990. +;-----------------------------------------------------------------------------
  991. +%macro FILT_VNRD 0
  992. +    movh      m5, [r1]
  993. +    punpcklbw m5, m7
  994. +    paddw     m0, m5 ; -2,+3
  995. +    paddw     m6, m1, m4 ; -1,+2
  996. +    paddw     m7, m2, m3 ; +0,+1
  997. +    psllw     m7, 2
  998. +    paddw     m0, [pw_16]
  999. +    psubw     m7, m6
  1000. +    pmullw    m7, [pw_5]
  1001. +    paddw     m0, m7
  1002. +    pxor      m7, m7
  1003. +%endmacro
  1004. +
  1005. +%macro HV 2
  1006. +%ifidn %1,sse2
  1007. +%define PAD 12
  1008. +%define COUNT 2
  1009. +%else
  1010. +%define PAD 0
  1011. +%define COUNT 3
  1012. +%endif
  1013. +put_hv%2_%1:
  1014. +    neg       r2           ; This actually saves instructions
  1015. +    lea       r1, [r1+r2*2-(mmsize-PAD)/2]
  1016. +    lea       r4, [rsp+PAD+gprsize]
  1017. +    mov      r3d, COUNT
  1018. +    pxor      m7, m7
  1019. +.v_loop:
  1020. +    movh      m0, [r1]
  1021. +    punpcklbw m0, m7
  1022. +    sub       r1, r2
  1023. +    movh      m1, [r1]
  1024. +    punpcklbw m1, m7
  1025. +    sub       r1, r2
  1026. +    movh      m2, [r1]
  1027. +    punpcklbw m2, m7
  1028. +    sub       r1, r2
  1029. +    movh      m3, [r1]
  1030. +    punpcklbw m3, m7
  1031. +    sub       r1, r2
  1032. +    movh      m4, [r1]
  1033. +    punpcklbw m4, m7
  1034. +    sub       r1, r2
  1035. +%assign i 0
  1036. +%rep %2-1
  1037. +    FILT_VNRD
  1038. +    movu     [r4+i*mmsize*3], m0
  1039. +    sub      r1, r2
  1040. +    SWAP 0,1,2,3,4,5
  1041. +%assign i i+1
  1042. +%endrep
  1043. +    FILT_VNRD
  1044. +    movu     [r4+i*mmsize*3], m0
  1045. +    add      r4, mmsize
  1046. +    lea      r1, [r1+r2*8+mmsize/2]
  1047. +%if %2==8
  1048. +    lea      r1, [r1+r2*4]
  1049. +%endif
  1050. +    dec      r3d
  1051. +    jg .v_loop
  1052. +    neg      r2
  1053. +    ret
  1054. +%endmacro
  1055. +
  1056. +INIT_MMX
  1057. +HV mmxext, 4
  1058. +INIT_XMM
  1059. +HV sse2  , 8
  1060. +
  1061. +%macro H_LOOP 2
  1062. +h%2_loop_op_%1:
  1063. +    movu       m1, [r1+mmsize-4]
  1064. +    movu       m2, [r1+mmsize-2]
  1065. +    mova       m3, [r1+mmsize+0]
  1066. +    movu       m4, [r1+mmsize+2]
  1067. +    movu       m5, [r1+mmsize+4]
  1068. +    movu       m6, [r1+mmsize+6]
  1069. +    paddw      m3, m4
  1070. +    paddw      m2, m5
  1071. +    paddw      m1, m6
  1072. +    psubw      m1, m2
  1073. +    psraw      m1, 2
  1074. +    psubw      m1, m2
  1075. +    paddsw     m1, m3
  1076. +    psraw      m1, 2
  1077. +    paddw      m1, m3
  1078. +    psraw      m1, 6
  1079. +    packuswb   m1, m1
  1080. +    add        r1, mmsize*3
  1081. +    ret
  1082. +%endmacro
  1083. +
  1084. +INIT_MMX
  1085. +H_LOOP mmxext, 4
  1086. +INIT_XMM
  1087. +H_LOOP sse2  , 8
  1088. +
  1089. +%macro MC22 3
  1090. +cglobal_mc %1, %2, mc22, %3, 3,7,8
  1091. +%define PAD mmsize*16*4       ; SIZE*16*4 -- so 8xX can be called only twice in 16x16
  1092. +.skip_prologue:
  1093. +    mov      r6, rsp          ; backup stack pointer
  1094. +    and     rsp, ~(mmsize-1)  ; align stack
  1095. +    sub     rsp, PAD
  1096. +
  1097. +    call put_hv%3_%1
  1098. +
  1099. +    mova       m0, [pw_5]
  1100. +    mova       m7, [pw_16]
  1101. +    mov       r3d, %3
  1102. +    mov        r1, rsp
  1103. +.h_loop:
  1104. +    call h%3_loop_op_%1
  1105. +
  1106. +    OP_MOV   [r0], m1
  1107. +    add        r0, r2
  1108. +    dec       r3d
  1109. +    jg .h_loop
  1110. +
  1111. +    mov     rsp, r6          ; restore stack pointer
  1112. +    ret
  1113. +%endmacro
  1114. +
  1115. +MC MC22
  1116. +
  1117. +;-----------------------------------------------------------------------------
  1118. +; void h264_qpel_mc12(uint8_t *dst, uint8_t *src, int stride)
  1119. +;-----------------------------------------------------------------------------
  1120. +%macro MC12 3
  1121. +cglobal_mc %1, %2, mc12, %3, 3,7,8
  1122. +%define PAD mmsize*16*4         ; SIZE*16*4*sizeof(pixel)
  1123. +.skip_prologue:
  1124. +    mov        r6, rsp          ; backup stack pointer
  1125. +    and       rsp, ~(mmsize-1)  ; align stack
  1126. +    sub       rsp, PAD
  1127. +
  1128. +    call put_hv%3_%1
  1129. +
  1130. +    xor       r4d, r4d
  1131. +.body
  1132. +    mov       r3d, %3
  1133. +    mova       m0, [pw_5]
  1134. +    mova       m7, [pw_16]
  1135. +    mov        r1, rsp
  1136. +.h_loop:
  1137. +    call h%3_loop_op_%1
  1138. +
  1139. +    movu       m3, [r1+r4-2*mmsize] ; movu needed for mc32, etc
  1140. +    psraw      m3, 5
  1141. +    packuswb   m3, m3
  1142. +    pavgb      m1, m3
  1143. +
  1144. +    OP_MOV   [r0], m1
  1145. +    add        r0, r2
  1146. +    dec       r3d
  1147. +    jg .h_loop
  1148. +
  1149. +    mov     rsp, r6          ; restore stack pointer
  1150. +    ret
  1151. +%endmacro
  1152. +
  1153. +MC MC12
  1154. +
  1155. +;-----------------------------------------------------------------------------
  1156. +; void h264_qpel_mc32(uint8_t *dst, uint8_t *src, int stride)
  1157. +;-----------------------------------------------------------------------------
  1158. +%macro MC32 3
  1159. +cglobal_mc %1, %2, mc32, %3, 3,7,8
  1160. +%define PAD mmsize*16*4   ; SIZE*16*4*sizeof(pixel)
  1161. +.skip_prologue:
  1162. +    mov  r6, rsp          ; backup stack pointer
  1163. +    and rsp, ~(mmsize-1)  ; align stack
  1164. +    sub rsp, PAD
  1165. +
  1166. +    call put_hv%3_%1
  1167. +
  1168. +    mov r4d, 2            ; sizeof(pixel)
  1169. +    jmp stub_%2_h264_qpel%3_mc12_%1.body
  1170. +%endmacro
  1171. +
  1172. +MC MC32
  1173. +
  1174. +;-----------------------------------------------------------------------------
  1175. +; void h264_qpel_mc21(uint8_t *dst, uint8_t *src, int stride)
  1176. +;-----------------------------------------------------------------------------
  1177. +%macro H_NRD 2
  1178. +put_h%2_%1:
  1179. +    add       rsp, gprsize
  1180. +    mov       r3d, %2
  1181. +    xor       r4d, r4d
  1182. +   pxor       m7, m7
  1183. +   mova       m4, [pw_5]
  1184. +   mova       m5, [pw_16]
  1185. +.nextrow
  1186. +    movh       m1, [r5-1]
  1187. +    movh       m2, [r5+0]
  1188. +    movh       m3, [r5+1]
  1189. +    movh       m0, [r5+2]
  1190. +    punpcklbw  m1, m7
  1191. +    punpcklbw  m2, m7
  1192. +    punpcklbw  m3, m7
  1193. +    punpcklbw  m0, m7
  1194. +    paddw      m1, m0
  1195. +    paddw      m2, m3
  1196. +    movh       m0, [r5-2]
  1197. +    movh       m3, [r5+3]
  1198. +    punpcklbw  m0, m7
  1199. +    punpcklbw  m3, m7
  1200. +    paddw      m0, m3
  1201. +    psllw      m2, 2
  1202. +    psubw      m2, m1
  1203. +    pmullw     m2, m4
  1204. +    paddw      m0, m5
  1205. +    paddw      m2, m0
  1206. +    mova [rsp+r4], m2
  1207. +    add       r4d, mmsize*3
  1208. +    add        r5, r2
  1209. +    dec       r3d
  1210. +    jg .nextrow
  1211. +    sub       rsp, gprsize
  1212. +    ret
  1213. +%endmacro
  1214. +
  1215. +INIT_MMX
  1216. +H_NRD mmxext, 4
  1217. +INIT_XMM
  1218. +H_NRD sse2  , 8
  1219. +
  1220. +%macro MC21 3
  1221. +cglobal_mc %1, %2, mc21, %3, 3,7,8
  1222. +.skip_prologue:
  1223. +    mov   r5, r1
  1224. +.body
  1225. +%define PAD mmsize*16*4    ; SIZE*16*4*sizeof(pixel)
  1226. +    mov   r6, rsp          ; backup stack pointer
  1227. +    and  rsp, ~(mmsize-1)  ; align stack
  1228. +
  1229. +    sub  rsp, PAD
  1230. +    call put_h%3_%1
  1231. +
  1232. +    sub  rsp, PAD
  1233. +    call put_hv%3_%1
  1234. +
  1235. +    mov r4d, PAD-mmsize    ; H buffer
  1236. +    jmp stub_%2_h264_qpel%3_mc12_%1.body
  1237. +%endmacro
  1238. +
  1239. +MC MC21
  1240. +
  1241. +;-----------------------------------------------------------------------------
  1242. +; void h264_qpel_mc23(uint8_t *dst, uint8_t *src, int stride)
  1243. +;-----------------------------------------------------------------------------
  1244. +%macro MC23 3
  1245. +cglobal_mc %1, %2, mc23, %3, 3,7,8
  1246. +.skip_prologue:
  1247. +    lea   r5, [r1+r2]
  1248. +    jmp stub_%2_h264_qpel%3_mc21_%1.body
  1249. +%endmacro
  1250. +
  1251. +MC MC23
  1252. diff --git a/libavcodec/x86/h264_qpel_mmx.c b/libavcodec/x86/h264_qpel_mmx.c
  1253. index b7a4183..23e6995 100644
  1254. --- a/libavcodec/x86/h264_qpel_mmx.c
  1255. +++ b/libavcodec/x86/h264_qpel_mmx.c
  1256. @@ -21,1191 +21,9 @@
  1257.  
  1258.  #include "dsputil_mmx.h"
  1259.  
  1260. -/***********************************/
  1261. -/* motion compensation */
  1262. -
  1263. -#define QPEL_H264V_MM(A,B,C,D,E,F,OP,T,Z,d,q)\
  1264. -        "mov"#q" "#C", "#T"         \n\t"\
  1265. -        "mov"#d" (%0), "#F"         \n\t"\
  1266. -        "paddw "#D", "#T"           \n\t"\
  1267. -        "psllw $2, "#T"             \n\t"\
  1268. -        "psubw "#B", "#T"           \n\t"\
  1269. -        "psubw "#E", "#T"           \n\t"\
  1270. -        "punpcklbw "#Z", "#F"       \n\t"\
  1271. -        "pmullw "MANGLE(ff_pw_5)", "#T"\n\t"\
  1272. -        "paddw "MANGLE(ff_pw_16)", "#A"\n\t"\
  1273. -        "add %2, %0                 \n\t"\
  1274. -        "paddw "#F", "#A"           \n\t"\
  1275. -        "paddw "#A", "#T"           \n\t"\
  1276. -        "psraw $5, "#T"             \n\t"\
  1277. -        "packuswb "#T", "#T"        \n\t"\
  1278. -        OP(T, (%1), A, d)\
  1279. -        "add %3, %1                 \n\t"
  1280. -
  1281. -#define QPEL_H264HV_MM(A,B,C,D,E,F,OF,T,Z,d,q)\
  1282. -        "mov"#q" "#C", "#T"         \n\t"\
  1283. -        "mov"#d" (%0), "#F"         \n\t"\
  1284. -        "paddw "#D", "#T"           \n\t"\
  1285. -        "psllw $2, "#T"             \n\t"\
  1286. -        "paddw "MANGLE(ff_pw_16)", "#A"\n\t"\
  1287. -        "psubw "#B", "#T"           \n\t"\
  1288. -        "psubw "#E", "#T"           \n\t"\
  1289. -        "punpcklbw "#Z", "#F"       \n\t"\
  1290. -        "pmullw "MANGLE(ff_pw_5)", "#T"\n\t"\
  1291. -        "paddw "#F", "#A"           \n\t"\
  1292. -        "add %2, %0                 \n\t"\
  1293. -        "paddw "#A", "#T"           \n\t"\
  1294. -        "mov"#q" "#T", "#OF"(%1)    \n\t"
  1295. -
  1296. -#define QPEL_H264V(A,B,C,D,E,F,OP) QPEL_H264V_MM(A,B,C,D,E,F,OP,%%mm6,%%mm7,d,q)
  1297. -#define QPEL_H264HV(A,B,C,D,E,F,OF) QPEL_H264HV_MM(A,B,C,D,E,F,OF,%%mm6,%%mm7,d,q)
  1298. -#define QPEL_H264V_XMM(A,B,C,D,E,F,OP) QPEL_H264V_MM(A,B,C,D,E,F,OP,%%xmm6,%%xmm7,q,dqa)
  1299. -#define QPEL_H264HV_XMM(A,B,C,D,E,F,OF) QPEL_H264HV_MM(A,B,C,D,E,F,OF,%%xmm6,%%xmm7,q,dqa)
  1300. -
  1301. -
  1302. -#define QPEL_H264(OPNAME, OP, MMX)\
  1303. -static av_noinline void OPNAME ## h264_qpel4_h_lowpass_ ## MMX(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
  1304. -    int h=4;\
  1305. -\
  1306. -    __asm__ volatile(\
  1307. -        "pxor %%mm7, %%mm7          \n\t"\
  1308. -        "movq "MANGLE(ff_pw_5) ", %%mm4\n\t"\
  1309. -        "movq "MANGLE(ff_pw_16)", %%mm5\n\t"\
  1310. -        "1:                         \n\t"\
  1311. -        "movd  -1(%0), %%mm1        \n\t"\
  1312. -        "movd    (%0), %%mm2        \n\t"\
  1313. -        "movd   1(%0), %%mm3        \n\t"\
  1314. -        "movd   2(%0), %%mm0        \n\t"\
  1315. -        "punpcklbw %%mm7, %%mm1     \n\t"\
  1316. -        "punpcklbw %%mm7, %%mm2     \n\t"\
  1317. -        "punpcklbw %%mm7, %%mm3     \n\t"\
  1318. -        "punpcklbw %%mm7, %%mm0     \n\t"\
  1319. -        "paddw %%mm0, %%mm1         \n\t"\
  1320. -        "paddw %%mm3, %%mm2         \n\t"\
  1321. -        "movd  -2(%0), %%mm0        \n\t"\
  1322. -        "movd   3(%0), %%mm3        \n\t"\
  1323. -        "punpcklbw %%mm7, %%mm0     \n\t"\
  1324. -        "punpcklbw %%mm7, %%mm3     \n\t"\
  1325. -        "paddw %%mm3, %%mm0         \n\t"\
  1326. -        "psllw $2, %%mm2            \n\t"\
  1327. -        "psubw %%mm1, %%mm2         \n\t"\
  1328. -        "pmullw %%mm4, %%mm2        \n\t"\
  1329. -        "paddw %%mm5, %%mm0         \n\t"\
  1330. -        "paddw %%mm2, %%mm0         \n\t"\
  1331. -        "psraw $5, %%mm0            \n\t"\
  1332. -        "packuswb %%mm0, %%mm0      \n\t"\
  1333. -        OP(%%mm0, (%1),%%mm6, d)\
  1334. -        "add %3, %0                 \n\t"\
  1335. -        "add %4, %1                 \n\t"\
  1336. -        "decl %2                    \n\t"\
  1337. -        " jnz 1b                    \n\t"\
  1338. -        : "+a"(src), "+c"(dst), "+g"(h)\
  1339. -        : "d"((x86_reg)srcStride), "S"((x86_reg)dstStride)\
  1340. -        : "memory"\
  1341. -    );\
  1342. -}\
  1343. -static av_noinline void OPNAME ## h264_qpel4_h_lowpass_l2_ ## MMX(uint8_t *dst, uint8_t *src, uint8_t *src2, int dstStride, int src2Stride){\
  1344. -    int h=4;\
  1345. -    __asm__ volatile(\
  1346. -        "pxor %%mm7, %%mm7          \n\t"\
  1347. -        "movq %0, %%mm4             \n\t"\
  1348. -        "movq %1, %%mm5             \n\t"\
  1349. -        :: "m"(ff_pw_5), "m"(ff_pw_16)\
  1350. -    );\
  1351. -    do{\
  1352. -    __asm__ volatile(\
  1353. -        "movd  -1(%0), %%mm1        \n\t"\
  1354. -        "movd    (%0), %%mm2        \n\t"\
  1355. -        "movd   1(%0), %%mm3        \n\t"\
  1356. -        "movd   2(%0), %%mm0        \n\t"\
  1357. -        "punpcklbw %%mm7, %%mm1     \n\t"\
  1358. -        "punpcklbw %%mm7, %%mm2     \n\t"\
  1359. -        "punpcklbw %%mm7, %%mm3     \n\t"\
  1360. -        "punpcklbw %%mm7, %%mm0     \n\t"\
  1361. -        "paddw %%mm0, %%mm1         \n\t"\
  1362. -        "paddw %%mm3, %%mm2         \n\t"\
  1363. -        "movd  -2(%0), %%mm0        \n\t"\
  1364. -        "movd   3(%0), %%mm3        \n\t"\
  1365. -        "punpcklbw %%mm7, %%mm0     \n\t"\
  1366. -        "punpcklbw %%mm7, %%mm3     \n\t"\
  1367. -        "paddw %%mm3, %%mm0         \n\t"\
  1368. -        "psllw $2, %%mm2            \n\t"\
  1369. -        "psubw %%mm1, %%mm2         \n\t"\
  1370. -        "pmullw %%mm4, %%mm2        \n\t"\
  1371. -        "paddw %%mm5, %%mm0         \n\t"\
  1372. -        "paddw %%mm2, %%mm0         \n\t"\
  1373. -        "movd   (%2), %%mm3         \n\t"\
  1374. -        "psraw $5, %%mm0            \n\t"\
  1375. -        "packuswb %%mm0, %%mm0      \n\t"\
  1376. -        PAVGB" %%mm3, %%mm0         \n\t"\
  1377. -        OP(%%mm0, (%1),%%mm6, d)\
  1378. -        "add %4, %0                 \n\t"\
  1379. -        "add %4, %1                 \n\t"\
  1380. -        "add %3, %2                 \n\t"\
  1381. -        : "+a"(src), "+c"(dst), "+d"(src2)\
  1382. -        : "D"((x86_reg)src2Stride), "S"((x86_reg)dstStride)\
  1383. -        : "memory"\
  1384. -    );\
  1385. -    }while(--h);\
  1386. -}\
  1387. -static av_noinline void OPNAME ## h264_qpel4_v_lowpass_ ## MMX(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
  1388. -    src -= 2*srcStride;\
  1389. -    __asm__ volatile(\
  1390. -        "pxor %%mm7, %%mm7          \n\t"\
  1391. -        "movd (%0), %%mm0           \n\t"\
  1392. -        "add %2, %0                 \n\t"\
  1393. -        "movd (%0), %%mm1           \n\t"\
  1394. -        "add %2, %0                 \n\t"\
  1395. -        "movd (%0), %%mm2           \n\t"\
  1396. -        "add %2, %0                 \n\t"\
  1397. -        "movd (%0), %%mm3           \n\t"\
  1398. -        "add %2, %0                 \n\t"\
  1399. -        "movd (%0), %%mm4           \n\t"\
  1400. -        "add %2, %0                 \n\t"\
  1401. -        "punpcklbw %%mm7, %%mm0     \n\t"\
  1402. -        "punpcklbw %%mm7, %%mm1     \n\t"\
  1403. -        "punpcklbw %%mm7, %%mm2     \n\t"\
  1404. -        "punpcklbw %%mm7, %%mm3     \n\t"\
  1405. -        "punpcklbw %%mm7, %%mm4     \n\t"\
  1406. -        QPEL_H264V(%%mm0, %%mm1, %%mm2, %%mm3, %%mm4, %%mm5, OP)\
  1407. -        QPEL_H264V(%%mm1, %%mm2, %%mm3, %%mm4, %%mm5, %%mm0, OP)\
  1408. -        QPEL_H264V(%%mm2, %%mm3, %%mm4, %%mm5, %%mm0, %%mm1, OP)\
  1409. -        QPEL_H264V(%%mm3, %%mm4, %%mm5, %%mm0, %%mm1, %%mm2, OP)\
  1410. -         \
  1411. -        : "+a"(src), "+c"(dst)\
  1412. -        : "S"((x86_reg)srcStride), "D"((x86_reg)dstStride), "m"(ff_pw_5), "m"(ff_pw_16)\
  1413. -        : "memory"\
  1414. -    );\
  1415. -}\
  1416. -static av_noinline void OPNAME ## h264_qpel4_hv_lowpass_ ## MMX(uint8_t *dst, int16_t *tmp, uint8_t *src, int dstStride, int tmpStride, int srcStride){\
  1417. -    int h=4;\
  1418. -    int w=3;\
  1419. -    src -= 2*srcStride+2;\
  1420. -    while(w--){\
  1421. -        __asm__ volatile(\
  1422. -            "pxor %%mm7, %%mm7      \n\t"\
  1423. -            "movd (%0), %%mm0       \n\t"\
  1424. -            "add %2, %0             \n\t"\
  1425. -            "movd (%0), %%mm1       \n\t"\
  1426. -            "add %2, %0             \n\t"\
  1427. -            "movd (%0), %%mm2       \n\t"\
  1428. -            "add %2, %0             \n\t"\
  1429. -            "movd (%0), %%mm3       \n\t"\
  1430. -            "add %2, %0             \n\t"\
  1431. -            "movd (%0), %%mm4       \n\t"\
  1432. -            "add %2, %0             \n\t"\
  1433. -            "punpcklbw %%mm7, %%mm0 \n\t"\
  1434. -            "punpcklbw %%mm7, %%mm1 \n\t"\
  1435. -            "punpcklbw %%mm7, %%mm2 \n\t"\
  1436. -            "punpcklbw %%mm7, %%mm3 \n\t"\
  1437. -            "punpcklbw %%mm7, %%mm4 \n\t"\
  1438. -            QPEL_H264HV(%%mm0, %%mm1, %%mm2, %%mm3, %%mm4, %%mm5, 0*8*3)\
  1439. -            QPEL_H264HV(%%mm1, %%mm2, %%mm3, %%mm4, %%mm5, %%mm0, 1*8*3)\
  1440. -            QPEL_H264HV(%%mm2, %%mm3, %%mm4, %%mm5, %%mm0, %%mm1, 2*8*3)\
  1441. -            QPEL_H264HV(%%mm3, %%mm4, %%mm5, %%mm0, %%mm1, %%mm2, 3*8*3)\
  1442. -             \
  1443. -            : "+a"(src)\
  1444. -            : "c"(tmp), "S"((x86_reg)srcStride)\
  1445. -            : "memory"\
  1446. -        );\
  1447. -        tmp += 4;\
  1448. -        src += 4 - 9*srcStride;\
  1449. -    }\
  1450. -    tmp -= 3*4;\
  1451. -    __asm__ volatile(\
  1452. -        "1:                         \n\t"\
  1453. -        "movq     (%0), %%mm0       \n\t"\
  1454. -        "paddw  10(%0), %%mm0       \n\t"\
  1455. -        "movq    2(%0), %%mm1       \n\t"\
  1456. -        "paddw   8(%0), %%mm1       \n\t"\
  1457. -        "movq    4(%0), %%mm2       \n\t"\
  1458. -        "paddw   6(%0), %%mm2       \n\t"\
  1459. -        "psubw %%mm1, %%mm0         \n\t"/*a-b   (abccba)*/\
  1460. -        "psraw $2, %%mm0            \n\t"/*(a-b)/4 */\
  1461. -        "psubw %%mm1, %%mm0         \n\t"/*(a-b)/4-b */\
  1462. -        "paddsw %%mm2, %%mm0        \n\t"\
  1463. -        "psraw $2, %%mm0            \n\t"/*((a-b)/4-b+c)/4 */\
  1464. -        "paddw %%mm2, %%mm0         \n\t"/*(a-5*b+20*c)/16 */\
  1465. -        "psraw $6, %%mm0            \n\t"\
  1466. -        "packuswb %%mm0, %%mm0      \n\t"\
  1467. -        OP(%%mm0, (%1),%%mm7, d)\
  1468. -        "add $24, %0                \n\t"\
  1469. -        "add %3, %1                 \n\t"\
  1470. -        "decl %2                    \n\t"\
  1471. -        " jnz 1b                    \n\t"\
  1472. -        : "+a"(tmp), "+c"(dst), "+g"(h)\
  1473. -        : "S"((x86_reg)dstStride)\
  1474. -        : "memory"\
  1475. -    );\
  1476. -}\
  1477. -\
  1478. -static av_noinline void OPNAME ## h264_qpel8_h_lowpass_ ## MMX(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
  1479. -    int h=8;\
  1480. -    __asm__ volatile(\
  1481. -        "pxor %%mm7, %%mm7          \n\t"\
  1482. -        "movq "MANGLE(ff_pw_5)", %%mm6\n\t"\
  1483. -        "1:                         \n\t"\
  1484. -        "movq    (%0), %%mm0        \n\t"\
  1485. -        "movq   1(%0), %%mm2        \n\t"\
  1486. -        "movq %%mm0, %%mm1          \n\t"\
  1487. -        "movq %%mm2, %%mm3          \n\t"\
  1488. -        "punpcklbw %%mm7, %%mm0     \n\t"\
  1489. -        "punpckhbw %%mm7, %%mm1     \n\t"\
  1490. -        "punpcklbw %%mm7, %%mm2     \n\t"\
  1491. -        "punpckhbw %%mm7, %%mm3     \n\t"\
  1492. -        "paddw %%mm2, %%mm0         \n\t"\
  1493. -        "paddw %%mm3, %%mm1         \n\t"\
  1494. -        "psllw $2, %%mm0            \n\t"\
  1495. -        "psllw $2, %%mm1            \n\t"\
  1496. -        "movq   -1(%0), %%mm2       \n\t"\
  1497. -        "movq    2(%0), %%mm4       \n\t"\
  1498. -        "movq %%mm2, %%mm3          \n\t"\
  1499. -        "movq %%mm4, %%mm5          \n\t"\
  1500. -        "punpcklbw %%mm7, %%mm2     \n\t"\
  1501. -        "punpckhbw %%mm7, %%mm3     \n\t"\
  1502. -        "punpcklbw %%mm7, %%mm4     \n\t"\
  1503. -        "punpckhbw %%mm7, %%mm5     \n\t"\
  1504. -        "paddw %%mm4, %%mm2         \n\t"\
  1505. -        "paddw %%mm3, %%mm5         \n\t"\
  1506. -        "psubw %%mm2, %%mm0         \n\t"\
  1507. -        "psubw %%mm5, %%mm1         \n\t"\
  1508. -        "pmullw %%mm6, %%mm0        \n\t"\
  1509. -        "pmullw %%mm6, %%mm1        \n\t"\
  1510. -        "movd   -2(%0), %%mm2       \n\t"\
  1511. -        "movd    7(%0), %%mm5       \n\t"\
  1512. -        "punpcklbw %%mm7, %%mm2     \n\t"\
  1513. -        "punpcklbw %%mm7, %%mm5     \n\t"\
  1514. -        "paddw %%mm3, %%mm2         \n\t"\
  1515. -        "paddw %%mm5, %%mm4         \n\t"\
  1516. -        "movq "MANGLE(ff_pw_16)", %%mm5\n\t"\
  1517. -        "paddw %%mm5, %%mm2         \n\t"\
  1518. -        "paddw %%mm5, %%mm4         \n\t"\
  1519. -        "paddw %%mm2, %%mm0         \n\t"\
  1520. -        "paddw %%mm4, %%mm1         \n\t"\
  1521. -        "psraw $5, %%mm0            \n\t"\
  1522. -        "psraw $5, %%mm1            \n\t"\
  1523. -        "packuswb %%mm1, %%mm0      \n\t"\
  1524. -        OP(%%mm0, (%1),%%mm5, q)\
  1525. -        "add %3, %0                 \n\t"\
  1526. -        "add %4, %1                 \n\t"\
  1527. -        "decl %2                    \n\t"\
  1528. -        " jnz 1b                    \n\t"\
  1529. -        : "+a"(src), "+c"(dst), "+g"(h)\
  1530. -        : "d"((x86_reg)srcStride), "S"((x86_reg)dstStride)\
  1531. -        : "memory"\
  1532. -    );\
  1533. -}\
  1534. -\
  1535. -static av_noinline void OPNAME ## h264_qpel8_h_lowpass_l2_ ## MMX(uint8_t *dst, uint8_t *src, uint8_t *src2, int dstStride, int src2Stride){\
  1536. -    int h=8;\
  1537. -    __asm__ volatile(\
  1538. -        "pxor %%mm7, %%mm7          \n\t"\
  1539. -        "movq "MANGLE(ff_pw_5)", %%mm6\n\t"\
  1540. -        "1:                         \n\t"\
  1541. -        "movq    (%0), %%mm0        \n\t"\
  1542. -        "movq   1(%0), %%mm2        \n\t"\
  1543. -        "movq %%mm0, %%mm1          \n\t"\
  1544. -        "movq %%mm2, %%mm3          \n\t"\
  1545. -        "punpcklbw %%mm7, %%mm0     \n\t"\
  1546. -        "punpckhbw %%mm7, %%mm1     \n\t"\
  1547. -        "punpcklbw %%mm7, %%mm2     \n\t"\
  1548. -        "punpckhbw %%mm7, %%mm3     \n\t"\
  1549. -        "paddw %%mm2, %%mm0         \n\t"\
  1550. -        "paddw %%mm3, %%mm1         \n\t"\
  1551. -        "psllw $2, %%mm0            \n\t"\
  1552. -        "psllw $2, %%mm1            \n\t"\
  1553. -        "movq   -1(%0), %%mm2       \n\t"\
  1554. -        "movq    2(%0), %%mm4       \n\t"\
  1555. -        "movq %%mm2, %%mm3          \n\t"\
  1556. -        "movq %%mm4, %%mm5          \n\t"\
  1557. -        "punpcklbw %%mm7, %%mm2     \n\t"\
  1558. -        "punpckhbw %%mm7, %%mm3     \n\t"\
  1559. -        "punpcklbw %%mm7, %%mm4     \n\t"\
  1560. -        "punpckhbw %%mm7, %%mm5     \n\t"\
  1561. -        "paddw %%mm4, %%mm2         \n\t"\
  1562. -        "paddw %%mm3, %%mm5         \n\t"\
  1563. -        "psubw %%mm2, %%mm0         \n\t"\
  1564. -        "psubw %%mm5, %%mm1         \n\t"\
  1565. -        "pmullw %%mm6, %%mm0        \n\t"\
  1566. -        "pmullw %%mm6, %%mm1        \n\t"\
  1567. -        "movd   -2(%0), %%mm2       \n\t"\
  1568. -        "movd    7(%0), %%mm5       \n\t"\
  1569. -        "punpcklbw %%mm7, %%mm2     \n\t"\
  1570. -        "punpcklbw %%mm7, %%mm5     \n\t"\
  1571. -        "paddw %%mm3, %%mm2         \n\t"\
  1572. -        "paddw %%mm5, %%mm4         \n\t"\
  1573. -        "movq "MANGLE(ff_pw_16)", %%mm5\n\t"\
  1574. -        "paddw %%mm5, %%mm2         \n\t"\
  1575. -        "paddw %%mm5, %%mm4         \n\t"\
  1576. -        "paddw %%mm2, %%mm0         \n\t"\
  1577. -        "paddw %%mm4, %%mm1         \n\t"\
  1578. -        "psraw $5, %%mm0            \n\t"\
  1579. -        "psraw $5, %%mm1            \n\t"\
  1580. -        "movq (%2), %%mm4           \n\t"\
  1581. -        "packuswb %%mm1, %%mm0      \n\t"\
  1582. -        PAVGB" %%mm4, %%mm0         \n\t"\
  1583. -        OP(%%mm0, (%1),%%mm5, q)\
  1584. -        "add %5, %0                 \n\t"\
  1585. -        "add %5, %1                 \n\t"\
  1586. -        "add %4, %2                 \n\t"\
  1587. -        "decl %3                    \n\t"\
  1588. -        "jg 1b                      \n\t"\
  1589. -        : "+a"(src), "+c"(dst), "+d"(src2), "+g"(h)\
  1590. -        : "D"((x86_reg)src2Stride), "S"((x86_reg)dstStride)\
  1591. -        : "memory"\
  1592. -    );\
  1593. -}\
  1594. -\
  1595. -static av_noinline void OPNAME ## h264_qpel8or16_v_lowpass_ ## MMX(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h){\
  1596. -    int w= 2;\
  1597. -    src -= 2*srcStride;\
  1598. -    \
  1599. -    while(w--){\
  1600. -        __asm__ volatile(\
  1601. -            "pxor %%mm7, %%mm7          \n\t"\
  1602. -            "movd (%0), %%mm0           \n\t"\
  1603. -            "add %2, %0                 \n\t"\
  1604. -            "movd (%0), %%mm1           \n\t"\
  1605. -            "add %2, %0                 \n\t"\
  1606. -            "movd (%0), %%mm2           \n\t"\
  1607. -            "add %2, %0                 \n\t"\
  1608. -            "movd (%0), %%mm3           \n\t"\
  1609. -            "add %2, %0                 \n\t"\
  1610. -            "movd (%0), %%mm4           \n\t"\
  1611. -            "add %2, %0                 \n\t"\
  1612. -            "punpcklbw %%mm7, %%mm0     \n\t"\
  1613. -            "punpcklbw %%mm7, %%mm1     \n\t"\
  1614. -            "punpcklbw %%mm7, %%mm2     \n\t"\
  1615. -            "punpcklbw %%mm7, %%mm3     \n\t"\
  1616. -            "punpcklbw %%mm7, %%mm4     \n\t"\
  1617. -            QPEL_H264V(%%mm0, %%mm1, %%mm2, %%mm3, %%mm4, %%mm5, OP)\
  1618. -            QPEL_H264V(%%mm1, %%mm2, %%mm3, %%mm4, %%mm5, %%mm0, OP)\
  1619. -            QPEL_H264V(%%mm2, %%mm3, %%mm4, %%mm5, %%mm0, %%mm1, OP)\
  1620. -            QPEL_H264V(%%mm3, %%mm4, %%mm5, %%mm0, %%mm1, %%mm2, OP)\
  1621. -            QPEL_H264V(%%mm4, %%mm5, %%mm0, %%mm1, %%mm2, %%mm3, OP)\
  1622. -            QPEL_H264V(%%mm5, %%mm0, %%mm1, %%mm2, %%mm3, %%mm4, OP)\
  1623. -            QPEL_H264V(%%mm0, %%mm1, %%mm2, %%mm3, %%mm4, %%mm5, OP)\
  1624. -            QPEL_H264V(%%mm1, %%mm2, %%mm3, %%mm4, %%mm5, %%mm0, OP)\
  1625. -            "cmpl $16, %4               \n\t"\
  1626. -            "jne 2f                     \n\t"\
  1627. -            QPEL_H264V(%%mm2, %%mm3, %%mm4, %%mm5, %%mm0, %%mm1, OP)\
  1628. -            QPEL_H264V(%%mm3, %%mm4, %%mm5, %%mm0, %%mm1, %%mm2, OP)\
  1629. -            QPEL_H264V(%%mm4, %%mm5, %%mm0, %%mm1, %%mm2, %%mm3, OP)\
  1630. -            QPEL_H264V(%%mm5, %%mm0, %%mm1, %%mm2, %%mm3, %%mm4, OP)\
  1631. -            QPEL_H264V(%%mm0, %%mm1, %%mm2, %%mm3, %%mm4, %%mm5, OP)\
  1632. -            QPEL_H264V(%%mm1, %%mm2, %%mm3, %%mm4, %%mm5, %%mm0, OP)\
  1633. -            QPEL_H264V(%%mm2, %%mm3, %%mm4, %%mm5, %%mm0, %%mm1, OP)\
  1634. -            QPEL_H264V(%%mm3, %%mm4, %%mm5, %%mm0, %%mm1, %%mm2, OP)\
  1635. -            "2:                         \n\t"\
  1636. -            \
  1637. -            : "+a"(src), "+c"(dst)\
  1638. -            : "S"((x86_reg)srcStride), "D"((x86_reg)dstStride), "rm"(h)\
  1639. -            : "memory"\
  1640. -        );\
  1641. -        src += 4-(h+5)*srcStride;\
  1642. -        dst += 4-h*dstStride;\
  1643. -    }\
  1644. -}\
  1645. -static av_always_inline void OPNAME ## h264_qpel8or16_hv1_lowpass_ ## MMX(int16_t *tmp, uint8_t *src, int tmpStride, int srcStride, int size){\
  1646. -    int w = (size+8)>>2;\
  1647. -    src -= 2*srcStride+2;\
  1648. -    while(w--){\
  1649. -        __asm__ volatile(\
  1650. -            "pxor %%mm7, %%mm7      \n\t"\
  1651. -            "movd (%0), %%mm0       \n\t"\
  1652. -            "add %2, %0             \n\t"\
  1653. -            "movd (%0), %%mm1       \n\t"\
  1654. -            "add %2, %0             \n\t"\
  1655. -            "movd (%0), %%mm2       \n\t"\
  1656. -            "add %2, %0             \n\t"\
  1657. -            "movd (%0), %%mm3       \n\t"\
  1658. -            "add %2, %0             \n\t"\
  1659. -            "movd (%0), %%mm4       \n\t"\
  1660. -            "add %2, %0             \n\t"\
  1661. -            "punpcklbw %%mm7, %%mm0 \n\t"\
  1662. -            "punpcklbw %%mm7, %%mm1 \n\t"\
  1663. -            "punpcklbw %%mm7, %%mm2 \n\t"\
  1664. -            "punpcklbw %%mm7, %%mm3 \n\t"\
  1665. -            "punpcklbw %%mm7, %%mm4 \n\t"\
  1666. -            QPEL_H264HV(%%mm0, %%mm1, %%mm2, %%mm3, %%mm4, %%mm5, 0*48)\
  1667. -            QPEL_H264HV(%%mm1, %%mm2, %%mm3, %%mm4, %%mm5, %%mm0, 1*48)\
  1668. -            QPEL_H264HV(%%mm2, %%mm3, %%mm4, %%mm5, %%mm0, %%mm1, 2*48)\
  1669. -            QPEL_H264HV(%%mm3, %%mm4, %%mm5, %%mm0, %%mm1, %%mm2, 3*48)\
  1670. -            QPEL_H264HV(%%mm4, %%mm5, %%mm0, %%mm1, %%mm2, %%mm3, 4*48)\
  1671. -            QPEL_H264HV(%%mm5, %%mm0, %%mm1, %%mm2, %%mm3, %%mm4, 5*48)\
  1672. -            QPEL_H264HV(%%mm0, %%mm1, %%mm2, %%mm3, %%mm4, %%mm5, 6*48)\
  1673. -            QPEL_H264HV(%%mm1, %%mm2, %%mm3, %%mm4, %%mm5, %%mm0, 7*48)\
  1674. -            "cmpl $16, %3           \n\t"\
  1675. -            "jne 2f                 \n\t"\
  1676. -            QPEL_H264HV(%%mm2, %%mm3, %%mm4, %%mm5, %%mm0, %%mm1,  8*48)\
  1677. -            QPEL_H264HV(%%mm3, %%mm4, %%mm5, %%mm0, %%mm1, %%mm2,  9*48)\
  1678. -            QPEL_H264HV(%%mm4, %%mm5, %%mm0, %%mm1, %%mm2, %%mm3, 10*48)\
  1679. -            QPEL_H264HV(%%mm5, %%mm0, %%mm1, %%mm2, %%mm3, %%mm4, 11*48)\
  1680. -            QPEL_H264HV(%%mm0, %%mm1, %%mm2, %%mm3, %%mm4, %%mm5, 12*48)\
  1681. -            QPEL_H264HV(%%mm1, %%mm2, %%mm3, %%mm4, %%mm5, %%mm0, 13*48)\
  1682. -            QPEL_H264HV(%%mm2, %%mm3, %%mm4, %%mm5, %%mm0, %%mm1, 14*48)\
  1683. -            QPEL_H264HV(%%mm3, %%mm4, %%mm5, %%mm0, %%mm1, %%mm2, 15*48)\
  1684. -            "2:                     \n\t"\
  1685. -            : "+a"(src)\
  1686. -            : "c"(tmp), "S"((x86_reg)srcStride), "rm"(size)\
  1687. -            : "memory"\
  1688. -            );\
  1689. -        tmp += 4;\
  1690. -        src += 4 - (size+5)*srcStride;\
  1691. -    }\
  1692. -}\
  1693. -static av_always_inline void OPNAME ## h264_qpel8or16_hv2_lowpass_ ## MMX(uint8_t *dst, int16_t *tmp, int dstStride, int tmpStride, int size){\
  1694. -    int w = size>>4;\
  1695. -    do{\
  1696. -    int h = size;\
  1697. -    __asm__ volatile(\
  1698. -        "1:                         \n\t"\
  1699. -        "movq     (%0), %%mm0       \n\t"\
  1700. -        "movq    8(%0), %%mm3       \n\t"\
  1701. -        "movq    2(%0), %%mm1       \n\t"\
  1702. -        "movq   10(%0), %%mm4       \n\t"\
  1703. -        "paddw   %%mm4, %%mm0       \n\t"\
  1704. -        "paddw   %%mm3, %%mm1       \n\t"\
  1705. -        "paddw  18(%0), %%mm3       \n\t"\
  1706. -        "paddw  16(%0), %%mm4       \n\t"\
  1707. -        "movq    4(%0), %%mm2       \n\t"\
  1708. -        "movq   12(%0), %%mm5       \n\t"\
  1709. -        "paddw   6(%0), %%mm2       \n\t"\
  1710. -        "paddw  14(%0), %%mm5       \n\t"\
  1711. -        "psubw %%mm1, %%mm0         \n\t"\
  1712. -        "psubw %%mm4, %%mm3         \n\t"\
  1713. -        "psraw $2, %%mm0            \n\t"\
  1714. -        "psraw $2, %%mm3            \n\t"\
  1715. -        "psubw %%mm1, %%mm0         \n\t"\
  1716. -        "psubw %%mm4, %%mm3         \n\t"\
  1717. -        "paddsw %%mm2, %%mm0        \n\t"\
  1718. -        "paddsw %%mm5, %%mm3        \n\t"\
  1719. -        "psraw $2, %%mm0            \n\t"\
  1720. -        "psraw $2, %%mm3            \n\t"\
  1721. -        "paddw %%mm2, %%mm0         \n\t"\
  1722. -        "paddw %%mm5, %%mm3         \n\t"\
  1723. -        "psraw $6, %%mm0            \n\t"\
  1724. -        "psraw $6, %%mm3            \n\t"\
  1725. -        "packuswb %%mm3, %%mm0      \n\t"\
  1726. -        OP(%%mm0, (%1),%%mm7, q)\
  1727. -        "add $48, %0                \n\t"\
  1728. -        "add %3, %1                 \n\t"\
  1729. -        "decl %2                    \n\t"\
  1730. -        " jnz 1b                    \n\t"\
  1731. -        : "+a"(tmp), "+c"(dst), "+g"(h)\
  1732. -        : "S"((x86_reg)dstStride)\
  1733. -        : "memory"\
  1734. -    );\
  1735. -    tmp += 8 - size*24;\
  1736. -    dst += 8 - size*dstStride;\
  1737. -    }while(w--);\
  1738. -}\
  1739. -\
  1740. -static void OPNAME ## h264_qpel8_v_lowpass_ ## MMX(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
  1741. -    OPNAME ## h264_qpel8or16_v_lowpass_ ## MMX(dst  , src  , dstStride, srcStride, 8);\
  1742. -}\
  1743. -static av_noinline void OPNAME ## h264_qpel16_v_lowpass_ ## MMX(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
  1744. -    OPNAME ## h264_qpel8or16_v_lowpass_ ## MMX(dst  , src  , dstStride, srcStride, 16);\
  1745. -    OPNAME ## h264_qpel8or16_v_lowpass_ ## MMX(dst+8, src+8, dstStride, srcStride, 16);\
  1746. -}\
  1747. -\
  1748. -static void OPNAME ## h264_qpel16_h_lowpass_ ## MMX(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
  1749. -    OPNAME ## h264_qpel8_h_lowpass_ ## MMX(dst  , src  , dstStride, srcStride);\
  1750. -    OPNAME ## h264_qpel8_h_lowpass_ ## MMX(dst+8, src+8, dstStride, srcStride);\
  1751. -    src += 8*srcStride;\
  1752. -    dst += 8*dstStride;\
  1753. -    OPNAME ## h264_qpel8_h_lowpass_ ## MMX(dst  , src  , dstStride, srcStride);\
  1754. -    OPNAME ## h264_qpel8_h_lowpass_ ## MMX(dst+8, src+8, dstStride, srcStride);\
  1755. -}\
  1756. -\
  1757. -static av_noinline void OPNAME ## h264_qpel16_h_lowpass_l2_ ## MMX(uint8_t *dst, uint8_t *src, uint8_t *src2, int dstStride, int src2Stride){\
  1758. -    OPNAME ## h264_qpel8_h_lowpass_l2_ ## MMX(dst  , src  , src2  , dstStride, src2Stride);\
  1759. -    OPNAME ## h264_qpel8_h_lowpass_l2_ ## MMX(dst+8, src+8, src2+8, dstStride, src2Stride);\
  1760. -    src += 8*dstStride;\
  1761. -    dst += 8*dstStride;\
  1762. -    src2 += 8*src2Stride;\
  1763. -    OPNAME ## h264_qpel8_h_lowpass_l2_ ## MMX(dst  , src  , src2  , dstStride, src2Stride);\
  1764. -    OPNAME ## h264_qpel8_h_lowpass_l2_ ## MMX(dst+8, src+8, src2+8, dstStride, src2Stride);\
  1765. -}\
  1766. -\
  1767. -static av_noinline void OPNAME ## h264_qpel8or16_hv_lowpass_ ## MMX(uint8_t *dst, int16_t *tmp, uint8_t *src, int dstStride, int tmpStride, int srcStride, int size){\
  1768. -          put_h264_qpel8or16_hv1_lowpass_ ## MMX(tmp, src, tmpStride, srcStride, size);\
  1769. -    OPNAME ## h264_qpel8or16_hv2_lowpass_ ## MMX(dst, tmp, dstStride, tmpStride, size);\
  1770. -}\
  1771. -static void OPNAME ## h264_qpel8_hv_lowpass_ ## MMX(uint8_t *dst, int16_t *tmp, uint8_t *src, int dstStride, int tmpStride, int srcStride){\
  1772. -    OPNAME ## h264_qpel8or16_hv_lowpass_ ## MMX(dst  , tmp  , src  , dstStride, tmpStride, srcStride, 8);\
  1773. -}\
  1774. -\
  1775. -static void OPNAME ## h264_qpel16_hv_lowpass_ ## MMX(uint8_t *dst, int16_t *tmp, uint8_t *src, int dstStride, int tmpStride, int srcStride){\
  1776. -    OPNAME ## h264_qpel8or16_hv_lowpass_ ## MMX(dst  , tmp  , src  , dstStride, tmpStride, srcStride, 16);\
  1777. -}\
  1778. -\
  1779. -static av_noinline void OPNAME ## pixels4_l2_shift5_ ## MMX(uint8_t *dst, int16_t *src16, uint8_t *src8, int dstStride, int src8Stride, int h)\
  1780. -{\
  1781. -    __asm__ volatile(\
  1782. -        "movq      (%1), %%mm0          \n\t"\
  1783. -        "movq    24(%1), %%mm1          \n\t"\
  1784. -        "psraw      $5,  %%mm0          \n\t"\
  1785. -        "psraw      $5,  %%mm1          \n\t"\
  1786. -        "packuswb %%mm0, %%mm0          \n\t"\
  1787. -        "packuswb %%mm1, %%mm1          \n\t"\
  1788. -        PAVGB"     (%0), %%mm0          \n\t"\
  1789. -        PAVGB"  (%0,%3), %%mm1          \n\t"\
  1790. -        OP(%%mm0, (%2),    %%mm4, d)\
  1791. -        OP(%%mm1, (%2,%4), %%mm5, d)\
  1792. -        "lea  (%0,%3,2), %0             \n\t"\
  1793. -        "lea  (%2,%4,2), %2             \n\t"\
  1794. -        "movq    48(%1), %%mm0          \n\t"\
  1795. -        "movq    72(%1), %%mm1          \n\t"\
  1796. -        "psraw      $5,  %%mm0          \n\t"\
  1797. -        "psraw      $5,  %%mm1          \n\t"\
  1798. -        "packuswb %%mm0, %%mm0          \n\t"\
  1799. -        "packuswb %%mm1, %%mm1          \n\t"\
  1800. -        PAVGB"     (%0), %%mm0          \n\t"\
  1801. -        PAVGB"  (%0,%3), %%mm1          \n\t"\
  1802. -        OP(%%mm0, (%2),    %%mm4, d)\
  1803. -        OP(%%mm1, (%2,%4), %%mm5, d)\
  1804. -        :"+a"(src8), "+c"(src16), "+d"(dst)\
  1805. -        :"S"((x86_reg)src8Stride), "D"((x86_reg)dstStride)\
  1806. -        :"memory");\
  1807. -}\
  1808. -static av_noinline void OPNAME ## pixels8_l2_shift5_ ## MMX(uint8_t *dst, int16_t *src16, uint8_t *src8, int dstStride, int src8Stride, int h)\
  1809. -{\
  1810. -    do{\
  1811. -    __asm__ volatile(\
  1812. -        "movq      (%1), %%mm0          \n\t"\
  1813. -        "movq     8(%1), %%mm1          \n\t"\
  1814. -        "movq    48(%1), %%mm2          \n\t"\
  1815. -        "movq  8+48(%1), %%mm3          \n\t"\
  1816. -        "psraw      $5,  %%mm0          \n\t"\
  1817. -        "psraw      $5,  %%mm1          \n\t"\
  1818. -        "psraw      $5,  %%mm2          \n\t"\
  1819. -        "psraw      $5,  %%mm3          \n\t"\
  1820. -        "packuswb %%mm1, %%mm0          \n\t"\
  1821. -        "packuswb %%mm3, %%mm2          \n\t"\
  1822. -        PAVGB"     (%0), %%mm0          \n\t"\
  1823. -        PAVGB"  (%0,%3), %%mm2          \n\t"\
  1824. -        OP(%%mm0, (%2), %%mm5, q)\
  1825. -        OP(%%mm2, (%2,%4), %%mm5, q)\
  1826. -        ::"a"(src8), "c"(src16), "d"(dst),\
  1827. -          "r"((x86_reg)src8Stride), "r"((x86_reg)dstStride)\
  1828. -        :"memory");\
  1829. -        src8 += 2L*src8Stride;\
  1830. -        src16 += 48;\
  1831. -        dst += 2L*dstStride;\
  1832. -    }while(h-=2);\
  1833. -}\
  1834. -static void OPNAME ## pixels16_l2_shift5_ ## MMX(uint8_t *dst, int16_t *src16, uint8_t *src8, int dstStride, int src8Stride, int h)\
  1835. -{\
  1836. -    OPNAME ## pixels8_l2_shift5_ ## MMX(dst  , src16  , src8  , dstStride, src8Stride, h);\
  1837. -    OPNAME ## pixels8_l2_shift5_ ## MMX(dst+8, src16+8, src8+8, dstStride, src8Stride, h);\
  1838. -}\
  1839. -
  1840. -
  1841. -#if ARCH_X86_64
  1842. -#define QPEL_H264_H16_XMM(OPNAME, OP, MMX)\
  1843. -static av_noinline void OPNAME ## h264_qpel16_h_lowpass_l2_ ## MMX(uint8_t *dst, uint8_t *src, uint8_t *src2, int dstStride, int src2Stride){\
  1844. -    int h=16;\
  1845. -    __asm__ volatile(\
  1846. -        "pxor %%xmm15, %%xmm15      \n\t"\
  1847. -        "movdqa %6, %%xmm14         \n\t"\
  1848. -        "movdqa %7, %%xmm13         \n\t"\
  1849. -        "1:                         \n\t"\
  1850. -        "lddqu    6(%0), %%xmm1     \n\t"\
  1851. -        "lddqu   -2(%0), %%xmm7     \n\t"\
  1852. -        "movdqa  %%xmm1, %%xmm0     \n\t"\
  1853. -        "punpckhbw %%xmm15, %%xmm1  \n\t"\
  1854. -        "punpcklbw %%xmm15, %%xmm0  \n\t"\
  1855. -        "punpcklbw %%xmm15, %%xmm7  \n\t"\
  1856. -        "movdqa  %%xmm1, %%xmm2     \n\t"\
  1857. -        "movdqa  %%xmm0, %%xmm6     \n\t"\
  1858. -        "movdqa  %%xmm1, %%xmm3     \n\t"\
  1859. -        "movdqa  %%xmm0, %%xmm8     \n\t"\
  1860. -        "movdqa  %%xmm1, %%xmm4     \n\t"\
  1861. -        "movdqa  %%xmm0, %%xmm9     \n\t"\
  1862. -        "movdqa  %%xmm0, %%xmm12    \n\t"\
  1863. -        "movdqa  %%xmm1, %%xmm11    \n\t"\
  1864. -        "palignr $10,%%xmm0, %%xmm11\n\t"\
  1865. -        "palignr $10,%%xmm7, %%xmm12\n\t"\
  1866. -        "palignr $2, %%xmm0, %%xmm4 \n\t"\
  1867. -        "palignr $2, %%xmm7, %%xmm9 \n\t"\
  1868. -        "palignr $4, %%xmm0, %%xmm3 \n\t"\
  1869. -        "palignr $4, %%xmm7, %%xmm8 \n\t"\
  1870. -        "palignr $6, %%xmm0, %%xmm2 \n\t"\
  1871. -        "palignr $6, %%xmm7, %%xmm6 \n\t"\
  1872. -        "paddw   %%xmm0 ,%%xmm11    \n\t"\
  1873. -        "palignr $8, %%xmm0, %%xmm1 \n\t"\
  1874. -        "palignr $8, %%xmm7, %%xmm0 \n\t"\
  1875. -        "paddw   %%xmm12,%%xmm7     \n\t"\
  1876. -        "paddw   %%xmm3, %%xmm2     \n\t"\
  1877. -        "paddw   %%xmm8, %%xmm6     \n\t"\
  1878. -        "paddw   %%xmm4, %%xmm1     \n\t"\
  1879. -        "paddw   %%xmm9, %%xmm0     \n\t"\
  1880. -        "psllw   $2,     %%xmm2     \n\t"\
  1881. -        "psllw   $2,     %%xmm6     \n\t"\
  1882. -        "psubw   %%xmm1, %%xmm2     \n\t"\
  1883. -        "psubw   %%xmm0, %%xmm6     \n\t"\
  1884. -        "paddw   %%xmm13,%%xmm11    \n\t"\
  1885. -        "paddw   %%xmm13,%%xmm7     \n\t"\
  1886. -        "pmullw  %%xmm14,%%xmm2     \n\t"\
  1887. -        "pmullw  %%xmm14,%%xmm6     \n\t"\
  1888. -        "lddqu   (%2),   %%xmm3     \n\t"\
  1889. -        "paddw   %%xmm11,%%xmm2     \n\t"\
  1890. -        "paddw   %%xmm7, %%xmm6     \n\t"\
  1891. -        "psraw   $5,     %%xmm2     \n\t"\
  1892. -        "psraw   $5,     %%xmm6     \n\t"\
  1893. -        "packuswb %%xmm2,%%xmm6     \n\t"\
  1894. -        "pavgb   %%xmm3, %%xmm6     \n\t"\
  1895. -        OP(%%xmm6, (%1), %%xmm4, dqa)\
  1896. -        "add %5, %0                 \n\t"\
  1897. -        "add %5, %1                 \n\t"\
  1898. -        "add %4, %2                 \n\t"\
  1899. -        "decl %3                    \n\t"\
  1900. -        "jg 1b                      \n\t"\
  1901. -        : "+a"(src), "+c"(dst), "+d"(src2), "+g"(h)\
  1902. -        : "D"((x86_reg)src2Stride), "S"((x86_reg)dstStride),\
  1903. -          "m"(ff_pw_5), "m"(ff_pw_16)\
  1904. -        : XMM_CLOBBERS("%xmm0" , "%xmm1" , "%xmm2" , "%xmm3" , \
  1905. -                       "%xmm4" , "%xmm5" , "%xmm6" , "%xmm7" , \
  1906. -                       "%xmm8" , "%xmm9" , "%xmm10", "%xmm11", \
  1907. -                       "%xmm12", "%xmm13", "%xmm14", "%xmm15",)\
  1908. -          "memory"\
  1909. -    );\
  1910. -}
  1911. -#else // ARCH_X86_64
  1912. -#define QPEL_H264_H16_XMM(OPNAME, OP, MMX)\
  1913. -static av_noinline void OPNAME ## h264_qpel16_h_lowpass_l2_ ## MMX(uint8_t *dst, uint8_t *src, uint8_t *src2, int dstStride, int src2Stride){\
  1914. -    OPNAME ## h264_qpel8_h_lowpass_l2_ ## MMX(dst  , src  , src2  , dstStride, src2Stride);\
  1915. -    OPNAME ## h264_qpel8_h_lowpass_l2_ ## MMX(dst+8, src+8, src2+8, dstStride, src2Stride);\
  1916. -    src += 8*dstStride;\
  1917. -    dst += 8*dstStride;\
  1918. -    src2 += 8*src2Stride;\
  1919. -    OPNAME ## h264_qpel8_h_lowpass_l2_ ## MMX(dst  , src  , src2  , dstStride, src2Stride);\
  1920. -    OPNAME ## h264_qpel8_h_lowpass_l2_ ## MMX(dst+8, src+8, src2+8, dstStride, src2Stride);\
  1921. -}
  1922. -#endif // ARCH_X86_64
  1923. -
  1924. -#define QPEL_H264_H_XMM(OPNAME, OP, MMX)\
  1925. -static av_noinline void OPNAME ## h264_qpel8_h_lowpass_l2_ ## MMX(uint8_t *dst, uint8_t *src, uint8_t *src2, int dstStride, int src2Stride){\
  1926. -    int h=8;\
  1927. -    __asm__ volatile(\
  1928. -        "pxor %%xmm7, %%xmm7        \n\t"\
  1929. -        "movdqa "MANGLE(ff_pw_5)", %%xmm6\n\t"\
  1930. -        "1:                         \n\t"\
  1931. -        "lddqu   -2(%0), %%xmm1     \n\t"\
  1932. -        "movdqa  %%xmm1, %%xmm0     \n\t"\
  1933. -        "punpckhbw %%xmm7, %%xmm1   \n\t"\
  1934. -        "punpcklbw %%xmm7, %%xmm0   \n\t"\
  1935. -        "movdqa  %%xmm1, %%xmm2     \n\t"\
  1936. -        "movdqa  %%xmm1, %%xmm3     \n\t"\
  1937. -        "movdqa  %%xmm1, %%xmm4     \n\t"\
  1938. -        "movdqa  %%xmm1, %%xmm5     \n\t"\
  1939. -        "palignr $2, %%xmm0, %%xmm4 \n\t"\
  1940. -        "palignr $4, %%xmm0, %%xmm3 \n\t"\
  1941. -        "palignr $6, %%xmm0, %%xmm2 \n\t"\
  1942. -        "palignr $8, %%xmm0, %%xmm1 \n\t"\
  1943. -        "palignr $10,%%xmm0, %%xmm5 \n\t"\
  1944. -        "paddw   %%xmm5, %%xmm0     \n\t"\
  1945. -        "paddw   %%xmm3, %%xmm2     \n\t"\
  1946. -        "paddw   %%xmm4, %%xmm1     \n\t"\
  1947. -        "psllw   $2,     %%xmm2     \n\t"\
  1948. -        "movq    (%2),   %%xmm3     \n\t"\
  1949. -        "psubw   %%xmm1, %%xmm2     \n\t"\
  1950. -        "paddw "MANGLE(ff_pw_16)", %%xmm0\n\t"\
  1951. -        "pmullw  %%xmm6, %%xmm2     \n\t"\
  1952. -        "paddw   %%xmm0, %%xmm2     \n\t"\
  1953. -        "psraw   $5,     %%xmm2     \n\t"\
  1954. -        "packuswb %%xmm2, %%xmm2    \n\t"\
  1955. -        "pavgb   %%xmm3, %%xmm2     \n\t"\
  1956. -        OP(%%xmm2, (%1), %%xmm4, q)\
  1957. -        "add %5, %0                 \n\t"\
  1958. -        "add %5, %1                 \n\t"\
  1959. -        "add %4, %2                 \n\t"\
  1960. -        "decl %3                    \n\t"\
  1961. -        "jg 1b                      \n\t"\
  1962. -        : "+a"(src), "+c"(dst), "+d"(src2), "+g"(h)\
  1963. -        : "D"((x86_reg)src2Stride), "S"((x86_reg)dstStride)\
  1964. -        : XMM_CLOBBERS("%xmm0", "%xmm1", "%xmm2", "%xmm3", \
  1965. -                       "%xmm4", "%xmm5", "%xmm6", "%xmm7",)\
  1966. -          "memory"\
  1967. -    );\
  1968. -}\
  1969. -QPEL_H264_H16_XMM(OPNAME, OP, MMX)\
  1970. -\
  1971. -static av_noinline void OPNAME ## h264_qpel8_h_lowpass_ ## MMX(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
  1972. -    int h=8;\
  1973. -    __asm__ volatile(\
  1974. -        "pxor %%xmm7, %%xmm7        \n\t"\
  1975. -        "movdqa "MANGLE(ff_pw_5)", %%xmm6\n\t"\
  1976. -        "1:                         \n\t"\
  1977. -        "lddqu   -2(%0), %%xmm1     \n\t"\
  1978. -        "movdqa  %%xmm1, %%xmm0     \n\t"\
  1979. -        "punpckhbw %%xmm7, %%xmm1   \n\t"\
  1980. -        "punpcklbw %%xmm7, %%xmm0   \n\t"\
  1981. -        "movdqa  %%xmm1, %%xmm2     \n\t"\
  1982. -        "movdqa  %%xmm1, %%xmm3     \n\t"\
  1983. -        "movdqa  %%xmm1, %%xmm4     \n\t"\
  1984. -        "movdqa  %%xmm1, %%xmm5     \n\t"\
  1985. -        "palignr $2, %%xmm0, %%xmm4 \n\t"\
  1986. -        "palignr $4, %%xmm0, %%xmm3 \n\t"\
  1987. -        "palignr $6, %%xmm0, %%xmm2 \n\t"\
  1988. -        "palignr $8, %%xmm0, %%xmm1 \n\t"\
  1989. -        "palignr $10,%%xmm0, %%xmm5 \n\t"\
  1990. -        "paddw   %%xmm5, %%xmm0     \n\t"\
  1991. -        "paddw   %%xmm3, %%xmm2     \n\t"\
  1992. -        "paddw   %%xmm4, %%xmm1     \n\t"\
  1993. -        "psllw   $2,     %%xmm2     \n\t"\
  1994. -        "psubw   %%xmm1, %%xmm2     \n\t"\
  1995. -        "paddw   "MANGLE(ff_pw_16)", %%xmm0\n\t"\
  1996. -        "pmullw  %%xmm6, %%xmm2     \n\t"\
  1997. -        "paddw   %%xmm0, %%xmm2     \n\t"\
  1998. -        "psraw   $5,     %%xmm2     \n\t"\
  1999. -        "packuswb %%xmm2, %%xmm2    \n\t"\
  2000. -        OP(%%xmm2, (%1), %%xmm4, q)\
  2001. -        "add %3, %0                 \n\t"\
  2002. -        "add %4, %1                 \n\t"\
  2003. -        "decl %2                    \n\t"\
  2004. -        " jnz 1b                    \n\t"\
  2005. -        : "+a"(src), "+c"(dst), "+g"(h)\
  2006. -        : "D"((x86_reg)srcStride), "S"((x86_reg)dstStride)\
  2007. -        : XMM_CLOBBERS("%xmm0", "%xmm1", "%xmm2", "%xmm3", \
  2008. -                       "%xmm4", "%xmm5", "%xmm6", "%xmm7",)\
  2009. -          "memory"\
  2010. -    );\
  2011. -}\
  2012. -static void OPNAME ## h264_qpel16_h_lowpass_ ## MMX(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
  2013. -    OPNAME ## h264_qpel8_h_lowpass_ ## MMX(dst  , src  , dstStride, srcStride);\
  2014. -    OPNAME ## h264_qpel8_h_lowpass_ ## MMX(dst+8, src+8, dstStride, srcStride);\
  2015. -    src += 8*srcStride;\
  2016. -    dst += 8*dstStride;\
  2017. -    OPNAME ## h264_qpel8_h_lowpass_ ## MMX(dst  , src  , dstStride, srcStride);\
  2018. -    OPNAME ## h264_qpel8_h_lowpass_ ## MMX(dst+8, src+8, dstStride, srcStride);\
  2019. -}\
  2020. -
  2021. -#define QPEL_H264_V_XMM(OPNAME, OP, MMX)\
  2022. -static av_noinline void OPNAME ## h264_qpel8or16_v_lowpass_ ## MMX(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h){\
  2023. -    src -= 2*srcStride;\
  2024. -    \
  2025. -    __asm__ volatile(\
  2026. -        "pxor %%xmm7, %%xmm7        \n\t"\
  2027. -        "movq (%0), %%xmm0          \n\t"\
  2028. -        "add %2, %0                 \n\t"\
  2029. -        "movq (%0), %%xmm1          \n\t"\
  2030. -        "add %2, %0                 \n\t"\
  2031. -        "movq (%0), %%xmm2          \n\t"\
  2032. -        "add %2, %0                 \n\t"\
  2033. -        "movq (%0), %%xmm3          \n\t"\
  2034. -        "add %2, %0                 \n\t"\
  2035. -        "movq (%0), %%xmm4          \n\t"\
  2036. -        "add %2, %0                 \n\t"\
  2037. -        "punpcklbw %%xmm7, %%xmm0   \n\t"\
  2038. -        "punpcklbw %%xmm7, %%xmm1   \n\t"\
  2039. -        "punpcklbw %%xmm7, %%xmm2   \n\t"\
  2040. -        "punpcklbw %%xmm7, %%xmm3   \n\t"\
  2041. -        "punpcklbw %%xmm7, %%xmm4   \n\t"\
  2042. -        QPEL_H264V_XMM(%%xmm0, %%xmm1, %%xmm2, %%xmm3, %%xmm4, %%xmm5, OP)\
  2043. -        QPEL_H264V_XMM(%%xmm1, %%xmm2, %%xmm3, %%xmm4, %%xmm5, %%xmm0, OP)\
  2044. -        QPEL_H264V_XMM(%%xmm2, %%xmm3, %%xmm4, %%xmm5, %%xmm0, %%xmm1, OP)\
  2045. -        QPEL_H264V_XMM(%%xmm3, %%xmm4, %%xmm5, %%xmm0, %%xmm1, %%xmm2, OP)\
  2046. -        QPEL_H264V_XMM(%%xmm4, %%xmm5, %%xmm0, %%xmm1, %%xmm2, %%xmm3, OP)\
  2047. -        QPEL_H264V_XMM(%%xmm5, %%xmm0, %%xmm1, %%xmm2, %%xmm3, %%xmm4, OP)\
  2048. -        QPEL_H264V_XMM(%%xmm0, %%xmm1, %%xmm2, %%xmm3, %%xmm4, %%xmm5, OP)\
  2049. -        QPEL_H264V_XMM(%%xmm1, %%xmm2, %%xmm3, %%xmm4, %%xmm5, %%xmm0, OP)\
  2050. -        "cmpl $16, %4               \n\t"\
  2051. -        "jne 2f                     \n\t"\
  2052. -        QPEL_H264V_XMM(%%xmm2, %%xmm3, %%xmm4, %%xmm5, %%xmm0, %%xmm1, OP)\
  2053. -        QPEL_H264V_XMM(%%xmm3, %%xmm4, %%xmm5, %%xmm0, %%xmm1, %%xmm2, OP)\
  2054. -        QPEL_H264V_XMM(%%xmm4, %%xmm5, %%xmm0, %%xmm1, %%xmm2, %%xmm3, OP)\
  2055. -        QPEL_H264V_XMM(%%xmm5, %%xmm0, %%xmm1, %%xmm2, %%xmm3, %%xmm4, OP)\
  2056. -        QPEL_H264V_XMM(%%xmm0, %%xmm1, %%xmm2, %%xmm3, %%xmm4, %%xmm5, OP)\
  2057. -        QPEL_H264V_XMM(%%xmm1, %%xmm2, %%xmm3, %%xmm4, %%xmm5, %%xmm0, OP)\
  2058. -        QPEL_H264V_XMM(%%xmm2, %%xmm3, %%xmm4, %%xmm5, %%xmm0, %%xmm1, OP)\
  2059. -        QPEL_H264V_XMM(%%xmm3, %%xmm4, %%xmm5, %%xmm0, %%xmm1, %%xmm2, OP)\
  2060. -        "2:                          \n\t"\
  2061. -        \
  2062. -        : "+a"(src), "+c"(dst)\
  2063. -        : "S"((x86_reg)srcStride), "D"((x86_reg)dstStride), "rm"(h)\
  2064. -        : XMM_CLOBBERS("%xmm0", "%xmm1", "%xmm2", "%xmm3", \
  2065. -                       "%xmm4", "%xmm5", "%xmm6", "%xmm7",)\
  2066. -          "memory"\
  2067. -    );\
  2068. -}\
  2069. -static void OPNAME ## h264_qpel8_v_lowpass_ ## MMX(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
  2070. -    OPNAME ## h264_qpel8or16_v_lowpass_ ## MMX(dst  , src  , dstStride, srcStride, 8);\
  2071. -}\
  2072. -static av_noinline void OPNAME ## h264_qpel16_v_lowpass_ ## MMX(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\
  2073. -    OPNAME ## h264_qpel8or16_v_lowpass_ ## MMX(dst  , src  , dstStride, srcStride, 16);\
  2074. -    OPNAME ## h264_qpel8or16_v_lowpass_ ## MMX(dst+8, src+8, dstStride, srcStride, 16);\
  2075. -}
  2076. -
  2077. -static av_always_inline void put_h264_qpel8or16_hv1_lowpass_sse2(int16_t *tmp, uint8_t *src, int tmpStride, int srcStride, int size){
  2078. -    int w = (size+8)>>3;
  2079. -    src -= 2*srcStride+2;
  2080. -    while(w--){
  2081. -        __asm__ volatile(
  2082. -            "pxor %%xmm7, %%xmm7        \n\t"
  2083. -            "movq (%0), %%xmm0          \n\t"
  2084. -            "add %2, %0                 \n\t"
  2085. -            "movq (%0), %%xmm1          \n\t"
  2086. -            "add %2, %0                 \n\t"
  2087. -            "movq (%0), %%xmm2          \n\t"
  2088. -            "add %2, %0                 \n\t"
  2089. -            "movq (%0), %%xmm3          \n\t"
  2090. -            "add %2, %0                 \n\t"
  2091. -            "movq (%0), %%xmm4          \n\t"
  2092. -            "add %2, %0                 \n\t"
  2093. -            "punpcklbw %%xmm7, %%xmm0   \n\t"
  2094. -            "punpcklbw %%xmm7, %%xmm1   \n\t"
  2095. -            "punpcklbw %%xmm7, %%xmm2   \n\t"
  2096. -            "punpcklbw %%xmm7, %%xmm3   \n\t"
  2097. -            "punpcklbw %%xmm7, %%xmm4   \n\t"
  2098. -            QPEL_H264HV_XMM(%%xmm0, %%xmm1, %%xmm2, %%xmm3, %%xmm4, %%xmm5, 0*48)
  2099. -            QPEL_H264HV_XMM(%%xmm1, %%xmm2, %%xmm3, %%xmm4, %%xmm5, %%xmm0, 1*48)
  2100. -            QPEL_H264HV_XMM(%%xmm2, %%xmm3, %%xmm4, %%xmm5, %%xmm0, %%xmm1, 2*48)
  2101. -            QPEL_H264HV_XMM(%%xmm3, %%xmm4, %%xmm5, %%xmm0, %%xmm1, %%xmm2, 3*48)
  2102. -            QPEL_H264HV_XMM(%%xmm4, %%xmm5, %%xmm0, %%xmm1, %%xmm2, %%xmm3, 4*48)
  2103. -            QPEL_H264HV_XMM(%%xmm5, %%xmm0, %%xmm1, %%xmm2, %%xmm3, %%xmm4, 5*48)
  2104. -            QPEL_H264HV_XMM(%%xmm0, %%xmm1, %%xmm2, %%xmm3, %%xmm4, %%xmm5, 6*48)
  2105. -            QPEL_H264HV_XMM(%%xmm1, %%xmm2, %%xmm3, %%xmm4, %%xmm5, %%xmm0, 7*48)
  2106. -            "cmpl $16, %3               \n\t"
  2107. -            "jne 2f                     \n\t"
  2108. -            QPEL_H264HV_XMM(%%xmm2, %%xmm3, %%xmm4, %%xmm5, %%xmm0, %%xmm1,  8*48)
  2109. -            QPEL_H264HV_XMM(%%xmm3, %%xmm4, %%xmm5, %%xmm0, %%xmm1, %%xmm2,  9*48)
  2110. -            QPEL_H264HV_XMM(%%xmm4, %%xmm5, %%xmm0, %%xmm1, %%xmm2, %%xmm3, 10*48)
  2111. -            QPEL_H264HV_XMM(%%xmm5, %%xmm0, %%xmm1, %%xmm2, %%xmm3, %%xmm4, 11*48)
  2112. -            QPEL_H264HV_XMM(%%xmm0, %%xmm1, %%xmm2, %%xmm3, %%xmm4, %%xmm5, 12*48)
  2113. -            QPEL_H264HV_XMM(%%xmm1, %%xmm2, %%xmm3, %%xmm4, %%xmm5, %%xmm0, 13*48)
  2114. -            QPEL_H264HV_XMM(%%xmm2, %%xmm3, %%xmm4, %%xmm5, %%xmm0, %%xmm1, 14*48)
  2115. -            QPEL_H264HV_XMM(%%xmm3, %%xmm4, %%xmm5, %%xmm0, %%xmm1, %%xmm2, 15*48)
  2116. -            "2:                         \n\t"
  2117. -            : "+a"(src)
  2118. -            : "c"(tmp), "S"((x86_reg)srcStride), "rm"(size)
  2119. -            : XMM_CLOBBERS("%xmm0", "%xmm1", "%xmm2", "%xmm3",
  2120. -                           "%xmm4", "%xmm5", "%xmm6", "%xmm7",)
  2121. -              "memory"
  2122. -        );
  2123. -        tmp += 8;
  2124. -        src += 8 - (size+5)*srcStride;
  2125. -    }
  2126. -}
  2127. -
  2128. -#define QPEL_H264_HV2_XMM(OPNAME, OP, MMX)\
  2129. -static av_always_inline void OPNAME ## h264_qpel8or16_hv2_lowpass_ ## MMX(uint8_t *dst, int16_t *tmp, int dstStride, int tmpStride, int size){\
  2130. -    int h = size;\
  2131. -    if(size == 16){\
  2132. -        __asm__ volatile(\
  2133. -            "1:                         \n\t"\
  2134. -            "movdqa 32(%0), %%xmm4      \n\t"\
  2135. -            "movdqa 16(%0), %%xmm5      \n\t"\
  2136. -            "movdqa   (%0), %%xmm7      \n\t"\
  2137. -            "movdqa %%xmm4, %%xmm3      \n\t"\
  2138. -            "movdqa %%xmm4, %%xmm2      \n\t"\
  2139. -            "movdqa %%xmm4, %%xmm1      \n\t"\
  2140. -            "movdqa %%xmm4, %%xmm0      \n\t"\
  2141. -            "palignr $10, %%xmm5, %%xmm0 \n\t"\
  2142. -            "palignr  $8, %%xmm5, %%xmm1 \n\t"\
  2143. -            "palignr  $6, %%xmm5, %%xmm2 \n\t"\
  2144. -            "palignr  $4, %%xmm5, %%xmm3 \n\t"\
  2145. -            "palignr  $2, %%xmm5, %%xmm4 \n\t"\
  2146. -            "paddw  %%xmm5, %%xmm0      \n\t"\
  2147. -            "paddw  %%xmm4, %%xmm1      \n\t"\
  2148. -            "paddw  %%xmm3, %%xmm2      \n\t"\
  2149. -            "movdqa %%xmm5, %%xmm6      \n\t"\
  2150. -            "movdqa %%xmm5, %%xmm4      \n\t"\
  2151. -            "movdqa %%xmm5, %%xmm3      \n\t"\
  2152. -            "palignr  $8, %%xmm7, %%xmm4 \n\t"\
  2153. -            "palignr  $2, %%xmm7, %%xmm6 \n\t"\
  2154. -            "palignr $10, %%xmm7, %%xmm3 \n\t"\
  2155. -            "paddw  %%xmm6, %%xmm4      \n\t"\
  2156. -            "movdqa %%xmm5, %%xmm6      \n\t"\
  2157. -            "palignr  $6, %%xmm7, %%xmm5 \n\t"\
  2158. -            "palignr  $4, %%xmm7, %%xmm6 \n\t"\
  2159. -            "paddw  %%xmm7, %%xmm3      \n\t"\
  2160. -            "paddw  %%xmm6, %%xmm5      \n\t"\
  2161. -            \
  2162. -            "psubw  %%xmm1, %%xmm0      \n\t"\
  2163. -            "psubw  %%xmm4, %%xmm3      \n\t"\
  2164. -            "psraw      $2, %%xmm0      \n\t"\
  2165. -            "psraw      $2, %%xmm3      \n\t"\
  2166. -            "psubw  %%xmm1, %%xmm0      \n\t"\
  2167. -            "psubw  %%xmm4, %%xmm3      \n\t"\
  2168. -            "paddw  %%xmm2, %%xmm0      \n\t"\
  2169. -            "paddw  %%xmm5, %%xmm3      \n\t"\
  2170. -            "psraw      $2, %%xmm0      \n\t"\
  2171. -            "psraw      $2, %%xmm3      \n\t"\
  2172. -            "paddw  %%xmm2, %%xmm0      \n\t"\
  2173. -            "paddw  %%xmm5, %%xmm3      \n\t"\
  2174. -            "psraw      $6, %%xmm0      \n\t"\
  2175. -            "psraw      $6, %%xmm3      \n\t"\
  2176. -            "packuswb %%xmm0, %%xmm3    \n\t"\
  2177. -            OP(%%xmm3, (%1), %%xmm7, dqa)\
  2178. -            "add $48, %0                \n\t"\
  2179. -            "add %3, %1                 \n\t"\
  2180. -            "decl %2                    \n\t"\
  2181. -            " jnz 1b                    \n\t"\
  2182. -            : "+a"(tmp), "+c"(dst), "+g"(h)\
  2183. -            : "S"((x86_reg)dstStride)\
  2184. -            : XMM_CLOBBERS("%xmm0", "%xmm1", "%xmm2", "%xmm3", \
  2185. -                           "%xmm4", "%xmm5", "%xmm6", "%xmm7",)\
  2186. -              "memory"\
  2187. -        );\
  2188. -    }else{\
  2189. -        __asm__ volatile(\
  2190. -            "1:                         \n\t"\
  2191. -            "movdqa 16(%0), %%xmm1      \n\t"\
  2192. -            "movdqa   (%0), %%xmm0      \n\t"\
  2193. -            "movdqa %%xmm1, %%xmm2      \n\t"\
  2194. -            "movdqa %%xmm1, %%xmm3      \n\t"\
  2195. -            "movdqa %%xmm1, %%xmm4      \n\t"\
  2196. -            "movdqa %%xmm1, %%xmm5      \n\t"\
  2197. -            "palignr $10, %%xmm0, %%xmm5 \n\t"\
  2198. -            "palignr  $8, %%xmm0, %%xmm4 \n\t"\
  2199. -            "palignr  $6, %%xmm0, %%xmm3 \n\t"\
  2200. -            "palignr  $4, %%xmm0, %%xmm2 \n\t"\
  2201. -            "palignr  $2, %%xmm0, %%xmm1 \n\t"\
  2202. -            "paddw  %%xmm5, %%xmm0      \n\t"\
  2203. -            "paddw  %%xmm4, %%xmm1      \n\t"\
  2204. -            "paddw  %%xmm3, %%xmm2      \n\t"\
  2205. -            "psubw  %%xmm1, %%xmm0      \n\t"\
  2206. -            "psraw      $2, %%xmm0      \n\t"\
  2207. -            "psubw  %%xmm1, %%xmm0      \n\t"\
  2208. -            "paddw  %%xmm2, %%xmm0      \n\t"\
  2209. -            "psraw      $2, %%xmm0      \n\t"\
  2210. -            "paddw  %%xmm2, %%xmm0      \n\t"\
  2211. -            "psraw      $6, %%xmm0      \n\t"\
  2212. -            "packuswb %%xmm0, %%xmm0    \n\t"\
  2213. -            OP(%%xmm0, (%1), %%xmm7, q)\
  2214. -            "add $48, %0                \n\t"\
  2215. -            "add %3, %1                 \n\t"\
  2216. -            "decl %2                    \n\t"\
  2217. -            " jnz 1b                    \n\t"\
  2218. -            : "+a"(tmp), "+c"(dst), "+g"(h)\
  2219. -            : "S"((x86_reg)dstStride)\
  2220. -            : XMM_CLOBBERS("%xmm0", "%xmm1", "%xmm2", "%xmm3", \
  2221. -                           "%xmm4", "%xmm5", "%xmm6", "%xmm7",)\
  2222. -              "memory"\
  2223. -        );\
  2224. -    }\
  2225. -}
  2226. -
  2227. -#define QPEL_H264_HV_XMM(OPNAME, OP, MMX)\
  2228. -static av_noinline void OPNAME ## h264_qpel8or16_hv_lowpass_ ## MMX(uint8_t *dst, int16_t *tmp, uint8_t *src, int dstStride, int tmpStride, int srcStride, int size){\
  2229. -          put_h264_qpel8or16_hv1_lowpass_sse2(tmp, src, tmpStride, srcStride, size);\
  2230. -    OPNAME ## h264_qpel8or16_hv2_lowpass_ ## MMX(dst, tmp, dstStride, tmpStride, size);\
  2231. -}\
  2232. -static void OPNAME ## h264_qpel8_hv_lowpass_ ## MMX(uint8_t *dst, int16_t *tmp, uint8_t *src, int dstStride, int tmpStride, int srcStride){\
  2233. -    OPNAME ## h264_qpel8or16_hv_lowpass_ ## MMX(dst, tmp, src, dstStride, tmpStride, srcStride, 8);\
  2234. -}\
  2235. -static void OPNAME ## h264_qpel16_hv_lowpass_ ## MMX(uint8_t *dst, int16_t *tmp, uint8_t *src, int dstStride, int tmpStride, int srcStride){\
  2236. -    OPNAME ## h264_qpel8or16_hv_lowpass_ ## MMX(dst, tmp, src, dstStride, tmpStride, srcStride, 16);\
  2237. -}\
  2238. -
  2239. -#define put_pixels8_l2_sse2 put_pixels8_l2_mmx2
  2240. -#define avg_pixels8_l2_sse2 avg_pixels8_l2_mmx2
  2241. -#define put_pixels16_l2_sse2 put_pixels16_l2_mmx2
  2242. -#define avg_pixels16_l2_sse2 avg_pixels16_l2_mmx2
  2243. -#define put_pixels8_l2_ssse3 put_pixels8_l2_mmx2
  2244. -#define avg_pixels8_l2_ssse3 avg_pixels8_l2_mmx2
  2245. -#define put_pixels16_l2_ssse3 put_pixels16_l2_mmx2
  2246. -#define avg_pixels16_l2_ssse3 avg_pixels16_l2_mmx2
  2247. -
  2248. -#define put_pixels8_l2_shift5_sse2 put_pixels8_l2_shift5_mmx2
  2249. -#define avg_pixels8_l2_shift5_sse2 avg_pixels8_l2_shift5_mmx2
  2250. -#define put_pixels16_l2_shift5_sse2 put_pixels16_l2_shift5_mmx2
  2251. -#define avg_pixels16_l2_shift5_sse2 avg_pixels16_l2_shift5_mmx2
  2252. -#define put_pixels8_l2_shift5_ssse3 put_pixels8_l2_shift5_mmx2
  2253. -#define avg_pixels8_l2_shift5_ssse3 avg_pixels8_l2_shift5_mmx2
  2254. -#define put_pixels16_l2_shift5_ssse3 put_pixels16_l2_shift5_mmx2
  2255. -#define avg_pixels16_l2_shift5_ssse3 avg_pixels16_l2_shift5_mmx2
  2256. -
  2257. -#define put_h264_qpel8_h_lowpass_l2_sse2 put_h264_qpel8_h_lowpass_l2_mmx2
  2258. -#define avg_h264_qpel8_h_lowpass_l2_sse2 avg_h264_qpel8_h_lowpass_l2_mmx2
  2259. -#define put_h264_qpel16_h_lowpass_l2_sse2 put_h264_qpel16_h_lowpass_l2_mmx2
  2260. -#define avg_h264_qpel16_h_lowpass_l2_sse2 avg_h264_qpel16_h_lowpass_l2_mmx2
  2261. -
  2262. -#define put_h264_qpel8_v_lowpass_ssse3 put_h264_qpel8_v_lowpass_sse2
  2263. -#define avg_h264_qpel8_v_lowpass_ssse3 avg_h264_qpel8_v_lowpass_sse2
  2264. -#define put_h264_qpel16_v_lowpass_ssse3 put_h264_qpel16_v_lowpass_sse2
  2265. -#define avg_h264_qpel16_v_lowpass_ssse3 avg_h264_qpel16_v_lowpass_sse2
  2266. -
  2267. -#define put_h264_qpel8or16_hv2_lowpass_sse2 put_h264_qpel8or16_hv2_lowpass_mmx2
  2268. -#define avg_h264_qpel8or16_hv2_lowpass_sse2 avg_h264_qpel8or16_hv2_lowpass_mmx2
  2269. -
  2270. -#define H264_MC(OPNAME, SIZE, MMX, ALIGN) \
  2271. -H264_MC_C(OPNAME, SIZE, MMX, ALIGN)\
  2272. -H264_MC_V(OPNAME, SIZE, MMX, ALIGN)\
  2273. -H264_MC_H(OPNAME, SIZE, MMX, ALIGN)\
  2274. -H264_MC_HV(OPNAME, SIZE, MMX, ALIGN)\
  2275. -
  2276. -static void put_h264_qpel16_mc00_sse2 (uint8_t *dst, uint8_t *src, int stride){
  2277. -    put_pixels16_sse2(dst, src, stride, 16);
  2278. -}
  2279. -static void avg_h264_qpel16_mc00_sse2 (uint8_t *dst, uint8_t *src, int stride){
  2280. -    avg_pixels16_sse2(dst, src, stride, 16);
  2281. -}
  2282. -#define put_h264_qpel8_mc00_sse2 put_h264_qpel8_mc00_mmx2
  2283. -#define avg_h264_qpel8_mc00_sse2 avg_h264_qpel8_mc00_mmx2
  2284. -
  2285. -#define H264_MC_C(OPNAME, SIZE, MMX, ALIGN) \
  2286. -static void OPNAME ## h264_qpel ## SIZE ## _mc00_ ## MMX (uint8_t *dst, uint8_t *src, int stride){\
  2287. -    OPNAME ## pixels ## SIZE ## _ ## MMX(dst, src, stride, SIZE);\
  2288. -}\
  2289. -
  2290. -#define H264_MC_H(OPNAME, SIZE, MMX, ALIGN) \
  2291. -static void OPNAME ## h264_qpel ## SIZE ## _mc10_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\
  2292. -    OPNAME ## h264_qpel ## SIZE ## _h_lowpass_l2_ ## MMX(dst, src, src, stride, stride);\
  2293. -}\
  2294. -\
  2295. -static void OPNAME ## h264_qpel ## SIZE ## _mc20_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\
  2296. -    OPNAME ## h264_qpel ## SIZE ## _h_lowpass_ ## MMX(dst, src, stride, stride);\
  2297. -}\
  2298. -\
  2299. -static void OPNAME ## h264_qpel ## SIZE ## _mc30_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\
  2300. -    OPNAME ## h264_qpel ## SIZE ## _h_lowpass_l2_ ## MMX(dst, src, src+1, stride, stride);\
  2301. -}\
  2302. -
  2303. -#define H264_MC_V(OPNAME, SIZE, MMX, ALIGN) \
  2304. -static void OPNAME ## h264_qpel ## SIZE ## _mc01_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\
  2305. -    DECLARE_ALIGNED(ALIGN, uint8_t, temp)[SIZE*SIZE];\
  2306. -    put_h264_qpel ## SIZE ## _v_lowpass_ ## MMX(temp, src, SIZE, stride);\
  2307. -    OPNAME ## pixels ## SIZE ## _l2_ ## MMX(dst, src, temp, stride, stride, SIZE);\
  2308. -}\
  2309. -\
  2310. -static void OPNAME ## h264_qpel ## SIZE ## _mc02_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\
  2311. -    OPNAME ## h264_qpel ## SIZE ## _v_lowpass_ ## MMX(dst, src, stride, stride);\
  2312. -}\
  2313. -\
  2314. -static void OPNAME ## h264_qpel ## SIZE ## _mc03_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\
  2315. -    DECLARE_ALIGNED(ALIGN, uint8_t, temp)[SIZE*SIZE];\
  2316. -    put_h264_qpel ## SIZE ## _v_lowpass_ ## MMX(temp, src, SIZE, stride);\
  2317. -    OPNAME ## pixels ## SIZE ## _l2_ ## MMX(dst, src+stride, temp, stride, stride, SIZE);\
  2318. -}\
  2319. -
  2320. -#define H264_MC_HV(OPNAME, SIZE, MMX, ALIGN) \
  2321. -static void OPNAME ## h264_qpel ## SIZE ## _mc11_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\
  2322. -    DECLARE_ALIGNED(ALIGN, uint8_t, temp)[SIZE*SIZE];\
  2323. -    put_h264_qpel ## SIZE ## _v_lowpass_ ## MMX(temp, src, SIZE, stride);\
  2324. -    OPNAME ## h264_qpel ## SIZE ## _h_lowpass_l2_ ## MMX(dst, src, temp, stride, SIZE);\
  2325. -}\
  2326. -\
  2327. -static void OPNAME ## h264_qpel ## SIZE ## _mc31_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\
  2328. -    DECLARE_ALIGNED(ALIGN, uint8_t, temp)[SIZE*SIZE];\
  2329. -    put_h264_qpel ## SIZE ## _v_lowpass_ ## MMX(temp, src+1, SIZE, stride);\
  2330. -    OPNAME ## h264_qpel ## SIZE ## _h_lowpass_l2_ ## MMX(dst, src, temp, stride, SIZE);\
  2331. -}\
  2332. -\
  2333. -static void OPNAME ## h264_qpel ## SIZE ## _mc13_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\
  2334. -    DECLARE_ALIGNED(ALIGN, uint8_t, temp)[SIZE*SIZE];\
  2335. -    put_h264_qpel ## SIZE ## _v_lowpass_ ## MMX(temp, src, SIZE, stride);\
  2336. -    OPNAME ## h264_qpel ## SIZE ## _h_lowpass_l2_ ## MMX(dst, src+stride, temp, stride, SIZE);\
  2337. -}\
  2338. -\
  2339. -static void OPNAME ## h264_qpel ## SIZE ## _mc33_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\
  2340. -    DECLARE_ALIGNED(ALIGN, uint8_t, temp)[SIZE*SIZE];\
  2341. -    put_h264_qpel ## SIZE ## _v_lowpass_ ## MMX(temp, src+1, SIZE, stride);\
  2342. -    OPNAME ## h264_qpel ## SIZE ## _h_lowpass_l2_ ## MMX(dst, src+stride, temp, stride, SIZE);\
  2343. -}\
  2344. -\
  2345. -static void OPNAME ## h264_qpel ## SIZE ## _mc22_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\
  2346. -    DECLARE_ALIGNED(ALIGN, uint16_t, temp)[SIZE*(SIZE<8?12:24)];\
  2347. -    OPNAME ## h264_qpel ## SIZE ## _hv_lowpass_ ## MMX(dst, temp, src, stride, SIZE, stride);\
  2348. -}\
  2349. -\
  2350. -static void OPNAME ## h264_qpel ## SIZE ## _mc21_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\
  2351. -    DECLARE_ALIGNED(ALIGN, uint8_t, temp)[SIZE*(SIZE<8?12:24)*2 + SIZE*SIZE];\
  2352. -    uint8_t * const halfHV= temp;\
  2353. -    int16_t * const halfV= (int16_t*)(temp + SIZE*SIZE);\
  2354. -    assert(((int)temp & 7) == 0);\
  2355. -    put_h264_qpel ## SIZE ## _hv_lowpass_ ## MMX(halfHV, halfV, src, SIZE, SIZE, stride);\
  2356. -    OPNAME ## h264_qpel ## SIZE ## _h_lowpass_l2_ ## MMX(dst, src, halfHV, stride, SIZE);\
  2357. -}\
  2358. -\
  2359. -static void OPNAME ## h264_qpel ## SIZE ## _mc23_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\
  2360. -    DECLARE_ALIGNED(ALIGN, uint8_t, temp)[SIZE*(SIZE<8?12:24)*2 + SIZE*SIZE];\
  2361. -    uint8_t * const halfHV= temp;\
  2362. -    int16_t * const halfV= (int16_t*)(temp + SIZE*SIZE);\
  2363. -    assert(((int)temp & 7) == 0);\
  2364. -    put_h264_qpel ## SIZE ## _hv_lowpass_ ## MMX(halfHV, halfV, src, SIZE, SIZE, stride);\
  2365. -    OPNAME ## h264_qpel ## SIZE ## _h_lowpass_l2_ ## MMX(dst, src+stride, halfHV, stride, SIZE);\
  2366. -}\
  2367. -\
  2368. -static void OPNAME ## h264_qpel ## SIZE ## _mc12_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\
  2369. -    DECLARE_ALIGNED(ALIGN, uint8_t, temp)[SIZE*(SIZE<8?12:24)*2 + SIZE*SIZE];\
  2370. -    uint8_t * const halfHV= temp;\
  2371. -    int16_t * const halfV= (int16_t*)(temp + SIZE*SIZE);\
  2372. -    assert(((int)temp & 7) == 0);\
  2373. -    put_h264_qpel ## SIZE ## _hv_lowpass_ ## MMX(halfHV, halfV, src, SIZE, SIZE, stride);\
  2374. -    OPNAME ## pixels ## SIZE ## _l2_shift5_ ## MMX(dst, halfV+2, halfHV, stride, SIZE, SIZE);\
  2375. -}\
  2376. -\
  2377. -static void OPNAME ## h264_qpel ## SIZE ## _mc32_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\
  2378. -    DECLARE_ALIGNED(ALIGN, uint8_t, temp)[SIZE*(SIZE<8?12:24)*2 + SIZE*SIZE];\
  2379. -    uint8_t * const halfHV= temp;\
  2380. -    int16_t * const halfV= (int16_t*)(temp + SIZE*SIZE);\
  2381. -    assert(((int)temp & 7) == 0);\
  2382. -    put_h264_qpel ## SIZE ## _hv_lowpass_ ## MMX(halfHV, halfV, src, SIZE, SIZE, stride);\
  2383. -    OPNAME ## pixels ## SIZE ## _l2_shift5_ ## MMX(dst, halfV+3, halfHV, stride, SIZE, SIZE);\
  2384. -}\
  2385. -
  2386. -#define H264_MC_4816(MMX)\
  2387. -H264_MC(put_, 4, MMX, 8)\
  2388. -H264_MC(put_, 8, MMX, 8)\
  2389. -H264_MC(put_, 16,MMX, 8)\
  2390. -H264_MC(avg_, 4, MMX, 8)\
  2391. -H264_MC(avg_, 8, MMX, 8)\
  2392. -H264_MC(avg_, 16,MMX, 8)\
  2393. -
  2394. -#define H264_MC_816(QPEL, XMM)\
  2395. -QPEL(put_, 8, XMM, 16)\
  2396. -QPEL(put_, 16,XMM, 16)\
  2397. -QPEL(avg_, 8, XMM, 16)\
  2398. -QPEL(avg_, 16,XMM, 16)\
  2399. -
  2400. -
  2401. -#define AVG_3DNOW_OP(a,b,temp, size) \
  2402. -"mov" #size " " #b ", " #temp "   \n\t"\
  2403. -"pavgusb " #temp ", " #a "        \n\t"\
  2404. -"mov" #size " " #a ", " #b "      \n\t"
  2405. -#define AVG_MMX2_OP(a,b,temp, size) \
  2406. -"mov" #size " " #b ", " #temp "   \n\t"\
  2407. -"pavgb " #temp ", " #a "          \n\t"\
  2408. -"mov" #size " " #a ", " #b "      \n\t"
  2409. -
  2410. -#define PAVGB "pavgusb"
  2411. -QPEL_H264(put_,       PUT_OP, 3dnow)
  2412. -QPEL_H264(avg_, AVG_3DNOW_OP, 3dnow)
  2413. -#undef PAVGB
  2414. -#define PAVGB "pavgb"
  2415. -QPEL_H264(put_,       PUT_OP, mmx2)
  2416. -QPEL_H264(avg_,  AVG_MMX2_OP, mmx2)
  2417. -QPEL_H264_V_XMM(put_,       PUT_OP, sse2)
  2418. -QPEL_H264_V_XMM(avg_,  AVG_MMX2_OP, sse2)
  2419. -QPEL_H264_HV_XMM(put_,       PUT_OP, sse2)
  2420. -QPEL_H264_HV_XMM(avg_,  AVG_MMX2_OP, sse2)
  2421. -#if HAVE_SSSE3
  2422. -QPEL_H264_H_XMM(put_,       PUT_OP, ssse3)
  2423. -QPEL_H264_H_XMM(avg_,  AVG_MMX2_OP, ssse3)
  2424. -QPEL_H264_HV2_XMM(put_,       PUT_OP, ssse3)
  2425. -QPEL_H264_HV2_XMM(avg_,  AVG_MMX2_OP, ssse3)
  2426. -QPEL_H264_HV_XMM(put_,       PUT_OP, ssse3)
  2427. -QPEL_H264_HV_XMM(avg_,  AVG_MMX2_OP, ssse3)
  2428. -#endif
  2429. -#undef PAVGB
  2430. -
  2431. -H264_MC_4816(3dnow)
  2432. -H264_MC_4816(mmx2)
  2433. -H264_MC_816(H264_MC_V, sse2)
  2434. -H264_MC_816(H264_MC_HV, sse2)
  2435. -#if HAVE_SSSE3
  2436. -H264_MC_816(H264_MC_H, ssse3)
  2437. -H264_MC_816(H264_MC_HV, ssse3)
  2438. -#endif
  2439. -
  2440. -
  2441. -
  2442.  //10bit
  2443.  #define LUMA_MC_OP(OP, NUM, DEPTH, TYPE, OPT) \
  2444. -void ff_ ## OP ## _h264_qpel ## NUM ## _ ## TYPE ## _ ## DEPTH ## _ ## OPT \
  2445. +void ff_ ## OP ## _h264_qpel ## NUM ## _ ## TYPE ## DEPTH ## _ ## OPT \
  2446.      (uint8_t *dst, uint8_t *src, int stride);
  2447.  
  2448.  #define LUMA_MC_ALL(DEPTH, TYPE, OPT) \
  2449. @@ -1222,78 +40,147 @@ void ff_ ## OP ## _h264_qpel ## NUM ## _ ## TYPE ## _ ## DEPTH ## _ ## OPT \
  2450.      LUMA_MC_OP(put, 16, DEPTH, TYPE, OPT) \
  2451.      LUMA_MC_OP(avg, 16, DEPTH, TYPE, OPT)
  2452.  
  2453. -LUMA_MC_ALL(10, mc00, mmxext)
  2454. -LUMA_MC_ALL(10, mc10, mmxext)
  2455. -LUMA_MC_ALL(10, mc20, mmxext)
  2456. -LUMA_MC_ALL(10, mc30, mmxext)
  2457. -LUMA_MC_ALL(10, mc01, mmxext)
  2458. -LUMA_MC_ALL(10, mc11, mmxext)
  2459. -LUMA_MC_ALL(10, mc21, mmxext)
  2460. -LUMA_MC_ALL(10, mc31, mmxext)
  2461. -LUMA_MC_ALL(10, mc02, mmxext)
  2462. -LUMA_MC_ALL(10, mc12, mmxext)
  2463. -LUMA_MC_ALL(10, mc22, mmxext)
  2464. -LUMA_MC_ALL(10, mc32, mmxext)
  2465. -LUMA_MC_ALL(10, mc03, mmxext)
  2466. -LUMA_MC_ALL(10, mc13, mmxext)
  2467. -LUMA_MC_ALL(10, mc23, mmxext)
  2468. -LUMA_MC_ALL(10, mc33, mmxext)
  2469. -
  2470. -LUMA_MC_816(10, mc00, sse2)
  2471. -LUMA_MC_816(10, mc10, sse2)
  2472. -LUMA_MC_816(10, mc10, sse2_cache64)
  2473. -LUMA_MC_816(10, mc10, ssse3_cache64)
  2474. -LUMA_MC_816(10, mc20, sse2)
  2475. -LUMA_MC_816(10, mc20, sse2_cache64)
  2476. -LUMA_MC_816(10, mc20, ssse3_cache64)
  2477. -LUMA_MC_816(10, mc30, sse2)
  2478. -LUMA_MC_816(10, mc30, sse2_cache64)
  2479. -LUMA_MC_816(10, mc30, ssse3_cache64)
  2480. -LUMA_MC_816(10, mc01, sse2)
  2481. -LUMA_MC_816(10, mc11, sse2)
  2482. -LUMA_MC_816(10, mc21, sse2)
  2483. -LUMA_MC_816(10, mc31, sse2)
  2484. -LUMA_MC_816(10, mc02, sse2)
  2485. -LUMA_MC_816(10, mc12, sse2)
  2486. -LUMA_MC_816(10, mc22, sse2)
  2487. -LUMA_MC_816(10, mc32, sse2)
  2488. -LUMA_MC_816(10, mc03, sse2)
  2489. -LUMA_MC_816(10, mc13, sse2)
  2490. -LUMA_MC_816(10, mc23, sse2)
  2491. -LUMA_MC_816(10, mc33, sse2)
  2492. -
  2493. -#define QPEL16_OPMC(OP, MC, MMX)\
  2494. -void ff_ ## OP ## _h264_qpel16_ ## MC ## _10_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\
  2495. -    ff_ ## OP ## _h264_qpel8_ ## MC ## _10_ ## MMX(dst   , src   , stride);\
  2496. -    ff_ ## OP ## _h264_qpel8_ ## MC ## _10_ ## MMX(dst+16, src+16, stride);\
  2497. +LUMA_MC_ALL(, mc00, mmxext)
  2498. +LUMA_MC_ALL(, mc01, mmxext)
  2499. +LUMA_MC_ALL(, mc02, mmxext)
  2500. +LUMA_MC_ALL(, mc03, mmxext)
  2501. +LUMA_MC_ALL(, mc10, mmxext)
  2502. +LUMA_MC_ALL(, mc11, mmxext)
  2503. +LUMA_MC_ALL(, mc12, mmxext)
  2504. +LUMA_MC_ALL(, mc13, mmxext)
  2505. +LUMA_MC_ALL(, mc20, mmxext)
  2506. +LUMA_MC_ALL(, mc21, mmxext)
  2507. +LUMA_MC_ALL(, mc22, mmxext)
  2508. +LUMA_MC_ALL(, mc23, mmxext)
  2509. +LUMA_MC_ALL(, mc30, mmxext)
  2510. +LUMA_MC_ALL(, mc31, mmxext)
  2511. +LUMA_MC_ALL(, mc32, mmxext)
  2512. +LUMA_MC_ALL(, mc33, mmxext)
  2513. +
  2514. +#define ff_put_h264_qpel8_mc00_sse2 ff_put_h264_qpel8_mc00_mmxext
  2515. +#define ff_avg_h264_qpel8_mc00_sse2 ff_avg_h264_qpel8_mc00_mmxext
  2516. +LUMA_MC_OP(put, 16, , mc00, sse2)
  2517. +LUMA_MC_OP(avg, 16, , mc00, sse2)
  2518. +LUMA_MC_ALL(, mc01, sse2)
  2519. +LUMA_MC_ALL(, mc02, sse2)
  2520. +LUMA_MC_ALL(, mc03, sse2)
  2521. +LUMA_MC_ALL(, mc10, sse2)
  2522. +LUMA_MC_ALL(, mc11, sse2)
  2523. +LUMA_MC_ALL(, mc12, sse2)
  2524. +LUMA_MC_ALL(, mc13, sse2)
  2525. +LUMA_MC_ALL(, mc20, sse2)
  2526. +LUMA_MC_ALL(, mc21, sse2)
  2527. +LUMA_MC_ALL(, mc22, sse2)
  2528. +LUMA_MC_ALL(, mc23, sse2)
  2529. +LUMA_MC_ALL(, mc30, sse2)
  2530. +LUMA_MC_ALL(, mc31, sse2)
  2531. +LUMA_MC_ALL(, mc32, sse2)
  2532. +LUMA_MC_ALL(, mc33, sse2)
  2533. +
  2534. +LUMA_MC_ALL(_10, mc00, mmxext)
  2535. +LUMA_MC_ALL(_10, mc10, mmxext)
  2536. +LUMA_MC_ALL(_10, mc20, mmxext)
  2537. +LUMA_MC_ALL(_10, mc30, mmxext)
  2538. +LUMA_MC_ALL(_10, mc01, mmxext)
  2539. +LUMA_MC_ALL(_10, mc11, mmxext)
  2540. +LUMA_MC_ALL(_10, mc21, mmxext)
  2541. +LUMA_MC_ALL(_10, mc31, mmxext)
  2542. +LUMA_MC_ALL(_10, mc02, mmxext)
  2543. +LUMA_MC_ALL(_10, mc12, mmxext)
  2544. +LUMA_MC_ALL(_10, mc22, mmxext)
  2545. +LUMA_MC_ALL(_10, mc32, mmxext)
  2546. +LUMA_MC_ALL(_10, mc03, mmxext)
  2547. +LUMA_MC_ALL(_10, mc13, mmxext)
  2548. +LUMA_MC_ALL(_10, mc23, mmxext)
  2549. +LUMA_MC_ALL(_10, mc33, mmxext)
  2550. +
  2551. +LUMA_MC_816(_10, mc00, sse2)
  2552. +LUMA_MC_816(_10, mc10, sse2)
  2553. +LUMA_MC_816(_10, mc10, sse2_cache64)
  2554. +LUMA_MC_816(_10, mc10, ssse3_cache64)
  2555. +LUMA_MC_816(_10, mc20, sse2)
  2556. +LUMA_MC_816(_10, mc20, sse2_cache64)
  2557. +LUMA_MC_816(_10, mc20, ssse3_cache64)
  2558. +LUMA_MC_816(_10, mc30, sse2)
  2559. +LUMA_MC_816(_10, mc30, sse2_cache64)
  2560. +LUMA_MC_816(_10, mc30, ssse3_cache64)
  2561. +LUMA_MC_816(_10, mc01, sse2)
  2562. +LUMA_MC_816(_10, mc11, sse2)
  2563. +LUMA_MC_816(_10, mc21, sse2)
  2564. +LUMA_MC_816(_10, mc31, sse2)
  2565. +LUMA_MC_816(_10, mc02, sse2)
  2566. +LUMA_MC_816(_10, mc12, sse2)
  2567. +LUMA_MC_816(_10, mc22, sse2)
  2568. +LUMA_MC_816(_10, mc32, sse2)
  2569. +LUMA_MC_816(_10, mc03, sse2)
  2570. +LUMA_MC_816(_10, mc13, sse2)
  2571. +LUMA_MC_816(_10, mc23, sse2)
  2572. +LUMA_MC_816(_10, mc33, sse2)
  2573. +
  2574. +#define QPEL16_OPMC(OP, MC, MMX, DEPTH, OFFSET)\
  2575. +void ff_ ## OP ## _h264_qpel16_ ## MC ## DEPTH ## _ ## MMX(uint8_t *dst, uint8_t *src, int stride){\
  2576. +    ff_ ## OP ## _h264_qpel8_ ## MC ## DEPTH ## _ ## MMX(dst   , src   , stride);\
  2577. +    ff_ ## OP ## _h264_qpel8_ ## MC ## DEPTH ## _ ## MMX(dst+OFFSET, src+OFFSET, stride);\
  2578.      src += 8*stride;\
  2579.      dst += 8*stride;\
  2580. -    ff_ ## OP ## _h264_qpel8_ ## MC ## _10_ ## MMX(dst   , src   , stride);\
  2581. -    ff_ ## OP ## _h264_qpel8_ ## MC ## _10_ ## MMX(dst+16, src+16, stride);\
  2582. +    ff_ ## OP ## _h264_qpel8_ ## MC ## DEPTH ## _ ## MMX(dst   , src   , stride);\
  2583. +    ff_ ## OP ## _h264_qpel8_ ## MC ## DEPTH ## _ ## MMX(dst+OFFSET, src+OFFSET, stride);\
  2584.  }
  2585.  
  2586. -#define QPEL16_OP(MC, MMX)\
  2587. -QPEL16_OPMC(put, MC, MMX)\
  2588. -QPEL16_OPMC(avg, MC, MMX)
  2589. -
  2590. -#define QPEL16(MMX)\
  2591. -QPEL16_OP(mc00, MMX)\
  2592. -QPEL16_OP(mc01, MMX)\
  2593. -QPEL16_OP(mc02, MMX)\
  2594. -QPEL16_OP(mc03, MMX)\
  2595. -QPEL16_OP(mc10, MMX)\
  2596. -QPEL16_OP(mc11, MMX)\
  2597. -QPEL16_OP(mc12, MMX)\
  2598. -QPEL16_OP(mc13, MMX)\
  2599. -QPEL16_OP(mc20, MMX)\
  2600. -QPEL16_OP(mc21, MMX)\
  2601. -QPEL16_OP(mc22, MMX)\
  2602. -QPEL16_OP(mc23, MMX)\
  2603. -QPEL16_OP(mc30, MMX)\
  2604. -QPEL16_OP(mc31, MMX)\
  2605. -QPEL16_OP(mc32, MMX)\
  2606. -QPEL16_OP(mc33, MMX)
  2607. +#define QPEL16_OP(MC, MMX, DEPTH, OFFSET)\
  2608. +QPEL16_OPMC(put, MC, MMX, DEPTH, OFFSET)\
  2609. +QPEL16_OPMC(avg, MC, MMX, DEPTH, OFFSET)
  2610. +
  2611. +#define QPEL16(MMX, DEPTH, OFFSET)\
  2612. +QPEL16_OP(mc00, MMX, DEPTH, OFFSET)\
  2613. +QPEL16_OP(mc01, MMX, DEPTH, OFFSET)\
  2614. +QPEL16_OP(mc02, MMX, DEPTH, OFFSET)\
  2615. +QPEL16_OP(mc03, MMX, DEPTH, OFFSET)\
  2616. +QPEL16_OP(mc10, MMX, DEPTH, OFFSET)\
  2617. +QPEL16_OP(mc11, MMX, DEPTH, OFFSET)\
  2618. +QPEL16_OP(mc12, MMX, DEPTH, OFFSET)\
  2619. +QPEL16_OP(mc13, MMX, DEPTH, OFFSET)\
  2620. +QPEL16_OP(mc20, MMX, DEPTH, OFFSET)\
  2621. +QPEL16_OP(mc21, MMX, DEPTH, OFFSET)\
  2622. +QPEL16_OP(mc22, MMX, DEPTH, OFFSET)\
  2623. +QPEL16_OP(mc23, MMX, DEPTH, OFFSET)\
  2624. +QPEL16_OP(mc30, MMX, DEPTH, OFFSET)\
  2625. +QPEL16_OP(mc31, MMX, DEPTH, OFFSET)\
  2626. +QPEL16_OP(mc32, MMX, DEPTH, OFFSET)\
  2627. +QPEL16_OP(mc33, MMX, DEPTH, OFFSET)
  2628.  
  2629.  #if ARCH_X86_32 && HAVE_YASM // ARCH_X86_64 implies sse2+
  2630. -QPEL16(mmxext)
  2631. +QPEL16(mmxext, _10, 16)
  2632. +
  2633. +QPEL16(mmxext, , 8)
  2634.  #endif
  2635. +
  2636. +#define H264_MC_TMP(OPNAME, MC, SIZE, MMX) \
  2637. +static void OPNAME ## _h264_qpel ## SIZE ## _ ## MC ## _ ## MMX (uint8_t *dst, uint8_t *src, int stride){\
  2638. +    ff_ ## OPNAME ## _h264_qpel ## SIZE ## _ ## MC ## _ ## MMX(dst,src,stride);\
  2639. +}\
  2640. +
  2641. +#define H264_MC_TMP_ALL(MC, MMX) \
  2642. +H264_MC_TMP(put, MC,  4, MMX);\
  2643. +H264_MC_TMP(avg, MC,  4, MMX);\
  2644. +H264_MC_TMP(put, MC,  8, MMX);\
  2645. +H264_MC_TMP(avg, MC,  8, MMX);\
  2646. +H264_MC_TMP(put, MC, 16, MMX);\
  2647. +H264_MC_TMP(avg, MC, 16, MMX);
  2648. +
  2649. +H264_MC_TMP_ALL(mc00, mmxext)
  2650. +H264_MC_TMP_ALL(mc01, mmxext)
  2651. +H264_MC_TMP_ALL(mc02, mmxext)
  2652. +H264_MC_TMP_ALL(mc03, mmxext)
  2653. +H264_MC_TMP_ALL(mc10, mmxext)
  2654. +H264_MC_TMP_ALL(mc11, mmxext)
  2655. +H264_MC_TMP_ALL(mc12, mmxext)
  2656. +H264_MC_TMP_ALL(mc13, mmxext)
  2657. +H264_MC_TMP_ALL(mc20, mmxext)
  2658. +H264_MC_TMP_ALL(mc21, mmxext)
  2659. +H264_MC_TMP_ALL(mc22, mmxext)
  2660. +H264_MC_TMP_ALL(mc23, mmxext)
  2661. +H264_MC_TMP_ALL(mc30, mmxext)
  2662. +H264_MC_TMP_ALL(mc31, mmxext)
  2663. +H264_MC_TMP_ALL(mc32, mmxext)
  2664. +H264_MC_TMP_ALL(mc33, mmxext)
  2665. --
  2666. 1.7.5.1
Add Comment
Please, Sign In to add comment