Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. ;******************************************************************************
  2. ;* VP9 Intra prediction SIMD optimizations
  3. ;*
  4. ;* Copyright (c) 2013 Ronald S. Bultje <rsbultje gmail com>
  5. ;*
  6. ;* Parts based on:
  7. ;* H.264 intra prediction asm optimizations
  8. ;* Copyright (c) 2010 Fiona Glaser
  9. ;* Copyright (c) 2010 Holger Lubitz
  10. ;* Copyright (c) 2010 Loren Merritt
  11. ;* Copyright (c) 2010 Ronald S. Bultje
  12. ;*
  13. ;* This file is part of FFmpeg.
  14. ;*
  15. ;* FFmpeg is free software; you can redistribute it and/or
  16. ;* modify it under the terms of the GNU Lesser General Public
  17. ;* License as published by the Free Software Foundation; either
  18. ;* version 2.1 of the License, or (at your option) any later version.
  19. ;*
  20. ;* FFmpeg is distributed in the hope that it will be useful,
  21. ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
  22. ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  23. ;* Lesser General Public License for more details.
  24. ;*
  25. ;* You should have received a copy of the GNU Lesser General Public
  26. ;* License along with FFmpeg; if not, write to the Free Software
  27. ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  28. ;******************************************************************************
  29.  
  30. %include "libavutil/x86/x86util.asm"
  31.  
  32. SECTION_RODATA 32
  33.  
  34. pw_m256: times 16 dw -256
  35. pw_m255: times 16 dw -255
  36. pw_4096: times 8 dw 4096
  37.  
  38. pb_4x3_4x2_4x1_4x0: times 4 db 3
  39.                     times 4 db 2
  40.                     times 4 db 1
  41.                     times 4 db 0
  42. pb_8x1_8x0:   times 8 db 1
  43.               times 8 db 0
  44. pb_8x3_8x2:   times 8 db 3
  45.               times 8 db 2
  46. pb_0to5_2x7:  db 0, 1, 2, 3, 4, 5, 7, 7
  47.               times 8 db -1
  48. pb_0to6_9x7:  db 0, 1, 2, 3, 4, 5, 6
  49.               times 9 db 7
  50. pb_1to6_10x7: db 1, 2, 3, 4, 5, 6
  51.               times 10 db 7
  52. pb_2to6_3x7:
  53. pb_2to6_11x7: db 2, 3, 4, 5, 6
  54.               times 11 db 7
  55. pb_1toE_2xF:  db 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15
  56. pb_2toE_3xF:  db 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15, 15
  57. pb_13456_3xm1: db 1, 3, 4, 5, 6
  58.                times 3 db -1
  59. pb_6012_4xm1: db 6, 0, 1, 2
  60.               times 4 db -1
  61. pb_6xm1_246_8toE: times 6 db -1
  62.                   db 2, 4, 6, 8, 9, 10, 11, 12, 13, 14
  63. pb_6xm1_BDF_0to6: times 6 db -1
  64.                   db 11, 13, 15, 0, 1, 2, 3, 4, 5, 6
  65. pb_02468ACE_13579BDF: db 0, 2, 4, 6, 8, 10, 12, 14, 1, 3, 5, 7, 9, 11, 13, 15
  66.  
  67. pb_15x0_1xm1: times 15 db 0
  68.               db -1
  69. pb_0to2_5x3: db 0, 1, 2
  70.              times 5 db 3
  71. pb_6xm1_2x0: times 6 db -1
  72.              times 2 db 0
  73. pb_6x0_2xm1: times 6 db 0
  74.              times 2 db -1
  75.  
  76. cextern pb_1
  77. cextern pb_2
  78. cextern pb_3
  79. cextern pb_15
  80. cextern pw_2
  81. cextern pw_4
  82. cextern pw_8
  83. cextern pw_16
  84. cextern pw_32
  85. cextern pw_255
  86. cextern pw_512
  87. cextern pw_1024
  88. cextern pw_2048
  89. cextern pw_8192
  90.  
  91. SECTION .text
  92.  
  93. ; dc_NxN(uint8_t *dst, ptrdiff_t stride, const uint8_t *l, const uint8_t *a)
  94.  
  95. %macro DC_4to8_FUNCS 0
  96. cglobal vp9_ipred_dc_4x4, 4, 4, 0, dst, stride, l, a
  97.     movd                    m0, [lq]
  98.     punpckldq               m0, [aq]
  99.     pxor                    m1, m1
  100.     psadbw                  m0, m1
  101. %if cpuflag(ssse3)
  102.     pmulhrsw                m0, [pw_4096]
  103.     pshufb                  m0, m1
  104. %else
  105.     paddw                   m0, [pw_4]
  106.     psraw                   m0, 3
  107.     punpcklbw               m0, m0
  108.     pshufw                  m0, m0, q0000
  109. %endif
  110.     movd      [dstq+strideq*0], m0
  111.     movd      [dstq+strideq*1], m0
  112.     lea                   dstq, [dstq+strideq*2]
  113.     movd      [dstq+strideq*0], m0
  114.     movd      [dstq+strideq*1], m0
  115.     RET
  116.  
  117. cglobal vp9_ipred_dc_8x8, 4, 4, 0, dst, stride, l, a
  118.     movq                    m0, [lq]
  119.     movq                    m1, [aq]
  120.     DEFINE_ARGS dst, stride, stride3
  121.     lea               stride3q, [strideq*3]
  122.     pxor                    m2, m2
  123.     psadbw                  m0, m2
  124.     psadbw                  m1, m2
  125.     paddw                   m0, m1
  126. %if cpuflag(ssse3)
  127.     pmulhrsw                m0, [pw_2048]
  128.     pshufb                  m0, m2
  129. %else
  130.     paddw                   m0, [pw_8]
  131.     psraw                   m0, 4
  132.     punpcklbw               m0, m0
  133.     pshufw                  m0, m0, q0000
  134. %endif
  135.     movq      [dstq+strideq*0], m0
  136.     movq      [dstq+strideq*1], m0
  137.     movq      [dstq+strideq*2], m0
  138.     movq      [dstq+stride3q ], m0
  139.     lea                   dstq, [dstq+strideq*4]
  140.     movq      [dstq+strideq*0], m0
  141.     movq      [dstq+strideq*1], m0
  142.     movq      [dstq+strideq*2], m0
  143.     movq      [dstq+stride3q ], m0
  144.     RET
  145. %endmacro
  146.  
  147. INIT_MMX mmxext
  148. DC_4to8_FUNCS
  149. INIT_MMX ssse3
  150. DC_4to8_FUNCS
  151.  
  152. %macro DC_16to32_FUNCS 0
  153. cglobal vp9_ipred_dc_16x16, 4, 4, 3, dst, stride, l, a
  154.     mova                    m0, [lq]
  155.     mova                    m1, [aq]
  156.     DEFINE_ARGS dst, stride, stride3, cnt
  157.     lea               stride3q, [strideq*3]
  158.     pxor                    m2, m2
  159.     psadbw                  m0, m2
  160.     psadbw                  m1, m2
  161.     paddw                   m0, m1
  162.     movhlps                 m1, m0
  163.     paddw                   m0, m1
  164. %if cpuflag(ssse3)
  165.     pmulhrsw                m0, [pw_1024]
  166.     pshufb                  m0, m2
  167. %else
  168.     paddw                   m0, [pw_16]
  169.     psraw                   m0, 5
  170.     punpcklbw               m0, m0
  171.     pshuflw                 m0, m0, q0000
  172.     punpcklqdq              m0, m0
  173. %endif
  174.     mov                   cntd, 4
  175. .loop:
  176.     mova      [dstq+strideq*0], m0
  177.     mova      [dstq+strideq*1], m0
  178.     mova      [dstq+strideq*2], m0
  179.     mova      [dstq+stride3q ], m0
  180.     lea                   dstq, [dstq+strideq*4]
  181.     dec                   cntd
  182.     jg .loop
  183.     RET
  184.  
  185. cglobal vp9_ipred_dc_32x32, 4, 4, 5, dst, stride, l, a
  186.     mova                    m0, [lq]
  187.     mova                    m1, [lq+16]
  188.     mova                    m2, [aq]
  189.     mova                    m3, [aq+16]
  190.     DEFINE_ARGS dst, stride, stride3, cnt
  191.     lea               stride3q, [strideq*3]
  192.     pxor                    m4, m4
  193.     psadbw                  m0, m4
  194.     psadbw                  m1, m4
  195.     psadbw                  m2, m4
  196.     psadbw                  m3, m4
  197.     paddw                   m0, m1
  198.     paddw                   m2, m3
  199.     paddw                   m0, m2
  200.     movhlps                 m1, m0
  201.     paddw                   m0, m1
  202. %if cpuflag(ssse3)
  203.     pmulhrsw                m0, [pw_512]
  204.     pshufb                  m0, m4
  205. %else
  206.     paddw                   m0, [pw_32]
  207.     psraw                   m0, 6
  208.     punpcklbw               m0, m0
  209.     pshuflw                 m0, m0, q0000
  210.     punpcklqdq              m0, m0
  211. %endif
  212.     mov                   cntd, 8
  213. .loop:
  214.     mova   [dstq+strideq*0+ 0], m0
  215.     mova   [dstq+strideq*0+16], m0
  216.     mova   [dstq+strideq*1+ 0], m0
  217.     mova   [dstq+strideq*1+16], m0
  218.     mova   [dstq+strideq*2+ 0], m0
  219.     mova   [dstq+strideq*2+16], m0
  220.     mova   [dstq+stride3q + 0], m0
  221.     mova   [dstq+stride3q +16], m0
  222.     lea                   dstq, [dstq+strideq*4]
  223.     dec                   cntd
  224.     jg .loop
  225.     RET
  226. %endmacro
  227.  
  228. INIT_XMM sse2
  229. DC_16to32_FUNCS
  230. INIT_XMM ssse3
  231. DC_16to32_FUNCS
  232.  
  233. %if HAVE_AVX2_EXTERNAL
  234. INIT_YMM avx2
  235. cglobal vp9_ipred_dc_32x32, 4, 4, 3, dst, stride, l, a
  236.     mova                    m0, [lq]
  237.     mova                    m1, [aq]
  238.     DEFINE_ARGS dst, stride, stride3, cnt
  239.     lea               stride3q, [strideq*3]
  240.     pxor                    m2, m2
  241.     psadbw                  m0, m2
  242.     psadbw                  m1, m2
  243.     paddw                   m0, m1
  244.     vextracti128           xm1, m0, 1
  245.     paddw                  xm0, xm1
  246.     movhlps                xm1, xm0
  247.     paddw                  xm0, xm1
  248.     pmulhrsw               xm0, [pw_512]
  249.     vpbroadcastb            m0, xm0
  250.     mov                   cntd, 4
  251. .loop:
  252.     mova      [dstq+strideq*0], m0
  253.     mova      [dstq+strideq*1], m0
  254.     mova      [dstq+strideq*2], m0
  255.     mova      [dstq+stride3q ], m0
  256.     lea                   dstq, [dstq+strideq*4]
  257.     mova      [dstq+strideq*0], m0
  258.     mova      [dstq+strideq*1], m0
  259.     mova      [dstq+strideq*2], m0
  260.     mova      [dstq+stride3q ], m0
  261.     lea                   dstq, [dstq+strideq*4]
  262.     dec                   cntd
  263.     jg .loop
  264.     RET
  265. %endif
  266.  
  267. ; dc_top/left_NxN(uint8_t *dst, ptrdiff_t stride, const uint8_t *l, const uint8_t *a)
  268.  
  269. %macro DC_1D_4to8_FUNCS 2 ; dir (top or left), arg (a or l)
  270. cglobal vp9_ipred_dc_%1_4x4, 4, 4, 0, dst, stride, l, a
  271.     movd                    m0, [%2q]
  272.     pxor                    m1, m1
  273.     psadbw                  m0, m1
  274. %if cpuflag(ssse3)
  275.     pmulhrsw                m0, [pw_8192]
  276.     pshufb                  m0, m1
  277. %else
  278.     paddw                   m0, [pw_2]
  279.     psraw                   m0, 2
  280.     punpcklbw               m0, m0
  281.     pshufw                  m0, m0, q0000
  282. %endif
  283.     movd      [dstq+strideq*0], m0
  284.     movd      [dstq+strideq*1], m0
  285.     lea                   dstq, [dstq+strideq*2]
  286.     movd      [dstq+strideq*0], m0
  287.     movd      [dstq+strideq*1], m0
  288.     RET
  289.  
  290. cglobal vp9_ipred_dc_%1_8x8, 4, 4, 0, dst, stride, l, a
  291.     movq                    m0, [%2q]
  292.     DEFINE_ARGS dst, stride, stride3
  293.     lea               stride3q, [strideq*3]
  294.     pxor                    m1, m1
  295.     psadbw                  m0, m1
  296. %if cpuflag(ssse3)
  297.     pmulhrsw                m0, [pw_4096]
  298.     pshufb                  m0, m1
  299. %else
  300.     paddw                   m0, [pw_4]
  301.     psraw                   m0, 3
  302.     punpcklbw               m0, m0
  303.     pshufw                  m0, m0, q0000
  304. %endif
  305.     movq      [dstq+strideq*0], m0
  306.     movq      [dstq+strideq*1], m0
  307.     movq      [dstq+strideq*2], m0
  308.     movq      [dstq+stride3q ], m0
  309.     lea                   dstq, [dstq+strideq*4]
  310.     movq      [dstq+strideq*0], m0
  311.     movq      [dstq+strideq*1], m0
  312.     movq      [dstq+strideq*2], m0
  313.     movq      [dstq+stride3q ], m0
  314.     RET
  315. %endmacro
  316.  
  317. INIT_MMX mmxext
  318. DC_1D_4to8_FUNCS top,  a
  319. DC_1D_4to8_FUNCS left, l
  320. INIT_MMX ssse3
  321. DC_1D_4to8_FUNCS top,  a
  322. DC_1D_4to8_FUNCS left, l
  323.  
  324. %macro DC_1D_16to32_FUNCS 2; dir (top or left), arg (a or l)
  325. cglobal vp9_ipred_dc_%1_16x16, 4, 4, 3, dst, stride, l, a
  326.     mova                    m0, [%2q]
  327.     DEFINE_ARGS dst, stride, stride3, cnt
  328.     lea               stride3q, [strideq*3]
  329.     pxor                    m2, m2
  330.     psadbw                  m0, m2
  331.     movhlps                 m1, m0
  332.     paddw                   m0, m1
  333. %if cpuflag(ssse3)
  334.     pmulhrsw                m0, [pw_2048]
  335.     pshufb                  m0, m2
  336. %else
  337.     paddw                   m0, [pw_8]
  338.     psraw                   m0, 4
  339.     punpcklbw               m0, m0
  340.     pshuflw                 m0, m0, q0000
  341.     punpcklqdq              m0, m0
  342. %endif
  343.     mov                   cntd, 4
  344. .loop:
  345.     mova      [dstq+strideq*0], m0
  346.     mova      [dstq+strideq*1], m0
  347.     mova      [dstq+strideq*2], m0
  348.     mova      [dstq+stride3q ], m0
  349.     lea                   dstq, [dstq+strideq*4]
  350.     dec                   cntd
  351.     jg .loop
  352.     RET
  353.  
  354. cglobal vp9_ipred_dc_%1_32x32, 4, 4, 3, dst, stride, l, a
  355.     mova                    m0, [%2q]
  356.     mova                    m1, [%2q+16]
  357.     DEFINE_ARGS dst, stride, stride3, cnt
  358.     lea               stride3q, [strideq*3]
  359.     pxor                    m2, m2
  360.     psadbw                  m0, m2
  361.     psadbw                  m1, m2
  362.     paddw                   m0, m1
  363.     movhlps                 m1, m0
  364.     paddw                   m0, m1
  365. %if cpuflag(ssse3)
  366.     pmulhrsw                m0, [pw_1024]
  367.     pshufb                  m0, m2
  368. %else
  369.     paddw                   m0, [pw_16]
  370.     psraw                   m0, 5
  371.     punpcklbw               m0, m0
  372.     pshuflw                 m0, m0, q0000
  373.     punpcklqdq              m0, m0
  374. %endif
  375.     mov                   cntd, 8
  376. .loop:
  377.     mova   [dstq+strideq*0+ 0], m0
  378.     mova   [dstq+strideq*0+16], m0
  379.     mova   [dstq+strideq*1+ 0], m0
  380.     mova   [dstq+strideq*1+16], m0
  381.     mova   [dstq+strideq*2+ 0], m0
  382.     mova   [dstq+strideq*2+16], m0
  383.     mova   [dstq+stride3q + 0], m0
  384.     mova   [dstq+stride3q +16], m0
  385.     lea                   dstq, [dstq+strideq*4]
  386.     dec                   cntd
  387.     jg .loop
  388.     RET
  389. %endmacro
  390.  
  391. INIT_XMM sse2
  392. DC_1D_16to32_FUNCS top,  a
  393. DC_1D_16to32_FUNCS left, l
  394. INIT_XMM ssse3
  395. DC_1D_16to32_FUNCS top,  a
  396. DC_1D_16to32_FUNCS left, l
  397.  
  398. %macro DC_1D_AVX2_FUNCS 2 ; dir (top or left), arg (a or l)
  399. %if HAVE_AVX2_EXTERNAL
  400. cglobal vp9_ipred_dc_%1_32x32, 4, 4, 3, dst, stride, l, a
  401.     mova                    m0, [%2q]
  402.     DEFINE_ARGS dst, stride, stride3, cnt
  403.     lea               stride3q, [strideq*3]
  404.     pxor                    m2, m2
  405.     psadbw                  m0, m2
  406.     vextracti128           xm1, m0, 1
  407.     paddw                  xm0, xm1
  408.     movhlps                xm1, xm0
  409.     paddw                  xm0, xm1
  410.     pmulhrsw               xm0, [pw_1024]
  411.     vpbroadcastb            m0, xm0
  412.     mov                   cntd, 4
  413. .loop:
  414.     mova      [dstq+strideq*0], m0
  415.     mova      [dstq+strideq*1], m0
  416.     mova      [dstq+strideq*2], m0
  417.     mova      [dstq+stride3q ], m0
  418.     lea                   dstq, [dstq+strideq*4]
  419.     mova      [dstq+strideq*0], m0
  420.     mova      [dstq+strideq*1], m0
  421.     mova      [dstq+strideq*2], m0
  422.     mova      [dstq+stride3q ], m0
  423.     lea                   dstq, [dstq+strideq*4]
  424.     dec                   cntd
  425.     jg .loop
  426.     RET
  427. %endif
  428. %endmacro
  429.  
  430. INIT_YMM avx2
  431. DC_1D_AVX2_FUNCS top,  a
  432. DC_1D_AVX2_FUNCS left, l
  433.  
  434. ; v
  435.  
  436. INIT_MMX mmx
  437. cglobal vp9_ipred_v_8x8, 4, 4, 0, dst, stride, l, a
  438.     movq                    m0, [aq]
  439.     DEFINE_ARGS dst, stride, stride3
  440.     lea               stride3q, [strideq*3]
  441.     movq      [dstq+strideq*0], m0
  442.     movq      [dstq+strideq*1], m0
  443.     movq      [dstq+strideq*2], m0
  444.     movq      [dstq+stride3q ], m0
  445.     lea                   dstq, [dstq+strideq*4]
  446.     movq      [dstq+strideq*0], m0
  447.     movq      [dstq+strideq*1], m0
  448.     movq      [dstq+strideq*2], m0
  449.     movq      [dstq+stride3q ], m0
  450.     RET
  451.  
  452. INIT_XMM sse
  453. cglobal vp9_ipred_v_16x16, 4, 4, 1, dst, stride, l, a
  454.     mova                    m0, [aq]
  455.     DEFINE_ARGS dst, stride, stride3, cnt
  456.     lea               stride3q, [strideq*3]
  457.     mov                   cntd, 4
  458. .loop:
  459.     mova      [dstq+strideq*0], m0
  460.     mova      [dstq+strideq*1], m0
  461.     mova      [dstq+strideq*2], m0
  462.     mova      [dstq+stride3q ], m0
  463.     lea                   dstq, [dstq+strideq*4]
  464.     dec                   cntd
  465.     jg .loop
  466.     RET
  467.  
  468. INIT_XMM sse
  469. cglobal vp9_ipred_v_32x32, 4, 4, 2, dst, stride, l, a
  470.     mova                    m0, [aq]
  471.     mova                    m1, [aq+16]
  472.     DEFINE_ARGS dst, stride, stride3, cnt
  473.     lea               stride3q, [strideq*3]
  474.     mov                   cntd, 8
  475. .loop:
  476.     mova   [dstq+strideq*0+ 0], m0
  477.     mova   [dstq+strideq*0+16], m1
  478.     mova   [dstq+strideq*1+ 0], m0
  479.     mova   [dstq+strideq*1+16], m1
  480.     mova   [dstq+strideq*2+ 0], m0
  481.     mova   [dstq+strideq*2+16], m1
  482.     mova   [dstq+stride3q + 0], m0
  483.     mova   [dstq+stride3q +16], m1
  484.     lea                   dstq, [dstq+strideq*4]
  485.     dec                   cntd
  486.     jg .loop
  487.     RET
  488.  
  489. INIT_YMM avx
  490. cglobal vp9_ipred_v_32x32, 4, 4, 1, dst, stride, l, a
  491.     mova                    m0, [aq]
  492.     DEFINE_ARGS dst, stride, stride3, cnt
  493.     lea               stride3q, [strideq*3]
  494.     mov                   cntd, 4
  495. .loop:
  496.     mova      [dstq+strideq*0], m0
  497.     mova      [dstq+strideq*1], m0
  498.     mova      [dstq+strideq*2], m0
  499.     mova      [dstq+stride3q ], m0
  500.     lea                   dstq, [dstq+strideq*4]
  501.     mova      [dstq+strideq*0], m0
  502.     mova      [dstq+strideq*1], m0
  503.     mova      [dstq+strideq*2], m0
  504.     mova      [dstq+stride3q ], m0
  505.     lea                   dstq, [dstq+strideq*4]
  506.     dec                   cntd
  507.     jg .loop
  508.     RET
  509.  
  510. ; h
  511.  
  512. %macro H_XMM_FUNCS 2
  513. %if notcpuflag(avx)
  514. cglobal vp9_ipred_h_4x4, 3, 4, 1, dst, stride, l, stride3
  515.     movd                    m0, [lq]
  516. %if cpuflag(ssse3)
  517.     pshufb                  m0, [pb_4x3_4x2_4x1_4x0]
  518. %else
  519.     punpcklbw               m0, m0
  520.     pshuflw                 m0, m0, q0123
  521.     punpcklwd               m0, m0
  522. %endif
  523.     lea               stride3q, [strideq*3]
  524.     movd      [dstq+strideq*0], m0
  525.     psrldq                  m0, 4
  526.     movd      [dstq+strideq*1], m0
  527.     psrldq                  m0, 4
  528.     movd      [dstq+strideq*2], m0
  529.     psrldq                  m0, 4
  530.     movd      [dstq+stride3q ], m0
  531.     RET
  532. %endif
  533.  
  534. cglobal vp9_ipred_h_8x8, 3, 5, %1, dst, stride, l, stride3, cnt
  535. %if cpuflag(ssse3)
  536.     mova                    m2, [pb_8x1_8x0]
  537.     mova                    m3, [pb_8x3_8x2]
  538. %endif
  539.     lea               stride3q, [strideq*3]
  540.     mov                   cntq, 1
  541. .loop:
  542.     movd                    m0, [lq+cntq*4]
  543. %if cpuflag(ssse3)
  544.     pshufb                  m1, m0, m3
  545.     pshufb                  m0, m2
  546. %else
  547.     punpcklbw               m0, m0
  548.     punpcklwd               m0, m0
  549.     pshufd                  m1, m0, q2233
  550.     pshufd                  m0, m0, q0011
  551. %endif
  552.     movq      [dstq+strideq*0], m1
  553.     movhps    [dstq+strideq*1], m1
  554.     movq      [dstq+strideq*2], m0
  555.     movhps    [dstq+stride3q ], m0
  556.     lea                   dstq, [dstq+strideq*4]
  557.     dec                   cntq
  558.     jge .loop
  559.     RET
  560.  
  561. cglobal vp9_ipred_h_16x16, 3, 5, %2, dst, stride, l, stride3, cnt
  562. %if cpuflag(ssse3)
  563.     mova                    m5, [pb_1]
  564.     mova                    m6, [pb_2]
  565.     mova                    m7, [pb_3]
  566.     pxor                    m4, m4
  567. %endif
  568.     lea               stride3q, [strideq*3]
  569.     mov                   cntq, 3
  570. .loop:
  571.     movd                    m3, [lq+cntq*4]
  572. %if cpuflag(ssse3)
  573.     pshufb                  m0, m3, m7
  574.     pshufb                  m1, m3, m6
  575. %else
  576.     punpcklbw               m3, m3
  577.     punpcklwd               m3, m3
  578.     pshufd                  m0, m3, q3333
  579.     pshufd                  m1, m3, q2222
  580. %endif
  581.     mova      [dstq+strideq*0], m0
  582.     mova      [dstq+strideq*1], m1
  583. %if cpuflag(ssse3)
  584.     pshufb                  m2, m3, m5
  585.     pshufb                  m3, m4
  586. %else
  587.     pshufd                  m2, m3, q1111
  588.     pshufd                  m3, m3, q0000
  589. %endif
  590.     mova      [dstq+strideq*2], m2
  591.     mova      [dstq+stride3q ], m3
  592.     lea                   dstq, [dstq+strideq*4]
  593.     dec                   cntq
  594.     jge .loop
  595.     RET
  596.  
  597. cglobal vp9_ipred_h_32x32, 3, 5, %2, dst, stride, l, stride3, cnt
  598. %if cpuflag(ssse3)
  599.     mova                    m5, [pb_1]
  600.     mova                    m6, [pb_2]
  601.     mova                    m7, [pb_3]
  602.     pxor                    m4, m4
  603. %endif
  604.     lea               stride3q, [strideq*3]
  605.     mov                   cntq, 7
  606. .loop:
  607.     movd                    m3, [lq+cntq*4]
  608. %if cpuflag(ssse3)
  609.     pshufb                  m0, m3, m7
  610.     pshufb                  m1, m3, m6
  611. %else
  612.     punpcklbw               m3, m3
  613.     punpcklwd               m3, m3
  614.     pshufd                  m0, m3, q3333
  615.     pshufd                  m1, m3, q2222
  616. %endif
  617.     mova   [dstq+strideq*0+ 0], m0
  618.     mova   [dstq+strideq*0+16], m0
  619.     mova   [dstq+strideq*1+ 0], m1
  620.     mova   [dstq+strideq*1+16], m1
  621. %if cpuflag(ssse3)
  622.     pshufb                  m2, m3, m5
  623.     pshufb                  m3, m4
  624. %else
  625.     pshufd                  m2, m3, q1111
  626.     pshufd                  m3, m3, q0000
  627. %endif
  628.     mova   [dstq+strideq*2+ 0], m2
  629.     mova   [dstq+strideq*2+16], m2
  630.     mova   [dstq+stride3q + 0], m3
  631.     mova   [dstq+stride3q +16], m3
  632.     lea                   dstq, [dstq+strideq*4]
  633.     dec                   cntq
  634.     jge .loop
  635.     RET
  636. %endmacro
  637.  
  638. INIT_XMM sse2
  639. H_XMM_FUNCS 2, 4
  640. INIT_XMM ssse3
  641. H_XMM_FUNCS 4, 8
  642. INIT_XMM avx
  643. H_XMM_FUNCS 4, 8
  644.  
  645. %if HAVE_AVX2_EXTERNAL
  646. INIT_YMM avx2
  647. cglobal vp9_ipred_h_32x32, 3, 5, 8, dst, stride, l, stride3, cnt
  648.     mova                    m5, [pb_1]
  649.     mova                    m6, [pb_2]
  650.     mova                    m7, [pb_3]
  651.     pxor                    m4, m4
  652.     lea               stride3q, [strideq*3]
  653.     mov                   cntq, 7
  654. .loop:
  655.     movd                   xm3, [lq+cntq*4]
  656.     vinserti128             m3, m3, xm3, 1
  657.     pshufb                  m0, m3, m7
  658.     pshufb                  m1, m3, m6
  659.     mova      [dstq+strideq*0], m0
  660.     mova      [dstq+strideq*1], m1
  661.     pshufb                  m2, m3, m5
  662.     pshufb                  m3, m4
  663.     mova      [dstq+strideq*2], m2
  664.     mova      [dstq+stride3q ], m3
  665.     lea                   dstq, [dstq+strideq*4]
  666.     dec                   cntq
  667.     jge .loop
  668.     RET
  669. %endif
  670.  
  671. ; tm
  672.  
  673. %macro TM_MMX_FUNCS 0
  674. cglobal vp9_ipred_tm_4x4, 4, 4, 0, dst, stride, l, a
  675.     pxor                    m1, m1
  676.     movd                    m0, [aq]
  677.     pinsrw                  m2, [aq-1], 0
  678.     punpcklbw               m0, m1
  679.     DEFINE_ARGS dst, stride, l, cnt
  680. %if cpuflag(ssse3)
  681.     mova                    m3, [pw_m256]
  682.     mova                    m1, [pw_m255]
  683.     pshufb                  m2, m3
  684. %else
  685.     punpcklbw               m2, m1
  686.     pshufw                  m2, m2, q0000
  687. %endif
  688.     psubw                   m0, m2
  689.     mov                   cntq, 1
  690. .loop:
  691.     pinsrw                  m2, [lq+cntq*2], 0
  692. %if cpuflag(ssse3)
  693.     pshufb                  m4, m2, m1
  694.     pshufb                  m2, m3
  695. %else
  696.     punpcklbw               m2, m1
  697.     pshufw                  m4, m2, q1111
  698.     pshufw                  m2, m2, q0000
  699. %endif
  700.     paddw                   m4, m0
  701.     paddw                   m2, m0
  702.     packuswb                m4, m4
  703.     packuswb                m2, m2
  704.     movd      [dstq+strideq*0], m4
  705.     movd      [dstq+strideq*1], m2
  706.     lea                   dstq, [dstq+strideq*2]
  707.     dec                   cntq
  708.     jge .loop
  709.     RET
  710. %endmacro
  711.  
  712. INIT_MMX mmxext
  713. TM_MMX_FUNCS
  714. INIT_MMX ssse3
  715. TM_MMX_FUNCS
  716.  
  717. %macro TM_XMM_FUNCS 0
  718. cglobal vp9_ipred_tm_8x8, 4, 4, 5, dst, stride, l, a
  719.     pxor                    m1, m1
  720.     movh                    m0, [aq]
  721.     pinsrw                  m2, [aq-1], 0
  722.     punpcklbw               m0, m1
  723.     DEFINE_ARGS dst, stride, l, cnt
  724. %if cpuflag(ssse3)
  725.     mova                    m3, [pw_m256]
  726.     mova                    m1, [pw_m255]
  727.     pshufb                  m2, m3
  728. %else
  729.     punpcklbw               m2, m1
  730.     punpcklwd               m2, m2
  731.     pshufd                  m2, m2, q0000
  732. %endif
  733.     psubw                   m0, m2
  734.     mov                   cntq, 3
  735. .loop:
  736.     pinsrw                  m2, [lq+cntq*2], 0
  737. %if cpuflag(ssse3)
  738.     pshufb                  m4, m2, m1
  739.     pshufb                  m2, m3
  740. %else
  741.     punpcklbw               m2, m1
  742.     punpcklwd               m2, m2
  743.     pshufd                  m4, m2, q1111
  744.     pshufd                  m2, m2, q0000
  745. %endif
  746.     paddw                   m4, m0
  747.     paddw                   m2, m0
  748.     packuswb                m4, m2
  749.     movh      [dstq+strideq*0], m4
  750.     movhps    [dstq+strideq*1], m4
  751.     lea                   dstq, [dstq+strideq*2]
  752.     dec                   cntq
  753.     jge .loop
  754.     RET
  755.  
  756. cglobal vp9_ipred_tm_16x16, 4, 4, 8, dst, stride, l, a
  757.     pxor                    m3, m3
  758.     mova                    m0, [aq]
  759.     pinsrw                  m2, [aq-1], 0
  760.     punpckhbw               m1, m0, m3
  761.     punpcklbw               m0, m3
  762.     DEFINE_ARGS dst, stride, l, cnt
  763. %if cpuflag(ssse3)
  764.     mova                    m4, [pw_m256]
  765.     mova                    m3, [pw_m255]
  766.     pshufb                  m2, m4
  767. %else
  768.     punpcklbw               m2, m3
  769.     punpcklwd               m2, m2
  770.     pshufd                  m2, m2, q0000
  771. %endif
  772.     psubw                   m1, m2
  773.     psubw                   m0, m2
  774.     mov                   cntq, 7
  775. .loop:
  776.     pinsrw                  m7, [lq+cntq*2], 0
  777. %if cpuflag(ssse3)
  778.     pshufb                  m5, m7, m3
  779.     pshufb                  m7, m4
  780. %else
  781.     punpcklbw               m7, m3
  782.     punpcklwd               m7, m7
  783.     pshufd                  m5, m7, q1111
  784.     pshufd                  m7, m7, q0000
  785. %endif
  786.     paddw                   m2, m5, m0
  787.     paddw                   m5, m1
  788.     paddw                   m6, m7, m0
  789.     paddw                   m7, m1
  790.     packuswb                m2, m5
  791.     packuswb                m6, m7
  792.     mova      [dstq+strideq*0], m2
  793.     mova      [dstq+strideq*1], m6
  794.     lea                   dstq, [dstq+strideq*2]
  795.     dec                   cntq
  796.     jge .loop
  797.     RET
  798.  
  799. %if ARCH_X86_64
  800. %define mem 0
  801. %else
  802. %define mem 64
  803. %endif
  804. cglobal vp9_ipred_tm_32x32, 4, 4, 14, mem, dst, stride, l, a
  805.     pxor                    m5, m5
  806.     pinsrw                  m4, [aq-1], 0
  807.     mova                    m0, [aq]
  808.     mova                    m2, [aq+16]
  809.     DEFINE_ARGS dst, stride, l, cnt
  810. %if cpuflag(ssse3)
  811. %if ARCH_X86_64
  812.     mova                   m12, [pw_m256]
  813.     mova                   m13, [pw_m255]
  814. %define pw_m256_reg m12
  815. %define pw_m255_reg m13
  816. %else
  817. %define pw_m256_reg [pw_m256]
  818. %define pw_m255_reg [pw_m255]
  819. %endif
  820.     pshufb                  m4, pw_m256_reg
  821. %else
  822.     punpcklbw               m4, m5
  823.     punpcklwd               m4, m4
  824.     pshufd                  m4, m4, q0000
  825. %endif
  826.     punpckhbw               m1, m0,  m5
  827.     punpckhbw               m3, m2,  m5
  828.     punpcklbw               m0, m5
  829.     punpcklbw               m2, m5
  830.     psubw                   m1, m4
  831.     psubw                   m0, m4
  832.     psubw                   m3, m4
  833.     psubw                   m2, m4
  834. %if ARCH_X86_64
  835.     SWAP                     0, 8
  836.     SWAP                     1, 9
  837.     SWAP                     2, 10
  838.     SWAP                     3, 11
  839. %else
  840.     mova            [rsp+0*16], m0
  841.     mova            [rsp+1*16], m1
  842.     mova            [rsp+2*16], m2
  843.     mova            [rsp+3*16], m3
  844. %endif
  845.     mov                   cntq, 15
  846. .loop:
  847.     pinsrw                  m3, [lq+cntq*2], 0
  848. %if cpuflag(ssse3)
  849.     pshufb                  m7, m3, pw_m255_reg
  850.     pshufb                  m3, pw_m256_reg
  851. %else
  852.     pxor                    m7, m7
  853.     punpcklbw               m3, m7
  854.     punpcklwd               m3, m3
  855.     pshufd                  m7, m3, q1111
  856.     pshufd                  m3, m3, q0000
  857. %endif
  858. %if ARCH_X86_64
  859.     paddw                   m4, m7, m8
  860.     paddw                   m5, m7, m9
  861.     paddw                   m6, m7, m10
  862.     paddw                   m7, m11
  863.     paddw                   m0, m3, m8
  864.     paddw                   m1, m3, m9
  865.     paddw                   m2, m3, m10
  866.     paddw                   m3, m11
  867. %else
  868.     paddw                   m4, m7, [rsp+0*16]
  869.     paddw                   m5, m7, [rsp+1*16]
  870.     paddw                   m6, m7, [rsp+2*16]
  871.     paddw                   m7, [rsp+3*16]
  872.     paddw                   m0, m3, [rsp+0*16]
  873.     paddw                   m1, m3, [rsp+1*16]
  874.     paddw                   m2, m3, [rsp+2*16]
  875.     paddw                   m3, [rsp+3*16]
  876. %endif
  877.     packuswb                m4, m5
  878.     packuswb                m6, m7
  879.     packuswb                m0, m1
  880.     packuswb                m2, m3
  881.     mova   [dstq+strideq*0+ 0], m4
  882.     mova   [dstq+strideq*0+16], m6
  883.     mova   [dstq+strideq*1+ 0], m0
  884.     mova   [dstq+strideq*1+16], m2
  885.     lea                   dstq, [dstq+strideq*2]
  886.     dec                   cntq
  887.     jge .loop
  888.     RET
  889. %undef pw_m256_reg
  890. %undef pw_m255_reg
  891. %undef mem
  892. %endmacro
  893.  
  894. INIT_XMM sse2
  895. TM_XMM_FUNCS
  896. INIT_XMM ssse3
  897. TM_XMM_FUNCS
  898. INIT_XMM avx
  899. TM_XMM_FUNCS
  900.  
  901. %if HAVE_AVX2_EXTERNAL
  902. INIT_YMM avx2
  903. cglobal vp9_ipred_tm_32x32, 4, 4, 8, dst, stride, l, a
  904.     pxor                    m3, m3
  905.     pinsrw                 xm2, [aq-1], 0
  906.     vinserti128             m2, m2, xm2, 1
  907.     mova                    m0, [aq]
  908.     DEFINE_ARGS dst, stride, l, cnt
  909.     mova                    m4, [pw_m256]
  910.     mova                    m5, [pw_m255]
  911.     pshufb                  m2, m4
  912.     punpckhbw               m1, m0, m3
  913.     punpcklbw               m0, m3
  914.     psubw                   m1, m2
  915.     psubw                   m0, m2
  916.     mov                   cntq, 15
  917. .loop:
  918.     pinsrw                 xm7, [lq+cntq*2], 0
  919.     vinserti128             m7, m7, xm7, 1
  920.     pshufb                  m3, m7, m5
  921.     pshufb                  m7, m4
  922.     paddw                   m2, m3, m0
  923.     paddw                   m3, m1
  924.     paddw                   m6, m7, m0
  925.     paddw                   m7, m1
  926.     packuswb                m2, m3
  927.     packuswb                m6, m7
  928.     mova      [dstq+strideq*0], m2
  929.     mova      [dstq+strideq*1], m6
  930.     lea                   dstq, [dstq+strideq*2]
  931.     dec                   cntq
  932.     jge .loop
  933.     RET
  934. %endif
  935.  
  936. ; dl
  937.  
  938. %macro LOWPASS 4 ; left [dst], center, right, tmp
  939.     pxor                   m%4, m%1, m%3
  940.     pand                   m%4, [pb_1]
  941.     pavgb                  m%1, m%3
  942.     psubusb                m%1, m%4
  943.     pavgb                  m%1, m%2
  944. %endmacro
  945.  
  946. %macro DL_MMX_FUNCS 0
  947. cglobal vp9_ipred_dl_4x4, 4, 4, 0, dst, stride, l, a
  948.     movq                    m1, [aq]
  949. %if cpuflag(ssse3)
  950.     pshufb                  m0, m1, [pb_0to5_2x7]
  951.     pshufb                  m2, m1, [pb_2to6_3x7]
  952. %else
  953.     punpckhbw               m3, m1, m1              ; 44556677
  954.     pand                    m0, m1, [pb_6xm1_2x0]   ; 012345__
  955.     pand                    m3, [pb_6x0_2xm1]       ; ______77
  956.     psrlq                   m2, m1, 16              ; 234567__
  957.     por                     m0, m3                  ; 01234577
  958.     por                     m2, m3                  ; 23456777
  959. %endif
  960.     psrlq                   m1, 8
  961.     LOWPASS                  0, 1, 2, 3
  962.  
  963.     pshufw                  m1, m0, q3321
  964.     movd      [dstq+strideq*0], m0
  965.     movd      [dstq+strideq*2], m1
  966.     psrlq                   m0, 8
  967.     psrlq                   m1, 8
  968.     add                   dstq, strideq
  969.     movd      [dstq+strideq*0], m0
  970.     movd      [dstq+strideq*2], m1
  971.     RET
  972. %endmacro
  973.  
  974. INIT_MMX mmxext
  975. DL_MMX_FUNCS
  976. INIT_MMX ssse3
  977. DL_MMX_FUNCS
  978.  
  979. %macro DL_XMM_FUNCS 0
  980. cglobal vp9_ipred_dl_8x8, 4, 4, 4, dst, stride, stride5, a
  981.     movq                    m0, [aq]
  982.     lea               stride5q, [strideq*5]
  983. %if cpuflag(ssse3)
  984.     pshufb                  m1, m0, [pb_1to6_10x7]
  985. %else
  986.     punpcklbw               m1, m0, m0              ; 0011223344556677
  987.     punpckhwd               m1, m1                  ; 4x4,4x5,4x6,4x7
  988. %endif
  989.     shufps                  m0, m1, q3310
  990. %if notcpuflag(ssse3)
  991.     psrldq                  m1, m0, 1
  992.     shufps                  m1, m0, q3210
  993. %endif
  994.     psrldq                  m2, m1, 1
  995.     LOWPASS                  0, 1, 2, 3
  996.  
  997.     pshufd                  m1, m0, q3321
  998.     movq      [dstq+strideq*0], m0
  999.     movq      [dstq+strideq*4], m1
  1000.     psrldq                  m0, 1
  1001.     psrldq                  m1, 1
  1002.     movq      [dstq+strideq*1], m0
  1003.     movq      [dstq+stride5q ], m1
  1004.     lea                   dstq, [dstq+strideq*2]
  1005.     psrldq                  m0, 1
  1006.     psrldq                  m1, 1
  1007.     movq      [dstq+strideq*0], m0
  1008.     movq      [dstq+strideq*4], m1
  1009.     psrldq                  m0, 1
  1010.     psrldq                  m1, 1
  1011.     movq      [dstq+strideq*1], m0
  1012.     movq      [dstq+stride5q ], m1
  1013.     RET
  1014.  
  1015. cglobal vp9_ipred_dl_16x16, 4, 4, 6, dst, stride, l, a
  1016.     mova                    m0, [aq]
  1017. %if cpuflag(ssse3)
  1018.     mova                    m5, [pb_1toE_2xF]
  1019.     pshufb                  m1, m0, m5
  1020.     pshufb                  m2, m1, m5
  1021.     pshufb                  m4, m0, [pb_15]
  1022. %else
  1023.     pand                    m5, m0, [pb_15x0_1xm1]      ; _______________F
  1024.     psrldq                  m1, m0, 1                   ; 123456789ABCDEF_
  1025.     por                     m1, m5                      ; 123456789ABCDEFF
  1026.     psrldq                  m2, m1, 1                   ; 23456789ABCDEFF_
  1027.     por                     m2, m5                      ; 23456789ABCDEFFF
  1028.     pshufhw                 m4, m1, q3333               ; xxxxxxxxFFFFFFFF
  1029. %endif
  1030.     LOWPASS                  0, 1, 2, 3
  1031.     DEFINE_ARGS dst, stride, cnt, stride9
  1032.     lea               stride9q, [strideq+strideq*8]
  1033.     mov                   cntd, 4
  1034.  
  1035. .loop:
  1036.     movhlps                 m4, m0
  1037.     mova      [dstq+strideq*0], m0
  1038. %if cpuflag(ssse3)
  1039.     pshufb                  m0, m5
  1040. %else
  1041.     psrldq                  m0, 1
  1042.     por                     m0, m5
  1043. %endif
  1044.     mova      [dstq+strideq*8], m4
  1045.     movhlps                 m4, m0
  1046.     mova      [dstq+strideq*1], m0
  1047. %if cpuflag(ssse3)
  1048.     pshufb                  m0, m5
  1049. %else
  1050.     psrldq                  m0, 1
  1051.     por                     m0, m5
  1052. %endif
  1053.     mova      [dstq+stride9q ], m4
  1054.     lea                   dstq, [dstq+strideq*2]
  1055.     dec                   cntd
  1056.     jg .loop
  1057.     RET
  1058.  
  1059. cglobal vp9_ipred_dl_32x32, 4, 5, 8, dst, stride, cnt, a, dst16
  1060.     mova                    m0, [aq]
  1061.     mova                    m1, [aq+16]
  1062.     PALIGNR                 m2, m1, m0, 1, m4
  1063.     PALIGNR                 m3, m1, m0, 2, m4
  1064.     LOWPASS                  0, 2, 3, 4
  1065. %if cpuflag(ssse3)
  1066.     mova                    m5, [pb_1toE_2xF]
  1067.     pshufb                  m2, m1, m5
  1068.     pshufb                  m3, m2, m5
  1069.     pshufb                  m6, m1, [pb_15]
  1070.     mova                    m7, m6
  1071. %else
  1072.     pand                    m5, m1, [pb_15x0_1xm1]      ; _______________F
  1073.     psrldq                  m2, m1, 1                   ; 123456789ABCDEF_
  1074.     por                     m2, m5                      ; 123456789ABCDEFF
  1075.     psrldq                  m3, m2, 1                   ; 23456789ABCDEFF_
  1076.     por                     m3, m5                      ; 23456789ABCDEFFF
  1077.     pshufhw                 m7, m2, q3333               ; xxxxxxxxFFFFFFFF
  1078.     pshufd                  m6, m7, q3333
  1079. %endif
  1080.     LOWPASS                  1, 2, 3, 4
  1081.     lea                 dst16q, [dstq  +strideq*8]
  1082.     mov                   cntd, 8
  1083.     lea                 dst16q, [dst16q+strideq*8]
  1084. .loop:
  1085.     movhlps                 m7, m1
  1086.     mova [dstq  +strideq*0+ 0], m0
  1087.     mova [dstq  +strideq*0+16], m1
  1088.     movhps [dstq+strideq*8+ 0], m0
  1089.     movq [dstq  +strideq*8+ 8], m1
  1090.     mova [dstq  +strideq*8+16], m7
  1091.     mova [dst16q+strideq*0+ 0], m1
  1092.     mova [dst16q+strideq*0+16], m6
  1093.     mova [dst16q+strideq*8+ 0], m7
  1094.     mova [dst16q+strideq*8+16], m6
  1095. %if cpuflag(avx)
  1096.     vpalignr                m0, m1, m0, 1
  1097.     pshufb                  m1, m5
  1098. %elif cpuflag(ssse3)
  1099.     palignr                 m2, m1, m0, 1
  1100.     pshufb                  m1, m5
  1101.     mova                    m0, m2
  1102. %else
  1103.     mova                    m4, m1
  1104.     psrldq                  m0, 1
  1105.     pslldq                  m4, 15
  1106.     psrldq                  m1, 1
  1107.     por                     m0, m4
  1108.     por                     m1, m5
  1109. %endif
  1110.     add                   dstq, strideq
  1111.     add                 dst16q, strideq
  1112.     dec                   cntd
  1113.     jg .loop
  1114.     RET
  1115. %endmacro
  1116.  
  1117. INIT_XMM sse2
  1118. DL_XMM_FUNCS
  1119. INIT_XMM ssse3
  1120. DL_XMM_FUNCS
  1121. INIT_XMM avx
  1122. DL_XMM_FUNCS
  1123.  
  1124. ; dr
  1125.  
  1126. %macro DR_MMX_FUNCS 0
  1127. cglobal vp9_ipred_dr_4x4, 4, 4, 0, dst, stride, l, a
  1128.     movd                    m0, [lq]
  1129.     punpckldq               m0, [aq-1]
  1130.     movd                    m1, [aq+3]
  1131.     DEFINE_ARGS dst, stride, stride3
  1132.     lea               stride3q, [strideq*3]
  1133.     PALIGNR                 m1, m0, 1, m3
  1134.     psrlq                   m2, m1, 8
  1135.     LOWPASS                  0, 1, 2, 3
  1136.  
  1137.     movd      [dstq+stride3q ], m0
  1138.     psrlq                   m0, 8
  1139.     movd      [dstq+strideq*2], m0
  1140.     psrlq                   m0, 8
  1141.     movd      [dstq+strideq*1], m0
  1142.     psrlq                   m0, 8
  1143.     movd      [dstq+strideq*0], m0
  1144.     RET
  1145. %endmacro
  1146.  
  1147. INIT_MMX mmxext
  1148. DR_MMX_FUNCS
  1149. INIT_MMX ssse3
  1150. DR_MMX_FUNCS
  1151.  
  1152. %macro DR_XMM_FUNCS 0
  1153. cglobal vp9_ipred_dr_8x8, 4, 4, 4, dst, stride, l, a
  1154.     movq                    m1, [lq]
  1155.     movhps                  m1, [aq-1]
  1156.     movd                    m2, [aq+7]
  1157.     DEFINE_ARGS dst, stride, stride3
  1158.     lea               stride3q, [strideq*3]
  1159.     pslldq                  m0, m1, 1
  1160.     PALIGNR                 m2, m1, 1, m3
  1161.     LOWPASS                  0, 1, 2, 3
  1162.  
  1163.     movhps    [dstq+strideq*0], m0
  1164.     pslldq                  m0, 1
  1165.     movhps    [dstq+strideq*1], m0
  1166.     pslldq                  m0, 1
  1167.     movhps    [dstq+strideq*2], m0
  1168.     pslldq                  m0, 1
  1169.     movhps    [dstq+stride3q ], m0
  1170.     pslldq                  m0, 1
  1171.     lea                   dstq, [dstq+strideq*4]
  1172.     movhps    [dstq+strideq*0], m0
  1173.     pslldq                  m0, 1
  1174.     movhps    [dstq+strideq*1], m0
  1175.     pslldq                  m0, 1
  1176.     movhps    [dstq+strideq*2], m0
  1177.     pslldq                  m0, 1
  1178.     movhps    [dstq+stride3q ], m0
  1179.     RET
  1180.  
  1181. cglobal vp9_ipred_dr_16x16, 4, 4, 6, dst, stride, l, a
  1182.     mova                    m1, [lq]
  1183.     movu                    m2, [aq-1]
  1184.     movd                    m4, [aq+15]
  1185.     DEFINE_ARGS dst, stride, stride9, cnt
  1186.     lea               stride9q, [strideq *3]
  1187.     mov                   cntd, 4
  1188.     lea               stride9q, [stride9q*3]
  1189.     PALIGNR                 m4, m2, 1, m5
  1190.     PALIGNR                 m3, m2, m1, 15, m5
  1191.     LOWPASS                  3,  2, 4, 5
  1192.     pslldq                  m0, m1, 1
  1193.     PALIGNR                 m2, m1, 1, m4
  1194.     LOWPASS                  0,  1, 2, 4
  1195.  
  1196. .loop:
  1197.     mova    [dstq+strideq*0  ], m3
  1198.     movhps  [dstq+strideq*8+0], m0
  1199.     movq    [dstq+strideq*8+8], m3
  1200.     PALIGNR                 m3, m0, 15, m1
  1201.     pslldq                  m0, 1
  1202.     mova    [dstq+strideq*1  ], m3
  1203.     movhps  [dstq+stride9q +0], m0
  1204.     movq    [dstq+stride9q +8], m3
  1205.     PALIGNR                 m3, m0, 15, m1
  1206.     pslldq                  m0, 1
  1207.     lea                   dstq, [dstq+strideq*2]
  1208.     dec                   cntd
  1209.     jg .loop
  1210.     RET
  1211.  
  1212. cglobal vp9_ipred_dr_32x32, 4, 4, 8, dst, stride, l, a
  1213.     mova                    m1, [lq]
  1214.     mova                    m2, [lq+16]
  1215.     movu                    m3, [aq-1]
  1216.     movu                    m4, [aq+15]
  1217.     movd                    m5, [aq+31]
  1218.     DEFINE_ARGS dst, stride, stride8, cnt
  1219.     lea               stride8q, [strideq*8]
  1220.     PALIGNR                 m5, m4, 1, m7
  1221.     PALIGNR                 m6, m4, m3, 15, m7
  1222.     LOWPASS                  5,  4,  6,  7
  1223.     PALIGNR                 m4, m3, 1, m7
  1224.     PALIGNR                 m6, m3, m2, 15, m7
  1225.     LOWPASS                  4,  3,  6,  7
  1226.     PALIGNR                 m3, m2, 1, m7
  1227.     PALIGNR                 m6, m2, m1, 15, m7
  1228.     LOWPASS                  3,  2,  6,  7
  1229.     PALIGNR                 m2, m1, 1, m6
  1230.     pslldq                  m0, m1, 1
  1231.     LOWPASS                  2,  1,  0,  6
  1232.     mov                   cntd, 16
  1233.  
  1234.     ; out=m2/m3/m4/m5
  1235. .loop:
  1236.     mova  [dstq+stride8q*0+ 0], m4
  1237.     mova  [dstq+stride8q*0+16], m5
  1238.     mova  [dstq+stride8q*2+ 0], m3
  1239.     mova  [dstq+stride8q*2+16], m4
  1240.     PALIGNR                 m5, m4, 15, m6
  1241.     PALIGNR                 m4, m3, 15, m6
  1242.     PALIGNR                 m3, m2, 15, m6
  1243.     pslldq                  m2, 1
  1244.     add                   dstq, strideq
  1245.     dec                   cntd
  1246.     jg .loop
  1247.     RET
  1248. %endmacro
  1249.  
  1250. INIT_XMM sse2
  1251. DR_XMM_FUNCS
  1252. INIT_XMM ssse3
  1253. DR_XMM_FUNCS
  1254. INIT_XMM avx
  1255. DR_XMM_FUNCS
  1256.  
  1257. ; vl
  1258.  
  1259. INIT_MMX mmxext
  1260. cglobal vp9_ipred_vl_4x4, 4, 4, 0, dst, stride, l, a
  1261.     movq                    m0, [aq]
  1262.     psrlq                   m1, m0, 8
  1263.     psrlq                   m2, m1, 8
  1264.     LOWPASS                  2,  1, 0, 3
  1265.     pavgb                   m1, m0
  1266.     movd      [dstq+strideq*0], m1
  1267.     movd      [dstq+strideq*1], m2
  1268.     lea                   dstq, [dstq+strideq*2]
  1269.     psrlq                   m1, 8
  1270.     psrlq                   m2, 8
  1271.     movd      [dstq+strideq*0], m1
  1272.     movd      [dstq+strideq*1], m2
  1273.     RET
  1274.  
  1275. %macro VL_XMM_FUNCS 0
  1276. cglobal vp9_ipred_vl_8x8, 4, 4, 4, dst, stride, l, a
  1277.     movq                    m0, [aq]
  1278. %if cpuflag(ssse3)
  1279.     pshufb                  m0, [pb_0to6_9x7]
  1280. %else
  1281.     punpcklbw               m1, m0, m0
  1282.     punpckhwd               m1, m1
  1283.     shufps                  m0, m1, q3310
  1284. %endif
  1285.     DEFINE_ARGS dst, stride, stride3
  1286.     lea               stride3q, [strideq*3]
  1287.     psrldq                  m1, m0, 1
  1288.     psrldq                  m2, m0, 2
  1289.     LOWPASS                  2,  1,  0,  3
  1290.     pavgb                   m1, m0
  1291.  
  1292.     movq      [dstq+strideq*0], m1
  1293.     movq      [dstq+strideq*1], m2
  1294.     psrldq                  m1, 1
  1295.     psrldq                  m2, 1
  1296.     movq      [dstq+strideq*2], m1
  1297.     movq      [dstq+stride3q ], m2
  1298.     lea                   dstq, [dstq+strideq*4]
  1299.     psrldq                  m1, 1
  1300.     psrldq                  m2, 1
  1301.     movq      [dstq+strideq*0], m1
  1302.     movq      [dstq+strideq*1], m2
  1303.     psrldq                  m1, 1
  1304.     psrldq                  m2, 1
  1305.     movq      [dstq+strideq*2], m1
  1306.     movq      [dstq+stride3q ], m2
  1307.     RET
  1308.  
  1309. cglobal vp9_ipred_vl_16x16, 4, 4, 5, dst, stride, l, a
  1310.     mova                    m0, [aq]
  1311.     DEFINE_ARGS dst, stride, stride3, cnt
  1312.     lea               stride3q, [strideq*3]
  1313. %if cpuflag(ssse3)
  1314.     mova                    m4, [pb_1toE_2xF]
  1315.     pshufb                  m1, m0, m4
  1316.     pshufb                  m2, m1, m4
  1317. %else
  1318.     pand                    m4, m0, [pb_15x0_1xm1]  ; _______________F
  1319.     psrldq                  m1, m0, 1               ; 123456789ABCDEF_
  1320.     por                     m1, m4                  ; 123456789ABCDEFF
  1321.     psrldq                  m2, m1, 1               ; 23456789ABCDEFF_
  1322.     por                     m2, m4                  ; 23456789ABCDEFFF
  1323. %endif
  1324.     LOWPASS                  2,  1,  0, 3
  1325.     pavgb                   m1, m0
  1326.     mov                   cntd, 4
  1327. .loop:
  1328.     mova      [dstq+strideq*0], m1
  1329.     mova      [dstq+strideq*1], m2
  1330. %if cpuflag(ssse3)
  1331.     pshufb                  m1, m4
  1332.     pshufb                  m2, m4
  1333. %else
  1334.     psrldq                  m1, 1
  1335.     psrldq                  m2, 1
  1336.     por                     m1, m4
  1337.     por                     m2, m4
  1338. %endif
  1339.     mova      [dstq+strideq*2], m1
  1340.     mova      [dstq+stride3q ], m2
  1341. %if cpuflag(ssse3)
  1342.     pshufb                  m1, m4
  1343.     pshufb                  m2, m4
  1344. %else
  1345.     psrldq                  m1, 1
  1346.     psrldq                  m2, 1
  1347.     por                     m1, m4
  1348.     por                     m2, m4
  1349. %endif
  1350.     lea                   dstq, [dstq+strideq*4]
  1351.     dec                   cntd
  1352.     jg .loop
  1353.     RET
  1354.  
  1355. cglobal vp9_ipred_vl_32x32, 4, 4, 7, dst, stride, l, a
  1356.     mova                    m0, [aq]
  1357.     mova                    m5, [aq+16]
  1358.     DEFINE_ARGS dst, stride, dst16, cnt
  1359.     PALIGNR                 m2, m5, m0, 1, m4
  1360.     PALIGNR                 m3, m5, m0, 2, m4
  1361.     lea                 dst16q, [dstq  +strideq*8]
  1362.     LOWPASS                  3,  2,  0, 6
  1363.     pavgb                   m2, m0
  1364. %if cpuflag(ssse3)
  1365.     mova                    m4, [pb_1toE_2xF]
  1366.     pshufb                  m0, m5, m4
  1367.     pshufb                  m1, m0, m4
  1368. %else
  1369.     pand                    m4, m5, [pb_15x0_1xm1]  ; _______________F
  1370.     psrldq                  m0, m5, 1               ; 123456789ABCDEF_
  1371.     por                     m0, m4                  ; 123456789ABCDEFF
  1372.     psrldq                  m1, m0, 1               ; 23456789ABCDEFF_
  1373.     por                     m1, m4                  ; 23456789ABCDEFFF
  1374. %endif
  1375.     lea                 dst16q, [dst16q+strideq*8]
  1376.     LOWPASS                  1,  0,  5, 6
  1377.     pavgb                   m0, m5
  1378. %if cpuflag(ssse3)
  1379.     pshufb                  m5, [pb_15]
  1380. %else
  1381.     punpckhbw               m5, m4, m4
  1382.     pshufhw                 m5, m5, q3333
  1383.     punpckhqdq              m5, m5
  1384. %endif
  1385.     mov                   cntd, 8
  1386.  
  1387. .loop:
  1388. %macro %%write 3
  1389.     mova    [dstq+stride%1+ 0], %2
  1390.     mova    [dstq+stride%1+16], %3
  1391.     movhps  [dst16q+stride%1 ], %2
  1392.     movu  [dst16q+stride%1+ 8], %3
  1393.     movq  [dst16q+stride%1+24], m5
  1394. %if cpuflag(avx)
  1395.     palignr                 %2, %3, %2, 1
  1396.     pshufb                  %3, m4
  1397. %elif cpuflag(ssse3)
  1398.     palignr                 m6, %3, %2, 1
  1399.     pshufb                  %3, m4
  1400.     mova                    %2, m6
  1401. %else
  1402.     pslldq                  m6, %3, 15
  1403.     psrldq                  %3, 1
  1404.     psrldq                  %2, 1
  1405.     por                     %3, m4
  1406.     por                     %2, m6
  1407. %endif
  1408. %endmacro
  1409.  
  1410.     %%write                q*0, m2, m0
  1411.     %%write                q*1, m3, m1
  1412.     lea                   dstq, [dstq  +strideq*2]
  1413.     lea                 dst16q, [dst16q+strideq*2]
  1414.     dec                   cntd
  1415.     jg .loop
  1416.     RET
  1417. %endmacro
  1418.  
  1419. INIT_XMM sse2
  1420. VL_XMM_FUNCS
  1421. INIT_XMM ssse3
  1422. VL_XMM_FUNCS
  1423. INIT_XMM avx
  1424. VL_XMM_FUNCS
  1425.  
  1426. ; vr
  1427.  
  1428. %macro VR_MMX_FUNCS 0
  1429. cglobal vp9_ipred_vr_4x4, 4, 4, 0, dst, stride, l, a
  1430.     movq                    m1, [aq-1]
  1431.     punpckldq               m2, [lq]
  1432.     movd                    m0, [aq]
  1433.     DEFINE_ARGS dst, stride, stride3
  1434.     lea               stride3q, [strideq*3]
  1435.     pavgb                   m0, m1
  1436.     PALIGNR                 m1, m2, 5, m3
  1437.     psrlq                   m2, m1, 8
  1438.     psllq                   m3, m1, 8
  1439.     LOWPASS                  2,  1, 3, 4
  1440.  
  1441.     ; ABCD <- for the following predictor:
  1442.     ; EFGH
  1443.     ; IABC  | m0 contains ABCDxxxx
  1444.     ; JEFG  | m2 contains xJIEFGHx
  1445.  
  1446. %if cpuflag(ssse3)
  1447.     punpckldq               m0, m2
  1448.     pshufb                  m2, [pb_13456_3xm1]
  1449.     movd      [dstq+strideq*0], m0
  1450.     pshufb                  m0, [pb_6012_4xm1]
  1451.     movd      [dstq+stride3q ], m2
  1452.     psrlq                   m2, 8
  1453.     movd      [dstq+strideq*2], m0
  1454.     movd      [dstq+strideq*1], m2
  1455. %else
  1456.     psllq                   m1, m2, 40
  1457.     psrlq                   m2, 24
  1458.     movd      [dstq+strideq*0], m0
  1459.     movd      [dstq+strideq*1], m2
  1460.     PALIGNR                 m0, m1, 7, m3
  1461.     psllq                   m1, 8
  1462.     PALIGNR                 m2, m1, 7, m3
  1463.     movd      [dstq+strideq*2], m0
  1464.     movd      [dstq+stride3q ], m2
  1465. %endif
  1466.     RET
  1467. %endmacro
  1468.  
  1469. INIT_MMX mmxext
  1470. VR_MMX_FUNCS
  1471. INIT_MMX ssse3
  1472. VR_MMX_FUNCS
  1473.  
  1474. %macro VR_XMM_FUNCS 1 ; n_xmm_regs for 16x16
  1475. cglobal vp9_ipred_vr_8x8, 4, 4, 5, dst, stride, l, a
  1476.     movu                    m1, [aq-1]
  1477.     movhps                  m2, [lq]
  1478.     movq                    m0, [aq]
  1479.     DEFINE_ARGS dst, stride, stride3
  1480.     lea               stride3q, [strideq*3]
  1481.     pavgb                   m0, m1
  1482.     PALIGNR                 m1, m2, 9, m3
  1483.     pslldq                  m2, m1, 1
  1484.     pslldq                  m3, m1, 2
  1485.     LOWPASS                  1,  2, 3, 4
  1486.  
  1487.     ; ABCDEFGH <- for the following predictor:
  1488.     ; IJKLMNOP
  1489.     ; QABCDEFG  | m0 contains ABCDEFGHxxxxxxxx
  1490.     ; RIJKLMNO  | m1 contains xxVUTSRQIJKLMNOP
  1491.     ; SQABCDEF
  1492.     ; TRIJKLMN
  1493.     ; USQABCDE
  1494.     ; VTRIJKLM
  1495.  
  1496. %if cpuflag(ssse3)
  1497.     punpcklqdq              m0, m1 ; ABCDEFGHxxVUTSRQ
  1498. %endif
  1499.     movq      [dstq+strideq*0], m0
  1500.     movhps    [dstq+strideq*1], m1
  1501. %if cpuflag(ssse3)
  1502.     pshufb                  m0, [pb_6xm1_BDF_0to6]  ; xxxxxxUSQABCDEFG
  1503.     pshufb                  m1, [pb_6xm1_246_8toE]  ; xxxxxxVTRIJKLMNO
  1504. %else
  1505.     psrlw                   m2, m1, 8               ; x_U_S_Q_xxxxxxxx
  1506.     pand                    m3, m1, [pw_255]        ; x_V_T_R_xxxxxxxx
  1507.     packuswb                m3, m2                  ; xVTRxxxxxUSQxxxx
  1508.     pslldq                  m3, 4                   ; xxxxxVTRxxxxxUSQ
  1509.     PALIGNR                 m0, m3, 7, m4           ; xxxxxxUSQABCDEFG
  1510.     psrldq                  m1, 8
  1511.     pslldq                  m3, 8
  1512.     PALIGNR                 m1, m3, 7, m4           ; xxxxxxVTRIJKLMNO
  1513. %endif
  1514.     movhps    [dstq+strideq*2], m0
  1515.     movhps    [dstq+stride3q ], m1
  1516.     lea                   dstq, [dstq+strideq*4]
  1517.     pslldq                  m0, 1
  1518.     pslldq                  m1, 1
  1519.     movhps    [dstq+strideq*0], m0
  1520.     movhps    [dstq+strideq*1], m1
  1521.     pslldq                  m0, 1
  1522.     pslldq                  m1, 1
  1523.     movhps    [dstq+strideq*2], m0
  1524.     movhps    [dstq+stride3q ], m1
  1525.     RET
  1526.  
  1527. cglobal vp9_ipred_vr_16x16, 4, 4, %1, dst, stride, l, a
  1528.     mova                    m0, [aq]
  1529.     movu                    m1, [aq-1]
  1530.     mova                    m2, [lq]
  1531.     DEFINE_ARGS dst, stride, stride3, cnt
  1532.     lea               stride3q, [strideq*3]
  1533.     PALIGNR                 m3, m1, m2, 15, m6
  1534.     LOWPASS                  3,  1,  0,  4
  1535.     pavgb                   m0, m1
  1536.     PALIGNR                 m1, m2,  1, m6
  1537.     pslldq                  m4, m2,  1
  1538.     LOWPASS                  1,  2,  4,  5
  1539. %if cpuflag(ssse3)
  1540.     pshufb                  m1, [pb_02468ACE_13579BDF]
  1541. %else
  1542.     psrlw                   m5, m1, 8
  1543.     pand                    m1, [pw_255]
  1544.     packuswb                m1, m5
  1545. %endif
  1546.     mov                   cntd, 4
  1547.  
  1548. .loop:
  1549.     movlhps                 m2, m1
  1550.     mova      [dstq+strideq*0], m0
  1551.     mova      [dstq+strideq*1], m3
  1552.     PALIGNR                 m4, m0, m1, 15, m6
  1553.     PALIGNR                 m5, m3, m2, 15, m6
  1554.     mova      [dstq+strideq*2], m4
  1555.     mova      [dstq+stride3q ], m5
  1556.     lea                   dstq, [dstq+strideq*4]
  1557.     PALIGNR                 m0, m1, 14, m6
  1558.     PALIGNR                 m3, m2, 14, m6
  1559.     pslldq                  m1, 2
  1560.     dec                   cntd
  1561.     jg .loop
  1562.     RET
  1563.  
  1564. cglobal vp9_ipred_vr_32x32, 4, 4, 9, dst, stride, l, a
  1565.     mova                    m0, [aq]
  1566.     mova                    m2, [aq+16]
  1567.     movu                    m1, [aq-1]
  1568.     PALIGNR                 m3, m2, m0, 15, m6
  1569.     PALIGNR                 m4, m2, m0, 14, m6
  1570.     LOWPASS                  4,  3,  2,  5
  1571.     pavgb                   m3, m2
  1572.     mova                    m2, [lq+16]
  1573.     PALIGNR                 m5, m1, m2, 15, m6
  1574.     LOWPASS                  5,  1,  0,  6
  1575.     pavgb                   m0, m1
  1576.     mova                    m6, [lq]
  1577. %if ARCH_X86_64
  1578.     SWAP                     0, 8
  1579. %else
  1580.     mova                [dstq], m0
  1581. %endif
  1582.     PALIGNR                 m1, m2,  1, m0
  1583.     PALIGNR                 m7, m2, m6, 15, m0
  1584.     LOWPASS                  1,  2,  7,  0
  1585.     PALIGNR                 m2, m6,  1, m0
  1586.     pslldq                  m7, m6,  1
  1587.     LOWPASS                  2,  6,  7,  0
  1588. %if cpuflag(ssse3)
  1589.     pshufb                  m1, [pb_02468ACE_13579BDF]
  1590.     pshufb                  m2, [pb_02468ACE_13579BDF]
  1591. %else
  1592.     psrlw                   m0, m1, 8
  1593.     psrlw                   m6, m2, 8
  1594.     pand                    m1, [pw_255]
  1595.     pand                    m2, [pw_255]
  1596.     packuswb                m1, m0
  1597.     packuswb                m2, m6
  1598. %endif
  1599.     DEFINE_ARGS dst, stride, dst16, cnt
  1600.     lea                 dst16q, [dstq  +strideq*8]
  1601.     lea                 dst16q, [dst16q+strideq*8]
  1602.     SBUTTERFLY             qdq,  2,  1,  6
  1603. %if ARCH_X86_64
  1604.     SWAP                     0, 8
  1605. %else
  1606.     mova                    m0, [dstq]
  1607. %endif
  1608.     mov                   cntd, 8
  1609.  
  1610. .loop:
  1611.     ; even lines (0, 2, 4, ...): m1 | m0, m3
  1612.     ;  odd lines (1, 3, 5, ...): m2 | m5, m4
  1613. %macro %%write 4
  1614.     mova    [dstq+stride%1+ 0], %3
  1615.     mova    [dstq+stride%1+16], %4
  1616.     movhps  [dst16q+stride%1 ], %2
  1617.     movu  [dst16q+stride%1+ 8], %3
  1618.     movq  [dst16q+stride%1+24], %4
  1619.     PALIGNR                 %4, %3, 15, m6
  1620.     PALIGNR                 %3, %2, 15, m6
  1621.     pslldq                  %2,  1
  1622. %endmacro
  1623.  
  1624.     %%write                q*0, m1, m0, m3
  1625.     %%write                q*1, m2, m5, m4
  1626.     lea                   dstq, [dstq  +strideq*2]
  1627.     lea                 dst16q, [dst16q+strideq*2]
  1628.     dec                   cntd
  1629.     jg .loop
  1630.     RET
  1631. %endmacro
  1632.  
  1633. INIT_XMM sse2
  1634. VR_XMM_FUNCS 7
  1635. INIT_XMM ssse3
  1636. VR_XMM_FUNCS 6
  1637. INIT_XMM avx
  1638. VR_XMM_FUNCS 6
  1639.  
  1640. ; hd
  1641.  
  1642. INIT_MMX mmxext
  1643. cglobal vp9_ipred_hd_4x4, 4, 4, 0, dst, stride, l, a
  1644.     movd                    m0, [lq]
  1645.     punpckldq               m0, [aq-1]
  1646.     DEFINE_ARGS dst, stride, stride3
  1647.     lea               stride3q, [strideq*3]
  1648.     psrlq                   m1, m0, 8
  1649.     psrlq                   m2, m1, 8
  1650.     LOWPASS                  2,  1, 0,  3
  1651.     pavgb                   m1, m0
  1652.  
  1653.     ; DHIJ <- for the following predictor:
  1654.     ; CGDH
  1655.     ; BFCG  | m1 contains ABCDxxxx
  1656.     ; AEBF  | m2 contains EFGHIJxx
  1657.  
  1658.     punpcklbw               m1, m2
  1659.     punpckhdq               m0, m1, m2
  1660.  
  1661.     ; m1 contains AEBFCGDH
  1662.     ; m0 contains CGDHIJxx
  1663.  
  1664.     movd      [dstq+stride3q ], m1
  1665.     movd      [dstq+strideq*1], m0
  1666.     psrlq                   m1, 16
  1667.     psrlq                   m0, 16
  1668.     movd      [dstq+strideq*2], m1
  1669.     movd      [dstq+strideq*0], m0
  1670.     RET
  1671.  
  1672. %macro HD_XMM_FUNCS 0
  1673. cglobal vp9_ipred_hd_8x8, 4, 4, 5, dst, stride, l, a
  1674.     movq                    m0, [lq]
  1675.     movhps                  m0, [aq-1]
  1676.     DEFINE_ARGS dst, stride, stride3, dst4
  1677.     lea               stride3q, [strideq*3]
  1678.     lea                  dst4q, [dstq+strideq*4]
  1679.     psrldq                  m1, m0, 1
  1680.     psrldq                  m2, m1, 1
  1681.     LOWPASS                  2,  1,  0,  3
  1682.     pavgb                   m1, m0
  1683.  
  1684.     ; HPQRSTUV <- for the following predictor
  1685.     ; GOHPQRST
  1686.     ; FNGOHPQR  | m1 contains ABCDEFGHxxxxxxxx
  1687.     ; EMFNGOHP  | m2 contains IJKLMNOPQRSTUVxx
  1688.     ; DLEMFNGO
  1689.     ; CKDLEMFN
  1690.     ; BJCKDLEM
  1691.     ; AIBJCKDL
  1692.  
  1693.     punpcklbw               m1, m2
  1694.     movhlps                 m2, m2
  1695.  
  1696.     ; m1 contains AIBJCKDLEMFNGOHP
  1697.     ; m2 contains QRSTUVxxxxxxxxxx
  1698.  
  1699.     movhps   [dstq +stride3q ], m1
  1700.     movq     [dst4q+stride3q ], m1
  1701.     PALIGNR                 m3, m2, m1, 2, m4
  1702.     movhps   [dstq +strideq*2], m3
  1703.     movq     [dst4q+strideq*2], m3
  1704.     PALIGNR                 m3, m2, m1, 4, m4
  1705.     movhps   [dstq +strideq*1], m3
  1706.     movq     [dst4q+strideq*1], m3
  1707.     PALIGNR                 m2, m1, 6, m4
  1708.     movhps   [dstq +strideq*0], m2
  1709.     movq     [dst4q+strideq*0], m2
  1710.     RET
  1711.  
  1712. cglobal vp9_ipred_hd_16x16, 4, 6, 7, dst, stride, l, a
  1713.     mova                    m0, [lq]
  1714.     movu                    m3, [aq-1]
  1715.     DEFINE_ARGS dst, stride, stride4, dst4, dst8, dst12
  1716.     lea               stride4q, [strideq*4]
  1717.     lea                  dst4q, [dstq +stride4q]
  1718.     lea                  dst8q, [dst4q+stride4q]
  1719.     lea                 dst12q, [dst8q+stride4q]
  1720.     psrldq                  m4, m3,  1
  1721.     psrldq                  m5, m3,  2
  1722.     LOWPASS                  5,  4,  3,  6
  1723.     PALIGNR                 m1, m3, m0,  1, m6
  1724.     PALIGNR                 m2, m3, m0,  2, m6
  1725.     LOWPASS                  2,  1,  0,  6
  1726.     pavgb                   m1, m0
  1727.     SBUTTERFLY              bw,  1,  2,  6
  1728.  
  1729.     ; I PROBABLY INVERTED L0 ad L16 here
  1730.     ; m1, m2, m5
  1731. .loop:
  1732.     sub               stride4q, strideq
  1733.     movhps [dstq +stride4q +0], m2
  1734.     movq   [dstq +stride4q +8], m5
  1735.     mova   [dst4q+stride4q   ], m2
  1736.     movhps [dst8q+stride4q +0], m1
  1737.     movq   [dst8q+stride4q +8], m2
  1738.     mova  [dst12q+stride4q   ], m1
  1739. %if cpuflag(avx)
  1740.     palignr                 m1, m2, m1, 2
  1741.     palignr                 m2, m5, m2, 2
  1742. %elif cpuflag(ssse3)
  1743.     palignr                 m3, m2, m1, 2
  1744.     palignr                 m0, m5, m2, 2
  1745.     mova                    m1, m3
  1746.     mova                    m2, m0
  1747. %else
  1748.     ; slightly modified version of PALIGNR
  1749.     mova                    m6, m2
  1750.     mova                    m4, m5
  1751.     pslldq                  m6, 14
  1752.     pslldq                  m4, 14
  1753.     psrldq                  m1, 2
  1754.     psrldq                  m2, 2
  1755.     por                     m1, m6
  1756.     por                     m2, m4
  1757. %endif
  1758.     psrldq                  m5, 2
  1759.     jg .loop
  1760.     RET
  1761.  
  1762. cglobal vp9_ipred_hd_32x32, 4, 6, 8, dst, stride, l, a
  1763.     mova                    m0, [lq]
  1764.     mova                    m1, [lq+16]
  1765.     movu                    m2, [aq-1]
  1766.     movu                    m3, [aq+15]
  1767.     DEFINE_ARGS dst, stride, stride8, dst8, dst16, dst24
  1768.     lea               stride8q, [strideq*8]
  1769.     lea                  dst8q, [dstq  +stride8q]
  1770.     lea                 dst16q, [dst8q +stride8q]
  1771.     lea                 dst24q, [dst16q+stride8q]
  1772.     psrldq                  m4, m3,  1
  1773.     psrldq                  m5, m3,  2
  1774.     LOWPASS                  5,  4,  3,  6
  1775.     PALIGNR                 m4, m3, m2,  2, m6
  1776.     PALIGNR                 m3, m2,  1, m6
  1777.     LOWPASS                  4,  3,  2,  6
  1778.     PALIGNR                 m3, m2, m1,  2, m6
  1779.     PALIGNR                 m2, m1,  1, m6
  1780.     LOWPASS                  3,  2,  1,  6
  1781.     pavgb                   m2, m1
  1782.     PALIGNR                 m6, m1, m0,  1, m7
  1783.     PALIGNR                 m1, m0,  2, m7
  1784.     LOWPASS                  1,  6,  0,  7
  1785.     pavgb                   m0, m6
  1786.     SBUTTERFLY              bw,  2,  3,  6
  1787.     SBUTTERFLY              bw,  0,  1,  6
  1788.  
  1789.     ; m0, m1, m2, m3, m4, m5
  1790. .loop:
  1791.     sub               stride8q, strideq
  1792.     mova  [dstq  +stride8q+ 0], m3
  1793.     mova  [dstq  +stride8q+16], m4
  1794.     mova  [dst8q +stride8q+ 0], m2
  1795.     mova  [dst8q +stride8q+16], m3
  1796.     mova  [dst16q+stride8q+ 0], m1
  1797.     mova  [dst16q+stride8q+16], m2
  1798.     mova  [dst24q+stride8q+ 0], m0
  1799.     mova  [dst24q+stride8q+16], m1
  1800. %if cpuflag(avx)
  1801.     palignr                 m0, m1, m0, 2
  1802.     palignr                 m1, m2, m1, 2
  1803.     palignr                 m2, m3, m2, 2
  1804.     palignr                 m3, m4, m3, 2
  1805.     palignr                 m4, m5, m4, 2
  1806.     psrldq                  m5, 2
  1807. %elif cpuflag(ssse3)
  1808.     psrldq                  m6, m5, 2
  1809.     palignr                 m5, m4, 2
  1810.     palignr                 m4, m3, 2
  1811.     palignr                 m3, m2, 2
  1812.     palignr                 m2, m1, 2
  1813.     palignr                 m1, m0, 2
  1814.     mova                    m0, m1
  1815.     mova                    m1, m2
  1816.     mova                    m2, m3
  1817.     mova                    m3, m4
  1818.     mova                    m4, m5
  1819.     mova                    m5, m6
  1820. %else
  1821.     ; sort of a half-integrated version of PALIGNR
  1822.     pslldq                  m7, m4, 14
  1823.     pslldq                  m6, m5, 14
  1824.     psrldq                  m4, 2
  1825.     psrldq                  m5, 2
  1826.     por                     m4, m6
  1827.     pslldq                  m6, m3, 14
  1828.     psrldq                  m3, 2
  1829.     por                     m3, m7
  1830.     pslldq                  m7, m2, 14
  1831.     psrldq                  m2, 2
  1832.     por                     m2, m6
  1833.     pslldq                  m6, m1, 14
  1834.     psrldq                  m1, 2
  1835.     por                     m1, m7
  1836.     psrldq                  m0, 2
  1837.     por                     m0, m6
  1838. %endif
  1839.     jg .loop
  1840.     RET
  1841. %endmacro
  1842.  
  1843. INIT_XMM sse2
  1844. HD_XMM_FUNCS
  1845. INIT_XMM ssse3
  1846. HD_XMM_FUNCS
  1847. INIT_XMM avx
  1848. HD_XMM_FUNCS
  1849.  
  1850. %macro HU_MMX_FUNCS 0
  1851. cglobal vp9_ipred_hu_4x4, 3, 3, 0, dst, stride, l
  1852.     movd                    m0, [lq]
  1853. %if cpuflag(ssse3)
  1854.     pshufb                  m0, [pb_0to2_5x3]
  1855. %else
  1856.     punpcklbw               m1, m0, m0          ; 00112233
  1857.     pshufw                  m1, m1, q3333       ; 33333333
  1858.     punpckldq               m0, m1              ; 01233333
  1859. %endif
  1860.     psrlq                   m1, m0, 8
  1861.     psrlq                   m2, m1, 8
  1862.     LOWPASS                  2,  1, 0, 3
  1863.     pavgb                   m1, m0
  1864.     DEFINE_ARGS dst, stride, stride3
  1865.     lea               stride3q, [strideq*3]
  1866.     SBUTTERFLY              bw,  1, 2, 0
  1867.     PALIGNR                 m2, m1, 2, m0
  1868.     movd      [dstq+strideq*0], m1
  1869.     movd      [dstq+strideq*1], m2
  1870.     punpckhdq               m1, m1
  1871.     punpckhdq               m2, m2
  1872.     movd      [dstq+strideq*2], m1
  1873.     movd      [dstq+stride3q ], m2
  1874.     RET
  1875. %endmacro
  1876.  
  1877. INIT_MMX mmxext
  1878. HU_MMX_FUNCS
  1879. INIT_MMX ssse3
  1880. HU_MMX_FUNCS
  1881.  
  1882. %macro HU_XMM_FUNCS 1 ; n_xmm_regs in hu_32x32
  1883. cglobal vp9_ipred_hu_8x8, 3, 4, 4, dst, stride, l
  1884.     movq                    m0, [lq]
  1885. %if cpuflag(ssse3)
  1886.     pshufb                  m0, [pb_0to6_9x7]
  1887. %else
  1888.     punpcklbw               m1, m0, m0          ; 0011223344556677
  1889.     punpckhwd               m1, m1              ; 4444555566667777
  1890.     shufps                  m0, m1, q3310       ; 0123456777777777
  1891. %endif
  1892.     psrldq                  m1, m0, 1
  1893.     psrldq                  m2, m1, 1
  1894.     LOWPASS                  2,  1, 0, 3
  1895.     pavgb                   m1, m0
  1896.     DEFINE_ARGS dst, stride, stride3, dst4
  1897.     lea               stride3q, [strideq*3]
  1898.     lea                  dst4q, [dstq+strideq*4]
  1899.     SBUTTERFLY              bw,  1, 2, 0
  1900.     movq     [dstq +strideq*0], m1
  1901.     movhps   [dst4q+strideq*0], m1
  1902.     PALIGNR                 m0, m2, m1, 2, m3
  1903.     movq     [dstq +strideq*1], m0
  1904.     movhps   [dst4q+strideq*1], m0
  1905.     PALIGNR                 m0, m2, m1, 4, m3
  1906.     movq     [dstq +strideq*2], m0
  1907.     movhps   [dst4q+strideq*2], m0
  1908.     PALIGNR                 m2, m1, 6, m3
  1909.     movq     [dstq +stride3q ], m2
  1910.     movhps   [dst4q+stride3q ], m2
  1911.     RET
  1912.  
  1913. cglobal vp9_ipred_hu_16x16, 3, 4, 5, dst, stride, l
  1914.     mova                    m0, [lq]
  1915. %if cpuflag(ssse3)
  1916.     mova                    m3, [pb_2toE_3xF]
  1917.     pshufb                  m1, m0, [pb_1toE_2xF]
  1918.     pshufb                  m2, m0, m3
  1919. %else
  1920.     pand                    m3, m0, [pb_15x0_1xm1]
  1921.     psrldq                  m1, m0, 1
  1922.     por                     m1, m3
  1923.     punpckhbw               m3, m3
  1924.     psrldq                  m2, m0, 2
  1925.     por                     m2, m3
  1926. %endif
  1927.     LOWPASS                  2,  1,  0,  4
  1928.     pavgb                   m1, m0
  1929.     DEFINE_ARGS dst, stride, stride9, cnt
  1930.     lea                stride9q, [strideq*8+strideq]
  1931.     mov                   cntd,  4
  1932.     SBUTTERFLY              bw,  1,  2,  0
  1933.  
  1934. .loop:
  1935.     mova      [dstq+strideq*0], m1
  1936.     mova      [dstq+strideq*8], m2
  1937.     PALIGNR                 m0, m2, m1, 2, m4
  1938. %if cpuflag(ssse3)
  1939.     pshufb                  m2, m3
  1940. %else
  1941.     psrldq                  m2, 2
  1942.     por                     m2, m3
  1943. %endif
  1944.     mova      [dstq+strideq*1], m0
  1945.     mova      [dstq+stride9q ], m2
  1946.     PALIGNR                 m1, m2, m0, 2, m4
  1947. %if cpuflag(ssse3)
  1948.     pshufb                  m2, m3
  1949. %else
  1950.     psrldq                  m2, 2
  1951.     por                     m2, m3
  1952. %endif
  1953.     lea                   dstq, [dstq+strideq*2]
  1954.     dec                   cntd
  1955.     jg .loop
  1956.     RET
  1957.  
  1958. cglobal vp9_ipred_hu_32x32, 3, 7, %1, dst, stride, l
  1959.     mova                    m1, [lq]
  1960.     mova                    m0, [lq+16]
  1961.     PALIGNR                 m2, m0, m1,  1, m5
  1962.     PALIGNR                 m3, m0, m1,  2, m5
  1963.     LOWPASS                  3,  2,  1,  5
  1964.     pavgb                   m2, m1
  1965. %if cpuflag(ssse3)
  1966.     mova                    m4, [pb_2toE_3xF]
  1967.     pshufb                  m5, m0, [pb_1toE_2xF]
  1968.     pshufb                  m1, m0, m4
  1969. %else
  1970.     pand                    m4, m0, [pb_15x0_1xm1]
  1971.     psrldq                  m5, m0, 1
  1972.     por                     m5, m4
  1973.     punpckhbw               m4, m4
  1974.     psrldq                  m1, m0, 2
  1975.     por                     m1, m4
  1976. %endif
  1977.     LOWPASS                  1,  5,  0,  6
  1978.     pavgb                   m0, m5
  1979.     DEFINE_ARGS dst, stride, cnt, stride0, dst8, dst16, dst24
  1980.     mov                   cntd,  8
  1981.     xor               stride0q, stride0q
  1982.     lea                  dst8q, [dstq  +strideq*8]
  1983.     lea                 dst16q, [dst8q +strideq*8]
  1984.     lea                 dst24q, [dst16q+strideq*8]
  1985.     SBUTTERFLY              bw,  0,  1,  5
  1986.     SBUTTERFLY              bw,  2,  3,  5
  1987. %if cpuflag(ssse3)
  1988.     pshufb                  m6, m1, [pb_15]
  1989. %else
  1990.     pshufhw                 m6, m4, q3333
  1991.     punpckhqdq              m6, m6
  1992. %endif
  1993.  
  1994. .loop:
  1995.     mova  [dstq  +stride0q+ 0], m2
  1996.     mova  [dstq  +stride0q+16], m3
  1997.     mova  [dst8q +stride0q+ 0], m3
  1998.     mova  [dst8q +stride0q+16], m0
  1999.     mova  [dst16q+stride0q+ 0], m0
  2000.     mova  [dst16q+stride0q+16], m1
  2001.     mova  [dst24q+stride0q+ 0], m1
  2002.     mova  [dst24q+stride0q+16], m6
  2003. %if cpuflag(avx)
  2004.     palignr                 m2, m3, m2, 2
  2005.     palignr                 m3, m0, m3, 2
  2006.     palignr                 m0, m1, m0, 2
  2007.     pshufb                  m1, m4
  2008. %elif cpuflag(ssse3)
  2009.     pshufb                  m5, m1, m4
  2010.     palignr                 m1, m0, 2
  2011.     palignr                 m0, m3, 2
  2012.     palignr                 m3, m2, 2
  2013.     mova                    m2, m3
  2014.     mova                    m3, m0
  2015.     mova                    m0, m1
  2016.     mova                    m1, m5
  2017. %else
  2018.     ; half-integrated version of PALIGNR
  2019.     pslldq                  m5, m1, 14
  2020.     pslldq                  m7, m0, 14
  2021.     psrldq                  m1, 2
  2022.     psrldq                  m0, 2
  2023.     por                     m1, m4
  2024.     por                     m0, m5
  2025.     pslldq                  m5, m3, 14
  2026.     psrldq                  m3, 2
  2027.     por                     m3, m7
  2028.     psrldq                  m2, 2
  2029.     por                     m2, m5
  2030. %endif
  2031.     add               stride0q, strideq
  2032.     dec                   cntd
  2033.     jg .loop
  2034.     RET
  2035. %endmacro
  2036.  
  2037. INIT_XMM sse2
  2038. HU_XMM_FUNCS 8
  2039. INIT_XMM ssse3
  2040. HU_XMM_FUNCS 7
  2041. INIT_XMM avx
  2042. HU_XMM_FUNCS 7
  2043.  
  2044. ; FIXME 127, 128, 129 ?
  2045.