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