Guest User

Untitled

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