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

Audio

开发平台:

Visual C++

  1. ;*****************************************************************************
  2. ;* dct-32.asm: h264 encoder library
  3. ;*****************************************************************************
  4. ;* Copyright (C) 2003-2008 x264 project
  5. ;*
  6. ;* Authors: Laurent Aimar <fenrir@via.ecp.fr> (initial version)
  7. ;*          Loren Merritt <lorenm@u.washington.edu> (misc)
  8. ;*          Min Chen <chenm001.163.com> (converted to nasm)
  9. ;*          Christian Heine <sennindemokrit@gmx.net> (dct8/idct8 functions)
  10. ;*
  11. ;* This program is free software; you can redistribute it and/or modify
  12. ;* it under the terms of the GNU General Public License as published by
  13. ;* the Free Software Foundation; either version 2 of the License, or
  14. ;* (at your option) any later version.
  15. ;*
  16. ;* This program is distributed in the hope that it will be useful,
  17. ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19. ;* GNU General Public License for more details.
  20. ;*
  21. ;* You should have received a copy of the GNU General Public License
  22. ;* along with this program; if not, write to the Free Software
  23. ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
  24. ;*****************************************************************************
  25. %include "x86inc.asm"
  26. %include "x86util.asm"
  27. SECTION_RODATA
  28. pw_32: times 8 dw 32
  29. SECTION .text
  30. ; in: m0..m7
  31. ; out: 0,4,6 in mem, rest in regs
  32. %macro DCT8_1D 9
  33.     SUMSUB_BA  m%8, m%1      ; %8 = s07, %1 = d07
  34.     SUMSUB_BA  m%7, m%2      ; %7 = s16, %2 = d16
  35.     SUMSUB_BA  m%6, m%3      ; %6 = s25, %3 = d25
  36.     SUMSUB_BA  m%5, m%4      ; %5 = s34, %4 = d34
  37.     SUMSUB_BA  m%5, m%8      ; %5 = a0,  %8 = a2
  38.     SUMSUB_BA  m%6, m%7      ; %6 = a1,  %7 = a3
  39.     SUMSUB_BA  m%6, m%5      ; %6 = dst0, %5 = dst4
  40.     mova    [%9+0x00], m%6
  41.     mova    [%9+0x40], m%5
  42.     mova    m%6, m%7         ; a3
  43.     psraw   m%6, 1           ; a3>>1
  44.     paddw   m%6, m%8         ; a2 + (a3>>1)
  45.     psraw   m%8, 1           ; a2>>1
  46.     psubw   m%8, m%7         ; (a2>>1) - a3
  47.     mova    [%9+0x60], m%8
  48.     mova    m%5, m%3
  49.     psraw   m%5, 1
  50.     paddw   m%5, m%3         ; d25+(d25>>1)
  51.     mova    m%7, m%1
  52.     psubw   m%7, m%4         ; a5 = d07-d34-(d25+(d25>>1))
  53.     psubw   m%7, m%5
  54.     mova    m%5, m%2
  55.     psraw   m%5, 1
  56.     paddw   m%5, m%2         ; d16+(d16>>1)
  57.     mova    m%8, m%1
  58.     paddw   m%8, m%4
  59.     psubw   m%8, m%5         ; a6 = d07+d34-(d16+(d16>>1))
  60.     mova    m%5, m%1
  61.     psraw   m%5, 1
  62.     paddw   m%5, m%1         ; d07+(d07>>1)
  63.     paddw   m%5, m%2
  64.     paddw   m%5, m%3         ; a4 = d16+d25+(d07+(d07>>1))
  65.     mova    m%1, m%4
  66.     psraw   m%1, 1
  67.     paddw   m%1, m%4         ; d34+(d34>>1)
  68.     paddw   m%1, m%2
  69.     psubw   m%1, m%3         ; a7 = d16-d25+(d34+(d34>>1))
  70.     mova    m%4, m%1
  71.     psraw   m%4, 2
  72.     paddw   m%4, m%5         ; a4 + (a7>>2)
  73.     mova    m%3, m%8
  74.     psraw   m%3, 2
  75.     paddw   m%3, m%7         ; a5 + (a6>>2)
  76.     psraw   m%5, 2
  77.     psraw   m%7, 2
  78.     psubw   m%5, m%1         ; (a4>>2) - a7
  79.     psubw   m%8, m%7         ; a6 - (a5>>2)
  80.     SWAP %2, %4, %3, %6, %8, %5
  81. %endmacro
  82. ; in: 0,4 in mem, rest in regs
  83. ; out: m0..m7
  84. %macro IDCT8_1D 9
  85.     mova      m%1, m%3
  86.     mova      m%5, m%7
  87.     psraw     m%3, 1
  88.     psraw     m%7, 1
  89.     psubw     m%3, m%5
  90.     paddw     m%7, m%1
  91.     mova      m%5, m%2
  92.     psraw     m%5, 1
  93.     paddw     m%5, m%2
  94.     paddw     m%5, m%4
  95.     paddw     m%5, m%6
  96.     mova      m%1, m%6
  97.     psraw     m%1, 1
  98.     paddw     m%1, m%6
  99.     paddw     m%1, m%8
  100.     psubw     m%1, m%2
  101.     psubw     m%2, m%4
  102.     psubw     m%6, m%4
  103.     paddw     m%2, m%8
  104.     psubw     m%6, m%8
  105.     psraw     m%4, 1
  106.     psraw     m%8, 1
  107.     psubw     m%2, m%4
  108.     psubw     m%6, m%8
  109.     mova      m%4, m%5
  110.     mova      m%8, m%1
  111.     psraw     m%4, 2
  112.     psraw     m%8, 2
  113.     paddw     m%4, m%6
  114.     paddw     m%8, m%2
  115.     psraw     m%6, 2
  116.     psraw     m%2, 2
  117.     psubw     m%5, m%6
  118.     psubw     m%2, m%1
  119.     mova      m%1, [%9+0x00]
  120.     mova      m%6, [%9+0x40]
  121.     SUMSUB_BA m%6, m%1
  122.     SUMSUB_BA m%7, m%6
  123.     SUMSUB_BA m%3, m%1
  124.     SUMSUB_BA m%5, m%7
  125.     SUMSUB_BA m%2, m%3
  126.     SUMSUB_BA m%8, m%1
  127.     SUMSUB_BA m%4, m%6
  128.     SWAP %1, %5, %6
  129.     SWAP %3, %8, %7
  130. %endmacro
  131. INIT_MMX
  132. ALIGN 16
  133. load_diff_4x8_mmx:
  134.     LOAD_DIFF m0, m7, none, [r1+0*FENC_STRIDE], [r2+0*FDEC_STRIDE]
  135.     LOAD_DIFF m1, m7, none, [r1+1*FENC_STRIDE], [r2+1*FDEC_STRIDE]
  136.     LOAD_DIFF m2, m7, none, [r1+2*FENC_STRIDE], [r2+2*FDEC_STRIDE]
  137.     LOAD_DIFF m3, m7, none, [r1+3*FENC_STRIDE], [r2+3*FDEC_STRIDE]
  138.     LOAD_DIFF m4, m7, none, [r1+4*FENC_STRIDE], [r2+4*FDEC_STRIDE]
  139.     LOAD_DIFF m5, m7, none, [r1+5*FENC_STRIDE], [r2+5*FDEC_STRIDE]
  140.     movq  [r0], m0
  141.     LOAD_DIFF m6, m7, none, [r1+6*FENC_STRIDE], [r2+6*FDEC_STRIDE]
  142.     LOAD_DIFF m7, m0, none, [r1+7*FENC_STRIDE], [r2+7*FDEC_STRIDE]
  143.     movq  m0, [r0]
  144.     ret
  145. INIT_MMX
  146. ALIGN 16
  147. dct8_mmx:
  148.     DCT8_1D 0,1,2,3,4,5,6,7,r0
  149.     SAVE_MM_PERMUTATION dct8_mmx
  150.     ret
  151. %macro SPILL_SHUFFLE 3-* ; ptr, list of regs, list of memory offsets
  152.     %xdefine %%base %1
  153.     %rep %0/2
  154.     %xdefine %%tmp m%2
  155.     %rotate %0/2
  156.     mova [%%base + %2*16], %%tmp
  157.     %rotate 1-%0/2
  158.     %endrep
  159. %endmacro
  160. %macro UNSPILL_SHUFFLE 3-*
  161.     %xdefine %%base %1
  162.     %rep %0/2
  163.     %xdefine %%tmp m%2
  164.     %rotate %0/2
  165.     mova %%tmp, [%%base + %2*16]
  166.     %rotate 1-%0/2
  167.     %endrep
  168. %endmacro
  169. %macro SPILL 2+ ; assume offsets are the same as reg numbers
  170.     SPILL_SHUFFLE %1, %2, %2
  171. %endmacro
  172. %macro UNSPILL 2+
  173.     UNSPILL_SHUFFLE %1, %2, %2
  174. %endmacro
  175. ;-----------------------------------------------------------------------------
  176. ; void x264_sub8x8_dct8_mmx( int16_t dct[8][8], uint8_t *pix1, uint8_t *pix2 )
  177. ;-----------------------------------------------------------------------------
  178. cglobal x264_sub8x8_dct8_mmx, 3,3
  179. global x264_sub8x8_dct8_mmx %+ .skip_prologue
  180. .skip_prologue:
  181.     INIT_MMX
  182.     call load_diff_4x8_mmx
  183.     call dct8_mmx
  184.     UNSPILL r0, 0
  185.     TRANSPOSE4x4W 0,1,2,3,4
  186.     SPILL r0, 0,1,2,3
  187.     UNSPILL r0, 4,6
  188.     TRANSPOSE4x4W 4,5,6,7,0
  189.     SPILL r0, 4,5,6,7
  190.     INIT_MMX
  191.     add   r1, 4
  192.     add   r2, 4
  193.     add   r0, 8
  194.     call load_diff_4x8_mmx
  195.     sub   r1, 4
  196.     sub   r2, 4
  197.     call dct8_mmx
  198.     sub   r0, 8
  199.     UNSPILL r0+8, 4,6
  200.     TRANSPOSE4x4W 4,5,6,7,0
  201.     SPILL r0+8, 4,5,6,7
  202.     UNSPILL r0+8, 0
  203.     TRANSPOSE4x4W 0,1,2,3,5
  204.     UNSPILL r0, 4,5,6,7
  205.     SPILL_SHUFFLE r0, 0,1,2,3, 4,5,6,7
  206.     movq  mm4, m6 ; depends on the permutation to not produce conflicts
  207.     movq  mm0, m4
  208.     movq  mm1, m5
  209.     movq  mm2, mm4
  210.     movq  mm3, m7
  211.     INIT_MMX
  212.     UNSPILL r0+8, 4,5,6,7
  213.     add   r0, 8
  214.     call dct8_mmx
  215.     sub   r0, 8
  216.     SPILL r0+8, 1,2,3,5,7
  217.     INIT_MMX
  218.     UNSPILL r0, 0,1,2,3,4,5,6,7
  219.     call dct8_mmx
  220.     SPILL r0, 1,2,3,5,7
  221.     ret
  222. INIT_MMX
  223. ALIGN 16
  224. idct8_mmx:
  225.     IDCT8_1D 0,1,2,3,4,5,6,7,r1
  226.     SAVE_MM_PERMUTATION idct8_mmx
  227.     ret
  228. %macro ADD_STORE_ROW 3
  229.     movq  m1, [r0+%1*FDEC_STRIDE]
  230.     movq  m2, m1
  231.     punpcklbw m1, m0
  232.     punpckhbw m2, m0
  233.     paddw m1, %2
  234.     paddw m2, %3
  235.     packuswb m1, m2
  236.     movq  [r0+%1*FDEC_STRIDE], m1
  237. %endmacro
  238. ;-----------------------------------------------------------------------------
  239. ; void x264_add8x8_idct8_mmx( uint8_t *dst, int16_t dct[8][8] )
  240. ;-----------------------------------------------------------------------------
  241. cglobal x264_add8x8_idct8_mmx, 2,2
  242. global x264_add8x8_idct8_mmx %+ .skip_prologue
  243. .skip_prologue:
  244.     INIT_MMX
  245.     add word [r1], 32
  246.     UNSPILL r1, 1,2,3,5,6,7
  247.     call idct8_mmx
  248.     SPILL r1, 7
  249.     TRANSPOSE4x4W 0,1,2,3,7
  250.     SPILL r1, 0,1,2,3
  251.     UNSPILL r1, 7
  252.     TRANSPOSE4x4W 4,5,6,7,0
  253.     SPILL r1, 4,5,6,7
  254.     INIT_MMX
  255.     UNSPILL r1+8, 1,2,3,5,6,7
  256.     add r1, 8
  257.     call idct8_mmx
  258.     sub r1, 8
  259.     SPILL r1+8, 7
  260.     TRANSPOSE4x4W 0,1,2,3,7
  261.     SPILL r1+8, 0,1,2,3
  262.     UNSPILL r1+8, 7
  263.     TRANSPOSE4x4W 4,5,6,7,0
  264.     SPILL r1+8, 4,5,6,7
  265.     INIT_MMX
  266.     movq  m3, [r1+0x08]
  267.     movq  m0, [r1+0x40]
  268.     movq  [r1+0x40], m3
  269.     movq  [r1+0x08], m0
  270.     ; memory layout at this time:
  271.     ; A0------ A1------
  272.     ; B0------ F0------
  273.     ; C0------ G0------
  274.     ; D0------ H0------
  275.     ; E0------ E1------
  276.     ; B1------ F1------
  277.     ; C1------ G1------
  278.     ; D1------ H1------
  279.     UNSPILL_SHUFFLE r1, 1,2,3, 5,6,7
  280.     UNSPILL r1+8, 5,6,7
  281.     add r1, 8
  282.     call idct8_mmx
  283.     sub r1, 8
  284.     psraw m0, 6
  285.     psraw m1, 6
  286.     psraw m2, 6
  287.     psraw m3, 6
  288.     psraw m4, 6
  289.     psraw m5, 6
  290.     psraw m6, 6
  291.     psraw m7, 6
  292.     movq  [r1+0x08], m0 ; mm4
  293.     movq  [r1+0x48], m4 ; mm5
  294.     movq  [r1+0x58], m5 ; mm0
  295.     movq  [r1+0x68], m6 ; mm2
  296.     movq  [r1+0x78], m7 ; mm6
  297.     movq  mm5, [r1+0x18]
  298.     movq  mm6, [r1+0x28]
  299.     movq  [r1+0x18], m1 ; mm1
  300.     movq  [r1+0x28], m2 ; mm7
  301.     movq  mm7, [r1+0x38]
  302.     movq  [r1+0x38], m3 ; mm3
  303.     movq  mm1, [r1+0x10]
  304.     movq  mm2, [r1+0x20]
  305.     movq  mm3, [r1+0x30]
  306.     call idct8_mmx
  307.     psraw m0, 6
  308.     psraw m1, 6
  309.     psraw m2, 6
  310.     psraw m3, 6
  311.     psraw m4, 6
  312.     psraw m5, 6
  313.     psraw m6, 6
  314.     psraw m7, 6
  315.     SPILL r1, 0,1,2
  316.     pxor  m0, m0
  317.     ADD_STORE_ROW 0, [r1+0x00], [r1+0x08]
  318.     ADD_STORE_ROW 1, [r1+0x10], [r1+0x18]
  319.     ADD_STORE_ROW 2, [r1+0x20], [r1+0x28]
  320.     ADD_STORE_ROW 3, m3, [r1+0x38]
  321.     ADD_STORE_ROW 4, m4, [r1+0x48]
  322.     ADD_STORE_ROW 5, m5, [r1+0x58]
  323.     ADD_STORE_ROW 6, m6, [r1+0x68]
  324.     ADD_STORE_ROW 7, m7, [r1+0x78]
  325.     ret
  326. INIT_XMM
  327. ;-----------------------------------------------------------------------------
  328. ; void x264_sub8x8_dct8_sse2( int16_t dct[8][8], uint8_t *pix1, uint8_t *pix2 )
  329. ;-----------------------------------------------------------------------------
  330. cglobal x264_sub8x8_dct8_sse2, 3,3
  331. global x264_sub8x8_dct8_sse2 %+ .skip_prologue
  332. .skip_prologue:
  333.     LOAD_DIFF m0, m7, none, [r1+0*FENC_STRIDE], [r2+0*FDEC_STRIDE]
  334.     LOAD_DIFF m1, m7, none, [r1+1*FENC_STRIDE], [r2+1*FDEC_STRIDE]
  335.     LOAD_DIFF m2, m7, none, [r1+2*FENC_STRIDE], [r2+2*FDEC_STRIDE]
  336.     LOAD_DIFF m3, m7, none, [r1+3*FENC_STRIDE], [r2+3*FDEC_STRIDE]
  337.     LOAD_DIFF m4, m7, none, [r1+4*FENC_STRIDE], [r2+4*FDEC_STRIDE]
  338.     LOAD_DIFF m5, m7, none, [r1+5*FENC_STRIDE], [r2+5*FDEC_STRIDE]
  339.     SPILL r0, 0
  340.     LOAD_DIFF m6, m7, none, [r1+6*FENC_STRIDE], [r2+6*FDEC_STRIDE]
  341.     LOAD_DIFF m7, m0, none, [r1+7*FENC_STRIDE], [r2+7*FDEC_STRIDE]
  342.     UNSPILL r0, 0
  343.     DCT8_1D 0,1,2,3,4,5,6,7,r0
  344.     UNSPILL r0, 0,4
  345.     TRANSPOSE8x8W 0,1,2,3,4,5,6,7,[r0+0x60],[r0+0x40],1
  346.     UNSPILL r0, 4
  347.     DCT8_1D 0,1,2,3,4,5,6,7,r0
  348.     SPILL r0, 1,2,3,5,7
  349.     ret
  350. ;-----------------------------------------------------------------------------
  351. ; void x264_add8x8_idct8_sse2( uint8_t *p_dst, int16_t dct[8][8] )
  352. ;-----------------------------------------------------------------------------
  353. cglobal x264_add8x8_idct8_sse2, 2,2
  354. global x264_add8x8_idct8_sse2 %+ .skip_prologue
  355. .skip_prologue:
  356.     UNSPILL r1, 1,2,3,5,6,7
  357.     IDCT8_1D   0,1,2,3,4,5,6,7,r1
  358.     SPILL r1, 6
  359.     TRANSPOSE8x8W 0,1,2,3,4,5,6,7,[r1+0x60],[r1+0x40],1
  360.     paddw      m0, [pw_32 GLOBAL]
  361.     SPILL r1, 0
  362.     IDCT8_1D   0,1,2,3,4,5,6,7,r1
  363.     SPILL r1, 6,7
  364.     pxor       m7, m7
  365.     STORE_DIFF m0, m6, m7, [r0+FDEC_STRIDE*0]
  366.     STORE_DIFF m1, m6, m7, [r0+FDEC_STRIDE*1]
  367.     STORE_DIFF m2, m6, m7, [r0+FDEC_STRIDE*2]
  368.     STORE_DIFF m3, m6, m7, [r0+FDEC_STRIDE*3]
  369.     STORE_DIFF m4, m6, m7, [r0+FDEC_STRIDE*4]
  370.     STORE_DIFF m5, m6, m7, [r0+FDEC_STRIDE*5]
  371.     UNSPILL_SHUFFLE r1, 0,1, 6,7
  372.     STORE_DIFF m0, m6, m7, [r0+FDEC_STRIDE*6]
  373.     STORE_DIFF m1, m6, m7, [r0+FDEC_STRIDE*7]
  374.     ret