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

Audio

开发平台:

Visual C++

  1. ;*****************************************************************************
  2. ;* dct-64.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> (dct8, misc)
  8. ;*          Min Chen <chenm001.163.com> (converted to nasm)
  9. ;*
  10. ;* This program is free software; you can redistribute it and/or modify
  11. ;* it under the terms of the GNU General Public License as published by
  12. ;* the Free Software Foundation; either version 2 of the License, or
  13. ;* (at your option) any later version.
  14. ;*
  15. ;* This program is distributed in the hope that it will be useful,
  16. ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18. ;* GNU General Public License for more details.
  19. ;*
  20. ;* You should have received a copy of the GNU General Public License
  21. ;* along with this program; if not, write to the Free Software
  22. ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
  23. ;*****************************************************************************
  24. %include "x86inc.asm"
  25. %include "x86util.asm"
  26. SECTION_RODATA
  27. pw_32: times 8 dw 32
  28. SECTION .text
  29. INIT_XMM
  30. %macro DCT8_1D 10
  31.     SUMSUB_BA  m%8, m%1 ; %8=s07, %1=d07
  32.     SUMSUB_BA  m%7, m%2 ; %7=s16, %2=d16
  33.     SUMSUB_BA  m%6, m%3 ; %6=s25, %3=d25
  34.     SUMSUB_BA  m%5, m%4 ; %5=s34, %4=d34
  35.     SUMSUB_BA  m%5, m%8 ; %5=a0, %8=a2
  36.     SUMSUB_BA  m%6, m%7 ; %6=a1, %7=a3
  37.     movdqa  m%9, m%1
  38.     psraw   m%9, 1
  39.     paddw   m%9, m%1
  40.     paddw   m%9, m%2
  41.     paddw   m%9, m%3 ; %9=a4
  42.     movdqa  m%10, m%4
  43.     psraw   m%10, 1
  44.     paddw   m%10, m%4
  45.     paddw   m%10, m%2
  46.     psubw   m%10, m%3 ; %10=a7
  47.     SUMSUB_BA  m%4, m%1
  48.     psubw   m%1, m%3
  49.     psubw   m%4, m%2
  50.     psraw   m%3, 1
  51.     psraw   m%2, 1
  52.     psubw   m%1, m%3 ; %1=a5
  53.     psubw   m%4, m%2 ; %4=a6
  54.     SUMSUB_BA  m%6, m%5 ; %6=b0, %5=b4
  55.     movdqa  m%2, m%10
  56.     psraw   m%2, 2
  57.     paddw   m%2, m%9 ; %2=b1
  58.     psraw   m%9, 2
  59.     psubw   m%9, m%10 ; %9=b7
  60.     movdqa  m%3, m%7
  61.     psraw   m%3, 1
  62.     paddw   m%3, m%8 ; %3=b2
  63.     psraw   m%8, 1
  64.     psubw   m%8, m%7 ; %8=b6
  65.     movdqa  m%7, m%4
  66.     psraw   m%7, 2
  67.     paddw   m%7, m%1 ; %7=b3
  68.     psraw   m%1, 2
  69.     psubw   m%4, m%1 ; %4=b5
  70.     SWAP %1, %6, %4, %7, %8, %9
  71. %endmacro
  72. ;-----------------------------------------------------------------------------
  73. ; void x264_sub8x8_dct8_sse2( int16_t dct[8][8], uint8_t *pix1, uint8_t *pix2 )
  74. ;-----------------------------------------------------------------------------
  75. cglobal x264_sub8x8_dct8_sse2
  76.     LOAD_DIFF  m0, m8, m9, [r1+0*FENC_STRIDE], [r2+0*FDEC_STRIDE]
  77.     LOAD_DIFF  m1, m8, m9, [r1+1*FENC_STRIDE], [r2+1*FDEC_STRIDE]
  78.     LOAD_DIFF  m2, m8, m9, [r1+2*FENC_STRIDE], [r2+2*FDEC_STRIDE]
  79.     LOAD_DIFF  m3, m8, m9, [r1+3*FENC_STRIDE], [r2+3*FDEC_STRIDE]
  80.     LOAD_DIFF  m4, m8, m9, [r1+4*FENC_STRIDE], [r2+4*FDEC_STRIDE]
  81.     LOAD_DIFF  m5, m8, m9, [r1+5*FENC_STRIDE], [r2+5*FDEC_STRIDE]
  82.     LOAD_DIFF  m6, m8, m9, [r1+6*FENC_STRIDE], [r2+6*FDEC_STRIDE]
  83.     LOAD_DIFF  m7, m8, m9, [r1+7*FENC_STRIDE], [r2+7*FDEC_STRIDE]
  84.     DCT8_1D       0,1,2,3,4,5,6,7,8,9
  85.     TRANSPOSE8x8W 0,1,2,3,4,5,6,7,8
  86.     DCT8_1D       0,1,2,3,4,5,6,7,8,9
  87.     movdqa  [r0+0x00], m0
  88.     movdqa  [r0+0x10], m1
  89.     movdqa  [r0+0x20], m2
  90.     movdqa  [r0+0x30], m3
  91.     movdqa  [r0+0x40], m4
  92.     movdqa  [r0+0x50], m5
  93.     movdqa  [r0+0x60], m6
  94.     movdqa  [r0+0x70], m7
  95.     ret
  96. %macro IDCT8_1D 10
  97.     SUMSUB_BA  m%5, m%1 ; %5=a0, %1=a2
  98.     movdqa  m%10, m%3
  99.     psraw   m%3, 1
  100.     psubw   m%3, m%7 ; %3=a4
  101.     psraw   m%7, 1
  102.     paddw   m%7, m%10 ; %7=a6
  103.     movdqa  m%9, m%2
  104.     psraw   m%9, 1
  105.     paddw   m%9, m%2
  106.     paddw   m%9, m%4
  107.     paddw   m%9, m%6 ; %9=a7
  108.     movdqa  m%10, m%6
  109.     psraw   m%10, 1
  110.     paddw   m%10, m%6
  111.     paddw   m%10, m%8
  112.     psubw   m%10, m%2 ; %10=a5
  113.     psubw   m%2, m%4
  114.     psubw   m%6, m%4
  115.     paddw   m%2, m%8
  116.     psubw   m%6, m%8
  117.     psraw   m%4, 1
  118.     psraw   m%8, 1
  119.     psubw   m%2, m%4 ; %2=a3
  120.     psubw   m%6, m%8 ; %6=a1
  121.     SUMSUB_BA m%7, m%5 ; %7=b0, %5=b6
  122.     SUMSUB_BA m%3, m%1 ; %3=b2, %1=b4
  123.     movdqa  m%4, m%9
  124.     psraw   m%4, 2
  125.     paddw   m%4, m%6 ; %4=b1
  126.     psraw   m%6, 2
  127.     psubw   m%9, m%6 ; %9=b7
  128.     movdqa  m%8, m%10
  129.     psraw   m%8, 2
  130.     paddw   m%8, m%2 ; %8=b3
  131.     psraw   m%2, 2
  132.     psubw   m%2, m%10 ; %2=b5
  133.     SUMSUB_BA m%9, m%7 ; %9=c0, %7=c7
  134.     SUMSUB_BA m%2, m%3 ; %2=c1, %3=c6
  135.     SUMSUB_BA m%8, m%1 ; %8=c2, %1=c5
  136.     SUMSUB_BA m%4, m%5 ; %4=c3, %5=c4
  137.     SWAP %1, %9, %6
  138.     SWAP %3, %8, %7
  139. %endmacro
  140. ;-----------------------------------------------------------------------------
  141. ; void x264_add8x8_idct8_sse2( uint8_t *p_dst, int16_t dct[8][8] )
  142. ;-----------------------------------------------------------------------------
  143. cglobal x264_add8x8_idct8_sse2
  144.     movdqa  m0, [r1+0x00]
  145.     movdqa  m1, [r1+0x10]
  146.     movdqa  m2, [r1+0x20]
  147.     movdqa  m3, [r1+0x30]
  148.     movdqa  m4, [r1+0x40]
  149.     movdqa  m5, [r1+0x50]
  150.     movdqa  m6, [r1+0x60]
  151.     movdqa  m7, [r1+0x70]
  152.     IDCT8_1D      0,1,2,3,4,5,6,7,8,9
  153.     TRANSPOSE8x8W 0,1,2,3,4,5,6,7,8
  154.     paddw         m0, [pw_32 GLOBAL] ; rounding for the >>6 at the end
  155.     IDCT8_1D      0,1,2,3,4,5,6,7,8,9
  156.     pxor  m9, m9
  157.     STORE_DIFF m0, m8, m9, [r0+0*FDEC_STRIDE]
  158.     STORE_DIFF m1, m8, m9, [r0+1*FDEC_STRIDE]
  159.     STORE_DIFF m2, m8, m9, [r0+2*FDEC_STRIDE]
  160.     STORE_DIFF m3, m8, m9, [r0+3*FDEC_STRIDE]
  161.     STORE_DIFF m4, m8, m9, [r0+4*FDEC_STRIDE]
  162.     STORE_DIFF m5, m8, m9, [r0+5*FDEC_STRIDE]
  163.     STORE_DIFF m6, m8, m9, [r0+6*FDEC_STRIDE]
  164.     STORE_DIFF m7, m8, m9, [r0+7*FDEC_STRIDE]
  165.     ret