asmpoly.s
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:10k
源码类别:

Symbian

开发平台:

Visual C++

  1. ;/* ***** BEGIN LICENSE BLOCK ***** 
  2. ; * Version: RCSL 1.0/RPSL 1.0 
  3. ; *  
  4. ; * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5. ; *      
  6. ; * The contents of this file, and the files included with this file, are 
  7. ; * subject to the current version of the RealNetworks Public Source License 
  8. ; * Version 1.0 (the "RPSL") available at 
  9. ; * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10. ; * the file under the RealNetworks Community Source License Version 1.0 
  11. ; * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12. ; * in which case the RCSL will apply. You may also obtain the license terms 
  13. ; * directly from RealNetworks.  You may not use this file except in 
  14. ; * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15. ; * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16. ; * RCSL for the rights, obligations and limitations governing use of the 
  17. ; * contents of the file.  
  18. ; *  
  19. ; * This file is part of the Helix DNA Technology. RealNetworks is the 
  20. ; * developer of the Original Code and owns the copyrights in the portions 
  21. ; * it created. 
  22. ; *  
  23. ; * This file, and the files included with this file, is distributed and made 
  24. ; * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25. ; * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26. ; * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27. ; * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28. ; * 
  29. ; * Technology Compatibility Kit Test Suite(s) Location: 
  30. ; *    http://www.helixcommunity.org/content/tck 
  31. ; * 
  32. ; * Contributor(s): 
  33. ; *  
  34. ; * ***** END LICENSE BLOCK ***** */ 
  35. AREA |.text|, CODE, READONLY
  36. PCM RN r0
  37. VB1 RN r1
  38. COEF RN  r2
  39. VLO RN r0 ; must push PCM ptr to stack during inner looop
  40. VHI RN r3 ; temp variable
  41. SUM1LL RN  r4
  42. SUM1LH RN r5
  43. SUM2LL RN  r6
  44. SUM2LH RN r7
  45. SUM1RL RN  r8
  46. SUM1RH RN r9
  47. SUM2RL RN  r10
  48. SUM2RH RN r11
  49. CF1 RN r12
  50. CF2 RN  r14
  51. SIGN RN  r12 ; used for clipping - after discarding CF1
  52. MAXPOS  RN  r14 ; used for clipping - after discarding CF2
  53. I RN r12 ; overlay loop counter with CF1, SIGN
  54. GBLA RNDVAL
  55. RNDVAL SETA (1 << ((32 - 12) + (6 - 1)))
  56. ; C64TOS - clip 64-bit accumulator to short (no rounding)
  57. ;   xl, xh = value (lo 32, hi 32)
  58. ;   input assumed to have 6 fraction bits
  59. ;   sign = temp variable to use for sign
  60. ;   maxPos = 0x00007fff (takes 2 instr. to generate - calculating
  61. ;              once and using repeatedly saves if you do several CTOS in a row)
  62. MACRO
  63. C64TOS $xl, $xh, $sign, $maxPos
  64. mov $xl, $xl, lsr #(20+6)
  65. orr $xl, $xl, $xh, lsl #(12-6)
  66. mov $sign, $xl, ASR #31
  67. cmp $sign, $xl, ASR #15
  68. eorne $xl, $sign, $maxPos
  69. MEND ; C64TOS
  70. ; MC0S - process 2 taps, 1 sample per channel (sample 0)
  71. ;   x = vb1 offset
  72. MACRO
  73. MC0S $x
  74. ldr CF1, [COEF], #4
  75. ldr CF2, [COEF], #4
  76. ldr VLO, [VB1, #(4*($x))]
  77. ldr VHI, [VB1, #(4*(23 - $x))]
  78. smlal SUM1LL, SUM1LH, VLO, CF1
  79. ldr VLO, [VB1, #(4*(32 + $x))]
  80. rsb CF2, CF2, #0
  81. smlal SUM1LL, SUM1LH, VHI, CF2
  82. ldr VHI, [VB1, #(4*(32 + 23 - $x))]
  83. smlal SUM1RL, SUM1RH, VLO, CF1
  84. smlal SUM1RL, SUM1RH, VHI, CF2
  85. MEND ; MC0S
  86. ; MC1S - process 2 taps, 1 sample per channel (sample 16)
  87. ;   x = vb1 offset
  88. MACRO
  89. MC1S $x
  90. ldr CF1, [COEF], #4
  91. ldr VLO, [VB1, #(4*($x))]
  92. ldr VHI, [VB1, #(4*(32 + $x))]
  93. smlal SUM1LL, SUM1LH, VLO, CF1
  94. smlal SUM1RL, SUM1RH, VHI, CF1
  95. MEND ; MC1S
  96. ; MC2S - process 2 taps, 2 samples per channel
  97. ;   x = vb1 offset
  98. MACRO
  99. MC2S $x
  100. ; load data as far as possible in advance of using it
  101. ldr CF1, [COEF], #4
  102. ldr CF2, [COEF], #4
  103. ldr VLO, [VB1, #(4*($x))]
  104. ldr VHI, [VB1, #(4*(23 - $x))]
  105. smlal SUM1LL, SUM1LH, VLO, CF1
  106. smlal SUM2LL, SUM2LH, VLO, CF2
  107. rsb CF2, CF2, #0
  108. smlal SUM2LL, SUM2LH, VHI, CF1
  109. smlal SUM1LL, SUM1LH, VHI, CF2
  110. ldr VHI, [VB1, #(4*(32 + 23 - $x))]
  111. ldr VLO, [VB1, #(4*(32 + $x))]
  112. smlal SUM1RL, SUM1RH, VHI, CF2
  113. smlal SUM2RL, SUM2RH, VHI, CF1
  114. rsb CF2, CF2, #0
  115. smlal SUM1RL, SUM1RH, VLO, CF1
  116. smlal SUM2RL, SUM2RH, VLO, CF2
  117. MEND ; MC2S
  118. ; void PolyphaseStereo(short *pcm, int *vbuf, const int *coefBase)
  119. xmp3_PolyphaseStereo FUNCTION
  120. EXPORT xmp3_PolyphaseStereo
  121. stmfd sp!, {r4-r11, r14}
  122. ; clear out stack space for 2 local variables (4 bytes each)
  123. sub sp, sp, #8
  124. str PCM, [sp, #4] ; sp[1] = pcm pointer
  125. ; special case, output sample 0
  126. mov SUM1LL, #RNDVAL ; load rndVal (low 32)
  127. mov SUM1RL, #RNDVAL ; load rndVal (low 32)
  128. mov SUM1LH, #0
  129. mov SUM1RH, #0
  130. MC0S 0
  131. MC0S 1
  132. MC0S 2
  133. MC0S 3
  134. MC0S 4
  135. MC0S 5
  136. MC0S 6
  137. MC0S 7
  138. ldr PCM, [sp, #4] ; load pcm pointer
  139. mov MAXPOS, #0x7f00
  140. orr MAXPOS, MAXPOS, #0xff
  141. C64TOS SUM1LL, SUM1LH, SIGN, MAXPOS
  142. C64TOS SUM1RL, SUM1RH, SIGN, MAXPOS
  143. strh SUM1LL, [PCM, #(2*0)]
  144. strh SUM1RL, [PCM, #(2*1)]
  145. ; special case, output sample 16
  146. add COEF, COEF, #(4*(256-16)) ; coef = coefBase + 256 (was coefBase + 16 after MC0S block)
  147. add VB1, VB1, #(4*1024) ; vb1 = vbuf + 64*16
  148. mov SUM1LL, #RNDVAL ; load rndVal (low 32)
  149. mov SUM1RL, #RNDVAL ; load rndVal (low 32)
  150. mov SUM1LH, #0
  151. mov SUM1RH, #0
  152. MC1S 0
  153. MC1S 1
  154. MC1S 2
  155. MC1S 3
  156. MC1S 4
  157. MC1S 5
  158. MC1S 6
  159. MC1S 7
  160. ldr PCM, [sp, #4] ; load pcm pointer
  161. mov MAXPOS, #0x7f00
  162. orr MAXPOS, MAXPOS, #0xff
  163. C64TOS SUM1LL, SUM1LH, SIGN, MAXPOS
  164. C64TOS SUM1RL, SUM1RH, SIGN, MAXPOS
  165. strh SUM1LL, [PCM, #(2*(2*16+0))]
  166. strh SUM1RL, [PCM, #(2*(2*16+1))]
  167. ; main convolution loop: sum1L = samples 1, 2, 3, ... 15   sum2L = samples 31, 30, ... 17
  168. sub COEF, COEF, #(4*(264-16)) ; coef = coefBase + 16 (was coefBase + 264 after MC1S block)
  169. sub VB1, VB1, #(4*(1024-64)) ; vb1 = vbuf + 64 (was vbuf + 64*16 after MC1S block)
  170. mov I, #15 ; loop counter, count down
  171. add PCM, PCM, #(2*2) ; pcm+=2
  172. LoopPS
  173. str I, [sp, #0] ; sp[0] = i (loop counter)
  174. str PCM, [sp, #4] ; sp[1] = pcm (pointer to pcm buffer)
  175. mov SUM1LL, #RNDVAL ; load rndVal (low 32)
  176. mov SUM1RL, #RNDVAL ; load rndVal (low 32)
  177. mov SUM2LL, #RNDVAL ; load rndVal (low 32)
  178. mov SUM2RL, #RNDVAL ; load rndVal (low 32)
  179. mov SUM1LH, #0
  180. mov SUM1RH, #0
  181. mov SUM2LH, #0
  182. mov SUM2RH, #0
  183. MC2S 0
  184. MC2S 1
  185. MC2S 2
  186. MC2S 3
  187. MC2S 4
  188. MC2S 5
  189. MC2S 6
  190. MC2S 7
  191. add VB1, VB1, #(4*64) ; vb1 += 64
  192. ldr PCM, [sp, #4] ; load pcm pointer
  193. mov MAXPOS, #0x7f00
  194. orr MAXPOS, MAXPOS, #0xff
  195. C64TOS SUM1LL, SUM1LH, SIGN, MAXPOS
  196. C64TOS SUM1RL, SUM1RH, SIGN, MAXPOS
  197. C64TOS SUM2LL, SUM2LH, SIGN, MAXPOS
  198. C64TOS SUM2RL, SUM2RH, SIGN, MAXPOS
  199. ldr I, [sp, #0] ; load loop counter
  200. add CF2, PCM, I, lsl #3 ; CF2 = PCM + 4*i (short offset)
  201. strh SUM2LL, [CF2], #2 ; *(pcm + 2*2*i + 0)
  202. strh SUM2RL, [CF2], #2 ; *(pcm + 2*2*i + 1)
  203. strh SUM1LL, [PCM], #2 ; *(pcm + 0)
  204. strh SUM1RL, [PCM], #2 ; *(pcm + 1)
  205. subs I, I, #1
  206. bne LoopPS
  207. ; restore stack pointer
  208. add sp, sp, #8
  209. ldmfd sp!, {r4-r11, pc}
  210. ENDFUNC
  211. ;; MONO PROCESSING
  212. ; MC0M - process 2 taps, 1 sample (sample 0)
  213. ;   x = vb1 offset
  214. MACRO
  215. MC0M $x
  216. ldr CF1, [COEF], #4
  217. ldr CF2, [COEF], #4
  218. ldr VLO, [VB1, #(4*($x))]
  219. ldr VHI, [VB1, #(4*(23 - $x))]
  220. rsb CF2, CF2, #0
  221. smlal SUM1LL, SUM1LH, VLO, CF1
  222. smlal SUM1LL, SUM1LH, VHI, CF2
  223. MEND ; MC0M
  224. ; MC1M - process 2 taps, 1 sample (sample 16)
  225. ;   x = vb1 offset
  226. MACRO
  227. MC1M $x
  228. ldr CF1, [COEF], #4
  229. ldr VLO, [VB1, #(4*($x))]
  230. smlal SUM1LL, SUM1LH, VLO, CF1
  231. MEND ; MC1M
  232. ; MC2M - process 2 taps, 2 samples
  233. ;   x = vb1 offset
  234. MACRO
  235. MC2M $x
  236. ; load data as far as possible in advance of using it
  237. ldr CF1, [COEF], #4
  238. ldr CF2, [COEF], #4
  239. ldr VLO, [VB1, #(4*($x))]
  240. ldr VHI, [VB1, #(4*(23 - $x))]
  241. smlal SUM1LL, SUM1LH, VLO, CF1
  242. smlal SUM2LL, SUM2LH, VLO, CF2
  243. rsb CF2, CF2, #0
  244. smlal SUM1LL, SUM1LH, VHI, CF2
  245. smlal SUM2LL, SUM2LH, VHI, CF1
  246. MEND ; MC2M
  247. ; void PolyphaseMono(short *pcm, int *vbuf, const int *coefBase)
  248. xmp3_PolyphaseMono FUNCTION
  249. EXPORT xmp3_PolyphaseMono
  250. stmfd sp!, {r4-r11, r14}
  251. ; clear out stack space for 4 local variables (4 bytes each)
  252. sub sp, sp, #8
  253. str PCM, [sp, #4] ; sp[1] = pcm pointer
  254. ; special case, output sample 0
  255. mov SUM1LL, #RNDVAL ; load rndVal (low 32)
  256. mov SUM1LH, #0
  257. MC0M 0
  258. MC0M 1
  259. MC0M 2
  260. MC0M 3
  261. MC0M 4
  262. MC0M 5
  263. MC0M 6
  264. MC0M 7
  265. ldr PCM, [sp, #4] ; load pcm pointer
  266. mov MAXPOS, #0x7f00
  267. orr MAXPOS, MAXPOS, #0xff
  268. C64TOS SUM1LL, SUM1LH, SIGN, MAXPOS
  269. strh SUM1LL, [PCM, #(2*0)]
  270. ; special case, output sample 16
  271. add COEF, COEF, #(4*(256-16)) ; coef = coefBase + 256 (was coefBase + 16 after MC0M block)
  272. add VB1, VB1, #(4*1024) ; vb1 = vbuf + 64*16
  273. mov SUM1LL, #RNDVAL ; load rndVal (low 32)
  274. mov SUM1LH, #0
  275. MC1M 0
  276. MC1M 1
  277. MC1M 2
  278. MC1M 3
  279. MC1M 4
  280. MC1M 5
  281. MC1M 6
  282. MC1M 7
  283. ldr PCM, [sp, #4] ; load pcm pointer
  284. mov MAXPOS, #0x7f00
  285. orr MAXPOS, MAXPOS, #0xff
  286. C64TOS SUM1LL, SUM1LH, SIGN, MAXPOS
  287. strh SUM1LL, [PCM, #(2*16)]
  288. ; main convolution loop: sum1L = samples 1, 2, 3, ... 15   sum2L = samples 31, 30, ... 17
  289. sub COEF, COEF, #(4*(264-16)) ; coef = coefBase + 16 (was coefBase + 264 after MC1M block)
  290. sub VB1, VB1, #(4*(1024-64)) ; vb1 = vbuf + 64 (was vbuf + 64*16 after MC1M block)
  291. mov I, #15 ; loop counter, count down
  292. add PCM, PCM, #(2) ; pcm++
  293. LoopPM
  294. str I, [sp, #0] ; sp[0] = i (loop counter)
  295. str PCM, [sp, #4] ; sp[1] = pcm (pointer to pcm buffer)
  296. mov SUM1LL, #RNDVAL ; load rndVal (low 32)
  297. mov SUM2LL, #RNDVAL ; load rndVal (low 32)
  298. mov SUM1LH, #0
  299. mov SUM2LH, #0
  300. MC2M 0
  301. MC2M 1
  302. MC2M 2
  303. MC2M 3
  304. MC2M 4
  305. MC2M 5
  306. MC2M 6
  307. MC2M 7
  308. add VB1, VB1, #(4*64) ; vb1 += 64
  309. ldr PCM, [sp, #4] ; load pcm pointer
  310. mov MAXPOS, #0x7f00
  311. orr MAXPOS, MAXPOS, #0xff
  312. C64TOS SUM1LL, SUM1LH, SIGN, MAXPOS
  313. C64TOS SUM2LL, SUM2LH, SIGN, MAXPOS
  314. ldr I, [sp, #0] ; load loop counter
  315. add CF2, PCM, I, lsl #2 ; CF2 = PCM + 2*i (short offset)
  316. strh SUM2LL, [CF2], #2 ; *(pcm + 2*i + 0)
  317. strh SUM1LL, [PCM], #2 ; *(pcm + 0) ; pcm++
  318. subs I, I, #1
  319. bne LoopPM
  320. ; restore stack pointer
  321. add sp, sp, #8
  322. ldmfd sp!, {r4-r11, pc}
  323. ENDFUNC
  324. END