mcomp_wmmx.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_wmmx.asm 271 2005-08-09 08:31:35Z picard $
  18. ;*
  19. ;* The Core Pocket Media Player
  20. ;* Copyright (c) 2004-2005 Gabor Kovacs
  21. ;*
  22. ;*****************************************************************************
  23. ;R0 src
  24. ;R1 dst
  25. ;R2 srcpitch
  26. ;R3 dstpitch
  27. AREA |.text|, CODE
  28.   macro
  29.   CopyBegin
  30. add ip,r2,#7
  31. pld [r0,r2]
  32. pld [r0,#7]
  33. stmdb sp!,{lr}
  34. pld [r0,ip]
  35. pld [r0]
  36.   mend
  37.   macro
  38.   CopyEnd
  39. ldmia sp!,{pc}  
  40.   mend
  41.   macro 
  42.   PreLoad
  43. pld [r0,r2,lsl #1]
  44.   mend
  45.   macro 
  46.   PreLoad2Init
  47. add ip,r2,#4
  48.   mend
  49.   macro 
  50.   PreLoad2
  51. pld [r0,r2,lsl #1] ;2*pitch
  52. pld [r0,ip,lsl #1] ;2*pitch+8
  53.   mend
  54.   macro
  55.   PrepareAlignVer $Name, $Height
  56.     ands r14,r0,#7
  57. tmcr wcgr1,r14
  58. mov r14,#$Height
  59. beq $Name.Aligned
  60. bic r0,r0,#7
  61.   mend
  62.   macro
  63.   PrepareAlignHor $Name
  64.     and r14,r0,#7
  65. tmcr wcgr1,r14
  66.     add r14,r14,#1
  67. bic r0,r0,#7
  68. cmp r14,#8
  69. beq $Name.Wrap
  70. tmcr wcgr2,r14
  71. mov r14,#8
  72.   mend
  73. ;------------------------------------------
  74. ;COPYBLOCK
  75. ;------------------------------------------
  76.   macro
  77.   CopyBlock $Name
  78. align 16
  79. export $Name
  80. $Name proc
  81.     CopyBegin
  82. sub r1,r1,r3
  83. PrepareAlignVer $Name,8
  84. PreLoad2Init
  85. $Name.Loop
  86. PreLoad2
  87. wldrd wr0,[r0]
  88. wldrd wr1,[r0,#8]
  89. add r0,r0,r2
  90. add r1,r1,r3
  91. walignr1 wr0,wr0,wr1
  92. wstrd wr0,[r1]
  93. subs r14,r14,#1
  94. bne $Name.Loop
  95. CopyEnd
  96. $Name.Aligned
  97. PreLoad
  98. wldrd wr0,[r0]
  99. add r0,r0,r2
  100. add r1,r1,r3
  101. wstrd wr0,[r1]
  102. subs r14,r14,#1
  103. bne $Name.Aligned
  104. CopyEnd
  105.   mend
  106. ;------------------------------------------
  107. ;COPYBLOCKM
  108. ;------------------------------------------
  109.   macro
  110.   CopyBlockM $Name
  111. align 16
  112. export $Name
  113. $Name proc
  114.     CopyBegin
  115. sub r1,r1,r3
  116. PrepareAlignVer $Name,16
  117. PreLoad2Init
  118. $Name.Loop
  119. PreLoad2
  120. wldrd wr0,[r0]
  121. wldrd wr1,[r0,#8]
  122. wldrd wr2,[r0,#16]
  123. add r0,r0,r2
  124. add r1,r1,r3
  125. walignr1 wr0,wr0,wr1
  126. walignr1 wr1,wr1,wr2
  127. wstrd wr0,[r1]
  128. wstrd wr1,[r1,#8]
  129. subs r14,r14,#1
  130. bne $Name.Loop
  131. CopyEnd
  132. $Name.Aligned
  133. PreLoad
  134. wldrd wr0,[r0]
  135. wldrd wr1,[r0,#8]
  136. add r0,r0,r2
  137. add r1,r1,r3
  138. wstrd wr0,[r1]
  139. wstrd wr1,[r1,#8]
  140. subs r14,r14,#1
  141. bne $Name.Aligned
  142. CopyEnd
  143.   mend
  144. ;------------------------------------------
  145. ;ADDBLOCK
  146. ;------------------------------------------
  147.   macro
  148.   AddBlock $Name
  149. align 16
  150. export $Name
  151. $Name proc
  152. CopyBegin
  153. PrepareAlignVer $Name,8
  154. PreLoad2Init
  155. $Name.Loop
  156. PreLoad2
  157. wldrd wr0,[r0]
  158. wldrd wr1,[r0,#8]
  159. add r0,r0,r2
  160. wldrd wr5,[r1]
  161. walignr1 wr0,wr0,wr1
  162. wavg2br wr0,wr0,wr5
  163. wstrd wr0,[r1],#8
  164. subs r14,r14,#1
  165. bne $Name.Loop
  166. CopyEnd
  167. $Name.Aligned
  168. PreLoad
  169. wldrd wr0,[r0]
  170. add r0,r0,r2
  171. wldrd wr5,[r1]
  172. wavg2br wr0,wr0,wr5
  173. wstrd wr0,[r1],#8
  174. subs r14,r14,#1
  175. bne $Name.Aligned
  176. CopyEnd
  177.   mend
  178. ;------------------------------------------
  179. ; COPYBLOCKHOR
  180. ;------------------------------------------
  181.   macro
  182.   CopyHorRow $Round, $Add, $Wrap
  183.     PreLoad2
  184. wldrd wr0,[r0]
  185. wldrd wr1,[r0,#8]
  186. add r0,r0,r2
  187.     if $Add > 0
  188.   wldrd wr5,[r1]
  189.     else
  190.   add r1,r1,r3
  191.     endif
  192.     walignr1 wr2,wr0,wr1
  193.     if $Wrap = 0
  194.   walignr2 wr1,wr0,wr1
  195.     endif
  196.     if $Round > 0
  197.   wavg2b wr0,wr1,wr2
  198.     else
  199.   wavg2br wr0,wr1,wr2
  200.     endif
  201.     if $Add > 0
  202.   wavg2br wr0,wr0,wr5
  203.      wstrd wr0,[r1],#8
  204.     else
  205.   wstrd wr0,[r1]
  206. endif
  207.   mend
  208.   macro
  209.   CopyBlockHor $Name, $Round, $Add
  210. align 16
  211. export $Name
  212. $Name proc
  213. CopyBegin
  214.     if $Add = 0
  215.   sub r1,r1,r3
  216. endif
  217. PreLoad2Init
  218. PrepareAlignHor $Name
  219. $Name.Loop
  220. CopyHorRow $Round,$Add,0
  221. subs r14,r14,#1
  222. bne $Name.Loop
  223. CopyEnd
  224. $Name.Wrap
  225. CopyHorRow $Round,$Add,1
  226. subs r14,r14,#1
  227. bne $Name.Wrap
  228. CopyEnd
  229.   mend
  230. ;------------------------------------------
  231. ; COPYBLOCKVER
  232. ;------------------------------------------
  233.   macro
  234.   SetVerRow $Round, $Add
  235.   if $Add > 0
  236.     wldrd wr5,[r1]
  237.   else
  238.     add r1,r1,r3
  239.   endif
  240.   if $Round > 0
  241. wavg2b wr1,wr0,wr2
  242.   else
  243.   wavg2br wr1,wr0,wr2
  244.   endif
  245.   if $Add > 0
  246.     wavg2br wr1,wr1,wr5
  247.     wstrd wr1,[r1],#8
  248.   else
  249.     wstrd wr1,[r1]
  250.   endif
  251.   mend
  252.   macro
  253.   CopyBlockVer $Name, $Round, $Add
  254. align 16
  255. export $Name
  256. $Name proc
  257. CopyBegin
  258.     if $Add = 0
  259.   sub r1,r1,r3
  260. endif
  261. PrepareAlignVer $Name,8
  262. PreLoad2Init
  263. PreLoad2
  264. wldrd wr0,[r0]
  265. wldrd wr1,[r0,#8]
  266. add r0,r0,r2
  267. walignr1 wr0,wr0,wr1
  268. $Name.Loop
  269. PreLoad2
  270. wldrd wr2,[r0]
  271. wldrd wr1,[r0,#8]
  272. add r0,r0,r2
  273. walignr1 wr2,wr2,wr1
  274. SetVerRow $Round,$Add
  275. PreLoad2
  276. wldrd wr0,[r0]
  277. wldrd wr1,[r0,#8]
  278. add r0,r0,r2
  279. walignr1 wr0,wr0,wr1
  280. SetVerRow $Round,$Add
  281. subs r14,r14,#2
  282. bne $Name.Loop
  283. CopyEnd
  284. $Name.Aligned
  285. PreLoad
  286. wldrd wr0,[r0]
  287. add r0,r0,r2
  288. $Name.Loop2
  289. PreLoad
  290. wldrd wr2,[r0]
  291. add r0,r0,r2
  292. SetVerRow $Round,$Add
  293. PreLoad
  294. wldrd wr0,[r0]
  295. add r0,r0,r2
  296. SetVerRow $Round,$Add
  297. subs r14,r14,#2
  298. bne $Name.Loop2
  299. CopyEnd
  300.   mend
  301. ;------------------------------------------
  302. ; COPYBLOCKHORVER
  303. ;------------------------------------------
  304. ; wr6 0x03
  305. ; wr7 ~0x03
  306.   macro
  307.   LoadHorVerRow $Parity, $Wrap
  308.   PreLoad2
  309.   if $Parity
  310. wldrd wr0,[r0]
  311. wldrd wr1,[r0,#8]
  312. add r0,r0,r2
  313. walignr1 wr2,wr0,wr1
  314.     if $Wrap = 0
  315.   walignr2 wr1,wr0,wr1
  316.     endif
  317. wand wr0,wr2,wr6
  318. wand wr3,wr1,wr6
  319. wand wr2,wr2,wr7
  320. wand wr1,wr1,wr7
  321. wsrldg wr2,wr2,wcgr0  
  322. wsrldg wr1,wr1,wcgr0  
  323. waddb wr2,wr2,wr1
  324. waddb wr1,wr3,wr0 
  325.   else
  326. wldrd wr3,[r0]
  327. wldrd wr4,[r0,#8]
  328. add r0,r0,r2
  329. walignr1 wr5,wr3,wr4
  330.     if $Wrap = 0
  331.   walignr2 wr4,wr3,wr4
  332.     endif
  333. wand wr0,wr5,wr6
  334. wand wr3,wr4,wr6
  335. wand wr5,wr5,wr7
  336. wand wr4,wr4,wr7
  337. wsrldg wr5,wr5,wcgr0  
  338. wsrldg wr4,wr4,wcgr0  
  339. waddb wr5,wr5,wr4
  340. waddb wr4,wr3,wr0
  341.   endif
  342.   mend
  343.   macro
  344.   SetHorVerRow $Add
  345.   if $Add > 0
  346.     wldrd wr9,[r1]
  347.   else
  348.     add r1,r1,r3
  349.   endif
  350. waddb wr0,wr1,wr4
  351. waddb wr0,wr0,wr8   ;rounding
  352. wand wr0,wr0,wr7
  353. waddb wr3,wr2,wr5   
  354. wsrldg wr0,wr0,wcgr0  
  355. waddb wr0,wr0,wr3 
  356.   if $Add > 0
  357.     wavg2br wr0,wr0,wr9
  358.     wstrd wr0,[r1],#8
  359.   else
  360.     wstrd wr0,[r1]
  361.   endif
  362.   mend
  363.   macro
  364.   CopyBlockHorVer $Name, $Round, $Add
  365. align 16
  366. export $Name
  367. $Name proc
  368. CopyBegin
  369.     if $Add = 0
  370.   sub r1,r1,r3
  371. endif
  372.     if $Round > 0
  373.   mov r14,#1
  374.     else
  375.   mov r14,#2
  376.     endif
  377. tbcstb wr8,r14
  378. mov r14,#3 
  379. tbcstb wr6,r14
  380. mvn r14,#3 
  381. tbcstb wr7,r14
  382. mov r14,#2
  383. tmcr wcgr0,r14
  384. PreLoad2Init
  385. PrepareAlignHor $Name
  386. LoadHorVerRow 1,0
  387. $Name.Loop
  388. LoadHorVerRow 0,0
  389. SetHorVerRow $Add
  390. LoadHorVerRow 1,0
  391. SetHorVerRow $Add
  392. subs r14,r14,#2
  393. bne $Name.Loop
  394. CopyEnd
  395. $Name.Wrap
  396. LoadHorVerRow 1,1
  397. $Name.Loop2
  398. LoadHorVerRow 0,1
  399. SetHorVerRow $Add
  400. LoadHorVerRow 1,1
  401. SetHorVerRow $Add
  402. subs r14,r14,#2
  403. bne $Name.Loop2
  404. CopyEnd
  405.   mend
  406. CopyBlock WMMXCopyBlock
  407. CopyBlockVer WMMXCopyBlockVer,0,0
  408. CopyBlockHor WMMXCopyBlockHor,0,0
  409. CopyBlockHorVer WMMXCopyBlockHorVer,0,0
  410. CopyBlockVer WMMXCopyBlockVerRound,1,0
  411. CopyBlockHor WMMXCopyBlockHorRound,1,0
  412. CopyBlockHorVer WMMXCopyBlockHorVerRound,1,0
  413. AddBlock WMMXAddBlock
  414. CopyBlockVer WMMXAddBlockVer,0,1
  415. CopyBlockHor WMMXAddBlockHor,0,1
  416. CopyBlockHorVer WMMXAddBlockHorVer,0,1
  417. CopyBlockM WMMXCopyBlockM
  418. END