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

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 323 2005-11-01 20:52:32Z picard $
  18. ;*
  19. ;* The Core Pocket Media Player
  20. ;* Copyright (c) 2004-2005 Gabor Kovacs
  21. ;*
  22. ;*****************************************************************************
  23. BITS 32
  24. %if 0
  25. SECTION .rdata
  26. round7: dd 07070707h,07070707h
  27. round8: dd 08080808h,08080808h
  28. SECTION .text
  29. %macro cglobal 2
  30. %define %1 _%1@%2
  31. global %1
  32. %endmacro
  33. cglobal AddBlock4x4_00,12
  34. cglobal AddBlock4x4_01,12
  35. cglobal AddBlock4x4_02,12
  36. cglobal AddBlock4x4_03,12
  37. cglobal AddBlock4x4_10,12
  38. cglobal AddBlock4x4_11,12
  39. cglobal AddBlock4x4_12,12
  40. cglobal AddBlock4x4_13,12
  41. cglobal AddBlock4x4_20,12
  42. cglobal AddBlock4x4_21,12
  43. cglobal AddBlock4x4_22,12
  44. cglobal AddBlock4x4_23,12
  45. cglobal AddBlock4x4_30,12
  46. cglobal AddBlock4x4_31,12
  47. cglobal AddBlock4x4_32,12
  48. cglobal AddBlock4x4_33,12
  49. cglobal CopyBlock4x4,16
  50. cglobal CopyBlock4x4_01,16
  51. cglobal CopyBlock4x4_02,16
  52. cglobal CopyBlock4x4_03,16 
  53. cglobal CopyBlock4x4_10,16
  54. cglobal CopyBlock4x4_11,16 
  55. cglobal CopyBlock4x4_12,16
  56. cglobal CopyBlock4x4_13,16
  57. cglobal CopyBlock4x4_20,16
  58. cglobal CopyBlock4x4_21,16 
  59. cglobal CopyBlock4x4_22,16
  60. cglobal CopyBlock4x4_23,16
  61. cglobal CopyBlock4x4_20,16
  62. cglobal CopyBlock4x4_21,16 
  63. cglobal CopyBlock4x4_22,16
  64. cglobal CopyBlock4x4_23,16
  65. cglobal CopyBlock4x4_01R,16
  66. cglobal CopyBlock4x4_02R,16
  67. cglobal CopyBlock4x4_03R,16 
  68. cglobal CopyBlock4x4_10R,16
  69. cglobal CopyBlock4x4_11R,16 
  70. cglobal CopyBlock4x4_12R,16
  71. cglobal CopyBlock4x4_13R,16
  72. cglobal CopyBlock4x4_20R,16
  73. cglobal CopyBlock4x4_21R,16 
  74. cglobal CopyBlock4x4_22R,16
  75. cglobal CopyBlock4x4_23R,16
  76. cglobal CopyBlock4x4_20R,16
  77. cglobal CopyBlock4x4_21R,16 
  78. cglobal CopyBlock4x4_22R,16
  79. cglobal CopyBlock4x4_23R,16
  80. %macro loadparam 1
  81. mov esi,[esp+12] ;src
  82. mov edi,[esp+12+4] ;dst
  83. mov eax,[esp+12+8] ;src pitch
  84. %if %1>0
  85. mov edx,8 ;dst pitch (fixed for AddBlock)
  86. %else
  87. mov edx,[esp+12+12] ;dst pitch
  88. %endif
  89. %endmacro
  90. %macro loadmask1 0
  91. mov ecx,0x01010101
  92. movd mm6,ecx
  93. pcmpeqb mm7,mm7
  94. punpckldq mm6,mm6
  95. pxor mm7,mm6
  96. %endmacro
  97. %macro loadmask4 0
  98. mov ecx,0x03030303
  99. movd mm6,ecx
  100. pcmpeqb mm7,mm7
  101. punpckldq mm6,mm6
  102. pxor mm7,mm6
  103. %endmacro
  104. %macro loadmask16 0
  105. mov ecx,0x0F0F0F0F
  106. movd mm6,ecx
  107. pcmpeqb mm7,mm7
  108. punpckldq mm6,mm6
  109. pxor mm7,mm6
  110. %endmacro
  111. %macro load1 2
  112. movd mm0,[esi+%1]
  113. %if %2>0
  114. add esi,eax
  115. %endif
  116. movq mm1,mm0
  117. pand mm1,mm7
  118. psrlq mm1,1
  119. %endmacro
  120. %macro load2 2
  121. movd mm2,[esi+%1]
  122. %if %2>0
  123. add esi,eax
  124. %endif
  125. movq mm3,mm2
  126. pand mm3,mm7
  127. psrlq mm3,1
  128. %endmacro
  129. %macro load1hv 1
  130. movd mm0,[esi]
  131. movd mm4,[esi+1]
  132. add esi,eax
  133. movq mm1,mm0
  134. movq mm5,mm4
  135. pand mm0,mm6
  136. pand mm4,mm6
  137. pand mm1,mm7
  138. pand mm5,mm7
  139. psrlq mm1,%0
  140. psrlq mm5,%0
  141. paddb mm0,mm4
  142. paddb mm1,mm5
  143. %endmacro
  144. %macro load2hv 1
  145. movd mm2,[esi]
  146. movd mm4,[esi+1]
  147. add esi,eax
  148. movq mm3,mm2
  149. movq mm5,mm4
  150. pand mm2,mm6
  151. pand mm4,mm6
  152. pand mm3,mm7
  153. pand mm5,mm7
  154. psrlq mm3,%0
  155. psrlq mm5,%0
  156. paddb mm2,mm4
  157. paddb mm3,mm5
  158. %endmacro
  159. %macro avg1 0
  160. por mm0,mm2
  161. pand mm0,mm6
  162. paddb mm0,mm1
  163. paddb mm0,mm3
  164. %endmacro
  165. %macro avg2 0
  166. por mm2,mm0
  167. pand mm2,mm6
  168. paddb mm2,mm3
  169. paddb mm2,mm1
  170. %endmacro
  171. %macro avground1 0
  172. pand mm0,mm2
  173. pand mm0,mm6
  174. paddb mm0,mm1
  175. paddb mm0,mm3
  176. %endmacro
  177. %macro avground2 0
  178. pand mm2,mm0
  179. pand mm2,mm6
  180. paddb mm2,mm3
  181. paddb mm2,mm1
  182. %endmacro
  183. %macro save1 0
  184. movd [edi],mm0
  185. add edi,edx
  186. %endmacro
  187. %macro save2 0
  188. movd [edi],mm2
  189. add edi,edx
  190. %endmacro
  191. %macro saveadd1 0
  192. movd mm4,[edi]
  193. movq mm1,mm0
  194. pand mm0,mm7
  195. por mm1,mm4
  196. pand mm4,mm7
  197. pand mm1,mm6
  198. psrlq mm0,1
  199. psrlq mm4,1
  200. paddb mm1,mm0
  201. paddb mm1,mm4
  202. movd [edi],mm1
  203. add edi,edx
  204. %endmacro
  205. %macro saveadd2 0
  206. movd mm4,[edi]
  207. movq mm3,mm2
  208. pand mm2,mm7
  209. por mm3,mm4
  210. pand mm4,mm7
  211. pand mm3,mm6
  212. psrlq mm2,1
  213. psrlq mm4,1
  214. paddb mm3,mm2
  215. paddb mm3,mm4
  216. movd [edi],mm3
  217. add edi,edx
  218. %endmacro
  219. %macro CopyBlock4x4_NN 4
  220. ALIGN 16
  221. CopyBlock4x4_%0%1%2:
  222. push esi
  223. push edi
  224. loadparam 0
  225. loadmask16
  226. load1hv 4 
  227. %rep 2
  228. load2hv 4
  229. movq mm4,[%3]
  230. paddb mm0,mm2
  231. paddb mm1,mm3
  232. paddb mm0,mm4 ;+7
  233. pand mm0,mm7
  234. psrlq mm0,2
  235. paddb mm0,mm1
  236. save1
  237. load1hv 4
  238. movq mm4,[%3]
  239. paddb mm2,mm0
  240. paddb mm3,mm1
  241. paddb mm2,mm4 ;+7
  242. pand mm2,mm7
  243. psrlq mm2,2
  244. paddb mm2,mm3
  245. save2
  246. %endrep
  247. pop edi
  248. pop esi 
  249. ret 16
  250. %endmacro
  251. ALIGN 16
  252. CopyBlock4x4:
  253. push esi
  254. push edi
  255. loadparam 0
  256. push ebx
  257. push ecx
  258. mov ebx,[esi]
  259. mov ecx,[esi+eax]
  260. add esi,eax
  261. mov [edi],ebx
  262. mov [edi+edx],ecx
  263. add edi,edx
  264. mov ebx,[esi+eax]
  265. mov ecx,[esi+eax*2]
  266. mov [edi+edx],ebx
  267. mov [edi+edx*2],ecx
  268. pop ecx
  269. pop ebx
  270. pop edi
  271. pop esi 
  272. ret 16
  273. ALIGN 16
  274. CopyBlock4x4_02:
  275. push esi
  276. push edi
  277. loadparam 0
  278. loadmask1
  279. %rep 4
  280. load1 0,0
  281. load2 1,1
  282. avg1
  283. save1
  284. %endrep
  285. pop edi
  286. pop esi 
  287. ret 16
  288. ALIGN 16
  289. CopyBlock4x4_20:
  290. push esi
  291. push edi
  292. loadparam 0
  293. loadmask1
  294. load1 0,1
  295. %rep 2 
  296. load2 0,1
  297. avg1
  298. save1
  299. load1 0,1
  300. avg2
  301. save2
  302. %endrep
  303. pop edi
  304. pop esi 
  305. ret 16
  306. ALIGN 16
  307. CopyBlock4x4_22:
  308. push esi
  309. push edi
  310. loadparam 0
  311. loadmask4
  312. load1hv 2
  313. %rep 2
  314. load2hv 2
  315. pcmpeqb mm4,mm4 ;-1
  316. paddb mm0,mm2
  317. paddb mm4,mm4 ;-2
  318. paddb mm1,mm3
  319. psubb mm0,mm4 ;+2
  320. pand mm0,mm7
  321. psrlq mm0,2
  322. paddb mm0,mm1
  323. save1
  324. load1hv 2
  325. pcmpeqb mm4,mm4 ;-1
  326. paddb mm2,mm0
  327. paddb mm4,mm4 ;-2
  328. paddb mm3,mm1
  329. psubb mm2,mm4 ;+2
  330. pand mm2,mm7
  331. psrlq mm2,2
  332. paddb mm2,mm3
  333. save2
  334. %endrep
  335. pop edi
  336. pop esi 
  337. ret 16
  338. ALIGN 16
  339. CopyBlock4x4_02R:
  340. push esi
  341. push edi
  342. loadparam 0
  343. loadmask1
  344. %rep 4
  345. load1 0,0
  346. load2 1,1
  347. avground1
  348. save1
  349. %endrep
  350. pop edi
  351. pop esi 
  352. ret 16
  353. ALIGN 16
  354. CopyBlock4x4_20R:
  355. push esi
  356. push edi
  357. loadparam 0
  358. loadmask1
  359. load1 0,1
  360. %rep 2 
  361. load2 0,1
  362. avground1
  363. save1
  364. load1 0,1
  365. avground2
  366. save2
  367. %endrep
  368. pop edi
  369. pop esi 
  370. ret 16
  371. ALIGN 16
  372. CopyBlock4x4_22R:
  373. push esi
  374. push edi
  375. loadparam 0
  376. loadmask4
  377. load1hv 2
  378. %rep 2
  379. load2hv 2
  380. pcmpeqb mm4,mm4 ;-1
  381. paddb mm0,mm2
  382. paddb mm1,mm3
  383. psubb mm0,mm4 ;+1
  384. pand mm0,mm7
  385. psrlq mm0,2
  386. paddb mm0,mm1
  387. save1
  388. load1hv 2
  389. pcmpeqb mm4,mm4 ;-1
  390. paddb mm2,mm0
  391. paddb mm3,mm1
  392. psubb mm2,mm4 ;+1
  393. pand mm2,mm7
  394. psrlq mm2,2
  395. paddb mm2,mm3
  396. save2
  397. %endrep
  398. pop edi
  399. pop esi 
  400. ret 16
  401. ALIGN 16
  402. AddBlock4x4:
  403. push esi
  404. push edi
  405. loadparam 1
  406. loadmask1
  407. %rep 4
  408. movd mm0,[esi]
  409. add esi,eax
  410. saveadd1
  411. %endrep
  412. pop edi
  413. pop esi 
  414. ret 12
  415. ALIGN 16
  416. AddBlock4x4_02:
  417. push esi
  418. push edi
  419. loadparam 1
  420. loadmask1
  421. %rep 4
  422. load1 0,0
  423. load2 1,1
  424. avg1
  425. saveadd1
  426. %endrep
  427. pop edi
  428. pop esi 
  429. ret 12
  430. ALIGN 16
  431. AddBlock4x4_20:
  432. push esi
  433. push edi
  434. loadparam 1
  435. loadmask1
  436. load1 0,1
  437. %rep 2 
  438. load2 0,1
  439. avg1
  440. saveadd1
  441. load1 0,1
  442. avg2
  443. saveadd2
  444. %endrep
  445. pop edi
  446. pop esi 
  447. ret 12
  448. ALIGN 16
  449. AddBlock4x4_22:
  450. push esi
  451. push edi
  452. loadparam 1
  453. loadmask4
  454. load1hv 2
  455. %rep 2
  456. load2hv 2
  457. pcmpeqb mm5,mm5 ;-1
  458. paddb mm0,mm2
  459. paddb mm5,mm5 ;-2
  460. paddb mm1,mm3
  461. psubb mm0,mm5 ;+=2
  462. pand mm0,mm7
  463. psrlq mm0,2
  464. paddb mm0,mm1
  465. paddb mm6,mm5 ;0x03-2=0x01
  466. psubb mm7,mm5 ;0xFD+2=0xFF
  467. saveadd1
  468. psubb mm6,mm5 ;restore mask
  469. paddb mm7,mm5 ;restore mask
  470. load1hv 2
  471. pcmpeqb mm5,mm5 ;-1
  472. paddb mm2,mm0
  473. paddb mm5,mm5 ;-2
  474. paddb mm3,mm1
  475. psubb mm2,mm5 ;+=2
  476. pand mm2,mm7
  477. psrlq mm2,2
  478. paddb mm2,mm3
  479. paddb mm6,mm5 ;0x03-2=0x01
  480. psubb mm7,mm5 ;0xFD+2=0xFF
  481. saveadd2
  482. psubb mm6,mm5 ;restore mask
  483. paddb mm7,mm5 ;restore mask
  484. %endrep
  485. pop edi
  486. pop esi 
  487. ret 12
  488. %endif