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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. ;*****************************************************************************
  2. ;* dct-64.asm: h264 encoder library
  3. ;*****************************************************************************
  4. ;* Copyright (C) 2003-2008 x264 project
  5. ;*
  6. ;* Authors: Loren Merritt <lorenm@u.washington.edu>
  7. ;*          Holger Lubitz <holger@lubitz.org>
  8. ;*          Laurent Aimar <fenrir@via.ecp.fr>
  9. ;*          Min Chen <chenm001.163.com>
  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. hsub_mul: times 8 db 1, -1
  30. SECTION .text
  31. INIT_XMM
  32. %macro DCT8_1D 10
  33.     SUMSUB_BA  m%5, m%4 ; %5=s34, %4=d34
  34.     SUMSUB_BA  m%6, m%3 ; %6=s25, %3=d25
  35.     SUMSUB_BA  m%7, m%2 ; %7=s16, %2=d16
  36.     SUMSUB_BA  m%8, m%1 ; %8=s07, %1=d07
  37.     SUMSUB_BA  m%6, m%7, m%10 ; %6=a1, %7=a3
  38.     SUMSUB_BA  m%5, m%8, m%10 ; %5=a0, %8=a2
  39.     movdqa  m%9, m%1
  40.     psraw   m%9, 1
  41.     paddw   m%9, m%1
  42.     paddw   m%9, m%2
  43.     paddw   m%9, m%3 ; %9=a4
  44.     movdqa  m%10, m%4
  45.     psraw   m%10, 1
  46.     paddw   m%10, m%4
  47.     paddw   m%10, m%2
  48.     psubw   m%10, m%3 ; %10=a7
  49.     SUMSUB_BA  m%4, m%1
  50.     psubw   m%1, m%3
  51.     psubw   m%4, m%2
  52.     psraw   m%3, 1
  53.     psraw   m%2, 1
  54.     psubw   m%1, m%3 ; %1=a5
  55.     psubw   m%4, m%2 ; %4=a6
  56.     movdqa  m%2, m%10
  57.     psraw   m%2, 2
  58.     paddw   m%2, m%9 ; %2=b1
  59.     psraw   m%9, 2
  60.     psubw   m%9, m%10 ; %9=b7
  61.     SUMSUB_BA  m%6, m%5, m%10 ; %6=b0, %5=b4
  62.     movdqa  m%3, m%7
  63.     psraw   m%3, 1
  64.     paddw   m%3, m%8 ; %3=b2
  65.     psraw   m%8, 1
  66.     psubw   m%8, m%7 ; %8=b6
  67.     movdqa  m%7, m%4
  68.     psraw   m%7, 2
  69.     paddw   m%7, m%1 ; %7=b3
  70.     psraw   m%1, 2
  71.     psubw   m%4, m%1 ; %4=b5
  72.     SWAP %1, %6, %4, %7, %8, %9
  73. %endmacro
  74. %macro IDCT8_1D 10
  75.     SUMSUB_BA  m%5, m%1, m%9 ; %5=a0, %1=a2
  76.     movdqa  m%9, m%2
  77.     psraw   m%9, 1
  78.     paddw   m%9, m%2
  79.     paddw   m%9, m%4
  80.     paddw   m%9, m%6 ; %9=a7
  81.     movdqa  m%10, m%3
  82.     psraw   m%3, 1
  83.     psubw   m%3, m%7 ; %3=a4
  84.     psraw   m%7, 1
  85.     paddw   m%7, m%10 ; %7=a6
  86.     movdqa  m%10, m%6
  87.     psraw   m%10, 1
  88.     paddw   m%10, m%6
  89.     paddw   m%10, m%8
  90.     psubw   m%10, m%2 ; %10=a5
  91.     psubw   m%2, m%4
  92.     psubw   m%6, m%4
  93.     paddw   m%2, m%8
  94.     psubw   m%6, m%8
  95.     psraw   m%4, 1
  96.     psraw   m%8, 1
  97.     psubw   m%2, m%4 ; %2=a3
  98.     psubw   m%6, m%8 ; %6=a1
  99.     movdqa  m%4, m%9
  100.     psraw   m%4, 2
  101.     paddw   m%4, m%6 ; %4=b1
  102.     psraw   m%6, 2
  103.     psubw   m%9, m%6 ; %9=b7
  104.     SUMSUB_BA m%7, m%5, m%6 ; %7=b0, %5=b6
  105.     SUMSUB_BA m%3, m%1, m%6; %3=b2, %1=b4
  106.     movdqa  m%8, m%10
  107.     psraw   m%8, 2
  108.     paddw   m%8, m%2 ; %8=b3
  109.     psraw   m%2, 2
  110.     psubw   m%2, m%10 ; %2=b5
  111.     SUMSUB_BA m%9, m%7, m%6 ; %9=c0, %7=c7
  112.     SUMSUB_BA m%2, m%3, m%6 ; %2=c1, %3=c6
  113.     SUMSUB_BA m%8, m%1, m%6 ; %8=c2, %1=c5
  114.     SUMSUB_BA m%4, m%5, m%6 ; %4=c3, %5=c4
  115.     SWAP %1, %9, %6
  116.     SWAP %3, %8, %7
  117. %endmacro
  118. %macro DCT_SUB8 1
  119. cglobal x264_sub8x8_dct_%1, 3,3,11
  120.     add r2, 4*FDEC_STRIDE
  121. %ifnidn %1, sse2
  122.     mova m7, [hsub_mul GLOBAL]
  123. %endif
  124. %ifdef WIN64
  125.     call .skip_prologue
  126.     RET
  127. %endif
  128. global x264_sub8x8_dct_%1.skip_prologue
  129. .skip_prologue:
  130.     SWAP 7, 9
  131.     LOAD_DIFF8x4 0, 1, 2, 3, 8, 9, r1, r2-4*FDEC_STRIDE
  132.     LOAD_DIFF8x4 4, 5, 6, 7, 8, 9, r1, r2-4*FDEC_STRIDE
  133.     DCT4_1D 0, 1, 2, 3, 8
  134.     TRANSPOSE2x4x4W 0, 1, 2, 3, 8
  135.     DCT4_1D 4, 5, 6, 7, 8
  136.     TRANSPOSE2x4x4W 4, 5, 6, 7, 8
  137.     DCT4_1D 0, 1, 2, 3, 8
  138.     STORE_DCT 0, 1, 2, 3, r0, 0
  139.     DCT4_1D 4, 5, 6, 7, 8
  140.     STORE_DCT 4, 5, 6, 7, r0, 64
  141.     ret
  142. ;-----------------------------------------------------------------------------
  143. ; void x264_sub8x8_dct8_sse2( int16_t dct[8][8], uint8_t *pix1, uint8_t *pix2 )
  144. ;-----------------------------------------------------------------------------
  145. cglobal x264_sub8x8_dct8_%1, 3,3,11
  146.     add r2, 4*FDEC_STRIDE
  147. %ifnidn %1, sse2
  148.     mova m7, [hsub_mul GLOBAL]
  149. %endif
  150. %ifdef WIN64
  151.     call .skip_prologue
  152.     RET
  153. %endif
  154. global x264_sub8x8_dct8_%1.skip_prologue
  155. .skip_prologue:
  156.     SWAP 7, 10
  157.     LOAD_DIFF8x4  0, 1, 2, 3, 4, 10, r1, r2-4*FDEC_STRIDE
  158.     LOAD_DIFF8x4  4, 5, 6, 7, 8, 10, r1, r2-4*FDEC_STRIDE
  159.     DCT8_1D       0,1,2,3,4,5,6,7,8,9
  160.     TRANSPOSE8x8W 0,1,2,3,4,5,6,7,8
  161.     DCT8_1D       0,1,2,3,4,5,6,7,8,9
  162.     movdqa  [r0+0x00], m0
  163.     movdqa  [r0+0x10], m1
  164.     movdqa  [r0+0x20], m2
  165.     movdqa  [r0+0x30], m3
  166.     movdqa  [r0+0x40], m4
  167.     movdqa  [r0+0x50], m5
  168.     movdqa  [r0+0x60], m6
  169.     movdqa  [r0+0x70], m7
  170.     ret
  171. %endmacro
  172. %define LOAD_DIFF8x4 LOAD_DIFF8x4_SSE2
  173. %define movdqa movaps
  174. %define punpcklqdq movlhps
  175. DCT_SUB8 sse2
  176. %undef movdqa
  177. %undef punpcklqdq
  178. %define LOAD_DIFF8x4 LOAD_DIFF8x4_SSSE3
  179. DCT_SUB8 ssse3
  180. ;-----------------------------------------------------------------------------
  181. ; void x264_add8x8_idct8_sse2( uint8_t *p_dst, int16_t dct[8][8] )
  182. ;-----------------------------------------------------------------------------
  183. cglobal x264_add8x8_idct8_sse2, 2,2,11
  184.     add r0, 4*FDEC_STRIDE
  185.     pxor m7, m7
  186. %ifdef WIN64
  187.     call .skip_prologue
  188.     RET
  189. %endif
  190. global x264_add8x8_idct8_sse2.skip_prologue
  191. .skip_prologue:
  192.     SWAP 7, 9
  193.     movdqa  m0, [r1+0x00]
  194.     movdqa  m1, [r1+0x10]
  195.     movdqa  m2, [r1+0x20]
  196.     movdqa  m3, [r1+0x30]
  197.     movdqa  m4, [r1+0x40]
  198.     movdqa  m5, [r1+0x50]
  199.     movdqa  m6, [r1+0x60]
  200.     movdqa  m7, [r1+0x70]
  201.     IDCT8_1D      0,1,2,3,4,5,6,7,8,10
  202.     TRANSPOSE8x8W 0,1,2,3,4,5,6,7,8
  203.     paddw         m0, [pw_32 GLOBAL] ; rounding for the >>6 at the end
  204.     IDCT8_1D      0,1,2,3,4,5,6,7,8,10
  205.     DIFFx2 m0, m1, m8, m9, [r0-4*FDEC_STRIDE], [r0-3*FDEC_STRIDE]
  206.     DIFFx2 m2, m3, m8, m9, [r0-2*FDEC_STRIDE], [r0-1*FDEC_STRIDE]
  207.     DIFFx2 m4, m5, m8, m9, [r0+0*FDEC_STRIDE], [r0+1*FDEC_STRIDE]
  208.     DIFFx2 m6, m7, m8, m9, [r0+2*FDEC_STRIDE], [r0+3*FDEC_STRIDE]
  209.     STORE_IDCT m1, m3, m5, m7
  210.     ret
  211. ;-----------------------------------------------------------------------------
  212. ; void x264_add8x8_idct_sse2( uint8_t *pix, int16_t dct[4][4][4] )
  213. ;-----------------------------------------------------------------------------
  214. cglobal x264_add8x8_idct_sse2, 2,2,11
  215.     add  r0, 4*FDEC_STRIDE
  216.     pxor m7, m7
  217. %ifdef WIN64
  218.     call .skip_prologue
  219.     RET
  220. %endif
  221. global x264_add8x8_idct_sse2.skip_prologue
  222. .skip_prologue:
  223.     SWAP 7, 9
  224.     mova   m0, [r1+ 0]
  225.     mova   m2, [r1+16]
  226.     mova   m1, [r1+32]
  227.     mova   m3, [r1+48]
  228.     SBUTTERFLY qdq, 0, 1, 4
  229.     SBUTTERFLY qdq, 2, 3, 4
  230.     mova   m4, [r1+64]
  231.     mova   m6, [r1+80]
  232.     mova   m5, [r1+96]
  233.     mova   m7, [r1+112]
  234.     SBUTTERFLY qdq, 4, 5, 8
  235.     SBUTTERFLY qdq, 6, 7, 8
  236.     IDCT4_1D 0,1,2,3,8,10
  237.     TRANSPOSE2x4x4W 0,1,2,3,8
  238.     IDCT4_1D 4,5,6,7,8,10
  239.     TRANSPOSE2x4x4W 4,5,6,7,8
  240.     paddw m0, [pw_32 GLOBAL]
  241.     IDCT4_1D 0,1,2,3,8,10
  242.     paddw m4, [pw_32 GLOBAL]
  243.     IDCT4_1D 4,5,6,7,8,10
  244.     DIFFx2 m0, m1, m8, m9, [r0-4*FDEC_STRIDE], [r0-3*FDEC_STRIDE]
  245.     DIFFx2 m2, m3, m8, m9, [r0-2*FDEC_STRIDE], [r0-1*FDEC_STRIDE]
  246.     DIFFx2 m4, m5, m8, m9, [r0+0*FDEC_STRIDE], [r0+1*FDEC_STRIDE]
  247.     DIFFx2 m6, m7, m8, m9, [r0+2*FDEC_STRIDE], [r0+3*FDEC_STRIDE]
  248.     STORE_IDCT m1, m3, m5, m7
  249.     ret