dpen.s 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. .text
  2. .global decode_packed_entry_number
  3. .global decode_packed_entry_number_REALSTART
  4. .global decode_map
  5. .global vorbis_book_decodevv_add
  6. .global _checksum
  7. decode_packed_entry_number_REALSTART:
  8. dpen_nobits:
  9. MOV r0,r5 @ r0 = b
  10. MOV r1,#1 @ r1 = 1
  11. BL oggpack_adv @ oggpack_adv(b,1) /* Force eop */
  12. duff:
  13. MVN r0,#0 @ return -1
  14. LDMFD r13!,{r4-r8,r10,PC}
  15. dpen_readfailed:
  16. SUBS r4,r4,#1 @ r4 = --read
  17. BEQ dpen_nobits
  18. MOV r0,r5 @ r0 = b
  19. MOV r1,r4 @ r1 = read
  20. ADR r14,dpen_read_return
  21. B oggpack_look
  22. decode_packed_entry_number:
  23. @ r0 = codebook *book
  24. @ r1 = oggpack_buffer *b
  25. STMFD r13!,{r4-r8,r10,r14}
  26. LDMIA r0,{r4,r6,r7} @ r4 = read = book->max_length
  27. @ r6 = book->dec_table
  28. @ r7 = book->dec_method
  29. MOV r5,r1 @ r5 = b
  30. MOV r0,r5 @ r0 = b
  31. MOV r1,r4 @ r1 = read
  32. BL oggpack_look
  33. dpen_read_return:
  34. CMP r0,#0
  35. BLT dpen_readfailed
  36. @ r0 = lok
  37. @ r4 = read
  38. @ r5 = b
  39. @ r6 = dec_table
  40. @ r7 = dec_method
  41. CMP r7, #3
  42. BGT meth4
  43. BEQ meth3
  44. CMP r7, #1
  45. BGT meth2
  46. BEQ meth1
  47. meth0:
  48. RSB r1, r4, #0 @ r1 = i-read = 0-read
  49. MOV r7, #0 @ r7 = chase
  50. m0_loop:
  51. MOVS r0, r0, LSR #1 @ r0 = lok>>1 C = bottom bit
  52. ADC r2, r6, r7, LSL #1 @ r8 = &t[chase*2+C]
  53. LDRB r7, [r2]
  54. ADDS r1, r1, #1 @ r1 = i-read++ (i-read<0 => i<read)
  55. @ stall Xscale
  56. CMPLT r7, #0x80
  57. BLT m0_loop
  58. AND r7, r7, #0x7F @ r7 = chase
  59. CMP r1, #0 @ if (i-read >= 0) === (i >= read)
  60. MVNGT r7, #0 @ if (i >= read) value to return = -1
  61. ADD r1, r1, r4 @ r1 = i-read+read+1 = i +1
  62. MOV r0, r5 @ r0 = b
  63. BL oggpack_adv @ oggpack_adv(b, i+1);
  64. MOV r0, r7 @ return chase
  65. LDMFD r13!,{r4-r8,r10,PC}
  66. meth1:
  67. @ r0 = lok
  68. @ r4 = read
  69. @ r5 = b
  70. @ r6 = dec_table
  71. RSB r1, r4, #0 @ r1 = i = -read
  72. MOV r10,#0 @ r10= next = 0
  73. m1_loop:
  74. MOV r7, r10 @ r7 = chase=next
  75. MOVS r0, r0, LSR #1 @ r0 = lok>>1 C = bottom bit
  76. ADC r8, r6, r7 @ r8 = t+chase+bit
  77. LDRB r10,[r8], -r6 @ r10= next=t[chase+bit] r8=chase+bit
  78. ADDS r1, r1, #1 @ r1 = i++
  79. @ stall Xscale
  80. CMPLT r10,#0x80 @ if (next & 0x80) == 0
  81. BLT m1_loop
  82. ADD r1, r1, r4 @ r1 = i+read
  83. MOV r0, r5 @ r0 = b
  84. BL oggpack_adv @ oggpack_adv(b, i)
  85. CMP r10,#0x80
  86. BLT duff
  87. CMP r8, r7 @ if bit==0 (chase+bit==chase) (sets C)
  88. LDRNEB r14,[r6, r7] @ r14= t[chase]
  89. MOVEQ r14,#128
  90. ADC r12,r8, r6 @ r12= chase+bit+1+t
  91. LDRB r14,[r12,r14,LSR #7] @ r14= t[chase+bit+1+(!bit || t[chase]&0x80)]
  92. BIC r10,r10,#0x80 @ r3 = next &= ~0x80
  93. @ stall Xscale
  94. ORR r0, r14,r10,LSL #8 @ r7 = chase = (next<<8) | r14
  95. LDMFD r13!,{r4-r8,r10,PC}
  96. meth2:
  97. RSB r1, r4, #0 @ r1 = i-read = 0-read
  98. MOV r7, #0 @ r7 = chase
  99. MOV r6, r6, LSR #1
  100. m2_loop:
  101. MOVS r0, r0, LSR #1 @ r0 = lok>>1 C = bottom bit
  102. ADC r2, r6, r7, LSL #1 @ r8 = &t[chase*2+C]
  103. LDRH r7, [r2, r2]
  104. ADDS r1, r1, #1 @ r1 = i-read++ (i-read<0 => i<read)
  105. @ stall Xscale
  106. CMPLT r7, #0x8000
  107. BLT m2_loop
  108. BIC r7, r7, #0x8000 @ r7 = chase
  109. CMP r1, #0 @ if (i-read >= 0) === (i >= read)
  110. MVNGT r7, #0 @ if (i >= read) value to return = -1
  111. ADD r1, r1, r4 @ r1 = i-read+read+1 = i +1
  112. MOV r0, r5 @ r0 = b
  113. BL oggpack_adv @ oggpack_adv(b, i+1);
  114. MOV r0, r7 @ return chase
  115. LDMFD r13!,{r4-r8,r10,PC}
  116. meth3:
  117. @ r0 = lok
  118. @ r4 = read
  119. @ r5 = b
  120. @ r6 = dec_table
  121. RSB r1, r4, #0 @ r1 = i = -read
  122. MOV r10,#0 @ r10= next = 0
  123. m3_loop:
  124. MOV r7, r10 @ r7 = chase=next
  125. MOVS r0, r0, LSR #1 @ r0 = lok>>1 C = bottom bit
  126. ADC r8, r7, #0 @ r8 = chase+bit
  127. MOV r8, r8, LSL #1 @ r8 = (chase+bit)<<1
  128. LDRH r10,[r6, r8] @ r10= next=t[chase+bit]
  129. ADDS r1, r1, #1 @ r1 = i++
  130. @ stall Xscale
  131. CMPLT r10,#0x8000 @ if (next & 0x8000) == 0
  132. BLT m3_loop
  133. ADD r1, r1, r4 @ r1 = i+read
  134. MOV r0, r5 @ r0 = b
  135. BL oggpack_adv @ oggpack_adv(b, i)
  136. CMP r10,#0x8000
  137. BLT duff
  138. MOV r7, r7, LSL #1
  139. CMP r8, r7 @ if bit==0 (chase+bit==chase) sets C
  140. LDRNEH r14,[r6, r7] @ r14= t[chase]
  141. MOVEQ r14,#0x8000
  142. ADC r12,r8, r14,LSR #15 @ r12= 1+((chase+bit)<<1)+(!bit || t[chase]&0x8000)
  143. ADC r12,r12,r14,LSR #15 @ r12= t + (1+chase+bit+(!bit || t[chase]&0x8000))<<1
  144. LDRH r14,[r6, r12] @ r14= t[chase+bit+1
  145. BIC r10,r10,#0x8000 @ r3 = next &= ~0x8000
  146. @ stall Xscale
  147. ORR r0, r14,r10,LSL #16 @ r7 = chase = (next<<16) | r14
  148. LDMFD r13!,{r4-r8,r10,PC}
  149. meth4:
  150. RSB r1, r4, #0 @ r1 = i-read = 0-read
  151. MOV r7, #0 @ r7 = chase
  152. m4_loop:
  153. MOVS r0, r0, LSR #1 @ r0 = lok>>1 C = bottom bit
  154. ADC r2, r7, r7 @ r8 = chase*2+C
  155. LDR r7, [r6, r2, LSL#2]
  156. ADDS r1, r1, #1 @ r1 = i-read++ (i-read<0 => i<read)
  157. @ stall Xscale
  158. CMPLT r7, #0x80000000
  159. BLT m4_loop
  160. BIC r7, r7, #0x80000000 @ r7 = chase
  161. CMP r1, #0 @ if (i-read >= 0) === (i >= read)
  162. MVNGT r7, #0 @ if (i >= read) value to return = -1
  163. ADD r1, r1, r4 @ r1 = i-read+read+1 = i +1
  164. MOV r0, r5 @ r0 = b
  165. BL oggpack_adv @ oggpack_adv(b, i+1);
  166. MOV r0, r7 @ return chase
  167. LDMFD r13!,{r4-r8,r10,PC}
  168. decode_map:
  169. @ r0 = codebook *s
  170. @ r1 = oggpack_buffer *b
  171. @ r2 = int v
  172. @ r3 = int point
  173. STMFD r13!,{r4-r11,r14}
  174. MOV r4, r0 @ r4 = s
  175. MOV r5, r1 @ r5 = b
  176. MOV r6, r2 @ r6 = v
  177. MOV r7, r3 @ r7 = point
  178. BL decode_packed_entry_number
  179. MOV r8, r0
  180. MOV r0, r5
  181. BL oggpack_eop
  182. CMP r0, #0
  183. BNE dm_duff
  184. @ r4 = s
  185. @ r5 = b
  186. @ r6 = v
  187. @ r7 = point
  188. @ r8 = entry
  189. LDR r1, [r4,#12] @ r1 = s->dec_type
  190. LDR r2, [r4,#16] @ r2 = s->q_bits
  191. LDR r3, [r4,#20] @ r3 = s->dim
  192. LDR r5, [r4,#24] @ r5 = s->q_delp
  193. LDR r11,[r4,#28] @ r11= s->q_minp
  194. LDR r12,[r4,#32] @ r12= s->q_del = mul
  195. LDR r14,[r4,#36] @ r14= s->q_min
  196. SUBS r11,r7, r11 @ r11= add = point - s->q_minp
  197. MOVGT r14,r14,ASR r11 @ r14= add = s->q_min >> add (if add >0)
  198. RSBLT r11,r11,#0
  199. MOVLT r14,r14,LSL r11 @ r14= add = s->q_min << -add (if add < 0)
  200. SUBS r5, r7, r5 @ r5 = shiftM = point - s->q_delp
  201. LDR r7, [r4,#40] @ r7 = s->q_seq
  202. RSBLT r5, r5, #0 @ if (shiftM<0) r5 =-shiftM
  203. MOVLT r12,r12,LSL r5 @ r12=mul<<-shiftM
  204. MOVLT r5, #0 @ r5 =shiftM = 0
  205. MOVGT r14,r14,LSL r5 @ add <<= shiftM
  206. CMP r7,#0 @ seqMask = (s->q_seq?-1:0)
  207. MVNNE r7,#0
  208. CMP r1, #2
  209. BEQ dm2
  210. BGT dm3
  211. CMP r1,#0 @ probably never happens
  212. BLE dm_duff
  213. dm1:
  214. @ r1 = s->dec_type
  215. @ r2 = s->q_bits
  216. @ r3 = s->dim
  217. @ r5 = shiftM
  218. @ r6 = v
  219. @ r7 = seqMask
  220. @ r8 = entry
  221. @ r12= mul
  222. @ r14= add
  223. MOV r0, #1
  224. RSB r0, r0, r0, LSL r2 @ r0 = mask = (1<<s->q_bits)-1
  225. MOV r11,#0 @ r11= prev = 0
  226. dm1_loop:
  227. AND r1, r8, r0 @ r1 = v = entry & mask
  228. MLA r1, r12, r1, r14 @ r1 = (add + mul*v)
  229. MOV r8, r8, LSR r2 @ r8 = entry>>s->q_bits
  230. SUBS r3, r3, #1
  231. ADD r1, r11,r1, ASR r5 @ r1 = v = prev+((add+mul*v)>>shiftM)
  232. AND r11,r1, r7 @ r11= prev = seqMask & v
  233. STR r1, [r6], #4 @ *v++ = v
  234. BGT dm1_loop
  235. MOV r0, #0
  236. LDMFD r13!,{r4-r11,PC}
  237. dm2:
  238. @ r1 = s->dec_type
  239. @ r2 = s->q_bits
  240. @ r3 = s->dim
  241. @ r4 = s
  242. @ r5 = shiftM
  243. @ r6 = v
  244. @ r7 = seqMask
  245. @ r8 = entry
  246. @ r12= mul
  247. @ r14= add
  248. LDR r1, [r4,#44] @ r1 = s->q_pack
  249. LDR r4, [r4,#48] @ r4 = s->q_val
  250. MOV r11,#0 @ r11= prev
  251. MOV r0, #1
  252. RSB r0, r0, r0, LSL r1 @ r8 = mask = (1<<s->q_pack)-1
  253. CMP r2,#8
  254. BGT dm2_hword
  255. dm2_loop:
  256. AND r2, r8, r0 @ r2 = entry & mask
  257. LDRB r2, [r4, r2] @ r2 = v = q->val[entry & mask]
  258. MOV r8, r8, LSR r1 @ r8 = entry>>q_pack
  259. MLA r2, r12,r2, r14 @ r2 = (add+mul*v)
  260. SUBS r3, r3, #1
  261. ADD r2, r11,r2, ASR r5 @ r2 = v = prev+(add+mul*v)>>shiftM
  262. AND r11,r2, r7 @ r11= prev = seqMask & v
  263. STR r2, [r6], #4 @ *v++ = v
  264. BGT dm2_loop
  265. MOV r0, #0
  266. LDMFD r13!,{r4-r11,PC}
  267. dm2_hword:
  268. AND r2, r8, r0 @ r2 = entry & mask
  269. MOV r2, r2, LSL #1 @ r2 = 2*r2
  270. LDRH r2, [r4, r2] @ r2 = v = q->val[entry & mask]
  271. MOV r8, r8, LSR r1 @ r8 = entry>>q_pack
  272. MLA r2, r12,r2, r14 @ r2 = (add+mul*v)
  273. SUBS r3, r3, #1
  274. ADD r2, r11,r2, ASR r5 @ r2 = v = prev+(add+mul*v)>>shiftM
  275. AND r11,r2, r7 @ r11= prev = seqMask & v
  276. STR r2, [r6], #4 @ *v++ = v
  277. BGT dm2_hword
  278. MOV r0, #0
  279. LDMFD r13!,{r4-r11,PC}
  280. dm3:
  281. @ r1 = s->dec_type
  282. @ r2 = s->q_bits
  283. @ r3 = s->dim
  284. @ r4 = s
  285. @ r5 = shiftM
  286. @ r6 = v
  287. @ r7 = seqMask
  288. @ r8 = entry
  289. @ r12= mul
  290. @ r14= add
  291. LDR r1, [r4,#44] @ r1 = s->q_pack
  292. LDR r4, [r4,#52] @ r4 = s->q_val
  293. CMP r2,#8
  294. MOV r11,#0 @ r11= prev
  295. MLA r4,r1,r8,r4 @ r4 = ptr = s->q_val+entry*s->q_pack
  296. BGT dm3_hword
  297. dm3_loop:
  298. LDRB r2, [r4], #1 @ r2 = v = *ptr++
  299. SUBS r3, r3, #1
  300. MLA r2, r12,r2, r14 @ r2 = (add+mul*v)
  301. ADD r2, r11,r2, ASR r5 @ r2 = v = prev+(add+mul*v)>>shiftM
  302. AND r11,r2, r7 @ r11= prev = seqMask & v
  303. STR r2, [r6], #4 @ *v++ = v
  304. BGT dm3_loop
  305. MOV r0, #0
  306. LDMFD r13!,{r4-r11,PC}
  307. dm3_hword:
  308. LDRH r2, [r4], #2 @ r2 = *ptr++
  309. SUBS r3, r3, #1
  310. MLA r2, r12,r2, r14 @ r2 = (add+mul*v)
  311. ADD r2, r11,r2, ASR r5 @ r2 = v = prev+(add+mul*v)>>shiftM
  312. AND r11,r2, r7 @ r11= prev = seqMask & v
  313. STR r2, [r6], #4 @ *v++ = v
  314. BGT dm3_hword
  315. MOV r0, #0
  316. LDMFD r13!,{r4-r11,PC}
  317. dm_duff:
  318. MVN r0,#0
  319. LDMFD r13!,{r4-r11,PC}
  320. vorbis_book_decodevv_add:
  321. @ r0 = codebook *book
  322. @ r1 = ogg_int32_t **a
  323. @ r2 = long offset
  324. @ r3 = int ch
  325. @ <> = b
  326. @ <> = n
  327. @ <> = point
  328. STMFD r13!,{r4-r11,R14}
  329. LDR r7, [r0, #13*4] @ r7 = used_entries
  330. MOV r9, r0 @ r9 = book
  331. MOV r10,r1 @ r10= &a[chptr] chptr=0
  332. MOV r6, r3 @ r6 = ch
  333. ADD r8, r10,r3, LSL #2 @ r8 = &a[ch]
  334. MOV r11,r2 @ r11= offset
  335. CMP r7, #0 @ if (used_entries <= 0)
  336. BLE vbdvva_exit @ exit
  337. LDR r5, [r13,#10*4] @ r5 = n
  338. vbdvva_loop1:
  339. @ r5 = n
  340. @ r6 = ch
  341. @ r8 = &a[ch]
  342. @ r9 = book
  343. @ r10= &a[chptr]
  344. @ r11= offset
  345. MOV r0, r9 @ r0 = book
  346. LDR r1, [r13,# 9*4] @ r1 = b
  347. LDR r2, [r9, #14*4] @ r2 = v = dec_buf
  348. LDR r3, [r13,#11*4] @ r3 = point
  349. BL decode_map
  350. CMP r0, #0
  351. BNE vbdvva_fail
  352. LDR r0, [r9, # 5*4] @ r0 = book->dim
  353. LDR r1, [r9, #14*4] @ r1 = v = dec_buf
  354. vbdvva_loop2:
  355. LDR r2, [r10],#4 @ r2 = a[chptr++]
  356. LDR r12,[r1], #4 @ r1 = v[j++]
  357. CMP r10,r8 @ if (chptr == ch)
  358. SUBEQ r10,r10,r6, LSL #2 @ chptr = 0
  359. LDR r14,[r2, r11,LSL #2]! @ r2 = &a[chptr++][i] r14=[r12]
  360. ADDEQ r11,r11,#1 @ i++
  361. SUBEQ r5, r5, #1 @ n--
  362. SUBS r0, r0, #1 @ r0--
  363. ADD r12,r12,r14 @ r12= a[chptr++][i]+ v[j]
  364. STR r12,[r2] @ r12= a[chptr++][i]+=v[j]
  365. BGT vbdvva_loop2
  366. CMP r5,#0
  367. BGT vbdvva_loop1
  368. vbdvva_exit:
  369. MOV r0, #0 @ return 0
  370. LDMFD r13!,{r4-r11,PC}
  371. vbdvva_fail:
  372. MVN r0, #0 @ return -1
  373. LDMFD r13!,{r4-r11,PC}
  374. _checksum:
  375. @ r0 = ogg_reference *or
  376. @ r1 = bytes
  377. STMFD r13!,{r5-r6,r14}
  378. LDR r5,=crc_lookup
  379. MOV r14,#0 @ r14= crc_reg = 0
  380. MOVS r12,r0
  381. BEQ _cs_end
  382. _cs_loop1:
  383. LDMIA r12,{r0,r2,r3,r12} @ r0 = or->buffer
  384. @ r2 = or->begin
  385. @ r3 = or->length
  386. @ r12= or->next
  387. LDR r0,[r0] @ r0 = or->buffer->data
  388. CMP r1,r3 @ r3 = post = (bytes < or->length ?
  389. MOVLT r3,r1 @ bytes : or->length)
  390. MOVS r6,r3 @ r6 = j = post
  391. BEQ _cs_no_bytes
  392. ADD r0,r0,r2 @ r0 = or->buffer->data + or->begin
  393. _cs_loop2:
  394. LDRB r2, [r0],#1 @ r2 = data[j]
  395. @ stall
  396. @ stall Xscale
  397. EOR r2, r2, r14,LSR #24 @ r2 = (crc_reg>>24)^data[j]
  398. LDR r2, [r5, r2, LSL #2] @ r2 = crc_lkp[(crc_reg>>24)^data[j]]
  399. SUBS r6, r6, #1 @ j--
  400. @ stall Xscale
  401. EOR r14,r2, r14,LSL #8 @ r14= crc_reg = (crc_reg<<8)^r2
  402. BGT _cs_loop2
  403. _cs_no_bytes:
  404. SUBS r1, r1, r3
  405. CMPNE r12,#0
  406. BNE _cs_loop1
  407. _cs_end:
  408. MOV r0,r14
  409. LDMFD r13!,{r5-r6,PC}