mdctARM.s 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179
  1. .text
  2. @ full accuracy version
  3. .global mdct_backwardARM
  4. .global mdct_shift_right
  5. .global mdct_unroll_prelap
  6. .global mdct_unroll_part2
  7. .global mdct_unroll_part3
  8. .global mdct_unroll_postlap
  9. mdct_unroll_prelap:
  10. @ r0 = out
  11. @ r1 = post
  12. @ r2 = r
  13. @ r3 = step
  14. STMFD r13!,{r4-r7,r14}
  15. MVN r4, #0x8000
  16. MOV r3, r3, LSL #1
  17. SUB r1, r2, r1 @ r1 = r - post
  18. SUBS r1, r1, #16 @ r1 = r - post - 16
  19. BLT unroll_over
  20. unroll_loop:
  21. LDMDB r2!,{r5,r6,r7,r12}
  22. MOV r5, r5, ASR #9 @ r5 = (*--r)>>9
  23. MOV r6, r6, ASR #9 @ r6 = (*--r)>>9
  24. MOV r7, r7, ASR #9 @ r7 = (*--r)>>9
  25. MOV r12,r12,ASR #9 @ r12= (*--r)>>9
  26. MOV r14,r12,ASR #15
  27. TEQ r14,r14,ASR #31 @ if r14==0 || r14==-1 then in range
  28. EORNE r12,r4, r14,ASR #31
  29. STRH r12,[r0], r3
  30. MOV r14,r7, ASR #15
  31. TEQ r14,r14,ASR #31 @ if r14==0 || r14==-1 then in range
  32. EORNE r7, r4, r14,ASR #31
  33. STRH r7, [r0], r3
  34. MOV r14,r6, ASR #15
  35. TEQ r14,r14,ASR #31 @ if r14==0 || r14==-1 then in range
  36. EORNE r6, r4, r14,ASR #31
  37. STRH r6, [r0], r3
  38. MOV r14,r5, ASR #15
  39. TEQ r14,r14,ASR #31 @ if r14==0 || r14==-1 then in range
  40. EORNE r5, r4, r14,ASR #31
  41. STRH r5, [r0], r3
  42. SUBS r1, r1, #16
  43. BGE unroll_loop
  44. unroll_over:
  45. ADDS r1, r1, #16
  46. BLE unroll_end
  47. unroll_loop2:
  48. LDR r5,[r2,#-4]!
  49. @ stall
  50. @ stall (Xscale)
  51. MOV r5, r5, ASR #9 @ r5 = (*--r)>>9
  52. MOV r14,r5, ASR #15
  53. TEQ r14,r14,ASR #31 @ if r14==0 || r14==-1 then in range
  54. EORNE r5, r4, r14,ASR #31
  55. STRH r5, [r0], r3
  56. SUBS r1, r1, #4
  57. BGT unroll_loop2
  58. unroll_end:
  59. LDMFD r13!,{r4-r7,PC}
  60. mdct_unroll_postlap:
  61. @ r0 = out
  62. @ r1 = post
  63. @ r2 = l
  64. @ r3 = step
  65. STMFD r13!,{r4-r7,r14}
  66. MVN r4, #0x8000
  67. MOV r3, r3, LSL #1
  68. SUB r1, r1, r2 @ r1 = post - l
  69. MOV r1, r1, ASR #1 @ r1 = (post - l)>>1
  70. SUBS r1, r1, #16 @ r1 = ((post - l)>>1) - 4
  71. BLT unroll_over3
  72. unroll_loop3:
  73. LDR r12,[r2],#8
  74. LDR r7, [r2],#8
  75. LDR r6, [r2],#8
  76. LDR r5, [r2],#8
  77. RSB r12,r12,#0
  78. RSB r5, r5, #0
  79. RSB r6, r6, #0
  80. RSB r7, r7, #0
  81. MOV r12, r12,ASR #9 @ r12= (-*l)>>9
  82. MOV r5, r5, ASR #9 @ r5 = (-*l)>>9
  83. MOV r6, r6, ASR #9 @ r6 = (-*l)>>9
  84. MOV r7, r7, ASR #9 @ r7 = (-*l)>>9
  85. MOV r14,r12,ASR #15
  86. TEQ r14,r14,ASR #31 @ if r14==0 || r14==-1 then in range
  87. EORNE r12,r4, r14,ASR #31
  88. STRH r12,[r0], r3
  89. MOV r14,r7, ASR #15
  90. TEQ r14,r14,ASR #31 @ if r14==0 || r14==-1 then in range
  91. EORNE r7, r4, r14,ASR #31
  92. STRH r7, [r0], r3
  93. MOV r14,r6, ASR #15
  94. TEQ r14,r14,ASR #31 @ if r14==0 || r14==-1 then in range
  95. EORNE r6, r4, r14,ASR #31
  96. STRH r6, [r0], r3
  97. MOV r14,r5, ASR #15
  98. TEQ r14,r14,ASR #31 @ if r14==0 || r14==-1 then in range
  99. EORNE r5, r4, r14,ASR #31
  100. STRH r5, [r0], r3
  101. SUBS r1, r1, #16
  102. BGE unroll_loop3
  103. unroll_over3:
  104. ADDS r1, r1, #16
  105. BLE unroll_over4
  106. unroll_loop4:
  107. LDR r5,[r2], #8
  108. @ stall
  109. @ stall (Xscale)
  110. RSB r5, r5, #0
  111. MOV r5, r5, ASR #9 @ r5 = (-*l)>>9
  112. MOV r14,r5, ASR #15
  113. TEQ r14,r14,ASR #31 @ if r14==0 || r14==-1 then in range
  114. EORNE r5, r4, r14,ASR #31
  115. STRH r5, [r0], r3
  116. SUBS r1, r1, #4
  117. BGT unroll_loop4
  118. unroll_over4:
  119. LDMFD r13!,{r4-r7,PC}
  120. mdct_unroll_part2:
  121. @ r0 = out
  122. @ r1 = post
  123. @ r2 = l
  124. @ r3 = r
  125. @ <> = step
  126. @ <> = wL
  127. @ <> = wR
  128. MOV r12,r13
  129. STMFD r13!,{r4,r6-r11,r14}
  130. LDMFD r12,{r8,r9,r10} @ r8 = step
  131. @ r9 = wL
  132. @ r10= wR
  133. MVN r4, #0x8000
  134. MOV r8, r8, LSL #1
  135. SUBS r1, r3, r1 @ r1 = (r - post)
  136. BLE unroll_over5
  137. unroll_loop5:
  138. LDR r12,[r2, #-8]! @ r12= *l (but l -= 2 first)
  139. LDR r11,[r9],#4 @ r11= *wL++
  140. LDR r7, [r3, #-4]! @ r7 = *--r
  141. LDR r6, [r10,#-4]! @ r6 = *--wR
  142. @ Can save a cycle here, at the cost of 1bit errors in rounding
  143. SMULL r14,r11,r12,r11 @ (r14,r11) = *l * *wL++
  144. SMULL r14,r6, r7, r6 @ (r14,r6) = *--r * *--wR
  145. ADD r6, r6, r11
  146. MOV r6, r6, ASR #8
  147. MOV r14,r6, ASR #15
  148. TEQ r14,r14,ASR #31 @ if r14==0 || r14==-1 then in range
  149. EORNE r6, r4, r14,ASR #31
  150. STRH r6, [r0], r8
  151. SUBS r1, r1, #4
  152. BGT unroll_loop5
  153. unroll_over5:
  154. LDMFD r13!,{r4,r6-r11,PC}
  155. mdct_unroll_part3:
  156. @ r0 = out
  157. @ r1 = post
  158. @ r2 = l
  159. @ r3 = r
  160. @ <> = step
  161. @ <> = wL
  162. @ <> = wR
  163. MOV r12,r13
  164. STMFD r13!,{r4,r6-r11,r14}
  165. LDMFD r12,{r8,r9,r10} @ r8 = step
  166. @ r9 = wL
  167. @ r10= wR
  168. MVN r4, #0x8000
  169. MOV r8, r8, LSL #1
  170. SUBS r1, r1, r3 @ r1 = (post - r)
  171. BLE unroll_over6
  172. unroll_loop6:
  173. LDR r12,[r2],#8 @ r12= *l (but l += 2 first)
  174. LDR r11,[r9],#4 @ r11= *wL++
  175. LDR r7, [r3],#4 @ r7 = *r++
  176. LDR r6, [r10,#-4]! @ r6 = *--wR
  177. @ Can save a cycle here, at the cost of 1bit errors in rounding
  178. SMULL r14,r11,r12,r11 @ (r14,r11) = *l * *wL++
  179. SMULL r14,r6, r7, r6 @ (r14,r6) = *--r * *--wR
  180. SUB r6, r6, r11
  181. MOV r6, r6, ASR #8
  182. MOV r14,r6, ASR #15
  183. TEQ r14,r14,ASR #31 @ if r14==0 || r14==-1 then in range
  184. EORNE r6, r4, r14,ASR #31
  185. STRH r6, [r0], r8
  186. SUBS r1, r1, #4
  187. BGT unroll_loop6
  188. unroll_over6:
  189. LDMFD r13!,{r4,r6-r11,PC}
  190. mdct_shift_right:
  191. @ r0 = n
  192. @ r1 = in
  193. @ r2 = right
  194. STMFD r13!,{r4-r11,r14}
  195. MOV r0, r0, LSR #2 @ n >>= 2
  196. ADD r1, r1, #4
  197. SUBS r0, r0, #8
  198. BLT sr_less_than_8
  199. sr_loop:
  200. LDR r3, [r1], #8
  201. LDR r4, [r1], #8
  202. LDR r5, [r1], #8
  203. LDR r6, [r1], #8
  204. LDR r7, [r1], #8
  205. LDR r8, [r1], #8
  206. LDR r12,[r1], #8
  207. LDR r14,[r1], #8
  208. SUBS r0, r0, #8
  209. STMIA r2!,{r3,r4,r5,r6,r7,r8,r12,r14}
  210. BGE sr_loop
  211. sr_less_than_8:
  212. ADDS r0, r0, #8
  213. BEQ sr_end
  214. sr_loop2:
  215. LDR r3, [r1], #8
  216. SUBS r0, r0, #1
  217. STR r3, [r2], #4
  218. BGT sr_loop2
  219. sr_end:
  220. LDMFD r13!,{r4-r11,PC}
  221. mdct_backwardARM:
  222. @ r0 = n
  223. @ r1 = in
  224. STMFD r13!,{r4-r11,r14}
  225. MOV r2,#1<<4 @ r2 = 1<<shift
  226. MOV r3,#13-4 @ r3 = 13-shift
  227. find_shift_loop:
  228. TST r0,r2 @ if (n & (1<<shift)) == 0
  229. MOV r2,r2,LSL #1
  230. SUBEQ r3,r3,#1 @ shift--
  231. BEQ find_shift_loop
  232. MOV r2,#2
  233. MOV r2,r2,LSL r3 @ r2 = step = 2<<shift
  234. @ presymmetry
  235. @ r0 = n (a multiple of 4)
  236. @ r1 = in
  237. @ r2 = step
  238. @ r3 = shift
  239. ADD r4, r1, r0, LSL #1 @ r4 = aX = in+(n>>1)
  240. ADD r14,r1, r0 @ r14= in+(n>>2)
  241. SUB r4, r4, #3*4 @ r4 = aX = in+n2-3
  242. LDR r5, =sincos_lookup0 @ r5 = T=sincos_lookup0
  243. presymmetry_loop1:
  244. LDR r7, [r4,#8] @ r6 = s2 = aX[2]
  245. LDR r11,[r5,#4] @ r11= T[1]
  246. LDR r6, [r4] @ r6 = s0 = aX[0]
  247. LDR r10,[r5],r2,LSL #2 @ r10= T[0] T += step
  248. @ XPROD31(s0, s2, T[0], T[1], &aX[0], &ax[2])
  249. SMULL r8, r9, r7, r11 @ (r8, r9) = s2*T[1]
  250. @ stall
  251. @ stall ?
  252. SMLAL r8, r9, r6, r10 @ (r8, r9) += s0*T[0]
  253. RSB r6, r6, #0
  254. @ stall ?
  255. SMULL r8, r12,r7, r10 @ (r8, r12) = s2*T[0]
  256. MOV r9, r9, LSL #1
  257. @ stall ?
  258. SMLAL r8, r12,r6, r11 @ (r8, r12) -= s0*T[1]
  259. STR r9, [r4],#-16 @ aX[0] = r9
  260. CMP r4,r14
  261. MOV r12,r12,LSL #1
  262. STR r12,[r4,#8+16] @ aX[2] = r12
  263. BGE presymmetry_loop1 @ while (aX >= in+n4)
  264. presymmetry_loop2:
  265. LDR r6,[r4] @ r6 = s0 = aX[0]
  266. LDR r10,[r5,#4] @ r10= T[1]
  267. LDR r7,[r4,#8] @ r6 = s2 = aX[2]
  268. LDR r11,[r5],-r2,LSL #2 @ r11= T[0] T -= step
  269. @ XPROD31(s0, s2, T[1], T[0], &aX[0], &ax[2])
  270. SMULL r8, r9, r6, r10 @ (r8, r9) = s0*T[1]
  271. @ stall
  272. @ stall ?
  273. SMLAL r8, r9, r7, r11 @ (r8, r9) += s2*T[0]
  274. RSB r6, r6, #0
  275. @ stall ?
  276. SMULL r8, r12,r7, r10 @ (r8, r12) = s2*T[1]
  277. MOV r9, r9, LSL #1
  278. @ stall ?
  279. SMLAL r8, r12,r6, r11 @ (r8, r12) -= s0*T[0]
  280. STR r9, [r4],#-16 @ aX[0] = r9
  281. CMP r4,r1
  282. MOV r12,r12,LSL #1
  283. STR r12,[r4,#8+16] @ aX[2] = r12
  284. BGE presymmetry_loop2 @ while (aX >= in)
  285. @ r0 = n
  286. @ r1 = in
  287. @ r2 = step
  288. @ r3 = shift
  289. STMFD r13!,{r3}
  290. LDR r5, =sincos_lookup0 @ r5 = T=sincos_lookup0
  291. ADD r4, r1, r0, LSL #1 @ r4 = aX = in+(n>>1)
  292. SUB r4, r4, #4*4 @ r4 = aX = in+(n>>1)-4
  293. LDR r11,[r5,#4] @ r11= T[1]
  294. LDR r10,[r5],r2, LSL #2 @ r10= T[0] T += step
  295. presymmetry_loop3:
  296. LDR r8,[r1],#16 @ r8 = ro0 = bX[0]
  297. LDR r9,[r1,#8-16] @ r9 = ro2 = bX[2]
  298. LDR r6,[r4] @ r6 = ri0 = aX[0]
  299. @ XNPROD31( ro2, ro0, T[1], T[0], &aX[0], &aX[2] )
  300. @ aX[0] = (ro2*T[1] - ro0*T[0])>>31 aX[2] = (ro0*T[1] + ro2*T[0])>>31
  301. SMULL r14,r12,r8, r11 @ (r14,r12) = ro0*T[1]
  302. RSB r8,r8,#0 @ r8 = -ro0
  303. @ Stall ?
  304. SMLAL r14,r12,r9, r10 @ (r14,r12) += ro2*T[0]
  305. LDR r7,[r4,#8] @ r7 = ri2 = aX[2]
  306. @ Stall ?
  307. SMULL r14,r3, r9, r11 @ (r14,r3) = ro2*T[1]
  308. MOV r12,r12,LSL #1
  309. LDR r11,[r5,#4] @ r11= T[1]
  310. SMLAL r14,r3, r8, r10 @ (r14,r3) -= ro0*T[0]
  311. LDR r10,[r5],r2, LSL #2 @ r10= T[0] T += step
  312. STR r12,[r4,#8]
  313. MOV r3, r3, LSL #1
  314. STR r3, [r4],#-16
  315. @ XNPROD31( ri2, ri0, T[0], T[1], &bX[0], &bX[2] )
  316. @ bX[0] = (ri2*T[0] - ri0*T[1])>>31 bX[2] = (ri0*T[0] + ri2*T[1])>>31
  317. SMULL r14,r12,r6, r10 @ (r14,r12) = ri0*T[0]
  318. RSB r6,r6,#0 @ r6 = -ri0
  319. @ stall ?
  320. SMLAL r14,r12,r7, r11 @ (r14,r12) += ri2*T[1]
  321. @ stall ?
  322. @ stall ?
  323. SMULL r14,r3, r7, r10 @ (r14,r3) = ri2*T[0]
  324. MOV r12,r12,LSL #1
  325. @ stall ?
  326. SMLAL r14,r3, r6, r11 @ (r14,r3) -= ri0*T[1]
  327. CMP r4,r1
  328. STR r12,[r1,#8-16]
  329. MOV r3, r3, LSL #1
  330. STR r3, [r1,#-16]
  331. BGE presymmetry_loop3
  332. SUB r1,r1,r0 @ r1 = in -= n>>2 (i.e. restore in)
  333. LDR r3,[r13]
  334. STR r2,[r13,#-4]!
  335. @ mdct_butterflies
  336. @ r0 = n = (points * 2)
  337. @ r1 = in = x
  338. @ r2 = i
  339. @ r3 = shift
  340. STMFD r13!,{r0-r1}
  341. RSBS r4,r3,#6 @ r4 = stages = 7-shift then --stages
  342. LDR r5,=sincos_lookup0
  343. BLE no_generics
  344. MOV r14,#4 @ r14= 4 (i=0)
  345. MOV r6, r14,LSL r3 @ r6 = (4<<i)<<shift
  346. mdct_butterflies_loop1:
  347. MOV r0, r0, LSR #1 @ r0 = points>>i = POINTS
  348. MOV r2, r14,LSR #2 @ r2 = (1<<i)-j (j=0)
  349. STMFD r13!,{r4,r14}
  350. mdct_butterflies_loop2:
  351. @ mdct_butterfly_generic(x+POINTS*j, POINTS, 4<<(i+shift))
  352. @ mdct_butterfly_generic(r1, r0, r6)
  353. @ r0 = points
  354. @ r1 = x
  355. @ preserve r2 (external loop counter)
  356. @ preserve r3
  357. @ preserve r4 (external loop counter)
  358. @ r5 = T = sincos_lookup0
  359. @ r6 = step
  360. @ preserve r14
  361. STR r2,[r13,#-4]! @ stack r2
  362. ADD r1,r1,r0,LSL #1 @ r1 = x2+4 = x + (POINTS>>1)
  363. ADD r7,r1,r0,LSL #1 @ r7 = x1+4 = x + POINTS
  364. ADD r12,r5,#1024*4 @ r12= sincos_lookup0+1024
  365. mdct_bufferfly_generic_loop1:
  366. LDMDB r7!,{r2,r3,r8,r11} @ r2 = x1[0]
  367. @ r3 = x1[1]
  368. @ r8 = x1[2]
  369. @ r11= x1[3] x1 -= 4
  370. LDMDB r1!,{r4,r9,r10,r14} @ r4 = x2[0]
  371. @ r9 = x2[1]
  372. @ r10= x2[2]
  373. @ r14= x2[3] x2 -= 4
  374. SUB r2, r2, r3 @ r2 = s0 = x1[0] - x1[1]
  375. ADD r3, r2, r3, LSL #1 @ r3 = x1[0] + x1[1] (-> x1[0])
  376. SUB r11,r11,r8 @ r11= s1 = x1[3] - x1[2]
  377. ADD r8, r11,r8, LSL #1 @ r8 = x1[3] + x1[2] (-> x1[2])
  378. SUB r9, r9, r4 @ r9 = s2 = x2[1] - x2[0]
  379. ADD r4, r9, r4, LSL #1 @ r4 = x2[1] + x2[0] (-> x1[1])
  380. SUB r14,r14,r10 @ r14= s3 = x2[3] - x2[2]
  381. ADD r10,r14,r10,LSL #1 @ r10= x2[3] + x2[2] (-> x1[3])
  382. STMIA r7,{r3,r4,r8,r10}
  383. @ r0 = points
  384. @ r1 = x2
  385. @ r2 = s0
  386. @ r3 free
  387. @ r4 free
  388. @ r5 = T
  389. @ r6 = step
  390. @ r7 = x1
  391. @ r8 free
  392. @ r9 = s2
  393. @ r10 free
  394. @ r11= s1
  395. @ r12= limit
  396. @ r14= s3
  397. LDR r8, [r5,#4] @ r8 = T[1]
  398. LDR r10,[r5],r6,LSL #2 @ r10= T[0] T += step
  399. @ XPROD31(s1, s0, T[0], T[1], &x2[0], &x2[2])
  400. @ x2[0] = (s1*T[0] + s0*T[1])>>31 x2[2] = (s0*T[0] - s1*T[1])>>31
  401. @ stall Xscale
  402. SMULL r4, r3, r2, r8 @ (r4, r3) = s0*T[1]
  403. SMLAL r4, r3, r11,r10 @ (r4, r3) += s1*T[0]
  404. RSB r11,r11,#0
  405. SMULL r11,r4, r8, r11 @ (r11,r4) = -s1*T[1]
  406. SMLAL r11,r4, r2, r10 @ (r11,r4) += s0*T[0]
  407. MOV r2, r3, LSL #1 @ r2 = r3<<1 = Value for x2[0]
  408. @ XPROD31(s2, s3, T[0], T[1], &x2[1], &x2[3])
  409. @ x2[1] = (s2*T[0] + s3*T[1])>>31 x2[3] = (s3*T[0] - s2*T[1])>>31
  410. SMULL r11,r3, r9, r10 @ (r11,r3) = s2*T[0]
  411. MOV r4, r4, LSL #1 @ r4 = r4<<1 = Value for x2[2]
  412. SMLAL r11,r3, r14,r8 @ (r11,r3) += s3*T[1]
  413. RSB r9, r9, #0
  414. SMULL r10,r11,r14,r10 @ (r10,r11) = s3*T[0]
  415. MOV r3, r3, LSL #1 @ r3 = r3<<1 = Value for x2[1]
  416. SMLAL r10,r11,r9,r8 @ (r10,r11) -= s2*T[1]
  417. CMP r5, r12
  418. MOV r11,r11,LSL #1 @ r11= r11<<1 = Value for x2[3]
  419. STMIA r1,{r2,r3,r4,r11}
  420. BLT mdct_bufferfly_generic_loop1
  421. SUB r12,r12,#1024*4
  422. mdct_bufferfly_generic_loop2:
  423. LDMDB r7!,{r2,r3,r9,r10} @ r2 = x1[0]
  424. @ r3 = x1[1]
  425. @ r9 = x1[2]
  426. @ r10= x1[3] x1 -= 4
  427. LDMDB r1!,{r4,r8,r11,r14} @ r4 = x2[0]
  428. @ r8 = x2[1]
  429. @ r11= x2[2]
  430. @ r14= x2[3] x2 -= 4
  431. SUB r2, r2, r3 @ r2 = s0 = x1[0] - x1[1]
  432. ADD r3, r2, r3, LSL #1 @ r3 = x1[0] + x1[1] (-> x1[0])
  433. SUB r9, r9,r10 @ r9 = s1 = x1[2] - x1[3]
  434. ADD r10,r9,r10, LSL #1 @ r10= x1[2] + x1[3] (-> x1[2])
  435. SUB r4, r4, r8 @ r4 = s2 = x2[0] - x2[1]
  436. ADD r8, r4, r8, LSL #1 @ r8 = x2[0] + x2[1] (-> x1[1])
  437. SUB r14,r14,r11 @ r14= s3 = x2[3] - x2[2]
  438. ADD r11,r14,r11,LSL #1 @ r11= x2[3] + x2[2] (-> x1[3])
  439. STMIA r7,{r3,r8,r10,r11}
  440. @ r0 = points
  441. @ r1 = x2
  442. @ r2 = s0
  443. @ r3 free
  444. @ r4 = s2
  445. @ r5 = T
  446. @ r6 = step
  447. @ r7 = x1
  448. @ r8 free
  449. @ r9 = s1
  450. @ r10 free
  451. @ r11 free
  452. @ r12= limit
  453. @ r14= s3
  454. LDR r8, [r5,#4] @ r8 = T[1]
  455. LDR r10,[r5],-r6,LSL #2 @ r10= T[0] T -= step
  456. @ XNPROD31(s0, s1, T[0], T[1], &x2[0], &x2[2])
  457. @ x2[0] = (s0*T[0] - s1*T[1])>>31 x2[2] = (s1*T[0] + s0*T[1])>>31
  458. @ stall Xscale
  459. SMULL r3, r11,r2, r8 @ (r3, r11) = s0*T[1]
  460. SMLAL r3, r11,r9, r10 @ (r3, r11) += s1*T[0]
  461. RSB r9, r9, #0
  462. SMULL r3, r2, r10,r2 @ (r3, r2) = s0*T[0]
  463. SMLAL r3, r2, r9, r8 @ (r3, r2) += -s1*T[1]
  464. MOV r9, r11,LSL #1 @ r9 = r11<<1 = Value for x2[2]
  465. @ XNPROD31(s3, s2, T[0], T[1], &x2[1], &x2[3])
  466. @ x2[1] = (s3*T[0] - s2*T[1])>>31 x2[3] = (s2*T[0] + s3*T[1])>>31
  467. SMULL r3, r11,r4, r10 @ (r3,r11) = s2*T[0]
  468. MOV r2, r2, LSL #1 @ r2 = r2<<1 = Value for x2[0]
  469. SMLAL r3, r11,r14,r8 @ (r3,r11) += s3*T[1]
  470. RSB r4, r4, #0
  471. SMULL r10,r3,r14,r10 @ (r10,r3) = s3*T[0]
  472. MOV r11,r11,LSL #1 @ r11= r11<<1 = Value for x2[3]
  473. SMLAL r10,r3, r4, r8 @ (r10,r3) -= s2*T[1]
  474. CMP r5, r12
  475. MOV r3, r3, LSL #1 @ r3 = r3<<1 = Value for x2[1]
  476. STMIA r1,{r2,r3,r9,r11}
  477. BGT mdct_bufferfly_generic_loop2
  478. LDR r2,[r13],#4 @ unstack r2
  479. ADD r1, r1, r0, LSL #2 @ r1 = x+POINTS*j
  480. @ stall Xscale
  481. SUBS r2, r2, #1 @ r2-- (j++)
  482. BGT mdct_butterflies_loop2
  483. LDMFD r13!,{r4,r14}
  484. LDR r1,[r13,#4]
  485. SUBS r4, r4, #1 @ stages--
  486. MOV r14,r14,LSL #1 @ r14= 4<<i (i++)
  487. MOV r6, r6, LSL #1 @ r6 = step <<= 1 (i++)
  488. BGE mdct_butterflies_loop1
  489. LDMFD r13,{r0-r1}
  490. no_generics:
  491. @ mdct_butterflies part2 (loop around mdct_bufferfly_32)
  492. @ r0 = points
  493. @ r1 = in
  494. @ r2 = step
  495. @ r3 = shift
  496. mdct_bufferflies_loop3:
  497. @ mdct_bufferfly_32
  498. @ block1
  499. ADD r4, r1, #16*4 @ r4 = &in[16]
  500. LDMIA r4,{r5,r6,r9,r10} @ r5 = x[16]
  501. @ r6 = x[17]
  502. @ r9 = x[18]
  503. @ r10= x[19]
  504. LDMIA r1,{r7,r8,r11,r12} @ r7 = x[0]
  505. @ r8 = x[1]
  506. @ r11= x[2]
  507. @ r12= x[3]
  508. SUB r5, r5, r6 @ r5 = s0 = x[16] - x[17]
  509. ADD r6, r5, r6, LSL #1 @ r6 = x[16] + x[17] -> x[16]
  510. SUB r9, r9, r10 @ r9 = s1 = x[18] - x[19]
  511. ADD r10,r9, r10,LSL #1 @ r10= x[18] + x[19] -> x[18]
  512. SUB r8, r8, r7 @ r8 = s2 = x[ 1] - x[ 0]
  513. ADD r7, r8, r7, LSL #1 @ r7 = x[ 1] + x[ 0] -> x[17]
  514. SUB r12,r12,r11 @ r12= s3 = x[ 3] - x[ 2]
  515. ADD r11,r12,r11, LSL #1 @ r11= x[ 3] + x[ 2] -> x[19]
  516. STMIA r4!,{r6,r7,r10,r11}
  517. LDR r6,cPI1_8
  518. LDR r7,cPI3_8
  519. @ XNPROD31( s0, s1, cPI3_8, cPI1_8, &x[ 0], &x[ 2] )
  520. @ x[0] = s0*cPI3_8 - s1*cPI1_8 x[2] = s1*cPI3_8 + s0*cPI1_8
  521. @ stall Xscale
  522. SMULL r14,r11,r5, r6 @ (r14,r11) = s0*cPI1_8
  523. SMLAL r14,r11,r9, r7 @ (r14,r11) += s1*cPI3_8
  524. RSB r9, r9, #0
  525. SMULL r14,r5, r7, r5 @ (r14,r5) = s0*cPI3_8
  526. SMLAL r14,r5, r9, r6 @ (r14,r5) -= s1*cPI1_8
  527. MOV r11,r11,LSL #1
  528. MOV r5, r5, LSL #1
  529. @ XPROD31 ( s2, s3, cPI1_8, cPI3_8, &x[ 1], &x[ 3] )
  530. @ x[1] = s2*cPI1_8 + s3*cPI3_8 x[3] = s3*cPI1_8 - s2*cPI3_8
  531. SMULL r14,r9, r8, r6 @ (r14,r9) = s2*cPI1_8
  532. SMLAL r14,r9, r12,r7 @ (r14,r9) += s3*cPI3_8
  533. RSB r8,r8,#0
  534. SMULL r14,r12,r6, r12 @ (r14,r12) = s3*cPI1_8
  535. SMLAL r14,r12,r8, r7 @ (r14,r12) -= s2*cPI3_8
  536. MOV r9, r9, LSL #1
  537. MOV r12,r12,LSL #1
  538. STMIA r1!,{r5,r9,r11,r12}
  539. @ block2
  540. LDMIA r4,{r5,r6,r9,r10} @ r5 = x[20]
  541. @ r6 = x[21]
  542. @ r9 = x[22]
  543. @ r10= x[23]
  544. LDMIA r1,{r7,r8,r11,r12} @ r7 = x[4]
  545. @ r8 = x[5]
  546. @ r11= x[6]
  547. @ r12= x[7]
  548. SUB r5, r5, r6 @ r5 = s0 = x[20] - x[21]
  549. ADD r6, r5, r6, LSL #1 @ r6 = x[20] + x[21] -> x[20]
  550. SUB r9, r9, r10 @ r9 = s1 = x[22] - x[23]
  551. ADD r10,r9, r10,LSL #1 @ r10= x[22] + x[23] -> x[22]
  552. SUB r8, r8, r7 @ r8 = s2 = x[ 5] - x[ 4]
  553. ADD r7, r8, r7, LSL #1 @ r7 = x[ 5] + x[ 4] -> x[21]
  554. SUB r12,r12,r11 @ r12= s3 = x[ 7] - x[ 6]
  555. ADD r11,r12,r11, LSL #1 @ r11= x[ 7] + x[ 6] -> x[23]
  556. LDR r14,cPI2_8
  557. STMIA r4!,{r6,r7,r10,r11}
  558. SUB r5, r5, r9 @ r5 = s0 - s1
  559. ADD r9, r5, r9, LSL #1 @ r9 = s0 + s1
  560. SMULL r6, r5, r14,r5 @ (r6,r5) = (s0-s1)*cPI2_8
  561. SUB r12,r12,r8 @ r12= s3 - s2
  562. ADD r8, r12,r8, LSL #1 @ r8 = s3 + s2
  563. SMULL r6, r8, r14,r8 @ (r6,r8) = (s3+s2)*cPI2_8
  564. MOV r5, r5, LSL #1
  565. SMULL r6, r9, r14,r9 @ (r6,r9) = (s0+s1)*cPI2_8
  566. MOV r8, r8, LSL #1
  567. SMULL r6, r12,r14,r12 @ (r6,r12) = (s3-s2)*cPI2_8
  568. MOV r9, r9, LSL #1
  569. MOV r12,r12,LSL #1
  570. STMIA r1!,{r5,r8,r9,r12}
  571. @ block3
  572. LDMIA r4,{r5,r6,r9,r10} @ r5 = x[24]
  573. @ r6 = x[25]
  574. @ r9 = x[25]
  575. @ r10= x[26]
  576. LDMIA r1,{r7,r8,r11,r12} @ r7 = x[8]
  577. @ r8 = x[9]
  578. @ r11= x[10]
  579. @ r12= x[11]
  580. SUB r5, r5, r6 @ r5 = s0 = x[24] - x[25]
  581. ADD r6, r5, r6, LSL #1 @ r6 = x[24] + x[25] -> x[25]
  582. SUB r9, r9, r10 @ r9 = s1 = x[26] - x[27]
  583. ADD r10,r9, r10,LSL #1 @ r10= x[26] + x[27] -> x[26]
  584. SUB r8, r8, r7 @ r8 = s2 = x[ 9] - x[ 8]
  585. ADD r7, r8, r7, LSL #1 @ r7 = x[ 9] + x[ 8] -> x[25]
  586. SUB r12,r12,r11 @ r12= s3 = x[11] - x[10]
  587. ADD r11,r12,r11, LSL #1 @ r11= x[11] + x[10] -> x[27]
  588. STMIA r4!,{r6,r7,r10,r11}
  589. LDR r6,cPI3_8
  590. LDR r7,cPI1_8
  591. @ XNPROD31( s0, s1, cPI1_8, cPI3_8, &x[ 8], &x[10] )
  592. @ x[8] = s0*cPI1_8 - s1*cPI3_8 x[10] = s1*cPI1_8 + s0*cPI3_8
  593. @ stall Xscale
  594. SMULL r14,r11,r5, r6 @ (r14,r11) = s0*cPI3_8
  595. SMLAL r14,r11,r9, r7 @ (r14,r11) += s1*cPI1_8
  596. RSB r9, r9, #0
  597. SMULL r14,r5, r7, r5 @ (r14,r5) = s0*cPI1_8
  598. SMLAL r14,r5, r9, r6 @ (r14,r5) -= s1*cPI3_8
  599. MOV r11,r11,LSL #1
  600. MOV r5, r5, LSL #1
  601. @ XPROD31 ( s2, s3, cPI3_8, cPI1_8, &x[ 9], &x[11] )
  602. @ x[9] = s2*cPI3_8 + s3*cPI1_8 x[11] = s3*cPI3_8 - s2*cPI1_8
  603. SMULL r14,r9, r8, r6 @ (r14,r9) = s2*cPI3_8
  604. SMLAL r14,r9, r12,r7 @ (r14,r9) += s3*cPI1_8
  605. RSB r8,r8,#0
  606. SMULL r14,r12,r6, r12 @ (r14,r12) = s3*cPI3_8
  607. SMLAL r14,r12,r8, r7 @ (r14,r12) -= s2*cPI1_8
  608. MOV r9, r9, LSL #1
  609. MOV r12,r12,LSL #1
  610. STMIA r1!,{r5,r9,r11,r12}
  611. @ block4
  612. LDMIA r4,{r5,r6,r10,r11} @ r5 = x[28]
  613. @ r6 = x[29]
  614. @ r10= x[30]
  615. @ r11= x[31]
  616. LDMIA r1,{r8,r9,r12,r14} @ r8 = x[12]
  617. @ r9 = x[13]
  618. @ r12= x[14]
  619. @ r14= x[15]
  620. SUB r5, r5, r6 @ r5 = s0 = x[28] - x[29]
  621. ADD r6, r5, r6, LSL #1 @ r6 = x[28] + x[29] -> x[28]
  622. SUB r7, r14,r12 @ r7 = s3 = x[15] - x[14]
  623. ADD r12,r7, r12, LSL #1 @ r12= x[15] + x[14] -> x[31]
  624. SUB r10,r10,r11 @ r10= s1 = x[30] - x[31]
  625. ADD r11,r10,r11,LSL #1 @ r11= x[30] + x[31] -> x[30]
  626. SUB r14, r8, r9 @ r14= s2 = x[12] - x[13]
  627. ADD r9, r14, r9, LSL #1 @ r9 = x[12] + x[13] -> x[29]
  628. STMIA r4!,{r6,r9,r11,r12}
  629. STMIA r1!,{r5,r7,r10,r14}
  630. @ mdct_butterfly16 (1st version)
  631. @ block 1
  632. SUB r1,r1,#16*4
  633. ADD r4,r1,#8*4
  634. LDMIA r4,{r5,r6,r9,r10} @ r5 = x[ 8]
  635. @ r6 = x[ 9]
  636. @ r9 = x[10]
  637. @ r10= x[11]
  638. LDMIA r1,{r7,r8,r11,r12} @ r7 = x[0]
  639. @ r8 = x[1]
  640. @ r11= x[2]
  641. @ r12= x[3]
  642. SUB r5, r5, r6 @ r5 = s0 = x[ 8] - x[ 9]
  643. ADD r6, r5, r6, LSL #1 @ r6 = x[ 8] + x[ 9] -> x[ 8]
  644. SUB r9, r9, r10 @ r9 = s1 = x[10] - x[11]
  645. ADD r10,r9, r10,LSL #1 @ r10= x[10] + x[11] -> x[10]
  646. SUB r8, r8, r7 @ r8 = s2 = x[ 1] - x[ 0]
  647. ADD r7, r8, r7, LSL #1 @ r7 = x[ 1] + x[ 0] -> x[ 9]
  648. SUB r12,r12,r11 @ r12= s3 = x[ 3] - x[ 2]
  649. ADD r11,r12,r11, LSL #1 @ r11= x[ 3] + x[ 2] -> x[11]
  650. LDR r14,cPI2_8
  651. STMIA r4!,{r6,r7,r10,r11}
  652. SUB r5, r5, r9 @ r5 = s0 - s1
  653. ADD r9, r5, r9, LSL #1 @ r9 = s0 + s1
  654. SMULL r6, r5, r14,r5 @ (r6,r5) = (s0-s1)*cPI2_8
  655. SUB r12,r12,r8 @ r12= s3 - s2
  656. ADD r8, r12,r8, LSL #1 @ r8 = s3 + s2
  657. SMULL r6, r8, r14,r8 @ (r6,r8) = (s3+s2)*cPI2_8
  658. MOV r5, r5, LSL #1
  659. SMULL r6, r9, r14,r9 @ (r6,r9) = (s0+s1)*cPI2_8
  660. MOV r8, r8, LSL #1
  661. SMULL r6, r12,r14,r12 @ (r6,r12) = (s3-s2)*cPI2_8
  662. MOV r9, r9, LSL #1
  663. MOV r12,r12,LSL #1
  664. STMIA r1!,{r5,r8,r9,r12}
  665. @ block4
  666. LDMIA r4,{r5,r6,r9,r10} @ r5 = x[12]
  667. @ r6 = x[13]
  668. @ r9 = x[14]
  669. @ r10= x[15]
  670. LDMIA r1,{r7,r8,r11,r12} @ r7 = x[ 4]
  671. @ r8 = x[ 5]
  672. @ r11= x[ 6]
  673. @ r12= x[ 7]
  674. SUB r14,r7, r8 @ r14= s0 = x[ 4] - x[ 5]
  675. ADD r8, r14,r8, LSL #1 @ r8 = x[ 4] + x[ 5] -> x[13]
  676. SUB r7, r12,r11 @ r7 = s1 = x[ 7] - x[ 6]
  677. ADD r11,r7, r11, LSL #1 @ r11= x[ 7] + x[ 6] -> x[15]
  678. SUB r5, r5, r6 @ r5 = s2 = x[12] - x[13]
  679. ADD r6, r5, r6, LSL #1 @ r6 = x[12] + x[13] -> x[12]
  680. SUB r12,r9, r10 @ r12= s3 = x[14] - x[15]
  681. ADD r10,r12,r10,LSL #1 @ r10= x[14] + x[15] -> x[14]
  682. STMIA r4!,{r6,r8,r10,r11}
  683. STMIA r1!,{r5,r7,r12,r14}
  684. @ mdct_butterfly_8
  685. LDMDB r1,{r6,r7,r8,r9,r10,r11,r12,r14}
  686. @ r6 = x[0]
  687. @ r7 = x[1]
  688. @ r8 = x[2]
  689. @ r9 = x[3]
  690. @ r10= x[4]
  691. @ r11= x[5]
  692. @ r12= x[6]
  693. @ r14= x[7]
  694. ADD r6, r6, r7 @ r6 = s0 = x[0] + x[1]
  695. SUB r7, r6, r7, LSL #1 @ r7 = s1 = x[0] - x[1]
  696. ADD r8, r8, r9 @ r8 = s2 = x[2] + x[3]
  697. SUB r9, r8, r9, LSL #1 @ r9 = s3 = x[2] - x[3]
  698. ADD r10,r10,r11 @ r10= s4 = x[4] + x[5]
  699. SUB r11,r10,r11,LSL #1 @ r11= s5 = x[4] - x[5]
  700. ADD r12,r12,r14 @ r12= s6 = x[6] + x[7]
  701. SUB r14,r12,r14,LSL #1 @ r14= s7 = x[6] - x[7]
  702. ADD r2, r11,r9 @ r2 = x[0] = s5 + s3
  703. SUB r4, r2, r9, LSL #1 @ r4 = x[2] = s5 - s3
  704. SUB r3, r14,r7 @ r3 = x[1] = s7 - s1
  705. ADD r5, r3, r7, LSL #1 @ r5 = x[3] = s7 + s1
  706. SUB r10,r10,r6 @ r10= x[4] = s4 - s0
  707. SUB r11,r12,r8 @ r11= x[5] = s6 - s2
  708. ADD r12,r10,r6, LSL #1 @ r12= x[6] = s4 + s0
  709. ADD r14,r11,r8, LSL #1 @ r14= x[7] = s6 + s2
  710. STMDB r1,{r2,r3,r4,r5,r10,r11,r12,r14}
  711. @ mdct_butterfly_8
  712. LDMIA r1,{r6,r7,r8,r9,r10,r11,r12,r14}
  713. @ r6 = x[0]
  714. @ r7 = x[1]
  715. @ r8 = x[2]
  716. @ r9 = x[3]
  717. @ r10= x[4]
  718. @ r11= x[5]
  719. @ r12= x[6]
  720. @ r14= x[7]
  721. ADD r6, r6, r7 @ r6 = s0 = x[0] + x[1]
  722. SUB r7, r6, r7, LSL #1 @ r7 = s1 = x[0] - x[1]
  723. ADD r8, r8, r9 @ r8 = s2 = x[2] + x[3]
  724. SUB r9, r8, r9, LSL #1 @ r9 = s3 = x[2] - x[3]
  725. ADD r10,r10,r11 @ r10= s4 = x[4] + x[5]
  726. SUB r11,r10,r11,LSL #1 @ r11= s5 = x[4] - x[5]
  727. ADD r12,r12,r14 @ r12= s6 = x[6] + x[7]
  728. SUB r14,r12,r14,LSL #1 @ r14= s7 = x[6] - x[7]
  729. ADD r2, r11,r9 @ r2 = x[0] = s5 + s3
  730. SUB r4, r2, r9, LSL #1 @ r4 = x[2] = s5 - s3
  731. SUB r3, r14,r7 @ r3 = x[1] = s7 - s1
  732. ADD r5, r3, r7, LSL #1 @ r5 = x[3] = s7 + s1
  733. SUB r10,r10,r6 @ r10= x[4] = s4 - s0
  734. SUB r11,r12,r8 @ r11= x[5] = s6 - s2
  735. ADD r12,r10,r6, LSL #1 @ r12= x[6] = s4 + s0
  736. ADD r14,r11,r8, LSL #1 @ r14= x[7] = s6 + s2
  737. STMIA r1,{r2,r3,r4,r5,r10,r11,r12,r14}
  738. @ block 2
  739. ADD r1,r1,#16*4-8*4
  740. ADD r4,r1,#8*4
  741. LDMIA r4,{r5,r6,r9,r10} @ r5 = x[ 8]
  742. @ r6 = x[ 9]
  743. @ r9 = x[10]
  744. @ r10= x[11]
  745. LDMIA r1,{r7,r8,r11,r12} @ r7 = x[0]
  746. @ r8 = x[1]
  747. @ r11= x[2]
  748. @ r12= x[3]
  749. SUB r5, r5, r6 @ r5 = s0 = x[ 8] - x[ 9]
  750. ADD r6, r5, r6, LSL #1 @ r6 = x[ 8] + x[ 9] -> x[ 8]
  751. SUB r9, r9, r10 @ r9 = s1 = x[10] - x[11]
  752. ADD r10,r9, r10,LSL #1 @ r10= x[10] + x[11] -> x[10]
  753. SUB r8, r8, r7 @ r8 = s2 = x[ 1] - x[ 0]
  754. ADD r7, r8, r7, LSL #1 @ r7 = x[ 1] + x[ 0] -> x[ 9]
  755. SUB r12,r12,r11 @ r12= s3 = x[ 3] - x[ 2]
  756. ADD r11,r12,r11, LSL #1 @ r11= x[ 3] + x[ 2] -> x[11]
  757. LDR r14,cPI2_8
  758. STMIA r4!,{r6,r7,r10,r11}
  759. SUB r5, r5, r9 @ r5 = s0 - s1
  760. ADD r9, r5, r9, LSL #1 @ r9 = s0 + s1
  761. SMULL r6, r5, r14,r5 @ (r6,r5) = (s0-s1)*cPI2_8
  762. SUB r12,r12,r8 @ r12= s3 - s2
  763. ADD r8, r12,r8, LSL #1 @ r8 = s3 + s2
  764. SMULL r6, r8, r14,r8 @ (r6,r8) = (s3+s2)*cPI2_8
  765. MOV r5, r5, LSL #1
  766. SMULL r6, r9, r14,r9 @ (r6,r9) = (s0+s1)*cPI2_8
  767. MOV r8, r8, LSL #1
  768. SMULL r6, r12,r14,r12 @ (r6,r12) = (s3-s2)*cPI2_8
  769. MOV r9, r9, LSL #1
  770. MOV r12,r12,LSL #1
  771. STMIA r1!,{r5,r8,r9,r12}
  772. @ block4
  773. LDMIA r4,{r5,r6,r9,r10} @ r5 = x[12]
  774. @ r6 = x[13]
  775. @ r9 = x[14]
  776. @ r10= x[15]
  777. LDMIA r1,{r7,r8,r11,r12} @ r7 = x[ 4]
  778. @ r8 = x[ 5]
  779. @ r11= x[ 6]
  780. @ r12= x[ 7]
  781. SUB r5, r5, r6 @ r5 = s2 = x[12] - x[13]
  782. ADD r6, r5, r6, LSL #1 @ r6 = x[12] + x[13] -> x[12]
  783. SUB r9, r9, r10 @ r9 = s3 = x[14] - x[15]
  784. ADD r10,r9, r10,LSL #1 @ r10= x[14] + x[15] -> x[14]
  785. SUB r14,r7, r8 @ r14= s0 = x[ 4] - x[ 5]
  786. ADD r8, r14,r8, LSL #1 @ r8 = x[ 4] + x[ 5] -> x[13]
  787. SUB r7, r12,r11 @ r7 = s1 = x[ 7] - x[ 6]
  788. ADD r11,r7, r11, LSL #1 @ r11= x[ 7] + x[ 6] -> x[15]
  789. STMIA r4!,{r6,r8,r10,r11}
  790. STMIA r1!,{r5,r7,r9,r14}
  791. @ mdct_butterfly_8
  792. LDMDB r1,{r6,r7,r8,r9,r10,r11,r12,r14}
  793. @ r6 = x[0]
  794. @ r7 = x[1]
  795. @ r8 = x[2]
  796. @ r9 = x[3]
  797. @ r10= x[4]
  798. @ r11= x[5]
  799. @ r12= x[6]
  800. @ r14= x[7]
  801. ADD r6, r6, r7 @ r6 = s0 = x[0] + x[1]
  802. SUB r7, r6, r7, LSL #1 @ r7 = s1 = x[0] - x[1]
  803. ADD r8, r8, r9 @ r8 = s2 = x[2] + x[3]
  804. SUB r9, r8, r9, LSL #1 @ r9 = s3 = x[2] - x[3]
  805. ADD r10,r10,r11 @ r10= s4 = x[4] + x[5]
  806. SUB r11,r10,r11,LSL #1 @ r11= s5 = x[4] - x[5]
  807. ADD r12,r12,r14 @ r12= s6 = x[6] + x[7]
  808. SUB r14,r12,r14,LSL #1 @ r14= s7 = x[6] - x[7]
  809. ADD r2, r11,r9 @ r2 = x[0] = s5 + s3
  810. SUB r4, r2, r9, LSL #1 @ r4 = x[2] = s5 - s3
  811. SUB r3, r14,r7 @ r3 = x[1] = s7 - s1
  812. ADD r5, r3, r7, LSL #1 @ r5 = x[3] = s7 + s1
  813. SUB r10,r10,r6 @ r10= x[4] = s4 - s0
  814. SUB r11,r12,r8 @ r11= x[5] = s6 - s2
  815. ADD r12,r10,r6, LSL #1 @ r12= x[6] = s4 + s0
  816. ADD r14,r11,r8, LSL #1 @ r14= x[7] = s6 + s2
  817. STMDB r1,{r2,r3,r4,r5,r10,r11,r12,r14}
  818. @ mdct_butterfly_8
  819. LDMIA r1,{r6,r7,r8,r9,r10,r11,r12,r14}
  820. @ r6 = x[0]
  821. @ r7 = x[1]
  822. @ r8 = x[2]
  823. @ r9 = x[3]
  824. @ r10= x[4]
  825. @ r11= x[5]
  826. @ r12= x[6]
  827. @ r14= x[7]
  828. ADD r6, r6, r7 @ r6 = s0 = x[0] + x[1]
  829. SUB r7, r6, r7, LSL #1 @ r7 = s1 = x[0] - x[1]
  830. ADD r8, r8, r9 @ r8 = s2 = x[2] + x[3]
  831. SUB r9, r8, r9, LSL #1 @ r9 = s3 = x[2] - x[3]
  832. ADD r10,r10,r11 @ r10= s4 = x[4] + x[5]
  833. SUB r11,r10,r11,LSL #1 @ r11= s5 = x[4] - x[5]
  834. ADD r12,r12,r14 @ r12= s6 = x[6] + x[7]
  835. SUB r14,r12,r14,LSL #1 @ r14= s7 = x[6] - x[7]
  836. ADD r2, r11,r9 @ r2 = x[0] = s5 + s3
  837. SUB r4, r2, r9, LSL #1 @ r4 = x[2] = s5 - s3
  838. SUB r3, r14,r7 @ r3 = x[1] = s7 - s1
  839. ADD r5, r3, r7, LSL #1 @ r5 = x[3] = s7 + s1
  840. SUB r10,r10,r6 @ r10= x[4] = s4 - s0
  841. SUB r11,r12,r8 @ r11= x[5] = s6 - s2
  842. ADD r12,r10,r6, LSL #1 @ r12= x[6] = s4 + s0
  843. ADD r14,r11,r8, LSL #1 @ r14= x[7] = s6 + s2
  844. STMIA r1,{r2,r3,r4,r5,r10,r11,r12,r14}
  845. ADD r1,r1,#8*4
  846. SUBS r0,r0,#64
  847. BGT mdct_bufferflies_loop3
  848. LDMFD r13,{r0-r3}
  849. mdct_bitreverseARM:
  850. @ r0 = points
  851. @ r1 = in
  852. @ r2 = step
  853. @ r3 = shift
  854. MOV r4, #0 @ r4 = bit = 0
  855. ADD r5, r1, r0, LSL #1 @ r5 = w = x + (n>>1)
  856. ADR r6, bitrev
  857. SUB r5, r5, #8
  858. brev_lp:
  859. LDRB r7, [r6, r4, LSR #6]
  860. AND r8, r4, #0x3f
  861. LDRB r8, [r6, r8]
  862. ADD r4, r4, #1 @ bit++
  863. @ stall XScale
  864. ORR r7, r7, r8, LSL #6 @ r7 = bitrev[bit]
  865. MOV r7, r7, LSR r3
  866. ADD r9, r1, r7, LSL #2 @ r9 = xx = x + (b>>shift)
  867. CMP r5, r9 @ if (w > xx)
  868. LDR r10,[r5],#-8 @ r10 = w[0] w -= 2
  869. LDRGT r11,[r5,#12] @ r11 = w[1]
  870. LDRGT r12,[r9] @ r12 = xx[0]
  871. LDRGT r14,[r9,#4] @ r14 = xx[1]
  872. STRGT r10,[r9] @ xx[0]= w[0]
  873. STRGT r11,[r9,#4] @ xx[1]= w[1]
  874. STRGT r12,[r5,#8] @ w[0] = xx[0]
  875. STRGT r14,[r5,#12] @ w[1] = xx[1]
  876. CMP r5,r1
  877. BGT brev_lp
  878. @ mdct_step7
  879. @ r0 = points
  880. @ r1 = in
  881. @ r2 = step
  882. @ r3 = shift
  883. CMP r2, #4 @ r5 = T = (step>=4) ?
  884. LDRGE r5, =sincos_lookup0 @ sincos_lookup0 +
  885. LDRLT r5, =sincos_lookup1 @ sincos_lookup0 +
  886. ADD r7, r1, r0, LSL #1 @ r7 = w1 = x + (n>>1)
  887. ADDGE r5, r5, r2, LSL #1 @ (step>>1)
  888. ADD r8, r5, #1024*4 @ r8 = Ttop
  889. step7_loop1:
  890. LDR r6, [r1] @ r6 = w0[0]
  891. LDR r9, [r1,#4] @ r9 = w0[1]
  892. LDR r10,[r7,#-8]! @ r10= w1[0] w1 -= 2
  893. LDR r11,[r7,#4] @ r11= w1[1]
  894. LDR r14,[r5,#4] @ r14= T[1]
  895. LDR r12,[r5],r2,LSL #2 @ r12= T[0] T += step
  896. ADD r6, r6, r10 @ r6 = s0 = w0[0] + w1[0]
  897. SUB r10,r6, r10,LSL #1 @ r10= s1b= w0[0] - w1[0]
  898. SUB r11,r11,r9 @ r11= s1 = w1[1] - w0[1]
  899. ADD r9, r11,r9, LSL #1 @ r9 = s0b= w1[1] + w0[1]
  900. @ Can save 1 cycle by using SMULL SMLAL - at the cost of being
  901. @ 1 off.
  902. SMULL r0, r3, r6, r14 @ (r0,r3) = s0*T[1]
  903. SMULL r0, r4, r11,r12 @ (r0,r4) += s1*T[0] = s2
  904. ADD r3, r3, r4
  905. SMULL r0, r14,r11,r14 @ (r0,r14) = s1*T[1]
  906. SMULL r0, r12,r6, r12 @ (r0,r12) += s0*T[0] = s3
  907. SUB r14,r14,r12
  908. @ r9 = s0b<<1
  909. @ r10= s1b<<1
  910. ADD r9, r3, r9, ASR #1 @ r9 = s0b + s2
  911. SUB r3, r9, r3, LSL #1 @ r3 = s0b - s2
  912. SUB r12,r14,r10,ASR #1 @ r12= s3 - s1b
  913. ADD r10,r14,r10,ASR #1 @ r10= s3 + s1b
  914. STR r9, [r1],#4
  915. STR r10,[r1],#4 @ w0 += 2
  916. STR r3, [r7]
  917. STR r12,[r7,#4]
  918. CMP r5,r8
  919. BLT step7_loop1
  920. step7_loop2:
  921. LDR r6, [r1] @ r6 = w0[0]
  922. LDR r9, [r1,#4] @ r9 = w0[1]
  923. LDR r10,[r7,#-8]! @ r10= w1[0] w1 -= 2
  924. LDR r11,[r7,#4] @ r11= w1[1]
  925. LDR r14,[r5,-r2,LSL #2]! @ r12= T[1] T -= step
  926. LDR r12,[r5,#4] @ r14= T[0]
  927. ADD r6, r6, r10 @ r6 = s0 = w0[0] + w1[0]
  928. SUB r10,r6, r10,LSL #1 @ r10= s1b= w0[0] - w1[0]
  929. SUB r11,r11,r9 @ r11= s1 = w1[1] - w0[1]
  930. ADD r9, r11,r9, LSL #1 @ r9 = s0b= w1[1] + w0[1]
  931. @ Can save 1 cycle by using SMULL SMLAL - at the cost of being
  932. @ 1 off.
  933. SMULL r0, r3, r6, r14 @ (r0,r3) = s0*T[0]
  934. SMULL r0, r4, r11,r12 @ (r0,r4) += s1*T[1] = s2
  935. ADD r3, r3, r4
  936. SMULL r0, r14,r11,r14 @ (r0,r14) = s1*T[0]
  937. SMULL r0, r12,r6, r12 @ (r0,r12) += s0*T[1] = s3
  938. SUB r14,r14,r12
  939. @ r9 = s0b<<1
  940. @ r10= s1b<<1
  941. ADD r9, r3, r9, ASR #1 @ r9 = s0b + s2
  942. SUB r3, r9, r3, LSL #1 @ r3 = s0b - s2
  943. SUB r12,r14,r10,ASR #1 @ r12= s3 - s1b
  944. ADD r10,r14,r10,ASR #1 @ r10= s3 + s1b
  945. STR r9, [r1],#4
  946. STR r10,[r1],#4 @ w0 += 2
  947. STR r3, [r7]
  948. STR r12,[r7,#4]
  949. CMP r1,r7
  950. BLT step7_loop2
  951. LDMFD r13!,{r0-r3}
  952. @ r0 = points
  953. @ r1 = in
  954. @ r2 = step
  955. @ r3 = shift
  956. MOV r2, r2, ASR #2 @ r2 = step >>= 2
  957. CMP r2, #0
  958. CMPNE r2, #1
  959. BEQ mdct_end
  960. @ step > 1 (default case)
  961. CMP r2, #4 @ r5 = T = (step>=4) ?
  962. LDRGE r5, =sincos_lookup0 @ sincos_lookup0 +
  963. LDRLT r5, =sincos_lookup1 @ sincos_lookup1
  964. ADD r7, r1, r0, LSL #1 @ r7 = iX = x + (n>>1)
  965. ADDGE r5, r5, r2, LSL #1 @ (step>>1)
  966. mdct_step8_default:
  967. LDR r6, [r1],#4 @ r6 = s0 = x[0]
  968. LDR r8, [r1],#4 @ r8 = -s1 = x[1]
  969. LDR r12,[r5,#4] @ r12= T[1]
  970. LDR r14,[r5],r2,LSL #2 @ r14= T[0] T += step
  971. RSB r8, r8, #0 @ r8 = s1
  972. @ XPROD31(s0, s1, T[0], T[1], x, x+1)
  973. @ x[0] = s0 * T[0] + s1 * T[1] x[1] = s1 * T[0] - s0 * T[1]
  974. SMULL r9, r10, r8, r12 @ (r9,r10) = s1 * T[1]
  975. CMP r1, r7
  976. SMLAL r9, r10, r6, r14 @ (r9,r10) += s0 * T[0]
  977. RSB r6, r6, #0 @ r6 = -s0
  978. SMULL r9, r11, r8, r14 @ (r9,r11) = s1 * T[0]
  979. MOV r10,r10,LSL #1
  980. SMLAL r9, r11, r6, r12 @ (r9,r11) -= s0 * T[1]
  981. STR r10,[r1,#-8]
  982. MOV r11,r11,LSL #1
  983. STR r11,[r1,#-4]
  984. BLT mdct_step8_default
  985. mdct_end:
  986. MOV r0, r2
  987. LDMFD r13!,{r4-r11,PC}
  988. cPI1_8:
  989. .word 0x7641af3d
  990. cPI2_8:
  991. .word 0x5a82799a
  992. cPI3_8:
  993. .word 0x30fbc54d
  994. bitrev:
  995. .byte 0
  996. .byte 32
  997. .byte 16
  998. .byte 48
  999. .byte 8
  1000. .byte 40
  1001. .byte 24
  1002. .byte 56
  1003. .byte 4
  1004. .byte 36
  1005. .byte 20
  1006. .byte 52
  1007. .byte 12
  1008. .byte 44
  1009. .byte 28
  1010. .byte 60
  1011. .byte 2
  1012. .byte 34
  1013. .byte 18
  1014. .byte 50
  1015. .byte 10
  1016. .byte 42
  1017. .byte 26
  1018. .byte 58
  1019. .byte 6
  1020. .byte 38
  1021. .byte 22
  1022. .byte 54
  1023. .byte 14
  1024. .byte 46
  1025. .byte 30
  1026. .byte 62
  1027. .byte 1
  1028. .byte 33
  1029. .byte 17
  1030. .byte 49
  1031. .byte 9
  1032. .byte 41
  1033. .byte 25
  1034. .byte 57
  1035. .byte 5
  1036. .byte 37
  1037. .byte 21
  1038. .byte 53
  1039. .byte 13
  1040. .byte 45
  1041. .byte 29
  1042. .byte 61
  1043. .byte 3
  1044. .byte 35
  1045. .byte 19
  1046. .byte 51
  1047. .byte 11
  1048. .byte 43
  1049. .byte 27
  1050. .byte 59
  1051. .byte 7
  1052. .byte 39
  1053. .byte 23
  1054. .byte 55
  1055. .byte 15
  1056. .byte 47
  1057. .byte 31
  1058. .byte 63