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

Audio

开发平台:

Visual C++

  1. ;*****************************************************************************
  2. ;* cabac-a.asm: h264 encoder library
  3. ;*****************************************************************************
  4. ;* Copyright (C) 2008 x264 project
  5. ;*
  6. ;* Author: Loren Merritt <lorenm@u.washington.edu>
  7. ;*         Jason Garrett-Glaser <darkshikari@gmail.com>
  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. SECTION .text
  26. cextern x264_cabac_range_lps
  27. cextern x264_cabac_transition
  28. cextern x264_cabac_renorm_shift
  29. %macro DEF_TMP 16
  30.     %rep 8
  31.         %define t%1d r%9d
  32.         %define t%1b r%9b
  33.         %define t%1  r%9
  34.         %rotate 1
  35.     %endrep
  36. %endmacro
  37. ; t3 must be ecx, since it's used for shift.
  38. %ifdef ARCH_X86_64
  39.     DEF_TMP 0,1,2,3,4,5,6,7, 0,1,2,3,4,5,6,10
  40.     %define pointer resq
  41. %else
  42.     DEF_TMP 0,1,2,3,4,5,6,7, 0,3,2,1,4,5,6,3
  43.     %define pointer resd
  44. %endif
  45. struc cb
  46.     .low: resd 1
  47.     .range: resd 1
  48.     .queue: resd 1
  49.     .bytes_outstanding: resd 1
  50.     .start: pointer 1
  51.     .p: pointer 1
  52.     .end: pointer 1
  53.     align 16, resb 1
  54.     .bits_encoded: resd 1
  55.     .state: resb 460
  56. endstruc
  57. %macro LOAD_GLOBAL 4
  58. %ifdef PIC
  59.     ; this would be faster if the arrays were declared in asm, so that I didn't have to duplicate the lea
  60.     lea   r11, [%2 GLOBAL]
  61.     %ifnidn %3, 0
  62.     add   r11, %3
  63.     %endif
  64.     movzx %1, byte [r11+%4]
  65. %else
  66.     movzx %1, byte [%2+%3+%4]
  67. %endif
  68. %endmacro
  69. cglobal x264_cabac_encode_decision_asm, 0,7
  70.     movifnidn t0d, r0m
  71.     movifnidn t1d, r1m
  72.     mov   t5d, [r0+cb.range]
  73.     movzx t3d, byte [r0+cb.state+t1]
  74.     mov   t4d, t5d
  75.     shr   t5d, 6
  76.     and   t5d, 3
  77.     LOAD_GLOBAL t5d, x264_cabac_range_lps, t5, t3*4
  78.     sub   t4d, t5d
  79.     mov   t6d, t3d
  80.     shr   t6d, 6
  81.     movifnidn t2d, r2m
  82.     cmp   t6d, t2d
  83.     mov   t6d, [r0+cb.low]
  84.     lea   t7,  [t6+t4]
  85.     cmovne t4d, t5d
  86.     cmovne t6d, t7d
  87.     LOAD_GLOBAL t3d, x264_cabac_transition, t2, t3*2
  88.     movifnidn t1d, r1m
  89.     mov   [r0+cb.state+t1], t3b
  90. .renorm:
  91.     mov   t3d, t4d
  92.     shr   t3d, 3
  93.     LOAD_GLOBAL t3d, x264_cabac_renorm_shift, 0, t3
  94.     shl   t4d, t3b
  95.     shl   t6d, t3b
  96.     add   t3d, [r0+cb.queue]
  97.     mov   [r0+cb.range], t4d
  98.     mov   [r0+cb.low], t6d
  99.     mov   [r0+cb.queue], t3d
  100.     cmp   t3d, 8
  101.     jge .putbyte
  102.     REP_RET
  103. .putbyte:
  104.     ; alive: t0=cb t3=queue t6=low
  105.     add   t3d, 2
  106.     mov   t1d, 1
  107.     mov   t2d, t6d
  108.     shl   t1d, t3b
  109.     shr   t2d, t3b ; out
  110.     dec   t1d
  111.     sub   t3d, 10
  112.     and   t6d, t1d
  113.     cmp   t2b, 0xff ; FIXME is a 32bit op faster?
  114.     mov   [r0+cb.queue], t3d
  115.     mov   [r0+cb.low], t6d
  116.     mov   t1d, t2d
  117.     mov   t4,  [r0+cb.p]
  118.     je .postpone
  119.     mov   t5d, [r0+cb.bytes_outstanding]
  120.     shr   t1d, 8 ; carry
  121.     add   [t4-1], t1b
  122.     test  t5d, t5d
  123.     jz .no_outstanding
  124.     dec   t1d
  125. .loop_outstanding:
  126.     mov   [t4], t1b
  127.     inc   t4
  128.     dec   t5d
  129.     jg .loop_outstanding
  130. .no_outstanding:
  131.     mov   [t4], t2b
  132.     inc   t4
  133.     mov   [r0+cb.bytes_outstanding], t5d ; is zero, but a reg has smaller opcode than an immediate
  134.     mov   [r0+cb.p], t4
  135.     RET
  136. .postpone:
  137.     inc   dword [r0+cb.bytes_outstanding]
  138.     RET