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

Windows CE

开发平台:

C/C++

  1. /* 
  2.    C-like prototype :
  3. void j_rev_dct_ARM(DCTBLOCK data)
  4.    With DCTBLOCK being a pointer to an array of 64 'signed shorts'
  5.    Copyright (c) 2001 Lionel Ulmer (lionel.ulmer@free.fr / bbrox@bbrox.org)
  6.    Permission is hereby granted, free of charge, to any person obtaining a copy
  7.    of this software and associated documentation files (the "Software"), to deal
  8.    in the Software without restriction, including without limitation the rights
  9.    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10.    copies of the Software, and to permit persons to whom the Software is
  11.    furnished to do so, subject to the following conditions:
  12.    The above copyright notice and this permission notice shall be included in
  13.    all copies or substantial portions of the Software.
  14.    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15.    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16.    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
  17.    COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
  18.    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  19.    CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  20. */
  21. #define FIX_0_298631336 2446
  22. #define FIX_0_541196100 4433
  23. #define FIX_0_765366865 6270
  24. #define FIX_1_175875602 9633
  25. #define FIX_1_501321110 12299
  26. #define FIX_2_053119869 16819
  27. #define FIX_3_072711026 25172
  28. #define FIX_M_0_390180644 -3196
  29. #define FIX_M_0_899976223 -7373
  30. #define FIX_M_1_847759065 -15137
  31. #define FIX_M_1_961570560 -16069
  32. #define FIX_M_2_562915447 -20995
  33. #define FIX_0xFFFF 0xFFFF
  34. #define FIX_0_298631336_ID      0
  35. #define FIX_0_541196100_ID      4
  36. #define FIX_0_765366865_ID      8
  37. #define FIX_1_175875602_ID     12
  38. #define FIX_1_501321110_ID     16
  39. #define FIX_2_053119869_ID     20
  40. #define FIX_3_072711026_ID     24
  41. #define FIX_M_0_390180644_ID   28
  42. #define FIX_M_0_899976223_ID   32
  43. #define FIX_M_1_847759065_ID   36
  44. #define FIX_M_1_961570560_ID   40
  45. #define FIX_M_2_562915447_ID   44
  46. #define FIX_0xFFFF_ID          48
  47. .text
  48. .align
  49. .global j_rev_dct_ARM
  50. j_rev_dct_ARM:
  51. stmdb   sp!, { r4 - r12, lr }   @ all callee saved regs
  52. sub sp, sp, #4                  @ reserve some space on the stack
  53. str r0, [ sp ]                  @ save the DCT pointer to the stack
  54. mov lr, r0                      @ lr = pointer to the current row
  55. mov r12, #8                     @ r12 = row-counter
  56. add r11, pc, #(const_array-.-8) @ r11 = base pointer to the constants array
  57. row_loop:
  58. ldrsh r0, [lr, # 0]             @ r0 = 'd0'
  59. ldrsh r1, [lr, # 8]             @ r1 = 'd1'
  60. @ Optimization for row that have all items except the first set to 0
  61. @ (this works as the DCTELEMS are always 4-byte aligned)
  62. ldr r5, [lr, # 0]
  63. ldr r2, [lr, # 4]
  64. ldr r3, [lr, # 8]
  65. ldr r4, [lr, #12]
  66. orr r3, r3, r4
  67. orr r3, r3, r2
  68. orrs r5, r3, r5
  69. beq end_of_row_loop             @ nothing to be done as ALL of them are '0'
  70. orrs r2, r3, r1
  71. beq empty_row
  72. ldrsh r2, [lr, # 2]             @ r2 = 'd2'
  73. ldrsh r4, [lr, # 4]             @ r4 = 'd4'
  74. ldrsh r6, [lr, # 6]             @ r6 = 'd6'
  75. ldr r3, [r11, #FIX_0_541196100_ID]
  76. add r7, r2, r6
  77. ldr r5, [r11, #FIX_M_1_847759065_ID]
  78. mul r7, r3, r7                      @ r7 = z1
  79. ldr r3, [r11, #FIX_0_765366865_ID]
  80. mla r6, r5, r6, r7                  @ r6 = tmp2
  81. add r5, r0, r4                      @ r5 = tmp0
  82. mla r2, r3, r2, r7                  @ r2 = tmp3
  83. sub r3, r0, r4                      @ r3 = tmp1
  84. add r0, r2, r5, lsl #13             @ r0 = tmp10
  85. rsb r2, r2, r5, lsl #13             @ r2 = tmp13
  86. add r4, r6, r3, lsl #13             @ r4 = tmp11
  87. rsb r3, r6, r3, lsl #13             @ r3 = tmp12
  88. stmdb   sp!, { r0, r2, r3, r4 } @ save on the stack tmp10, tmp13, tmp12, tmp11
  89. ldrsh r3, [lr, #10]             @ r3 = 'd3'
  90. ldrsh r5, [lr, #12]             @ r5 = 'd5'
  91. ldrsh r7, [lr, #14]             @ r7 = 'd7'
  92. add r0, r3, r5                 @ r0 = 'z2'
  93. add r2, r1, r7                  @ r2 = 'z1'
  94. add r4, r3, r7                  @ r4 = 'z3'
  95. add r6, r1, r5                  @ r6 = 'z4'
  96. ldr r9, [r11, #FIX_1_175875602_ID]
  97. add r8, r4, r6                  @ r8 = z3 + z4
  98. ldr r10, [r11, #FIX_M_0_899976223_ID]
  99. mul r8, r9, r8                  @ r8 = 'z5'
  100. ldr r9, [r11, #FIX_M_2_562915447_ID]
  101. mul r2, r10, r2                 @ r2 = 'z1'
  102. ldr r10, [r11, #FIX_M_1_961570560_ID]
  103. mul r0, r9, r0                  @ r0 = 'z2'
  104. ldr r9, [r11, #FIX_M_0_390180644_ID]
  105. mla r4, r10, r4, r8             @ r4 = 'z3'
  106. ldr r10, [r11, #FIX_0_298631336_ID]
  107. mla r6, r9, r6, r8              @ r6 = 'z4'
  108. ldr r9, [r11, #FIX_2_053119869_ID]
  109. mla r7, r10, r7, r2             @ r7 = tmp0 + z1
  110. ldr r10, [r11, #FIX_3_072711026_ID]
  111. mla r5, r9, r5, r0              @ r5 = tmp1 + z2
  112. ldr r9, [r11, #FIX_1_501321110_ID]
  113. mla r3, r10, r3, r0             @ r3 = tmp2 + z2
  114. add r7, r7, r4                  @ r7 = tmp0
  115. mla r1, r9, r1, r2              @ r1 = tmp3 + z1
  116. add r5, r5, r6                  @ r5 = tmp1
  117. add r3, r3, r4                  @ r3 = tmp2
  118. add r1, r1, r6                  @ r1 = tmp3
  119. ldmia sp!, { r0, r2, r4, r6 } @ r0 = tmp10 / r2 = tmp13 / r4 = tmp12 / r6 = tmp11
  120.                               @ r1 = tmp3  / r3 = tmp2  / r5 = tmp1  / r7 = tmp0
  121. @ Compute DESCALE(tmp10 + tmp3, CONST_BITS-PASS1_BITS)
  122. add r8, r0, r1
  123. add r8, r8, #(1<<10)
  124. mov r8, r8, asr #11
  125. strh r8, [lr, # 0]
  126. @ Compute DESCALE(tmp10 - tmp3, CONST_BITS-PASS1_BITS)
  127. sub r8, r0, r1
  128. add r8, r8, #(1<<10)
  129. mov r8, r8, asr #11
  130. strh r8, [lr, #14]
  131. @ Compute DESCALE(tmp11 + tmp2, CONST_BITS-PASS1_BITS)
  132. add r8, r6, r3
  133. add r8, r8, #(1<<10)
  134. mov r8, r8, asr #11
  135. strh r8, [lr, # 2]
  136. @ Compute DESCALE(tmp11 - tmp2, CONST_BITS-PASS1_BITS)
  137. sub r8, r6, r3
  138. add r8, r8, #(1<<10)
  139. mov r8, r8, asr #11
  140. strh r8, [lr, #12]
  141. @ Compute DESCALE(tmp12 + tmp1, CONST_BITS-PASS1_BITS)
  142. add r8, r4, r5
  143. add r8, r8, #(1<<10)
  144. mov r8, r8, asr #11
  145. strh r8, [lr, # 4]
  146. @ Compute DESCALE(tmp12 - tmp1, CONST_BITS-PASS1_BITS)
  147. sub r8, r4, r5
  148. add r8, r8, #(1<<10)
  149. mov r8, r8, asr #11
  150. strh r8, [lr, #10]
  151. @ Compute DESCALE(tmp13 + tmp0, CONST_BITS-PASS1_BITS)
  152. add r8, r2, r7
  153. add r8, r8, #(1<<10)
  154. mov r8, r8, asr #11
  155. strh r8, [lr, # 6]
  156. @ Compute DESCALE(tmp13 - tmp0, CONST_BITS-PASS1_BITS)
  157. sub r8, r2, r7
  158. add r8, r8, #(1<<10)
  159. mov r8, r8, asr #11
  160. strh r8, [lr, # 8]
  161. @ End of row loop
  162. add lr, lr, #16
  163. subs r12, r12, #1
  164. bne row_loop
  165. beq start_column_loop
  166. empty_row:
  167. ldr r1, [r11, #FIX_0xFFFF_ID]
  168. mov r0, r0, lsl #2
  169. and r0, r0, r1
  170. add r0, r0, r0, lsl #16
  171. str r0, [lr, # 0]
  172. str r0, [lr, # 4]
  173. str r0, [lr, # 8]
  174. str r0, [lr, #12]
  175. end_of_row_loop:
  176. @ End of loop
  177. add lr, lr, #16
  178. subs r12, r12, #1
  179. bne row_loop
  180. start_column_loop:
  181. @ Start of column loop
  182. ldr lr, [ sp ]
  183. mov r12, #8
  184. column_loop:
  185. ldrsh r0, [lr, #( 0*8)]             @ r0 = 'd0'
  186. ldrsh r2, [lr, #( 4*8)]             @ r2 = 'd2'
  187. ldrsh r4, [lr, #( 8*8)]             @ r4 = 'd4'
  188. ldrsh r6, [lr, #(12*8)]             @ r6 = 'd6'
  189. ldr r3, [r11, #FIX_0_541196100_ID]
  190. add r1, r2, r6
  191. ldr r5, [r11, #FIX_M_1_847759065_ID]
  192. mul r1, r3, r1                      @ r1 = z1
  193. ldr r3, [r11, #FIX_0_765366865_ID]
  194. mla r6, r5, r6, r1                  @ r6 = tmp2
  195. add r5, r0, r4                      @ r5 = tmp0
  196. mla r2, r3, r2, r1                  @ r2 = tmp3
  197. sub r3, r0, r4                      @ r3 = tmp1
  198. add r0, r2, r5, lsl #13             @ r0 = tmp10
  199. rsb r2, r2, r5, lsl #13             @ r2 = tmp13
  200. add r4, r6, r3, lsl #13             @ r4 = tmp11
  201. rsb r6, r6, r3, lsl #13             @ r6 = tmp12
  202. ldrsh r1, [lr, #( 2*8)]             @ r1 = 'd1'
  203. ldrsh r3, [lr, #( 6*8)]             @ r3 = 'd3'
  204. ldrsh r5, [lr, #(10*8)]             @ r5 = 'd5'
  205. ldrsh r7, [lr, #(14*8)]             @ r7 = 'd7'
  206. @ Check for empty odd column (happens about 20 to 25 % of the time according to my stats)
  207. orr r9, r1, r3
  208. orr r10, r5, r7
  209. orrs r10, r9, r10
  210. beq empty_odd_column
  211. stmdb   sp!, { r0, r2, r4, r6 } @ save on the stack tmp10, tmp13, tmp12, tmp11
  212. add r0, r3, r5                 @ r0 = 'z2'
  213. add r2, r1, r7                  @ r2 = 'z1'
  214. add r4, r3, r7                  @ r4 = 'z3'
  215. add r6, r1, r5                  @ r6 = 'z4'
  216. ldr r9, [r11, #FIX_1_175875602_ID]
  217. add r8, r4, r6
  218. ldr r10, [r11, #FIX_M_0_899976223_ID]
  219. mul r8, r9, r8                  @ r8 = 'z5'
  220. ldr r9, [r11, #FIX_M_2_562915447_ID]
  221. mul r2, r10, r2                 @ r2 = 'z1'
  222. ldr r10, [r11, #FIX_M_1_961570560_ID]
  223. mul r0, r9, r0                  @ r0 = 'z2'
  224. ldr r9, [r11, #FIX_M_0_390180644_ID]
  225. mla r4, r10, r4, r8             @ r4 = 'z3'
  226. ldr r10, [r11, #FIX_0_298631336_ID]
  227. mla r6, r9, r6, r8              @ r6 = 'z4'
  228. ldr r9, [r11, #FIX_2_053119869_ID]
  229. mla r7, r10, r7, r2             @ r7 = tmp0 + z1
  230. ldr r10, [r11, #FIX_3_072711026_ID]
  231. mla r5, r9, r5, r0              @ r5 = tmp1 + z2
  232. ldr r9, [r11, #FIX_1_501321110_ID]
  233. mla r3, r10, r3, r0             @ r3 = tmp2 + z2
  234. add r7, r7, r4                  @ r7 = tmp0
  235. mla r1, r9, r1, r2              @ r1 = tmp3 + z1
  236. add r5, r5, r6                  @ r5 = tmp1
  237. add r3, r3, r4                  @ r3 = tmp2
  238. add r1, r1, r6                  @ r1 = tmp3
  239. ldmia sp!, { r0, r2, r4, r6 } @ r0 = tmp10 / r2 = tmp13 / r4 = tmp11 / r6 = tmp12
  240.                               @ r1 = tmp3  / r3 = tmp2  / r5 = tmp1  / r7 = tmp0
  241. @ Compute DESCALE(tmp10 + tmp3, CONST_BITS+PASS1_BITS+3)
  242. add r8, r0, r1
  243. add r8, r8, #(1<<17)
  244. mov r8, r8, asr #18
  245. strh r8, [lr, #( 0*8)]
  246. @ Compute DESCALE(tmp10 - tmp3, CONST_BITS+PASS1_BITS+3)
  247. sub r8, r0, r1
  248. add r8, r8, #(1<<17)
  249. mov r8, r8, asr #18
  250. strh r8, [lr, #(14*8)]
  251. @ Compute DESCALE(tmp11 + tmp2, CONST_BITS+PASS1_BITS+3)
  252. add r8, r4, r3
  253. add r8, r8, #(1<<17)
  254. mov r8, r8, asr #18
  255. strh r8, [lr, #( 2*8)]
  256. @ Compute DESCALE(tmp11 - tmp2, CONST_BITS+PASS1_BITS+3)
  257. sub r8, r4, r3
  258. add r8, r8, #(1<<17)
  259. mov r8, r8, asr #18
  260. strh r8, [lr, #(12*8)]
  261. @ Compute DESCALE(tmp12 + tmp1, CONST_BITS+PASS1_BITS+3)
  262. add r8, r6, r5
  263. add r8, r8, #(1<<17)
  264. mov r8, r8, asr #18
  265. strh r8, [lr, #( 4*8)]
  266. @ Compute DESCALE(tmp12 - tmp1, CONST_BITS+PASS1_BITS+3)
  267. sub r8, r6, r5
  268. add r8, r8, #(1<<17)
  269. mov r8, r8, asr #18
  270. strh r8, [lr, #(10*8)]
  271. @ Compute DESCALE(tmp13 + tmp0, CONST_BITS+PASS1_BITS+3)
  272. add r8, r2, r7
  273. add r8, r8, #(1<<17)
  274. mov r8, r8, asr #18
  275. strh r8, [lr, #( 6*8)]
  276. @ Compute DESCALE(tmp13 - tmp0, CONST_BITS+PASS1_BITS+3)
  277. sub r8, r2, r7
  278. add r8, r8, #(1<<17)
  279. mov r8, r8, asr #18
  280. strh r8, [lr, #( 8*8)]
  281. @ End of row loop
  282. add lr, lr, #2
  283. subs r12, r12, #1
  284. bne column_loop
  285. beq the_end
  286. empty_odd_column:
  287. @ Compute DESCALE(tmp10 + tmp3, CONST_BITS+PASS1_BITS+3)
  288. @ Compute DESCALE(tmp10 - tmp3, CONST_BITS+PASS1_BITS+3)
  289. add r0, r0, #(1<<17)
  290. mov r0, r0, asr #18
  291. strh r0, [lr, #( 0*8)]
  292. strh r0, [lr, #(14*8)]
  293. @ Compute DESCALE(tmp11 + tmp2, CONST_BITS+PASS1_BITS+3)
  294. @ Compute DESCALE(tmp11 - tmp2, CONST_BITS+PASS1_BITS+3)
  295. add r4, r4, #(1<<17)
  296. mov r4, r4, asr #18
  297. strh r4, [lr, #( 2*8)]
  298. strh r4, [lr, #(12*8)]
  299. @ Compute DESCALE(tmp12 + tmp1, CONST_BITS+PASS1_BITS+3)
  300. @ Compute DESCALE(tmp12 - tmp1, CONST_BITS+PASS1_BITS+3)
  301. add r6, r6, #(1<<17)
  302. mov r6, r6, asr #18
  303. strh r6, [lr, #( 4*8)]
  304. strh r6, [lr, #(10*8)]
  305. @ Compute DESCALE(tmp13 + tmp0, CONST_BITS+PASS1_BITS+3)
  306. @ Compute DESCALE(tmp13 - tmp0, CONST_BITS+PASS1_BITS+3)
  307. add r2, r2, #(1<<17)
  308. mov r2, r2, asr #18
  309. strh r2, [lr, #( 6*8)]
  310. strh r2, [lr, #( 8*8)]
  311. @ End of row loop
  312. add lr, lr, #2
  313. subs r12, r12, #1
  314. bne column_loop
  315. the_end:
  316. @ The end....
  317. add sp, sp, #4
  318. ldmia   sp!, { r4 - r12, pc }   @ restore callee saved regs and return
  319. const_array:
  320. .align
  321. .word FIX_0_298631336
  322. .word FIX_0_541196100
  323. .word FIX_0_765366865
  324. .word FIX_1_175875602
  325. .word FIX_1_501321110
  326. .word FIX_2_053119869
  327. .word FIX_3_072711026
  328. .word FIX_M_0_390180644
  329. .word FIX_M_0_899976223
  330. .word FIX_M_1_847759065
  331. .word FIX_M_1_961570560
  332. .word FIX_M_2_562915447
  333. .word FIX_0xFFFF