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

流媒体/Mpeg4/MP4

开发平台:

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. ;*          Jason Garrett-Glaser <darkshikari@gmail.com>
  8. ;*          Christian Heine <sennindemokrit@gmx.net>
  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. pb_1:     times 16 db 1
  28. pw_1:     times 8 dw 1
  29. pd_1:     times 4 dd 1
  30. pb_01:    times 8 db 0, 1
  31. %macro DQM4 3
  32.     dw %1, %2, %1, %2, %2, %3, %2, %3
  33. %endmacro
  34. %macro DQM8 6
  35.     dw %1, %4, %5, %4, %1, %4, %5, %4
  36.     dw %4, %2, %6, %2, %4, %2, %6, %2
  37.     dw %5, %6, %3, %6, %5, %6, %3, %6
  38.     ; last line not used, just padding for power-of-2 stride
  39.     times 8 dw 0
  40. %endmacro
  41. dequant4_scale:
  42.     DQM4 10, 13, 16
  43.     DQM4 11, 14, 18
  44.     DQM4 13, 16, 20
  45.     DQM4 14, 18, 23
  46.     DQM4 16, 20, 25
  47.     DQM4 18, 23, 29
  48. dequant8_scale:
  49.     DQM8 20, 18, 32, 19, 25, 24
  50.     DQM8 22, 19, 35, 21, 28, 26
  51.     DQM8 26, 23, 42, 24, 33, 31
  52.     DQM8 28, 25, 45, 26, 35, 33
  53.     DQM8 32, 28, 51, 30, 40, 38
  54.     DQM8 36, 32, 58, 34, 46, 43
  55. decimate_mask_table4:
  56.     db  0,3,2,6,2,5,5,9,1,5,4,8,5,8,8,12,1,4,4,8,4,7,7,11,4,8,7,11,8,11,11,15,1,4
  57.     db  3,7,4,7,7,11,3,7,6,10,7,10,10,14,4,7,7,11,7,10,10,14,7,11,10,14,11,14,14
  58.     db 18,0,4,3,7,3,6,6,10,3,7,6,10,7,10,10,14,3,6,6,10,6,9,9,13,6,10,9,13,10,13
  59.     db 13,17,4,7,6,10,7,10,10,14,6,10,9,13,10,13,13,17,7,10,10,14,10,13,13,17,10
  60.     db 14,13,17,14,17,17,21,0,3,3,7,3,6,6,10,2,6,5,9,6,9,9,13,3,6,6,10,6,9,9,13
  61.     db  6,10,9,13,10,13,13,17,3,6,5,9,6,9,9,13,5,9,8,12,9,12,12,16,6,9,9,13,9,12
  62.     db 12,16,9,13,12,16,13,16,16,20,3,7,6,10,6,9,9,13,6,10,9,13,10,13,13,17,6,9
  63.     db  9,13,9,12,12,16,9,13,12,16,13,16,16,20,7,10,9,13,10,13,13,17,9,13,12,16
  64.     db 13,16,16,20,10,13,13,17,13,16,16,20,13,17,16,20,17,20,20,24
  65. SECTION .text
  66. %macro QUANT_DC_START_MMX 0
  67.     movd       m6, r1m     ; mf
  68.     movd       m7, r2m     ; bias
  69. %ifidn m0, mm0
  70.     pshufw     m6, m6, 0
  71.     pshufw     m7, m7, 0
  72. %else
  73.     pshuflw    m6, m6, 0
  74.     pshuflw    m7, m7, 0
  75.     punpcklqdq m6, m6
  76.     punpcklqdq m7, m7
  77. %endif
  78. %endmacro
  79. %macro QUANT_DC_START_SSSE3 0
  80.     movdqa     m5, [pb_01 GLOBAL]
  81.     movd       m6, r1m     ; mf
  82.     movd       m7, r2m     ; bias
  83.     pshufb     m6, m5
  84.     pshufb     m7, m5
  85. %endmacro
  86. %macro PABSW_MMX 2
  87.     pxor       %1, %1
  88.     pcmpgtw    %1, %2
  89.     pxor       %2, %1
  90.     psubw      %2, %1
  91.     SWAP       %1, %2
  92. %endmacro
  93. %macro PSIGNW_MMX 2
  94.     pxor       %1, %2
  95.     psubw      %1, %2
  96. %endmacro
  97. %macro PABSW_SSSE3 2
  98.     pabsw      %1, %2
  99. %endmacro
  100. %macro PSIGNW_SSSE3 2
  101.     psignw     %1, %2
  102. %endmacro
  103. %macro QUANT_ONE 4
  104. ;;; %1      (m64)       dct[y][x]
  105. ;;; %2      (m64/mmx)   mf[y][x] or mf[0][0] (as uint16_t)
  106. ;;; %3      (m64/mmx)   bias[y][x] or bias[0][0] (as uint16_t)
  107.     mova       m1, %1   ; load dct coeffs
  108.     PABSW      m0, m1
  109.     paddusw    m0, %3   ; round
  110.     pmulhuw    m0, %2   ; divide
  111.     PSIGNW     m0, m1   ; restore sign
  112.     mova       %1, m0   ; store
  113. %if %4
  114.     por        m5, m0
  115. %else
  116.     SWAP       m5, m0
  117. %endif
  118. %endmacro
  119. %macro QUANT_TWO 7
  120.     mova       m1, %1
  121.     mova       m3, %2
  122.     PABSW      m0, m1
  123.     PABSW      m2, m3
  124.     paddusw    m0, %5
  125.     paddusw    m2, %6
  126.     pmulhuw    m0, %3
  127.     pmulhuw    m2, %4
  128.     PSIGNW     m0, m1
  129.     PSIGNW     m2, m3
  130.     mova       %1, m0
  131.     mova       %2, m2
  132. %if %7
  133.     por        m5, m0
  134.     por        m5, m2
  135. %else
  136.     SWAP       m5, m0
  137.     por        m5, m2
  138. %endif
  139. %endmacro
  140. %macro QUANT_END_MMX 0
  141.     xor      eax, eax
  142. %ifndef ARCH_X86_64
  143. %if mmsize==8
  144.     packsswb  m5, m5
  145.     movd     ecx, m5
  146.     test     ecx, ecx
  147. %else
  148.     pxor      m4, m4
  149.     pcmpeqb   m5, m4
  150.     pmovmskb ecx, m5
  151.     cmp      ecx, (1<<mmsize)-1
  152. %endif
  153. %else
  154. %if mmsize==16
  155.     packsswb  m5, m5
  156. %endif
  157.     movq     rcx, m5
  158.     test     rcx, rcx
  159. %endif
  160.     setne     al
  161. %endmacro
  162. %macro QUANT_END_SSE4 0
  163.     xor      eax, eax
  164.     ptest     m5, m5
  165.     setne     al
  166. %endmacro
  167. ;-----------------------------------------------------------------------------
  168. ; void x264_quant_4x4_dc_mmxext( int16_t dct[16], int mf, int bias )
  169. ;-----------------------------------------------------------------------------
  170. %macro QUANT_DC 2-3 0
  171. cglobal %1, 1,1,%3
  172.     QUANT_DC_START
  173. %if %2==1
  174.     QUANT_ONE [r0], m6, m7, 0
  175. %else
  176. %assign x 0
  177. %rep %2/2
  178.     QUANT_TWO [r0+x], [r0+x+mmsize], m6, m6, m7, m7, x
  179. %assign x x+mmsize*2
  180. %endrep
  181. %endif
  182.     QUANT_END
  183.     RET
  184. %endmacro
  185. ;-----------------------------------------------------------------------------
  186. ; int x264_quant_4x4_mmx( int16_t dct[16], uint16_t mf[16], uint16_t bias[16] )
  187. ;-----------------------------------------------------------------------------
  188. %macro QUANT_AC 2
  189. cglobal %1, 3,3
  190. %assign x 0
  191. %rep %2/2
  192.     QUANT_TWO [r0+x], [r0+x+mmsize], [r1+x], [r1+x+mmsize], [r2+x], [r2+x+mmsize], x
  193. %assign x x+mmsize*2
  194. %endrep
  195.     QUANT_END
  196.     RET
  197. %endmacro
  198. INIT_MMX
  199. %define QUANT_END QUANT_END_MMX
  200. %define PABSW PABSW_MMX
  201. %define PSIGNW PSIGNW_MMX
  202. %define QUANT_DC_START QUANT_DC_START_MMX
  203. QUANT_DC x264_quant_2x2_dc_mmxext, 1
  204. %ifndef ARCH_X86_64 ; not needed because sse2 is faster
  205. QUANT_DC x264_quant_4x4_dc_mmxext, 4
  206. QUANT_AC x264_quant_4x4_mmx, 4
  207. QUANT_AC x264_quant_8x8_mmx, 16
  208. %endif
  209. INIT_XMM
  210. QUANT_DC x264_quant_4x4_dc_sse2, 2, 8
  211. QUANT_AC x264_quant_4x4_sse2, 2
  212. QUANT_AC x264_quant_8x8_sse2, 8
  213. %define PABSW PABSW_SSSE3
  214. %define PSIGNW PSIGNW_SSSE3
  215. QUANT_DC x264_quant_4x4_dc_ssse3, 2, 8
  216. QUANT_AC x264_quant_4x4_ssse3, 2
  217. QUANT_AC x264_quant_8x8_ssse3, 8
  218. INIT_MMX
  219. QUANT_DC x264_quant_2x2_dc_ssse3, 1
  220. %define QUANT_END QUANT_END_SSE4
  221. ;Not faster on Conroe, so only used in SSE4 versions
  222. %define QUANT_DC_START QUANT_DC_START_SSSE3
  223. INIT_XMM
  224. QUANT_DC x264_quant_4x4_dc_sse4, 2, 8
  225. QUANT_AC x264_quant_4x4_sse4, 2
  226. QUANT_AC x264_quant_8x8_sse4, 8
  227. ;=============================================================================
  228. ; dequant
  229. ;=============================================================================
  230. %macro DEQUANT16_L 3
  231. ;;; %1      dct[y][x]
  232. ;;; %2,%3   dequant_mf[i_mf][y][x]
  233. ;;; m2      i_qbits
  234.     mova     m0, %2
  235.     packssdw m0, %3
  236.     pmullw   m0, %1
  237.     psllw    m0, m2
  238.     mova     %1, m0
  239. %endmacro
  240. %macro DEQUANT32_R 3
  241. ;;; %1      dct[y][x]
  242. ;;; %2,%3   dequant_mf[i_mf][y][x]
  243. ;;; m2      -i_qbits
  244. ;;; m3      f
  245. ;;; m4      0
  246.     mova      m0, %1
  247.     mova      m1, m0
  248.     punpcklwd m0, m4
  249.     punpckhwd m1, m4
  250.     pmaddwd   m0, %2
  251.     pmaddwd   m1, %3
  252.     paddd     m0, m3
  253.     paddd     m1, m3
  254.     psrad     m0, m2
  255.     psrad     m1, m2
  256.     packssdw  m0, m1
  257.     mova      %1, m0
  258. %endmacro
  259. %macro DEQUANT_LOOP 3
  260. %if 8*(%2-2*%3)
  261.     mov t0d, 8*(%2-2*%3)
  262. %%loop:
  263.     %1 [r0+t0+8*%3], [r1+t0*2+16*%3], [r1+t0*2+24*%3]
  264.     %1 [r0+t0     ], [r1+t0*2      ], [r1+t0*2+ 8*%3]
  265.     sub t0d, 16*%3
  266.     jge %%loop
  267.     REP_RET
  268. %else
  269.     %1 [r0+8*%3], [r1+16*%3], [r1+24*%3]
  270.     %1 [r0     ], [r1      ], [r1+ 8*%3]
  271.     RET
  272. %endif
  273. %endmacro
  274. %macro DEQUANT16_FLAT 2-5
  275.     mova   m0, %1
  276.     psllw  m0, m4
  277. %assign i %0-2
  278. %rep %0-1
  279. %if i
  280.     mova   m %+ i, [r0+%2]
  281.     pmullw m %+ i, m0
  282. %else
  283.     pmullw m0, [r0+%2]
  284. %endif
  285.     mova   [r0+%2], m %+ i
  286.     %assign i i-1
  287.     %rotate 1
  288. %endrep
  289. %endmacro
  290. %ifdef WIN64
  291.     DECLARE_REG_TMP 6,3,2
  292. %elifdef ARCH_X86_64
  293.     DECLARE_REG_TMP 4,3,2
  294. %else
  295.     DECLARE_REG_TMP 2,0,1
  296. %endif
  297. %macro DEQUANT_START 2
  298.     movifnidn t2d, r2m
  299.     imul t0d, t2d, 0x2b
  300.     shr  t0d, 8     ; i_qbits = i_qp / 6
  301.     lea  t1, [t0*3]
  302.     sub  t2d, t1d
  303.     sub  t2d, t1d   ; i_mf = i_qp % 6
  304.     shl  t2d, %1
  305. %ifdef ARCH_X86_64
  306.     add  r1, t2     ; dequant_mf[i_mf]
  307. %else
  308.     add  r1, r1mp   ; dequant_mf[i_mf]
  309.     mov  r0, r0mp   ; dct
  310. %endif
  311.     sub  t0d, %2
  312.     jl   .rshift32  ; negative qbits => rightshift
  313. %endmacro
  314. ;-----------------------------------------------------------------------------
  315. ; void x264_dequant_4x4_mmx( int16_t dct[4][4], int dequant_mf[6][4][4], int i_qp )
  316. ;-----------------------------------------------------------------------------
  317. %macro DEQUANT 4
  318. cglobal x264_dequant_%2x%2_%1, 0,3
  319. .skip_prologue:
  320.     DEQUANT_START %3+2, %3
  321. .lshift:
  322.     movd m2, t0d
  323.     DEQUANT_LOOP DEQUANT16_L, %2*%2/4, %4
  324. .rshift32:
  325.     neg   t0d
  326.     movd  m2, t0d
  327.     mova  m3, [pd_1 GLOBAL]
  328.     pxor  m4, m4
  329.     pslld m3, m2
  330.     psrld m3, 1
  331.     DEQUANT_LOOP DEQUANT32_R, %2*%2/4, %4
  332. cglobal x264_dequant_%2x%2_flat16_%1, 0,3
  333.     movifnidn t2d, r2m
  334. %if %2 == 8
  335.     cmp  t2d, 12
  336.     jl x264_dequant_%2x%2_%1.skip_prologue
  337.     sub  t2d, 12
  338. %endif
  339.     imul t0d, t2d, 0x2b
  340.     shr  t0d, 8     ; i_qbits = i_qp / 6
  341.     lea  t1, [t0*3]
  342.     sub  t2d, t1d
  343.     sub  t2d, t1d   ; i_mf = i_qp % 6
  344.     shl  t2d, %3
  345. %ifdef PIC
  346.     lea  r1, [dequant%2_scale GLOBAL]
  347.     add  r1, t2
  348. %else
  349.     lea  r1, [dequant%2_scale + t2 GLOBAL]
  350. %endif
  351.     movifnidn r0, r0mp
  352.     movd m4, t0d
  353. %if %2 == 4
  354. %ifidn %1, mmx
  355.     DEQUANT16_FLAT [r1], 0, 16
  356.     DEQUANT16_FLAT [r1+8], 8, 24
  357. %else
  358.     DEQUANT16_FLAT [r1], 0, 16
  359. %endif
  360. %elifidn %1, mmx
  361.     DEQUANT16_FLAT [r1], 0, 8, 64, 72
  362.     DEQUANT16_FLAT [r1+16], 16, 24, 48, 56
  363.     DEQUANT16_FLAT [r1+16], 80, 88, 112, 120
  364.     DEQUANT16_FLAT [r1+32], 32, 40, 96, 104
  365. %else
  366.     DEQUANT16_FLAT [r1], 0, 64
  367.     DEQUANT16_FLAT [r1+16], 16, 48, 80, 112
  368.     DEQUANT16_FLAT [r1+32], 32, 96
  369. %endif
  370.     RET
  371. %endmacro ; DEQUANT
  372. %ifndef ARCH_X86_64
  373. INIT_MMX
  374. DEQUANT mmx, 4, 4, 1
  375. DEQUANT mmx, 8, 6, 1
  376. %endif
  377. INIT_XMM
  378. DEQUANT sse2, 4, 4, 2
  379. DEQUANT sse2, 8, 6, 2
  380. %macro DEQUANT_DC 1
  381. cglobal x264_dequant_4x4dc_%1, 0,3
  382.     DEQUANT_START 6, 6
  383. .lshift:
  384.     movd   m3, [r1]
  385.     movd   m2, t0d
  386.     pslld  m3, m2
  387. %if mmsize==16
  388.     pshuflw  m3, m3, 0
  389.     punpcklqdq m3, m3
  390. %else
  391.     pshufw   m3, m3, 0
  392. %endif
  393. %assign x 0
  394. %rep 16/mmsize
  395.     mova     m0, [r0+mmsize*0+x]
  396.     mova     m1, [r0+mmsize*1+x]
  397.     pmullw   m0, m3
  398.     pmullw   m1, m3
  399.     mova     [r0+mmsize*0+x], m0
  400.     mova     [r0+mmsize*1+x], m1
  401. %assign x x+mmsize*2
  402. %endrep
  403.     RET
  404. .rshift32:
  405.     neg   t0d
  406.     movd  m3, t0d
  407.     mova  m4, [pw_1 GLOBAL]
  408.     mova  m5, m4
  409.     pslld m4, m3
  410.     psrld m4, 1
  411.     movd  m2, [r1]
  412. %if mmsize==8
  413.     punpcklwd m2, m2
  414. %else
  415.     pshuflw m2, m2, 0
  416. %endif
  417.     punpcklwd m2, m4
  418. %assign x 0
  419. %rep 32/mmsize
  420.     mova      m0, [r0+x]
  421.     mova      m1, m0
  422.     punpcklwd m0, m5
  423.     punpckhwd m1, m5
  424.     pmaddwd   m0, m2
  425.     pmaddwd   m1, m2
  426.     psrad     m0, m3
  427.     psrad     m1, m3
  428.     packssdw  m0, m1
  429.     mova      [r0+x], m0
  430. %assign x x+mmsize
  431. %endrep
  432.     RET
  433. %endmacro
  434. INIT_MMX
  435. DEQUANT_DC mmxext
  436. INIT_XMM
  437. DEQUANT_DC sse2
  438. ;-----------------------------------------------------------------------------
  439. ; void x264_denoise_dct_mmx( int16_t *dct, uint32_t *sum, uint16_t *offset, int size )
  440. ;-----------------------------------------------------------------------------
  441. %macro DENOISE_DCT 1-2 0
  442. cglobal x264_denoise_dct_%1, 4,5,%2
  443.     movzx     r4d, word [r0] ; backup DC coefficient
  444.     pxor      m6, m6
  445. .loop:
  446.     sub       r3, mmsize
  447.     mova      m2, [r0+r3*2+0*mmsize]
  448.     mova      m3, [r0+r3*2+1*mmsize]
  449.     PABSW     m0, m2
  450.     PABSW     m1, m3
  451.     mova      m4, m0
  452.     mova      m5, m1
  453.     psubusw   m0, [r2+r3*2+0*mmsize]
  454.     psubusw   m1, [r2+r3*2+1*mmsize]
  455.     PSIGNW    m0, m2
  456.     PSIGNW    m1, m3
  457.     mova      [r0+r3*2+0*mmsize], m0
  458.     mova      [r0+r3*2+1*mmsize], m1
  459.     mova      m2, m4
  460.     mova      m3, m5
  461.     punpcklwd m4, m6
  462.     punpckhwd m2, m6
  463.     punpcklwd m5, m6
  464.     punpckhwd m3, m6
  465.     paddd     m4, [r1+r3*4+0*mmsize]
  466.     paddd     m2, [r1+r3*4+1*mmsize]
  467.     paddd     m5, [r1+r3*4+2*mmsize]
  468.     paddd     m3, [r1+r3*4+3*mmsize]
  469.     mova      [r1+r3*4+0*mmsize], m4
  470.     mova      [r1+r3*4+1*mmsize], m2
  471.     mova      [r1+r3*4+2*mmsize], m5
  472.     mova      [r1+r3*4+3*mmsize], m3
  473.     jg .loop
  474.     mov       [r0], r4w ; restore DC coefficient
  475.     RET
  476. %endmacro
  477. %define PABSW PABSW_MMX
  478. %define PSIGNW PSIGNW_MMX
  479. %ifndef ARCH_X86_64
  480. INIT_MMX
  481. DENOISE_DCT mmx
  482. %endif
  483. INIT_XMM
  484. DENOISE_DCT sse2, 7
  485. %define PABSW PABSW_SSSE3
  486. %define PSIGNW PSIGNW_SSSE3
  487. DENOISE_DCT ssse3, 7
  488. ;-----------------------------------------------------------------------------
  489. ; int x264_decimate_score( int16_t *dct )
  490. ;-----------------------------------------------------------------------------
  491. %macro DECIMATE_MASK_SSE2 6
  492. %ifidn %5, ssse3
  493.     pabsw    xmm0, [%3+ 0]
  494.     pabsw    xmm1, [%3+16]
  495. %else
  496.     movdqa   xmm0, [%3+ 0]
  497.     movdqa   xmm1, [%3+16]
  498.     ABS2_MMX xmm0, xmm1, xmm3, xmm4
  499. %endif
  500.     packsswb xmm0, xmm1
  501.     pxor     xmm2, xmm2
  502.     pcmpeqb  xmm2, xmm0
  503.     pcmpgtb  xmm0, %4
  504.     pmovmskb %1, xmm2
  505.     pmovmskb %2, xmm0
  506. %endmacro
  507. %macro DECIMATE_MASK_MMX 6
  508.     movq      mm0, [%3+ 0]
  509.     movq      mm1, [%3+ 8]
  510.     movq      mm2, [%3+16]
  511.     movq      mm3, [%3+24]
  512.     ABS2_MMX  mm0, mm1, mm4, mm5
  513.     ABS2_MMX  mm2, mm3, mm4, mm5
  514.     packsswb  mm0, mm1
  515.     packsswb  mm2, mm3
  516.     pxor      mm4, mm4
  517.     pxor      mm5, mm5
  518.     pcmpeqb   mm4, mm0
  519.     pcmpeqb   mm5, mm2
  520.     pcmpgtb   mm0, %4
  521.     pcmpgtb   mm2, %4
  522.     pmovmskb   %6, mm4
  523.     pmovmskb   %1, mm5
  524.     shl        %1, 8
  525.     or         %1, %6
  526.     pmovmskb   %6, mm0
  527.     pmovmskb   %2, mm2
  528.     shl        %2, 8
  529.     or         %2, %6
  530. %endmacro
  531. cextern x264_decimate_table4
  532. cextern x264_decimate_table8
  533. %macro DECIMATE4x4 2
  534. ;A LUT is faster than bsf on AMD processors, and no slower on Intel
  535. ;This is not true for score64.
  536. cglobal x264_decimate_score%1_%2, 1,3
  537. %ifdef PIC
  538.     lea r10, [x264_decimate_table4 GLOBAL]
  539.     lea r11, [decimate_mask_table4 GLOBAL]
  540.     %define table r10
  541.     %define mask_table r11
  542. %else
  543.     %define table x264_decimate_table4
  544.     %define mask_table decimate_mask_table4
  545. %endif
  546.     DECIMATE_MASK edx, eax, r0, [pb_1 GLOBAL], %2, ecx
  547.     xor   edx, 0xffff
  548.     je   .ret
  549.     test  eax, eax
  550.     jne  .ret9
  551. %if %1==15
  552.     shr   edx, 1
  553. %endif
  554.     movzx ecx, dl
  555.     movzx eax, byte [mask_table + rcx]
  556.     cmp   edx, ecx
  557.     je   .ret
  558.     bsr   ecx, ecx
  559.     shr   edx, 1
  560.     shr   edx, cl
  561.     bsf   ecx, edx
  562.     shr   edx, 1
  563.     shr   edx, cl
  564.     add    al, byte [table + rcx]
  565.     add    al, byte [mask_table + rdx]
  566. .ret:
  567.     REP_RET
  568. .ret9:
  569.     mov   eax, 9
  570.     RET
  571. %endmacro
  572. %ifndef ARCH_X86_64
  573. %define DECIMATE_MASK DECIMATE_MASK_MMX
  574. DECIMATE4x4 15, mmxext
  575. DECIMATE4x4 16, mmxext
  576. %endif
  577. %define DECIMATE_MASK DECIMATE_MASK_SSE2
  578. DECIMATE4x4 15, sse2
  579. DECIMATE4x4 15, ssse3
  580. DECIMATE4x4 16, sse2
  581. DECIMATE4x4 16, ssse3
  582. %macro DECIMATE8x8 1
  583. %ifdef ARCH_X86_64
  584. cglobal x264_decimate_score64_%1, 1,4
  585. %ifdef PIC
  586.     lea r10, [x264_decimate_table8 GLOBAL]
  587.     %define table r10
  588. %else
  589.     %define table x264_decimate_table8
  590. %endif
  591.     mova  m5, [pb_1 GLOBAL]
  592.     DECIMATE_MASK r1d, eax, r0, m5, %1, null
  593.     test  eax, eax
  594.     jne  .ret9
  595.     DECIMATE_MASK r2d, eax, r0+32, m5, %1, null
  596.     shl   r2d, 16
  597.     or    r1d, r2d
  598.     DECIMATE_MASK r2d, r3d, r0+64, m5, %1, null
  599.     shl   r2, 32
  600.     or    eax, r3d
  601.     or    r1, r2
  602.     DECIMATE_MASK r2d, r3d, r0+96, m5, %1, null
  603.     shl   r2, 48
  604.     or    r1, r2
  605.     xor   r1, -1
  606.     je   .ret
  607.     or    eax, r3d
  608.     jne  .ret9
  609. .loop:
  610.     bsf   rcx, r1
  611.     shr   r1, cl
  612.     add   al, byte [table + rcx]
  613.     shr   r1, 1
  614.     jne  .loop
  615. .ret:
  616.     REP_RET
  617. .ret9:
  618.     mov   eax, 9
  619.     RET
  620. %else ; ARCH
  621. %ifidn %1, mmxext
  622. cglobal x264_decimate_score64_%1, 1,6
  623. %else
  624. cglobal x264_decimate_score64_%1, 1,5
  625. %endif
  626.     mova  m7, [pb_1 GLOBAL]
  627.     DECIMATE_MASK r3, r2, r0, m7, %1, r5
  628.     test  r2, r2
  629.     jne  .ret9
  630.     DECIMATE_MASK r4, r2, r0+32, m7, %1, r5
  631.     shl   r4, 16
  632.     or    r3, r4
  633.     DECIMATE_MASK r4, r1, r0+64, m7, %1, r5
  634.     or    r2, r1
  635.     DECIMATE_MASK r1, r0, r0+96, m7, %1, r5
  636.     shl   r1, 16
  637.     or    r4, r1
  638.     xor   r3, -1
  639.     je   .tryret
  640.     xor   r4, -1
  641. .cont:
  642.     or    r0, r2
  643.     jne  .ret9      ;r0 is zero at this point, so we don't need to zero it
  644. .loop:
  645.     bsf   ecx, r3
  646.     test  r3, r3
  647.     je   .largerun
  648.     shrd  r3, r4, cl
  649.     shr   r4, cl
  650.     add   r0b, byte [x264_decimate_table8 + ecx]
  651.     shrd  r3, r4, 1
  652.     shr   r4, 1
  653.     cmp   r0, 6     ;score64's threshold is never higher than 6
  654.     jge  .ret9      ;this early termination is only useful on 32-bit because it can be done in the latency after shrd
  655.     test  r3, r3
  656.     jne  .loop
  657.     test  r4, r4
  658.     jne  .loop
  659. .ret:
  660.     REP_RET
  661. .tryret:
  662.     xor   r4, -1
  663.     jne  .cont
  664.     REP_RET
  665. .ret9:
  666.     mov   eax, 9
  667.     RET
  668. .largerun:
  669.     mov   r3, r4
  670.     xor   r4, r4
  671.     bsf   ecx, r3
  672.     shr   r3, cl
  673.     shr   r3, 1
  674.     jne  .loop
  675.     REP_RET
  676. %endif ; ARCH
  677. %endmacro
  678. %ifndef ARCH_X86_64
  679. INIT_MMX
  680. %define DECIMATE_MASK DECIMATE_MASK_MMX
  681. DECIMATE8x8 mmxext
  682. %endif
  683. INIT_XMM
  684. %define DECIMATE_MASK DECIMATE_MASK_SSE2
  685. DECIMATE8x8 sse2
  686. DECIMATE8x8 ssse3
  687. ;-----------------------------------------------------------------------------
  688. ; int x264_coeff_last( int16_t *dct )
  689. ;-----------------------------------------------------------------------------
  690. %macro LAST_MASK_SSE2 2-3
  691.     movdqa   xmm0, [%2+ 0]
  692.     packsswb xmm0, [%2+16]
  693.     pcmpeqb  xmm0, xmm2
  694.     pmovmskb   %1, xmm0
  695. %endmacro
  696. %macro LAST_MASK_MMX 3
  697.     movq     mm0, [%2+ 0]
  698.     movq     mm1, [%2+16]
  699.     packsswb mm0, [%2+ 8]
  700.     packsswb mm1, [%2+24]
  701.     pcmpeqb  mm0, mm2
  702.     pcmpeqb  mm1, mm2
  703.     pmovmskb  %1, mm0
  704.     pmovmskb  %3, mm1
  705.     shl       %3, 8
  706.     or        %1, %3
  707. %endmacro
  708. %macro LAST_X86 3
  709.     bsr %1, %2
  710. %endmacro
  711. %macro LAST_SSE4A 3
  712.     lzcnt %1, %2
  713.     xor %1, %3
  714. %endmacro
  715. %macro COEFF_LAST4 1
  716. %ifdef ARCH_X86_64
  717. cglobal x264_coeff_last4_%1, 1,1
  718.     LAST rax, [r0], 0x3f
  719.     shr eax, 4
  720.     RET
  721. %else
  722. cglobal x264_coeff_last4_%1, 0,3
  723.     mov   edx, r0mp
  724.     mov   eax, [edx+4]
  725.     xor   ecx, ecx
  726.     test  eax, eax
  727.     cmovz eax, [edx]
  728.     setnz cl
  729.     LAST  eax, eax, 0x1f
  730.     shr   eax, 4
  731.     lea   eax, [eax+ecx*2]
  732.     RET
  733. %endif
  734. %endmacro
  735. %define LAST LAST_X86
  736. COEFF_LAST4 mmxext
  737. %define LAST LAST_SSE4A
  738. COEFF_LAST4 mmxext_lzcnt
  739. %macro COEFF_LAST 1
  740. cglobal x264_coeff_last15_%1, 1,3
  741.     pxor m2, m2
  742.     LAST_MASK r1d, r0-2, r2d
  743.     xor r1d, 0xffff
  744.     LAST eax, r1d, 0x1f
  745.     dec eax
  746.     RET
  747. cglobal x264_coeff_last16_%1, 1,3
  748.     pxor m2, m2
  749.     LAST_MASK r1d, r0, r2d
  750.     xor r1d, 0xffff
  751.     LAST eax, r1d, 0x1f
  752.     RET
  753. %ifndef ARCH_X86_64
  754. cglobal x264_coeff_last64_%1, 1, 5-mmsize/16
  755.     pxor m2, m2
  756.     LAST_MASK r2d, r0+64, r4d
  757.     LAST_MASK r3d, r0+96, r4d
  758.     shl r3d, 16
  759.     or  r2d, r3d
  760.     xor r2d, -1
  761.     jne .secondhalf
  762.     LAST_MASK r1d, r0, r4d
  763.     LAST_MASK r3d, r0+32, r4d
  764.     shl r3d, 16
  765.     or  r1d, r3d
  766.     not r1d
  767.     LAST eax, r1d, 0x1f
  768.     RET
  769. .secondhalf:
  770.     LAST eax, r2d, 0x1f
  771.     add eax, 32
  772.     RET
  773. %else
  774. cglobal x264_coeff_last64_%1, 1,4
  775.     pxor m2, m2
  776.     LAST_MASK_SSE2 r1d, r0
  777.     LAST_MASK_SSE2 r2d, r0+32
  778.     LAST_MASK_SSE2 r3d, r0+64
  779.     LAST_MASK_SSE2 r0d, r0+96
  780.     shl r2d, 16
  781.     shl r0d, 16
  782.     or  r1d, r2d
  783.     or  r3d, r0d
  784.     shl r3,  32
  785.     or  r1,  r3
  786.     not r1
  787.     LAST rax, r1, 0x3f
  788.     RET
  789. %endif
  790. %endmacro
  791. %define LAST LAST_X86
  792. %ifndef ARCH_X86_64
  793. INIT_MMX
  794. %define LAST_MASK LAST_MASK_MMX
  795. COEFF_LAST mmxext
  796. %endif
  797. INIT_XMM
  798. %define LAST_MASK LAST_MASK_SSE2
  799. COEFF_LAST sse2
  800. %define LAST LAST_SSE4A
  801. COEFF_LAST sse2_lzcnt
  802. ;-----------------------------------------------------------------------------
  803. ; int x264_coeff_level_run( int16_t *dct, x264_run_level_t *runlevel )
  804. ;-----------------------------------------------------------------------------
  805. %macro LAST_MASK4_MMX 2-3
  806.     movq     mm0, [%2]
  807.     packsswb mm0, mm0
  808.     pcmpeqb  mm0, mm2
  809.     pmovmskb  %1, mm0
  810. %endmacro
  811. %macro LZCOUNT_X86 3
  812.     bsr %1, %2
  813.     xor %1, %3
  814. %endmacro
  815. %macro LZCOUNT_SSE4A 3
  816.     lzcnt %1, %2
  817. %endmacro
  818. ; t6 = eax for return, t3 = ecx for shift, t[01] = r[01] for x86_64 args
  819. %ifdef WIN64
  820.     DECLARE_REG_TMP 3,1,2,0,4,5,6
  821. %elifdef ARCH_X86_64
  822.     DECLARE_REG_TMP 0,1,2,3,4,5,6
  823. %else
  824.     DECLARE_REG_TMP 6,3,2,1,4,5,0
  825. %endif
  826. %macro COEFF_LEVELRUN 2
  827. cglobal x264_coeff_level_run%2_%1,0,7
  828.     movifnidn t0, r0mp
  829.     movifnidn t1, r1mp
  830.     pxor    m2, m2
  831.     LAST_MASK t5d, t0-(%2&1)*2, t4d
  832.     not    t5d
  833.     shl    t5d, 32-((%2+1)&~1)
  834.     mov    t4d, %2-1
  835.     LZCOUNT t3d, t5d, 0x1f
  836.     xor    t6d, t6d
  837.     add    t5d, t5d
  838.     sub    t4d, t3d
  839.     shl    t5d, t3b
  840.     mov   [t1], t4d
  841. .loop:
  842.     LZCOUNT t3d, t5d, 0x1f
  843.     mov    t2w, [t0+t4*2]
  844.     mov   [t1+t6  +36], t3b
  845.     mov   [t1+t6*2+ 4], t2w
  846.     inc    t3d
  847.     shl    t5d, t3b
  848.     inc    t6d
  849.     sub    t4d, t3d
  850.     jge .loop
  851.     REP_RET
  852. %endmacro
  853. INIT_MMX
  854. %define LZCOUNT LZCOUNT_X86
  855. %ifndef ARCH_X86_64
  856. %define LAST_MASK LAST_MASK_MMX
  857. COEFF_LEVELRUN mmxext, 15
  858. COEFF_LEVELRUN mmxext, 16
  859. %endif
  860. %define LAST_MASK LAST_MASK4_MMX
  861. COEFF_LEVELRUN mmxext, 4
  862. INIT_XMM
  863. %define LAST_MASK LAST_MASK_SSE2
  864. COEFF_LEVELRUN sse2, 15
  865. COEFF_LEVELRUN sse2, 16
  866. %define LZCOUNT LZCOUNT_SSE4A
  867. COEFF_LEVELRUN sse2_lzcnt, 15
  868. COEFF_LEVELRUN sse2_lzcnt, 16
  869. INIT_MMX
  870. %define LAST_MASK LAST_MASK4_MMX
  871. COEFF_LEVELRUN mmxext_lzcnt, 4