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

Audio

开发平台:

Visual C++

  1. ;*****************************************************************************
  2. ;* predict-a.asm: h264 encoder library
  3. ;*****************************************************************************
  4. ;* Copyright (C) 2005 x264 project
  5. ;*
  6. ;* Authors: Loren Merritt <lorenm@u.washington.edu>
  7. ;*
  8. ;* This program is free software; you can redistribute it and/or modify
  9. ;* it under the terms of the GNU General Public License as published by
  10. ;* the Free Software Foundation; either version 2 of the License, or
  11. ;* (at your option) any later version.
  12. ;*
  13. ;* This program is distributed in the hope that it will be useful,
  14. ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. ;* GNU General Public License for more details.
  17. ;*
  18. ;* You should have received a copy of the GNU General Public License
  19. ;* along with this program; if not, write to the Free Software
  20. ;* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  21. ;*****************************************************************************
  22. BITS 32
  23. ;=============================================================================
  24. ; Macros and other preprocessor constants
  25. ;=============================================================================
  26. %include "i386inc.asm"
  27. ; this is faster than a constant [edx + Y*FDEC_STRIDE]
  28. %macro STORE8x8 2
  29.     movq        [edx +   ecx], %1       ; 0
  30.     movq        [edx + 2*ecx], %1       ; 1
  31.     movq        [edx + 4*ecx], %1       ; 3
  32.     movq        [edx + 8*ecx], %2       ; 7
  33.     add         edx, eax
  34.     movq        [edx        ], %1       ; 2
  35.     movq        [edx + 2*ecx], %2       ; 4
  36.     movq        [edx +   eax], %2       ; 5
  37.     movq        [edx + 4*ecx], %2       ; 6
  38. %endmacro
  39. %macro SAVE_0_1 1
  40.     movq        [%1]         , mm0
  41.     movq        [%1 + 8]     , mm1
  42. %endmacro
  43. %macro SAVE_0_0 1
  44.     movq        [%1]         , mm0
  45.     movq        [%1 + 8]     , mm0
  46. %endmacro
  47. SECTION_RODATA
  48. ALIGN 8
  49. pw_2: times 4 dw 2
  50. pw_8: times 4 dw 8
  51. pb_1: times 8 db 1
  52. pw_3210:
  53.     dw 0
  54.     dw 1
  55.     dw 2
  56.     dw 3
  57. ;=============================================================================
  58. ; Code
  59. ;=============================================================================
  60. SECTION .text
  61. cglobal predict_8x8_v_mmxext
  62. cglobal predict_8x8_dc_core_mmxext
  63. cglobal predict_8x8c_v_mmx
  64. cglobal predict_8x8c_dc_core_mmxext
  65. cglobal predict_8x8c_p_core_mmxext
  66. cglobal predict_16x16_p_core_mmxext
  67. cglobal predict_16x16_v_mmx
  68. cglobal predict_16x16_dc_core_mmxext
  69. cglobal predict_16x16_dc_top_mmxext
  70. %macro PRED8x8_LOWPASS 2
  71.     movq        mm3, mm1
  72.     pavgb       mm1, mm2
  73.     pxor        mm2, mm3
  74.     movq        %1 , %2
  75.     pand        mm2, [pb_1 GOT_ebx]
  76.     psubusb     mm1, mm2
  77.     pavgb       %1 , mm1     ; %1 = (t[n-1] + t[n]*2 + t[n+1] + 2) >> 2
  78. %endmacro
  79. %macro PRED8x8_LOAD_TOP 0
  80.     mov         edx, [picesp + 4]
  81.     mov         ecx, FDEC_STRIDE
  82.     mov         eax, [picesp + 8]
  83.     sub         edx, ecx
  84.     and         eax, 12
  85.     movq        mm1, [edx-1]
  86.     movq        mm2, [edx+1]
  87.     cmp         eax, byte 8
  88.     jge         .have_topleft
  89.     mov         al,  [edx]
  90.     mov         ah,  al
  91.     pinsrw      mm1, eax, 0
  92.     mov         eax, [picesp + 8]
  93. .have_topleft:
  94.     and         eax, byte 4
  95.     jne         .have_topright
  96.     mov         al,  [edx+7]
  97.     mov         ah,  al
  98.     pinsrw      mm2, eax, 3
  99. .have_topright:
  100.     PRED8x8_LOWPASS mm0, [edx]
  101. %endmacro
  102. ;-----------------------------------------------------------------------------
  103. ;
  104. ; void predict_8x8_v_mmxext( uint8_t *src, int i_neighbors )
  105. ;
  106. ;-----------------------------------------------------------------------------
  107. ALIGN 16
  108. predict_8x8_v_mmxext:
  109.     picpush     ebx
  110.     picgetgot   ebx
  111.     PRED8x8_LOAD_TOP
  112.     lea         eax, [ecx + 2*ecx]
  113.     STORE8x8    mm0, mm0
  114.     picpop      ebx
  115.     ret
  116. ;-----------------------------------------------------------------------------
  117. ;
  118. ; void predict_8x8_dc_core_mmxext( uint8_t *src, int i_neighbors, uint8_t *pix_left );
  119. ;
  120. ;-----------------------------------------------------------------------------
  121. ALIGN 16
  122. predict_8x8_dc_core_mmxext:
  123.     picpush     ebx
  124.     picgetgot   ebx
  125.     mov         eax, [picesp + 12]
  126.     movq        mm1, [eax-1]
  127.     movq        mm2, [eax+1]
  128.     PRED8x8_LOWPASS mm4, [eax]
  129.     PRED8x8_LOAD_TOP
  130.     pxor        mm1, mm1
  131.     psadbw      mm0, mm1
  132.     psadbw      mm4, mm1
  133.     paddw       mm0, [pw_8 GOT_ebx]
  134.     paddw       mm0, mm4
  135.     psrlw       mm0, 4
  136.     pshufw      mm0, mm0, 0
  137.     packuswb    mm0, mm0
  138.     lea         eax, [ecx + 2*ecx]
  139.     STORE8x8    mm0, mm0
  140.     picpop      ebx
  141.     ret
  142. ;-----------------------------------------------------------------------------
  143. ;
  144. ; void predict_8x8c_v_mmx( uint8_t *src )
  145. ;
  146. ;-----------------------------------------------------------------------------
  147. ALIGN 16
  148. predict_8x8c_v_mmx :
  149.     mov         edx, [esp + 4]
  150.     mov         ecx, FDEC_STRIDE
  151.     sub         edx, ecx
  152.     movq        mm0, [edx]
  153.     lea         eax, [ecx + 2*ecx]
  154.     STORE8x8    mm0, mm0
  155.     ret
  156. ;-----------------------------------------------------------------------------
  157. ;
  158. ; void predict_8x8c_dc_core_mmxext( uint8_t *src, int s2, int s3 )
  159. ;
  160. ;-----------------------------------------------------------------------------
  161. ALIGN 16
  162. predict_8x8c_dc_core_mmxext:
  163.     picpush     ebx
  164.     picgetgot   ebx
  165.     mov         edx, [picesp + 4]
  166.     mov         ecx, FDEC_STRIDE
  167.     sub         edx, ecx
  168.     lea         eax, [ecx + 2*ecx]
  169.     movq        mm0, [edx]
  170.     pxor        mm1, mm1
  171.     pxor        mm2, mm2
  172.     punpckhbw   mm1, mm0
  173.     punpcklbw   mm0, mm2
  174.     psadbw      mm1, mm2        ; s1
  175.     psadbw      mm0, mm2        ; s0
  176.     paddw       mm0, [picesp +  8]
  177.     pshufw      mm2, [picesp + 12], 0
  178.     psrlw       mm0, 3
  179.     paddw       mm1, [pw_2 GOT_ebx]
  180.     movq        mm3, mm2
  181.     pshufw      mm1, mm1, 0
  182.     pshufw      mm0, mm0, 0     ; dc0 (w)
  183.     paddw       mm3, mm1
  184.     psrlw       mm3, 3          ; dc3 (w)
  185.     psrlw       mm2, 2          ; dc2 (w)
  186.     psrlw       mm1, 2          ; dc1 (w)
  187.     packuswb    mm0, mm1        ; dc0,dc1 (b)
  188.     packuswb    mm2, mm3        ; dc2,dc3 (b)
  189.     STORE8x8    mm0, mm2
  190.     picpop      ebx
  191.     ret
  192. ;-----------------------------------------------------------------------------
  193. ;
  194. ; void predict_8x8c_p_core_mmxext( uint8_t *src, int i00, int b, int c )
  195. ;
  196. ;-----------------------------------------------------------------------------
  197. ALIGN 16
  198. predict_8x8c_p_core_mmxext:
  199.     picpush     ebx
  200.     picgetgot   ebx
  201.     mov         edx, [picesp + 4]
  202.     mov         ecx, FDEC_STRIDE
  203.     pshufw      mm0, [picesp + 8], 0
  204.     pshufw      mm2, [picesp +12], 0
  205.     pshufw      mm4, [picesp +16], 0
  206.     movq        mm1, mm2
  207.     pmullw      mm2, [pw_3210 GOT_ebx]
  208.     psllw       mm1, 2
  209.     paddsw      mm0, mm2        ; mm0 = {i+0*b, i+1*b, i+2*b, i+3*b}
  210.     paddsw      mm1, mm0        ; mm1 = {i+4*b, i+5*b, i+6*b, i+7*b}
  211.     mov         eax, 8
  212. ALIGN 4
  213. .loop:
  214.     movq        mm5, mm0
  215.     movq        mm6, mm1
  216.     psraw       mm5, 5
  217.     psraw       mm6, 5
  218.     packuswb    mm5, mm6
  219.     movq        [edx], mm5
  220.     paddsw      mm0, mm4
  221.     paddsw      mm1, mm4
  222.     add         edx, ecx
  223.     dec         eax
  224.     jg          .loop
  225.     nop
  226.     picpop      ebx
  227.     ret
  228. ;-----------------------------------------------------------------------------
  229. ;
  230. ; void predict_16x16_p_core_mmxext( uint8_t *src, int i00, int b, int c )
  231. ;
  232. ;-----------------------------------------------------------------------------
  233. ALIGN 16
  234. predict_16x16_p_core_mmxext:
  235.     picpush     ebx
  236.     picgetgot   ebx
  237.     mov         edx, [picesp + 4]
  238.     mov         ecx, FDEC_STRIDE
  239.     pshufw      mm0, [picesp + 8], 0
  240.     pshufw      mm2, [picesp +12], 0
  241.     pshufw      mm4, [picesp +16], 0
  242.     movq        mm5, mm2
  243.     movq        mm1, mm2
  244.     pmullw      mm5, [pw_3210 GOT_ebx]
  245.     psllw       mm2, 3
  246.     psllw       mm1, 2
  247.     movq        mm3, mm2
  248.     paddsw      mm0, mm5        ; mm0 = {i+ 0*b, i+ 1*b, i+ 2*b, i+ 3*b}
  249.     paddsw      mm1, mm0        ; mm1 = {i+ 4*b, i+ 5*b, i+ 6*b, i+ 7*b}
  250.     paddsw      mm2, mm0        ; mm2 = {i+ 8*b, i+ 9*b, i+10*b, i+11*b}
  251.     paddsw      mm3, mm1        ; mm3 = {i+12*b, i+13*b, i+14*b, i+15*b}
  252.     mov         eax, 16
  253. ALIGN 4
  254. .loop:
  255.     movq        mm5, mm0
  256.     movq        mm6, mm1
  257.     psraw       mm5, 5
  258.     psraw       mm6, 5
  259.     packuswb    mm5, mm6
  260.     movq        [edx], mm5
  261.     movq        mm5, mm2
  262.     movq        mm6, mm3
  263.     psraw       mm5, 5
  264.     psraw       mm6, 5
  265.     packuswb    mm5, mm6
  266.     movq        [edx+8], mm5
  267.     paddsw      mm0, mm4
  268.     paddsw      mm1, mm4
  269.     paddsw      mm2, mm4
  270.     paddsw      mm3, mm4
  271.     add         edx, ecx
  272.     dec         eax
  273.     jg          .loop
  274.     nop
  275.     picpop      ebx
  276.     ret
  277. ;-----------------------------------------------------------------------------
  278. ;
  279. ; void predict_16x16_v_mmx( uint8_t *src )
  280. ;
  281. ;-----------------------------------------------------------------------------
  282. ALIGN 16
  283. predict_16x16_v_mmx :
  284.     mov         edx, [esp + 4]
  285.     mov         ecx, FDEC_STRIDE
  286.     sub         edx, ecx                ; edx <-- line -1
  287.     movq        mm0, [edx]
  288.     movq        mm1, [edx + 8]
  289.     lea         eax, [ecx + 2*ecx]      ; eax <-- 3* stride
  290.     SAVE_0_1    (edx + ecx)             ; 0
  291.     SAVE_0_1    (edx + 2 * ecx)         ; 1
  292.     SAVE_0_1    (edx + eax)             ; 2
  293.     SAVE_0_1    (edx + 4 * ecx)         ; 3
  294.     SAVE_0_1    (edx + 2 * eax)         ; 5
  295.     SAVE_0_1    (edx + 8 * ecx)         ; 7
  296.     SAVE_0_1    (edx + 4 * eax)         ; 11
  297.     add         edx, ecx                ; edx <-- line 0
  298.     SAVE_0_1    (edx + 4 * ecx)         ; 4
  299.     SAVE_0_1    (edx + 2 * eax)         ; 6
  300.     SAVE_0_1    (edx + 8 * ecx)         ; 8
  301.     SAVE_0_1    (edx + 4 * eax)         ; 12
  302.     lea         edx, [edx + 8 * ecx]    ; edx <-- line 8
  303.     SAVE_0_1    (edx + ecx)             ; 9
  304.     SAVE_0_1    (edx + 2 * ecx)         ; 10
  305.     lea         edx, [edx + 4 * ecx]    ; edx <-- line 12
  306.     SAVE_0_1    (edx + ecx)             ; 13
  307.     SAVE_0_1    (edx + 2 * ecx)         ; 14
  308.     SAVE_0_1    (edx + eax)             ; 15
  309.     ret
  310. ;-----------------------------------------------------------------------------
  311. ;
  312. ; void predict_16x16_dc_core_mmxext( uint8_t *src, int i_dc_left )
  313. ;
  314. ;-----------------------------------------------------------------------------
  315. %macro PRED16x16_DC 3
  316.     mov         edx, [%3 + 4]
  317.     mov         ecx, FDEC_STRIDE
  318.     sub         edx, ecx                ; edx <-- line -1
  319.     pxor        mm0, mm0
  320.     pxor        mm1, mm1
  321.     psadbw      mm0, [edx]
  322.     psadbw      mm1, [edx + 8]
  323.     paddusw     mm0, mm1
  324.     paddusw     mm0, %1                 ; FIXME is stack alignment guaranteed?
  325.     psrlw       mm0, %2                 ; dc
  326.     push        edi
  327.     pshufw      mm0, mm0, 0
  328.     lea         eax, [ecx + 2*ecx]      ; eax <-- 3* stride
  329.     packuswb    mm0, mm0                ; dc in bytes
  330.     mov         edi, 4
  331. ALIGN 4
  332. .loop:
  333.     SAVE_0_0    (edx + ecx)             ; 0
  334.     SAVE_0_0    (edx + 2 * ecx)         ; 1
  335.     SAVE_0_0    (edx + eax)             ; 2
  336.     SAVE_0_0    (edx + 4 * ecx)         ; 3
  337.     dec         edi
  338.     lea         edx, [edx + 4 * ecx]
  339.     jg          .loop
  340.     pop         edi
  341. %endmacro
  342. ALIGN 16
  343. predict_16x16_dc_core_mmxext:
  344.     PRED16x16_DC [esp+8], 5, esp
  345.     ret
  346. ALIGN 16
  347. predict_16x16_dc_top_mmxext:
  348.     picpush ebx
  349.     picgetgot ebx
  350.     PRED16x16_DC [pw_8 GOT_ebx], 4, picesp
  351.     picpop ebx
  352.     ret