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

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_arm.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. ;R0 src
  24. ;R1 dst
  25. ;R2 srcpitch
  26. ;R3 dstpitch
  27. AREA |.text|, CODE
  28.   macro 
  29.   PreLoad $ARM5,$Pos
  30.     if $ARM5>0
  31.   if $Pos >= 0
  32.        if $Pos > 0
  33.       pld [r0,r2,lsl #1]
  34.       add r0,r0,#8
  35.       pld [r0,r2,lsl #1]
  36.       sub r0,r0,#8
  37.     else
  38.       pld [r0,r2,lsl #1]
  39.       add r0,r0,#4
  40.       pld [r0,r2,lsl #1]
  41.       sub r0,r0,#4
  42.     endif
  43.   else
  44.     pld [r0,r2,lsl #1]
  45.     add r0,r0,#7
  46.     pld [r0,r2,lsl #1]
  47.     sub r0,r0,#7
  48.   endif
  49. endif
  50.   mend
  51.   macro 
  52.   PreLoad2Init $ARM5,$Pos
  53.     if $ARM5>0
  54.   if $Pos >= 0
  55.        if $Pos > 0
  56.       add r10,r2,r2
  57.       add r10,r10,#8
  58.     else
  59.       add r10,r2,r2
  60.       add r10,r10,#4
  61.     endif
  62.   else
  63.       add r10,r2,r2
  64.       add r10,r10,#7
  65.   endif
  66. endif
  67.   mend
  68.   macro 
  69.   PreLoad2 $ARM5,$Pos
  70. if $ARM5>0
  71.       pld [r0,r2,lsl #1]
  72.       pld [r0,r10]
  73. endif
  74.   mend
  75.   macro 
  76.   CopyBuild $Name,$Sub,$Round,$Add,$Fast,$ARM5
  77. align 16
  78. export $Name
  79. $Name proc
  80. if $ARM5>0
  81. add ip,r2,#7
  82. pld [r0,r2]
  83. pld [r0,#7]
  84. endif
  85. stmdb sp!, {r4 - r11, lr}
  86. if $ARM5>0
  87. pld [r0,ip]
  88. pld [r0]
  89. endif
  90. if $Fast>0
  91. movs r4,r0,lsl #30
  92. beq $Name.L00
  93. cmps r4,#0x80000000
  94. beq $Name.L10
  95. bhi $Name.L11
  96. $Name.L01
  97. bic r0,r0,#3
  98. $Sub $Name.8,8,$Round,$Add,$ARM5
  99. $Name.L10
  100. bic r0,r0,#3
  101. $Sub $Name.16,16,$Round,$Add,$ARM5
  102. $Name.L11
  103. bic r0,r0,#3
  104. $Sub $Name.24,24,$Round,$Add,$ARM5
  105. $Name.L00
  106. $Sub $Name.0,0,$Round,$Add,$ARM5
  107. else
  108. $Sub $Name.s,-1,$Round,$Add,$ARM5
  109. endif
  110. endp
  111.   mend
  112. ;------------------------------------------
  113. ;COPYBLOCK
  114. ;------------------------------------------
  115.   macro
  116.   CopyBlockRow $Pos
  117. if $Pos > 0
  118.   ldr r5,[r0,#8]
  119.   ldr r6,[r0,#4]
  120.   ldr r4,[r0],r2
  121.   mov r5,r5,lsl #32-$Pos
  122.   orr r5,r5,r6,lsr #$Pos
  123.   mov r4,r4,lsr #$Pos
  124.   orr r4,r4,r6,lsl #32-$Pos
  125. else
  126.   ldr r5,[r0,#4]
  127.   ldr r4,[r0],r2
  128. endif
  129. str r5,[r1,#4]
  130. str r4,[r1],r3
  131.   mend
  132.   macro
  133.   CopyBlock $Id, $Pos, $Round, $Add, $ARM5
  134. PreLoad2Init $ARM5,$Pos
  135.     PreLoad2 $ARM5,$Pos
  136. CopyBlockRow $Pos 
  137.     PreLoad2 $ARM5,$Pos
  138. CopyBlockRow $Pos 
  139.     PreLoad2 $ARM5,$Pos
  140. CopyBlockRow $Pos 
  141.     PreLoad2 $ARM5,$Pos
  142. CopyBlockRow $Pos 
  143.     PreLoad2 $ARM5,$Pos
  144. CopyBlockRow $Pos 
  145.     PreLoad2 $ARM5,$Pos
  146. CopyBlockRow $Pos 
  147.     PreLoad2 $ARM5,$Pos
  148. CopyBlockRow $Pos 
  149.     PreLoad2 $ARM5,$Pos
  150. CopyBlockRow $Pos 
  151. ldmia sp!, {r4 - r11, pc}
  152.   mend
  153. ;------------------------------------------
  154. ;COPYBLOCKM
  155. ;------------------------------------------
  156.   macro
  157.   CopyBlockMRow $Pos
  158. if $Pos > 0
  159.   ldr r14,[r0,#16]
  160.   ldr r6,[r0,#12]
  161.   ldr r12,[r0,#8]
  162.   mov r14,r14,lsl #32-$Pos
  163.   orr r14,r14,r6,lsr #$Pos
  164.   mov r12,r12,lsr #$Pos
  165.   orr r12,r12,r6,lsl #32-$Pos
  166.   ldr r5,[r0,#8]
  167.   ldr r6,[r0,#4]
  168.   ldr r4,[r0],r2
  169.   mov r5,r5,lsl #32-$Pos
  170.   orr r5,r5,r6,lsr #$Pos
  171.   mov r4,r4,lsr #$Pos
  172.   orr r4,r4,r6,lsl #32-$Pos
  173. else
  174.   ldr r5,[r0,#4]
  175.   ldr r12,[r0,#8]
  176.   ldr r14,[r0,#12]
  177.   ldr r4,[r0],r2
  178. endif
  179. str r5,[r1,#4]
  180. str r12,[r1,#8]
  181. str r14,[r1,#12]
  182. str r4,[r1],r3
  183.   mend
  184.   macro
  185.   CopyBlockM $Id, $Pos, $Round, $Add, $ARM5
  186. PreLoad2Init $ARM5,$Pos
  187. mov r11,#16
  188. $Id.Loop
  189.     PreLoad2 $ARM5,$Pos
  190. CopyBlockMRow $Pos
  191. subs r11,r11,#1
  192. bne  $Id.Loop
  193. ldmia sp!, {r4 - r11, pc}
  194.   mend
  195. ;------------------------------------------
  196. ;COPYBLOCK16x16: no aligment!, only used in Copy()
  197. ;------------------------------------------
  198.   macro
  199.   CopyBlock16x16Row
  200. ldr r7,[r0,#12]
  201. ldr r6,[r0,#8]
  202. ldr r5,[r0,#4]
  203. ldr r4,[r0],r2
  204. str r7,[r1,#12]
  205. str r6,[r1,#8]
  206. str r5,[r1,#4]
  207. str r4,[r1],r3
  208.   mend
  209.   macro
  210.   CopyBlock16x16 $Id, $Pos, $Round, $Add, $ARM5
  211. mov r11,#15
  212. $Id.Loop
  213.     pld [r0,r2,lsl #1]
  214. CopyBlock16x16Row
  215. subs r11,r11,#1 
  216. bne  $Id.Loop
  217. ;unroll last (no preload needed)
  218. CopyBlock16x16Row
  219. ldmia sp!, {r4 - r11, pc}
  220.   mend
  221. ;------------------------------------------
  222. ;COPYBLOCK8x8: no aligment!, only used in Copy()
  223. ;------------------------------------------
  224.   macro
  225.   CopyBlock8x8 $Id, $Pos, $Round, $Add, $ARM5
  226. mov r11,#3
  227. $Id.Loop
  228.     pld [r0,r2,lsl #1]
  229. ldr r7,[r0,#4]
  230. ldr r6,[r0],r2
  231.     pld [r0,r2,lsl #1]
  232. ldr r5,[r0,#4]
  233. ldr r4,[r0],r2
  234. str r7,[r1,#4]
  235. str r6,[r1],r3
  236. str r5,[r1,#4]
  237. str r4,[r1],r3
  238. subs r11,r11,#1 
  239. bne $Id.Loop
  240. ;unroll last (no preload needed)
  241. ldr r7,[r0,#4]
  242. ldr r6,[r0],r2
  243. ldr r5,[r0,#4]
  244. ldr r4,[r0],r2
  245. str r7,[r1,#4]
  246. str r6,[r1],r3
  247. str r5,[r1,#4]
  248. str r4,[r1],r3
  249. ldmia sp!, {r4 - r11, pc}
  250.   mend
  251. ;------------------------------------------
  252. ;ADDBLOCK
  253. ;------------------------------------------
  254.   macro
  255.   AddBlockRow $Pos
  256. if $Pos < 0
  257. ldrb r4,[r0]
  258. ldrb r6,[r0,#1]
  259. ldrb r5,[r0,#4]
  260. ldrb r7,[r0,#5]
  261. orr r4,r4,r6,lsl #8
  262. ldrb r6,[r0,#2]
  263. orr r5,r5,r7,lsl #8
  264. ldrb r7,[r0,#6]
  265. orr r4,r4,r6,lsl #16
  266. ldrb r6,[r0,#3]
  267. orr r5,r5,r7,lsl #16
  268. ldrb r7,[r0,#7]
  269. orr r4,r4,r6,lsl #24
  270. add r0,r0,r2
  271. orr r5,r5,r7,lsl #24
  272. else
  273. if $Pos > 0
  274.   ldr r5,[r0,#8]
  275.   ldr r6,[r0,#4]
  276.   ldr r4,[r0],r2
  277.   mov r5,r5,lsl #32-$Pos
  278.   orr r5,r5,r6,lsr #$Pos
  279.   mov r4,r4,lsr #$Pos
  280.   orr r4,r4,r6,lsl #32-$Pos
  281. else
  282.   ldr r5,[r0,#4]
  283.   ldr r4,[r0],r2
  284. endif
  285. endif
  286. ldr r7,[r1,#4]
  287. ldr r6,[r1]
  288. and r9,r12,r5,lsr #1
  289. and r8,r12,r4,lsr #1
  290. orr r5,r7,r5
  291. orr r4,r6,r4
  292. and r7,r12,r7,lsr #1
  293. and r6,r12,r6,lsr #1
  294. add r7,r7,r9
  295. add r6,r6,r8
  296. and r5,r5,r14
  297. and r4,r4,r14
  298. add r7,r7,r5
  299. add r6,r6,r4
  300. str r7,[r1,#4]
  301. str r6,[r1],#8
  302.   mend
  303.   macro
  304.   AddBlock $Id, $Pos, $Round, $Add, $ARM5
  305. PreLoad2Init $ARM5,$Pos
  306. ldr r14,$Id.Mask
  307. mov r11,#8
  308. mvn r12,r14,lsl #7
  309. $Id.Loop
  310.     PreLoad2 $ARM5,$Pos
  311. AddBlockRow $Pos
  312. subs r11,r11,#1 
  313. bne  $Id.Loop
  314. ldmia sp!, {r4 - r11, pc}
  315. $Id.Mask dcd 0x01010101
  316.   mend
  317. ;------------------------------------------
  318. ; COPYBLOCKHOR
  319. ;------------------------------------------
  320.   macro
  321.   LoadHorRow $Id, $Pos
  322.     ; result is r4,r5 and r8,r9 (one pixel to the right)
  323.     ; r6,r7 can be used
  324. if $Pos < 0
  325. ldrb r4,[r0]
  326. ldrb r6,[r0,#1]
  327. ldrb r5,[r0,#4]
  328. ldrb r7,[r0,#5]
  329. orr r4,r4,r6,lsl #8
  330. ldrb r6,[r0,#2]
  331. orr r5,r5,r7,lsl #8
  332. ldrb r7,[r0,#6]
  333. orr r4,r4,r6,lsl #16
  334. ldrb r6,[r0,#3]
  335. orr r5,r5,r7,lsl #16
  336. ldrb r7,[r0,#7]
  337. orr r4,r4,r6,lsl #24
  338. ldrb r6,[r0,#8]
  339. orr r5,r5,r7,lsl #24
  340. mov r8,r4,lsr #8
  341. mov r9,r5,lsr #8
  342. orr r8,r8,r5,lsl #24
  343. orr r9,r9,r6,lsl #24
  344. add r0,r0,r2
  345. else
  346.     ldr r5,[r0,#4]
  347.     ldr r6,[r0,#8]
  348.     ldr r4,[r0],r2
  349.     if $Pos+8 < 32
  350.   mov r9,r5,lsr #$Pos+8
  351.   orr r9,r9,r6,lsl #32-$Pos-8
  352.   mov r8,r4,lsr #$Pos+8
  353.   orr r8,r8,r5,lsl #32-$Pos-8
  354.     else
  355.   mov r8,r5
  356.   mov r9,r6
  357.     endif
  358. if $Pos > 0
  359.   mov r4,r4,lsr #$Pos
  360.   mov r6,r6,lsl #32-$Pos
  361.   orr r4,r4,r5,lsl #32-$Pos
  362.   orr r5,r6,r5,lsr #$Pos
  363. endif
  364. endif
  365.   mend
  366.   macro
  367.   CopyHorRow $Id, $Pos, $Round, $Add
  368. ;r14 01010101
  369. ;r12 7f7f7f7f
  370. LoadHorRow $Id,$Pos
  371. and r6,r12,r4,lsr #1
  372. and r7,r12,r5,lsr #1
  373. if $Round
  374.   and r4,r4,r8
  375.   and r5,r5,r9
  376. else
  377.   orr r4,r4,r8
  378.   orr r5,r5,r9
  379. endif
  380. and r8,r12,r8,lsr #1
  381. and r9,r12,r9,lsr #1
  382. and r4,r4,r14
  383. and r5,r5,r14
  384. add r4,r4,r6
  385. add r5,r5,r7
  386. add r4,r4,r8
  387. add r5,r5,r9
  388. if $Add
  389.   ldr r7,[r1,#4]
  390.   ldr r6,[r1]
  391.   and r9,r12,r5,lsr #1
  392.   and r8,r12,r4,lsr #1
  393.   orr r5,r7,r5
  394.   orr r4,r6,r4
  395.   and r7,r12,r7,lsr #1
  396.   and r6,r12,r6,lsr #1
  397.   add r7,r7,r9
  398.   add r6,r6,r8
  399.   and r5,r5,r14
  400.   and r4,r4,r14
  401.   add r7,r7,r5
  402.   add r6,r6,r4
  403.   str r7,[r1,#4]
  404.   str r6,[r1],#8
  405. else
  406.   str r5,[r1,#4]
  407.   str r4,[r1],r3
  408. endif
  409.   mend
  410.   macro
  411.   CopyBlockHor $Id, $Pos, $Round, $Add, $ARM5
  412. PreLoad2Init $ARM5,$Pos
  413. ldr r14,$Id.Mask
  414. mov r11,#8
  415. mvn r12,r14,lsl #7
  416. $Id.Loop
  417.     PreLoad2 $ARM5,$Pos
  418. CopyHorRow $Id,$Pos,$Round,$Add
  419. subs r11,r11,#1
  420. bne  $Id.Loop
  421. ldmia sp!, {r4 - r11, pc}
  422. $Id.Mask dcd 0x01010101
  423.   mend
  424. ;------------------------------------------
  425. ; COPYBLOCKVER
  426. ;------------------------------------------
  427.   macro
  428.   LoadVerRow $Id, $Pos, $Parity
  429.   if $Parity
  430.     ; result is r8,r9 (r10=r8>>1,r11=r9>>1) 
  431.     ; r10,r11 can be used
  432. if $Pos < 0
  433.     ldrb r8,[r0]
  434.   ldrb r10,[r0,#1]
  435.   ldrb r9,[r0,#4]
  436.   ldrb r11,[r0,#5]
  437.   orr r8,r8,r10,lsl #8 
  438.   ldrb r10,[r0,#2]
  439.   orr r9,r9,r11,lsl #8
  440.   ldrb r11,[r0,#6]
  441.   orr r8,r8,r10,lsl #16
  442.   ldrb r10,[r0,#3]
  443.   orr r9,r9,r11,lsl #16
  444.   ldrb r11,[r0,#7]
  445.   orr r8,r8,r10,lsl #24
  446.   add r0,r0,r2
  447.   orr r9,r9,r11,lsl #24
  448. else
  449.     if $Pos > 0
  450.   ldr r9,[r0,#8]
  451.   ldr r10,[r0,#4]
  452.   ldr r8,[r0],r2
  453.   mov r9,r9,lsl #32-$Pos
  454.   orr r9,r9,r10,lsr #$Pos
  455.   mov r8,r8,lsr #$Pos
  456.   orr r8,r8,r10,lsl #32-$Pos
  457.     else
  458.   ldr r9,[r0,#4]
  459.   ldr r8,[r0],r2
  460.     endif
  461. endif
  462. and r11,r12,r9,lsr #1
  463. and r10,r12,r8,lsr #1
  464.   else
  465.     ; result is r4,r5 (r6=r4>>1,r7=r5>>1) 
  466.     ; r6,r7 can be used
  467. if $Pos < 0
  468.     ldrb r4,[r0]
  469.   ldrb r6,[r0,#1]
  470.   ldrb r5,[r0,#4]
  471.   ldrb r7,[r0,#5]
  472.   orr r4,r4,r6,lsl #8
  473.   ldrb r6,[r0,#2]
  474.   orr r5,r5,r7,lsl #8
  475.   ldrb r7,[r0,#6]
  476.   orr r4,r4,r6,lsl #16
  477.   ldrb r6,[r0,#3]
  478.   orr r5,r5,r7,lsl #16
  479.   ldrb r7,[r0,#7]
  480.   orr r4,r4,r6,lsl #24
  481.   add r0,r0,r2
  482.   orr r5,r5,r7,lsl #24
  483. else
  484.     if $Pos > 0
  485.   ldr r5,[r0,#8]
  486.   ldr r6,[r0,#4]
  487.   ldr r4,[r0],r2
  488.   mov r5,r5,lsl #32-$Pos
  489.   orr r5,r5,r6,lsr #$Pos
  490.   mov r4,r4,lsr #$Pos
  491.   orr r4,r4,r6,lsl #32-$Pos
  492.     else
  493.   ldr r5,[r0,#4]
  494.   ldr r4,[r0],r2
  495.     endif
  496. endif
  497. and r7,r12,r5,lsr #1
  498. and r6,r12,r4,lsr #1
  499.   endif
  500.   mend
  501.   macro
  502.   CopyVerRow $Id, $Pos, $Parity, $Round, $Add
  503. ;r14 01010101
  504. ;r12 7f7f7f7f
  505. LoadVerRow $Id,$Pos,$Parity
  506.     if $Parity
  507.   if $Round
  508.     and r4,r4,r8
  509.     and r5,r5,r9
  510.   else
  511.     orr r4,r4,r8
  512.     orr r5,r5,r9
  513.   endif
  514.   and r4,r4,r14
  515.   and r5,r5,r14
  516.   add r4,r4,r6
  517.   add r5,r5,r7
  518.      add r4,r4,r10
  519.   add r5,r5,r11
  520.   if $Add
  521.     ldr r7,[r1,#4]
  522.     ldr r6,[r1]
  523.     and r3,r12,r5,lsr #1
  524. orr r5,r7,r5
  525.     and r7,r12,r7,lsr #1
  526. add r7,r7,r3
  527.     and r3,r12,r4,lsr #1
  528. orr r4,r6,r4
  529.     and r6,r12,r6,lsr #1
  530. add r6,r6,r3
  531. and r5,r5,r14
  532. and r4,r4,r14
  533. add r5,r5,r7
  534. add r4,r4,r6
  535. ldr r7,[sp] ;end src for loop compare
  536.     str r5,[r1,#4]
  537.     str r4,[r1],#8
  538.   else
  539. ldr r7,[sp] ;end src for loop compare
  540.     str r5,[r1,#4]
  541.     str r4,[r1],r3
  542.   endif
  543. else
  544.   if $Round
  545.     and r8,r8,r4
  546.     and r9,r9,r5
  547.   else
  548.     orr r8,r8,r4
  549.     orr r9,r9,r5
  550.   endif
  551.   and r8,r8,r14
  552.   and r9,r9,r14
  553.   add r8,r8,r10
  554.   add r9,r9,r11
  555.      add r8,r8,r6
  556.   add r9,r9,r7
  557.   if $Add
  558.     ldr r11,[r1,#4]
  559.     ldr r10,[r1]
  560.     and r3,r12,r9,lsr #1
  561. orr r9,r11,r9
  562.     and r11,r12,r11,lsr #1
  563. add r11,r11,r3
  564.     and r3,r12,r8,lsr #1
  565. orr r8,r10,r8
  566.     and r10,r12,r10,lsr #1
  567. add r10,r10,r3
  568. and r9,r9,r14
  569. and r8,r8,r14
  570. add r11,r11,r9
  571. add r10,r10,r8
  572.     str r11,[r1,#4]
  573.     str r10,[r1],#8
  574.   else
  575.     str r9,[r1,#4]
  576.     str r8,[r1],r3
  577.   endif
  578. endif
  579.   mend
  580.   macro
  581.   CopyBlockVer $Id, $Pos, $Round, $Add, $ARM5
  582. sub sp,sp,#4
  583. add r4,r0,r2,lsl #3
  584. add r4,r4,r2
  585. str r4,[sp] ;end src
  586. ldr r14,$Id.Mask
  587. mvn r12,r14,lsl #7
  588.     PreLoad $ARM5,$Pos
  589. LoadVerRow $Id,$Pos,1
  590. $Id.Loop
  591.     PreLoad $ARM5,$Pos
  592. CopyVerRow $Id,$Pos,0,$Round,$Add
  593.     PreLoad $ARM5,$Pos
  594. CopyVerRow $Id,$Pos,1,$Round,$Add
  595. cmp r0,r7
  596. bne $Id.Loop
  597. add sp,sp,#4
  598. ldmia sp!, {r4 - r11, pc}
  599. $Id.Mask dcd 0x01010101
  600.   mend
  601. ;------------------------------------------
  602. ; COPYBLOCKHORVER
  603. ;------------------------------------------
  604. ; load needs r2,r3 for temporary (r2 is restored from stack)
  605.   macro
  606.   LoadHorVerRow $Id, $Pos, $Parity
  607.   if $Parity
  608. ;read result r4,r5 and r2,r3 (one pixel to right)
  609. ;r6,r7 can be used
  610.     if $Pos<0
  611. ldrb r4,[r0]
  612. ldrb r6,[r0,#1]
  613. ldrb r5,[r0,#4]
  614. ldrb r7,[r0,#5]
  615. orr r4,r4,r6,lsl #8
  616. ldrb r6,[r0,#2]
  617. orr r5,r5,r7,lsl #8
  618. ldrb r7,[r0,#6]
  619. orr r4,r4,r6,lsl #16
  620. ldrb r6,[r0,#3]
  621. orr r5,r5,r7,lsl #16
  622. ldrb r7,[r0,#7]
  623. orr r4,r4,r6,lsl #24
  624. ldrb r6,[r0,#8]
  625. orr r5,r5,r7,lsl #24
  626. add r0,r0,r2
  627. mov r2,r4,lsr #8
  628. mov r3,r5,lsr #8
  629. orr r2,r2,r5,lsl #24
  630. orr r3,r3,r6,lsl #24
  631. else
  632.     ldr r5,[r0,#4]
  633.     ldr r6,[r0,#8]
  634.     ldr r4,[r0],r2
  635.     if $Pos+8 < 32
  636.   mov r3,r5,lsr #$Pos+8
  637.   orr r3,r3,r6,lsl #32-$Pos-8
  638.   mov r2,r4,lsr #$Pos+8
  639.   orr r2,r2,r5,lsl #32-$Pos-8
  640.     else
  641.   mov r2,r5
  642.   mov r3,r6
  643.     endif
  644. if $Pos > 0
  645.   mov r4,r4,lsr #$Pos
  646.   mov r6,r6,lsl #32-$Pos
  647.   orr r4,r4,r5,lsl #32-$Pos
  648.   orr r5,r6,r5,lsr #$Pos
  649. endif
  650. endif
  651. and r6,r2,r14
  652. and r2,r12,r2,lsr #2
  653. and r7,r4,r14
  654. and r4,r12,r4,lsr #2
  655. add r4,r4,r2
  656. add r6,r6,r7
  657. and r2,r3,r14
  658. and r3,r12,r3,lsr #2
  659. and r7,r5,r14
  660. and r5,r12,r5,lsr #2
  661. add r5,r5,r3
  662. add r7,r2,r7
  663.   else
  664. ;read result r8,r9 and r2,r3 (one pixel to right)
  665. ;r10,r11 can be used
  666.     if $Pos<0
  667. ldrb r8,[r0]
  668. ldrb r10,[r0,#1]
  669. ldrb r9,[r0,#4]
  670. ldrb r11,[r0,#5]
  671. orr r8,r8,r10,lsl #8
  672. ldrb r10,[r0,#2]
  673. orr r9,r9,r11,lsl #8
  674. ldrb r11,[r0,#6]
  675. orr r8,r8,r10,lsl #16
  676. ldrb r10,[r0,#3]
  677. orr r9,r9,r11,lsl #16
  678. ldrb r11,[r0,#7]
  679. orr r8,r8,r10,lsl #24
  680. ldrb r10,[r0,#8]
  681. orr r9,r9,r11,lsl #24
  682. add r0,r0,r2
  683. mov r2,r8,lsr #8
  684. mov r3,r9,lsr #8
  685. orr r2,r2,r9,lsl #24
  686. orr r3,r3,r10,lsl #24
  687. else
  688.     ldr r9,[r0,#4]
  689.     ldr r10,[r0,#8]
  690.     ldr r8,[r0],r2
  691.     if $Pos+8 < 32
  692.   mov r3,r9,lsr #$Pos+8
  693.   orr r3,r3,r10,lsl #32-$Pos-8
  694.   mov r2,r8,lsr #$Pos+8
  695.   orr r2,r2,r9,lsl #32-$Pos-8
  696.     else
  697.   mov r2,r9
  698.   mov r3,r10
  699.     endif
  700. if $Pos > 0
  701.   mov r8,r8,lsr #$Pos
  702.   mov r10,r10,lsl #32-$Pos
  703.   orr r8,r8,r9,lsl #32-$Pos
  704.   orr r9,r10,r9,lsr #$Pos
  705. endif
  706. endif
  707. and r10,r2,r14
  708. and r2,r12,r2,lsr #2
  709. and r11,r8,r14
  710. and r8,r12,r8,lsr #2
  711. add r8,r8,r2
  712. add r10,r10,r11
  713. and r2,r3,r14
  714. and r3,r12,r3,lsr #2
  715. and r11,r9,r14
  716. and r9,r12,r9,lsr #2
  717. add r9,r9,r3
  718. add r11,r2,r11
  719.   endif
  720. ldr r2,[sp]
  721.   mend
  722.   macro
  723.   CopyHorVerRow $Id, $Pos, $Parity, $Round, $Add
  724. ;r14 03030303
  725. ;r12 3f3f3f3f
  726. LoadHorVerRow $Id,$Pos,$Parity
  727. if $Round
  728.   and r3,r14,r14,lsr #1 ;0x01010101
  729. else
  730.   and r3,r14,r14,lsl #1 ;0x02020202
  731. endif
  732.     if $Parity
  733.   add r8,r8,r4
  734.   add r9,r9,r5
  735.   add r10,r10,r6
  736.   add r11,r11,r7
  737.   add r10,r10,r3
  738.   add r11,r11,r3
  739.   and r10,r14,r10,lsr #2
  740.   and r11,r14,r11,lsr #2
  741.   if $Add
  742.     add r8,r8,r10 
  743.     add r9,r9,r11
  744. orr r12,r12,r12,lsl #1  ;0x7F7F7F7F
  745.     ldr r11,[r1,#4]
  746.     ldr r10,[r1]
  747.     and r3,r12,r9,lsr #1
  748. orr r9,r11,r9
  749.     and r11,r12,r11,lsr #1
  750. add r11,r11,r3
  751.     and r3,r12,r8,lsr #1
  752. orr r8,r10,r8
  753.     and r10,r12,r10,lsr #1
  754. add r10,r10,r3
  755. and r3,r14,r14,lsr #1 ;0x01010101
  756. mvn r12,r14,lsl #6    ;restore r12
  757. and r9,r9,r3
  758. and r8,r8,r3
  759. add r11,r11,r9
  760. add r10,r10,r8
  761.     ldr r3,[sp,#4] ;end src for loop compare
  762.     str r11,[r1,#4]
  763.     str r10,[r1],#8
  764.   else
  765.     add r8,r8,r10
  766.     ldr r10,[sp,#8]  ;dstpitch
  767.     add r9,r9,r11
  768.     ldr r3,[sp,#4] ;end src for loop compare
  769.     str r9,[r1,#4]
  770.     str r8,[r1],r10
  771.   endif
  772. else
  773.   add r4,r4,r8
  774.   add r5,r5,r9
  775.   add r6,r6,r10
  776.   add r7,r7,r11
  777.   add r6,r6,r3
  778.   add r7,r7,r3
  779.   and r6,r14,r6,lsr #2
  780.   and r7,r14,r7,lsr #2
  781.   if $Add
  782.     add r4,r4,r6
  783.     add r5,r5,r7
  784. orr r12,r12,r12,lsl #1  ;0x7F7F7F7F
  785.     ldr r7,[r1,#4]
  786.     ldr r6,[r1]
  787.     and r3,r12,r5,lsr #1
  788. orr r5,r7,r5
  789.     and r7,r12,r7,lsr #1
  790. add r7,r7,r3
  791.     and r3,r12,r4,lsr #1
  792. orr r4,r6,r4
  793.     and r6,r12,r6,lsr #1
  794. add r6,r6,r3
  795. and r3,r14,r14,lsr #1 ;0x01010101
  796. mvn r12,r14,lsl #6    ;restore r12
  797. and r5,r5,r3
  798. and r4,r4,r3
  799. add r7,r7,r5
  800. add r6,r6,r4
  801.     str r7,[r1,#4]
  802.     str r6,[r1],#8
  803.   else
  804.     ldr r3,[sp,#8]  ;dstpitch
  805.     add r4,r4,r6
  806.     add r5,r5,r7
  807.     str r5,[r1,#4]
  808.     str r4,[r1],r3
  809.   endif
  810. endif
  811.   mend
  812.   macro
  813.   CopyBlockHorVer $Id, $Pos, $Round, $Add, $ARM5
  814. sub sp,sp,#12
  815. add r4,r0,r2,lsl #3
  816. add r4,r4,r2
  817. str r2,[sp] ;srcpitch
  818. str r4,[sp,#4] ;end src
  819. str r3,[sp,#8] ;dstpitch
  820. ldr r14,$Id.Mask
  821. mvn r12,r14,lsl #6
  822.     PreLoad $ARM5,$Pos
  823. LoadHorVerRow $Id,$Pos,1
  824. $Id.Loop
  825.     PreLoad $ARM5,$Pos
  826. CopyHorVerRow $Id,$Pos,0,$Round,$Add
  827.     PreLoad $ARM5,$Pos
  828. CopyHorVerRow $Id,$Pos,1,$Round,$Add
  829. cmp r0,r3
  830. bne $Id.Loop
  831. add sp,sp,#12
  832. ldmia sp!, {r4 - r11, pc}
  833. $Id.Mask dcd 0x03030303
  834.   mend
  835. ;---------------------------------------------------
  836. ; general unaligned copy (use preload)
  837. CopyBuild CopyBlock8x8,CopyBlock8x8,0,0,0,1
  838. CopyBuild CopyBlock16x16,CopyBlock16x16,0,0,0,1
  839. ;---------------------------------------------------
  840. ; smaller versions without preload
  841. ;
  842. ; CopyBuild CopyBlock,CopyBlock,0,0,1,0
  843. ; CopyBuild CopyBlockVer,CopyBlockVer,0,0,0,0
  844. ; CopyBuild CopyBlockHor,CopyBlockHor,0,0,0,0
  845. ; CopyBuild CopyBlockHorVer,CopyBlockHorVer,0,0,0,0
  846. ; CopyBuild CopyBlockVerRound,CopyBlockVer,1,0,0,0
  847. ; CopyBuild CopyBlockHorRound,CopyBlockHor,1,0,0,0
  848. ; CopyBuild CopyBlockHorVerRound,CopyBlockHorVer,1,0,0,0
  849. ;
  850. ; CopyBuild AddBlock,AddBlock,0,1,0,0
  851. ; CopyBuild AddBlockVer,CopyBlockVer,0,1,0,0
  852. ; CopyBuild AddBlockHor,CopyBlockHor,0,1,0,0
  853. ; CopyBuild AddBlockHorVer,CopyBlockHorVer,0,1,0,0
  854. ;
  855. ;---------------------------------------------------
  856. ; smaller versions with preload
  857. ;
  858. ; CopyBuild PreLoadCopyBlock,CopyBlock,0,0,1,1
  859. ; CopyBuild PreLoadCopyBlockVer,CopyBlockVer,0,0,0,1
  860. ; CopyBuild PreLoadCopyBlockHor,CopyBlockHor,0,0,0,1
  861. ; CopyBuild PreLoadCopyBlockHorVer,CopyBlockHorVer,0,0,0,1
  862. ; CopyBuild PreLoadCopyBlockVerRound,CopyBlockVer,1,0,0,1
  863. ; CopyBuild PreLoadCopyBlockHorRound,CopyBlockHor,1,0,0,1
  864. ; CopyBuild PreLoadCopyBlockHorVerRound,CopyBlockHorVer,1,0,0,1
  865. ;
  866. ; CopyBuild PreLoadAddBlock,AddBlock,0,1,0,1
  867. ; CopyBuild PreLoadAddBlockVer,CopyBlockVer,0,1,0,1
  868. ; CopyBuild PreLoadAddBlockHor,CopyBlockHor,0,1,0,1
  869. ; CopyBuild PreLoadAddBlockHorVer,CopyBlockHorVer,0,1,0,1
  870. ;
  871. ;---------------------------------------------------
  872. ; larger versions with preload
  873. ; (faster if there is enough intstruction cache available)
  874. CopyBuild CopyBlock,CopyBlock,0,0,1,1
  875. CopyBuild CopyBlockVer,CopyBlockVer,0,0,1,1
  876. CopyBuild CopyBlockHor,CopyBlockHor,0,0,1,1
  877. CopyBuild CopyBlockHorVer,CopyBlockHorVer,0,0,1,1
  878. CopyBuild CopyBlockVerRound,CopyBlockVer,1,0,1,1
  879. CopyBuild CopyBlockHorRound,CopyBlockHor,1,0,1,1
  880. CopyBuild CopyBlockHorVerRound,CopyBlockHorVer,1,0,1,1
  881. CopyBuild AddBlock,AddBlock,0,1,1,1
  882. CopyBuild AddBlockVer,CopyBlockVer,0,1,1,1
  883. CopyBuild AddBlockHor,CopyBlockHor,0,1,1,1
  884. CopyBuild AddBlockHorVer,CopyBlockHorVer,0,1,1,1
  885. CopyBuild CopyBlockM,CopyBlockM,0,0,1,1
  886. END