predict-a.asm
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:20k
源码类别:

Audio

开发平台:

Visual C++

  1. ;*****************************************************************************
  2. ;* predict-a.asm: h264 encoder library
  3. ;*****************************************************************************
  4. ;* Copyright (C) 2005-2008 x264 project
  5. ;*
  6. ;* Authors: Loren Merritt <lorenm@u.washington.edu>
  7. ;*          Jason Garrett-Glaser <darkshikari@gmail.com>
  8. ;*
  9. ;* This program is free software; you can redistribute it and/or modify
  10. ;* it under the terms of the GNU General Public License as published by
  11. ;* the Free Software Foundation; either version 2 of the License, or
  12. ;* (at your option) any later version.
  13. ;*
  14. ;* This program is distributed in the hope that it will be useful,
  15. ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17. ;* GNU General Public License for more details.
  18. ;*
  19. ;* You should have received a copy of the GNU General Public License
  20. ;* along with this program; if not, write to the Free Software
  21. ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
  22. ;*****************************************************************************
  23. %include "x86inc.asm"
  24. %include "x86util.asm"
  25. %macro STORE8x8 2
  26.     movq        [r0 + 0*FDEC_STRIDE], %1
  27.     movq        [r0 + 1*FDEC_STRIDE], %1
  28.     movq        [r0 + 2*FDEC_STRIDE], %1
  29.     movq        [r0 + 3*FDEC_STRIDE], %1
  30.     movq        [r0 + 4*FDEC_STRIDE], %2
  31.     movq        [r0 + 5*FDEC_STRIDE], %2
  32.     movq        [r0 + 6*FDEC_STRIDE], %2
  33.     movq        [r0 + 7*FDEC_STRIDE], %2
  34. %endmacro
  35. %macro STORE16x16 2
  36.     mov         r1d, 4
  37. .loop:
  38.     movq        [r0 + 0*FDEC_STRIDE], %1
  39.     movq        [r0 + 1*FDEC_STRIDE], %1
  40.     movq        [r0 + 2*FDEC_STRIDE], %1
  41.     movq        [r0 + 3*FDEC_STRIDE], %1
  42.     movq        [r0 + 0*FDEC_STRIDE + 8], %2
  43.     movq        [r0 + 1*FDEC_STRIDE + 8], %2
  44.     movq        [r0 + 2*FDEC_STRIDE + 8], %2
  45.     movq        [r0 + 3*FDEC_STRIDE + 8], %2
  46.     add         r0, 4*FDEC_STRIDE
  47.     dec         r1d
  48.     jg          .loop
  49. %endmacro
  50. %macro STORE16x16_SSE2 1
  51.     mov         r1d, 4
  52. .loop:
  53.     movdqa      [r0 + 0*FDEC_STRIDE], %1
  54.     movdqa      [r0 + 1*FDEC_STRIDE], %1
  55.     movdqa      [r0 + 2*FDEC_STRIDE], %1
  56.     movdqa      [r0 + 3*FDEC_STRIDE], %1
  57.     add         r0, 4*FDEC_STRIDE
  58.     dec         r1d
  59.     jg          .loop
  60. %endmacro
  61. SECTION_RODATA
  62. ALIGN 16
  63. pb_1:       times 16 db 1
  64. pb_3:       times 16 db 3
  65. pw_2:       times 4 dw 2
  66. pw_4:       times 4 dw 4
  67. pw_8:       times 8 dw 8
  68. pw_76543210:
  69. pw_3210:    dw 0, 1, 2, 3, 4, 5, 6, 7
  70. pb_00s_ff:  times 8 db 0
  71. pb_0s_ff:   times 7 db 0
  72.             db 0xff
  73. SECTION .text
  74. ; dest, left, right, src, tmp
  75. ; output: %1 = (t[n-1] + t[n]*2 + t[n+1] + 2) >> 2
  76. %macro PRED8x8_LOWPASS0 6
  77.     mov%6       %5, %2
  78.     pavgb       %2, %3
  79.     pxor        %3, %5
  80.     mov%6       %1, %4
  81.     pand        %3, [pb_1 GLOBAL]
  82.     psubusb     %2, %3
  83.     pavgb       %1, %2
  84. %endmacro
  85. %macro PRED8x8_LOWPASS 5
  86.     PRED8x8_LOWPASS0 %1, %2, %3, %4, %5, q
  87. %endmacro
  88. %macro PRED8x8_LOWPASS_XMM 5
  89.     PRED8x8_LOWPASS0 %1, %2, %3, %4, %5, dqa
  90. %endmacro
  91. ;-----------------------------------------------------------------------------
  92. ; void predict_4x4_ddl_mmxext( uint8_t *src )
  93. ;-----------------------------------------------------------------------------
  94. cglobal predict_4x4_ddl_mmxext, 1,1
  95.     sub         r0, FDEC_STRIDE
  96.     movq        mm3, [r0]
  97.     movq        mm1, [r0-1]
  98.     movq        mm2, mm3
  99.     movq        mm4, [pb_0s_ff GLOBAL]
  100.     psrlq       mm2, 8
  101.     pand        mm4, mm3
  102.     por         mm2, mm4
  103.     PRED8x8_LOWPASS mm0, mm1, mm2, mm3, mm5
  104. %assign Y 1
  105. %rep 4
  106.     psrlq       mm0, 8
  107.     movd        [r0+Y*FDEC_STRIDE], mm0
  108. %assign Y (Y+1)
  109. %endrep
  110.     RET
  111. ;-----------------------------------------------------------------------------
  112. ; void predict_4x4_vl_mmxext( uint8_t *src )
  113. ;-----------------------------------------------------------------------------
  114. cglobal predict_4x4_vl_mmxext, 1,1
  115.     movq        mm1, [r0-FDEC_STRIDE]
  116.     movq        mm3, mm1
  117.     movq        mm2, mm1
  118.     psrlq       mm3, 8
  119.     psrlq       mm2, 16
  120.     movq        mm4, mm3
  121.     pavgb       mm4, mm1
  122.     PRED8x8_LOWPASS mm0, mm1, mm2, mm3, mm5
  123.     movd        [r0+0*FDEC_STRIDE], mm4
  124.     movd        [r0+1*FDEC_STRIDE], mm0
  125.     psrlq       mm4, 8
  126.     psrlq       mm0, 8
  127.     movd        [r0+2*FDEC_STRIDE], mm4
  128.     movd        [r0+3*FDEC_STRIDE], mm0
  129.     RET
  130. ;-----------------------------------------------------------------------------
  131. ; void predict_4x4_dc( uint8_t *src )
  132. ;-----------------------------------------------------------------------------
  133. cglobal predict_4x4_dc_mmxext, 1,4
  134.     pxor   mm7, mm7
  135.     movd   mm0, [r0-FDEC_STRIDE]
  136.     psadbw mm0, mm7
  137.     movd   r3d, mm0
  138.     movzx  r1d, byte [r0-1]
  139. %assign n 1
  140. %rep 3
  141.     movzx  r2d, byte [r0+FDEC_STRIDE*n-1]
  142.     add    r1d, r2d
  143. %assign n n+1
  144. %endrep
  145.     lea    r1d, [r1+r3+4]
  146.     shr    r1d, 3
  147.     imul   r1d, 0x01010101
  148.     mov   [r0+FDEC_STRIDE*0], r1d
  149.     mov   [r0+FDEC_STRIDE*1], r1d
  150.     mov   [r0+FDEC_STRIDE*2], r1d
  151.     mov   [r0+FDEC_STRIDE*3], r1d
  152.     RET
  153. ;-----------------------------------------------------------------------------
  154. ; void predict_8x8_v_mmxext( uint8_t *src, uint8_t *edge )
  155. ;-----------------------------------------------------------------------------
  156. cglobal predict_8x8_v_mmxext, 2,2
  157.     movq        mm0, [r1+16]
  158.     STORE8x8    mm0, mm0
  159.     RET
  160. ;-----------------------------------------------------------------------------
  161. ; void predict_8x8_h_mmxext( uint8_t *src, uint8_t edge[33] )
  162. ;-----------------------------------------------------------------------------
  163. INIT_MMX
  164. cglobal predict_8x8_h_mmxext, 2,2
  165.     movu   m3, [r1+7]
  166.     mova   m7, m3
  167.     punpckhbw m3, m3
  168.     punpcklbw m7, m7
  169.     pshufw m0, m3, 0xff
  170.     pshufw m1, m3, 0xaa
  171.     pshufw m2, m3, 0x55
  172.     pshufw m3, m3, 0x00
  173.     pshufw m4, m7, 0xff
  174.     pshufw m5, m7, 0xaa
  175.     pshufw m6, m7, 0x55
  176.     pshufw m7, m7, 0x00
  177. %assign n 0
  178. %rep 8
  179.     mova [r0+n*FDEC_STRIDE], m %+ n
  180. %assign n n+1
  181. %endrep
  182.     RET
  183. ;-----------------------------------------------------------------------------
  184. ; void predict_8x8_dc_mmxext( uint8_t *src, uint8_t *edge );
  185. ;-----------------------------------------------------------------------------
  186. cglobal predict_8x8_dc_mmxext, 2,2
  187.     pxor        mm0, mm0
  188.     pxor        mm1, mm1
  189.     psadbw      mm0, [r1+7]
  190.     psadbw      mm1, [r1+16]
  191.     paddw       mm0, [pw_8 GLOBAL]
  192.     paddw       mm0, mm1
  193.     psrlw       mm0, 4
  194.     pshufw      mm0, mm0, 0
  195.     packuswb    mm0, mm0
  196.     STORE8x8    mm0, mm0
  197.     RET
  198. ;-----------------------------------------------------------------------------
  199. ; void predict_8x8_dc_top_mmxext( uint8_t *src, uint8_t *edge );
  200. ;-----------------------------------------------------------------------------
  201. %macro PRED8x8_DC 2
  202. cglobal %1, 2,2
  203.     pxor        mm0, mm0
  204.     psadbw      mm0, [r1+%2]
  205.     paddw       mm0, [pw_4 GLOBAL]
  206.     psrlw       mm0, 3
  207.     pshufw      mm0, mm0, 0
  208.     packuswb    mm0, mm0
  209.     STORE8x8    mm0, mm0
  210.     RET
  211. %endmacro
  212. PRED8x8_DC predict_8x8_dc_top_mmxext, 16
  213. PRED8x8_DC predict_8x8_dc_left_mmxext, 7
  214. %ifndef ARCH_X86_64
  215. ; sse2 is faster even on amd, so there's no sense in spending exe size on these
  216. ; functions if we know sse2 is available.
  217. ;-----------------------------------------------------------------------------
  218. ; void predict_8x8_ddl_mmxext( uint8_t *src, uint8_t *edge )
  219. ;-----------------------------------------------------------------------------
  220. cglobal predict_8x8_ddl_mmxext, 2,2
  221.     movq        mm5, [r1+16]
  222.     movq        mm2, [r1+17]
  223.     movq        mm3, [r1+23]
  224.     movq        mm4, [r1+25]
  225.     movq        mm1, mm5
  226.     psllq       mm1, 8
  227.     PRED8x8_LOWPASS mm0, mm1, mm2, mm5, mm7
  228.     PRED8x8_LOWPASS mm1, mm3, mm4, [r1+24], mm6
  229. %assign Y 7
  230. %rep 6
  231.     movq        [r0+Y*FDEC_STRIDE], mm1
  232.     movq        mm2, mm0
  233.     psllq       mm1, 8
  234.     psrlq       mm2, 56
  235.     psllq       mm0, 8
  236.     por         mm1, mm2
  237. %assign Y (Y-1)
  238. %endrep
  239.     movq        [r0+Y*FDEC_STRIDE], mm1
  240.     psllq       mm1, 8
  241.     psrlq       mm0, 56
  242.     por         mm1, mm0
  243. %assign Y (Y-1)
  244.     movq        [r0+Y*FDEC_STRIDE], mm1
  245.     RET
  246. ;-----------------------------------------------------------------------------
  247. ; void predict_8x8_ddr_mmxext( uint8_t *src, uint8_t *edge )
  248. ;-----------------------------------------------------------------------------
  249. cglobal predict_8x8_ddr_mmxext, 2,2
  250.     movq        mm1, [r1+7]
  251.     movq        mm2, [r1+9]
  252.     movq        mm3, [r1+15]
  253.     movq        mm4, [r1+17]
  254.     PRED8x8_LOWPASS mm0, mm1, mm2, [r1+8], mm7
  255.     PRED8x8_LOWPASS mm1, mm3, mm4, [r1+16], mm6
  256. %assign Y 7
  257. %rep 6
  258.     movq        [r0+Y*FDEC_STRIDE], mm0
  259.     movq        mm2, mm1
  260.     psrlq       mm0, 8
  261.     psllq       mm2, 56
  262.     psrlq       mm1, 8
  263.     por         mm0, mm2
  264. %assign Y (Y-1)
  265. %endrep
  266.     movq        [r0+Y*FDEC_STRIDE], mm0
  267.     psrlq       mm0, 8
  268.     psllq       mm1, 56
  269.     por         mm0, mm1
  270. %assign Y (Y-1)
  271.     movq        [r0+Y*FDEC_STRIDE], mm0
  272.     RET
  273. %endif ; !ARCH_X86_64
  274. ;-----------------------------------------------------------------------------
  275. ; void predict_8x8_ddl_sse2( uint8_t *src, uint8_t *edge )
  276. ;-----------------------------------------------------------------------------
  277. cglobal predict_8x8_ddl_sse2, 2,2
  278.     movdqa      xmm3, [r1+16]
  279.     movdqu      xmm2, [r1+17]
  280.     movdqa      xmm1, xmm3
  281.     pslldq      xmm1, 1
  282.     PRED8x8_LOWPASS_XMM xmm0, xmm1, xmm2, xmm3, xmm4
  283. %assign Y 0
  284. %rep 8
  285.     psrldq      xmm0, 1
  286.     movq        [r0+Y*FDEC_STRIDE], xmm0
  287. %assign Y (Y+1)
  288. %endrep
  289.     RET
  290. ;-----------------------------------------------------------------------------
  291. ; void predict_8x8_ddr_sse2( uint8_t *src, uint8_t *edge )
  292. ;-----------------------------------------------------------------------------
  293. cglobal predict_8x8_ddr_sse2, 2,2
  294.     movdqu      xmm3, [r1+8]
  295.     movdqu      xmm1, [r1+7]
  296.     movdqa      xmm2, xmm3
  297.     psrldq      xmm2, 1
  298.     PRED8x8_LOWPASS_XMM xmm0, xmm1, xmm2, xmm3, xmm4
  299.     movdqa      xmm1, xmm0
  300.     psrldq      xmm1, 1
  301. %assign Y 7
  302. %rep 3
  303.     movq        [r0+Y*FDEC_STRIDE], xmm0
  304.     movq        [r0+(Y-1)*FDEC_STRIDE], xmm1
  305.     psrldq      xmm0, 2
  306.     psrldq      xmm1, 2
  307. %assign Y (Y-2)
  308. %endrep
  309.     movq        [r0+1*FDEC_STRIDE], xmm0
  310.     movq        [r0+0*FDEC_STRIDE], xmm1
  311.     RET
  312. ;-----------------------------------------------------------------------------
  313. ; void predict_8x8_vl_sse2( uint8_t *src, uint8_t *edge )
  314. ;-----------------------------------------------------------------------------
  315. cglobal predict_8x8_vl_sse2, 2,2
  316.     movdqa      xmm4, [r1+16]
  317.     movdqa      xmm2, xmm4
  318.     movdqa      xmm1, xmm4
  319.     movdqa      xmm3, xmm4
  320.     psrldq      xmm2, 1
  321.     pslldq      xmm1, 1
  322.     pavgb       xmm3, xmm2
  323.     PRED8x8_LOWPASS_XMM xmm0, xmm1, xmm2, xmm4, xmm5
  324. ; xmm0: (t0 + 2*t1 + t2 + 2) >> 2
  325. ; xmm3: (t0 + t1 + 1) >> 1
  326. %assign Y 0
  327. %rep 3
  328.     psrldq      xmm0, 1
  329.     movq        [r0+ Y   *FDEC_STRIDE], xmm3
  330.     movq        [r0+(Y+1)*FDEC_STRIDE], xmm0
  331.     psrldq      xmm3, 1
  332. %assign Y (Y+2)
  333. %endrep
  334.     psrldq      xmm0, 1
  335.     movq        [r0+ Y   *FDEC_STRIDE], xmm3
  336.     movq        [r0+(Y+1)*FDEC_STRIDE], xmm0
  337.     RET
  338. ;-----------------------------------------------------------------------------
  339. ; void predict_8x8_vr_core_mmxext( uint8_t *src, uint8_t *edge )
  340. ;-----------------------------------------------------------------------------
  341. ; fills only some pixels:
  342. ; f01234567
  343. ; 0........
  344. ; 1,,,,,,,,
  345. ; 2 .......
  346. ; 3 ,,,,,,,
  347. ; 4  ......
  348. ; 5  ,,,,,,
  349. ; 6   .....
  350. ; 7   ,,,,,
  351. cglobal predict_8x8_vr_core_mmxext, 2,2
  352.     movq        mm2, [r1+16]
  353.     movq        mm3, [r1+15]
  354.     movq        mm1, [r1+14]
  355.     movq        mm4, mm3
  356.     pavgb       mm3, mm2
  357.     PRED8x8_LOWPASS mm0, mm1, mm2, mm4, mm7
  358. %assign Y 0
  359. %rep 3
  360.     movq        [r0+ Y   *FDEC_STRIDE], mm3
  361.     movq        [r0+(Y+1)*FDEC_STRIDE], mm0
  362.     psllq       mm3, 8
  363.     psllq       mm0, 8
  364. %assign Y (Y+2)
  365. %endrep
  366.     movq        [r0+ Y   *FDEC_STRIDE], mm3
  367.     movq        [r0+(Y+1)*FDEC_STRIDE], mm0
  368.     RET
  369. ;-----------------------------------------------------------------------------
  370. ; void predict_8x8c_v_mmx( uint8_t *src )
  371. ;-----------------------------------------------------------------------------
  372. cglobal predict_8x8c_v_mmx, 1,1
  373.     movq        mm0, [r0 - FDEC_STRIDE]
  374.     STORE8x8    mm0, mm0
  375.     RET
  376. ;-----------------------------------------------------------------------------
  377. ; void predict_8x8c_h_mmxext( uint8_t *src )
  378. ;-----------------------------------------------------------------------------
  379. %macro PRED_8x8C_H 1
  380. cglobal predict_8x8c_h_%1, 1,1
  381. %ifidn %1, ssse3
  382.     mova   m1, [pb_3 GLOBAL]
  383. %endif
  384. %assign n 0
  385. %rep 8
  386.     SPLATB m0, r0+FDEC_STRIDE*n-1, m1
  387.     mova [r0+FDEC_STRIDE*n], m0
  388. %assign n n+1
  389. %endrep
  390.     REP_RET
  391. %endmacro
  392. INIT_MMX
  393. %define SPLATB SPLATB_MMX
  394. PRED_8x8C_H mmxext
  395. %define SPLATB SPLATB_SSSE3
  396. PRED_8x8C_H ssse3
  397. ;-----------------------------------------------------------------------------
  398. ; void predict_8x8c_dc_core_mmxext( uint8_t *src, int s2, int s3 )
  399. ;-----------------------------------------------------------------------------
  400. cglobal predict_8x8c_dc_core_mmxext, 1,1
  401.     movq        mm0, [r0 - FDEC_STRIDE]
  402.     pxor        mm1, mm1
  403.     pxor        mm2, mm2
  404.     punpckhbw   mm1, mm0
  405.     punpcklbw   mm0, mm2
  406.     psadbw      mm1, mm2        ; s1
  407.     psadbw      mm0, mm2        ; s0
  408. %ifdef ARCH_X86_64
  409.     movd        mm4, r1d
  410.     movd        mm5, r2d
  411.     paddw       mm0, mm4
  412.     pshufw      mm2, mm5, 0
  413. %else
  414.     paddw       mm0, r1m
  415.     pshufw      mm2, r2m, 0
  416. %endif
  417.     psrlw       mm0, 3
  418.     paddw       mm1, [pw_2 GLOBAL]
  419.     movq        mm3, mm2
  420.     pshufw      mm1, mm1, 0
  421.     pshufw      mm0, mm0, 0     ; dc0 (w)
  422.     paddw       mm3, mm1
  423.     psrlw       mm3, 3          ; dc3 (w)
  424.     psrlw       mm2, 2          ; dc2 (w)
  425.     psrlw       mm1, 2          ; dc1 (w)
  426.     packuswb    mm0, mm1        ; dc0,dc1 (b)
  427.     packuswb    mm2, mm3        ; dc2,dc3 (b)
  428.     STORE8x8    mm0, mm2
  429.     RET
  430. %macro LOAD_PLANE_ARGS 0
  431. %ifdef ARCH_X86_64
  432.     movd        mm0, r1d
  433.     movd        mm2, r2d
  434.     movd        mm4, r3d
  435.     pshufw      mm0, mm0, 0
  436.     pshufw      mm2, mm2, 0
  437.     pshufw      mm4, mm4, 0
  438. %else
  439.     pshufw      mm0, r1m, 0
  440.     pshufw      mm2, r2m, 0
  441.     pshufw      mm4, r3m, 0
  442. %endif
  443. %endmacro
  444. ;-----------------------------------------------------------------------------
  445. ; void predict_8x8c_p_core_mmxext( uint8_t *src, int i00, int b, int c )
  446. ;-----------------------------------------------------------------------------
  447. cglobal predict_8x8c_p_core_mmxext, 1,2
  448.     LOAD_PLANE_ARGS
  449.     movq        mm1, mm2
  450.     pmullw      mm2, [pw_3210 GLOBAL]
  451.     psllw       mm1, 2
  452.     paddsw      mm0, mm2        ; mm0 = {i+0*b, i+1*b, i+2*b, i+3*b}
  453.     paddsw      mm1, mm0        ; mm1 = {i+4*b, i+5*b, i+6*b, i+7*b}
  454.     mov         r1d, 8
  455. ALIGN 4
  456. .loop:
  457.     movq        mm5, mm0
  458.     movq        mm6, mm1
  459.     psraw       mm5, 5
  460.     psraw       mm6, 5
  461.     packuswb    mm5, mm6
  462.     movq        [r0], mm5
  463.     paddsw      mm0, mm4
  464.     paddsw      mm1, mm4
  465.     add         r0, FDEC_STRIDE
  466.     dec         r1d
  467.     jg          .loop
  468.     REP_RET
  469. ;-----------------------------------------------------------------------------
  470. ; void predict_16x16_p_core_mmxext( uint8_t *src, int i00, int b, int c )
  471. ;-----------------------------------------------------------------------------
  472. cglobal predict_16x16_p_core_mmxext, 1,2
  473.     LOAD_PLANE_ARGS
  474.     movq        mm5, mm2
  475.     movq        mm1, mm2
  476.     pmullw      mm5, [pw_3210 GLOBAL]
  477.     psllw       mm2, 3
  478.     psllw       mm1, 2
  479.     movq        mm3, mm2
  480.     paddsw      mm0, mm5        ; mm0 = {i+ 0*b, i+ 1*b, i+ 2*b, i+ 3*b}
  481.     paddsw      mm1, mm0        ; mm1 = {i+ 4*b, i+ 5*b, i+ 6*b, i+ 7*b}
  482.     paddsw      mm2, mm0        ; mm2 = {i+ 8*b, i+ 9*b, i+10*b, i+11*b}
  483.     paddsw      mm3, mm1        ; mm3 = {i+12*b, i+13*b, i+14*b, i+15*b}
  484.     mov         r1d, 16
  485. ALIGN 4
  486. .loop:
  487.     movq        mm5, mm0
  488.     movq        mm6, mm1
  489.     psraw       mm5, 5
  490.     psraw       mm6, 5
  491.     packuswb    mm5, mm6
  492.     movq        [r0], mm5
  493.     movq        mm5, mm2
  494.     movq        mm6, mm3
  495.     psraw       mm5, 5
  496.     psraw       mm6, 5
  497.     packuswb    mm5, mm6
  498.     movq        [r0+8], mm5
  499.     paddsw      mm0, mm4
  500.     paddsw      mm1, mm4
  501.     paddsw      mm2, mm4
  502.     paddsw      mm3, mm4
  503.     add         r0, FDEC_STRIDE
  504.     dec         r1d
  505.     jg          .loop
  506.     REP_RET
  507. ;-----------------------------------------------------------------------------
  508. ; void predict_16x16_p_core_sse2( uint8_t *src, int i00, int b, int c )
  509. ;-----------------------------------------------------------------------------
  510. cglobal predict_16x16_p_core_sse2, 1,2
  511.     movd        xmm0, r1m
  512.     movd        xmm1, r2m
  513.     movd        xmm2, r3m
  514.     pshuflw     xmm0, xmm0, 0
  515.     pshuflw     xmm1, xmm1, 0
  516.     pshuflw     xmm2, xmm2, 0
  517.     punpcklqdq  xmm0, xmm0
  518.     punpcklqdq  xmm1, xmm1
  519.     punpcklqdq  xmm2, xmm2
  520.     movdqa      xmm3, xmm1
  521.     pmullw      xmm3, [pw_76543210 GLOBAL]
  522.     psllw       xmm1, 3
  523.     paddsw      xmm0, xmm3  ; xmm0 = {i+ 0*b, i+ 1*b, i+ 2*b, i+ 3*b, i+ 4*b, i+ 5*b, i+ 6*b, i+ 7*b}
  524.     paddsw      xmm1, xmm0  ; xmm1 = {i+ 8*b, i+ 9*b, i+10*b, i+11*b, i+12*b, i+13*b, i+14*b, i+15*b}
  525.     mov         r1d, 16
  526. ALIGN 4
  527. .loop:
  528.     movdqa      xmm3, xmm0
  529.     movdqa      xmm4, xmm1
  530.     psraw       xmm3, 5
  531.     psraw       xmm4, 5
  532.     packuswb    xmm3, xmm4
  533.     movdqa      [r0], xmm3
  534.     paddsw      xmm0, xmm2
  535.     paddsw      xmm1, xmm2
  536.     add         r0, FDEC_STRIDE
  537.     dec         r1d
  538.     jg          .loop
  539.     REP_RET
  540. ;-----------------------------------------------------------------------------
  541. ; void predict_16x16_v_mmx( uint8_t *src )
  542. ;-----------------------------------------------------------------------------
  543. cglobal predict_16x16_v_mmx, 1,2
  544.     movq        mm0, [r0 - FDEC_STRIDE]
  545.     movq        mm1, [r0 - FDEC_STRIDE + 8]
  546.     STORE16x16  mm0, mm1
  547.     REP_RET
  548. ;-----------------------------------------------------------------------------
  549. ; void predict_16x16_v_sse2( uint8_t *src )
  550. ;-----------------------------------------------------------------------------
  551. cglobal predict_16x16_v_sse2, 1,2
  552.     movdqa      xmm0, [r0 - FDEC_STRIDE]
  553.     STORE16x16_SSE2 xmm0
  554.     REP_RET
  555. ;-----------------------------------------------------------------------------
  556. ; void predict_16x16_h_mmxext( uint8_t *src )
  557. ;-----------------------------------------------------------------------------
  558. %macro PRED_16x16_H 1
  559. cglobal predict_16x16_h_%1, 1,2
  560.     mov r1, FDEC_STRIDE*12
  561. %ifidn %1, ssse3
  562.     mova   m1, [pb_3 GLOBAL]
  563. %endif
  564. .vloop:
  565. %assign n 0
  566. %rep 4
  567.     SPLATB m0, r0+r1+FDEC_STRIDE*n-1, m1
  568.     mova [r0+r1+FDEC_STRIDE*n], m0
  569. %if mmsize==8
  570.     mova [r0+r1+FDEC_STRIDE*n+8], m0
  571. %endif
  572. %assign n n+1
  573. %endrep
  574.     add r1, -FDEC_STRIDE*4
  575.     jge .vloop
  576.     REP_RET
  577. %endmacro
  578. ;no SSE2, its slower than MMX on all systems that don't support SSSE3
  579. INIT_MMX
  580. %define SPLATB SPLATB_MMX
  581. PRED_16x16_H mmxext
  582. INIT_XMM
  583. %define SPLATB SPLATB_SSSE3
  584. PRED_16x16_H ssse3
  585. ;-----------------------------------------------------------------------------
  586. ; void predict_16x16_dc_core_mmxext( uint8_t *src, int i_dc_left )
  587. ;-----------------------------------------------------------------------------
  588. %macro PRED16x16_DC 2
  589.     pxor        mm0, mm0
  590.     pxor        mm1, mm1
  591.     psadbw      mm0, [r0 - FDEC_STRIDE]
  592.     psadbw      mm1, [r0 - FDEC_STRIDE + 8]
  593.     paddusw     mm0, mm1
  594.     paddusw     mm0, %1
  595.     psrlw       mm0, %2                       ; dc
  596.     pshufw      mm0, mm0, 0
  597.     packuswb    mm0, mm0                      ; dc in bytes
  598.     STORE16x16  mm0, mm0
  599. %endmacro
  600. cglobal predict_16x16_dc_core_mmxext, 1,2
  601. %ifdef ARCH_X86_64
  602.     movd         mm2, r1d
  603.     PRED16x16_DC mm2, 5
  604. %else
  605.     PRED16x16_DC r1m, 5
  606. %endif
  607.     REP_RET
  608. cglobal predict_16x16_dc_top_mmxext, 1,2
  609.     PRED16x16_DC [pw_8 GLOBAL], 4
  610.     REP_RET
  611. ;-----------------------------------------------------------------------------
  612. ; void predict_16x16_dc_core_sse2( uint8_t *src, int i_dc_left )
  613. ;-----------------------------------------------------------------------------
  614. %macro PRED16x16_DC_SSE2 2
  615.     pxor        xmm0, xmm0
  616.     psadbw      xmm0, [r0 - FDEC_STRIDE]
  617.     movhlps     xmm1, xmm0
  618.     paddw       xmm0, xmm1
  619.     paddusw     xmm0, %1
  620.     psrlw       xmm0, %2                ; dc
  621.     pshuflw     xmm0, xmm0, 0
  622.     punpcklqdq  xmm0, xmm0
  623.     packuswb    xmm0, xmm0              ; dc in bytes
  624.     STORE16x16_SSE2 xmm0
  625. %endmacro
  626. cglobal predict_16x16_dc_core_sse2, 1,2
  627.     movd xmm2, r1m
  628.     PRED16x16_DC_SSE2 xmm2, 5
  629.     REP_RET
  630. cglobal predict_16x16_dc_top_sse2, 1,2
  631.     PRED16x16_DC_SSE2 [pw_8 GLOBAL], 4
  632.     REP_RET