mdctLARM.s 29 KB

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