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