Advertisement
Guest User

Untitled

a guest
Sep 24th, 2017
719
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 41.97 KB | None | 0 0
  1. From 39d579269603036f388628cfa19a5abbc9012fb0 Mon Sep 17 00:00:00 2001
  2. From: Daniel Kang <daniel.d.kang@gmail.com>
  3. Date: Mon, 11 Jul 2011 13:48:40 -0400
  4. Subject: [PATCH] H.264: Add optimizations to predict x86 assembly.
  5.  
  6. ---
  7. libavcodec/x86/h264_intrapred.asm       |    5 +-
  8.  libavcodec/x86/h264_intrapred_10bit.asm |  933 +++++++++++++------------------
  9.  libavcodec/x86/h264_intrapred_init.c    |   29 +-
  10.  3 files changed, 417 insertions(+), 550 deletions(-)
  11.  
  12. diff --git a/libavcodec/x86/h264_intrapred.asm b/libavcodec/x86/h264_intrapred.asm
  13. index cbf3cf7..c1cd5c4 100644
  14. --- a/libavcodec/x86/h264_intrapred.asm
  15. +++ b/libavcodec/x86/h264_intrapred.asm
  16. @@ -2611,12 +2611,11 @@ cglobal pred4x4_down_left_mmxext, 3,3
  17.      punpckldq m1, [r1]
  18.      movq      m2, m1
  19.      movq      m3, m1
  20. -    movq      m4, m1
  21.      psllq     m1, 8
  22.      pxor      m2, m1
  23.      psrlq     m2, 8
  24. -    pxor      m3, m2
  25. -    PRED4x4_LOWPASS m0, m1, m3, m4, m5
  26. +    pxor      m2, m3
  27. +    PRED4x4_LOWPASS m0, m1, m2, m3, m4
  28.      lea       r1, [r0+r2*2]
  29.      psrlq     m0, 8
  30.      movd      [r0+r2*1], m0
  31. diff --git a/libavcodec/x86/h264_intrapred_10bit.asm b/libavcodec/x86/h264_intrapred_10bit.asm
  32. index 24a7bfa..5da7ee5 100644
  33. --- a/libavcodec/x86/h264_intrapred_10bit.asm
  34. +++ b/libavcodec/x86/h264_intrapred_10bit.asm
  35. @@ -27,8 +27,6 @@
  36.  
  37.  SECTION_RODATA
  38.  
  39. -SECTION .text
  40. -
  41.  cextern pw_16
  42.  cextern pw_8
  43.  cextern pw_4
  44. @@ -42,6 +40,8 @@ pw_512:       times 8 dw 512
  45.  pd_17:        times 4 dd 17
  46.  pd_16:        times 4 dd 16
  47.  
  48. +SECTION .text
  49. +
  50.  ; dest, left, right, src
  51.  ; output: %1 = (t[n-1] + t[n]*2 + t[n+1] + 2) >> 2
  52.  %macro PRED4x4_LOWPASS 4
  53. @@ -64,13 +64,11 @@ cglobal pred4x4_down_right_10_%1, 3,3
  54.      movq      m3, [r0]
  55.      punpckhdq m1, m2
  56.      PALIGNR   m3, m1, 10, m1
  57. -    mova      m1, m3
  58.      movhps    m4, [r1+r2*1-8]
  59. -    PALIGNR   m3, m4, 14, m4
  60. -    mova      m2, m3
  61. +    PALIGNR   m0, m3, m4, 14, m4
  62.      movhps    m4, [r1+r2*2-8]
  63. -    PALIGNR   m3, m4, 14, m4
  64. -    PRED4x4_LOWPASS m0, m3, m1, m2
  65. +    PALIGNR   m2, m0, m4, 14, m4
  66. +    PRED4x4_LOWPASS m0, m2, m3, m0
  67.      movq      [r1+r2*2], m0
  68.      psrldq    m0, 2
  69.      movq      [r1+r2*1], m0
  70. @@ -104,22 +102,20 @@ cglobal pred4x4_vertical_right_10_%1, 3,3,6
  71.      pavgw   m5, m0
  72.      movhps  m1, [r0+r2*1-8]
  73.      PALIGNR m0, m1, 14, m1      ; ....t3t2t1t0ltl0
  74. -    mova    m1, m0
  75.      movhps  m2, [r0+r2*2-8]
  76. -    PALIGNR m0, m2, 14, m2      ; ..t3t2t1t0ltl0l1
  77. -    mova    m2, m0
  78. +    PALIGNR m1, m0, m2, 14, m2  ; ..t3t2t1t0ltl0l1
  79.      movhps  m3, [r1+r2*1-8]
  80. -    PALIGNR m0, m3, 14, m3      ; t3t2t1t0ltl0l1l2
  81. -    PRED4x4_LOWPASS m3, m1, m0, m2
  82. -    pslldq  m1, m3, 12
  83. -    psrldq  m3, 4
  84. +    PALIGNR m2, m1, m3, 14, m3  ; t3t2t1t0ltl0l1l2
  85. +    PRED4x4_LOWPASS m1, m0, m2, m1
  86. +    pslldq  m0, m1, 12
  87. +    psrldq  m1, 4
  88.      movq    [r0+r2*1], m5
  89. -    movq    [r0+r2*2], m3
  90. -    PALIGNR m5, m1, 14, m2
  91. -    pslldq  m1, 2
  92. +    movq    [r0+r2*2], m1
  93. +    PALIGNR m5, m0, 14, m2
  94. +    pslldq  m0, 2
  95.      movq    [r1+r2*1], m5
  96. -    PALIGNR m3, m1, 14, m1
  97. -    movq    [r1+r2*2], m3
  98. +    PALIGNR m1, m0, 14, m0
  99. +    movq    [r1+r2*2], m1
  100.      RET
  101.  %endmacro
  102.  
  103. @@ -152,9 +148,9 @@ cglobal pred4x4_horizontal_down_10_%1, 3,3
  104.      punpckhdq  m1, m2          ; l0 l1 l2 l3
  105.      punpckhqdq m1, m0          ; t2 t1 t0 lt l0 l1 l2 l3
  106.      psrldq     m0, m1, 4       ; .. .. t2 t1 t0 lt l0 l1
  107. -    psrldq     m2, m1, 2       ; .. t2 t1 t0 lt l0 l1 l2
  108. -    pavgw      m5, m1, m2
  109. -    PRED4x4_LOWPASS m3, m1, m0, m2
  110. +    psrldq     m3, m1, 2       ; .. t2 t1 t0 lt l0 l1 l2
  111. +    pavgw      m5, m1, m3
  112. +    PRED4x4_LOWPASS m3, m1, m0, m3
  113.      punpcklwd  m5, m3
  114.      psrldq     m3, 8
  115.      PALIGNR    m3, m5, 12, m4
  116. @@ -224,13 +220,12 @@ cglobal pred4x4_dc_10_mmxext, 3,3
  117.  %macro PRED4x4_DL 1
  118.  cglobal pred4x4_down_left_10_%1, 3,3
  119.      sub        r0, r2
  120. -    movq       m1, [r0]
  121. -    movhps     m1, [r1]
  122. -    pslldq     m5, m1, 2
  123. -    pxor       m2, m5, m1
  124. -    psrldq     m2, 2
  125. -    pxor       m3, m1, m2
  126. -    PRED4x4_LOWPASS m0, m5, m3, m1
  127. +    movq       m0, [r0]
  128. +    movhps     m0, [r1]
  129. +    psrldq     m2, m0, 2
  130. +    pslldq     m3, m0, 2
  131. +    pshufhw    m2, m2, 10100100b
  132. +    PRED4x4_LOWPASS m0, m3, m2, m0
  133.      lea        r1, [r0+r2*2]
  134.      movhps     [r1+r2*2], m0
  135.      psrldq     m0, 2
  136. @@ -257,10 +252,10 @@ cglobal pred4x4_vertical_left_10_%1, 3,3
  137.      sub        r0, r2
  138.      movu       m1, [r0]
  139.      movhps     m1, [r1]
  140. -    psrldq     m3, m1, 2
  141. +    psrldq     m0, m1, 2
  142.      psrldq     m2, m1, 4
  143. -    pavgw      m4, m3, m1
  144. -    PRED4x4_LOWPASS m0, m1, m2, m3
  145. +    pavgw      m4, m0, m1
  146. +    PRED4x4_LOWPASS m0, m1, m2, m0
  147.      lea        r1, [r0+r2*2]
  148.      movq       [r0+r2*1], m4
  149.      movq       [r0+r2*2], m0
  150. @@ -333,7 +328,7 @@ cglobal pred8x8_vertical_10_sse2, 2,2
  151.  ;-----------------------------------------------------------------------------
  152.  INIT_XMM
  153.  cglobal pred8x8_horizontal_10_sse2, 2,3
  154. -    mov          r2, 4
  155. +    mov         r2d, 4
  156.  .loop:
  157.      movq         m0, [r0+r1*0-8]
  158.      movq         m1, [r0+r1*1-8]
  159. @@ -344,7 +339,7 @@ cglobal pred8x8_horizontal_10_sse2, 2,3
  160.      mova  [r0+r1*0], m0
  161.      mova  [r0+r1*1], m1
  162.      lea          r0, [r0+r1*2]
  163. -    dec          r2
  164. +    dec          r2d
  165.      jg .loop
  166.      REP_RET
  167.  
  168. @@ -402,7 +397,7 @@ cglobal pred8x8_dc_10_%1, 2,4
  169.      punpcklwd   m2, m3
  170.      punpckldq   m0, m2            ; s0, s1, s2, s3
  171.      %2          m3, m0, 11110110b ; s2, s1, s3, s3
  172. -    lea         r2, [r1+r1*2]
  173. +    lea         r2, [r1*3]
  174.      %2          m0, m0, 01110100b ; s0, s1, s3, s1
  175.      paddw       m0, m3
  176.      lea         r3, [r0+r1*4]
  177. @@ -445,7 +440,7 @@ cglobal pred8x8_top_dc_10_%1, 2,4
  178.      movq        m1, [r0+8]
  179.      HADDW       m0, m2
  180.      HADDW       m1, m3
  181. -    lea         r2, [r1+r1*2]
  182. +    lea         r2, [r1*3]
  183.      paddw       m0, [pw_2]
  184.      paddw       m1, [pw_2]
  185.      lea         r3, [r0+r1*4]
  186. @@ -478,7 +473,7 @@ PRED8x8_TOP_DC sse2  , pshuflw
  187.  INIT_XMM
  188.  cglobal pred8x8_plane_10_sse2, 2,7,7
  189.      sub       r0, r1
  190. -    lea       r2, [r1+r1*2]
  191. +    lea       r2, [r1*3]
  192.      lea       r3, [r0+r1*4]
  193.      mova      m2, [r0]
  194.      pmaddwd   m2, [pw_m32101234]
  195. @@ -500,7 +495,7 @@ cglobal pred8x8_plane_10_sse2, 2,7,7
  196.      movzx    r5d, word [r3+r2*1-2] ; src[6*stride-1]
  197.      movzx    r6d, word [r0+r1*1-2] ; src[0*stride-1]
  198.      sub      r5d, r6d
  199. -    lea      r5d, [r5+r5*2]
  200. +    lea      r5d, [r5*3]
  201.      add      r4d, r5d
  202.      movzx    r6d, word [r3+r1*4-2] ; src[7*stride-1]
  203.      movzx    r5d, word [r0+r1*0-2] ; src[ -stride-1]
  204. @@ -541,7 +536,7 @@ cglobal pred8x8_plane_10_sse2, 2,7,7
  205.  %macro PRED8x8L_128_DC 1
  206.  cglobal pred8x8l_128_dc_10_%1, 4,4
  207.      mova      m0, [pw_512]
  208. -    lea       r1, [r3+r3*2]
  209. +    lea       r1, [r3*3]
  210.      lea       r2, [r0+r3*4]
  211.      MOV8 r0+r3*0, m0, m0
  212.      MOV8 r0+r3*1, m0, m0
  213. @@ -562,38 +557,69 @@ PRED8x8L_128_DC sse2
  214.  ;-----------------------------------------------------------------------------
  215.  ; void pred8x8l_top_dc(pixel *src, int has_topleft, int has_topright, int stride)
  216.  ;-----------------------------------------------------------------------------
  217. +%macro FIX_LT_2 3-4
  218. +%ifidn %1,sse4
  219. +    pblendw  %2, %3, 00000001b
  220. +%elifidn %1,avx
  221. +    pblendw  %2, %3, 00000001b
  222. +%else
  223. +    mova     %4, %3
  224. +    pxor     %4, %2
  225. +    pslldq   %4, 14
  226. +    psrldq   %4, 14
  227. +    pxor     %2, %4
  228. +%endif
  229. +%endmacro
  230. +
  231. +%macro FIX_TR_1 3-4
  232. +%ifidn %1,sse4
  233. +    pblendw  %2, %3, 10000000b
  234. +%elifidn %1,avx
  235. +    pblendw  %2, %3, 10000000b
  236. +%else
  237. +    mova     %4, %3
  238. +    pxor     %4, %2
  239. +    psrldq   %4, 14
  240. +    pslldq   %4, 14
  241. +    pxor     %2, %4
  242. +%endif
  243. +%endmacro
  244. +
  245. +%macro FIX_LT_1 3-5
  246. +%ifidn %1, sse4
  247. +    pblendw  %2, %3, 01000000b
  248. +%elifidn %1,avx
  249. +    pblendw  %2, %3, 01000000b
  250. +%else
  251. +    mova     %5, %3
  252. +    pxor     %5, %4
  253. +    psrldq   %5, 14
  254. +    pslldq   %5, 12
  255. +    pxor     %2, %5
  256. +%endif
  257. +%endmacro
  258. +
  259.  %macro PRED8x8L_TOP_DC 1
  260.  cglobal pred8x8l_top_dc_10_%1, 4,4,6
  261.      sub         r0, r3
  262. -    pxor        m7, m7
  263.      mova        m0, [r0-16]
  264.      mova        m3, [r0]
  265.      mova        m1, [r0+16]
  266. -    mova        m2, m3
  267. -    mova        m4, m3
  268. -    PALIGNR     m2, m0, 14, m0
  269. -    PALIGNR     m1, m4,  2, m4
  270. -    test        r1, r1 ; top_left
  271. +    PALIGNR     m2, m3, m0, 14, m0
  272. +    PALIGNR     m1, m3,  2, m4
  273. +    test       r1d, r1d ; top_left
  274.      jz .fix_lt_2
  275. -    test        r2, r2 ; top_right
  276. +    test       r2d, r2d ; top_right
  277.      jz .fix_tr_1
  278.      jmp .body
  279.  .fix_lt_2:
  280. -    mova        m5, m3
  281. -    pxor        m5, m2
  282. -    pslldq      m5, 14
  283. -    psrldq      m5, 14
  284. -    pxor        m2, m5
  285. -    test        r2, r2 ; top_right
  286. +    FIX_LT_2    %1, m2, m3, m5
  287. +    test       r2d, r2d ; top_right
  288.      jnz .body
  289.  .fix_tr_1:
  290. -    mova        m5, m3
  291. -    pxor        m5, m1
  292. -    psrldq      m5, 14
  293. -    pslldq      m5, 14
  294. -    pxor        m1, m5
  295. +    FIX_TR_1    %1, m1, m3, m5
  296.  .body
  297. -    lea         r1, [r3+r3*2]
  298. +    lea         r1, [r3*3]
  299.      lea         r2, [r0+r3*4]
  300.      PRED4x4_LOWPASS m0, m2, m1, m3
  301.      HADDW       m0, m1
  302. @@ -616,98 +642,73 @@ INIT_XMM
  303.  PRED8x8L_TOP_DC sse2
  304.  %define PALIGNR PALIGNR_SSSE3
  305.  PRED8x8L_TOP_DC ssse3
  306. +PRED8x8L_TOP_DC sse4
  307.  
  308.  ;-----------------------------------------------------------------------------
  309.  ;void pred8x8l_dc(pixel *src, int has_topleft, int has_topright, int stride)
  310.  ;-----------------------------------------------------------------------------
  311.  ;TODO: see if scalar is faster
  312.  %macro PRED8x8L_DC 1
  313. -cglobal pred8x8l_dc_10_%1, 4,5,8
  314. +cglobal pred8x8l_dc_10_%1, 4,6,6
  315.      sub         r0, r3
  316. -    lea         r4, [r0+r3*2]
  317. +    lea         r4, [r0+r3*4]
  318. +    lea         r5, [r3*3]
  319.      mova        m0, [r0+r3*1-16]
  320.      punpckhwd   m0, [r0+r3*0-16]
  321. -    mova        m1, [r4+r3*1-16]
  322. +    mova        m1, [r0+r5*1-16]
  323.      punpckhwd   m1, [r0+r3*2-16]
  324. -    mov         r4, r0
  325.      punpckhdq   m1, m0
  326. -    lea         r0, [r0+r3*4]
  327. -    mova        m2, [r0+r3*1-16]
  328. -    punpckhwd   m2, [r0+r3*0-16]
  329. -    lea         r0, [r0+r3*2]
  330. -    mova        m3, [r0+r3*1-16]
  331. -    punpckhwd   m3, [r0+r3*0-16]
  332. +    mova        m2, [r4+r3*1-16]
  333. +    punpckhwd   m2, [r4+r3*0-16]
  334. +    mova        m3, [r4+r5*1-16]
  335. +    punpckhwd   m3, [r4+r3*2-16]
  336.      punpckhdq   m3, m2
  337.      punpckhqdq  m3, m1
  338. -    lea         r0, [r0+r3*2]
  339. -    mova        m0, [r0+r3*0-16]
  340. +    mova        m0, [r4+r3*4-16]
  341.      mova        m1, [r4]
  342. -    mov         r0, r4
  343. -    mova        m4, m3
  344. -    mova        m2, m3
  345. -    PALIGNR     m4, m0, 14, m0
  346. -    PALIGNR     m1, m2,  2, m2
  347. -    test        r1, r1
  348. +    PALIGNR     m4, m3, m0, 14, m0
  349. +    PALIGNR     m1, m3,  2, m2
  350. +    test       r1d, r1d
  351.      jnz .do_left
  352.  .fix_lt_1:
  353. -    mova        m5, m3
  354. -    pxor        m5, m4
  355. -    psrldq      m5, 14
  356. -    pslldq      m5, 12
  357. -    pxor        m1, m5
  358. +    FIX_LT_1    %1, m1, m3, m4, m5
  359.      jmp .do_left
  360.  .fix_lt_2:
  361. -    mova        m5, m3
  362. -    pxor        m5, m2
  363. -    pslldq      m5, 14
  364. -    psrldq      m5, 14
  365. -    pxor        m2, m5
  366. -    test        r2, r2
  367. +    FIX_LT_2    %1, m2, m3, m4
  368. +    test       r2d, r2d
  369.      jnz .body
  370.  .fix_tr_1:
  371. -    mova        m5, m3
  372. -    pxor        m5, m1
  373. -    psrldq      m5, 14
  374. -    pslldq      m5, 14
  375. -    pxor        m1, m5
  376. +    FIX_TR_1    %1, m1, m3, m4
  377.      jmp .body
  378.  .do_left:
  379. -    mova        m0, m4
  380.      PRED4x4_LOWPASS m2, m1, m4, m3
  381. -    mova        m4, m0
  382. -    mova        m7, m2
  383. -    PRED4x4_LOWPASS m1, m3, m0, m4
  384. +    PRED4x4_LOWPASS m1, m3, m4, m4
  385.      pslldq      m1, 14
  386. -    PALIGNR     m7, m1, 14, m3
  387. +    PALIGNR     m5, m2, m1, 14, m3
  388.      mova        m0, [r0-16]
  389.      mova        m3, [r0]
  390.      mova        m1, [r0+16]
  391. -    mova        m2, m3
  392. -    mova        m4, m3
  393. -    PALIGNR     m2, m0, 14, m0
  394. -    PALIGNR     m1, m4,  2, m4
  395. -    test        r1, r1
  396. +    PALIGNR     m2, m3, m0, 14, m0
  397. +    PALIGNR     m1, m3,  2, m4
  398. +    test       r1d, r1d
  399.      jz .fix_lt_2
  400. -    test        r2, r2
  401. +    test       r2d, r2d
  402.      jz .fix_tr_1
  403. -.body
  404. -    lea         r1, [r3+r3*2]
  405. -    PRED4x4_LOWPASS m6, m2, m1, m3
  406. -    HADDW       m7, m0
  407. -    HADDW       m6, m0
  408. -    lea         r2, [r0+r3*4]
  409. -    paddw       m7, [pw_8]
  410. -    paddw       m7, m6
  411. -    psrlw       m7, 4
  412. -    SPLATW      m7, m7
  413. -    mova [r0+r3*1], m7
  414. -    mova [r0+r3*2], m7
  415. -    mova [r0+r1*1], m7
  416. -    mova [r0+r3*4], m7
  417. -    mova [r2+r3*1], m7
  418. -    mova [r2+r3*2], m7
  419. -    mova [r2+r1*1], m7
  420. -    mova [r2+r3*4], m7
  421. +.body:
  422. +    PRED4x4_LOWPASS m4, m2, m1, m3
  423. +    paddw       m5, m4
  424. +    HADDW       m5, m0
  425. +    paddw       m5, [pw_8]
  426. +    psrlw       m5, 4
  427. +    SPLATW      m5, m5
  428. +    mova [r0+r3*1], m5
  429. +    mova [r0+r3*2], m5
  430. +    mova [r0+r5*1], m5
  431. +    mova [r0+r3*4], m5
  432. +    mova [r4+r3*1], m5
  433. +    mova [r4+r3*2], m5
  434. +    mova [r4+r5*1], m5
  435. +    mova [r4+r3*4], m5
  436.      RET
  437.  %endmacro
  438.  
  439. @@ -716,6 +717,11 @@ INIT_XMM
  440.  PRED8x8L_DC sse2
  441.  %define PALIGNR PALIGNR_SSSE3
  442.  PRED8x8L_DC ssse3
  443. +PRED8x8L_DC sse4
  444. +%ifdef HAVE_AVX
  445. +INIT_AVX
  446. +PRED8x8L_DC avx
  447. +%endif
  448.  
  449.  ;-----------------------------------------------------------------------------
  450.  ; void pred8x8l_vertical(pixel *src, int has_topleft, int has_topright, int stride)
  451. @@ -723,36 +729,17 @@ PRED8x8L_DC ssse3
  452.  %macro PRED8x8L_VERTICAL 1
  453.  cglobal pred8x8l_vertical_10_%1, 4,4,6
  454.      sub         r0, r3
  455. -    mova        m0, [r0-16]
  456. -    mova        m3, [r0]
  457. -    mova        m1, [r0+16]
  458. -    mova        m2, m3
  459. -    mova        m4, m3
  460. -    PALIGNR     m2, m0, 14, m0
  461. -    PALIGNR     m1, m4,  2, m4
  462. -    test        r1, r1 ; top_left
  463. -    jz .fix_lt_2
  464. -    test        r2, r2 ; top_right
  465. -    jz .fix_tr_1
  466. -    jmp .body
  467. -.fix_lt_2:
  468. -    mova        m5, m3
  469. -    pxor        m5, m2
  470. -    pslldq      m5, 14
  471. -    psrldq      m5, 14
  472. -    pxor        m2, m5
  473. -    test        r2, r2 ; top_right
  474. -    jnz .body
  475. -.fix_tr_1:
  476. -    mova        m5, m3
  477. -    pxor        m5, m1
  478. -    psrldq      m5, 14
  479. -    pslldq      m5, 14
  480. -    pxor        m1, m5
  481. -.body
  482. -    lea         r1, [r3+r3*2]
  483. +    mova        m0, [r0]
  484. +    shr        r1d, 14
  485. +    shr        r2d, 13
  486. +    neg         r1
  487. +    pslldq      m1, m0, 2
  488. +    psrldq      m2, m0, 2
  489. +    pinsrw      m1, [r0+r1], 0
  490. +    pinsrw      m2, [r0+r2+14], 7
  491. +    lea         r1, [r3*3]
  492.      lea         r2, [r0+r3*4]
  493. -    PRED4x4_LOWPASS m0, m2, m1, m3
  494. +    PRED4x4_LOWPASS m0, m2, m1, m0
  495.      mova [r0+r3*1], m0
  496.      mova [r0+r3*2], m0
  497.      mova [r0+r1*1], m0
  498. @@ -765,70 +752,57 @@ cglobal pred8x8l_vertical_10_%1, 4,4,6
  499.  %endmacro
  500.  
  501.  INIT_XMM
  502. -%define PALIGNR PALIGNR_MMX
  503.  PRED8x8L_VERTICAL sse2
  504. -%define PALIGNR PALIGNR_SSSE3
  505. -PRED8x8L_VERTICAL ssse3
  506. +%ifdef HAVE_AVX
  507. +INIT_AVX
  508. +PRED8x8L_VERTICAL avx
  509. +%endif
  510.  
  511.  ;-----------------------------------------------------------------------------
  512.  ; void pred8x8l_horizontal(uint8_t *src, int has_topleft, int has_topright, int stride)
  513.  ;-----------------------------------------------------------------------------
  514.  %macro PRED8x8L_HORIZONTAL 1
  515. -cglobal pred8x8l_horizontal_10_%1, 4,4,8
  516. -    sub         r0, r3
  517. -    lea         r2, [r0+r3*2]
  518. -    mova        m0, [r0+r3*1-16]
  519. -    test        r1, r1
  520. -    lea         r1, [r0+r3]
  521. -    cmovnz      r1, r0
  522. -    punpckhwd   m0, [r1+r3*0-16]
  523. -    mova        m1, [r2+r3*1-16]
  524. -    punpckhwd   m1, [r0+r3*2-16]
  525. +cglobal pred8x8l_horizontal_10_%1, 4,4,5
  526. +    mova        m0, [r0-16]
  527.      mov         r2, r0
  528. +    sub         r2, r3
  529. +    test       r1d, r1d
  530. +    cmovz       r2, r0
  531. +    punpckhwd   m0, [r2+r3*0-16]
  532. +    mova        m1, [r0+r3*2-16]
  533. +    punpckhwd   m1, [r0+r3*1-16]
  534. +    lea         r1, [r3*3]
  535.      punpckhdq   m1, m0
  536. -    lea         r0, [r0+r3*4]
  537. -    mova        m2, [r0+r3*1-16]
  538. -    punpckhwd   m2, [r0+r3*0-16]
  539. -    lea         r0, [r0+r3*2]
  540. -    mova        m3, [r0+r3*1-16]
  541. -    punpckhwd   m3, [r0+r3*0-16]
  542. +    mova        m2, [r0+r3*4-16]
  543. +    punpckhwd   m2, [r0+r1-16]
  544. +    lea         r2, [r0+r3*4]
  545. +    mova        m3, [r2+r3*2-16]
  546. +    punpckhwd   m3, [r2+r3*1-16]
  547.      punpckhdq   m3, m2
  548.      punpckhqdq  m3, m1
  549. -    lea         r0, [r0+r3*2]
  550. -    mova        m0, [r0+r3*0-16]
  551. -    mova        m1, [r1+r3*0-16]
  552. -    mov         r0, r2
  553. -    mova        m4, m3
  554. -    mova        m2, m3
  555. -    PALIGNR     m4, m0, 14, m0
  556. -    PALIGNR     m1, m2,  2, m2
  557. -    mova        m0, m4
  558. -    PRED4x4_LOWPASS m2, m1, m4, m3
  559. -    mova        m4, m0
  560. -    mova        m7, m2
  561. -    PRED4x4_LOWPASS m1, m3, m0, m4
  562. -    pslldq      m1, 14
  563. -    PALIGNR     m7, m1, 14, m3
  564. -    lea         r1, [r3+r3*2]
  565. -    punpckhwd   m3, m7, m7
  566. -    punpcklwd   m7, m7
  567. +    mova        m0, [r2+r1-16]
  568. +    PALIGNR     m4, m3, m0, 14, m0
  569. +    pslldq      m0, m4, 2
  570. +    pshuflw     m0, m0, 11100101b
  571. +    PRED4x4_LOWPASS m4, m3, m0, m4
  572. +    punpckhwd   m3, m4, m4
  573. +    punpcklwd   m4, m4
  574.      pshufd      m0, m3, 0xff
  575.      pshufd      m1, m3, 0xaa
  576. -    lea         r2, [r0+r3*4]
  577.      pshufd      m2, m3, 0x55
  578.      pshufd      m3, m3, 0x00
  579. -    pshufd      m4, m7, 0xff
  580. -    pshufd      m5, m7, 0xaa
  581. -    pshufd      m6, m7, 0x55
  582. -    pshufd      m7, m7, 0x00
  583. -    mova [r0+r3*1], m0
  584. -    mova [r0+r3*2], m1
  585. -    mova [r0+r1*1], m2
  586. -    mova [r0+r3*4], m3
  587. -    mova [r2+r3*1], m4
  588. -    mova [r2+r3*2], m5
  589. -    mova [r2+r1*1], m6
  590. -    mova [r2+r3*4], m7
  591. +    mova [r0+r3*0], m0
  592. +    mova [r0+r3*1], m1
  593. +    mova [r0+r3*2], m2
  594. +    mova [r0+r1*1], m3
  595. +    pshufd      m0, m4, 0xff
  596. +    pshufd      m1, m4, 0xaa
  597. +    pshufd      m2, m4, 0x55
  598. +    pshufd      m3, m4, 0x00
  599. +    mova [r2+r3*0], m0
  600. +    mova [r2+r3*1], m1
  601. +    mova [r2+r3*2], m2
  602. +    mova [r2+r1*1], m3
  603.      RET
  604.  %endmacro
  605.  
  606. @@ -837,114 +811,77 @@ INIT_XMM
  607.  PRED8x8L_HORIZONTAL sse2
  608.  %define PALIGNR PALIGNR_SSSE3
  609.  PRED8x8L_HORIZONTAL ssse3
  610. +%ifdef HAVE_AVX
  611. +INIT_AVX
  612. +PRED8x8L_HORIZONTAL avx
  613. +%endif
  614.  
  615.  ;-----------------------------------------------------------------------------
  616.  ;void pred8x8l_down_left(pixel *src, int has_topleft, int has_topright, int stride)
  617.  ;-----------------------------------------------------------------------------
  618.  %macro PRED8x8L_DOWN_LEFT 1
  619. -cglobal pred8x8l_down_left_10_%1, 4,4,8
  620. +cglobal pred8x8l_down_left_10_%1, 4,4,7
  621.      sub         r0, r3
  622.      mova        m0, [r0-16]
  623.      mova        m3, [r0]
  624.      mova        m1, [r0+16]
  625. -    mova        m2, m3
  626. -    mova        m4, m3
  627. -    PALIGNR     m2, m0, 14, m0
  628. -    PALIGNR     m1, m4,  2, m4
  629. -    test        r1, r1
  630. +    PALIGNR     m2, m3, m0, 14, m0
  631. +    PALIGNR     m1, m3,  2, m4
  632. +    test       r1d, r1d
  633.      jz .fix_lt_2
  634. -    test        r2, r2
  635. +    test       r2d, r2d
  636.      jz .fix_tr_1
  637.      jmp .do_top
  638.  .fix_lt_2:
  639. -    mova        m5, m3
  640. -    pxor        m5, m2
  641. -    pslldq      m5, 14
  642. -    psrldq      m5, 14
  643. -    pxor        m2, m5
  644. -    test        r2, r2
  645. +    FIX_LT_2    %1, m2, m3, m5
  646. +    test       r2d, r2d
  647.      jnz .do_top
  648.  .fix_tr_1:
  649. -    mova        m5, m3
  650. -    pxor        m5, m1
  651. -    psrldq      m5, 14
  652. -    pslldq      m5, 14
  653. -    pxor        m1, m5
  654. +    FIX_TR_1    %1, m1, m3, m5
  655.      jmp .do_top
  656.  .fix_tr_2:
  657.      punpckhwd   m3, m3
  658.      pshufd      m1, m3, 0xFF
  659.      jmp .do_topright
  660.  .do_top:
  661. -    PRED4x4_LOWPASS m4, m2, m1, m3
  662. -    mova        m7, m4
  663. -    test        r2, r2
  664. +    PRED4x4_LOWPASS m6, m2, m1, m3
  665. +    test       r2d, r2d
  666.      jz .fix_tr_2
  667. -    mova        m0, [r0+16]
  668. -    mova        m5, m0
  669. -    mova        m2, m0
  670. -    mova        m4, m0
  671. -    psrldq      m5, 14
  672. -    PALIGNR     m2, m3, 14, m3
  673. -    PALIGNR     m5, m4,  2, m4
  674. -    PRED4x4_LOWPASS m1, m2, m5, m0
  675. +    mova        m1, [r0+16]
  676. +    psrldq      m5, m1, 2
  677. +    PALIGNR     m2, m1, m3, 14, m3
  678. +    pshufhw     m5, m5, 10100100b
  679. +    PRED4x4_LOWPASS m1, m2, m5, m1
  680.  .do_topright:
  681. -    lea         r1, [r3+r3*2]
  682. -    mova        m6, m1
  683. -    psrldq      m1, 14
  684. -    mova        m4, m1
  685. +    lea         r1, [r3*3]
  686. +    psrldq      m5, m1, 14
  687.      lea         r2, [r0+r3*4]
  688. -    mova        m2, m6
  689. -    PALIGNR     m2, m7,  2, m0
  690. -    mova        m3, m6
  691. -    PALIGNR     m3, m7, 14, m0
  692. -    PALIGNR     m4, m6,  2, m0
  693. -    mova        m5, m7
  694. -    mova        m1, m7
  695. -    mova        m7, m6
  696. -    pslldq      m1, 2
  697. -    PRED4x4_LOWPASS m0, m1, m2, m5
  698. -    PRED4x4_LOWPASS m1, m3, m4, m7
  699. +    PALIGNR     m2, m1, m6,  2, m0
  700. +    PALIGNR     m3, m1, m6, 14, m0
  701. +    PALIGNR     m5, m1,  2, m0
  702. +    pslldq      m4, m6, 2
  703. +    PRED4x4_LOWPASS m6, m4, m2, m6
  704. +    PRED4x4_LOWPASS m1, m3, m5, m1
  705.      mova [r2+r3*4], m1
  706. -    mova        m2, m0
  707. -    pslldq      m1, 2
  708. -    psrldq      m2, 14
  709. -    pslldq      m0, 2
  710. -    por         m1, m2
  711. +    PALIGNR     m1, m6, 14, m2
  712. +    pslldq      m6, 2
  713.      mova [r2+r1*1], m1
  714. -    mova        m2, m0
  715. -    pslldq      m1, 2
  716. -    psrldq      m2, 14
  717. -    pslldq      m0, 2
  718. -    por         m1, m2
  719. +    PALIGNR     m1, m6, 14, m2
  720. +    pslldq      m6, 2
  721.      mova [r2+r3*2], m1
  722. -    mova        m2, m0
  723. -    pslldq      m1, 2
  724. -    psrldq      m2, 14
  725. -    pslldq      m0, 2
  726. -    por         m1, m2
  727. +    PALIGNR     m1, m6, 14, m2
  728. +    pslldq      m6, 2
  729.      mova [r2+r3*1], m1
  730. -    mova        m2, m0
  731. -    pslldq      m1, 2
  732. -    psrldq      m2, 14
  733. -    pslldq      m0, 2
  734. -    por         m1, m2
  735. +    PALIGNR     m1, m6, 14, m2
  736. +    pslldq      m6, 2
  737.      mova [r0+r3*4], m1
  738. -    mova        m2, m0
  739. -    pslldq      m1, 2
  740. -    psrldq      m2, 14
  741. -    pslldq      m0, 2
  742. -    por         m1, m2
  743. +    PALIGNR     m1, m6, 14, m2
  744. +    pslldq      m6, 2
  745.      mova [r0+r1*1], m1
  746. -    mova        m2, m0
  747. -    pslldq      m1, 2
  748. -    psrldq      m2, 14
  749. -    pslldq      m0, 2
  750. -    por         m1, m2
  751. +    PALIGNR     m1, m6, 14, m2
  752. +    pslldq      m6, 2
  753.      mova [r0+r3*2], m1
  754. -    pslldq      m1, 2
  755. -    psrldq      m0, 14
  756. -    por         m1, m0
  757. +    PALIGNR     m1, m6, 14, m6
  758.      mova [r0+r3*1], m1
  759.      RET
  760.  %endmacro
  761. @@ -954,139 +891,91 @@ INIT_XMM
  762.  PRED8x8L_DOWN_LEFT sse2
  763.  %define PALIGNR PALIGNR_SSSE3
  764.  PRED8x8L_DOWN_LEFT ssse3
  765. +PRED8x8L_DOWN_LEFT sse4
  766. +%ifdef HAVE_AVX
  767. +INIT_AVX
  768. +PRED8x8L_DOWN_LEFT avx
  769. +%endif
  770.  
  771.  ;-----------------------------------------------------------------------------
  772. -;void pred8x8l_down_right_mxext(pixel *src, int has_topleft, int has_topright, int stride)
  773. +;void pred8x8l_down_right(pixel *src, int has_topleft, int has_topright, int stride)
  774.  ;-----------------------------------------------------------------------------
  775.  %macro PRED8x8L_DOWN_RIGHT 1
  776. -cglobal pred8x8l_down_right_10_%1, 4,5,8
  777. +cglobal pred8x8l_down_right_10_%1, 4,6,8
  778.      sub         r0, r3
  779. -    lea         r4, [r0+r3*2]
  780. +    lea         r4, [r0+r3*4]
  781. +    lea         r5, [r3*3]
  782.      mova        m0, [r0+r3*1-16]
  783.      punpckhwd   m0, [r0+r3*0-16]
  784. -    mova        m1, [r4+r3*1-16]
  785. +    mova        m1, [r0+r5*1-16]
  786.      punpckhwd   m1, [r0+r3*2-16]
  787. -    mov         r4, r0
  788.      punpckhdq   m1, m0
  789. -    lea         r0, [r0+r3*4]
  790. -    mova        m2, [r0+r3*1-16]
  791. -    punpckhwd   m2, [r0+r3*0-16]
  792. -    lea         r0, [r0+r3*2]
  793. -    mova        m3, [r0+r3*1-16]
  794. -    punpckhwd   m3, [r0+r3*0-16]
  795. +    mova        m2, [r4+r3*1-16]
  796. +    punpckhwd   m2, [r4+r3*0-16]
  797. +    mova        m3, [r4+r5*1-16]
  798. +    punpckhwd   m3, [r4+r3*2-16]
  799.      punpckhdq   m3, m2
  800.      punpckhqdq  m3, m1
  801. -    lea         r0, [r0+r3*2]
  802. -    mova        m0, [r0+r3*0-16]
  803. -    mova        m1, [r4]
  804. -    mov         r0, r4
  805. -    mova        m4, m3
  806. -    mova        m2, m3
  807. -    PALIGNR     m4, m0, 14, m0
  808. -    PALIGNR     m1, m2,  2, m2
  809. -    test        r1, r1 ; top_left
  810. +    mova        m0, [r4+r3*4-16]
  811. +    mova        m1, [r0]
  812. +    PALIGNR     m4, m3, m0, 14, m0
  813. +    PALIGNR     m1, m3,  2, m2
  814. +    test       r1d, r1d
  815.      jz .fix_lt_1
  816.  .do_left:
  817. -    mova        m0, m4
  818. -    PRED4x4_LOWPASS m2, m1, m4, m3
  819. -    mova        m4, m0
  820. -    mova        m7, m2
  821. -    mova        m6, m2
  822. -    PRED4x4_LOWPASS m1, m3, m0, m4
  823. -    pslldq      m1, 14
  824. -    PALIGNR     m7, m1, 14, m3
  825. +    pslldq      m0, m4, 2
  826. +    pshuflw     m0, m0, 11100101b
  827. +    PRED4x4_LOWPASS m6, m1, m4, m3
  828. +    PRED4x4_LOWPASS m4, m3, m0, m4
  829.      mova        m0, [r0-16]
  830.      mova        m3, [r0]
  831.      mova        m1, [r0+16]
  832. -    mova        m2, m3
  833. -    mova        m4, m3
  834. -    PALIGNR     m2, m0, 14, m0
  835. -    PALIGNR     m1, m4,  2, m4
  836. -    test        r1, r1 ; top_left
  837. +    PALIGNR     m2, m3, m0, 14, m0
  838. +    PALIGNR     m1, m3,  2, m7
  839. +    test       r1d, r1d ; top_left
  840.      jz .fix_lt_2
  841. -    test        r2, r2 ; top_right
  842. +    test       r2d, r2d ; top_right
  843.      jz .fix_tr_1
  844.  .do_top:
  845. -    PRED4x4_LOWPASS m4, m2, m1, m3
  846. -    mova        m5, m4
  847. +    PRED4x4_LOWPASS m3, m2, m1, m3
  848.      jmp .body
  849.  .fix_lt_1:
  850. -    mova        m5, m3
  851. -    pxor        m5, m4
  852. -    psrldq      m5, 14
  853. -    pslldq      m5, 12
  854. -    pxor        m1, m5
  855. +    FIX_LT_1    %1, m1, m3, m4, m5
  856.      jmp .do_left
  857.  .fix_lt_2:
  858. -    mova        m5, m3
  859. -    pxor        m5, m2
  860. -    pslldq      m5, 14
  861. -    psrldq      m5, 14
  862. -    pxor        m2, m5
  863. -    test        r2, r2 ; top_right
  864. +    FIX_LT_2    %1, m2, m3, m5
  865. +    test       r2d, r2d ; top_right
  866.      jnz .do_top
  867.  .fix_tr_1:
  868. -    mova        m5, m3
  869. -    pxor        m5, m1
  870. -    psrldq      m5, 14
  871. -    pslldq      m5, 14
  872. -    pxor        m1, m5
  873. +    FIX_TR_1    %1, m1, m3, m5
  874.      jmp .do_top
  875.  .body
  876. -    lea         r1, [r3+r3*2]
  877. -    mova        m1, m7
  878. -    mova        m7, m5
  879. -    mova        m5, m6
  880. -    mova        m2, m7
  881. -    lea         r2, [r0+r3*4]
  882. -    PALIGNR     m2, m6,  2, m0
  883. -    mova        m3, m7
  884. -    PALIGNR     m3, m6, 14, m0
  885. -    mova        m4, m7
  886. -    psrldq      m4, 2
  887. -    PRED4x4_LOWPASS m0, m1, m2, m5
  888. -    PRED4x4_LOWPASS m1, m3, m4, m7
  889. -    mova [r2+r3*4], m0
  890. -    mova        m2, m1
  891. -    psrldq      m0, 2
  892. -    pslldq      m2, 14
  893. -    psrldq      m1, 2
  894. -    por         m0, m2
  895. -    mova [r2+r1*1], m0
  896. -    mova        m2, m1
  897. -    psrldq      m0, 2
  898. -    pslldq      m2, 14
  899. -    psrldq      m1, 2
  900. -    por         m0, m2
  901. -    mova [r2+r3*2], m0
  902. -    mova        m2, m1
  903. -    psrldq      m0, 2
  904. -    pslldq      m2, 14
  905. -    psrldq      m1, 2
  906. -    por         m0, m2
  907. -    mova [r2+r3*1], m0
  908. -    mova        m2, m1
  909. -    psrldq      m0, 2
  910. -    pslldq      m2, 14
  911. -    psrldq      m1, 2
  912. -    por         m0, m2
  913. -    mova [r0+r3*4], m0
  914. -    mova        m2, m1
  915. -    psrldq      m0, 2
  916. -    pslldq      m2, 14
  917. -    psrldq      m1, 2
  918. -    por         m0, m2
  919. -    mova [r0+r1*1], m0
  920. -    mova        m2, m1
  921. -    psrldq      m0, 2
  922. -    pslldq      m2, 14
  923. -    psrldq      m1, 2
  924. -    por         m0, m2
  925. -    mova [r0+r3*2], m0
  926. -    psrldq      m0, 2
  927. -    pslldq      m1, 14
  928. -    por         m0, m1
  929. -    mova [r0+r3*1], m0
  930. +    PALIGNR     m2, m3, m6,  2, m0
  931. +    PALIGNR     m5, m3, m6, 14, m0
  932. +    psrldq      m7, m3, 2
  933. +    PRED4x4_LOWPASS m6, m4, m2, m6
  934. +    PRED4x4_LOWPASS m3, m5, m7, m3
  935. +    mova [r4+r3*4], m6
  936. +    PALIGNR     m3, m6, 14, m2
  937. +    pslldq      m6, 2
  938. +    mova [r0+r3*1], m3
  939. +    PALIGNR     m3, m6, 14, m2
  940. +    pslldq      m6, 2
  941. +    mova [r0+r3*2], m3
  942. +    PALIGNR     m3, m6, 14, m2
  943. +    pslldq      m6, 2
  944. +    mova [r0+r5*1], m3
  945. +    PALIGNR     m3, m6, 14, m2
  946. +    pslldq      m6, 2
  947. +    mova [r0+r3*4], m3
  948. +    PALIGNR     m3, m6, 14, m2
  949. +    pslldq      m6, 2
  950. +    mova [r4+r3*1], m3
  951. +    PALIGNR     m3, m6, 14, m2
  952. +    pslldq      m6, 2
  953. +    mova [r4+r3*2], m3
  954. +    PALIGNR     m3, m6, 14, m6
  955. +    mova [r4+r5*1], m3
  956.      RET
  957.  %endmacro
  958.  
  959. @@ -1095,114 +984,86 @@ INIT_XMM
  960.  PRED8x8L_DOWN_RIGHT sse2
  961.  %define PALIGNR PALIGNR_SSSE3
  962.  PRED8x8L_DOWN_RIGHT ssse3
  963. +PRED8x8L_DOWN_RIGHT sse4
  964. +%ifdef HAVE_AVX
  965. +INIT_AVX
  966. +PRED8x8L_DOWN_RIGHT avx
  967. +%endif
  968.  
  969.  ;-----------------------------------------------------------------------------
  970.  ; void pred8x8l_vertical_right(pixel *src, int has_topleft, int has_topright, int stride)
  971.  ;-----------------------------------------------------------------------------
  972.  %macro PRED8x8L_VERTICAL_RIGHT 1
  973. -cglobal pred8x8l_vertical_right_10_%1, 4,5,8
  974. +cglobal pred8x8l_vertical_right_10_%1, 4,6,8
  975.      sub         r0, r3
  976. -    lea         r4, [r0+r3*2]
  977. +    lea         r4, [r0+r3*4]
  978. +    lea         r5, [r3*3]
  979.      mova        m0, [r0+r3*1-16]
  980.      punpckhwd   m0, [r0+r3*0-16]
  981. -    mova        m1, [r4+r3*1-16]
  982. +    mova        m1, [r0+r5*1-16]
  983.      punpckhwd   m1, [r0+r3*2-16]
  984. -    mov         r4, r0
  985.      punpckhdq   m1, m0
  986. -    lea         r0, [r0+r3*4]
  987. -    mova        m2, [r0+r3*1-16]
  988. -    punpckhwd   m2, [r0+r3*0-16]
  989. -    lea         r0, [r0+r3*2]
  990. -    mova        m3, [r0+r3*1-16]
  991. -    punpckhwd   m3, [r0+r3*0-16]
  992. +    mova        m2, [r4+r3*1-16]
  993. +    punpckhwd   m2, [r4+r3*0-16]
  994. +    mova        m3, [r4+r5*1-16]
  995. +    punpckhwd   m3, [r4+r3*2-16]
  996.      punpckhdq   m3, m2
  997.      punpckhqdq  m3, m1
  998. -    lea         r0, [r0+r3*2]
  999. -    mova        m0, [r0+r3*0-16]
  1000. -    mova        m1, [r4]
  1001. -    mov         r0, r4
  1002. -    mova        m4, m3
  1003. -    mova        m2, m3
  1004. -    PALIGNR     m4, m0, 14, m0
  1005. -    PALIGNR     m1, m2,  2, m2
  1006. -    test        r1, r1
  1007. -    jz .fix_lt_1
  1008. -    jmp .do_left
  1009. +    mova        m0, [r4+r3*4-16]
  1010. +    mova        m1, [r0]
  1011. +    PALIGNR     m4, m3, m0, 14, m0
  1012. +    PALIGNR     m1, m3,  2, m2
  1013. +    test       r1d, r1d
  1014. +    jnz .do_left
  1015.  .fix_lt_1:
  1016. -    mova        m5, m3
  1017. -    pxor        m5, m4
  1018. -    psrldq      m5, 14
  1019. -    pslldq      m5, 12
  1020. -    pxor        m1, m5
  1021. +    FIX_LT_1    %1, m1, m3, m4, m5
  1022.      jmp .do_left
  1023.  .fix_lt_2:
  1024. -    mova        m5, m3
  1025. -    pxor        m5, m2
  1026. -    pslldq      m5, 14
  1027. -    psrldq      m5, 14
  1028. -    pxor        m2, m5
  1029. -    test        r2, r2
  1030. +    FIX_LT_2    %1, m7, m2, m5
  1031. +    test       r2d, r2d
  1032.      jnz .do_top
  1033.  .fix_tr_1:
  1034. -    mova        m5, m3
  1035. -    pxor        m5, m1
  1036. -    psrldq      m5, 14
  1037. -    pslldq      m5, 14
  1038. -    pxor        m1, m5
  1039. +    FIX_TR_1    %1, m1, m2, m5
  1040.      jmp .do_top
  1041.  .do_left:
  1042. -    mova        m0, m4
  1043. -    PRED4x4_LOWPASS m2, m1, m4, m3
  1044. -    mova        m7, m2
  1045. +    PRED4x4_LOWPASS m3, m1, m4, m3
  1046.      mova        m0, [r0-16]
  1047. -    mova        m3, [r0]
  1048. +    mova        m2, [r0]
  1049.      mova        m1, [r0+16]
  1050. -    mova        m2, m3
  1051. -    mova        m4, m3
  1052. -    PALIGNR     m2, m0, 14, m0
  1053. -    PALIGNR     m1, m4,  2, m4
  1054. -    test        r1, r1
  1055. +    PALIGNR     m7, m2, m0, 14, m0
  1056. +    PALIGNR     m1, m2,  2, m4
  1057. +    test       r1d, r1d
  1058.      jz .fix_lt_2
  1059. -    test        r2, r2
  1060. +    test       r2d, r2d
  1061.      jz .fix_tr_1
  1062.  .do_top
  1063. -    PRED4x4_LOWPASS m6, m2, m1, m3
  1064. -    lea         r1, [r3+r3*2]
  1065. -    mova        m2, m6
  1066. -    mova        m3, m6
  1067. -    PALIGNR     m3, m7, 14, m0
  1068. -    PALIGNR     m6, m7, 12, m1
  1069. -    mova        m4, m3
  1070. -    pavgw       m3, m2
  1071. -    lea         r2, [r0+r3*4]
  1072. -    PRED4x4_LOWPASS m0, m6, m2, m4
  1073. -    mova [r0+r3*1], m3
  1074. +    PRED4x4_LOWPASS m2, m7, m1, m2
  1075. +    PALIGNR     m6, m2, m3, 12, m1
  1076. +    PALIGNR     m7, m2, m3, 14, m0
  1077. +    PRED4x4_LOWPASS m0, m6, m2, m7
  1078. +    pavgw       m2, m7
  1079.      mova [r0+r3*2], m0
  1080. -    mova        m5, m0
  1081. -    mova        m6, m3
  1082. -    mova        m1, m7
  1083. -    mova        m2, m1
  1084. -    pslldq      m2, 2
  1085. -    mova        m3, m1
  1086. -    pslldq      m3, 4
  1087. -    PRED4x4_LOWPASS m0, m1, m3, m2
  1088. -    PALIGNR     m6, m0, 14, m2
  1089. -    mova [r0+r1*1], m6
  1090. -    pslldq      m0, 2
  1091. -    PALIGNR     m5, m0, 14, m1
  1092. -    mova [r0+r3*4], m5
  1093. -    pslldq      m0, 2
  1094. -    PALIGNR     m6, m0, 14, m2
  1095. -    mova [r2+r3*1], m6
  1096. -    pslldq      m0, 2
  1097. -    PALIGNR     m5, m0, 14, m1
  1098. -    mova [r2+r3*2], m5
  1099. -    pslldq      m0, 2
  1100. -    PALIGNR     m6, m0, 14, m2
  1101. -    mova [r2+r1*1], m6
  1102. -    pslldq      m0, 2
  1103. -    PALIGNR     m5, m0, 14, m1
  1104. -    mova [r2+r3*4], m5
  1105. +    mova [r0+r3*1], m2
  1106. +    pslldq      m6, m3, 4
  1107. +    pslldq      m1, m3, 2
  1108. +    PRED4x4_LOWPASS m1, m3, m6, m1
  1109. +    PALIGNR     m2, m1, 14, m4
  1110. +    mova [r0+r5*1], m2
  1111. +    pslldq      m1, 2
  1112. +    PALIGNR     m0, m1, 14, m3
  1113. +    mova [r0+r3*4], m0
  1114. +    pslldq      m1, 2
  1115. +    PALIGNR     m2, m1, 14, m4
  1116. +    mova [r4+r3*1], m2
  1117. +    pslldq      m1, 2
  1118. +    PALIGNR     m0, m1, 14, m3
  1119. +    mova [r4+r3*2], m0
  1120. +    pslldq      m1, 2
  1121. +    PALIGNR     m2, m1, 14, m4
  1122. +    mova [r4+r5*1], m2
  1123. +    pslldq      m1, 2
  1124. +    PALIGNR     m0, m1, 14, m1
  1125. +    mova [r4+r3*4], m0
  1126.      RET
  1127.  %endmacro
  1128.  
  1129. @@ -1211,84 +1072,63 @@ INIT_XMM
  1130.  PRED8x8L_VERTICAL_RIGHT sse2
  1131.  %define PALIGNR PALIGNR_SSSE3
  1132.  PRED8x8L_VERTICAL_RIGHT ssse3
  1133. +PRED8x8L_VERTICAL_RIGHT sse4
  1134. +%ifdef HAVE_AVX
  1135. +INIT_AVX
  1136. +PRED8x8L_VERTICAL_RIGHT avx
  1137. +%endif
  1138.  
  1139.  ;-----------------------------------------------------------------------------
  1140.  ; void pred8x8l_horizontal_up(pixel *src, int has_topleft, int has_topright, int stride)
  1141.  ;-----------------------------------------------------------------------------
  1142.  %macro PRED8x8L_HORIZONTAL_UP 1
  1143.  cglobal pred8x8l_horizontal_up_10_%1, 4,4,8
  1144. -    sub         r0, r3
  1145. -    lea         r2, [r0+r3*2]
  1146. -    mova        m0, [r0+r3*1-16]
  1147. -    test        r1, r1
  1148. -    lea         r1, [r0+r3]
  1149. -    cmovnz      r1, r0
  1150. -    punpckhwd   m0, [r1+r3*0-16]
  1151. -    mova        m1, [r2+r3*1-16]
  1152. -    punpckhwd   m1, [r0+r3*2-16]
  1153. +    mova        m0, [r0-16]
  1154.      mov         r2, r0
  1155. +    sub         r2, r3
  1156. +    test       r1d, r1d
  1157. +    cmovz       r2, r0
  1158. +    mova        m1, [r0+r3*2-16]
  1159. +    punpckhwd   m0, [r2+r3*0-16]
  1160. +    punpckhwd   m1, [r0+r3*1-16]
  1161. +    lea         r1, [r3*3]
  1162. +    lea         r2, [r0+r3*4]
  1163.      punpckhdq   m1, m0
  1164. -    lea         r0, [r0+r3*4]
  1165. -    mova        m2, [r0+r3*1-16]
  1166. -    punpckhwd   m2, [r0+r3*0-16]
  1167. -    lea         r0, [r0+r3*2]
  1168. -    mova        m3, [r0+r3*1-16]
  1169. -    punpckhwd   m3, [r0+r3*0-16]
  1170. +    mova        m2, [r0+r3*4-16]
  1171. +    punpckhwd   m2, [r0+r1-16]
  1172. +    mova        m3, [r2+r3*2-16]
  1173. +    punpckhwd   m3, [r2+r3*1-16]
  1174.      punpckhdq   m3, m2
  1175.      punpckhqdq  m3, m1
  1176. -    lea         r0, [r0+r3*2]
  1177. -    mova        m0, [r0+r3*0-16]
  1178. -    mova        m1, [r1+r3*0-16]
  1179. -    mov         r0, r2
  1180. -    mova        m4, m3
  1181. -    mova        m2, m3
  1182. -    PALIGNR     m4, m0, 14, m0
  1183. -    PALIGNR     m1, m2,  2, m2
  1184. -    mova        m0, m4
  1185. -    PRED4x4_LOWPASS m2, m1, m4, m3
  1186. -    mova        m4, m0
  1187. -    mova        m7, m2
  1188. -    PRED4x4_LOWPASS m1, m3, m0, m4
  1189. -    pslldq      m1, 14
  1190. -    PALIGNR     m7, m1, 14, m3
  1191. -    lea         r1, [r3+r3*2]
  1192. +    mova        m0, [r2+r1-16]
  1193. +    PALIGNR     m7, m3, m0, 14, m0
  1194. +    pslldq      m4, m7, 2
  1195. +    pshuflw     m4, m4, 11100101b
  1196. +    PRED4x4_LOWPASS m7, m3, m4, m7
  1197.      pshufd      m0, m7, 00011011b ; l6 l7 l4 l5 l2 l3 l0 l1
  1198. -    pslldq      m7, 14             ; l7 .. .. .. .. .. .. ..
  1199. -    mova        m2, m0
  1200. +    psrld       m5, m0, 16
  1201.      pslld       m0, 16
  1202. -    psrld       m2, 16
  1203. -    por         m2, m0            ; l7 l6 l5 l4 l3 l2 l1 l0
  1204. -    mova        m3, m2
  1205. -    mova        m4, m2
  1206. -    mova        m5, m2
  1207. -    psrldq      m2, 2
  1208. -    psrldq      m3, 4
  1209. -    lea         r2, [r0+r3*4]
  1210. -    por         m2, m7            ; l7 l7 l6 l5 l4 l3 l2 l1
  1211. -    punpckhwd   m7, m7
  1212. -    por         m3, m7            ; l7 l7 l7 l6 l5 l4 l3 l2
  1213. -    pavgw       m4, m2
  1214. -    PRED4x4_LOWPASS m1, m3, m5, m2
  1215. -    mova        m5, m4
  1216. +    por         m5, m0            ; l7 l6 l5 l4 l3 l2 l1 l0
  1217. +    PALIGNR     m6, m7, m5, 2, m0
  1218. +    PALIGNR     m7, m6, 2, m1
  1219. +    pavgw       m4, m5, m6
  1220. +    PRED4x4_LOWPASS m1, m7, m5, m6
  1221. +    punpckhwd   m5, m4, m1        ; p8 p7 p6 p5
  1222.      punpcklwd   m4, m1            ; p4 p3 p2 p1
  1223. -    punpckhwd   m5, m1            ; p8 p7 p6 p5
  1224. -    mova        m6, m5
  1225. -    mova        m7, m5
  1226. -    mova        m0, m5
  1227. -    PALIGNR     m5, m4, 4, m1
  1228. -    pshufd      m1, m6, 11111001b
  1229. -    PALIGNR     m6, m4, 8, m2
  1230. -    pshufd      m2, m7, 11111110b
  1231. -    PALIGNR     m7, m4, 12, m3
  1232. -    pshufd      m3, m0, 11111111b
  1233. -    mova [r0+r3*1], m4
  1234. -    mova [r0+r3*2], m5
  1235. -    mova [r0+r1*1], m6
  1236. -    mova [r0+r3*4], m7
  1237. +    mova [r2+r3*0], m5
  1238. +    mova [r0+r3*0], m4
  1239. +    pshufd      m0, m5, 11111001b
  1240. +    pshufd      m1, m5, 11111110b
  1241. +    pshufd      m2, m5, 11111111b
  1242.      mova [r2+r3*1], m0
  1243.      mova [r2+r3*2], m1
  1244.      mova [r2+r1*1], m2
  1245. -    mova [r2+r3*4], m3
  1246. +    PALIGNR     m7, m5, m4, 4, m0
  1247. +    PALIGNR     m6, m5, m4, 8, m1
  1248. +    PALIGNR     m5, m5, m4, 12, m4
  1249. +    mova [r0+r3*1], m7
  1250. +    mova [r0+r3*2], m6
  1251. +    mova [r0+r1*1], m5
  1252.      RET
  1253.  %endmacro
  1254.  
  1255. @@ -1297,7 +1137,10 @@ INIT_XMM
  1256.  PRED8x8L_HORIZONTAL_UP sse2
  1257.  %define PALIGNR PALIGNR_SSSE3
  1258.  PRED8x8L_HORIZONTAL_UP ssse3
  1259. -
  1260. +%ifdef HAVE_AVX
  1261. +INIT_AVX
  1262. +PRED8x8L_HORIZONTAL_UP avx
  1263. +%endif
  1264.  
  1265.  
  1266.  ;-----------------------------------------------------------------------------
  1267. @@ -1315,7 +1158,7 @@ PRED8x8L_HORIZONTAL_UP ssse3
  1268.  %macro PRED16x16_VERTICAL 1
  1269.  cglobal pred16x16_vertical_10_%1, 2,3
  1270.      sub   r0, r1
  1271. -    mov   r2, 8
  1272. +    mov  r2d, 8
  1273.      mova  m0, [r0+ 0]
  1274.      mova  m1, [r0+mmsize]
  1275.  %if mmsize==8
  1276. @@ -1326,7 +1169,7 @@ cglobal pred16x16_vertical_10_%1, 2,3
  1277.      MOV16 r0+r1*1, m0, m1, m2, m3
  1278.      MOV16 r0+r1*2, m0, m1, m2, m3
  1279.      lea   r0, [r0+r1*2]
  1280. -    dec   r2
  1281. +    dec   r2d
  1282.      jg .loop
  1283.      REP_RET
  1284.  %endmacro
  1285. @@ -1341,7 +1184,7 @@ PRED16x16_VERTICAL sse2
  1286.  ;-----------------------------------------------------------------------------
  1287.  %macro PRED16x16_HORIZONTAL 1
  1288.  cglobal pred16x16_horizontal_10_%1, 2,3
  1289. -    mov    r2, 8
  1290. +    mov   r2d, 8
  1291.  .vloop:
  1292.      movd   m0, [r0+r1*0-4]
  1293.      movd   m1, [r0+r1*1-4]
  1294. @@ -1350,7 +1193,7 @@ cglobal pred16x16_horizontal_10_%1, 2,3
  1295.      MOV16  r0+r1*0, m0, m0, m0, m0
  1296.      MOV16  r0+r1*1, m1, m1, m1, m1
  1297.      lea    r0, [r0+r1*2]
  1298. -    dec    r2
  1299. +    dec    r2d
  1300.      jg .vloop
  1301.      REP_RET
  1302.  %endmacro
  1303. @@ -1364,8 +1207,8 @@ PRED16x16_HORIZONTAL sse2
  1304.  ; void pred16x16_dc(pixel *src, int stride)
  1305.  ;-----------------------------------------------------------------------------
  1306.  %macro PRED16x16_DC 1
  1307. -cglobal pred16x16_dc_10_%1, 2,7
  1308. -    mov        r4, r0
  1309. +cglobal pred16x16_dc_10_%1, 2,6
  1310. +    mov        r5, r0
  1311.      sub        r0, r1
  1312.      mova       m0, [r0+0]
  1313.      paddw      m0, [r0+mmsize]
  1314. @@ -1375,17 +1218,17 @@ cglobal pred16x16_dc_10_%1, 2,7
  1315.  %endif
  1316.      HADDW      m0, m2
  1317.  
  1318. -    sub        r0, 2
  1319. -    movzx     r3d, word [r0+r1*1]
  1320. -    movzx     r5d, word [r0+r1*2]
  1321. +    lea        r0, [r0+r1-2]
  1322. +    movzx     r3d, word [r0]
  1323. +    movzx     r4d, word [r0+r1]
  1324.  %rep 7
  1325.      lea        r0, [r0+r1*2]
  1326. -    movzx     r2d, word [r0+r1*1]
  1327. +    movzx     r2d, word [r0]
  1328.      add       r3d, r2d
  1329. -    movzx     r2d, word [r0+r1*2]
  1330. -    add       r5d, r2d
  1331. +    movzx     r2d, word [r0+r1]
  1332. +    add       r4d, r2d
  1333.  %endrep
  1334. -    lea       r3d, [r3+r5+16]
  1335. +    lea       r3d, [r3+r4+16]
  1336.  
  1337.      movd       m1, r3d
  1338.      paddw      m0, m1
  1339. @@ -1393,9 +1236,9 @@ cglobal pred16x16_dc_10_%1, 2,7
  1340.      SPLATW     m0, m0
  1341.      mov       r3d, 8
  1342.  .loop:
  1343. -    MOV16 r4+r1*0, m0, m0, m0, m0
  1344. -    MOV16 r4+r1*1, m0, m0, m0, m0
  1345. -    lea        r4, [r4+r1*2]
  1346. +    MOV16 r5+r1*0, m0, m0, m0, m0
  1347. +    MOV16 r5+r1*1, m0, m0, m0, m0
  1348. +    lea        r5, [r5+r1*2]
  1349.      dec       r3d
  1350.      jg .loop
  1351.      REP_RET
  1352. diff --git a/libavcodec/x86/h264_intrapred_init.c b/libavcodec/x86/h264_intrapred_init.c
  1353. index 62e4c87..332a464 100644
  1354. --- a/libavcodec/x86/h264_intrapred_init.c
  1355. +++ b/libavcodec/x86/h264_intrapred_init.c
  1356. @@ -56,22 +56,33 @@ void ff_pred8x8l_ ## TYPE ## _ ## DEPTH ## _ ## OPT (uint8_t *src, int has_tople
  1357.  
  1358.  PRED8x8L(dc, 10, sse2)
  1359.  PRED8x8L(dc, 10, ssse3)
  1360. +PRED8x8L(dc, 10, sse4)
  1361. +PRED8x8L(dc, 10, avx)
  1362.  PRED8x8L(128_dc, 10, mmxext)
  1363.  PRED8x8L(128_dc, 10, sse2)
  1364.  PRED8x8L(top_dc, 10, sse2)
  1365.  PRED8x8L(top_dc, 10, ssse3)
  1366. +PRED8x8L(top_dc, 10, sse4)
  1367.  PRED8x8L(vertical, 10, sse2)
  1368. -PRED8x8L(vertical, 10, ssse3)
  1369. +PRED8x8L(vertical, 10, avx)
  1370.  PRED8x8L(horizontal, 10, sse2)
  1371.  PRED8x8L(horizontal, 10, ssse3)
  1372. +PRED8x8L(horizontal, 10, avx)
  1373.  PRED8x8L(down_left, 10, sse2)
  1374.  PRED8x8L(down_left, 10, ssse3)
  1375. +PRED8x8L(down_left, 10, sse4)
  1376. +PRED8x8L(down_left, 10, avx)
  1377.  PRED8x8L(down_right, 10, sse2)
  1378.  PRED8x8L(down_right, 10, ssse3)
  1379. +PRED8x8L(down_right, 10, sse4)
  1380. +PRED8x8L(down_right, 10, avx)
  1381.  PRED8x8L(vertical_right, 10, sse2)
  1382.  PRED8x8L(vertical_right, 10, ssse3)
  1383. +PRED8x8L(vertical_right, 10, sse4)
  1384. +PRED8x8L(vertical_right, 10, avx)
  1385.  PRED8x8L(horizontal_up, 10, sse2)
  1386.  PRED8x8L(horizontal_up, 10, ssse3)
  1387. +PRED8x8L(horizontal_up, 10, avx)
  1388.  
  1389.  #define PRED16x16(TYPE, DEPTH, OPT)\
  1390.  void ff_pred16x16_ ## TYPE ## _ ## DEPTH ## _ ## OPT (uint8_t *src, int stride);
  1391. @@ -344,18 +355,32 @@ void ff_h264_pred_init_x86(H264PredContext *h, int codec_id, const int bit_depth
  1392.              h->pred4x4[VERT_RIGHT_PRED     ] = ff_pred4x4_vertical_right_10_ssse3;
  1393.              h->pred4x4[HOR_DOWN_PRED       ] = ff_pred4x4_horizontal_down_10_ssse3;
  1394.  
  1395. -            h->pred8x8l[VERT_PRED           ] = ff_pred8x8l_vertical_10_ssse3;
  1396.              h->pred8x8l[HOR_PRED            ] = ff_pred8x8l_horizontal_10_ssse3;
  1397.              h->pred8x8l[DC_PRED             ] = ff_pred8x8l_dc_10_ssse3;
  1398.              h->pred8x8l[TOP_DC_PRED         ] = ff_pred8x8l_top_dc_10_ssse3;
  1399.              h->pred8x8l[DIAG_DOWN_LEFT_PRED ] = ff_pred8x8l_down_left_10_ssse3;
  1400.          }
  1401. +        if (mm_flags & AV_CPU_FLAG_SSE4) {
  1402. +            h->pred8x8l[DC_PRED             ] = ff_pred8x8l_dc_10_sse4;
  1403. +            h->pred8x8l[TOP_DC_PRED         ] = ff_pred8x8l_top_dc_10_sse4;
  1404. +            h->pred8x8l[DIAG_DOWN_LEFT_PRED ] = ff_pred8x8l_down_left_10_sse4;
  1405. +            h->pred8x8l[DIAG_DOWN_RIGHT_PRED] = ff_pred8x8l_down_right_10_sse4;
  1406. +            h->pred8x8l[VERT_RIGHT_PRED     ] = ff_pred8x8l_vertical_right_10_sse4;
  1407. +        }
  1408.  #if HAVE_AVX
  1409.          if (mm_flags & AV_CPU_FLAG_AVX) {
  1410.              h->pred4x4[DIAG_DOWN_LEFT_PRED ] = ff_pred4x4_down_left_10_avx;
  1411.              h->pred4x4[DIAG_DOWN_RIGHT_PRED] = ff_pred4x4_down_right_10_avx;
  1412.              h->pred4x4[VERT_RIGHT_PRED     ] = ff_pred4x4_vertical_right_10_avx;
  1413.              h->pred4x4[HOR_DOWN_PRED       ] = ff_pred4x4_horizontal_down_10_avx;
  1414. +
  1415. +            h->pred8x8l[VERT_PRED           ] = ff_pred8x8l_vertical_10_avx;
  1416. +            h->pred8x8l[HOR_PRED            ] = ff_pred8x8l_horizontal_10_avx;
  1417. +            h->pred8x8l[DC_PRED             ] = ff_pred8x8l_dc_10_avx;
  1418. +            h->pred8x8l[DIAG_DOWN_RIGHT_PRED] = ff_pred8x8l_down_right_10_avx;
  1419. +            h->pred8x8l[DIAG_DOWN_LEFT_PRED ] = ff_pred8x8l_down_left_10_avx;
  1420. +            h->pred8x8l[VERT_RIGHT_PRED     ] = ff_pred8x8l_vertical_right_10_avx;
  1421. +            h->pred8x8l[HOR_UP_PRED         ] = ff_pred8x8l_horizontal_up_10_avx;
  1422.          }
  1423.  #endif /* HAVE_AVX */
  1424.      }
  1425. --
  1426. 1.7.5.1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement