mem_transfer_mmx.asm
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:9k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. ;/**************************************************************************
  2. ; *
  3. ; * XVID MPEG-4 VIDEO CODEC
  4. ; * mmx 8bit<->16bit transfers
  5. ; *
  6. ; * This program is an implementation of a part of one or more MPEG-4
  7. ; * Video tools as specified in ISO/IEC 14496-2 standard.  Those intending
  8. ; * to use this software module in hardware or software products are
  9. ; * advised that its use may infringe existing patents or copyrights, and
  10. ; * any such use would be at such party's own risk.  The original
  11. ; * developer of this software module and his/her company, and subsequent
  12. ; * editors and their companies, will have no liability for use of this
  13. ; * software or modifications or derivatives thereof.
  14. ; *
  15. ; * This program is free software; you can redistribute it and/or modify
  16. ; * it under the terms of the GNU General Public License as published by
  17. ; * the Free Software Foundation; either version 2 of the License, or
  18. ; * (at your option) any later version.
  19. ; *
  20. ; * This program is distributed in the hope that it will be useful,
  21. ; * but WITHOUT ANY WARRANTY; without even the implied warranty of
  22. ; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  23. ; * GNU General Public License for more details.
  24. ; *
  25. ; * You should have received a copy of the GNU General Public License
  26. ; * along with this program; if not, write to the Free Software
  27. ; * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  28. ; *
  29. ; *************************************************************************/
  30. ;/**************************************************************************
  31. ; *
  32. ; * History:
  33. ; *
  34. ; * 07.01.2002 merge functions from compensate_mmx; rename functions
  35. ; * 07.11.2001 initial version; (c)2001 peter ross <pross@cs.rmit.edu.au>
  36. ; *
  37. ; *************************************************************************/
  38. bits 32
  39. %macro cglobal 1 
  40. %ifdef PREFIX
  41. global _%1 
  42. %define %1 _%1
  43. %else
  44. global %1
  45. %endif
  46. %endmacro
  47. section .text
  48. ;===========================================================================
  49. ;
  50. ; void transfer_8to16copy_mmx(int16_t * const dst,
  51. ; const uint8_t * const src,
  52. ; uint32_t stride);
  53. ;
  54. ;===========================================================================
  55. align 16
  56. cglobal transfer_8to16copy_mmx
  57. transfer_8to16copy_mmx
  58. push esi
  59. push edi
  60. mov edi, [esp + 8 + 4] ; dst
  61. mov esi, [esp + 8 + 8] ; src
  62. mov ecx, [esp + 8 + 12] ; stride
  63. pxor mm7, mm7 ; mm7 = zero
  64. mov eax, 8
  65. .loop
  66. movq mm0, [esi]
  67. movq mm1, mm0
  68. punpcklbw mm0, mm7 ; mm01 = unpack([src])
  69. punpckhbw mm1, mm7
  70. movq [edi], mm0 ; [dst] = mm01
  71. movq [edi + 8], mm1
  72. add edi, 16
  73. add esi, ecx
  74. dec eax
  75. jnz .loop
  76. pop edi
  77. pop esi
  78. ret
  79. ;===========================================================================
  80. ;
  81. ; void transfer_16to8copy_mmx(uint8_t * const dst,
  82. ; const int16_t * const src,
  83. ; uint32_t stride);
  84. ;
  85. ;===========================================================================
  86. align 16
  87. cglobal transfer_16to8copy_mmx
  88. transfer_16to8copy_mmx
  89. push esi
  90. push edi
  91. mov edi, [esp + 8 + 4] ; dst
  92. mov esi, [esp + 8 + 8] ; src
  93. mov ecx, [esp + 8 + 12] ; stride
  94. mov eax, 8
  95. .loop
  96. movq mm0, [esi]
  97. packuswb mm0, [esi + 8] ; mm0 = pack([src])
  98. movq [edi], mm0 ; [dst] = mm0
  99. add esi, 16
  100. add edi, ecx
  101. dec eax
  102. jnz .loop
  103. pop edi
  104. pop esi
  105. ret
  106. ;===========================================================================
  107. ;
  108. ; void transfer_8to16sub_mmx(int16_t * const dct,
  109. ; uint8_t * const cur,
  110. ; const uint8_t * const ref,
  111. ; const uint32_t stride);
  112. ;
  113. ;===========================================================================
  114. ;/**************************************************************************
  115. ; *
  116. ; * History:
  117. ; *
  118. ; * 27.12.2001 renamed from 'compensate' to 'transfer_8to16sub'
  119. ; * 02.12.2001  loop unrolled, code runs 10% faster now (Isibaar)
  120. ; * 30.11.2001  16 pixels are processed per iteration (Isibaar)
  121. ; * 30.11.2001 .text missing
  122. ; * 06.11.2001 inital version; (c)2001 peter ross <pross@cs.rmit.edu.au>
  123. ; *
  124. ; *************************************************************************/
  125. align 16
  126. cglobal transfer_8to16sub_mmx
  127. transfer_8to16sub_mmx
  128. push esi
  129. push edi
  130. push    ebx
  131. mov edi, [esp + 12 + 4] ; dct [out]
  132. mov edx, [esp + 12 + 8] ; cur [in/out]
  133. mov esi, [esp + 12 + 12] ; ref [in]
  134. mov ecx, [esp + 12 + 16] ; stride [in]
  135. mov eax, edx ; cur -> eax
  136. mov ebx, esi ; ref -> ebx
  137. add eax, ecx ; cur + stride
  138. add ebx, ecx ; ref + stride
  139. shl ecx, 1
  140. pxor mm7, mm7 ; mm7 = zero
  141. movq mm0, [edx] ; mm01 = [cur]
  142. movq mm1, mm0
  143. punpcklbw mm0, mm7
  144. punpckhbw mm1, mm7
  145. movq mm4, [eax]
  146. movq mm5, mm4
  147. punpcklbw mm4, mm7
  148. punpckhbw mm5, mm7
  149. movq mm2, [esi] ; mm23 = [ref]
  150. movq mm3, mm2
  151. movq mm6, [ebx]
  152. movq [edx], mm2 ; [cur] = [ref]
  153. movq [eax], mm6
  154. punpcklbw mm2, mm7
  155. punpckhbw mm3, mm7
  156. psubsw mm0, mm2 ; mm01 -= mm23
  157. movq mm2, mm6
  158. punpcklbw mm2, mm7
  159. punpckhbw mm6, mm7
  160. psubsw mm1, mm3
  161. psubsw mm4, mm2
  162. psubsw mm5, mm6
  163. movq [edi], mm0 ; dct[] = mm01
  164. movq [edi + 8], mm1
  165. movq [edi + 16], mm4
  166. movq [edi + 24], mm5
  167. add edx, ecx
  168. add esi, ecx
  169. add eax, ecx
  170. add ebx, ecx
  171. movq mm0, [edx] ; mm01 = [cur]
  172. movq mm1, mm0
  173. punpcklbw mm0, mm7
  174. punpckhbw mm1, mm7
  175. movq mm4, [eax]
  176. movq mm5, mm4
  177. punpcklbw mm4, mm7
  178. punpckhbw mm5, mm7
  179. movq mm2, [esi] ; mm23 = [ref]
  180. movq mm3, mm2
  181. movq mm6, [ebx]
  182. movq [edx], mm2 ; [cur] = [ref]
  183. movq [eax], mm6
  184. punpcklbw mm2, mm7
  185. punpckhbw mm3, mm7
  186. psubsw mm0, mm2 ; mm01 -= mm23
  187. movq mm2, mm6
  188. punpcklbw mm2, mm7
  189. punpckhbw mm6, mm7
  190. psubsw mm1, mm3
  191. psubsw mm4, mm2
  192. psubsw mm5, mm6
  193. movq [edi + 32], mm0 ; dct[] = mm01
  194. movq [edi + 40], mm1
  195. movq [edi + 48], mm4
  196. movq [edi + 56], mm5
  197. add edx, ecx
  198. add esi, ecx
  199. add eax, ecx
  200. add ebx, ecx
  201. movq mm0, [edx] ; mm01 = [cur]
  202. movq mm1, mm0
  203. punpcklbw mm0, mm7
  204. punpckhbw mm1, mm7
  205. movq mm4, [eax]
  206. movq mm5, mm4
  207. punpcklbw mm4, mm7
  208. punpckhbw mm5, mm7
  209. movq mm2, [esi] ; mm23 = [ref]
  210. movq mm3, mm2
  211. movq mm6, [ebx]
  212. movq [edx], mm2 ; [cur] = [ref]
  213. movq [eax], mm6
  214. punpcklbw mm2, mm7
  215. punpckhbw mm3, mm7
  216. psubsw mm0, mm2 ; mm01 -= mm23
  217. movq mm2, mm6
  218. punpcklbw mm2, mm7
  219. punpckhbw mm6, mm7
  220. psubsw mm1, mm3
  221. psubsw mm4, mm2
  222. psubsw mm5, mm6
  223. movq [edi + 64], mm0 ; dct[] = mm01
  224. movq [edi + 72], mm1
  225. movq [edi + 80], mm4
  226. movq [edi + 88], mm5
  227. add edx, ecx
  228. add esi, ecx
  229. add eax, ecx
  230. add ebx, ecx
  231. movq mm0, [edx] ; mm01 = [cur]
  232. movq mm1, mm0
  233. punpcklbw mm0, mm7
  234. punpckhbw mm1, mm7
  235. movq mm4, [eax]
  236. movq mm5, mm4
  237. punpcklbw mm4, mm7
  238. punpckhbw mm5, mm7
  239. movq mm2, [esi] ; mm23 = [ref]
  240. movq mm3, mm2
  241. movq mm6, [ebx]
  242. movq [edx], mm2 ; [cur] = [ref]
  243. movq [eax], mm6
  244. punpcklbw mm2, mm7
  245. punpckhbw mm3, mm7
  246. psubsw mm0, mm2 ; mm01 -= mm23
  247. movq mm2, mm6
  248. punpcklbw mm2, mm7
  249. punpckhbw mm6, mm7
  250. psubsw mm1, mm3
  251. psubsw mm4, mm2
  252. psubsw mm5, mm6
  253. movq [edi + 96], mm0 ; dct[] = mm01
  254. movq [edi + 104], mm1
  255. movq [edi + 112], mm4
  256. movq [edi + 120], mm5
  257. pop ebx
  258. pop edi
  259. pop esi
  260. ret
  261. ;===========================================================================
  262. ;
  263. ; void transfer_16to8add_mmx(uint8_t * const dst,
  264. ; const int16_t * const src,
  265. ; uint32_t stride);
  266. ;
  267. ;===========================================================================
  268. align 16
  269. cglobal transfer_16to8add_mmx
  270. transfer_16to8add_mmx
  271. push esi
  272. push edi
  273. mov edi, [esp + 8 + 4] ; dst
  274. mov esi, [esp + 8 + 8] ; src
  275. mov ecx, [esp + 8 + 12] ; stride
  276. pxor mm7, mm7
  277. mov eax, 8
  278. .loop
  279. movq mm0, [edi]
  280. movq mm1, mm0
  281. punpcklbw mm0, mm7 ; mm23 = unpack([dst])
  282. punpckhbw mm1, mm7
  283. movq mm2, [esi] ; mm01 = [src]
  284. movq mm3, [esi + 8]
  285. paddsw mm0, mm2 ; mm01 += mm23
  286. paddsw mm1, mm3
  287. packuswb mm0, mm1 ; [dst] = pack(mm01)
  288. movq [edi], mm0
  289. add esi, 16
  290. add edi, ecx
  291. dec eax
  292. jnz .loop
  293. pop edi
  294. pop esi
  295. ret
  296. ;===========================================================================
  297. ;
  298. ; void transfer8x8_copy_mmx(uint8_t * const dst,
  299. ; const uint8_t * const src,
  300. ; const uint32_t stride);
  301. ;
  302. ;
  303. ;===========================================================================
  304. align 16
  305. cglobal transfer8x8_copy_mmx
  306. transfer8x8_copy_mmx
  307. push esi
  308. push edi
  309. mov edi, [esp + 8 + 4] ; dst [out]
  310. mov esi, [esp + 8 + 8] ; src [in]
  311. mov eax, [esp + 8 + 12] ; stride [in]
  312. movq mm0, [esi]
  313. movq mm1, [esi+eax]
  314. movq [edi], mm0
  315. movq [edi+eax], mm1
  316. add esi, eax
  317. add edi, eax
  318. add esi, eax
  319. add edi, eax
  320. movq mm0, [esi]
  321. movq mm1, [esi+eax]
  322. movq [edi], mm0
  323. movq [edi+eax], mm1
  324. add esi, eax
  325. add edi, eax
  326. add esi, eax
  327. add edi, eax
  328. movq mm0, [esi]
  329. movq mm1, [esi+eax]
  330. movq [edi], mm0
  331. movq [edi+eax], mm1
  332. add esi, eax
  333. add edi, eax
  334. add esi, eax
  335. add edi, eax
  336. movq mm0, [esi]
  337. movq mm1, [esi+eax]
  338. movq [edi], mm0
  339. movq [edi+eax], mm1
  340. add esi, eax
  341. add edi, eax
  342. add esi, eax
  343. add edi, eax
  344. pop edi
  345. pop esi
  346. ret