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

Audio

开发平台:

Visual C++

  1. ;*****************************************************************************
  2. ;* deblock-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. %include "i386inc.asm"
  24. SECTION_RODATA
  25. pb_01: times 16 db 0x01
  26. pb_3f: times 16 db 0x3f
  27. pb_ff: times 16 db 0xff
  28. SECTION .text
  29. cglobal x264_deblock_v8_luma_mmxext
  30. cglobal x264_deblock_h_luma_mmxext
  31. cglobal x264_deblock_v_chroma_mmxext
  32. cglobal x264_deblock_h_chroma_mmxext
  33. cglobal x264_deblock_v_chroma_intra_mmxext
  34. cglobal x264_deblock_h_chroma_intra_mmxext
  35. ; expands to [base],...,[base+7*stride]
  36. %define PASS8ROWS(base, base3, stride, stride3) 
  37.     [base], [base+stride], [base+stride*2], [base3], 
  38.     [base3+stride], [base3+stride*2], [base3+stride3], [base3+stride*4]
  39. ; in: 8 rows of 4 bytes in %1..%8
  40. ; out: 4 rows of 8 bytes in mm0..mm3
  41. %macro TRANSPOSE4x8_LOAD 8
  42.     movd       mm0, %1
  43.     movd       mm2, %2
  44.     movd       mm1, %3
  45.     movd       mm3, %4
  46.     punpcklbw  mm0, mm2
  47.     punpcklbw  mm1, mm3
  48.     movq       mm2, mm0
  49.     punpcklwd  mm0, mm1
  50.     punpckhwd  mm2, mm1
  51.     movd       mm4, %5
  52.     movd       mm6, %6
  53.     movd       mm5, %7
  54.     movd       mm7, %8
  55.     punpcklbw  mm4, mm6
  56.     punpcklbw  mm5, mm7
  57.     movq       mm6, mm4
  58.     punpcklwd  mm4, mm5
  59.     punpckhwd  mm6, mm5
  60.     movq       mm1, mm0
  61.     movq       mm3, mm2
  62.     punpckldq  mm0, mm4
  63.     punpckhdq  mm1, mm4
  64.     punpckldq  mm2, mm6
  65.     punpckhdq  mm3, mm6
  66. %endmacro
  67. ; in: 4 rows of 8 bytes in mm0..mm3
  68. ; out: 8 rows of 4 bytes in %1..%8
  69. %macro TRANSPOSE8x4_STORE 8
  70.     movq       mm4, mm0
  71.     movq       mm5, mm1
  72.     movq       mm6, mm2
  73.     punpckhdq  mm4, mm4
  74.     punpckhdq  mm5, mm5
  75.     punpckhdq  mm6, mm6
  76.     punpcklbw  mm0, mm1
  77.     punpcklbw  mm2, mm3
  78.     movq       mm1, mm0
  79.     punpcklwd  mm0, mm2
  80.     punpckhwd  mm1, mm2
  81.     movd       %1,  mm0
  82.     punpckhdq  mm0, mm0
  83.     movd       %2,  mm0
  84.     movd       %3,  mm1
  85.     punpckhdq  mm1, mm1
  86.     movd       %4,  mm1
  87.     punpckhdq  mm3, mm3
  88.     punpcklbw  mm4, mm5
  89.     punpcklbw  mm6, mm3
  90.     movq       mm5, mm4
  91.     punpcklwd  mm4, mm6
  92.     punpckhwd  mm5, mm6
  93.     movd       %5,  mm4
  94.     punpckhdq  mm4, mm4
  95.     movd       %6,  mm4
  96.     movd       %7,  mm5
  97.     punpckhdq  mm5, mm5
  98.     movd       %8,  mm5
  99. %endmacro
  100. %macro SBUTTERFLY 4
  101.     movq       %4, %2
  102.     punpckl%1  %2, %3
  103.     punpckh%1  %4, %3
  104. %endmacro
  105. ; in: 8 rows of 8 (only the middle 6 pels are used) in %1..%8
  106. ; out: 6 rows of 8 in [%9+0*16] .. [%9+5*16]
  107. %macro TRANSPOSE6x8_MEM 9
  108.     movq  mm0, %1
  109.     movq  mm1, %3
  110.     movq  mm2, %5
  111.     movq  mm3, %7
  112.     SBUTTERFLY bw, mm0, %2, mm4
  113.     SBUTTERFLY bw, mm1, %4, mm5
  114.     SBUTTERFLY bw, mm2, %6, mm6
  115.     movq  [%9+0x10], mm5
  116.     SBUTTERFLY bw, mm3, %8, mm7
  117.     SBUTTERFLY wd, mm0, mm1, mm5
  118.     SBUTTERFLY wd, mm2, mm3, mm1
  119.     punpckhdq mm0, mm2
  120.     movq  [%9+0x00], mm0
  121.     SBUTTERFLY wd, mm4, [%9+0x10], mm3
  122.     SBUTTERFLY wd, mm6, mm7, mm2
  123.     SBUTTERFLY dq, mm4, mm6, mm0
  124.     SBUTTERFLY dq, mm5, mm1, mm7
  125.     punpckldq mm3, mm2
  126.     movq  [%9+0x10], mm5
  127.     movq  [%9+0x20], mm7
  128.     movq  [%9+0x30], mm4
  129.     movq  [%9+0x40], mm0
  130.     movq  [%9+0x50], mm3
  131. %endmacro
  132. ; out: %4 = |%1-%2|>%3
  133. ; clobbers: %5
  134. %macro DIFF_GT_MMX 5
  135.     movq    %5, %2
  136.     movq    %4, %1
  137.     psubusb %5, %1
  138.     psubusb %4, %2
  139.     por     %4, %5
  140.     psubusb %4, %3
  141. %endmacro
  142. ; in: mm0=p1 mm1=p0 mm2=q0 mm3=q1 %1=alpha-1 %2=beta-1
  143. ; out: mm5=beta-1, mm7=mask
  144. ; clobbers: mm4,mm6
  145. %macro LOAD_MASK_MMX 2
  146.     movd     mm4, %1
  147.     movd     mm5, %2
  148.     pshufw   mm4, mm4, 0
  149.     pshufw   mm5, mm5, 0
  150.     packuswb mm4, mm4  ; 8x alpha-1
  151.     packuswb mm5, mm5  ; 8x beta-1
  152.     DIFF_GT_MMX  mm1, mm2, mm4, mm7, mm6 ; |p0-q0| > alpha-1
  153.     DIFF_GT_MMX  mm0, mm1, mm5, mm4, mm6 ; |p1-p0| > beta-1
  154.     por      mm7, mm4
  155.     DIFF_GT_MMX  mm3, mm2, mm5, mm4, mm6 ; |q1-q0| > beta-1
  156.     por      mm7, mm4
  157.     pxor     mm6, mm6
  158.     pcmpeqb  mm7, mm6
  159. %endmacro
  160. ; in: mm0=p1 mm1=p0 mm2=q0 mm3=q1 mm7=(tc&mask)
  161. ; out: mm1=p0' mm2=q0'
  162. ; clobbers: mm0,3-6
  163. %macro DEBLOCK_P0_Q0_MMX 0
  164.     ; a = q0^p0^((p1-q1)>>2)
  165.     movq    mm4, mm0
  166.     psubb   mm4, mm3
  167.     psrlw   mm4, 2
  168.     pxor    mm4, mm1
  169.     pxor    mm4, mm2
  170.     ; b = p0^(q1>>2)
  171.     psrlw   mm3, 2
  172.     pand    mm3, [pb_3f GOT_ebx]
  173.     movq    mm5, mm1
  174.     pxor    mm5, mm3
  175.     ; c = q0^(p1>>2)
  176.     psrlw   mm0, 2
  177.     pand    mm0, [pb_3f GOT_ebx]
  178.     movq    mm6, mm2
  179.     pxor    mm6, mm0
  180.     ; d = (c^b) & ~(b^a) & 1
  181.     pxor    mm6, mm5
  182.     pxor    mm5, mm4
  183.     pandn   mm5, mm6
  184.     pand    mm5, [pb_01 GOT_ebx]
  185.     ; delta = (((q0 - p0 ) << 2) + (p1 - q1) + 4) >> 3
  186.     ;       = (avg(q0, p1>>2) + (d&a))
  187.     ;       - (avg(p0, q1>>2) + (d^(d&a)))
  188.     pavgb   mm0, mm2
  189.     pand    mm4, mm5
  190.     paddusb mm0, mm4
  191.     pavgb   mm3, mm1
  192.     pxor    mm4, mm5
  193.     paddusb mm3, mm4
  194.     ; p0 += clip(delta, -tc0, tc0)
  195.     ; q0 -= clip(delta, -tc0, tc0)
  196.     movq    mm4, mm0
  197.     psubusb mm0, mm3
  198.     psubusb mm3, mm4
  199.     pminub  mm0, mm7
  200.     pminub  mm3, mm7
  201.     paddusb mm1, mm0
  202.     paddusb mm2, mm3
  203.     psubusb mm1, mm3
  204.     psubusb mm2, mm0
  205. %endmacro
  206. ; in: mm1=p0 mm2=q0
  207. ;     %1=p1 %2=q2 %3=[q2] %4=[q1] %5=tc0 %6=tmp
  208. ; out: [q1] = clip( (q2+((p0+q0+1)>>1))>>1, q1-tc0, q1+tc0 )
  209. ; clobbers: q2, tmp, tc0
  210. %macro LUMA_Q1_MMX 6
  211.     movq    %6, mm1
  212.     pavgb   %6, mm2
  213.     pavgb   %2, %6              ; avg(p2,avg(p0,q0))
  214.     pxor    %6, %3
  215.     pand    %6, [pb_01 GOT_ebx] ; (p2^avg(p0,q0))&1
  216.     psubusb %2, %6              ; (p2+((p0+q0+1)>>1))>>1
  217.     movq    %6, %1
  218.     psubusb %6, %5
  219.     paddusb %5, %1
  220.     pmaxub  %2, %6
  221.     pminub  %2, %5
  222.     movq    %4, %2
  223. %endmacro
  224. SECTION .text
  225. ALIGN 16
  226. ;-----------------------------------------------------------------------------
  227. ;   void x264_deblock_v8_luma_mmxext( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
  228. ;-----------------------------------------------------------------------------
  229. x264_deblock_v8_luma_mmxext:
  230.     picpush ebx
  231.     picgetgot ebx
  232.     push    edi
  233.     push    esi
  234.     mov     edi, [picesp+12] ; pix
  235.     mov     esi, [picesp+16] ; stride
  236.     mov     edx, [picesp+20] ; alpha
  237.     mov     ecx, [picesp+24] ; beta
  238.     dec     edx
  239.     dec     ecx
  240.     mov     eax, edi
  241.     sub     eax, esi
  242.     sub     eax, esi
  243.     sub     eax, esi ; pix-3*stride
  244.     sub     esp, 16
  245.     movq    mm0, [eax+esi]   ; p1
  246.     movq    mm1, [eax+2*esi] ; p0
  247.     movq    mm2, [edi]       ; q0
  248.     movq    mm3, [edi+esi]   ; q1
  249.     LOAD_MASK_MMX  edx, ecx
  250.     mov     ecx, [picesp+44] ; tc0, use only the low 16 bits
  251.     movd    mm4, [ecx]
  252.     punpcklbw mm4, mm4
  253.     punpcklbw mm4, mm4 ; tc = 4x tc0[1], 4x tc0[0]
  254.     movq   [esp+8], mm4 ; tc
  255.     pcmpgtb mm4, [pb_ff GOT_ebx]
  256.     pand    mm4, mm7
  257.     movq   [esp+0], mm4 ; mask
  258.     movq    mm3, [eax] ; p2
  259.     DIFF_GT_MMX  mm1, mm3, mm5, mm6, mm7 ; |p2-p0| > beta-1
  260.     pandn   mm6, mm4
  261.     pcmpeqb mm6, mm4
  262.     pand    mm6, mm4
  263.     pand    mm4, [esp+8] ; tc
  264.     movq    mm7, [pb_01 GOT_ebx]
  265.     pand    mm7, mm6
  266.     pand    mm6, mm4
  267.     paddb   mm7, mm4
  268.     LUMA_Q1_MMX  mm0, mm3, [eax], [eax+esi], mm6, mm4
  269.     movq    mm4, [edi+2*esi] ; q2
  270.     DIFF_GT_MMX  mm2, mm4, mm5, mm6, mm3 ; |q2-q0| > beta-1
  271.     movq    mm5, [esp+0] ; mask
  272.     pandn   mm6, mm5
  273.     pcmpeqb mm6, mm5
  274.     pand    mm6, mm5
  275.     movq    mm5, [esp+8] ; tc
  276.     pand    mm5, mm6
  277.     pand    mm6, [pb_01 GOT_ebx]
  278.     paddb   mm7, mm6
  279.     movq    mm3, [edi+esi]
  280.     LUMA_Q1_MMX  mm3, mm4, [edi+2*esi], [edi+esi], mm5, mm6
  281.     DEBLOCK_P0_Q0_MMX ; XXX: make sure ebx has the GOT in PIC mode
  282.     movq    [eax+2*esi], mm1
  283.     movq    [edi], mm2
  284.     add     esp, 16
  285.     pop     esi
  286.     pop     edi
  287.     picpop  ebx
  288.     ret
  289. ALIGN 16
  290. ;-----------------------------------------------------------------------------
  291. ;   void x264_deblock_h_luma_mmxext( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
  292. ;-----------------------------------------------------------------------------
  293. x264_deblock_h_luma_mmxext:
  294.     push   ebx
  295.     push   ebp
  296.     mov    eax, [esp+12] ; pix
  297.     mov    ebx, [esp+16] ; stride
  298.     lea    ebp, [ebx+ebx*2]
  299.     sub    eax, 4
  300.     lea    ecx, [eax+ebp]
  301.     sub    esp, 96
  302. %define pix_tmp esp
  303.     ; transpose 6x16 -> tmp space
  304.     TRANSPOSE6x8_MEM  PASS8ROWS(eax, ecx, ebx, ebp), pix_tmp
  305.     lea    eax, [eax+ebx*8]
  306.     lea    ecx, [ecx+ebx*8]
  307.     TRANSPOSE6x8_MEM  PASS8ROWS(eax, ecx, ebx, ebp), pix_tmp+8
  308.     ; vertical filter
  309.     push   dword [esp+124] ; tc0
  310.     push   dword [esp+124] ; beta
  311.     push   dword [esp+124] ; alpha
  312.     push   dword 16
  313.     push   dword pix_tmp
  314.     add    dword [esp], 0x40 ; pix_tmp+0x30
  315.     call   x264_deblock_v8_luma_mmxext
  316.     add    dword [esp   ], 8 ; pix_tmp+0x38
  317.     add    dword [esp+16], 2 ; tc0+2
  318.     call   x264_deblock_v8_luma_mmxext
  319.     add    esp, 20
  320.     
  321.     ; transpose 16x4 -> original space  (only the middle 4 rows were changed by the filter)
  322.     mov    eax, [esp+108] ; pix
  323.     sub    eax, 2
  324.     lea    ecx, [eax+ebp]
  325.     movq   mm0, [pix_tmp+0x10]
  326.     movq   mm1, [pix_tmp+0x20]
  327.     movq   mm2, [pix_tmp+0x30]
  328.     movq   mm3, [pix_tmp+0x40]
  329.     TRANSPOSE8x4_STORE  PASS8ROWS(eax, ecx, ebx, ebp)
  330.     lea    eax, [eax+ebx*8]
  331.     lea    ecx, [ecx+ebx*8]
  332.     movq   mm0, [pix_tmp+0x18]
  333.     movq   mm1, [pix_tmp+0x28]
  334.     movq   mm2, [pix_tmp+0x38]
  335.     movq   mm3, [pix_tmp+0x48]
  336.     TRANSPOSE8x4_STORE  PASS8ROWS(eax, ecx, ebx, ebp)
  337.     add    esp, 96
  338.     pop    ebp
  339.     pop    ebx
  340.     ret
  341. %macro CHROMA_V_START 0
  342.     push  edi
  343.     push  esi
  344.     mov   edi, [esp+12] ; pix
  345.     mov   esi, [esp+16] ; stride
  346.     mov   edx, [esp+20] ; alpha
  347.     mov   ecx, [esp+24] ; beta
  348.     dec   edx
  349.     dec   ecx
  350.     mov   eax, edi
  351.     sub   eax, esi
  352.     sub   eax, esi
  353. %endmacro
  354. %macro CHROMA_H_START 0
  355.     push  edi
  356.     push  esi
  357.     push  ebp
  358.     mov   edi, [esp+16]
  359.     mov   esi, [esp+20]
  360.     mov   edx, [esp+24]
  361.     mov   ecx, [esp+28]
  362.     dec   edx
  363.     dec   ecx
  364.     sub   edi, 2
  365.     mov   ebp, esi
  366.     add   ebp, esi
  367.     add   ebp, esi
  368.     mov   eax, edi
  369.     add   edi, ebp
  370. %endmacro
  371. %macro CHROMA_END 0
  372.     pop  esi
  373.     pop  edi
  374.     ret
  375. %endmacro
  376. ALIGN 16
  377. ;-----------------------------------------------------------------------------
  378. ;   void x264_deblock_v_chroma_mmxext( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
  379. ;-----------------------------------------------------------------------------
  380. x264_deblock_v_chroma_mmxext:
  381.     CHROMA_V_START
  382.     push  ebx
  383.     mov   ebx, [esp+32] ; tc0
  384.     movq  mm0, [eax]
  385.     movq  mm1, [eax+esi]
  386.     movq  mm2, [edi]
  387.     movq  mm3, [edi+esi]
  388.     LOAD_MASK_MMX  edx, ecx
  389.     movd       mm6, [ebx]
  390.     punpcklbw  mm6, mm6
  391.     pand       mm7, mm6
  392.     picgetgot  ebx ; no need to push ebx, it's already been done
  393.     DEBLOCK_P0_Q0_MMX ; XXX: make sure ebx has the GOT in PIC mode
  394.     movq  [eax+esi], mm1
  395.     movq  [edi], mm2
  396.     pop  ebx
  397.     CHROMA_END
  398. ALIGN 16
  399. ;-----------------------------------------------------------------------------
  400. ;   void x264_deblock_h_chroma_mmxext( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
  401. ;-----------------------------------------------------------------------------
  402. x264_deblock_h_chroma_mmxext:
  403.     CHROMA_H_START
  404.     push  ebx
  405.     mov   ebx, [esp+36] ; tc0
  406.     sub   esp, 16
  407.     TRANSPOSE4x8_LOAD  PASS8ROWS(eax, edi, esi, ebp)
  408.     movq  [esp+8], mm0
  409.     movq  [esp+0], mm3
  410.     LOAD_MASK_MMX  edx, ecx
  411.     movd       mm6, [ebx]
  412.     punpcklbw  mm6, mm6
  413.     pand       mm7, mm6
  414.     picgetgot  ebx ; no need to push ebx, it's already been done
  415.     DEBLOCK_P0_Q0_MMX ; XXX: make sure ebx has the GOT in PIC mode
  416.     movq  mm0, [esp+8]
  417.     movq  mm3, [esp+0]
  418.     TRANSPOSE8x4_STORE PASS8ROWS(eax, edi, esi, ebp)
  419.     add  esp, 16
  420.     pop  ebx
  421.     pop  ebp
  422.     CHROMA_END
  423. ; in: %1=p0 %2=p1 %3=q1
  424. ; out: p0 = (p0 + q1 + 2*p1 + 2) >> 2
  425. %macro CHROMA_INTRA_P0 3
  426.     movq    mm4, %1
  427.     pxor    mm4, %3
  428.     pand    mm4, [pb_01 GOT_ebx]  ; mm4 = (p0^q1)&1
  429.     pavgb   %1,  %3
  430.     psubusb %1,  mm4
  431.     pavgb   %1,  %2       ; dst = avg(p1, avg(p0,q1) - ((p0^q1)&1))
  432. %endmacro
  433. %macro CHROMA_INTRA_BODY 0
  434.     LOAD_MASK_MMX edx, ecx
  435.     movq   mm5, mm1
  436.     movq   mm6, mm2
  437.     CHROMA_INTRA_P0  mm1, mm0, mm3
  438.     CHROMA_INTRA_P0  mm2, mm3, mm0
  439.     psubb  mm1, mm5
  440.     psubb  mm2, mm6
  441.     pand   mm1, mm7
  442.     pand   mm2, mm7
  443.     paddb  mm1, mm5
  444.     paddb  mm2, mm6
  445. %endmacro
  446. ALIGN 16
  447. ;-----------------------------------------------------------------------------
  448. ;   void x264_deblock_v_chroma_intra_mmxext( uint8_t *pix, int stride, int alpha, int beta )
  449. ;-----------------------------------------------------------------------------
  450. x264_deblock_v_chroma_intra_mmxext:
  451.     CHROMA_V_START
  452.     picpush ebx
  453.     picgetgot ebx
  454.     movq  mm0, [eax]
  455.     movq  mm1, [eax+esi]
  456.     movq  mm2, [edi]
  457.     movq  mm3, [edi+esi]
  458.     CHROMA_INTRA_BODY ; XXX: make sure ebx has the GOT in PIC mode
  459.     movq  [eax+esi], mm1
  460.     movq  [edi], mm2
  461.     picpop ebx
  462.     CHROMA_END
  463. ALIGN 16
  464. ;-----------------------------------------------------------------------------
  465. ;   void x264_deblock_h_chroma_intra_mmxext( uint8_t *pix, int stride, int alpha, int beta )
  466. ;-----------------------------------------------------------------------------
  467. x264_deblock_h_chroma_intra_mmxext:
  468.     CHROMA_H_START
  469.     picpush ebx
  470.     picgetgot ebx
  471.     TRANSPOSE4x8_LOAD  PASS8ROWS(eax, edi, esi, ebp)
  472.     CHROMA_INTRA_BODY ; XXX: make sure ebx has the GOT in PIC mode
  473.     TRANSPOSE8x4_STORE PASS8ROWS(eax, edi, esi, ebp)
  474.     picpop ebx
  475.     pop  ebp ; needed because of CHROMA_H_START
  476.     CHROMA_END