deblock-a.asm
上传用户:lctgjx
上传日期:2022-06-04
资源大小:8887k
文件大小:22k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. ;*****************************************************************************
  2. ;* deblock-a.asm: h264 encoder library
  3. ;*****************************************************************************
  4. ;* Copyright (C) 2005-2008 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., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
  21. ;*****************************************************************************
  22. %include "x86inc.asm"
  23. SECTION_RODATA
  24. pb_00: times 16 db 0x00
  25. pb_01: times 16 db 0x01
  26. pb_03: times 16 db 0x03
  27. pb_a1: times 16 db 0xa1
  28. SECTION .text
  29. ; expands to [base],...,[base+7*stride]
  30. %define PASS8ROWS(base, base3, stride, stride3) 
  31.     [base], [base+stride], [base+stride*2], [base3], 
  32.     [base3+stride], [base3+stride*2], [base3+stride3], [base3+stride*4]
  33. ; in: 8 rows of 4 bytes in %1..%8
  34. ; out: 4 rows of 8 bytes in m0..m3
  35. %macro TRANSPOSE4x8_LOAD 8
  36.     movd       m0, %1
  37.     movd       m2, %2
  38.     movd       m1, %3
  39.     movd       m3, %4
  40.     punpcklbw  m0, m2
  41.     punpcklbw  m1, m3
  42.     movq       m2, m0
  43.     punpcklwd  m0, m1
  44.     punpckhwd  m2, m1
  45.     movd       m4, %5
  46.     movd       m6, %6
  47.     movd       m5, %7
  48.     movd       m7, %8
  49.     punpcklbw  m4, m6
  50.     punpcklbw  m5, m7
  51.     movq       m6, m4
  52.     punpcklwd  m4, m5
  53.     punpckhwd  m6, m5
  54.     movq       m1, m0
  55.     movq       m3, m2
  56.     punpckldq  m0, m4
  57.     punpckhdq  m1, m4
  58.     punpckldq  m2, m6
  59.     punpckhdq  m3, m6
  60. %endmacro
  61. ; in: 4 rows of 8 bytes in m0..m3
  62. ; out: 8 rows of 4 bytes in %1..%8
  63. %macro TRANSPOSE8x4_STORE 8
  64.     movq       m4, m0
  65.     movq       m5, m1
  66.     movq       m6, m2
  67.     punpckhdq  m4, m4
  68.     punpckhdq  m5, m5
  69.     punpckhdq  m6, m6
  70.     punpcklbw  m0, m1
  71.     punpcklbw  m2, m3
  72.     movq       m1, m0
  73.     punpcklwd  m0, m2
  74.     punpckhwd  m1, m2
  75.     movd       %1, m0
  76.     punpckhdq  m0, m0
  77.     movd       %2, m0
  78.     movd       %3, m1
  79.     punpckhdq  m1, m1
  80.     movd       %4, m1
  81.     punpckhdq  m3, m3
  82.     punpcklbw  m4, m5
  83.     punpcklbw  m6, m3
  84.     movq       m5, m4
  85.     punpcklwd  m4, m6
  86.     punpckhwd  m5, m6
  87.     movd       %5, m4
  88.     punpckhdq  m4, m4
  89.     movd       %6, m4
  90.     movd       %7, m5
  91.     punpckhdq  m5, m5
  92.     movd       %8, m5
  93. %endmacro
  94. %macro SBUTTERFLY 4
  95.     movq       %4, %2
  96.     punpckl%1  %2, %3
  97.     punpckh%1  %4, %3
  98. %endmacro
  99. ; in: 8 rows of 8 (only the middle 6 pels are used) in %1..%8
  100. ; out: 6 rows of 8 in [%9+0*16] .. [%9+5*16]
  101. %macro TRANSPOSE6x8_MEM 9
  102.     movq  m0, %1
  103.     movq  m1, %2
  104.     movq  m2, %3
  105.     movq  m3, %4
  106.     movq  m4, %5
  107.     movq  m5, %6
  108.     movq  m6, %7
  109.     SBUTTERFLY bw, m0, m1, m7
  110.     SBUTTERFLY bw, m2, m3, m1
  111.     SBUTTERFLY bw, m4, m5, m3
  112.     movq  [%9+0x10], m1
  113.     SBUTTERFLY bw, m6, %8, m5
  114.     SBUTTERFLY wd, m0, m2, m1
  115.     SBUTTERFLY wd, m4, m6, m2
  116.     punpckhdq m0, m4
  117.     movq  [%9+0x00], m0
  118.     SBUTTERFLY wd, m7, [%9+0x10], m6
  119.     SBUTTERFLY wd, m3, m5, m4
  120.     SBUTTERFLY dq, m7, m3, m0
  121.     SBUTTERFLY dq, m1, m2, m5
  122.     punpckldq m6, m4
  123.     movq  [%9+0x10], m1
  124.     movq  [%9+0x20], m5
  125.     movq  [%9+0x30], m7
  126.     movq  [%9+0x40], m0
  127.     movq  [%9+0x50], m6
  128. %endmacro
  129. ; in: 8 rows of 8 in %1..%8
  130. ; out: 8 rows of 8 in %9..%16
  131. %macro TRANSPOSE8x8_MEM 16
  132.     movq  m0, %1
  133.     movq  m1, %2
  134.     movq  m2, %3
  135.     movq  m3, %4
  136.     movq  m4, %5
  137.     movq  m5, %6
  138.     movq  m6, %7
  139.     SBUTTERFLY bw, m0, m1, m7
  140.     SBUTTERFLY bw, m2, m3, m1
  141.     SBUTTERFLY bw, m4, m5, m3
  142.     SBUTTERFLY bw, m6, %8, m5
  143.     movq  %9,  m3
  144.     SBUTTERFLY wd, m0, m2, m3
  145.     SBUTTERFLY wd, m4, m6, m2
  146.     SBUTTERFLY wd, m7, m1, m6
  147.     movq  %11, m2
  148.     movq  m2,  %9
  149.     SBUTTERFLY wd, m2, m5, m1
  150.     SBUTTERFLY dq, m0, m4, m5
  151.     SBUTTERFLY dq, m7, m2, m4
  152.     movq  %9,  m0
  153.     movq  %10, m5
  154.     movq  %13, m7
  155.     movq  %14, m4
  156.     SBUTTERFLY dq, m3, %11, m0
  157.     SBUTTERFLY dq, m6, m1, m5
  158.     movq  %11, m3
  159.     movq  %12, m0
  160.     movq  %15, m6
  161.     movq  %16, m5
  162. %endmacro
  163. ; out: %4 = |%1-%2|>%3
  164. ; clobbers: %5
  165. %macro DIFF_GT 5
  166.     mova    %5, %2
  167.     mova    %4, %1
  168.     psubusb %5, %1
  169.     psubusb %4, %2
  170.     por     %4, %5
  171.     psubusb %4, %3
  172. %endmacro
  173. ; out: %4 = |%1-%2|>%3
  174. ; clobbers: %5
  175. %macro DIFF_GT2 5
  176.     mova    %5, %2
  177.     mova    %4, %1
  178.     psubusb %5, %1
  179.     psubusb %4, %2
  180.     psubusb %5, %3
  181.     psubusb %4, %3
  182.     pcmpeqb %4, %5
  183. %endmacro
  184. %macro SPLATW 1
  185. %ifidn m0, xmm0
  186.     pshuflw  %1, %1, 0
  187.     punpcklqdq %1, %1
  188. %else
  189.     pshufw   %1, %1, 0
  190. %endif
  191. %endmacro
  192. ; in: m0=p1 m1=p0 m2=q0 m3=q1 %1=alpha-1 %2=beta-1
  193. ; out: m5=beta-1, m7=mask, %3=alpha-1
  194. ; clobbers: m4,m6
  195. %macro LOAD_MASK 2-3
  196.     movd     m4, %1
  197.     movd     m5, %2
  198.     SPLATW   m4
  199.     SPLATW   m5
  200.     packuswb m4, m4  ; 16x alpha-1
  201.     packuswb m5, m5  ; 16x beta-1
  202. %if %0>2
  203.     mova     %3, m4
  204. %endif
  205.     DIFF_GT  m1, m2, m4, m7, m6 ; |p0-q0| > alpha-1
  206.     DIFF_GT  m0, m1, m5, m4, m6 ; |p1-p0| > beta-1
  207.     por      m7, m4
  208.     DIFF_GT  m3, m2, m5, m4, m6 ; |q1-q0| > beta-1
  209.     por      m7, m4
  210.     pxor     m6, m6
  211.     pcmpeqb  m7, m6
  212. %endmacro
  213. ; in: m0=p1 m1=p0 m2=q0 m3=q1 m7=(tc&mask)
  214. ; out: m1=p0' m2=q0'
  215. ; clobbers: m0,3-6
  216. %macro DEBLOCK_P0_Q0 0
  217.     mova    m5, m1
  218.     pxor    m5, m2           ; p0^q0
  219.     pand    m5, [pb_01 GLOBAL] ; (p0^q0)&1
  220.     pcmpeqb m4, m4
  221.     pxor    m3, m4
  222.     pavgb   m3, m0           ; (p1 - q1 + 256)>>1
  223.     pavgb   m3, [pb_03 GLOBAL] ; (((p1 - q1 + 256)>>1)+4)>>1 = 64+2+(p1-q1)>>2
  224.     pxor    m4, m1
  225.     pavgb   m4, m2           ; (q0 - p0 + 256)>>1
  226.     pavgb   m3, m5
  227.     paddusb m3, m4           ; d+128+33
  228.     mova    m6, [pb_a1 GLOBAL]
  229.     psubusb m6, m3
  230.     psubusb m3, [pb_a1 GLOBAL]
  231.     pminub  m6, m7
  232.     pminub  m3, m7
  233.     psubusb m1, m6
  234.     psubusb m2, m3
  235.     paddusb m1, m3
  236.     paddusb m2, m6
  237. %endmacro
  238. ; in: m1=p0 m2=q0
  239. ;     %1=p1 %2=q2 %3=[q2] %4=[q1] %5=tc0 %6=tmp
  240. ; out: [q1] = clip( (q2+((p0+q0+1)>>1))>>1, q1-tc0, q1+tc0 )
  241. ; clobbers: q2, tmp, tc0
  242. %macro LUMA_Q1 6
  243.     mova    %6, m1
  244.     pavgb   %6, m2
  245.     pavgb   %2, %6             ; avg(p2,avg(p0,q0))
  246.     pxor    %6, %3
  247.     pand    %6, [pb_01 GLOBAL] ; (p2^avg(p0,q0))&1
  248.     psubusb %2, %6             ; (p2+((p0+q0+1)>>1))>>1
  249.     mova    %6, %1
  250.     psubusb %6, %5
  251.     paddusb %5, %1
  252.     pmaxub  %2, %6
  253.     pminub  %2, %5
  254.     mova    %4, %2
  255. %endmacro
  256. %ifdef ARCH_X86_64
  257. ;-----------------------------------------------------------------------------
  258. ; void x264_deblock_v_luma_sse2( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
  259. ;-----------------------------------------------------------------------------
  260. INIT_XMM
  261. cglobal x264_deblock_v_luma_sse2, 5,5,10
  262.     movd    m8, [r4] ; tc0
  263.     lea     r4, [r1*3]
  264.     dec     r2d        ; alpha-1
  265.     neg     r4
  266.     dec     r3d        ; beta-1
  267.     add     r4, r0     ; pix-3*stride
  268.     mova    m0, [r4+r1]   ; p1
  269.     mova    m1, [r4+2*r1] ; p0
  270.     mova    m2, [r0]      ; q0
  271.     mova    m3, [r0+r1]   ; q1
  272.     LOAD_MASK r2d, r3d
  273.     punpcklbw m8, m8
  274.     punpcklbw m8, m8 ; tc = 4x tc0[3], 4x tc0[2], 4x tc0[1], 4x tc0[0]
  275.     pcmpeqb m9, m9
  276.     pcmpeqb m9, m8
  277.     pandn   m9, m7
  278.     pand    m8, m9
  279.     movdqa  m3, [r4] ; p2
  280.     DIFF_GT2 m1, m3, m5, m6, m7 ; |p2-p0| > beta-1
  281.     pand    m6, m9
  282.     mova    m7, m8
  283.     psubb   m7, m6
  284.     pand    m6, m8
  285.     LUMA_Q1 m0, m3, [r4], [r4+r1], m6, m4
  286.     movdqa  m4, [r0+2*r1] ; q2
  287.     DIFF_GT2 m2, m4, m5, m6, m3 ; |q2-q0| > beta-1
  288.     pand    m6, m9
  289.     pand    m8, m6
  290.     psubb   m7, m6
  291.     mova    m3, [r0+r1]
  292.     LUMA_Q1 m3, m4, [r0+2*r1], [r0+r1], m8, m6
  293.     DEBLOCK_P0_Q0
  294.     mova    [r4+2*r1], m1
  295.     mova    [r0], m2
  296.     RET
  297. ;-----------------------------------------------------------------------------
  298. ; void x264_deblock_h_luma_sse2( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
  299. ;-----------------------------------------------------------------------------
  300. INIT_MMX
  301. cglobal x264_deblock_h_luma_sse2, 5,7
  302.     movsxd r10, r1d
  303.     lea    r11, [r10+r10*2]
  304.     lea    r6,  [r0-4]
  305.     lea    r5,  [r0-4+r11]
  306. %ifdef WIN64
  307.     sub    rsp, 0x98
  308.     %define pix_tmp rsp+0x30
  309. %else
  310.     sub    rsp, 0x68
  311.     %define pix_tmp rsp
  312. %endif
  313.     ; transpose 6x16 -> tmp space
  314.     TRANSPOSE6x8_MEM  PASS8ROWS(r6, r5, r10, r11), pix_tmp
  315.     lea    r6, [r6+r10*8]
  316.     lea    r5, [r5+r10*8]
  317.     TRANSPOSE6x8_MEM  PASS8ROWS(r6, r5, r10, r11), pix_tmp+8
  318.     ; vertical filter
  319.     ; alpha, beta, tc0 are still in r2d, r3d, r4
  320.     ; don't backup r6, r5, r10, r11 because x264_deblock_v_luma_sse2 doesn't use them
  321.     lea    r0, [pix_tmp+0x30]
  322.     mov    r1d, 0x10
  323. %ifdef WIN64
  324.     mov    [rsp+0x20], r4
  325. %endif
  326.     call   x264_deblock_v_luma_sse2
  327.     ; transpose 16x4 -> original space  (only the middle 4 rows were changed by the filter)
  328.     add    r6, 2
  329.     add    r5, 2
  330.     movq   m0, [pix_tmp+0x18]
  331.     movq   m1, [pix_tmp+0x28]
  332.     movq   m2, [pix_tmp+0x38]
  333.     movq   m3, [pix_tmp+0x48]
  334.     TRANSPOSE8x4_STORE  PASS8ROWS(r6, r5, r10, r11)
  335.     shl    r10, 3
  336.     sub    r6,  r10
  337.     sub    r5,  r10
  338.     shr    r10, 3
  339.     movq   m0, [pix_tmp+0x10]
  340.     movq   m1, [pix_tmp+0x20]
  341.     movq   m2, [pix_tmp+0x30]
  342.     movq   m3, [pix_tmp+0x40]
  343.     TRANSPOSE8x4_STORE  PASS8ROWS(r6, r5, r10, r11)
  344. %ifdef WIN64
  345.     add    rsp, 0x98
  346. %else
  347.     add    rsp, 0x68
  348. %endif
  349.     RET
  350. %else
  351. %macro DEBLOCK_LUMA 3
  352. ;-----------------------------------------------------------------------------
  353. ; void x264_deblock_v8_luma_mmxext( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
  354. ;-----------------------------------------------------------------------------
  355. cglobal x264_deblock_%2_luma_%1, 5,5
  356.     lea     r4, [r1*3]
  357.     dec     r2     ; alpha-1
  358.     neg     r4
  359.     dec     r3     ; beta-1
  360.     add     r4, r0 ; pix-3*stride
  361.     %assign pad 2*%3+12-(stack_offset&15)
  362.     SUB     esp, pad
  363.     mova    m0, [r4+r1]   ; p1
  364.     mova    m1, [r4+2*r1] ; p0
  365.     mova    m2, [r0]      ; q0
  366.     mova    m3, [r0+r1]   ; q1
  367.     LOAD_MASK r2, r3
  368.     mov     r3, r4mp
  369.     movd    m4, [r3] ; tc0
  370.     punpcklbw m4, m4
  371.     punpcklbw m4, m4 ; tc = 4x tc0[3], 4x tc0[2], 4x tc0[1], 4x tc0[0]
  372.     mova   [esp+%3], m4 ; tc
  373.     pcmpeqb m3, m3
  374.     pcmpgtb m4, m3
  375.     pand    m4, m7
  376.     mova   [esp], m4 ; mask
  377.     mova    m3, [r4] ; p2
  378.     DIFF_GT2 m1, m3, m5, m6, m7 ; |p2-p0| > beta-1
  379.     pand    m6, m4
  380.     pand    m4, [esp+%3] ; tc
  381.     mova    m7, m4
  382.     psubb   m7, m6
  383.     pand    m6, m4
  384.     LUMA_Q1 m0, m3, [r4], [r4+r1], m6, m4
  385.     mova    m4, [r0+2*r1] ; q2
  386.     DIFF_GT2 m2, m4, m5, m6, m3 ; |q2-q0| > beta-1
  387.     mova    m5, [esp] ; mask
  388.     pand    m6, m5
  389.     mova    m5, [esp+%3] ; tc
  390.     pand    m5, m6
  391.     psubb   m7, m6
  392.     mova    m3, [r0+r1]
  393.     LUMA_Q1 m3, m4, [r0+2*r1], [r0+r1], m5, m6
  394.     DEBLOCK_P0_Q0
  395.     mova    [r4+2*r1], m1
  396.     mova    [r0], m2
  397.     ADD     esp, pad
  398.     RET
  399. ;-----------------------------------------------------------------------------
  400. ; void x264_deblock_h_luma_mmxext( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
  401. ;-----------------------------------------------------------------------------
  402. INIT_MMX
  403. cglobal x264_deblock_h_luma_%1, 0,5
  404.     mov    r0, r0mp
  405.     mov    r3, r1m
  406.     lea    r4, [r3*3]
  407.     sub    r0, 4
  408.     lea    r1, [r0+r4]
  409.     %assign pad 0x78-(stack_offset&15)
  410.     SUB    esp, pad
  411. %define pix_tmp esp+12
  412.     ; transpose 6x16 -> tmp space
  413.     TRANSPOSE6x8_MEM  PASS8ROWS(r0, r1, r3, r4), pix_tmp
  414.     lea    r0, [r0+r3*8]
  415.     lea    r1, [r1+r3*8]
  416.     TRANSPOSE6x8_MEM  PASS8ROWS(r0, r1, r3, r4), pix_tmp+8
  417.     ; vertical filter
  418.     lea    r0, [pix_tmp+0x30]
  419.     PUSH   dword r4m
  420.     PUSH   dword r3m
  421.     PUSH   dword r2m
  422.     PUSH   dword 16
  423.     PUSH   dword r0
  424.     call   x264_deblock_%2_luma_%1
  425. %ifidn %2, v8
  426.     add    dword [esp   ], 8 ; pix_tmp+0x38
  427.     add    dword [esp+16], 2 ; tc0+2
  428.     call   x264_deblock_%2_luma_%1
  429. %endif
  430.     ADD    esp, 20
  431.     ; transpose 16x4 -> original space  (only the middle 4 rows were changed by the filter)
  432.     mov    r0, r0mp
  433.     sub    r0, 2
  434.     lea    r1, [r0+r4]
  435.     movq   m0, [pix_tmp+0x10]
  436.     movq   m1, [pix_tmp+0x20]
  437.     movq   m2, [pix_tmp+0x30]
  438.     movq   m3, [pix_tmp+0x40]
  439.     TRANSPOSE8x4_STORE  PASS8ROWS(r0, r1, r3, r4)
  440.     lea    r0, [r0+r3*8]
  441.     lea    r1, [r1+r3*8]
  442.     movq   m0, [pix_tmp+0x18]
  443.     movq   m1, [pix_tmp+0x28]
  444.     movq   m2, [pix_tmp+0x38]
  445.     movq   m3, [pix_tmp+0x48]
  446.     TRANSPOSE8x4_STORE  PASS8ROWS(r0, r1, r3, r4)
  447.     ADD    esp, pad
  448.     RET
  449. %endmacro ; DEBLOCK_LUMA
  450. INIT_MMX
  451. DEBLOCK_LUMA mmxext, v8, 8
  452. INIT_XMM
  453. DEBLOCK_LUMA sse2, v, 16
  454. %endif ; ARCH
  455. %macro LUMA_INTRA_P012 4 ; p0..p3 in memory
  456.     mova  t0, p2
  457.     mova  t1, p0
  458.     pavgb t0, p1
  459.     pavgb t1, q0
  460.     pavgb t0, t1 ; ((p2+p1+1)/2 + (p0+q0+1)/2 + 1)/2
  461.     mova  t5, t1
  462.     mova  t2, p2
  463.     mova  t3, p0
  464.     paddb t2, p1
  465.     paddb t3, q0
  466.     paddb t2, t3
  467.     mova  t3, t2
  468.     mova  t4, t2
  469.     psrlw t2, 1
  470.     pavgb t2, mpb_00
  471.     pxor  t2, t0
  472.     pand  t2, mpb_01
  473.     psubb t0, t2 ; p1' = (p2+p1+p0+q0+2)/4;
  474.     mova  t1, p2
  475.     mova  t2, p2
  476.     pavgb t1, q1
  477.     psubb t2, q1
  478.     paddb t3, t3
  479.     psubb t3, t2 ; p2+2*p1+2*p0+2*q0+q1
  480.     pand  t2, mpb_01
  481.     psubb t1, t2
  482.     pavgb t1, p1
  483.     pavgb t1, t5 ; (((p2+q1)/2 + p1+1)/2 + (p0+q0+1)/2 + 1)/2
  484.     psrlw t3, 2
  485.     pavgb t3, mpb_00
  486.     pxor  t3, t1
  487.     pand  t3, mpb_01
  488.     psubb t1, t3 ; p0'a = (p2+2*p1+2*p0+2*q0+q1+4)/8
  489.     mova  t3, p0
  490.     mova  t2, p0
  491.     pxor  t3, q1
  492.     pavgb t2, q1
  493.     pand  t3, mpb_01
  494.     psubb t2, t3
  495.     pavgb t2, p1 ; p0'b = (2*p1+p0+q0+2)/4
  496.     pxor  t1, t2
  497.     pxor  t2, p0
  498.     pand  t1, mask1p
  499.     pand  t2, mask0
  500.     pxor  t1, t2
  501.     pxor  t1, p0
  502.     mova  %1, t1 ; store p0
  503.     mova  t1, %4 ; p3
  504.     mova  t2, t1
  505.     pavgb t1, p2
  506.     paddb t2, p2
  507.     pavgb t1, t0 ; (p3+p2+1)/2 + (p2+p1+p0+q0+2)/4
  508.     paddb t2, t2
  509.     paddb t2, t4 ; 2*p3+3*p2+p1+p0+q0
  510.     psrlw t2, 2
  511.     pavgb t2, mpb_00
  512.     pxor  t2, t1
  513.     pand  t2, mpb_01
  514.     psubb t1, t2 ; p2' = (2*p3+3*p2+p1+p0+q0+4)/8
  515.     pxor  t0, p1
  516.     pxor  t1, p2
  517.     pand  t0, mask1p
  518.     pand  t1, mask1p
  519.     pxor  t0, p1
  520.     pxor  t1, p2
  521.     mova  %2, t0 ; store p1
  522.     mova  %3, t1 ; store p2
  523. %endmacro
  524. %macro LUMA_INTRA_SWAP_PQ 0
  525.     %define q1 m0
  526.     %define q0 m1
  527.     %define p0 m2
  528.     %define p1 m3
  529.     %define p2 q2
  530.     %define mask1p mask1q
  531. %endmacro
  532. %macro DEBLOCK_LUMA_INTRA 2
  533.     %define p1 m0
  534.     %define p0 m1
  535.     %define q0 m2
  536.     %define q1 m3
  537.     %define t0 m4
  538.     %define t1 m5
  539.     %define t2 m6
  540.     %define t3 m7
  541. %ifdef ARCH_X86_64
  542.     %define p2 m8
  543.     %define q2 m9
  544.     %define t4 m10
  545.     %define t5 m11
  546.     %define mask0 m12
  547.     %define mask1p m13
  548.     %define mask1q [rsp-24]
  549.     %define mpb_00 m14
  550.     %define mpb_01 m15
  551. %else
  552.     %define spill(x) [esp+16*x+((stack_offset+4)&15)]
  553.     %define p2 [r4+r1]
  554.     %define q2 [r0+2*r1]
  555.     %define t4 spill(0)
  556.     %define t5 spill(1)
  557.     %define mask0 spill(2)
  558.     %define mask1p spill(3)
  559.     %define mask1q spill(4)
  560.     %define mpb_00 [pb_00 GLOBAL]
  561.     %define mpb_01 [pb_01 GLOBAL]
  562. %endif
  563. ;-----------------------------------------------------------------------------
  564. ; void x264_deblock_v_luma_intra_sse2( uint8_t *pix, int stride, int alpha, int beta )
  565. ;-----------------------------------------------------------------------------
  566. cglobal x264_deblock_%2_luma_intra_%1, 4,6,16
  567. %ifndef ARCH_X86_64
  568.     sub     esp, 0x60
  569. %endif
  570.     lea     r4, [r1*4]
  571.     lea     r5, [r1*3] ; 3*stride
  572.     dec     r2d        ; alpha-1
  573.     jl .end
  574.     neg     r4
  575.     dec     r3d        ; beta-1
  576.     jl .end
  577.     add     r4, r0     ; pix-4*stride
  578.     mova    p1, [r4+2*r1]
  579.     mova    p0, [r4+r5]
  580.     mova    q0, [r0]
  581.     mova    q1, [r0+r1]
  582. %ifdef ARCH_X86_64
  583.     pxor    mpb_00, mpb_00
  584.     mova    mpb_01, [pb_01 GLOBAL]
  585.     LOAD_MASK r2d, r3d, t5 ; m5=beta-1, t5=alpha-1, m7=mask0
  586.     SWAP    7, 12 ; m12=mask0
  587.     pavgb   t5, mpb_00
  588.     pavgb   t5, mpb_01 ; alpha/4+1
  589.     movdqa  p2, [r4+r1]
  590.     movdqa  q2, [r0+2*r1]
  591.     DIFF_GT2 p0, q0, t5, t0, t3 ; t0 = |p0-q0| > alpha/4+1
  592.     DIFF_GT2 p0, p2, m5, t2, t5 ; mask1 = |p2-p0| > beta-1
  593.     DIFF_GT2 q0, q2, m5, t4, t5 ; t4 = |q2-q0| > beta-1
  594.     pand    t0, mask0
  595.     pand    t4, t0
  596.     pand    t2, t0
  597.     mova    mask1q, t4
  598.     mova    mask1p, t2
  599. %else
  600.     LOAD_MASK r2d, r3d, t5 ; m5=beta-1, t5=alpha-1, m7=mask0
  601.     mova    m4, t5
  602.     mova    mask0, m7
  603.     pavgb   m4, [pb_00 GLOBAL]
  604.     pavgb   m4, [pb_01 GLOBAL] ; alpha/4+1
  605.     DIFF_GT2 p0, q0, m4, m6, m7 ; m6 = |p0-q0| > alpha/4+1
  606.     pand    m6, mask0
  607.     DIFF_GT2 p0, p2, m5, m4, m7 ; m4 = |p2-p0| > beta-1
  608.     pand    m4, m6
  609.     mova    mask1p, m4
  610.     DIFF_GT2 q0, q2, m5, m4, m7 ; m4 = |q2-q0| > beta-1
  611.     pand    m4, m6
  612.     mova    mask1q, m4
  613. %endif
  614.     LUMA_INTRA_P012 [r4+r5], [r4+2*r1], [r4+r1], [r4]
  615.     LUMA_INTRA_SWAP_PQ
  616.     LUMA_INTRA_P012 [r0], [r0+r1], [r0+2*r1], [r0+r5]
  617. .end:
  618. %ifndef ARCH_X86_64
  619.     add     esp, 0x60
  620. %endif
  621.     RET
  622. INIT_MMX
  623. %ifdef ARCH_X86_64
  624. ;-----------------------------------------------------------------------------
  625. ; void x264_deblock_h_luma_intra_sse2( uint8_t *pix, int stride, int alpha, int beta )
  626. ;-----------------------------------------------------------------------------
  627. cglobal x264_deblock_h_luma_intra_%1, 4,7
  628.     movsxd r10, r1d
  629.     lea    r11, [r10*3]
  630.     lea    r6,  [r0-4]
  631.     lea    r5,  [r0-4+r11]
  632.     sub    rsp, 0x88
  633.     %define pix_tmp rsp
  634.     ; transpose 8x16 -> tmp space
  635.     TRANSPOSE8x8_MEM  PASS8ROWS(r6, r5, r10, r11), PASS8ROWS(pix_tmp, pix_tmp+0x30, 0x10, 0x30)
  636.     lea    r6, [r6+r10*8]
  637.     lea    r5, [r5+r10*8]
  638.     TRANSPOSE8x8_MEM  PASS8ROWS(r6, r5, r10, r11), PASS8ROWS(pix_tmp+8, pix_tmp+0x38, 0x10, 0x30)
  639.     lea    r0,  [pix_tmp+0x40]
  640.     mov    r1,  0x10
  641.     call   x264_deblock_v_luma_intra_%1
  642.     ; transpose 16x6 -> original space (but we can't write only 6 pixels, so really 16x8)
  643.     lea    r5, [r6+r11]
  644.     TRANSPOSE8x8_MEM  PASS8ROWS(pix_tmp+8, pix_tmp+0x38, 0x10, 0x30), PASS8ROWS(r6, r5, r10, r11)
  645.     shl    r10, 3
  646.     sub    r6,  r10
  647.     sub    r5,  r10
  648.     shr    r10, 3
  649.     TRANSPOSE8x8_MEM  PASS8ROWS(pix_tmp, pix_tmp+0x30, 0x10, 0x30), PASS8ROWS(r6, r5, r10, r11)
  650.     add    rsp, 0x88
  651.     RET
  652. %else
  653. cglobal x264_deblock_h_luma_intra_%1, 2,4
  654.     lea    r3,  [r1*3]
  655.     sub    r0,  4
  656.     lea    r2,  [r0+r3]
  657. %assign pad 0x8c-(stack_offset&15)
  658.     SUB    rsp, pad
  659.     %define pix_tmp rsp
  660.     ; transpose 8x16 -> tmp space
  661.     TRANSPOSE8x8_MEM  PASS8ROWS(r0, r2, r1, r3), PASS8ROWS(pix_tmp, pix_tmp+0x30, 0x10, 0x30)
  662.     lea    r0,  [r0+r1*8]
  663.     lea    r2,  [r2+r1*8]
  664.     TRANSPOSE8x8_MEM  PASS8ROWS(r0, r2, r1, r3), PASS8ROWS(pix_tmp+8, pix_tmp+0x38, 0x10, 0x30)
  665.     lea    r0,  [pix_tmp+0x40]
  666.     PUSH   dword r3m
  667.     PUSH   dword r2m
  668.     PUSH   dword 16
  669.     PUSH   r0
  670.     call   x264_deblock_%2_luma_intra_%1
  671. %ifidn %2, v8
  672.     add    dword [rsp], 8 ; pix_tmp+8
  673.     call   x264_deblock_%2_luma_intra_%1
  674. %endif
  675.     ADD    esp, 16
  676.     mov    r1,  r1m
  677.     mov    r0,  r0mp
  678.     lea    r3,  [r1*3]
  679.     sub    r0,  4
  680.     lea    r2,  [r0+r3]
  681.     ; transpose 16x6 -> original space (but we can't write only 6 pixels, so really 16x8)
  682.     TRANSPOSE8x8_MEM  PASS8ROWS(pix_tmp, pix_tmp+0x30, 0x10, 0x30), PASS8ROWS(r0, r2, r1, r3)
  683.     lea    r0,  [r0+r1*8]
  684.     lea    r2,  [r2+r1*8]
  685.     TRANSPOSE8x8_MEM  PASS8ROWS(pix_tmp+8, pix_tmp+0x38, 0x10, 0x30), PASS8ROWS(r0, r2, r1, r3)
  686.     ADD    rsp, pad
  687.     RET
  688. %endif ; ARCH_X86_64
  689. %endmacro ; DEBLOCK_LUMA_INTRA
  690. INIT_XMM
  691. DEBLOCK_LUMA_INTRA sse2, v
  692. %ifndef ARCH_X86_64
  693. INIT_MMX
  694. DEBLOCK_LUMA_INTRA mmxext, v8
  695. %endif
  696. INIT_MMX
  697. %macro CHROMA_V_START 0
  698.     dec    r2d      ; alpha-1
  699.     dec    r3d      ; beta-1
  700.     mov    t5, r0
  701.     sub    t5, r1
  702.     sub    t5, r1
  703. %endmacro
  704. %macro CHROMA_H_START 0
  705.     dec    r2d
  706.     dec    r3d
  707.     sub    r0, 2
  708.     lea    t6, [r1*3]
  709.     mov    t5, r0
  710.     add    r0, t6
  711. %endmacro
  712. %define t5 r5
  713. %define t6 r6
  714. ;-----------------------------------------------------------------------------
  715. ; void x264_deblock_v_chroma_mmxext( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
  716. ;-----------------------------------------------------------------------------
  717. cglobal x264_deblock_v_chroma_mmxext, 5,6
  718.     CHROMA_V_START
  719.     movq  m0, [t5]
  720.     movq  m1, [t5+r1]
  721.     movq  m2, [r0]
  722.     movq  m3, [r0+r1]
  723.     call chroma_inter_body_mmxext
  724.     movq  [t5+r1], m1
  725.     movq  [r0], m2
  726.     RET
  727. ;-----------------------------------------------------------------------------
  728. ; void x264_deblock_h_chroma_mmxext( uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0 )
  729. ;-----------------------------------------------------------------------------
  730. cglobal x264_deblock_h_chroma_mmxext, 5,7
  731. %ifdef ARCH_X86_64
  732.     %define buf0 [rsp-24]
  733.     %define buf1 [rsp-16]
  734. %else
  735.     %define buf0 r0m
  736.     %define buf1 r2m
  737. %endif
  738.     CHROMA_H_START
  739.     TRANSPOSE4x8_LOAD  PASS8ROWS(t5, r0, r1, t6)
  740.     movq  buf0, m0
  741.     movq  buf1, m3
  742.     call chroma_inter_body_mmxext
  743.     movq  m0, buf0
  744.     movq  m3, buf1
  745.     TRANSPOSE8x4_STORE PASS8ROWS(t5, r0, r1, t6)
  746.     RET
  747. ALIGN 16
  748. chroma_inter_body_mmxext:
  749.     LOAD_MASK  r2d, r3d
  750.     movd       m6, [r4] ; tc0
  751.     punpcklbw  m6, m6
  752.     pand       m7, m6
  753.     DEBLOCK_P0_Q0
  754.     ret
  755. ; in: %1=p0 %2=p1 %3=q1
  756. ; out: p0 = (p0 + q1 + 2*p1 + 2) >> 2
  757. %macro CHROMA_INTRA_P0 3
  758.     movq    m4, %1
  759.     pxor    m4, %3
  760.     pand    m4, [pb_01 GLOBAL] ; m4 = (p0^q1)&1
  761.     pavgb   %1, %3
  762.     psubusb %1, m4
  763.     pavgb   %1, %2             ; dst = avg(p1, avg(p0,q1) - ((p0^q1)&1))
  764. %endmacro
  765. %define t5 r4
  766. %define t6 r5
  767. ;-----------------------------------------------------------------------------
  768. ; void x264_deblock_v_chroma_intra_mmxext( uint8_t *pix, int stride, int alpha, int beta )
  769. ;-----------------------------------------------------------------------------
  770. cglobal x264_deblock_v_chroma_intra_mmxext, 4,5
  771.     CHROMA_V_START
  772.     movq  m0, [t5]
  773.     movq  m1, [t5+r1]
  774.     movq  m2, [r0]
  775.     movq  m3, [r0+r1]
  776.     call chroma_intra_body_mmxext
  777.     movq  [t5+r1], m1
  778.     movq  [r0], m2
  779.     RET
  780. ;-----------------------------------------------------------------------------
  781. ; void x264_deblock_h_chroma_intra_mmxext( uint8_t *pix, int stride, int alpha, int beta )
  782. ;-----------------------------------------------------------------------------
  783. cglobal x264_deblock_h_chroma_intra_mmxext, 4,6
  784.     CHROMA_H_START
  785.     TRANSPOSE4x8_LOAD  PASS8ROWS(t5, r0, r1, t6)
  786.     call chroma_intra_body_mmxext
  787.     TRANSPOSE8x4_STORE PASS8ROWS(t5, r0, r1, t6)
  788.     RET
  789. ALIGN 16
  790. chroma_intra_body_mmxext:
  791.     LOAD_MASK r2d, r3d
  792.     movq   m5, m1
  793.     movq   m6, m2
  794.     CHROMA_INTRA_P0  m1, m0, m3
  795.     CHROMA_INTRA_P0  m2, m3, m0
  796.     psubb  m1, m5
  797.     psubb  m2, m6
  798.     pand   m1, m7
  799.     pand   m2, m7
  800.     paddb  m1, m5
  801.     paddb  m2, m6
  802.     ret