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

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: idct_arm.asm 284 2005-10-04 08:54:26Z picard $
  18. ;*
  19. ;* The Core Pocket Media Player
  20. ;* Copyright (c) 2004-2005 Gabor Kovacs
  21. ;*
  22. ;*****************************************************************************
  23. AREA |.text|, CODE
  24. EXPORT IDCT_Block4x8
  25. EXPORT IDCT_Block8x8
  26. EXPORT IDCT_Block4x8Swap
  27. EXPORT IDCT_Block8x8Swap
  28. ; r6 Block
  29. ; r7,r8 must be saved
  30. macro
  31. MCol8 $Name,$Rotate,$Pitch
  32. $Name PROC
  33. ; r10 = x0
  34. ; r4  = x1
  35. ; r2  = x2
  36. ; r1  = x3
  37. ; r3  = x4
  38. ; r12 = x5
  39. ; r0  = x6
  40. ; r5  = x7
  41. ; r11 = x8  
  42. ; r9  = tmp (x567)
  43. ldrsh     r4, [r6, #4*$Pitch]
  44. ldrsh     r0, [r6, #5*$Pitch]
  45. ldrsh     r12,[r6, #7*$Pitch]
  46. ldrsh     r5, [r6, #3*$Pitch]
  47. ldrsh     r2, [r6, #6*$Pitch]
  48. ldrsh     r1, [r6, #2*$Pitch]
  49. ldrsh     r3, [r6, #1*$Pitch]
  50. ldrsh     r10,[r6]
  51. if $Rotate
  52. add   r6,r6,r9
  53. endif
  54. orr       r9, r12, r0
  55. orr       r9, r9, r5
  56. orr       r11, r9, r2
  57. orr       r11, r11, r4
  58. orrs      r11, r11, r1
  59. bne       $Name.Mode2 
  60.   cmp       r3, #0
  61. bne       $Name.Mode1
  62. if $Rotate=0
  63. cmp       r10, #0
  64. beq       $Name.Zero
  65. endif
  66. mov       r10, r10, lsl #3
  67. strh      r10, [r6]
  68. strh      r10, [r6, #0x10]
  69. strh      r10, [r6, #0x20]
  70. strh      r10, [r6, #0x30]
  71. strh      r10, [r6, #0x40]
  72. strh      r10, [r6, #0x50]
  73. strh      r10, [r6, #0x60]
  74. strh      r10, [r6, #0x70]
  75. $Name.Zero
  76. mov pc,lr
  77. $Name.Mode1 ;x0,x4
  78. mov       r11, r3
  79. mov       r2, #0x8D, 30  ; 0x234 = 564
  80. orr       r2, r2, #1
  81. mov       r9, r3
  82. mul       r2, r11, r2
  83. mov       r11, #0xB1, 28  ; 0xB10 = 2832
  84. orr       r11, r11, #9
  85. mul       r4, r9, r11
  86. mov       r11, #0x96, 28  ; 0x960 = 2400
  87. orr       r11, r11, #8
  88. mul       r5, r9, r11
  89. mov       r11, #0x19, 26  ; 0x640 = 1600
  90. mov       r1, r10, lsl #11
  91. orr       r11, r11, #9
  92. mul       r0, r3, r11
  93. add       r1, r1, #0x80  ; 0x80 = 128
  94. add       r3, r4, r1
  95. add       r11, r5, r1
  96. mov       r3, r3, asr #8
  97. mov       r11, r11, asr #8
  98. strh      r3, [r6]
  99. strh      r11, [r6, #0x10]  ; 0x10 = 16
  100. add       r3, r0, r1
  101. add       r11, r2, r1
  102. mov       r3, r3, asr #8
  103. mov       r11, r11, asr #8
  104. strh      r3, [r6, #0x20]  ; 0x20 = 32
  105. strh      r11, [r6, #0x30]  ; 0x30 = 48
  106. sub       r3, r1, r2
  107. sub       r11, r1, r0
  108. mov       r3, r3, asr #8
  109. mov       r11, r11, asr #8
  110. strh      r3, [r6, #0x40]  ; 0x40 = 64
  111. strh      r11, [r6, #0x50]  ; 0x50 = 80
  112. sub       r3, r1, r5
  113. sub       r11, r1, r4
  114. mov       r3, r3, asr #8
  115. mov       r11, r11, asr #8
  116. strh      r3, [r6, #0x60]  ; 0x60 = 96
  117. strh      r11, [r6, #0x70]  ; 0x70 = 112
  118. mov pc,lr
  119. $Name.Mode2 ;x0,x1,x2,x3
  120. orrs      r11, r9, r3
  121. bne       $Name.Mode3
  122. mov       r3, r10, lsl #11
  123. add       r3, r3, #128
  124. mov       r9, #0x45, 28  ; 0x450 = 1104
  125. add       r5, r3, r4, lsl #11
  126. add       r11, r2, r1
  127. orr       r9, r9, #4
  128. sub       r3, r3, r4, lsl #11
  129. mul       r4, r11, r9
  130. mov       r11, #0x3B, 26  ; 0xEC0 = 3776
  131. orr       r11, r11, #8
  132. mul       r11, r2, r11
  133. sub       r2, r4, r11
  134. mov       r11, #0x62, 28  ; 0x620 = 1568
  135. mul       r11, r1, r11
  136. add       r0, r2, r3
  137. add       r1, r11, r4
  138. add       r4, r5, r1
  139. sub       r3, r3, r2
  140. sub       r5, r5, r1
  141. mov       r1, r4, asr #8
  142. mov       r3, r3, asr #8
  143. mov       r2, r0, asr #8
  144. mov       r4, r5, asr #8
  145. strh      r1, [r6,#0x00]
  146. strh      r2, [r6,#0x10]
  147. strh      r3, [r6,#0x20]
  148. strh      r4, [r6,#0x30]
  149. strh      r4, [r6,#0x40] 
  150. strh      r3, [r6,#0x50] 
  151. strh      r2, [r6,#0x60] 
  152. strh      r1, [r6,#0x70] 
  153. mov pc,lr
  154. $Name.Mode3 ;x0,x1,x2,x3,x4,x5,x6,x7
  155. mov     r9, #0x8D, 30  
  156. orr     r9, r9, #1 ;W7
  157. add     r11, r12, r3
  158. mul     r11, r9, r11 ;x8 = W7 * (x5 + x4)
  159. mov     r9, #0x8E, 28  
  160. orr     r9, r9, #4 ;W1-W7
  161. mla     r3, r9, r3, r11 ;x4 = x8 + (W1-W7) * x4
  162. mvn     r9, #0xD40
  163. eor     r9, r9, #0xD ;-W1-W7
  164. mla     r12, r9, r12, r11 ;x5 = x8 + (-W1-W7) * x5
  165. mov     r9, #0x96, 28 ;
  166. orr     r9, r9, #8 ;W3
  167. add     r11, r0, r5
  168. mul     r11, r9, r11 ;x8 = W3 * (x6 + x7)
  169. mvn     r9, #0x310
  170. eor     r9, r9, #0xE ;W5-W3
  171. mla     r0, r9, r0, r11 ;x6 = x8 + (W5-W3) * x6
  172. mvn     r9, #0xFB0 ;-W3-W5
  173. mla     r5, r9, r5, r11 ;x7 = x8 + (-W3-W5) * x7
  174. mov     r10, r10, lsl #11
  175. add     r10, r10, #128 ;x0 = (x0 << 11) + 128
  176. add r11, r10,r4,lsl #11 ;x8 = x0 + (x1 << 11)
  177. sub r10, r10,r4,lsl #11 ;x0 = x0 - (x1 << 11)
  178. mov     r9, #0x45, 28  
  179. orr     r9, r9, #4 ;W6
  180. add r4, r1, r2
  181. mul r4, r9, r4 ;x1 = W6 * (x3 + x2)
  182. mvn     r9, #0xEC0
  183. eor     r9, r9, #0x7 ;-W2-W6
  184. mla     r2, r9, r2, r4 ;x2 = x1 + (-W2-W6) * x2
  185. mov     r9, #0x620 ;W2-W6
  186. mla     r1, r9, r1, r4 ;x3 = x1 + (W2-W6) * x3
  187. add r4, r3, r0 ;x1 = x4 + x6
  188. sub r3, r3, r0 ;x4 -= x6
  189. add r0, r12,r5 ;x6 = x5 + x7
  190. sub r12,r12,r5 ;x5 -= x7
  191. add r5, r11,r1 ;x7 = x8 + x3
  192. sub r11,r11,r1 ;x8 -= x3
  193. add r1, r10,r2 ;x3 = x0 + x2
  194. sub r10,r10,r2 ;x0 -= x2
  195. add r9, r3, r12 ;x4 + x5
  196. sub r3, r3, r12 ;x4 - x5
  197. mov r12, #181
  198. mul r2, r9, r12 ;181 * (x4 + x5)
  199. mul r9, r3, r12 ;181 * (x4 - x5)
  200. add r2, r2, #128 ;x2 = 181 * (x4 + x5) + 128
  201. add r3, r9, #128 ;x4 = 181 * (x4 - x5) + 128
  202. add r9,r5,r4
  203. sub r5,r5,r4
  204. mov r9,r9,asr #8 ;(x7 + x1) >> 8
  205. mov r5,r5,asr #8 ;(x7 - x1) >> 8
  206. strh r9,[r6,#0x00]
  207. strh r5,[r6,#0x70]
  208. add r9,r1,r2,asr #8
  209. sub r1,r1,r2,asr #8
  210. mov r9,r9,asr #8 ;(x3 + x2) >> 8
  211. mov r1,r1,asr #8 ;(x3 - x2) >> 8
  212. strh r9,[r6,#0x10]
  213. strh r1,[r6,#0x60]
  214. add r9,r10,r3,asr #8
  215. sub r10,r10,r3,asr #8
  216. mov r9,r9,asr #8 ;(x0 + x4) >> 8
  217. mov r10,r10,asr #8 ;(x0 - x4) >> 8
  218. strh r9,[r6,#0x20]
  219. strh r10,[r6,#0x50]
  220. add r9,r11,r0
  221. sub r11,r11,r0
  222. mov r9,r9,asr #8 ;(x8 + x6) >> 8
  223. mov r11,r11,asr #8 ;(x8 - x6) >> 8
  224. strh r9,[r6,#0x30]
  225. strh r11,[r6,#0x40]
  226. mov pc,lr
  227. mend
  228. MCol8 Col8,0,16
  229. MCol8 Col8Swap,1,2
  230. ; r0 Block[0]
  231. ; r6 Block
  232. ; r7 Src
  233. ; r8 Dst
  234. ALIGN 16
  235. RowConst PROC
  236. add     r0, r0, #0x20  ; 0x20 = 32
  237. cmp     r7, #0
  238. mov     r3, r0, asr #6
  239. beq     RowConst_NoSrc
  240. cmp     r3, #0
  241. beq RowConst_Zero
  242. blt     RowConst_Sub
  243. RowConst_Add
  244. ldr     r0, CarryMask
  245. ldr     r2, [r7]
  246. orr     r3, r3, r3, lsl #8
  247. orr     r3, r3, r3, lsl #16
  248. add     r4, r2, r3
  249. eor     r11, r2, r3
  250. and     r2, r3, r2
  251. bic     r11, r11, r4
  252. orr     r11, r11, r2
  253. and     r5, r11, r0
  254. mov     r12, r5, lsl #1
  255. sub     r10, r4, r12
  256. sub     r11, r12, r5, lsr #7
  257. ldr     r2, [r7, #4]
  258. orr     r11, r11, r10
  259. str     r11, [r8]
  260. add     r4, r2, r3
  261. eor     r11, r2, r3
  262. and     r2, r3, r2
  263. bic     r11, r11, r4
  264. orr     r11, r11, r2
  265. and     r5, r11, r0
  266. mov     r12, r5, lsl #1
  267. sub     r10, r4, r12
  268. sub     r11, r12, r5, lsr #7
  269. orr     r11, r11, r10
  270. str     r11, [r8, #4]
  271. add r7, r7, #8 ;source stride
  272. mov pc,lr
  273. RowConst_Sub
  274. ldr     r0, CarryMask
  275. ldr     r2, [r7]
  276. rsb     r3, r3, #0
  277. orr     r3, r3, r3, lsl #8
  278. orr     r3, r3, r3, lsl #16
  279. mvn r2, r2
  280. add     r4, r2, r3
  281. eor     r11, r2, r3
  282. and     r2, r3, r2
  283. bic     r11, r11, r4
  284. orr     r11, r11, r2
  285. and     r5, r11, r0
  286. mov     r12, r5, lsl #1
  287. sub     r10, r4, r12
  288. sub     r11, r12, r5, lsr #7
  289. ldr     r2, [r7, #4]
  290. orr     r11, r11, r10
  291. mvn r11, r11
  292. str     r11, [r8]
  293. mvn r2, r2
  294. add     r4, r2, r3
  295. eor     r11, r2, r3
  296. and     r2, r3, r2
  297. bic     r11, r11, r4
  298. orr     r11, r11, r2
  299. and     r5, r11, r0
  300. mov     r12, r5, lsl #1
  301. sub     r10, r4, r12
  302. sub     r11, r12, r5, lsr #7
  303. orr     r11, r11, r10
  304. mvn r11, r11
  305. str     r11, [r8, #4]
  306. add r7, r7, #8 ;source stride
  307. mov pc,lr
  308. RowConst_Zero
  309. ldr     r1, [r7]
  310. ldr     r2, [r7, #4]
  311. str     r1, [r8]
  312. str     r2, [r8, #4]
  313. add r7, r7, #8 ;source stride
  314. mov pc,lr
  315. RowConst_NoSrc
  316. cmp     r3, #0
  317. movmi   r3, #0
  318. cmppl   r3, #255
  319. movgt   r3, #255
  320. orr     r3, r3, r3, lsl #8
  321. orr     r3, r3, r3, lsl #16
  322. str     r3, [r8]
  323. str     r3, [r8, #4]
  324. mov pc,lr
  325. ENDP
  326. CarryMask DCD 0x80808080
  327. W1 DCW 2841                 ; 2048*sqrt(2)*cos(1*pi/16) 
  328. W3 DCW 2408                 ; 2048*sqrt(2)*cos(3*pi/16) 
  329. nW5 DCW 0xF9B7 ;-1609        ; 2048*sqrt(2)*cos(5*pi/16) 
  330. W6 DCW 1108                 ; 2048*sqrt(2)*cos(6*pi/16) 
  331. W7 DCW 565                  ; 2048*sqrt(2)*cos(7*pi/16) 
  332. W2 DCW 2676                 ; 2048*sqrt(2)*cos(2*pi/16) 
  333. ; r6 Block
  334. ; r7 Src
  335. ; r8 Dst
  336. ALIGN 16
  337. IDCT_Block4x8Swap PROC
  338. add r0, r0, #256
  339. stmdb   sp!, {r0, r2, r4 - r12, lr}  ; r0=BlockEnd r2=DstStride
  340. sub r6, r0, #256 ;Block
  341. mov r7, r3 ;Src
  342. mov     r8, r1 ;Dst
  343. mov r9,#128-0*16+0*2
  344. bl      Col8Swap  
  345. mov r9,#128-1*16+1*2
  346. add     r6, r6, #1*16-0*2-128
  347. bl      Col8Swap  
  348. mov r9,#128-2*16+2*2
  349. add     r6, r6, #2*16-1*2-128
  350. bl      Col8Swap  
  351. mov r9,#128-3*16+3*2
  352. add     r6, r6, #3*16-2*2-128
  353. bl      Col8Swap 
  354. sub     r6, r6, #6
  355. b Row4_Loop
  356. ALIGN 16
  357. IDCT_Block4x8 PROC
  358. add r0, r0, #128
  359. stmdb   sp!, {r0, r2, r4 - r12, lr}  ; r0=BlockEnd r2=DstStride
  360. sub r6, r0, #128 ;Block
  361. mov r7, r3 ;Src
  362. mov     r8, r1 ;Dst
  363. bl      Col8  
  364. add     r6, r6, #2
  365. bl      Col8  
  366. add     r6, r6, #2
  367. bl      Col8  
  368. add     r6, r6, #2
  369. bl      Col8 
  370. sub     r6, r6, #6
  371. Row4_Loop
  372. ldrsh   r4, [r6, #4] ;x3
  373. ldrsh   r5, [r6, #6] ;x7
  374. ldrsh   r3, [r6, #2] ;x4
  375. ldrsh   r0, [r6] ;x0
  376. orr     r11, r5, r4
  377. orrs    r11, r11, r3
  378. bne     Row4_NoConst
  379. bl RowConst
  380. b Row4_Next
  381. Row4_NoConst
  382. cmp     r7, #0
  383. ldrsh r10, W7
  384. ldrsh r11, W1
  385. mov r2, #4
  386. add     r0, r0, #32
  387. mov     r0, r0, lsl #8 ;x0
  388. mla     r14, r3, r10, r2 ;x5 = x4 * W7 + 4
  389. ldrsh r10, W3
  390. mla     r3, r11, r3, r2 ;x4 = x4 * W1 + 4
  391. mov     r14, r14, asr #3 ;x5 >>= 3
  392. ldrsh r11, nW5
  393. mla     r12, r5, r10, r2 ;x6 = x7 * W3 + 4
  394. mov     r3, r3, asr #3 ;x4 >>= 3
  395. ldrsh r10, W6
  396. mla     r5, r11, r5, r2 ;x7 = x7 * -W5 + 4
  397. ldrsh r11, W2
  398. add     r9, r3, r12, asr #3 ;x1 = x4 + (x6 >> 3)
  399. sub     r3, r3, r12, asr #3 ;x4 = x4 - (x6 >> 3)
  400. mla     r12, r4, r10, r2 ;x2 = x3 * W6 + 4
  401. mla     r4, r11, r4, r2 ;x3 = x3 * W2 + 4
  402. add     r2, r14, r5, asr #3 ;x6 = x5 + (x7 >> 3)
  403. sub     r5, r14, r5, asr #3 ;x5 = x5 - (x7 >> 3)
  404. add     r14, r0, r4, asr #3 ;x7 = x0 + (x3 >> 3)
  405. sub     r4, r0, r4, asr #3 ;x8 = x0 - (x3 >> 3)
  406. add     r10, r0, r12, asr #3;x3 = x0 + (x2 >> 3)
  407. sub     r0, r0, r12, asr #3 ;x0 = x0 - (x2 >> 3)
  408. add     r1, r5, r3
  409. mov     r11, #181
  410. mul     r12, r1, r11 ;x2 = 181 * (x5 + x4)
  411. sub     r3, r3, r5
  412. mul     r1, r3, r11 ;x4 = 181 * (x4 - x5)
  413. add     r12, r12, #128 ;x2 += 128
  414. add     r3, r1, #128 ;x4 += 128
  415. add     r1, r14, r9 ;x5 = x7 + x1
  416. sub     r5, r14, r9 ;x1 = x7 - x1
  417. add     r11, r10, r12, asr #8 ;x7 = x3 + (x2 >> 8)
  418. sub     r14, r10, r12, asr #8 ;x2 = x3 - (x2 >> 8)
  419. add     r9, r0, r3, asr #8 ;x3 = x0 + (x4 >> 8)
  420. sub     r3, r0, r3, asr #8  ;x4 = x0 - (x4 >> 8)
  421. add     r12, r4, r2 ;x0 = x8 + x6
  422. sub     r4,  r4, r2 ;x6 = x8 - x6
  423. beq     Row4_NoSrc
  424. ldrb    r0, [r7]
  425. ldrb    r2, [r7, #7]
  426. ldrb    r10, [r7, #1]
  427. add     r1, r0, r1, asr #14
  428. add     r5, r2, r5, asr #14
  429. add     r11, r10, r11, asr #14
  430. ldrb    r2, [r7, #6]
  431. ldrb    r0, [r7, #2]
  432. ldrb    r10, [r7, #5]
  433. add     r14, r2, r14, asr #14
  434. add     r9, r0, r9, asr #14
  435. ldrb    r0, [r7, #3]
  436. ldrb    r2, [r7, #4]
  437. add     r3, r10, r3, asr #14
  438. add     r12, r0, r12, asr #14
  439. add     r4, r2, r4, asr #14
  440. add r7, r7, #8 ;source stride
  441. Row4_Sat
  442. orr     r0, r5, r14
  443. orr     r0, r0, r4
  444. orr     r0, r0, r1
  445. orr     r0, r0, r12
  446. orr     r0, r0, r11
  447. orr     r0, r0, r9
  448. orr     r0, r0, r3
  449. bics    r0, r0, #0xFF  ; 0xFF = 255
  450. beq     Row4_Write
  451. mov r0, #0xFFFFFF00
  452. tst     r1, r0
  453. movne r1, #0xFF
  454. movmi r1, #0x00
  455. tst     r11, r0
  456. movne r11, #0xFF
  457. movmi r11, #0x00
  458. tst     r9, r0
  459. movne r9, #0xFF
  460. movmi r9, #0x00
  461. tst     r12, r0
  462. movne r12, #0xFF
  463. movmi r12, #0x00
  464. tst     r4, r0
  465. movne r4, #0xFF
  466. movmi r4, #0x00
  467. tst     r3, r0
  468. movne r3, #0xFF
  469. movmi r3, #0x00
  470. tst     r14, r0
  471. movne r14, #0xFF
  472. movmi r14, #0x00
  473. tst     r5, r0
  474. movne r5, #0xFF
  475. movmi r5, #0x00
  476. Row4_Write
  477. strb    r1, [r8]
  478. strb    r11,[r8, #1]
  479. strb    r9, [r8, #2]
  480. strb    r12,[r8, #3]
  481. strb    r4, [r8, #4]
  482. strb    r3, [r8, #5]
  483. strb    r14,[r8, #6]
  484. strb    r5, [r8, #7]
  485. Row4_Next
  486. ldr r2, [sp, #4] ;DstStride
  487. ldr r1, [sp, #0] ;BlockEnd
  488. add r6,r6,#16 ;Block += 16
  489. add r8,r8,r2 ;Dst += DstStride
  490. cmp r6,r1
  491. bne Row4_Loop
  492. ldmia   sp!, {r0,r2,r4 - r12, pc}  
  493. Row4_NoSrc
  494. mov     r5, r5, asr #14
  495. mov     r14, r14, asr #14
  496. mov     r12, r12, asr #14
  497. mov     r1, r1, asr #14
  498. mov     r11, r11, asr #14
  499. mov     r9, r9, asr #14
  500. mov     r3, r3, asr #14
  501. mov     r4, r4, asr #14
  502. b Row4_Sat
  503. ENDP
  504. ; r6 Block
  505. ; r7 Src
  506. ; r8 Dst
  507. ALIGN 16
  508. IDCT_Block8x8Swap PROC
  509. add r0, r0, #256
  510. stmdb   sp!, {r0, r2, r4 - r12, lr}  ; r0=BlockEnd r2=DstStride
  511. sub r6, r0, #256 ;Block
  512. mov r7, r3 ;Src
  513. mov     r8, r1 ;Dst
  514. mov r9,#128-0*16+0*2
  515. bl      Col8Swap
  516. mov r9,#128-1*16+1*2
  517. add     r6, r6, #1*16-0*2-128
  518. bl      Col8Swap  
  519. mov r9,#128-2*16+2*2
  520. add     r6, r6, #2*16-1*2-128
  521. bl      Col8Swap 
  522. mov r9,#128-3*16+3*2
  523. add     r6, r6, #3*16-2*2-128
  524. bl      Col8Swap 
  525. mov r9,#128-4*16+4*2
  526. add     r6, r6, #4*16-3*2-128
  527. bl      Col8Swap 
  528. mov r9,#128-5*16+5*2
  529. add     r6, r6, #5*16-4*2-128
  530. bl      Col8Swap 
  531. mov r9,#128-6*16+6*2
  532. add     r6, r6, #6*16-5*2-128
  533. bl      Col8Swap 
  534. mov r9,#128-7*16+7*2
  535. add     r6, r6, #7*16-6*2-128
  536. bl      Col8Swap 
  537. sub     r6, r6, #14
  538. b Row8_Loop
  539. ALIGN 16
  540. IDCT_Block8x8 PROC
  541. add r0, r0, #128
  542. stmdb   sp!, {r0, r2, r4 - r12, lr}  ; r0=BlockEnd r2=DstStride
  543. sub r6, r0, #128 ;Block
  544. mov r7, r3 ;Src
  545. mov     r8, r1 ;Dst
  546. bl      Col8  
  547. add     r6, r6, #2
  548. bl      Col8  
  549. add     r6, r6, #2
  550. bl      Col8  
  551. add     r6, r6, #2
  552. bl      Col8  
  553. add     r6, r6, #2
  554. bl      Col8  
  555. add     r6, r6, #2
  556. bl      Col8  
  557. add     r6, r6, #2
  558. bl      Col8  
  559. add     r6, r6, #2
  560. bl      Col8 
  561. sub     r6, r6, #14
  562. Row8_Loop
  563. ldrsh   r0, [r6] ;x0
  564. ldrsh   r3, [r6, #2] ;x4
  565. ldrsh   r4, [r6, #4] ;x3
  566. ldrsh   r5, [r6, #6] ;x7
  567. ldrsh   r9, [r6, #8] ;x1
  568. ldrsh   r2, [r6, #10] ;x6
  569. ldrsh   r14,[r6, #12] ;x2
  570. ldrsh   r1, [r6, #14] ;x5
  571. orr     r11, r3, r4
  572. orr     r11, r11, r5
  573. orr     r11, r11, r9
  574. orr     r11, r11, r2
  575. orr     r11, r11, r14
  576. orrs    r11, r11, r1
  577. bne     Row8_NoConst
  578. bl RowConst
  579. b Row8_Next
  580. _W3 DCW 2408                 ; 2048*sqrt(2)*cos(3*pi/16) 
  581. _W6 DCW 1108                 ; 2048*sqrt(2)*cos(6*pi/16) 
  582. _W7 DCW 565                  ; 2048*sqrt(2)*cos(7*pi/16) 
  583. _W1_nW7 DCW 2276
  584. _nW1_nW7 DCW 0xF2B2 ;-3406
  585. _W5_nW3 DCW 0xFCE1 ;-799
  586. _nW2_nW6 DCW 0xF138 ;-3784
  587. ALIGN 4
  588. Row8_NoConst
  589. cmp     r7, #0
  590. add     r0, r0, #32
  591. ldrsh r10, _W7
  592. mov     r0, r0, lsl #11 ;x0 = (x0 + 32) << 11
  593. ldrsh r12, _W1_nW7
  594. add r11,r3,r1
  595. mul r11,r10,r11 ;x8 = W7 * (x4 + x5)
  596. ldrsh r10, _nW1_nW7
  597. mla     r3, r12, r3, r11 ;x4 = x8 + (W1-W7) * x4
  598. ldrsh r12, _W3
  599. mla     r1, r10, r1, r11 ;x5 = x8 + (-W1-W7) * x5
  600. ldrsh r10, _W5_nW3
  601. add r11,r2,r5 ;x6 + x7
  602. mul r11,r12,r11 ;x8 = W3 * (x6 + x7)
  603. mvn     r12, #0xFB0 ;-W3-W5
  604. mla r2,r10,r2,r11 ;x6 = x8 + (W5-W3) * x6
  605. ldrsh r10, _W6
  606. mla r5,r12,r5,r11 ;x7 = x8 + (-W3-W5) * x7
  607. ldrsh r12, _nW2_nW6 
  608. add r11, r0, r9, lsl #11;x8 = x0 + (x1 << 11)
  609. sub r0, r0, r9, lsl #11 ;x0 = x0 - (x1 << 11)
  610. add r9, r4, r14
  611. mul r9, r10, r9 ;x1 = W6 * (x3 + x2)
  612. mov     r10, #0x620 ;W2-W6
  613. mla r14, r12, r14, r9 ;x2 = x1 + (-W2-W6) * x2
  614. mov r12, #181
  615. mla r4, r10, r4, r9 ;x3 = x1 + (W2-W6) * x3
  616. add r9, r3, r2 ;x1 = x4 + x6
  617. sub r3, r3, r2 ;x4 = x4 - x6
  618. add r2, r1, r5 ;x6 = x5 + x7
  619. sub r1, r1, r5 ;x5 = x5 - x7
  620. add r5, r11, r4 ;x7 = x8 + x3
  621. sub r11, r11, r4 ;x8 = x8 - x3
  622. add r4, r0, r14 ;x3 = x0 + x2
  623. sub r0, r0, r14 ;x0 = x0 - x2
  624. add r3, r3, #4 ;
  625. add r14, r3, r1 ;x2 = x4 + x5 + 4
  626. sub r3, r3, r1 ;x4 = x4 - x5 + 4
  627. mov r10, #16
  628. mov r14, r14, asr #3
  629. mov r3, r3, asr #3
  630. mla r14, r12, r14, r10 ;x2 = 181 * ((x4 + x5 + 4) >> 3) + 16
  631. mla r3, r12, r3, r10 ;x4 = 181 * ((x4 - x5 + 4) >> 3) + 16
  632. add r1, r5, r9 ;x5 = x7 + x1
  633. sub r9, r5, r9 ;x1 = x7 - x1
  634. add r5, r4, r14, asr #5 ;x7 = x3 + (x2 >> 5)
  635. sub r14,r4, r14, asr #5 ;x2 = x3 - (x2 >> 5)
  636. add r4, r0, r3, asr #5 ;x3 = x0 + (x4 >> 5)
  637. sub r3, r0, r3, asr #5 ;x4 = x0 - (x4 >> 5)
  638. add r0, r11, r2 ;x0 = x8 + x6
  639. sub r2, r11, r2 ;x6 = x8 - x6
  640. beq     Row8_NoSrc
  641. ldrb    r10, [r7]
  642. ldrb    r12, [r7, #7]
  643. ldrb    r11, [r7, #1]
  644. add     r1, r10, r1, asr #17
  645. add     r9, r12, r9, asr #17
  646. add     r5, r11, r5, asr #17
  647. ldrb    r10, [r7, #6]
  648. ldrb    r12, [r7, #2]
  649. ldrb    r11, [r7, #5]
  650. add     r14, r10, r14, asr #17
  651. add     r4, r12, r4, asr #17
  652. ldrb    r10, [r7, #3]
  653. ldrb    r12, [r7, #4]
  654. add     r3, r11, r3, asr #17
  655. add     r0, r10, r0, asr #17
  656. add     r2, r12, r2, asr #17
  657. add r7, r7, #8 ;source stride
  658. Row8_Sat
  659. orr     r10, r1, r9
  660. orr     r10, r10, r5
  661. orr     r10, r10, r14
  662. orr     r10, r10, r4
  663. orr     r10, r10, r3
  664. orr     r10, r10, r0
  665. orr     r10, r10, r2
  666. bics    r10, r10, #0xFF  ; 0xFF = 255
  667. beq     Row8_Write
  668. mov r10, #0xFFFFFF00
  669. tst     r1, r10
  670. movne r1, #0xFF
  671. movmi r1, #0x00
  672. tst     r9, r10
  673. movne r9, #0xFF
  674. movmi r9, #0x00
  675. tst     r5, r10
  676. movne r5, #0xFF
  677. movmi r5, #0x00
  678. tst     r14, r10
  679. movne r14, #0xFF
  680. movmi r14, #0x00
  681. tst     r4, r10
  682. movne r4, #0xFF
  683. movmi r4, #0x00
  684. tst     r3, r10
  685. movne r3, #0xFF
  686. movmi r3, #0x00
  687. tst     r0, r10
  688. movne r0, #0xFF
  689. movmi r0, #0x00
  690. tst     r2, r10
  691. movne r2, #0xFF
  692. movmi r2, #0x00
  693. Row8_Write
  694. strb    r1, [r8]
  695. strb    r5, [r8, #1]
  696. strb    r4, [r8, #2]
  697. strb    r0, [r8, #3]
  698. strb    r2, [r8, #4]
  699. strb    r3, [r8, #5]
  700. strb    r14,[r8, #6]
  701. strb    r9, [r8, #7]
  702. Row8_Next
  703. ldr r2, [sp, #4] ;DstStride
  704. ldr r1, [sp, #0] ;BlockEnd
  705. add r6,r6,#16 ;Block += 16
  706. add r8,r8,r2 ;Dst += DstStride
  707. cmp r6,r1
  708. bne Row8_Loop
  709. ldmia   sp!, {r0,r2,r4 - r12, pc}  
  710. Row8_NoSrc
  711. mov     r1, r1, asr #17
  712. mov     r9, r9, asr #17
  713. mov     r5, r5, asr #17
  714. mov     r14, r14, asr #17
  715. mov     r4, r4, asr #17
  716. mov     r3, r3, asr #17
  717. mov     r0, r0, asr #17
  718. mov     r2, r2, asr #17
  719. b Row8_Sat
  720. ENDP
  721. END