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

Audio

开发平台:

Visual C++

  1. ;*****************************************************************************
  2. ;* quant-a.asm: h264 encoder library
  3. ;*****************************************************************************
  4. ;* Copyright (C) 2005-2008 x264 project
  5. ;*
  6. ;* Authors: Loren Merritt <lorenm@u.washington.edu>
  7. ;*          Christian Heine <sennindemokrit@gmx.net>
  8. ;*
  9. ;* This program is free software; you can redistribute it and/or modify
  10. ;* it under the terms of the GNU General Public License as published by
  11. ;* the Free Software Foundation; either version 2 of the License, or
  12. ;* (at your option) any later version.
  13. ;*
  14. ;* This program is distributed in the hope that it will be useful,
  15. ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17. ;* GNU General Public License for more details.
  18. ;*
  19. ;* You should have received a copy of the GNU General Public License
  20. ;* along with this program; if not, write to the Free Software
  21. ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
  22. ;*****************************************************************************
  23. %include "x86inc.asm"
  24. SECTION_RODATA
  25. pw_1:     times 8 dw 1
  26. pd_1:     times 4 dd 1
  27. %macro DQM4 3
  28.     dw %1, %2, %1, %2, %2, %3, %2, %3
  29. %endmacro
  30. %macro DQM8 6
  31.     dw %1, %4, %5, %4, %1, %4, %5, %4
  32.     dw %4, %2, %6, %2, %4, %2, %6, %2
  33.     dw %5, %6, %3, %6, %5, %6, %3, %6
  34.     ; last line not used, just padding for power-of-2 stride
  35.     times 8 dw 0
  36. %endmacro
  37. dequant4_scale:
  38.     DQM4 10, 13, 16
  39.     DQM4 11, 14, 18
  40.     DQM4 13, 16, 20
  41.     DQM4 14, 18, 23
  42.     DQM4 16, 20, 25
  43.     DQM4 18, 23, 29
  44. dequant8_scale:
  45.     DQM8 20, 18, 32, 19, 25, 24
  46.     DQM8 22, 19, 35, 21, 28, 26
  47.     DQM8 26, 23, 42, 24, 33, 31
  48.     DQM8 28, 25, 45, 26, 35, 33
  49.     DQM8 32, 28, 51, 30, 40, 38
  50.     DQM8 36, 32, 58, 34, 46, 43
  51. SECTION .text
  52. %macro QUANT_DC_START 0
  53.     movd       m6, r1m     ; mf
  54.     movd       m7, r2m     ; bias
  55. %ifidn m0, mm0
  56.     pshufw     m6, m6, 0
  57.     pshufw     m7, m7, 0
  58. %else
  59.     pshuflw    m6, m6, 0
  60.     pshuflw    m7, m7, 0
  61.     punpcklqdq m6, m6
  62.     punpcklqdq m7, m7
  63. %endif
  64. %endmacro
  65. %macro PABSW_MMX 2
  66.     pxor       %1, %1
  67.     pcmpgtw    %1, %2
  68.     pxor       %2, %1
  69.     psubw      %2, %1
  70.     SWAP       %1, %2
  71. %endmacro
  72. %macro PSIGNW_MMX 2
  73.     pxor       %1, %2
  74.     psubw      %1, %2
  75. %endmacro
  76. %macro PABSW_SSSE3 2
  77.     pabsw      %1, %2
  78. %endmacro
  79. %macro PSIGNW_SSSE3 2
  80.     psignw     %1, %2
  81. %endmacro
  82. %macro QUANT_ONE 3
  83. ;;; %1      (m64)       dct[y][x]
  84. ;;; %2      (m64/mmx)   mf[y][x] or mf[0][0] (as uint16_t)
  85. ;;; %3      (m64/mmx)   bias[y][x] or bias[0][0] (as uint16_t)
  86.     mova       m1, %1   ; load dct coeffs
  87.     PABSW      m0, m1
  88.     paddusw    m0, %3   ; round
  89.     pmulhuw    m0, %2   ; divide
  90.     PSIGNW     m0, m1   ; restore sign
  91.     mova       %1, m0   ; store
  92. %endmacro
  93. ;-----------------------------------------------------------------------------
  94. ; void x264_quant_4x4_dc_mmxext( int16_t dct[16], int mf, int bias )
  95. ;-----------------------------------------------------------------------------
  96. %macro QUANT_DC 2
  97. cglobal %1, 1,1
  98.     QUANT_DC_START
  99. %assign x 0
  100. %rep %2
  101.     QUANT_ONE [r0+x], m6, m7
  102. %assign x x+mmsize
  103. %endrep
  104.     RET
  105. %endmacro
  106. ;-----------------------------------------------------------------------------
  107. ; void x264_quant_4x4_mmx( int16_t dct[16], uint16_t mf[16], uint16_t bias[16] )
  108. ;-----------------------------------------------------------------------------
  109. %macro QUANT_AC 2
  110. cglobal %1, 3,3
  111. %assign x 0
  112. %rep %2
  113.     QUANT_ONE [r0+x], [r1+x], [r2+x]
  114. %assign x x+mmsize
  115. %endrep
  116.     RET
  117. %endmacro
  118. INIT_MMX
  119. %define PABSW PABSW_MMX
  120. %define PSIGNW PSIGNW_MMX
  121. QUANT_DC x264_quant_2x2_dc_mmxext, 1
  122. %ifndef ARCH_X86_64 ; not needed because sse2 is faster
  123. QUANT_DC x264_quant_4x4_dc_mmxext, 4
  124. QUANT_AC x264_quant_4x4_mmx, 4
  125. QUANT_AC x264_quant_8x8_mmx, 16
  126. %endif
  127. INIT_XMM
  128. QUANT_DC x264_quant_4x4_dc_sse2, 2
  129. QUANT_AC x264_quant_4x4_sse2, 2
  130. QUANT_AC x264_quant_8x8_sse2, 8
  131. %define PABSW PABSW_SSSE3
  132. %define PSIGNW PSIGNW_SSSE3
  133. QUANT_DC x264_quant_4x4_dc_ssse3, 2
  134. QUANT_AC x264_quant_4x4_ssse3, 2
  135. QUANT_AC x264_quant_8x8_ssse3, 8
  136. INIT_MMX
  137. QUANT_DC x264_quant_2x2_dc_ssse3, 1
  138. ;=============================================================================
  139. ; dequant
  140. ;=============================================================================
  141. %macro DEQUANT16_L 3
  142. ;;; %1      dct[y][x]
  143. ;;; %2,%3   dequant_mf[i_mf][y][x]
  144. ;;; m5      i_qbits
  145.     mova     m0, %2
  146.     packssdw m0, %3
  147.     pmullw   m0, %1
  148.     psllw    m0, m5
  149.     mova     %1, m0
  150. %endmacro
  151. %macro DEQUANT32_R 3
  152. ;;; %1      dct[y][x]
  153. ;;; %2,%3   dequant_mf[i_mf][y][x]
  154. ;;; m5      -i_qbits
  155. ;;; m6      f
  156. ;;; m7      0
  157.     mova      m0, %1
  158.     mova      m1, m0
  159.     punpcklwd m0, m7
  160.     punpckhwd m1, m7
  161.     pmaddwd   m0, %2
  162.     pmaddwd   m1, %3
  163.     paddd     m0, m6
  164.     paddd     m1, m6
  165.     psrad     m0, m5
  166.     psrad     m1, m5
  167.     packssdw  m0, m1
  168.     mova      %1, m0
  169. %endmacro
  170. %macro DEQUANT_LOOP 3
  171. %if 8*(%2-2*%3)
  172.     mov t0d, 8*(%2-2*%3)
  173. %%loop:
  174.     %1 [r0+t0+8*%3], [r1+t0*2+16*%3], [r1+t0*2+24*%3]
  175.     %1 [r0+t0     ], [r1+t0*2      ], [r1+t0*2+ 8*%3]
  176.     sub t0d, 16*%3
  177.     jge %%loop
  178.     rep ret
  179. %else
  180.     %1 [r0+8*%3], [r1+16*%3], [r1+24*%3]
  181.     %1 [r0     ], [r1      ], [r1+ 8*%3]
  182.     ret
  183. %endif
  184. %endmacro
  185. %macro DEQUANT16_FLAT 2-8
  186.     mova   m0, %1
  187. %assign i %0-2
  188. %rep %0-1
  189. %if i
  190.     mova   m %+ i, [r0+%2]
  191.     pmullw m %+ i, m0
  192. %else
  193.     pmullw m0, [r0+%2]
  194. %endif
  195.     psllw  m %+ i, m7
  196.     mova   [r0+%2], m %+ i
  197.     %assign i i-1
  198.     %rotate 1
  199. %endrep
  200. %endmacro
  201. %ifdef ARCH_X86_64
  202.     %define t0  r4
  203.     %define t0d r4d
  204.     %define t1  r3
  205.     %define t1d r3d
  206.     %define t2  r2
  207.     %define t2d r2d
  208. %else
  209.     %define t0  r2
  210.     %define t0d r2d
  211.     %define t1  r0
  212.     %define t1d r0d
  213.     %define t2  r1
  214.     %define t2d r1d
  215. %endif
  216. ;-----------------------------------------------------------------------------
  217. ; void x264_dequant_4x4_mmx( int16_t dct[4][4], int dequant_mf[6][4][4], int i_qp )
  218. ;-----------------------------------------------------------------------------
  219. %macro DEQUANT 4
  220. cglobal x264_dequant_%2x%2_%1, 0,3
  221.     movifnidn t2d, r2m
  222.     imul t0d, t2d, 0x2b
  223.     shr  t0d, 8     ; i_qbits = i_qp / 6
  224.     lea  t1, [t0*3]
  225.     sub  t2d, t1d
  226.     sub  t2d, t1d   ; i_mf = i_qp % 6
  227.     shl  t2d, %3+2
  228. %ifdef ARCH_X86_64
  229.     add  r1, t2     ; dequant_mf[i_mf]
  230. %else
  231.     add  r1, r1m    ; dequant_mf[i_mf]
  232.     mov  r0, r0m    ; dct
  233. %endif
  234.     sub  t0d, %3
  235.     jl   .rshift32  ; negative qbits => rightshift
  236. .lshift:
  237.     movd m5, t0d
  238.     DEQUANT_LOOP DEQUANT16_L, %2*%2/4, %4
  239. .rshift32:
  240.     neg   t0d
  241.     movd  m5, t0d
  242.     mova  m6, [pd_1 GLOBAL]
  243.     pxor  m7, m7
  244.     pslld m6, m5
  245.     psrld m6, 1
  246.     DEQUANT_LOOP DEQUANT32_R, %2*%2/4, %4
  247. cglobal x264_dequant_%2x%2_flat16_%1, 0,3
  248.     movifnidn t2d, r2m
  249. %if %2 == 8
  250.     cmp  t2d, 12
  251.     jl x264_dequant_%2x%2_%1
  252.     sub  t2d, 12
  253. %endif
  254.     imul t0d, t2d, 0x2b
  255.     shr  t0d, 8     ; i_qbits = i_qp / 6
  256.     lea  t1, [t0*3]
  257.     sub  t2d, t1d
  258.     sub  t2d, t1d   ; i_mf = i_qp % 6
  259.     shl  t2d, %3
  260. %ifdef PIC
  261.     lea  r1, [dequant%2_scale GLOBAL]
  262.     add  r1, t2
  263. %else
  264.     lea  r1, [dequant%2_scale + t2 GLOBAL]
  265. %endif
  266.     movifnidn r0d, r0m
  267.     movd m7, t0d
  268. %if %2 == 4
  269. %ifidn %1, mmx
  270.     DEQUANT16_FLAT [r1], 0, 16
  271.     DEQUANT16_FLAT [r1+8], 8, 24
  272. %else
  273.     DEQUANT16_FLAT [r1], 0, 16
  274. %endif
  275. %elifidn %1, mmx
  276.     DEQUANT16_FLAT [r1], 0, 8, 64, 72
  277.     DEQUANT16_FLAT [r1+16], 16, 24, 48, 56
  278.     DEQUANT16_FLAT [r1+16], 80, 88, 112, 120
  279.     DEQUANT16_FLAT [r1+32], 32, 40, 96, 104
  280. %else
  281.     DEQUANT16_FLAT [r1], 0, 64
  282.     DEQUANT16_FLAT [r1+16], 16, 48, 80, 112
  283.     DEQUANT16_FLAT [r1+32], 32, 96
  284. %endif
  285.     ret
  286. %endmacro ; DEQUANT
  287. %ifndef ARCH_X86_64
  288. INIT_MMX
  289. DEQUANT mmx, 4, 4, 1
  290. DEQUANT mmx, 8, 6, 1
  291. %endif
  292. INIT_XMM
  293. DEQUANT sse2, 4, 4, 2
  294. DEQUANT sse2, 8, 6, 2
  295. ;-----------------------------------------------------------------------------
  296. ; void x264_denoise_dct_mmx( int16_t *dct, uint32_t *sum, uint16_t *offset, int size )
  297. ;-----------------------------------------------------------------------------
  298. %macro DENOISE_DCT 1
  299. cglobal x264_denoise_dct_%1, 4,5
  300.     movzx     r4d, word [r0] ; backup DC coefficient
  301.     pxor      m7, m7
  302. .loop:
  303.     sub       r3, mmsize
  304.     mova      m2, [r0+r3*2+0*mmsize]
  305.     mova      m3, [r0+r3*2+1*mmsize]
  306.     PABSW     m0, m2
  307.     PABSW     m1, m3
  308.     mova      m4, m0
  309.     mova      m5, m1
  310.     psubusw   m0, [r2+r3*2+0*mmsize]
  311.     psubusw   m1, [r2+r3*2+1*mmsize]
  312.     PSIGNW    m0, m2
  313.     PSIGNW    m1, m3
  314.     mova      [r0+r3*2+0*mmsize], m0
  315.     mova      [r0+r3*2+1*mmsize], m1
  316.     mova      m2, m4
  317.     mova      m3, m5
  318.     punpcklwd m4, m7
  319.     punpckhwd m2, m7
  320.     punpcklwd m5, m7
  321.     punpckhwd m3, m7
  322.     paddd     m4, [r1+r3*4+0*mmsize]
  323.     paddd     m2, [r1+r3*4+1*mmsize]
  324.     paddd     m5, [r1+r3*4+2*mmsize]
  325.     paddd     m3, [r1+r3*4+3*mmsize]
  326.     mova      [r1+r3*4+0*mmsize], m4
  327.     mova      [r1+r3*4+1*mmsize], m2
  328.     mova      [r1+r3*4+2*mmsize], m5
  329.     mova      [r1+r3*4+3*mmsize], m3
  330.     jg .loop
  331.     mov       [r0], r4w ; restore DC coefficient
  332.     RET
  333. %endmacro
  334. %define PABSW PABSW_MMX
  335. %define PSIGNW PSIGNW_MMX
  336. %ifndef ARCH_X86_64
  337. INIT_MMX
  338. DENOISE_DCT mmx
  339. %endif
  340. INIT_XMM
  341. DENOISE_DCT sse2
  342. %define PABSW PABSW_SSSE3
  343. %define PSIGNW PSIGNW_SSSE3
  344. DENOISE_DCT ssse3