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

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. ; *   2004-2005 Cloud Wu <sywu@sohu.com> 
  8. ; * 2004 CloudWu create this file
  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  22. ; *
  23. ; ****************************************************************************/
  24. bits 32
  25. ; ideal from xvid
  26. ; modify by Thomascatlee@163.com
  27. ; for GCC
  28. %macro cglobal 1
  29. %ifdef NOPREFIX
  30. global %1
  31. %else
  32. global _%1
  33. %define %1 _%1
  34. %endif
  35. %endmacro
  36. ; %1 = src, %2 = dest MMX reg ,%3 MMX temp register
  37. %macro expand8to16_4_mmx 3
  38.     movd %2,[%1]
  39. movq %3,%2
  40. PXOR %3,%2
  41. PUNPCKLBW %2,%3
  42. %endmacro
  43. ; %1 = src, %2 = dst
  44. %macro contract16to8_4_mmx 2
  45.     movq mm0,[%1]
  46.     packuswb mm0, mm1
  47.     movd [%2],mm0
  48. %endmacro
  49. ; %1 = src, %2 = dst
  50. %macro contract16to8_8_mmx 2
  51.     movq mm0,[%1]
  52. movq mm1,[%1 + 8] ;fetch next 4 int16
  53.     packuswb mm0, mm1
  54.     movq [%2],mm0
  55.     ;movd   %3, %4
  56. %endmacro
  57. ; %1 = src, %2 = pred, %3 =dst
  58. %macro contract16to8add_4_mmx 3
  59.     movq mm0,[%1]
  60. movd mm2,[%2]
  61.     packuswb mm0, mm1
  62. movq mm1,[%1 + 8] ;fetch next 4 int16
  63.     packuswb mm0, mm1
  64.     movq [%3],mm0
  65. %endmacro
  66. section .text
  67. ;======================================================
  68. ;
  69. ; uint32_t 
  70. ; contract16to8_4x4_mmx(uint16_t* src, int32_t src_stride, uint8_t* dst, int32_t dst_stride);
  71. ;
  72. ;======================================================
  73. align 16
  74. cglobal contract16to8_4x4_mmx
  75. contract16to8_4x4_mmx    
  76.     push ebx
  77.     push esi
  78.     push edi
  79.     
  80.     mov esi, [esp + 4 + 12]     ; src
  81.     mov edi, [esp + 12 + 12]    ; dst
  82. contract16to8_8_mmx esi , edi 
  83. mov ebx, [esp + 8 + 12] ;src_stride 
  84. shl ebx, 2 ;as is int16_t
  85. add esi, ebx ;[esp + 8 + 12] ; src + src_stride * 2
  86. mov ebx, [esp + 16 + 12] ;dst_stride
  87. shl ebx, 1 ;as we process 8 elements
  88. add edi, ebx ;dst + dst_stride 
  89. contract16to8_8_mmx esi , edi 
  90.     pop edi
  91.     pop esi
  92.     pop ebx
  93.     ret
  94. ;======================================================
  95. ;
  96. ; void 
  97. ; contract16to8add_4x4_mmx(uint16_t* src,uint8_t* pred, int32_t pred_stride,uint8_t* dst, int32_t dst_stride);
  98. ;
  99. ;======================================================
  100. align 16
  101. cglobal contract16to8add_4x4_mmx
  102. contract16to8add_4x4_mmx    
  103.     push ebx
  104.     push esi
  105.     push edi
  106. push edx
  107. push ecx
  108.   push eax
  109.    
  110.     mov esi, [esp + 4 + 24]     ; src
  111.     mov ebx, [esp + 8 + 24] ; pred
  112. mov eax, [esp + 12 + 24]    ; pred_stride
  113. mov edi, [esp + 16 + 24]    ; dst
  114. mov edx, [esp + 20 + 24]    ; dst_stride
  115. mov ecx,2
  116. .Loop
  117. expand8to16_4_mmx ebx , mm0 , mm1 ;now int16 pred is in mm0
  118. movq mm2,[esi]
  119. PADDSW  mm2,mm0 ;save 4 int16 result
  120. add esi,8 ;advance 4 int16
  121. add ebx,eax
  122. expand8to16_4_mmx ebx , mm0 , mm1 ;now int16 pred is in mm0
  123. movq mm3,[esi]
  124. PADDSW  mm3,mm0 ;save 4 int16 result
  125. PACKUSWB mm2,mm3
  126. movd [edi],mm2
  127. add edi,edx ;add dst_stride
  128. psrlq mm2,32 ;right shift 32bits
  129. movd [edi],mm2
  130. add ebx,eax
  131. add edi,edx ;add dst_stride
  132. add esi,8 ;advance 4 int16
  133. sub ecx,1
  134. jnz .Loop
  135. pop eax
  136. pop ecx
  137. pop edx
  138.     pop edi
  139.     pop esi
  140.     pop ebx
  141.     retn 20
  142. ;======================================================
  143. ;
  144. ; void 
  145. ; expand8to16sub_4x4_mmx(uint8_t* pred,int32_t pred_stride,int8_t* src,int32_t src_stride,uint16_t* dst);
  146. ;
  147. ;======================================================
  148. align 16
  149. cglobal expand8to16sub_4x4_mmx
  150. expand8to16sub_4x4_mmx    
  151.     push ebx
  152.     push esi
  153.     push edi
  154. push edx
  155. push ecx
  156.   push eax
  157.    
  158.     mov esi, [esp + 4 + 24]     ; pred 
  159.     mov ebx, [esp + 8 + 24] ; pred_stride
  160. mov eax, [esp + 12 + 24]    ; src
  161. mov edx, [esp + 16 + 24]    ; src_stride
  162. mov edi, [esp + 20 + 24]    ; dst
  163. mov ecx,4
  164. .Loop
  165. expand8to16_4_mmx esi , mm0 , mm1 ;now int16 pred is in mm0
  166. expand8to16_4_mmx eax , mm2 , mm1 ;now int16 src is in mm2
  167. ;movq mm2,[esi]
  168. PSUBSW  mm2,mm0 ;save 4 int16 result <src - pred>
  169. movq [edi],mm2
  170. add esi,ebx ;8 ; advance pred_stride
  171. add eax,edx ; + src_stride
  172. add edi,8 ;add 4 int16
  173. sub ecx,1
  174. jnz .Loop
  175. pop eax
  176. pop ecx
  177. pop edx
  178.     pop edi
  179.     pop esi
  180.     pop ebx
  181.     retn 20
  182. ;======================================================
  183. ;
  184. ; uint32_t 
  185. ; contract16to8_mmx(int16_t* src, int32_t quarter_width, int32_t quarter_height, uint8_t* dst, int32_t dst_stride);
  186. ;
  187. ;======================================================
  188. align 16
  189. cglobal contract16to8_mmx
  190. contract16to8_mmx
  191.     push esi
  192.     push edi
  193.     mov esi, [esp + 4 + 8]      ; src
  194.     ;mov edx, [esp + 8 + 8]      ; quarter_width
  195.     mov ecx, [esp + 12 + 8]     ; quarter_height
  196. mov edi, [esp + 16 + 8]     ; dst
  197. mov ebx, [esp + 20 + 8]     ; dst_stride
  198. mov eax,edx
  199. shl eax,2 ;4 * quarter_width
  200. shl ecx,2 ;quarter_height * 4
  201. .LoopFirst
  202. mov edx,[esp + 8 + 8]
  203. .LoopSecond
  204. contract16to8_4_mmx esi,edi
  205. add esi,8 ; 4 int16
  206. add edi,4 ; 4 uint8
  207. sub edx,1
  208. jnz .LoopSecond
  209. sub edi,eax ;4
  210. add edi,ebx ;dst+dst_stride
  211. sub ecx,1
  212. jnz .LoopFirst ;outer
  213. EMMS
  214.     pop edi
  215.     pop esi
  216.     ret
  217.  
  218. ;======================================================
  219. ;
  220. ; void 
  221. ; contract16to8add_mmx(int16_t* src, int32_t quarter_width, int32_t quarter_height, uint8_t* pred, uint8_t* dst, int32_t dst_stride)
  222. ;
  223. ;======================================================
  224. align 16
  225. cglobal contract16to8add_mmx
  226. contract16to8add_mmx
  227.     push esi
  228.     push edi
  229. push ebp
  230. push edx
  231. push ecx
  232. push ebx
  233.   push eax
  234.     
  235. mov esi, [esp + 4 + 28]      ; src
  236.     mov eax, [esp + 8 + 28]      ; quarter_width
  237.     mov ecx, [esp + 12 + 28]     ; quarter_height
  238. mov ebx, [esp + 16 + 28]     ; pred
  239. mov edi, [esp + 20 + 28]     ; dst
  240. mov ebp, [esp + 24 + 28]     ; dst_stride
  241. .LoopFirst
  242. mov edx,[esp + 12 + 28] ;quarter_height
  243. .LoopSecond
  244. push ebp ;dst_stride
  245. mov eax, [esp + 12 + 28] ;quarter_width
  246. push edi
  247. shl eax,2 ;quarter_width * 4
  248. push eax
  249. push ebx
  250. push esi
  251. call contract16to8add_4x4_mmx
  252. add esi,32 ; 4x4 int16
  253. add ebx,4 ; 4 uint8
  254. add edi,4 ; 4 uint8
  255. sub edx,1
  256. jnz .LoopSecond
  257. mov eax, [esp + 8 + 28]
  258. shl eax,2 ;4 * quaterwidth
  259. sub edi,eax ;update dest
  260. mov eax, [esp + 24 + 28]
  261. shl eax,2 ;4 * dst_stride
  262. add edi,eax ;add 4*dst_stride
  263. mov eax, [esp + 8 + 28] ;quaterwidth
  264. shl eax,2 ;4 * quaterwidth
  265. sub ebx,eax
  266. shl eax,2
  267. add ebx,eax ;update pred
  268. sub ecx,1
  269. jnz .LoopFirst ;outer
  270. EMMS
  271. pop eax
  272. pop ebx
  273. pop ecx
  274. pop edx
  275. pop ebp
  276.     pop edi
  277.     pop esi
  278. ret
  279. ;======================================================
  280. ;
  281. ; void 
  282. ; expand8to16sub_mmx(uint8_t* pred, int32_t quarter_width, int32_t quarter_height, uint8_t* dst , int16_t* src, int32_t src_stride)
  283. ;
  284. ;======================================================
  285. align 16
  286. cglobal expand8to16sub_mmx
  287. expand8to16sub_mmx
  288.     push esi
  289.     push edi
  290. push ebp
  291. push edx
  292. push ecx
  293. push ebx
  294.   push eax
  295.     
  296. mov esi, [esp + 20 + 28]      ; src
  297.     mov eax, [esp + 8 + 28]      ; quarter_width
  298.     mov ecx, [esp + 12 + 28]     ; quarter_height
  299. mov ebx, [esp + 4 + 28]     ; pred
  300. mov edi, [esp + 16 + 28]     ; dst
  301. mov ebp, [esp + 24 + 28]     ; src_stride
  302. .LoopFirst
  303. mov edx,[esp + 12 + 28] ;quarter_height
  304. .LoopSecond
  305. mov eax, [esp + 8 + 28] ;quarter_width
  306. push edi ;dst
  307. push ebp ;src_stride
  308. push esi ;src
  309. shl eax,2 ;quarter_width * 4
  310. push eax ;pred-stride
  311. push ebx ;pred
  312. call expand8to16sub_4x4_mmx
  313. add esi,4 ;32 ; 4x4 int16
  314. add ebx,4 ; 4 uint8
  315. add edi,32 ;4 ; 16 int16
  316. sub edx,1
  317. jnz .LoopSecond
  318. mov eax, [esp + 8 + 28]
  319. shl eax,2 ;4 * quaterwidth
  320. sub esi,eax ;update dest
  321. mov eax, [esp + 24 + 28] ;src_stride
  322. shl eax,2 ;4 * src_stride
  323. add esi,eax ;add 4*src_stride
  324. mov eax, [esp + 8 + 28] ;quaterwidth
  325. shl eax,2 ;4 * quaterwidth
  326. sub ebx,eax
  327. shl eax,2
  328. add ebx,eax ;update pred
  329. sub ecx,1
  330. jnz .LoopFirst ;outer
  331. EMMS
  332. pop eax
  333. pop ebx
  334. pop ecx
  335. pop edx
  336. pop ebp
  337.     pop edi
  338.     pop esi
  339. ret