123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496 |
- @ Tremolo library
- @-----------------------------------------------------------------------
- @ Copyright (C) 2002-2009, Xiph.org Foundation
- @ Copyright (C) 2010, Robin Watts for Pinknoise Productions Ltd
- @ All rights reserved.
- @ Redistribution and use in source and binary forms, with or without
- @ modification, are permitted provided that the following conditions
- @ are met:
- @ * Redistributions of source code must retain the above copyright
- @ notice, this list of conditions and the following disclaimer.
- @ * Redistributions in binary form must reproduce the above
- @ copyright notice, this list of conditions and the following disclaimer
- @ in the documentation and/or other materials provided with the
- @ distribution.
- @ * Neither the names of the Xiph.org Foundation nor Pinknoise
- @ Productions Ltd nor the names of its contributors may be used to
- @ endorse or promote products derived from this software without
- @ specific prior written permission.
- @
- @ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- @ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- @ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- @ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- @ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- @ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- @ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- @ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- @ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- @ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- @ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- @ ----------------------------------------------------------------------
- .text
- .global decode_packed_entry_number
- .global decode_packed_entry_number_REALSTART
- .global decode_map
- .global vorbis_book_decodevv_add
- .global _checksum
- .extern oggpack_adv
- .extern oggpack_look
- .extern oggpack_eop
- .extern crc_lookup
- .hidden crc_lookup
- decode_packed_entry_number_REALSTART:
- dpen_nobits:
- MOV r0,r5 @ r0 = b
- MOV r1,#1 @ r1 = 1
- BL oggpack_adv @ oggpack_adv(b,1) /* Force eop */
- duff:
- MVN r0,#0 @ return -1
- LDMFD r13!,{r4-r8,r10,PC}
- dpen_readfailed:
- SUBS r4,r4,#1 @ r4 = --read
- BEQ dpen_nobits
- MOV r0,r5 @ r0 = b
- MOV r1,r4 @ r1 = read
- ADR r14,dpen_read_return
- B oggpack_look
- decode_packed_entry_number:
- @ r0 = codebook *book
- @ r1 = oggpack_buffer *b
- STMFD r13!,{r4-r8,r10,r14}
- LDMIA r0,{r4,r6,r7} @ r4 = read = book->max_length
- @ r6 = book->dec_table
- @ r7 = book->dec_method
- MOV r5,r1 @ r5 = b
- MOV r0,r5 @ r0 = b
- MOV r1,r4 @ r1 = read
- BL oggpack_look
- dpen_read_return:
- CMP r0,#0
- BLT dpen_readfailed
- @ r0 = lok
- @ r4 = read
- @ r5 = b
- @ r6 = dec_table
- @ r7 = dec_method
- CMP r7, #3
- BGT meth4
- BEQ meth3
- CMP r7, #1
- BGT meth2
- BEQ meth1
- meth0:
- RSB r1, r4, #0 @ r1 = i-read = 0-read
- MOV r7, #0 @ r7 = chase
- m0_loop:
- MOVS r0, r0, LSR #1 @ r0 = lok>>1 C = bottom bit
- ADC r2, r6, r7, LSL #1 @ r8 = &t[chase*2+C]
- LDRB r7, [r2]
- ADDS r1, r1, #1 @ r1 = i-read++ (i-read<0 => i<read)
- @ stall Xscale
- CMPLT r7, #0x80
- BLT m0_loop
- AND r7, r7, #0x7F @ r7 = chase
- CMP r1, #0 @ if (i-read >= 0) === (i >= read)
- MVNGT r7, #0 @ if (i >= read) value to return = -1
- ADD r1, r1, r4 @ r1 = i-read+read+1 = i +1
- MOV r0, r5 @ r0 = b
- BL oggpack_adv @ oggpack_adv(b, i+1);
- MOV r0, r7 @ return chase
- LDMFD r13!,{r4-r8,r10,PC}
- meth1:
- @ r0 = lok
- @ r4 = read
- @ r5 = b
- @ r6 = dec_table
- RSB r1, r4, #0 @ r1 = i = -read
- MOV r10,#0 @ r10= next = 0
- m1_loop:
- MOV r7, r10 @ r7 = chase=next
- MOVS r0, r0, LSR #1 @ r0 = lok>>1 C = bottom bit
- ADC r8, r6, r7 @ r8 = t+chase+bit
- LDRB r10,[r8], -r6 @ r10= next=t[chase+bit] r8=chase+bit
- ADDS r1, r1, #1 @ r1 = i++
- @ stall Xscale
- CMPLT r10,#0x80 @ if (next & 0x80) == 0
- BLT m1_loop
- ADD r1, r1, r4 @ r1 = i+read
- MOV r0, r5 @ r0 = b
- BL oggpack_adv @ oggpack_adv(b, i)
- CMP r10,#0x80
- BLT duff
- CMP r8, r7 @ if bit==0 (chase+bit==chase) (sets C)
- LDRNEB r14,[r6, r7] @ r14= t[chase]
- MOVEQ r14,#128
- ADC r12,r8, r6 @ r12= chase+bit+1+t
- LDRB r14,[r12,r14,LSR #7] @ r14= t[chase+bit+1+(!bit || t[chase]0x0x80)]
- BIC r10,r10,#0x80 @ r3 = next &= ~0x80
- @ stall Xscale
- ORR r0, r14,r10,LSL #8 @ r7 = chase = (next<<8) | r14
- LDMFD r13!,{r4-r8,r10,PC}
- meth2:
- RSB r1, r4, #0 @ r1 = i-read = 0-read
- MOV r7, #0 @ r7 = chase
- MOV r6, r6, LSR #1
- m2_loop:
- MOVS r0, r0, LSR #1 @ r0 = lok>>1 C = bottom bit
- ADC r2, r6, r7, LSL #1 @ r8 = &t[chase*2+C]
- LDRH r7, [r2, r2]
- ADDS r1, r1, #1 @ r1 = i-read++ (i-read<0 => i<read)
- @ stall Xscale
- CMPLT r7, #0x8000
- BLT m2_loop
- BIC r7, r7, #0x8000 @ r7 = chase
- CMP r1, #0 @ if (i-read >= 0) === (i >= read)
- MVNGT r7, #0 @ if (i >= read) value to return = -1
- ADD r1, r1, r4 @ r1 = i-read+read+1 = i +1
- MOV r0, r5 @ r0 = b
- BL oggpack_adv @ oggpack_adv(b, i+1);
- MOV r0, r7 @ return chase
- LDMFD r13!,{r4-r8,r10,PC}
- meth3:
- @ r0 = lok
- @ r4 = read
- @ r5 = b
- @ r6 = dec_table
- RSB r1, r4, #0 @ r1 = i = -read
- MOV r10,#0 @ r10= next = 0
- m3_loop:
- MOV r7, r10 @ r7 = chase=next
- MOVS r0, r0, LSR #1 @ r0 = lok>>1 C = bottom bit
- ADC r8, r7, #0 @ r8 = chase+bit
- MOV r8, r8, LSL #1 @ r8 = (chase+bit)<<1
- LDRH r10,[r6, r8] @ r10= next=t[chase+bit]
- ADDS r1, r1, #1 @ r1 = i++
- @ stall Xscale
- CMPLT r10,#0x8000 @ if (next & 0x8000) == 0
- BLT m3_loop
- ADD r1, r1, r4 @ r1 = i+read
- MOV r0, r5 @ r0 = b
- BL oggpack_adv @ oggpack_adv(b, i)
- CMP r10,#0x8000
- BLT duff
- MOV r7, r7, LSL #1
- CMP r8, r7 @ if bit==0 (chase+bit==chase) sets C
- LDRNEH r14,[r6, r7] @ r14= t[chase]
- MOVEQ r14,#0x8000
- ADC r12,r8, r14,LSR #15 @ r12= 1+((chase+bit)<<1)+(!bit || t[chase]0x0x8000)
- ADC r12,r12,r14,LSR #15 @ r12= t + (1+chase+bit+(!bit || t[chase]0x0x8000))<<1
- LDRH r14,[r6, r12] @ r14= t[chase+bit+1
- BIC r10,r10,#0x8000 @ r3 = next &= ~0x8000
- @ stall Xscale
- ORR r0, r14,r10,LSL #16 @ r7 = chase = (next<<16) | r14
- LDMFD r13!,{r4-r8,r10,PC}
- meth4:
- RSB r1, r4, #0 @ r1 = i-read = 0-read
- MOV r7, #0 @ r7 = chase
- m4_loop:
- MOVS r0, r0, LSR #1 @ r0 = lok>>1 C = bottom bit
- ADC r2, r7, r7 @ r8 = chase*2+C
- LDR r7, [r6, r2, LSL #2]
- ADDS r1, r1, #1 @ r1 = i-read++ (i-read<0 => i<read)
- @ stall Xscale
- CMPLT r7, #0x80000000
- BLT m4_loop
- BIC r7, r7, #0x80000000 @ r7 = chase
- CMP r1, #0 @ if (i-read >= 0) === (i >= read)
- MVNGT r7, #0 @ if (i >= read) value to return = -1
- ADD r1, r1, r4 @ r1 = i-read+read+1 = i +1
- MOV r0, r5 @ r0 = b
- BL oggpack_adv @ oggpack_adv(b, i+1);
- MOV r0, r7 @ return chase
- LDMFD r13!,{r4-r8,r10,PC}
- decode_map:
- @ r0 = codebook *s
- @ r1 = oggpack_buffer *b
- @ r2 = int v
- @ r3 = int point
- STMFD r13!,{r4-r11,r14}
- MOV r4, r0 @ r4 = s
- MOV r5, r1 @ r5 = b
- MOV r6, r2 @ r6 = v
- MOV r7, r3 @ r7 = point
- BL decode_packed_entry_number
- MOV r8, r0
- MOV r0, r5
- BL oggpack_eop
- CMP r0, #0
- BNE dm_duff
- @ r4 = s
- @ r5 = b
- @ r6 = v
- @ r7 = point
- @ r8 = entry
- LDR r1, [r4,#12] @ r1 = s->dec_type
- LDR r2, [r4,#16] @ r2 = s->q_bits
- LDR r3, [r4,#20] @ r3 = s->dim
- LDR r5, [r4,#24] @ r5 = s->q_delp
- LDR r11,[r4,#28] @ r11= s->q_minp
- LDR r12,[r4,#32] @ r12= s->q_del = mul
- LDR r14,[r4,#36] @ r14= s->q_min
- SUBS r11,r7, r11 @ r11= add = point - s->q_minp
- MOVGT r14,r14,ASR r11 @ r14= add = s->q_min >> add (if add >0)
- RSBLT r11,r11,#0
- MOVLT r14,r14,LSL r11 @ r14= add = s->q_min << -add (if add < 0)
- SUBS r5, r7, r5 @ r5 = shiftM = point - s->q_delp
- LDR r7, [r4,#40] @ r7 = s->q_seq
- RSBLT r5, r5, #0 @ if (shiftM<0) r5 =-shiftM
- MOVLT r12,r12,LSL r5 @ r12=mul<<-shiftM
- MOVLT r5, #0 @ r5 =shiftM = 0
- MOVGT r14,r14,LSL r5 @ add <<= shiftM
- CMP r7,#0 @ seqMask = (s->q_seq?-1:0)
- MVNNE r7,#0
- CMP r1, #2
- BEQ dm2
- BGT dm3
- CMP r1,#0 @ probably never happens
- BLE dm_duff
- dm1:
- @ r1 = s->dec_type
- @ r2 = s->q_bits
- @ r3 = s->dim
- @ r5 = shiftM
- @ r6 = v
- @ r7 = seqMask
- @ r8 = entry
- @ r12= mul
- @ r14= add
- MOV r0, #1
- RSB r0, r0, r0, LSL r2 @ r0 = mask = (1<<s->q_bits)-1
- MOV r11,#0 @ r11= prev = 0
- dm1_loop:
- AND r1, r8, r0 @ r1 = v = entry & mask
- MLA r1, r12, r1, r14 @ r1 = (add + mul*v)
- MOV r8, r8, LSR r2 @ r8 = entry>>s->q_bits
- SUBS r3, r3, #1
- ADD r1, r11,r1, ASR r5 @ r1 = v = prev+((add+mul*v)>>shiftM)
- AND r11,r1, r7 @ r11= prev = seqMask & v
- STR r1, [r6], #4 @ *v++ = v
- BGT dm1_loop
- MOV r0, #0
- LDMFD r13!,{r4-r11,PC}
- dm2:
- @ r1 = s->dec_type
- @ r2 = s->q_bits
- @ r3 = s->dim
- @ r4 = s
- @ r5 = shiftM
- @ r6 = v
- @ r7 = seqMask
- @ r8 = entry
- @ r12= mul
- @ r14= add
- LDR r1, [r4,#44] @ r1 = s->q_pack
- LDR r4, [r4,#48] @ r4 = s->q_val
- MOV r11,#0 @ r11= prev
- MOV r0, #1
- RSB r0, r0, r0, LSL r1 @ r8 = mask = (1<<s->q_pack)-1
- CMP r2,#8
- BGT dm2_hword
- dm2_loop:
- AND r2, r8, r0 @ r2 = entry & mask
- LDRB r2, [r4, r2] @ r2 = v = q->val[entry & mask]
- MOV r8, r8, LSR r1 @ r8 = entry>>q_pack
- MLA r2, r12,r2, r14 @ r2 = (add+mul*v)
- SUBS r3, r3, #1
- ADD r2, r11,r2, ASR r5 @ r2 = v = prev+(add+mul*v)>>shiftM
- AND r11,r2, r7 @ r11= prev = seqMask & v
- STR r2, [r6], #4 @ *v++ = v
- BGT dm2_loop
- MOV r0, #0
- LDMFD r13!,{r4-r11,PC}
- dm2_hword:
- AND r2, r8, r0 @ r2 = entry & mask
- MOV r2, r2, LSL #1 @ r2 = 2*r2
- LDRH r2, [r4, r2] @ r2 = v = q->val[entry & mask]
- MOV r8, r8, LSR r1 @ r8 = entry>>q_pack
- MLA r2, r12,r2, r14 @ r2 = (add+mul*v)
- SUBS r3, r3, #1
- ADD r2, r11,r2, ASR r5 @ r2 = v = prev+(add+mul*v)>>shiftM
- AND r11,r2, r7 @ r11= prev = seqMask & v
- STR r2, [r6], #4 @ *v++ = v
- BGT dm2_hword
- MOV r0, #0
- LDMFD r13!,{r4-r11,PC}
- dm3:
- @ r1 = s->dec_type
- @ r2 = s->q_bits
- @ r3 = s->dim
- @ r4 = s
- @ r5 = shiftM
- @ r6 = v
- @ r7 = seqMask
- @ r8 = entry
- @ r12= mul
- @ r14= add
- LDR r1, [r4,#44] @ r1 = s->q_pack
- LDR r4, [r4,#52] @ r4 = s->q_val
- CMP r2,#8
- MOV r11,#0 @ r11= prev
- MLA r4,r1,r8,r4 @ r4 = ptr = s->q_val+entry*s->q_pack
- BGT dm3_hword
- dm3_loop:
- LDRB r2, [r4], #1 @ r2 = v = *ptr++
- SUBS r3, r3, #1
- MLA r2, r12,r2, r14 @ r2 = (add+mul*v)
- ADD r2, r11,r2, ASR r5 @ r2 = v = prev+(add+mul*v)>>shiftM
- AND r11,r2, r7 @ r11= prev = seqMask & v
- STR r2, [r6], #4 @ *v++ = v
- BGT dm3_loop
- MOV r0, #0
- LDMFD r13!,{r4-r11,PC}
- dm3_hword:
- LDRH r2, [r4], #2 @ r2 = *ptr++
- SUBS r3, r3, #1
- MLA r2, r12,r2, r14 @ r2 = (add+mul*v)
- ADD r2, r11,r2, ASR r5 @ r2 = v = prev+(add+mul*v)>>shiftM
- AND r11,r2, r7 @ r11= prev = seqMask & v
- STR r2, [r6], #4 @ *v++ = v
- BGT dm3_hword
- MOV r0, #0
- LDMFD r13!,{r4-r11,PC}
- dm_duff:
- MVN r0,#0
- LDMFD r13!,{r4-r11,PC}
- vorbis_book_decodevv_add:
- @ r0 = codebook *book
- @ r1 = ogg_int32_t **a
- @ r2 = long offset
- @ r3 = int ch
- @ <> = b
- @ <> = n
- @ <> = point
- STMFD r13!,{r4-r11,R14}
- LDR r7, [r0, #13*4] @ r7 = used_entries
- MOV r9, r0 @ r9 = book
- MOV r10,r1 @ r10= 0xa[chptr] chptr=0
- MOV r6, r3 @ r6 = ch
- ADD r8, r10,r3, LSL #2 @ r8 = 0xa[ch]
- MOV r11,r2 @ r11= offset
- CMP r7, #0 @ if (used_entries <= 0)
- BLE vbdvva_exit @ exit
- LDR r5, [r13,#10*4] @ r5 = n
- vbdvva_loop1:
- @ r5 = n
- @ r6 = ch
- @ r8 = 0xa[ch]
- @ r9 = book
- @ r10= 0xa[chptr]
- @ r11= offset
- MOV r0, r9 @ r0 = book
- LDR r1, [r13,# 9*4] @ r1 = b
- LDR r2, [r9, #14*4] @ r2 = v = dec_buf
- LDR r3, [r13,#11*4] @ r3 = point
- BL decode_map
- CMP r0, #0
- BNE vbdvva_fail
- LDR r0, [r9, # 5*4] @ r0 = book->dim
- LDR r1, [r9, #14*4] @ r1 = v = dec_buf
- vbdvva_loop2:
- LDR r2, [r10],#4 @ r2 = a[chptr++]
- LDR r12,[r1], #4 @ r1 = v[j++]
- CMP r10,r8 @ if (chptr == ch)
- SUBEQ r10,r10,r6, LSL #2 @ chptr = 0
- LDR r14,[r2, r11,LSL #2]! @ r2 = 0xa[chptr++][i] r14=[r12]
- ADDEQ r11,r11,#1 @ i++
- SUBEQ r5, r5, #1 @ n--
- SUBS r0, r0, #1 @ r0--
- ADD r12,r12,r14 @ r12= a[chptr++][i]+ v[j]
- STR r12,[r2] @ r12= a[chptr++][i]+=v[j]
- BGT vbdvva_loop2
- CMP r5,#0
- BGT vbdvva_loop1
- vbdvva_exit:
- MOV r0, #0 @ return 0
- LDMFD r13!,{r4-r11,PC}
- vbdvva_fail:
- MVN r0, #0 @ return -1
- LDMFD r13!,{r4-r11,PC}
- _checksum:
- @ r0 = ogg_reference *or
- @ r1 = bytes
- STMFD r13!,{r5-r6,r14}
- ADR r6,.Lcrc_lookup
- LDR r5,[r6]
- ADD r5,r6
- MOV r14,#0 @ r14= crc_reg = 0
- MOVS r12,r0
- BEQ _cs_end
- _cs_loop1:
- LDMIA r12,{r0,r2,r3,r12} @ r0 = or->buffer
- @ r2 = or->begin
- @ r3 = or->length
- @ r12= or->next
- LDR r0,[r0] @ r0 = or->buffer->data
- CMP r1,r3 @ r3 = post = (bytes < or->length ?
- MOVLT r3,r1 @ bytes : or->length)
- MOVS r6,r3 @ r6 = j = post
- BEQ _cs_no_bytes
- ADD r0,r0,r2 @ r0 = or->buffer->data + or->begin
- _cs_loop2:
- LDRB r2, [r0],#1 @ r2 = data[j]
- @ stall
- @ stall Xscale
- EOR r2, r2, r14,LSR #24 @ r2 = (crc_reg>>24)^data[j]
- LDR r2, [r5, r2, LSL #2] @ r2 = crc_lkp[(crc_reg>>24)^data[j]]
- SUBS r6, r6, #1 @ j--
- @ stall Xscale
- EOR r14,r2, r14,LSL #8 @ r14= crc_reg = (crc_reg<<8)^r2
- BGT _cs_loop2
- _cs_no_bytes:
- SUBS r1, r1, r3
- CMPNE r12,#0
- BNE _cs_loop1
- _cs_end:
- MOV r0,r14
- LDMFD r13!,{r5-r6,PC}
- .Lcrc_lookup:
- .WORD crc_lookup-.Lcrc_lookup
- @ END
|