dct_sse2.asm
上传用户:sunbaby
上传日期:2013-05-31
资源大小:242k
文件大小:13k
源码类别:

mpeg/mp3

开发平台:

Visual C++

  1.   ;/*****************************************************************************
  2. ; *
  3. ; *  T264 AVC CODEC
  4. ; *
  5. ; *  Copyright(C) 2004-2005 llcc <lcgate1@yahoo.com.cn>
  6. ; *               2004-2005 visionany <visionany@yahoo.com.cn>
  7. ; *
  8. ; *  This program is free software ; you can redistribute it and/or modify
  9. ; *  it under the terms of the GNU General Public License as published by
  10. ; *  the Free Software Foundation ; either version 2 of the License, or
  11. ; *  (at your option) any later version.
  12. ; *
  13. ; *  This program is distributed in the hope that it will be useful,
  14. ; *  but WITHOUT ANY WARRANTY ; without even the implied warranty of
  15. ; *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. ; *  GNU General Public License for more details.
  17. ; *
  18. ; *  You should have received a copy of the GNU General Public License
  19. ; *  along with this program ; if not, write to the Free Software
  20. ; *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  21. ; *
  22. ; ****************************************************************************/
  23. bits 32
  24. ; ideal from xvid
  25. ; modify by Thomascatlee@163.com
  26. ; for GCC
  27. %macro cglobal 1
  28. %ifdef NOPREFIX
  29. global %1
  30. %else
  31. global _%1
  32. %define %1 _%1
  33. %endif
  34. %endmacro
  35. %macro cextern 1
  36. %ifdef NOPREFIX
  37. extern %1
  38. %else
  39. extern _%1
  40. %define %1 _%1
  41. %endif
  42. %endmacro
  43. ; input 0 1 2 3, output 3 4 1 0
  44. %macro transpose 5
  45.     movq       %5, %1
  46.     punpckhwd  %5, %2  ; mm4 = 8 4 7 3
  47.     punpcklwd  %1, %2  ; mm0 = 6 2 5 1
  48.     movq       %2, %3
  49.     punpckhwd  %2, %4  ; mm1 = 16 12 15 11
  50.     punpcklwd  %3, %4  ; mm2 = 14 10 13 9
  51.     movq       %4, %5
  52.     punpckhdq  %4, %2  ; mm3 = 16 12 8 4
  53.     punpckldq  %5, %2  ; mm4 = 15 11 7 3
  54.     movq       %2, %1
  55.     punpckhdq  %2, %3  ; mm1 = 14 10 6 2
  56.     punpckldq  %1, %3  ; mm0 = 13 9 5 1
  57. %endmacro
  58. %macro addsub 5
  59.     movq  %5, %1
  60.     paddw %1, %4    ; %0 = s[0]
  61.     psubw %5, %4    ; %4 = s[3]
  62.     movq  %4, %2
  63.     paddw %2, %3    ; %1 = s[1]
  64.     psubw %4, %3    ; %3 = s[2]
  65. %endmacro
  66. %macro addsub2 5    
  67.     movq  %5, %1   ; %5   = s[0]
  68.     paddw %1, %2   ; d[0] = s[0] + s[1]
  69.     psubw %5, %2   ; d[2] = tmp  - s[1]
  70.     
  71.     movq  %2, %4   ; %2   = s[3]
  72.     paddw %2, %2   ; %2   = %2 + %2
  73.     paddw %2, %3   ; d[1] = %2 + s[2]
  74.     paddw %3, %3   ; s[2] = s[2]+ s[2]
  75.     psubw %4, %3   ; d[3] = s[3]- s[2]
  76. %endmacro
  77. ; output 0 4 1 2
  78. %macro idct_addsub2 5    
  79.     movq  %5, %1   ; %5   = d[0]
  80.     paddw %1, %3   ; s[0] = d[0] + d[2]
  81.     psubw %5, %3   ; s[1] = d[0] - d[2]
  82.     
  83.     movq  %3, %2   ; %3   = d[1]
  84.     psraw %2, 1    ; %2   = %2 / 2
  85.     psubw %2, %4   ; s[2] = %2 - d[3]
  86.     psraw %4, 1    ; d[3] = d[3] / 2
  87.     paddw %3, %4   ; s[3] = d[1] + d[3]
  88. %endmacro
  89. ; %1 = mmx content, %2 = tmp mmx, %3 = zero mmx, %4 = xmm content, %5 = xmm tmp
  90. %macro word2dw 5
  91.     movq   %2, %1
  92.     punpcklwd %2, %3  ;   dcba->0b0a
  93.     punpckhwd %1, %3  ;   dcba->0d0c
  94.     movq2dq %4, %1   ;   00 00 0d 0c
  95.     pslldq %4, 8      ;   0d 0c 00 00
  96.     movq2dq %5, %2   ;   00 00 0b 0a
  97.     por %4, %5      ;   0d 0c 0b 0a
  98. %endmacro
  99. section .rodata data align=16
  100. align 16
  101.     sse2_neg1 dw -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
  102.     sse2_1 dw 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  103. align 16
  104.     mmx1 dw 1, 1, 1, 1
  105. align 16
  106.     mmx32 dw 32, 32, 32, 32
  107.     
  108. cextern quant
  109. cextern dequant
  110. align 16
  111. section .text
  112. ;======================================================
  113. ;
  114. ; void 
  115. ; dct4x4_mmx(int16_t* data)
  116. ;
  117. ;======================================================
  118. align 16
  119. cglobal dct4x4_mmx
  120. dct4x4_mmx
  121.     
  122.     mov  eax, [esp + 4]  ; data
  123.     movq mm0, [eax + 0] 
  124.     movq mm1, [eax + 8] 
  125.     movq mm2, [eax + 16]
  126.     movq mm3, [eax + 24]
  127.     
  128.     transpose mm0, mm1, mm2, mm3, mm4 ; input 0 1 2 3, output 0 1 4 3
  129.     
  130.     addsub mm0, mm1, mm4, mm3, mm2  ; input 0 1 2 3, output 0 1 3 4
  131.     ; s[0] = mm0, s[1] = mm1, s[2] = mm3, s[3] = mm2
  132.     addsub2 mm0, mm1, mm3, mm2, mm4  ; input 0 1 2 3, output 0 1 4 3
  133.     transpose mm0, mm1, mm4, mm2, mm3 ; input 0 1 2 3, output 0 1 4 3
  134.     
  135.     addsub mm0, mm1, mm3, mm2, mm4  ; input 0 1 2 3, output 0 1 3 4
  136.     ; s[0] = mm0, s[1] = mm1, s[2] = mm2, s[3] = mm4
  137.     
  138.     addsub2 mm0, mm1, mm2, mm4, mm3  ; input 0 1 2 3, output 0 1 4 3
  139.     movq [eax + 0], mm0
  140.     movq [eax + 8], mm1
  141.     movq [eax +16], mm3
  142.     movq [eax +24], mm4
  143.  
  144.     ret
  145. ;======================================================
  146. ;
  147. ; void 
  148. ; dct4x4dc_mmx(int16_t* data)
  149. ;
  150. ;======================================================
  151. align 16
  152. cglobal dct4x4dc_mmx
  153. dct4x4dc_mmx
  154.     mov  eax, [esp + 4]  ; data
  155.     movq mm0, [eax + 0] 
  156.     movq mm1, [eax + 8] 
  157.     movq mm2, [eax + 16]
  158.     movq mm3, [eax + 24]
  159.     
  160.     transpose mm0, mm1, mm2, mm3, mm4 ; input 0 1 2 3, output 0 1 4 3
  161.     
  162.     addsub mm0, mm1, mm4, mm3, mm2  ; input 0 1 2 3, output 0 1 3 4
  163.     ; s[0] = mm0, s[1] = mm1, s[2] = mm3, s[3] = mm2
  164.     addsub mm0, mm2, mm3, mm1, mm4  ; input 0 1 2 3, output 0 1 4 3
  165.     transpose mm0, mm2, mm4, mm1, mm3 ; input 0 1 2 3, output 0 1 4 3
  166.     
  167.     addsub mm0, mm2, mm3, mm1, mm4  ; input 0 1 2 3, output 0 1 3 4
  168.     ; s[0] = mm0, s[1] = mm2, s[2] = mm1, s[3] = mm4
  169.     
  170.     addsub mm0, mm4, mm1, mm2, mm3  ; input 0 1 2 3, output 0 1 4 3
  171.     movq mm1, [mmx1]
  172.     
  173.     paddw mm0, mm1
  174.     paddw mm4, mm1
  175.     paddw mm3, mm1
  176.     paddw mm2, mm1
  177.     
  178.     psraw mm0, 1
  179.     psraw mm4, 1
  180.     psraw mm3, 1
  181.     psraw mm2, 1
  182.     
  183.     movq [eax + 0], mm0
  184.     movq [eax + 8], mm4
  185.     movq [eax +16], mm3
  186.     movq [eax +24], mm2
  187.     ret
  188. ;======================================================
  189. ;
  190. ; void 
  191. ; idct4x4_mmx(int16_t* data)
  192. ;
  193. ;======================================================
  194. align 16
  195. cglobal idct4x4_mmx
  196. idct4x4_mmx
  197.     mov  eax, [esp + 4]  ; data
  198.     movq mm0, [eax + 0] 
  199.     movq mm1, [eax + 8] 
  200.     movq mm2, [eax + 16]
  201.     movq mm3, [eax + 24]
  202.     
  203.     transpose mm0, mm1, mm2, mm3, mm4 ; input 0 1 2 3, output 0 1 4 3
  204.     
  205.     idct_addsub2 mm0, mm1, mm4, mm3, mm2  ; input 0 1 2 3, output 0 4 1 2
  206.     ; s[0] = mm0, s[1] = mm2, s[2] = mm1, s[3] = mm4
  207.     addsub mm0, mm2, mm1, mm4, mm3  ; input 0 1 2 3, output 0 1 3 4
  208.     transpose mm0, mm2, mm4, mm3, mm1 ; input 0 1 2 3, output 0 1 4 3
  209.     
  210.     idct_addsub2 mm0, mm2, mm1, mm3, mm4  ; input 0 1 2 3, output 0 4 1 2
  211.     ; s[0] = mm0, s[1] = mm4, s[2] = mm2, s[3] = mm1
  212.     addsub mm0, mm4, mm2, mm1, mm3  ; input 0 1 2 3, output 0 1 3 4
  213.     movq mm2, [mmx32]
  214.     
  215.     paddw mm0, mm2
  216.     paddw mm4, mm2
  217.     paddw mm1, mm2
  218.     paddw mm3, mm2
  219.     
  220.     psraw mm0, 6
  221.     psraw mm4, 6
  222.     psraw mm1, 6
  223.     psraw mm3, 6
  224.     
  225.     movq [eax + 0], mm0
  226.     movq [eax + 8], mm4
  227.     movq [eax +16], mm1
  228.     movq [eax +24], mm3
  229.  
  230.     ret
  231. ;======================================================
  232. ;
  233. ; void 
  234. ; idct4x4dc_mmx(int16_t* data)
  235. ;
  236. ;======================================================
  237. align 16
  238. cglobal idct4x4dc_mmx
  239. idct4x4dc_mmx
  240.     mov  eax, [esp + 4]  ; data
  241.     movq mm0, [eax + 0] 
  242.     movq mm1, [eax + 8] 
  243.     movq mm2, [eax + 16]
  244.     movq mm3, [eax + 24]
  245.     
  246.     transpose mm0, mm1, mm2, mm3, mm4 ; input 0 1 2 3, output 0 1 4 3
  247.     
  248.     addsub mm0, mm1, mm3, mm4, mm2  ; input 0 1 2 3, output 0 4 3 1
  249.     ; s[0] = mm0, s[1] = mm2, s[2] = mm4, s[3] = mm1
  250.     addsub mm0, mm2, mm4, mm1, mm3  ; input 0 1 2 3, output 0 1 3 4
  251.     transpose mm0, mm2, mm1, mm3, mm4 ; input 0 1 2 3, output 0 1 4 3
  252.     
  253.     addsub mm0, mm2, mm3, mm4, mm1  ; input 0 1 2 3, output 0 4 3 1
  254.     ; s[0] = mm0, s[1] = mm1, s[2] = mm4, s[3] = mm2
  255.     
  256.     addsub mm0, mm1, mm4, mm2, mm3  ; input 0 1 2 3, output 0 1 3 4
  257.     movq [eax + 0], mm0
  258.     movq [eax + 8], mm1
  259.     movq [eax +16], mm2
  260.     movq [eax +24], mm3
  261.     ret
  262. ;======================================================
  263. ;
  264. ; void
  265. ; quant4x4_sse2(int16_t* data, const int32_t Qp, int32_t is_intra)
  266. ;
  267. ;======================================================
  268. align 16
  269. cglobal quant4x4_sse2
  270. quant4x4_sse2
  271.     push ebx
  272.     push esi
  273.     push edi
  274.     push ebp
  275.     
  276.     mov  edi, [esp + 4 + 16]  ; data
  277.     mov  eax, [esp + 8 + 16]  ; qp
  278.     cdq
  279.     mov  ebp, [esp + 12 + 16] ; is_intra
  280.     mov  ebx, 6
  281.     idiv ebx
  282.     add  eax, 15         ; qbits(eax) = 15 + qp / 6, mf_index(edx) = qp % 6    
  283.     mov  esi, edx
  284.     shl  esi, 5
  285.     add  esi, quant     ; esi = quant[mf_index]
  286.     mov  ecx, eax        ; ecx = qbits
  287.     
  288.     neg  ebp
  289.     sbb  ebp, ebp
  290.     and  ebp, 0xfffffffd
  291.     add  ebp, 6          ; is_intra(ecx) ? 3 : 6
  292.     
  293.     mov  eax, 1
  294.     shl  eax, cl         ; 1 << qbits
  295.     cdq
  296.     idiv ebp             ; 1 << qbits / is_intra(ecx) ? 3 : 6
  297.     
  298.     ; eax = f, ecx = qbits, esi = quant[mf_index], edi = data
  299.     
  300.     movd      mm0, eax
  301.     movd      mm1, ecx
  302.     pshufw    mm0, mm0, 0x44
  303.     movq2dq   xmm6, mm0
  304.     movq2dq   xmm7, mm1
  305.     pshufd    xmm6, xmm6, 0x44        ; f
  306.     pxor      mm3, mm3
  307.     
  308.     movdqa    xmm0, [edi + 0]         ; data
  309.     movdqa    xmm1, [esi + 0]         ; quant
  310.     
  311.     ; > 0
  312.     pxor      xmm4, xmm4
  313.     movdqa    xmm2, xmm0
  314.     pcmpgtw   xmm0, xmm4
  315.     movdqa    xmm4, xmm0
  316.     pand      xmm0, xmm2
  317.     movdqa    xmm3, xmm0
  318.     pmullw    xmm0, xmm1              ; low part
  319.     pmulhw    xmm3, xmm1              ; high part
  320.     movdqa    xmm5, xmm0
  321.     punpcklwd xmm0, xmm3              ; low 4 - 32 bits
  322.     punpckhwd xmm5, xmm3              ; high 4 - 32 bits
  323.     movdqa    xmm3, xmm4
  324.     punpcklwd xmm4, xmm4
  325.     pand      xmm4, xmm6
  326.     paddd     xmm0, xmm4              ; data * quant + f
  327.     psrad     xmm0, xmm7              ; data * quant + f >> qbits
  328.     punpckhwd xmm3, xmm3
  329.     pand      xmm3, xmm6
  330.     paddd     xmm5, xmm3              ; data * quant + f
  331.     psrad     xmm5, xmm7              ; data * quant + f >> qbits
  332.     packssdw  xmm0, xmm5
  333.     
  334.     ; < 0
  335.     pxor      xmm4, xmm4
  336.     movdqa    xmm5, xmm2
  337.     pcmpgtw   xmm4, xmm2
  338.     pand      xmm5, xmm4
  339.     pmullw    xmm5, [sse2_neg1]
  340.     movdqa    xmm3, xmm5
  341.     pmullw    xmm5, xmm1
  342.     pmulhw    xmm3, xmm1
  343.     movdqa    xmm1, xmm5
  344.     punpcklwd xmm5, xmm3
  345.     punpckhwd xmm1, xmm3
  346.     movdqa    xmm3, xmm4
  347.     punpcklwd xmm4, xmm4
  348.     pand      xmm4, xmm6
  349.     paddd     xmm5, xmm4            ; data * quant - f
  350.     psrad     xmm5, xmm7
  351.     punpckhwd xmm3, xmm3
  352.     pand      xmm3, xmm6
  353.     paddd     xmm1, xmm3
  354.     psrad     xmm1, xmm7
  355.     packssdw  xmm5, xmm1
  356.     pmullw    xmm5, [sse2_neg1]
  357.     
  358.     por       xmm5, xmm0
  359.     movdqa    [edi + 0], xmm5
  360.     movdqa    xmm0, [edi + 16]         ; data
  361.     movdqa    xmm1, [esi + 16]         ; quant
  362.     
  363.     ; > 0
  364.     pxor      xmm4, xmm4
  365.     movdqa    xmm2, xmm0
  366.     pcmpgtw   xmm0, xmm4
  367.     movdqa    xmm4, xmm0
  368.     pand      xmm0, xmm2
  369.     movdqa    xmm3, xmm0
  370.     pmullw    xmm0, xmm1              ; low part
  371.     pmulhw    xmm3, xmm1              ; high part
  372.     movdqa    xmm5, xmm0
  373.     punpcklwd xmm0, xmm3              ; low 4 - 32 bits
  374.     punpckhwd xmm5, xmm3              ; high 4 - 32 bits
  375.     movdqa    xmm3, xmm4
  376.     punpcklwd xmm4, xmm4
  377.     pand      xmm4, xmm6
  378.     paddd     xmm0, xmm4              ; data * quant + f
  379.     psrad     xmm0, xmm7              ; data * quant + f >> qbits
  380.     punpckhwd xmm3, xmm3
  381.     pand      xmm3, xmm6
  382.     paddd     xmm5, xmm3              ; data * quant + f
  383.     psrad     xmm5, xmm7              ; data * quant + f >> qbits
  384.     packssdw  xmm0, xmm5
  385.     
  386.     ; < 0
  387.     pxor      xmm4, xmm4
  388.     movdqa    xmm5, xmm2
  389.     pcmpgtw   xmm4, xmm2
  390.     pand      xmm5, xmm4
  391.     pmullw    xmm5, [sse2_neg1]
  392.     movdqa    xmm3, xmm5
  393.     pmullw    xmm5, xmm1
  394.     pmulhw    xmm3, xmm1
  395.     movdqa    xmm1, xmm5
  396.     punpcklwd xmm5, xmm3
  397.     punpckhwd xmm1, xmm3
  398.     movdqa    xmm3, xmm4
  399.     punpcklwd xmm4, xmm4
  400.     pand      xmm4, xmm6
  401.     paddd     xmm5, xmm4            ; data * quant - f
  402.     psrad     xmm5, xmm7
  403.     punpckhwd xmm3, xmm3
  404.     pand      xmm3, xmm6
  405.     paddd     xmm1, xmm3
  406.     psrad     xmm1, xmm7
  407.     packssdw  xmm5, xmm1
  408.     pmullw    xmm5, [sse2_neg1]
  409.     
  410.     por       xmm5, xmm0
  411.     movdqa    [edi + 16], xmm5
  412.     pop ebp
  413.     pop edi
  414.     pop esi
  415.     pop ebx
  416.     ret
  417. ;======================================================
  418. ;
  419. ; void
  420. ; iquant4x4_sse2(int16_t* data, const int32_t Qp)
  421. ;
  422. ;======================================================
  423. align 16
  424. cglobal iquant4x4_sse2
  425. iquant4x4_sse2
  426.     mov  eax, [esp + 8]  ; qp
  427.     cdq
  428.     mov  ecx, 6
  429.     idiv ecx             ; qbits(eax) = qp / 6, mf_index(edx) = qp % 6    
  430.     mov  ecx, edx
  431.     shl  ecx, 5
  432.     add  ecx, dequant   ; ecx = quant[mf_index]
  433.     mov  edx, [esp + 4]  ; data
  434.     
  435.     ; eax = qbits, ecx = quant[mf_index], edx = data
  436.     
  437.     movdqa xmm6, [sse2_1]
  438.     movdqa xmm0, [edx + 0]
  439.     movdqa xmm2, [edx + 16]
  440.     movdqa xmm1, [ecx + 0]
  441.     movdqa xmm3, [ecx + 16]
  442.     pmullw  xmm0, xmm1
  443.     pmullw  xmm2, xmm3
  444.     movd    xmm7, eax
  445.     psllw   xmm6, xmm7      ; << qbits
  446.     pmullw xmm0, xmm6
  447.     pmullw xmm2, xmm6
  448.     movdqa [edx + 0], xmm0
  449.     movdqa [edx + 16], xmm2
  450.     ret