mcomp_mmx.asm
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:7k
源码类别:

Windows CE

开发平台:

C/C++

  1. ;*****************************************************************************
  2. ;*
  3. ;* This program is free software ; you can redistribute it and/or modify
  4. ;* it under the terms of the GNU General Public License as published by
  5. ;* the Free Software Foundation; either version 2 of the License, or
  6. ;* (at your option) any later version.
  7. ;*
  8. ;* This program is distributed in the hope that it will be useful,
  9. ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. ;* GNU General Public License for more details.
  12. ;*
  13. ;* You should have received a copy of the GNU General Public License
  14. ;* along with this program; if not, write to the Free Software
  15. ;* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  16. ;*
  17. ;* $Id: mcomp_mmx.asm 327 2005-11-04 07:09:17Z picard $
  18. ;*
  19. ;* The Core Pocket Media Player
  20. ;* Copyright (c) 2004-2005 Gabor Kovacs
  21. ;*
  22. ;*****************************************************************************
  23. BITS 32
  24. SECTION .text
  25. %macro cglobal 2
  26. %define %1 _%1@%2
  27. global %1
  28. %endmacro
  29. cglobal EMMS,0
  30. cglobal AddBlock,12
  31. cglobal AddBlockHor,12
  32. cglobal AddBlockVer,12
  33. cglobal AddBlockHorVer,12
  34. cglobal CopyBlockM,16
  35. cglobal CopyBlock,16
  36. cglobal CopyBlockHor,16
  37. cglobal CopyBlockVer,16
  38. cglobal CopyBlockHorVer,16 
  39. cglobal CopyBlockHorRound,16
  40. cglobal CopyBlockVerRound,16 
  41. cglobal CopyBlockHorVerRound,16
  42. ALIGN 16
  43. EMMS:
  44. emms
  45. ret 0
  46. %macro loadparam 1
  47. mov esi,[esp+12] ;src
  48. mov edi,[esp+12+4] ;dst
  49. mov eax,[esp+12+8] ;src pitch
  50. %if %1>0
  51. mov edx,8 ;dst pitch (fixed for AddBlock)
  52. %else
  53. mov edx,[esp+12+12] ;dst pitch
  54. %endif
  55. %endmacro
  56. %macro loadmask1 0
  57. mov ecx,0x01010101
  58. movd mm6,ecx
  59. pcmpeqb mm7,mm7
  60. punpckldq mm6,mm6
  61. pxor mm7,mm6
  62. %endmacro
  63. %macro loadmask4 0
  64. mov ecx,0x03030303
  65. movd mm6,ecx
  66. pcmpeqb mm7,mm7
  67. punpckldq mm6,mm6
  68. pxor mm7,mm6
  69. %endmacro
  70. %macro load1 2
  71. movq mm0,[esi+%1]
  72. %if %2>0
  73. add esi,eax
  74. %endif
  75. movq mm1,mm0
  76. pand mm1,mm7
  77. psrlq mm1,1
  78. %endmacro
  79. %macro load2 2
  80. movq mm2,[esi+%1]
  81. %if %2>0
  82. add esi,eax
  83. %endif
  84. movq mm3,mm2
  85. pand mm3,mm7
  86. psrlq mm3,1
  87. %endmacro
  88. %macro load1hv 0
  89. movq mm0,[esi]
  90. movq mm4,[esi+1]
  91. add esi,eax
  92. movq mm1,mm0
  93. movq mm5,mm4
  94. pand mm0,mm6
  95. pand mm4,mm6
  96. pand mm1,mm7
  97. pand mm5,mm7
  98. psrlq mm1,2
  99. psrlq mm5,2
  100. paddb mm0,mm4
  101. paddb mm1,mm5
  102. %endmacro
  103. %macro load2hv 0
  104. movq mm2,[esi]
  105. movq mm4,[esi+1]
  106. add esi,eax
  107. movq mm3,mm2
  108. movq mm5,mm4
  109. pand mm2,mm6
  110. pand mm4,mm6
  111. pand mm3,mm7
  112. pand mm5,mm7
  113. psrlq mm3,2
  114. psrlq mm5,2
  115. paddb mm2,mm4
  116. paddb mm3,mm5
  117. %endmacro
  118. %macro avg1 0
  119. por mm0,mm2
  120. pand mm0,mm6
  121. paddb mm0,mm1
  122. paddb mm0,mm3
  123. %endmacro
  124. %macro avg2 0
  125. por mm2,mm0
  126. pand mm2,mm6
  127. paddb mm2,mm3
  128. paddb mm2,mm1
  129. %endmacro
  130. %macro avground1 0
  131. pand mm0,mm2
  132. pand mm0,mm6
  133. paddb mm0,mm1
  134. paddb mm0,mm3
  135. %endmacro
  136. %macro avground2 0
  137. pand mm2,mm0
  138. pand mm2,mm6
  139. paddb mm2,mm3
  140. paddb mm2,mm1
  141. %endmacro
  142. %macro save1 0
  143. movq [edi],mm0
  144. add edi,edx
  145. %endmacro
  146. %macro save2 0
  147. movq [edi],mm2
  148. add edi,edx
  149. %endmacro
  150. %macro saveadd1 0
  151. movq mm4,[edi]
  152. movq mm1,mm0
  153. pand mm0,mm7
  154. por mm1,mm4
  155. pand mm4,mm7
  156. pand mm1,mm6
  157. psrlq mm0,1
  158. psrlq mm4,1
  159. paddb mm1,mm0
  160. paddb mm1,mm4
  161. movq [edi],mm1
  162. add edi,edx
  163. %endmacro
  164. %macro saveadd2 0
  165. movq mm4,[edi]
  166. movq mm3,mm2
  167. pand mm2,mm7
  168. por mm3,mm4
  169. pand mm4,mm7
  170. pand mm3,mm6
  171. psrlq mm2,1
  172. psrlq mm4,1
  173. paddb mm3,mm2
  174. paddb mm3,mm4
  175. movq [edi],mm3
  176. add edi,edx
  177. %endmacro
  178. ALIGN 16
  179. CopyBlock:
  180. push esi
  181. push edi
  182. loadparam 0
  183. %rep 4
  184. movq mm0,[esi]
  185. movq mm1,[esi+eax]
  186. lea esi,[esi+eax*2]
  187. movq [edi],mm0
  188. movq [edi+edx],mm1
  189. lea edi,[edi+edx*2]
  190. %endrep
  191. pop edi
  192. pop esi 
  193. ret 16
  194. ALIGN 16
  195. CopyBlockM:
  196. push esi
  197. push edi
  198. loadparam 0
  199. %rep 8
  200. movq mm0,[esi]
  201. movq mm1,[esi+8]
  202. movq mm2,[esi+eax]
  203. movq mm3,[esi+eax+8]
  204. lea esi,[esi+eax*2]
  205. movq [edi],mm0
  206. movq [edi+8],mm1
  207. movq [edi+edx],mm2
  208. movq [edi+edx+8],mm3
  209. lea edi,[edi+edx*2]
  210. %endrep
  211. pop edi
  212. pop esi 
  213. ret 16
  214. ALIGN 16
  215. CopyBlockHor:
  216. push esi
  217. push edi
  218. loadparam 0
  219. loadmask1
  220. %rep 8
  221. load1 0,0
  222. load2 1,1
  223. avg1
  224. save1
  225. %endrep
  226. pop edi
  227. pop esi 
  228. ret 16
  229. ALIGN 16
  230. CopyBlockVer:
  231. push esi
  232. push edi
  233. loadparam 0
  234. loadmask1
  235. load1 0,1
  236. %rep 4 
  237. load2 0,1
  238. avg1
  239. save1
  240. load1 0,1
  241. avg2
  242. save2
  243. %endrep
  244. pop edi
  245. pop esi 
  246. ret 16
  247. ALIGN 16
  248. CopyBlockHorVer:
  249. push esi
  250. push edi
  251. loadparam 0
  252. loadmask4
  253. load1hv
  254. %rep 4
  255. load2hv
  256. pcmpeqb mm4,mm4 ;-1
  257. paddb mm0,mm2
  258. paddb mm4,mm4 ;-2
  259. paddb mm1,mm3
  260. psubb mm0,mm4 ;+2
  261. pand mm0,mm7
  262. psrlq mm0,2
  263. paddb mm0,mm1
  264. save1
  265. load1hv
  266. pcmpeqb mm4,mm4 ;-1
  267. paddb mm2,mm0
  268. paddb mm4,mm4 ;-2
  269. paddb mm3,mm1
  270. psubb mm2,mm4 ;+2
  271. pand mm2,mm7
  272. psrlq mm2,2
  273. paddb mm2,mm3
  274. save2
  275. %endrep
  276. pop edi
  277. pop esi 
  278. ret 16
  279. ALIGN 16
  280. CopyBlockHorRound:
  281. push esi
  282. push edi
  283. loadparam 0
  284. loadmask1
  285. %rep 8
  286. load1 0,0
  287. load2 1,1
  288. avground1
  289. save1
  290. %endrep
  291. pop edi
  292. pop esi 
  293. ret 16
  294. ALIGN 16
  295. CopyBlockVerRound:
  296. push esi
  297. push edi
  298. loadparam 0
  299. loadmask1
  300. load1 0,1
  301. %rep 4 
  302. load2 0,1
  303. avground1
  304. save1
  305. load1 0,1
  306. avground2
  307. save2
  308. %endrep
  309. pop edi
  310. pop esi 
  311. ret 16
  312. ALIGN 16
  313. CopyBlockHorVerRound:
  314. push esi
  315. push edi
  316. loadparam 0
  317. loadmask4
  318. load1hv
  319. %rep 4
  320. load2hv
  321. pcmpeqb mm4,mm4 ;-1
  322. paddb mm0,mm2
  323. paddb mm1,mm3
  324. psubb mm0,mm4 ;+1
  325. pand mm0,mm7
  326. psrlq mm0,2
  327. paddb mm0,mm1
  328. save1
  329. load1hv
  330. pcmpeqb mm4,mm4 ;-1
  331. paddb mm2,mm0
  332. paddb mm3,mm1
  333. psubb mm2,mm4 ;+1
  334. pand mm2,mm7
  335. psrlq mm2,2
  336. paddb mm2,mm3
  337. save2
  338. %endrep
  339. pop edi
  340. pop esi 
  341. ret 16
  342. ALIGN 16
  343. AddBlock:
  344. push esi
  345. push edi
  346. loadparam 1
  347. loadmask1
  348. %rep 8
  349. movq mm0,[esi]
  350. add esi,eax
  351. saveadd1
  352. %endrep
  353. pop edi
  354. pop esi 
  355. ret 12
  356. ALIGN 16
  357. AddBlockHor:
  358. push esi
  359. push edi
  360. loadparam 1
  361. loadmask1
  362. %rep 8
  363. load1 0,0
  364. load2 1,1
  365. avg1
  366. saveadd1
  367. %endrep
  368. pop edi
  369. pop esi 
  370. ret 12
  371. ALIGN 16
  372. AddBlockVer:
  373. push esi
  374. push edi
  375. loadparam 1
  376. loadmask1
  377. load1 0,1
  378. %rep 4 
  379. load2 0,1
  380. avg1
  381. saveadd1
  382. load1 0,1
  383. avg2
  384. saveadd2
  385. %endrep
  386. pop edi
  387. pop esi 
  388. ret 12
  389. ALIGN 16
  390. AddBlockHorVer:
  391. push esi
  392. push edi
  393. loadparam 1
  394. loadmask4
  395. load1hv
  396. %rep 4
  397. load2hv
  398. pcmpeqb mm5,mm5 ;-1
  399. paddb mm0,mm2
  400. paddb mm5,mm5 ;-2
  401. paddb mm1,mm3
  402. psubb mm0,mm5 ;+=2
  403. pand mm0,mm7
  404. psrlq mm0,2
  405. paddb mm0,mm1
  406. paddb mm6,mm5 ;0x03-2=0x01
  407. psubb mm7,mm5 ;0xFD+2=0xFF
  408. saveadd1
  409. psubb mm6,mm5 ;restore mask
  410. paddb mm7,mm5 ;restore mask
  411. load1hv
  412. pcmpeqb mm5,mm5 ;-1
  413. paddb mm2,mm0
  414. paddb mm5,mm5 ;-2
  415. paddb mm3,mm1
  416. psubb mm2,mm5 ;+=2
  417. pand mm2,mm7
  418. psrlq mm2,2
  419. paddb mm2,mm3
  420. paddb mm6,mm5 ;0x03-2=0x01
  421. psubb mm7,mm5 ;0xFD+2=0xFF
  422. saveadd2
  423. psubb mm6,mm5 ;restore mask
  424. paddb mm7,mm5 ;restore mask
  425. %endrep
  426. pop edi
  427. pop esi 
  428. ret 12