17913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang@ Tremolo library
22da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@-----------------------------------------------------------------------
32da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@ Copyright (C) 2002-2009, Xiph.org Foundation
42da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@ Copyright (C) 2010, Robin Watts for Pinknoise Productions Ltd
52da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@ All rights reserved.
62da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang
72da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@ Redistribution and use in source and binary forms, with or without
82da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@ modification, are permitted provided that the following conditions
92da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@ are met:
102da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang
112da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@     * Redistributions of source code must retain the above copyright
122da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@ notice, this list of conditions and the following disclaimer.
132da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@     * Redistributions in binary form must reproduce the above
142da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@ copyright notice, this list of conditions and the following disclaimer
152da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@ in the documentation and/or other materials provided with the
162da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@ distribution.
172da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@     * Neither the names of the Xiph.org Foundation nor Pinknoise
182da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@ Productions Ltd nor the names of its contributors may be used to
192da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@ endorse or promote products derived from this software without
202da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@ specific prior written permission.
212da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@
222da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
232da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
242da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
252da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
262da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
272da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
282da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
292da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
302da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
312da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
322da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
332da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang@ ----------------------------------------------------------------------
347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang    .text
367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	.global	decode_packed_entry_number
387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	.global decode_packed_entry_number_REALSTART
397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	.global decode_map
407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	.global vorbis_book_decodevv_add
417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	.global _checksum
427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	.extern	oggpack_adv
447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	.extern	oggpack_look
457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	.extern	oggpack_eop
467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	.extern	crc_lookup
477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangdecode_packed_entry_number_REALSTART:
497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangdpen_nobits:
507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r0,r5		@ r0 = b
517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r1,#1		@ r1 = 1
527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BL	oggpack_adv	@ oggpack_adv(b,1)      /* Force eop */
537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangduff:
547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MVN	r0,#0		@ return -1
557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDMFD	r13!,{r4-r8,r10,PC}
567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangdpen_readfailed:
587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	SUBS	r4,r4,#1	@ r4 = --read
597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BEQ	dpen_nobits
607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r0,r5		@ r0 = b
617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r1,r4		@ r1 = read
627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ADR	r14,dpen_read_return
637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	B	oggpack_look
647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangdecode_packed_entry_number:
667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r0 = codebook       *book
677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r1 = oggpack_buffer *b
687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	STMFD	r13!,{r4-r8,r10,r14}
697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDMIA	r0,{r4,r6,r7}		@ r4 = read = book->max_length
717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang					@ r6 = book->dec_table
727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang					@ r7 = book->dec_method
737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r5,r1		@ r5 = b
747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r0,r5		@ r0 = b
767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r1,r4		@ r1 = read
777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BL	oggpack_look
787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangdpen_read_return:
797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	CMP	r0,#0
807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BLT	dpen_readfailed
817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r0 = lok
837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r4 = read
847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r5 = b
857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r6 = dec_table
867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r7 = dec_method
877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	CMP	r7, #3
897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BGT	meth4
907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BEQ	meth3
917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	CMP	r7, #1
927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BGT	meth2
937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BEQ	meth1
947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangmeth0:
957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	RSB	r1, r4, #0		@ r1 = i-read = 0-read
967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r7, #0			@ r7 = chase
977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangm0_loop:
987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOVS	r0, r0, LSR #1		@ r0 = lok>>1   C = bottom bit
997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ADC	r2, r6, r7, LSL #1	@ r8 = &t[chase*2+C]
1007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDRB	r7, [r2]
1017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ADDS	r1, r1, #1		@ r1 = i-read++ (i-read<0 => i<read)
1027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ stall Xscale
1037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	CMPLT	r7, #0x80
1047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BLT	m0_loop
1057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	AND	r7, r7, #0x7F		@ r7 = chase
1067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	CMP	r1, #0			@ if (i-read >= 0) === (i >= read)
1077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MVNGT	r7, #0			@ if (i >= read) value to return = -1
1087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ADD	r1, r1, r4		@ r1 = i-read+read+1 = i +1
1097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r0, r5			@ r0 = b
1107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BL	oggpack_adv		@ oggpack_adv(b, i+1);
1117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r0, r7			@ return chase
1127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDMFD	r13!,{r4-r8,r10,PC}
1137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
1147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangmeth1:
1157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r0 = lok
1167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r4 = read
1177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r5 = b
1187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r6 = dec_table
1197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	RSB	r1, r4, #0		@ r1 = i = -read
1207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r10,#0			@ r10= next = 0
1217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangm1_loop:
1227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r7, r10			@ r7 = chase=next
1237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOVS	r0, r0, LSR #1		@ r0 = lok>>1     C = bottom bit
1247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ADC	r8, r6, r7		@ r8 = t+chase+bit
1257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDRB	r10,[r8], -r6		@ r10= next=t[chase+bit] r8=chase+bit
1267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ADDS	r1, r1, #1		@ r1 = i++
1277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ stall Xscale
1287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	CMPLT	r10,#0x80		@ if (next & 0x80) == 0
1297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BLT	m1_loop
1307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
1317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ADD	r1, r1, r4		@ r1 = i+read
1327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r0, r5			@ r0 = b
1337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BL	oggpack_adv		@ oggpack_adv(b, i)
1347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
1357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	CMP	r10,#0x80
1367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BLT	duff
1377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
1387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	CMP	r8, r7			@ if bit==0 (chase+bit==chase) (sets C)
1397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDRNEB	r14,[r6, r7]		@ r14= t[chase]
1407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOVEQ	r14,#128
1417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ADC	r12,r8, r6		@ r12= chase+bit+1+t
1427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDRB	r14,[r12,r14,LSR #7]	@ r14= t[chase+bit+1+(!bit || t[chase]0x0x80)]
1437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BIC	r10,r10,#0x80		@ r3 = next &= ~0x80
1447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ stall Xscale
1457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ORR	r0, r14,r10,LSL #8	@ r7 = chase = (next<<8) | r14
1467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
1477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDMFD	r13!,{r4-r8,r10,PC}
1487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
1497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
1507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangmeth2:
1517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	RSB	r1, r4, #0		@ r1 = i-read = 0-read
1527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r7, #0			@ r7 = chase
1537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r6, r6, LSR #1
1547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangm2_loop:
1557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOVS	r0, r0, LSR #1		@ r0 = lok>>1   C = bottom bit
1567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ADC	r2, r6, r7, LSL #1	@ r8 = &t[chase*2+C]
1577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDRH	r7, [r2, r2]
1587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ADDS	r1, r1, #1		@ r1 = i-read++ (i-read<0 => i<read)
1597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ stall Xscale
1607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	CMPLT	r7, #0x8000
1617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BLT	m2_loop
1627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BIC	r7, r7, #0x8000		@ r7 = chase
1637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	CMP	r1, #0			@ if (i-read >= 0) === (i >= read)
1647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MVNGT	r7, #0			@ if (i >= read) value to return = -1
1657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ADD	r1, r1, r4		@ r1 = i-read+read+1 = i +1
1667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r0, r5			@ r0 = b
1677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BL	oggpack_adv		@ oggpack_adv(b, i+1);
1687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r0, r7			@ return chase
1697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDMFD	r13!,{r4-r8,r10,PC}
1707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
1717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangmeth3:
1727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r0 = lok
1737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r4 = read
1747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r5 = b
1757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r6 = dec_table
1767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	RSB	r1, r4, #0		@ r1 = i = -read
1777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r10,#0			@ r10= next = 0
1787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangm3_loop:
1797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r7, r10			@ r7 = chase=next
1807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOVS	r0, r0, LSR #1		@ r0 = lok>>1     C = bottom bit
1817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ADC	r8, r7, #0		@ r8 = chase+bit
1827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r8, r8, LSL #1		@ r8 = (chase+bit)<<1
1837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDRH	r10,[r6, r8]		@ r10= next=t[chase+bit]
1847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ADDS	r1, r1, #1		@ r1 = i++
1857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ stall Xscale
1867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	CMPLT	r10,#0x8000		@ if (next & 0x8000) == 0
1877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BLT	m3_loop
1887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
1897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ADD	r1, r1, r4		@ r1 = i+read
1907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r0, r5			@ r0 = b
1917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BL	oggpack_adv		@ oggpack_adv(b, i)
1927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
1937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	CMP	r10,#0x8000
1947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BLT	duff
1957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
1967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r7, r7, LSL #1
1977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	CMP	r8, r7			@ if bit==0 (chase+bit==chase) sets C
1987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDRNEH	r14,[r6, r7]		@ r14= t[chase]
1997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOVEQ	r14,#0x8000
2007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ADC	r12,r8, r14,LSR #15	@ r12= 1+((chase+bit)<<1)+(!bit || t[chase]0x0x8000)
2017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ADC	r12,r12,r14,LSR #15	@ r12= t + (1+chase+bit+(!bit || t[chase]0x0x8000))<<1
2027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDRH	r14,[r6, r12]		@ r14= t[chase+bit+1
2037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BIC	r10,r10,#0x8000		@ r3 = next &= ~0x8000
2047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ stall Xscale
2057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ORR	r0, r14,r10,LSL #16	@ r7 = chase = (next<<16) | r14
2067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
2077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDMFD	r13!,{r4-r8,r10,PC}
2087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
2097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangmeth4:
2107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	RSB	r1, r4, #0		@ r1 = i-read = 0-read
2117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r7, #0			@ r7 = chase
2127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangm4_loop:
2137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOVS	r0, r0, LSR #1		@ r0 = lok>>1   C = bottom bit
2147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ADC	r2, r7, r7		@ r8 = chase*2+C
2157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDR	r7, [r6, r2, LSL #2]
2167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ADDS	r1, r1, #1		@ r1 = i-read++ (i-read<0 => i<read)
2177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ stall Xscale
2187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	CMPLT	r7, #0x80000000
2197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BLT	m4_loop
2207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BIC	r7, r7, #0x80000000	@ r7 = chase
2217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	CMP	r1, #0			@ if (i-read >= 0) === (i >= read)
2227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MVNGT	r7, #0			@ if (i >= read) value to return = -1
2237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ADD	r1, r1, r4		@ r1 = i-read+read+1 = i +1
2247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r0, r5			@ r0 = b
2257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BL	oggpack_adv		@ oggpack_adv(b, i+1);
2267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r0, r7			@ return chase
2277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDMFD	r13!,{r4-r8,r10,PC}
2287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
2297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangdecode_map:
2307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r0 = codebook *s
2317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r1 = oggpack_buffer *b
2327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r2 = int v
2337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r3 = int point
2347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	STMFD	r13!,{r4-r11,r14}
2357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
2367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r4, r0		@ r4 = s
2377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r5, r1		@ r5 = b
2387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r6, r2		@ r6 = v
2397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r7, r3		@ r7 = point
2407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BL	decode_packed_entry_number
2417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r8, r0
2427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
2437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r0, r5
2447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BL	oggpack_eop
2457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	CMP	r0, #0
2467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BNE	dm_duff
2477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
2487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r4 = s
2497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r5 = b
2507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r6 = v
2517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r7 = point
2527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r8 = entry
2537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
2547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDR	r1, [r4,#12]	@ r1 = s->dec_type
2557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDR	r2, [r4,#16]	@ r2 = s->q_bits
2567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDR	r3, [r4,#20]	@ r3 = s->dim
2577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDR	r5, [r4,#24]	@ r5 = s->q_delp
2587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDR	r11,[r4,#28]	@ r11= s->q_minp
2597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDR	r12,[r4,#32]	@ r12= s->q_del = mul
2607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDR	r14,[r4,#36]	@ r14= s->q_min
2617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	SUBS	r11,r7, r11	@ r11= add    = point - s->q_minp
2627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
2637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOVGT	r14,r14,ASR r11	@ r14= add = s->q_min >> add  (if add >0)
2647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	RSBLT	r11,r11,#0
2657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOVLT	r14,r14,LSL r11	@ r14= add = s->q_min << -add (if add < 0)
2667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
2677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	SUBS	r5, r7, r5	@ r5 = shiftM = point - s->q_delp
2687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDR	r7, [r4,#40]	@ r7 = s->q_seq
2697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	RSBLT	r5, r5, #0	@ if (shiftM<0)  r5 =-shiftM
2707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOVLT	r12,r12,LSL r5	@                r12=mul<<-shiftM
2717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOVLT	r5, #0		@                r5 =shiftM = 0
2727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOVGT	r14,r14,LSL r5	@ add <<= shiftM
2737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
2747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	CMP	r7,#0		@ seqMask = (s->q_seq?-1:0)
2757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MVNNE	r7,#0
2767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
2777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	CMP	r1, #2
2787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BEQ	dm2
2797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BGT	dm3
2807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	CMP	r1,#0		@ probably never happens
2817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BLE	dm_duff
2827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangdm1:
2837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r1 = s->dec_type
2847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r2 = s->q_bits
2857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r3 = s->dim
2867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r5 = shiftM
2877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r6 = v
2887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r7 = seqMask
2897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r8 = entry
2907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r12= mul
2917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r14= add
2927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r0, #1
2937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	RSB	r0, r0, r0, LSL r2	@ r0 = mask = (1<<s->q_bits)-1
2947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r11,#0			@ r11= prev = 0
2957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangdm1_loop:
2967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	AND	r1, r8, r0		@ r1 = v = entry & mask
2977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MLA	r1, r12, r1, r14	@ r1 = (add + mul*v)
2987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r8, r8, LSR r2		@ r8 = entry>>s->q_bits
2997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	SUBS	r3, r3, #1
3007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ADD	r1, r11,r1, ASR r5	@ r1 = v = prev+((add+mul*v)>>shiftM)
3017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	AND	r11,r1, r7		@ r11= prev = seqMask & v
3027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	STR	r1, [r6], #4		@ *v++ = v
3037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BGT	dm1_loop
3047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r0, #0
3067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDMFD	r13!,{r4-r11,PC}
3077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangdm2:
3087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r1 = s->dec_type
3097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r2 = s->q_bits
3107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r3 = s->dim
3117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r4 = s
3127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r5 = shiftM
3137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r6 = v
3147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r7 = seqMask
3157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r8 = entry
3167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r12= mul
3177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r14= add
3187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDR	r1, [r4,#44]		@ r1 = s->q_pack
3197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDR	r4, [r4,#48]		@ r4 = s->q_val
3207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r11,#0			@ r11= prev
3217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r0, #1
3227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	RSB	r0, r0, r0, LSL r1	@ r8 = mask = (1<<s->q_pack)-1
3237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	CMP	r2,#8
3247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BGT	dm2_hword
3257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangdm2_loop:
3267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	AND	r2, r8, r0		@ r2 = entry & mask
3277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDRB	r2, [r4, r2]		@ r2 = v = q->val[entry & mask]
3287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r8, r8, LSR r1		@ r8 = entry>>q_pack
3297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MLA	r2, r12,r2, r14		@ r2 = (add+mul*v)
3307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	SUBS	r3, r3, #1
3317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ADD	r2, r11,r2, ASR r5	@ r2 = v = prev+(add+mul*v)>>shiftM
3327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	AND	r11,r2, r7		@ r11= prev = seqMask & v
3337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	STR	r2, [r6], #4		@ *v++ = v
3347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BGT	dm2_loop
3357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r0, #0
3367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDMFD	r13!,{r4-r11,PC}
3377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangdm2_hword:
3397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	AND	r2, r8, r0		@ r2 = entry & mask
3407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r2, r2, LSL #1		@ r2 = 2*r2
3417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDRH	r2, [r4, r2]		@ r2 = v = q->val[entry & mask]
3427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r8, r8, LSR r1		@ r8 = entry>>q_pack
3437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MLA	r2, r12,r2, r14		@ r2 = (add+mul*v)
3447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	SUBS	r3, r3, #1
3457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ADD	r2, r11,r2, ASR r5	@ r2 = v = prev+(add+mul*v)>>shiftM
3467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	AND	r11,r2, r7		@ r11= prev = seqMask & v
3477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	STR	r2, [r6], #4		@ *v++ = v
3487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BGT	dm2_hword
3497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r0, #0
3507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDMFD	r13!,{r4-r11,PC}
3517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangdm3:
3537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r1 = s->dec_type
3547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r2 = s->q_bits
3557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r3 = s->dim
3567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r4 = s
3577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r5 = shiftM
3587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r6 = v
3597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r7 = seqMask
3607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r8 = entry
3617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r12= mul
3627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r14= add
3637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDR	r1, [r4,#44]		@ r1 = s->q_pack
3647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDR	r4, [r4,#52]		@ r4 = s->q_val
3657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	CMP	r2,#8
3667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r11,#0			@ r11= prev
3677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MLA	r4,r1,r8,r4		@ r4 = ptr = s->q_val+entry*s->q_pack
3687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BGT	dm3_hword
3707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangdm3_loop:
3717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDRB	r2, [r4], #1		@ r2 = v = *ptr++
3727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	SUBS	r3, r3, #1
3737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MLA	r2, r12,r2, r14		@ r2 = (add+mul*v)
3747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ADD	r2, r11,r2, ASR r5	@ r2 = v = prev+(add+mul*v)>>shiftM
3757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	AND	r11,r2, r7		@ r11= prev = seqMask & v
3767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	STR	r2, [r6], #4		@ *v++ = v
3777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BGT	dm3_loop
3787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r0, #0
3797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDMFD	r13!,{r4-r11,PC}
3807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangdm3_hword:
3827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDRH	r2, [r4], #2		@ r2 = *ptr++
3837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	SUBS	r3, r3, #1
3847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MLA	r2, r12,r2, r14		@ r2 = (add+mul*v)
3857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ADD	r2, r11,r2, ASR r5	@ r2 = v = prev+(add+mul*v)>>shiftM
3867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	AND	r11,r2, r7		@ r11= prev = seqMask & v
3877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	STR	r2, [r6], #4		@ *v++ = v
3887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BGT	dm3_hword
3897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r0, #0
3907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDMFD	r13!,{r4-r11,PC}
3917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangdm_duff:
3937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MVN	r0,#0
3947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDMFD	r13!,{r4-r11,PC}
3957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
3967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvorbis_book_decodevv_add:
3977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r0 = codebook     *book
3987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r1 = ogg_int32_t **a
3997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r2 = long          offset
4007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r3 = int           ch
4017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ <> = b
4027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ <> = n
4037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ <> = point
4047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	STMFD	r13!,{r4-r11,R14}
4057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDR	r7, [r0, #13*4]		@ r7 = used_entries
4067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r9, r0			@ r9 = book
4077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r10,r1			@ r10= 0xa[chptr]      chptr=0
4087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r6, r3			@ r6 = ch
4097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ADD	r8, r10,r3, LSL #2	@ r8 = 0xa[ch]
4107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r11,r2			@ r11= offset
4117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	CMP	r7, #0			@ if (used_entries <= 0)
4127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BLE	vbdvva_exit		@     exit
4137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDR	r5, [r13,#10*4]		@ r5 = n
4147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvbdvva_loop1:
4157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r5 = n
4167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r6 = ch
4177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r8 = 0xa[ch]
4187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r9 = book
4197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r10= 0xa[chptr]
4207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r11= offset
4217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r0, r9			@ r0 = book
4227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDR	r1, [r13,# 9*4]		@ r1 = b
4237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDR	r2, [r9, #14*4]		@ r2 = v = dec_buf
4247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDR	r3, [r13,#11*4]		@ r3 = point
4257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BL	decode_map
4267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	CMP	r0, #0
4277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BNE	vbdvva_fail
4287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
4297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDR	r0, [r9, # 5*4]		@ r0 = book->dim
4307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDR	r1, [r9, #14*4]		@ r1 = v = dec_buf
4317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvbdvva_loop2:
4327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDR	r2, [r10],#4		@ r2 = a[chptr++]
4337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDR	r12,[r1], #4		@ r1 = v[j++]
4347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	CMP	r10,r8			@ if (chptr == ch)
4357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	SUBEQ	r10,r10,r6, LSL #2	@    chptr = 0
4367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDR	r14,[r2, r11,LSL #2]!	@ r2 = 0xa[chptr++][i] r14=[r12]
4377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ADDEQ	r11,r11,#1		@    i++
4387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	SUBEQ	r5, r5, #1		@    n--
4397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	SUBS	r0, r0, #1		@ r0--
4407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ADD	r12,r12,r14		@ r12= a[chptr++][i]+ v[j]
4417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	STR	r12,[r2]		@ r12= a[chptr++][i]+=v[j]
4427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BGT	vbdvva_loop2
4437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	CMP	r5,#0
4447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BGT	vbdvva_loop1
4457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvbdvva_exit:
4467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r0, #0			@ return 0
4477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDMFD	r13!,{r4-r11,PC}
4487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvbdvva_fail:
4497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MVN	r0, #0			@ return -1
4507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDMFD	r13!,{r4-r11,PC}
4517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
4527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang_checksum:
4537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r0 = ogg_reference *or
4547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ r1 = bytes
4557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	STMFD	r13!,{r5-r6,r14}
4567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
457e96d449a28f9679ca1ac22e21bd1cf1d68d2cb4fArd Biesheuvel	ADR	r6,.Lcrc_lookup
458e96d449a28f9679ca1ac22e21bd1cf1d68d2cb4fArd Biesheuvel	LDR	r5,[r6]
459e96d449a28f9679ca1ac22e21bd1cf1d68d2cb4fArd Biesheuvel	ADD	r5,r6
4607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r14,#0			@ r14= crc_reg = 0
4617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOVS	r12,r0
4627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BEQ	_cs_end
4637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang_cs_loop1:
4647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDMIA	r12,{r0,r2,r3,r12}	@ r0 = or->buffer
4657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang					@ r2 = or->begin
4667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang					@ r3 = or->length
4677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang					@ r12= or->next
4687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDR	r0,[r0]			@ r0 = or->buffer->data
4697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	CMP	r1,r3			@ r3 = post = (bytes < or->length ?
4707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOVLT	r3,r1			@              bytes : or->length)
4717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOVS	r6,r3			@ r6 = j = post
4727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BEQ	_cs_no_bytes
4737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	ADD	r0,r0,r2		@ r0 = or->buffer->data + or->begin
4747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang_cs_loop2:
4757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDRB	r2, [r0],#1		@ r2 = data[j]
4767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ stall
4777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ stall Xscale
4787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	EOR	r2, r2, r14,LSR #24	@ r2 = (crc_reg>>24)^data[j]
4797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDR	r2, [r5, r2, LSL #2]	@ r2 = crc_lkp[(crc_reg>>24)^data[j]]
4807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	SUBS	r6, r6, #1		@ j--
4817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ stall Xscale
4827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	EOR	r14,r2, r14,LSL #8	@ r14= crc_reg = (crc_reg<<8)^r2
4837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BGT	_cs_loop2
4847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang_cs_no_bytes:
4857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	SUBS	r1, r1, r3
4867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	CMPNE	r12,#0
4877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	BNE	_cs_loop1
4887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang_cs_end:
4897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	MOV	r0,r14
4907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	LDMFD	r13!,{r5-r6,PC}
4917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang
492e96d449a28f9679ca1ac22e21bd1cf1d68d2cb4fArd Biesheuvel.Lcrc_lookup:
493e96d449a28f9679ca1ac22e21bd1cf1d68d2cb4fArd Biesheuvel        .WORD   crc_lookup-.Lcrc_lookup
494e96d449a28f9679ca1ac22e21bd1cf1d68d2cb4fArd Biesheuvel
4957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang	@ END
496