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

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. ; from xvid
  36. %macro new_sad16b 0
  37.     movdqu  xmm0, [edx]
  38.     movdqu  xmm1, [edx+ebx]
  39.     lea edx,[edx+2*ebx]
  40.     movdqa  xmm2, [eax]
  41.     movdqa  xmm3, [eax+ecx]
  42.     lea eax,[eax+2*ecx]
  43.     psadbw  xmm0, xmm2
  44.     paddusw xmm6,xmm0
  45.     psadbw  xmm1, xmm3
  46.     paddusw xmm6,xmm1
  47. %endmacro
  48. %macro new_sad8b 0
  49.     movq mm0, [esi]
  50.     movq mm1, [edi]
  51.     psadbw mm0, mm1
  52.     add    esi, ebx             ; src + src_stride
  53.     add    edi, edx             ; dst + dst_stride
  54. paddusw mm2, mm0
  55. %endmacro
  56. %macro new_sad4b 0
  57.     movq mm0, [esi]
  58.     movq mm1, [edi]
  59.     ; we only need low 4 bytes
  60.     pand mm0, mm3
  61.     pand mm1, mm3
  62.     psadbw mm0, mm1
  63.     add    esi, ebx             ; src + src_stride
  64.     add    edi, edx             ; dst + dst_stride
  65. paddusw mm2,mm0
  66. %endmacro
  67. section .rodata data align=16
  68. align 16
  69.     mmx_mask01 db 0xff, 0xff, 0xff, 0xff, 0, 0, 0, 0
  70. section .text
  71. ;======================================================
  72. ;
  73. ; uint32_t 
  74. ; T264_sad_u_16x16_sse2(uint8_t* src, int32_t src_stride, uint8_t* data, int32_t dst_stride);
  75. ;
  76. ;======================================================
  77. align 16
  78. cglobal T264_sad_u_16x16_sse2
  79. T264_sad_u_16x16_sse2
  80.    
  81.     push ebx
  82.     
  83.     mov eax, [esp + 4 + 4]      ; src
  84.     mov ecx, [esp + 8 + 4]      ; src_stride
  85.     mov edx, [esp + 12 + 4]     ; data
  86.     mov ebx, [esp + 16 + 4]     ; dst_stride
  87.     
  88.     pxor xmm6, xmm6
  89.     new_sad16b
  90.     new_sad16b
  91.     new_sad16b
  92.     new_sad16b
  93.     new_sad16b
  94.     new_sad16b
  95.     new_sad16b
  96.     new_sad16b
  97.     
  98.     pshufd  xmm5, xmm6, 00000010b
  99.     paddusw xmm6, xmm5
  100.     pextrw  eax, xmm6, 0
  101.     
  102.     pop ebx
  103.     
  104.     ret
  105.     
  106. ;======================================================
  107. ;
  108. ; uint32_t 
  109. ; T264_sad_u_16x8_sse2(uint8_t* src, int32_t src_stride, uint8_t* data, int32_t dst_stride);
  110. ;
  111. ;======================================================
  112. align 16
  113. cglobal T264_sad_u_16x8_sse2
  114. T264_sad_u_16x8_sse2
  115.     
  116.     push ebx
  117.     
  118.     mov eax, [esp + 4 + 4]      ; src
  119.     mov ecx, [esp + 8 + 4]      ; src_stride
  120.     mov edx, [esp + 12 + 4]     ; data
  121.     mov ebx, [esp + 16 + 4]     ; dst_stride
  122.     
  123.     pxor xmm6, xmm6
  124.     new_sad16b
  125.     new_sad16b
  126.     new_sad16b
  127.     new_sad16b
  128.     
  129.     pshufd  xmm5, xmm6, 00000010b
  130.     paddusw xmm6, xmm5
  131.     pextrw  eax, xmm6, 0
  132.     
  133.     pop ebx
  134.     ret
  135.     
  136. ;======================================================
  137. ;
  138. ; uint32_t 
  139. ; T264_sad_u_8x16_sse(uint8_t* src, int32_t src_stride, uint8_t* data, int32_t dst_stride);
  140. ;
  141. ;======================================================
  142. align 16
  143. cglobal T264_sad_u_8x16_sse
  144. T264_sad_u_8x16_sse
  145.     
  146.     push ebx
  147.     push esi
  148.     push edi
  149.     
  150.     mov esi, [esp + 4 + 12]      ; src
  151.     mov ebx, [esp + 8 + 12]      ; src_stride
  152.     mov edi, [esp + 12+ 12]      ; data
  153.     mov edx, [esp + 16+ 12]      ; dst_stride
  154.     
  155. pxor mm2, mm2;
  156.     
  157.     new_sad8b;
  158.     new_sad8b;
  159.     new_sad8b;
  160.     new_sad8b;
  161.     new_sad8b;
  162.     new_sad8b;
  163.     new_sad8b;
  164.     new_sad8b;
  165.     new_sad8b;
  166.     new_sad8b;
  167.     new_sad8b;
  168.     new_sad8b;
  169.     new_sad8b;
  170.     new_sad8b;
  171.     new_sad8b;
  172.     new_sad8b;
  173. pextrw eax, mm2, 0
  174.     pop edi
  175.     pop esi
  176.     pop ebx
  177.     ret
  178.     
  179. ;======================================================
  180. ;
  181. ; uint32_t 
  182. ; T264_sad_u_8x8_sse(uint8_t* src, int32_t src_stride, uint8_t* data, int32_t dst_stride);
  183. ;
  184. ;======================================================
  185. align 16
  186. cglobal T264_sad_u_8x8_sse
  187. T264_sad_u_8x8_sse
  188.     
  189.     push ebx
  190.     push esi
  191.     push edi
  192.     
  193.     mov esi, [esp + 4 + 12]      ; src
  194.     mov ebx, [esp + 8 + 12]      ; src_stride
  195.     mov edi, [esp + 12+ 12]      ; data
  196.     mov edx, [esp + 16+ 12]      ; dst_stride
  197.     
  198. pxor mm2, mm2;
  199.     
  200.     new_sad8b;
  201.     new_sad8b;
  202.     new_sad8b;
  203.     new_sad8b;
  204.     new_sad8b;
  205.     new_sad8b;
  206.     new_sad8b;
  207.     new_sad8b;
  208. pextrw eax, mm2, 0
  209.     pop edi
  210.     pop esi
  211.     pop ebx
  212.     ret
  213.     
  214. ;======================================================
  215. ;
  216. ; uint32_t 
  217. ; T264_sad_u_8x4_sse(uint8_t* src, int32_t src_stride, uint8_t* data, int32_t dst_stride);
  218. ;
  219. ;======================================================
  220. align 16
  221. cglobal T264_sad_u_8x4_sse
  222. T264_sad_u_8x4_sse
  223.     
  224.     push ebx
  225.     push esi
  226.     push edi
  227.     
  228.     mov esi, [esp + 4 + 12]      ; src
  229.     mov ebx, [esp + 8 + 12]      ; src_stride
  230.     mov edi, [esp + 12+ 12]      ; data
  231.     mov edx, [esp + 16+ 12]      ; dst_stride
  232.     
  233. pxor mm2, mm2;
  234.     
  235.     new_sad8b;
  236.     new_sad8b;
  237.     new_sad8b;
  238.     new_sad8b;
  239. pextrw eax, mm2, 0
  240.     pop edi
  241.     pop esi
  242.     pop ebx
  243.     ret
  244.     
  245. ;======================================================
  246. ;
  247. ; uint32_t 
  248. ; T264_sad_u_4x8_sse(uint8_t* src, int32_t src_stride, uint8_t* data, int32_t dst_stride);
  249. ;
  250. ;======================================================
  251. align 16
  252. cglobal T264_sad_u_4x8_sse
  253. T264_sad_u_4x8_sse
  254.     
  255.     push ebx
  256.     push esi
  257.     push edi
  258.     
  259.     mov esi, [esp + 4 + 12]      ; src
  260.     mov ebx, [esp + 8 + 12]      ; src_stride
  261.     mov edi, [esp + 12+ 12]      ; data
  262.     mov edx, [esp + 16+ 12]      ; dst_stride
  263.     movq mm3, [mmx_mask01]
  264.     
  265.     pxor mm2, mm2
  266.     
  267.     new_sad4b;
  268.     new_sad4b;
  269.     new_sad4b;
  270.     new_sad4b;
  271.     new_sad4b;
  272.     new_sad4b;
  273.     new_sad4b;
  274.     new_sad4b;
  275. pextrw eax, mm2, 0
  276.     pop edi
  277.     pop esi
  278.     pop ebx
  279.     ret
  280.     
  281. ;======================================================
  282. ;
  283. ; uint32_t 
  284. ; T264_sad_u_4x4_sse(uint8_t* src, int32_t src_stride, uint8_t* data, int32_t dst_stride);
  285. ;
  286. ;======================================================
  287. align 16
  288. cglobal T264_sad_u_4x4_sse
  289. T264_sad_u_4x4_sse
  290.     
  291.     push ebx
  292.     push esi
  293.     push edi
  294.     
  295.     mov esi, [esp + 4 + 12]      ; src
  296.     mov ebx, [esp + 8 + 12]      ; src_stride
  297.     mov edi, [esp + 12+ 12]      ; data
  298.     mov edx, [esp + 16+ 12]      ; dst_stride
  299.     movq mm3, [mmx_mask01]
  300.     
  301.     pxor mm2, mm2
  302.     
  303.     new_sad4b;
  304.     new_sad4b;
  305.     new_sad4b;
  306.     new_sad4b;
  307. pextrw eax, mm2, 0
  308.     pop edi
  309.     pop esi
  310.     pop ebx
  311.     ret