1233d2500723e5594f3e7c70896ffeeef32b9c950ywan;
2233d2500723e5594f3e7c70896ffeeef32b9c950ywan;  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3233d2500723e5594f3e7c70896ffeeef32b9c950ywan;
4233d2500723e5594f3e7c70896ffeeef32b9c950ywan;  Use of this source code is governed by a BSD-style license
5233d2500723e5594f3e7c70896ffeeef32b9c950ywan;  that can be found in the LICENSE file in the root of the source
6233d2500723e5594f3e7c70896ffeeef32b9c950ywan;  tree. An additional intellectual property rights grant can be found
7233d2500723e5594f3e7c70896ffeeef32b9c950ywan;  in the file PATENTS.  All contributing project authors may
8233d2500723e5594f3e7c70896ffeeef32b9c950ywan;  be found in the AUTHORS file in the root of the source tree.
9233d2500723e5594f3e7c70896ffeeef32b9c950ywan;
10233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12233d2500723e5594f3e7c70896ffeeef32b9c950ywan    EXPORT |vp8cx_pack_tokens_into_partitions_armv5|
13233d2500723e5594f3e7c70896ffeeef32b9c950ywan    IMPORT |vp8_validate_buffer_arm|
14233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15233d2500723e5594f3e7c70896ffeeef32b9c950ywan    INCLUDE vp8_asm_enc_offsets.asm
16233d2500723e5594f3e7c70896ffeeef32b9c950ywan
17233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ARM
18233d2500723e5594f3e7c70896ffeeef32b9c950ywan    REQUIRE8
19233d2500723e5594f3e7c70896ffeeef32b9c950ywan    PRESERVE8
20233d2500723e5594f3e7c70896ffeeef32b9c950ywan
21233d2500723e5594f3e7c70896ffeeef32b9c950ywan    AREA    |.text|, CODE, READONLY
22233d2500723e5594f3e7c70896ffeeef32b9c950ywan
23233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; macro for validating write buffer position
24233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; needs vp8_writer in r0
25233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; start shall not be in r1
26233d2500723e5594f3e7c70896ffeeef32b9c950ywan    MACRO
27233d2500723e5594f3e7c70896ffeeef32b9c950ywan    VALIDATE_POS $start, $pos
28233d2500723e5594f3e7c70896ffeeef32b9c950ywan    push {r0-r3, r12, lr}        ; rest of regs are preserved by subroutine call
29233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr  r2, [r0, #vp8_writer_buffer_end]
30233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr  r3, [r0, #vp8_writer_error]
31233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov  r1, $pos
32233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov  r0, $start
33233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bl   vp8_validate_buffer_arm
34233d2500723e5594f3e7c70896ffeeef32b9c950ywan    pop  {r0-r3, r12, lr}
35233d2500723e5594f3e7c70896ffeeef32b9c950ywan    MEND
36233d2500723e5594f3e7c70896ffeeef32b9c950ywan
37233d2500723e5594f3e7c70896ffeeef32b9c950ywan; r0 VP8_COMP *cpi
38233d2500723e5594f3e7c70896ffeeef32b9c950ywan; r1 unsigned char *cx_data
39233d2500723e5594f3e7c70896ffeeef32b9c950ywan; r2 const unsigned char *cx_data_end
40233d2500723e5594f3e7c70896ffeeef32b9c950ywan; r3 int num_part
41233d2500723e5594f3e7c70896ffeeef32b9c950ywan; s0 vp8_coef_encodings
42233d2500723e5594f3e7c70896ffeeef32b9c950ywan; s1 vp8_extra_bits,
43233d2500723e5594f3e7c70896ffeeef32b9c950ywan; s2 const vp8_tree_index *
44233d2500723e5594f3e7c70896ffeeef32b9c950ywan
45233d2500723e5594f3e7c70896ffeeef32b9c950ywan|vp8cx_pack_tokens_into_partitions_armv5| PROC
46233d2500723e5594f3e7c70896ffeeef32b9c950ywan    push    {r4-r12, lr}
47233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub     sp, sp, #40
48233d2500723e5594f3e7c70896ffeeef32b9c950ywan
49233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Compute address of cpi->common.mb_rows
50233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r4, _VP8_COMP_common_
51233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r6, _VP8_COMMON_MBrows_
52233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r4, r0, r4
53233d2500723e5594f3e7c70896ffeeef32b9c950ywan
54233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r5, [r4, r6]                ; load up mb_rows
55233d2500723e5594f3e7c70896ffeeef32b9c950ywan
56233d2500723e5594f3e7c70896ffeeef32b9c950ywan    str     r5, [sp, #36]               ; save mb_rows
57233d2500723e5594f3e7c70896ffeeef32b9c950ywan    str     r1, [sp, #24]               ; save ptr = cx_data
58233d2500723e5594f3e7c70896ffeeef32b9c950ywan    str     r3, [sp, #20]               ; save num_part
59233d2500723e5594f3e7c70896ffeeef32b9c950ywan    str     r2, [sp, #8]                ; save cx_data_end
60233d2500723e5594f3e7c70896ffeeef32b9c950ywan
61233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r4, _VP8_COMP_tplist_
62233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r4, r0, r4
63233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r7, [r4, #0]                ; dereference cpi->tp_list
64233d2500723e5594f3e7c70896ffeeef32b9c950ywan    str     r7, [sp, #32]               ; store start of cpi->tp_list
65233d2500723e5594f3e7c70896ffeeef32b9c950ywan
66233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r11, _VP8_COMP_bc_          ; load up vp8_writer out of cpi
67233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r0, r0, r11
68233d2500723e5594f3e7c70896ffeeef32b9c950ywan
69233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov     r11, #0
70233d2500723e5594f3e7c70896ffeeef32b9c950ywan    str     r11, [sp, #28]              ; i
71233d2500723e5594f3e7c70896ffeeef32b9c950ywan
72233d2500723e5594f3e7c70896ffeeef32b9c950ywannumparts_loop
73233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r2, _vp8_writer_sz_         ; load up sizeof(vp8_writer)
74233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r0, r2                      ; bc[i + 1]
75233d2500723e5594f3e7c70896ffeeef32b9c950ywan
76233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r10, [sp, #24]              ; ptr
77233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r5,  [sp, #36]              ; move mb_rows to the counting section
78233d2500723e5594f3e7c70896ffeeef32b9c950ywan    subs    r5, r5, r11                 ; move start point with each partition
79233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                        ; mb_rows starts at i
80233d2500723e5594f3e7c70896ffeeef32b9c950ywan    str     r5,  [sp, #12]
81233d2500723e5594f3e7c70896ffeeef32b9c950ywan
82233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Reset all of the VP8 Writer data for each partition that
83233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; is processed.
84233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; start_encode
85233d2500723e5594f3e7c70896ffeeef32b9c950ywan
86233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r3, [sp, #8]
87233d2500723e5594f3e7c70896ffeeef32b9c950ywan    str     r3, [r0, #vp8_writer_buffer_end]
88233d2500723e5594f3e7c70896ffeeef32b9c950ywan
89233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov     r2, #0                      ; vp8_writer_lowvalue
90233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov     r5, #255                    ; vp8_writer_range
91233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mvn     r3, #23                     ; vp8_writer_count
92233d2500723e5594f3e7c70896ffeeef32b9c950ywan
93233d2500723e5594f3e7c70896ffeeef32b9c950ywan    str     r2,  [r0, #vp8_writer_pos]
94233d2500723e5594f3e7c70896ffeeef32b9c950ywan    str     r10, [r0, #vp8_writer_buffer]
95233d2500723e5594f3e7c70896ffeeef32b9c950ywan
96233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ble     end_partition               ; if (mb_rows <= 0) end partition
97233d2500723e5594f3e7c70896ffeeef32b9c950ywan
98233d2500723e5594f3e7c70896ffeeef32b9c950ywanmb_row_loop
99233d2500723e5594f3e7c70896ffeeef32b9c950ywan
100233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r1, [r7, #tokenlist_start]
101233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r9, [r7, #tokenlist_stop]
102233d2500723e5594f3e7c70896ffeeef32b9c950ywan    str     r9, [sp, #0]                ; save stop for later comparison
103233d2500723e5594f3e7c70896ffeeef32b9c950ywan    str     r7, [sp, #16]               ; tokenlist address for next time
104233d2500723e5594f3e7c70896ffeeef32b9c950ywan
105233d2500723e5594f3e7c70896ffeeef32b9c950ywan    b       check_p_lt_stop
106233d2500723e5594f3e7c70896ffeeef32b9c950ywan
107233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; actual work gets done here!
108233d2500723e5594f3e7c70896ffeeef32b9c950ywan
109233d2500723e5594f3e7c70896ffeeef32b9c950ywanwhile_p_lt_stop
110233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb    r6, [r1, #tokenextra_token] ; t
111233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r4, [sp, #80]               ; vp8_coef_encodings
112233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov     lr, #0
113233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r4, r4, r6, lsl #3          ; a = vp8_coef_encodings + t
114233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r9, [r1, #tokenextra_context_tree]   ; pp
115233d2500723e5594f3e7c70896ffeeef32b9c950ywan
116233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb    r7, [r1, #tokenextra_skip_eob_node]
117233d2500723e5594f3e7c70896ffeeef32b9c950ywan
118233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r6, [r4, #vp8_token_value]  ; v
119233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r8, [r4, #vp8_token_len]    ; n
120233d2500723e5594f3e7c70896ffeeef32b9c950ywan
121233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; vp8 specific skip_eob_node
122233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cmp     r7, #0
123233d2500723e5594f3e7c70896ffeeef32b9c950ywan    movne   lr, #2                      ; i = 2
124233d2500723e5594f3e7c70896ffeeef32b9c950ywan    subne   r8, r8, #1                  ; --n
125233d2500723e5594f3e7c70896ffeeef32b9c950ywan
126233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rsb     r4, r8, #32                 ; 32-n
127233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r10, [sp, #88]              ; vp8_coef_tree
128233d2500723e5594f3e7c70896ffeeef32b9c950ywan
129233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; v is kept in r12 during the token pack loop
130233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lsl     r12, r6, r4                ; r12 = v << 32 - n
131233d2500723e5594f3e7c70896ffeeef32b9c950ywan
132233d2500723e5594f3e7c70896ffeeef32b9c950ywan; loop start
133233d2500723e5594f3e7c70896ffeeef32b9c950ywantoken_loop
134233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb    r4, [r9, lr, asr #1]        ; pp [i>>1]
135233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub     r7, r5, #1                  ; range-1
136233d2500723e5594f3e7c70896ffeeef32b9c950ywan
137233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Decisions are made based on the bit value shifted
138233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; off of v, so set a flag here based on this.
139233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; This value is refered to as "bb"
140233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lsls    r12, r12, #1                ; bb = v >> n
141233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mul     r6, r4, r7                  ; ((range-1) * pp[i>>1]))
142233d2500723e5594f3e7c70896ffeeef32b9c950ywan
143233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; bb can only be 0 or 1.  So only execute this statement
144233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; if bb == 1, otherwise it will act like i + 0
145233d2500723e5594f3e7c70896ffeeef32b9c950ywan    addcs   lr, lr, #1                  ; i + bb
146233d2500723e5594f3e7c70896ffeeef32b9c950ywan
147233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov     r7, #1
148233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrsb   lr, [r10, lr]               ; i = vp8_coef_tree[i+bb]
149233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r4, r7, r6, lsr #8          ; 1 + (((range-1) * pp[i>>1]) >> 8)
150233d2500723e5594f3e7c70896ffeeef32b9c950ywan
151233d2500723e5594f3e7c70896ffeeef32b9c950ywan    addcs   r2, r2, r4                  ; if  (bb) lowvalue += split
152233d2500723e5594f3e7c70896ffeeef32b9c950ywan    subcs   r4, r5, r4                  ; if  (bb) range = range-split
153233d2500723e5594f3e7c70896ffeeef32b9c950ywan
154233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Counting the leading zeros is used to normalize range.
155233d2500723e5594f3e7c70896ffeeef32b9c950ywan    clz     r6, r4
156233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub     r6, r6, #24                 ; shift
157233d2500723e5594f3e7c70896ffeeef32b9c950ywan
158233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Flag is set on the sum of count.  This flag is used later
159233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; to determine if count >= 0
160233d2500723e5594f3e7c70896ffeeef32b9c950ywan    adds    r3, r3, r6                  ; count += shift
161233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lsl     r5, r4, r6                  ; range <<= shift
162233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bmi     token_count_lt_zero         ; if(count >= 0)
163233d2500723e5594f3e7c70896ffeeef32b9c950ywan
164233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub     r6, r6, r3                  ; offset = shift - count
165233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub     r4, r6, #1                  ; offset-1
166233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lsls    r4, r2, r4                  ; if((lowvalue<<(offset-1)) & 0x80000000 )
167233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bpl     token_high_bit_not_set
168233d2500723e5594f3e7c70896ffeeef32b9c950ywan
169233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r4, [r0, #vp8_writer_pos]   ; x
170233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub     r4, r4, #1                  ; x = w->pos-1
171233d2500723e5594f3e7c70896ffeeef32b9c950ywan    b       token_zero_while_start
172233d2500723e5594f3e7c70896ffeeef32b9c950ywantoken_zero_while_loop
173233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov     r10, #0
174233d2500723e5594f3e7c70896ffeeef32b9c950ywan    strb    r10, [r7, r4]               ; w->buffer[x] =(unsigned char)0
175233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub     r4, r4, #1                  ; x--
176233d2500723e5594f3e7c70896ffeeef32b9c950ywantoken_zero_while_start
177233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cmp     r4, #0
178233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrge   r7, [r0, #vp8_writer_buffer]
179233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb    r11, [r7, r4]
180233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cmpge   r11, #0xff
181233d2500723e5594f3e7c70896ffeeef32b9c950ywan    beq     token_zero_while_loop
182233d2500723e5594f3e7c70896ffeeef32b9c950ywan
183233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r7, [r0, #vp8_writer_buffer]
184233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb    r10, [r7, r4]               ; w->buffer[x]
185233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r10, r10, #1
186233d2500723e5594f3e7c70896ffeeef32b9c950ywan    strb    r10, [r7, r4]               ; w->buffer[x] + 1
187233d2500723e5594f3e7c70896ffeeef32b9c950ywantoken_high_bit_not_set
188233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rsb     r4, r6, #24                 ; 24-offset
189233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r10, [r0, #vp8_writer_buffer]
190233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lsr     r7, r2, r4                  ; lowvalue >> (24-offset)
191233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r4, [r0, #vp8_writer_pos]   ; w->pos
192233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lsl     r2, r2, r6                  ; lowvalue <<= offset
193233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov     r6, r3                      ; shift = count
194233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r11, r4, #1                 ; w->pos++
195233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bic     r2, r2, #0xff000000         ; lowvalue &= 0xffffff
196233d2500723e5594f3e7c70896ffeeef32b9c950ywan    str     r11, [r0, #vp8_writer_pos]
197233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub     r3, r3, #8                  ; count -= 8
198233d2500723e5594f3e7c70896ffeeef32b9c950ywan
199233d2500723e5594f3e7c70896ffeeef32b9c950ywan    VALIDATE_POS r10, r11               ; validate_buffer at pos
200233d2500723e5594f3e7c70896ffeeef32b9c950ywan
201233d2500723e5594f3e7c70896ffeeef32b9c950ywan    strb    r7, [r10, r4]               ; w->buffer[w->pos++]
202233d2500723e5594f3e7c70896ffeeef32b9c950ywan
203233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; r10 is used earlier in the loop, but r10 is used as
204233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; temp variable here.  So after r10 is used, reload
205233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; vp8_coef_tree_dcd into r10
206233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r10, [sp, #88]              ; vp8_coef_tree
207233d2500723e5594f3e7c70896ffeeef32b9c950ywan
208233d2500723e5594f3e7c70896ffeeef32b9c950ywantoken_count_lt_zero
209233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lsl     r2, r2, r6                  ; lowvalue <<= shift
210233d2500723e5594f3e7c70896ffeeef32b9c950ywan
211233d2500723e5594f3e7c70896ffeeef32b9c950ywan    subs    r8, r8, #1                  ; --n
212233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bne     token_loop
213233d2500723e5594f3e7c70896ffeeef32b9c950ywan
214233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb    r6, [r1, #tokenextra_token] ; t
215233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r7, [sp, #84]                ; vp8_extra_bits
216233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Add t * sizeof (vp8_extra_bit_struct) to get the desired
217233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ;  element.  Here vp8_extra_bit_struct == 16
218233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r12, r7, r6, lsl #4         ; b = vp8_extra_bits + t
219233d2500723e5594f3e7c70896ffeeef32b9c950ywan
220233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r4, [r12, #vp8_extra_bit_struct_base_val]
221233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cmp     r4, #0
222233d2500723e5594f3e7c70896ffeeef32b9c950ywan    beq     skip_extra_bits
223233d2500723e5594f3e7c70896ffeeef32b9c950ywan
224233d2500723e5594f3e7c70896ffeeef32b9c950ywan;   if( b->base_val)
225233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r8, [r12, #vp8_extra_bit_struct_len] ; L
226233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrsh   lr, [r1, #tokenextra_extra] ; e = p->Extra
227233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cmp     r8, #0                      ; if( L)
228233d2500723e5594f3e7c70896ffeeef32b9c950ywan    beq     no_extra_bits
229233d2500723e5594f3e7c70896ffeeef32b9c950ywan
230233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r9, [r12, #vp8_extra_bit_struct_prob]
231233d2500723e5594f3e7c70896ffeeef32b9c950ywan    asr     r7, lr, #1                  ; v=e>>1
232233d2500723e5594f3e7c70896ffeeef32b9c950ywan
233233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r10, [r12, #vp8_extra_bit_struct_tree]
234233d2500723e5594f3e7c70896ffeeef32b9c950ywan    str     r10, [sp, #4]               ; b->tree
235233d2500723e5594f3e7c70896ffeeef32b9c950ywan
236233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rsb     r4, r8, #32
237233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lsl     r12, r7, r4
238233d2500723e5594f3e7c70896ffeeef32b9c950ywan
239233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov     lr, #0                      ; i = 0
240233d2500723e5594f3e7c70896ffeeef32b9c950ywan
241233d2500723e5594f3e7c70896ffeeef32b9c950ywanextra_bits_loop
242233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb    r4, [r9, lr, asr #1]        ; pp[i>>1]
243233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub     r7, r5, #1                  ; range-1
244233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lsls    r12, r12, #1                ; v >> n
245233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mul     r6, r4, r7                  ; (range-1) * pp[i>>1]
246233d2500723e5594f3e7c70896ffeeef32b9c950ywan    addcs   lr, lr, #1                  ; i + bb
247233d2500723e5594f3e7c70896ffeeef32b9c950ywan
248233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov     r7, #1
249233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrsb   lr, [r10, lr]               ; i = b->tree[i+bb]
250233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r4, r7, r6, lsr #8          ; split = 1 +  (((range-1) * pp[i>>1]) >> 8)
251233d2500723e5594f3e7c70896ffeeef32b9c950ywan
252233d2500723e5594f3e7c70896ffeeef32b9c950ywan    addcs   r2, r2, r4                  ; if  (bb) lowvalue += split
253233d2500723e5594f3e7c70896ffeeef32b9c950ywan    subcs   r4, r5, r4                  ; if  (bb) range = range-split
254233d2500723e5594f3e7c70896ffeeef32b9c950ywan
255233d2500723e5594f3e7c70896ffeeef32b9c950ywan    clz     r6, r4
256233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub     r6, r6, #24
257233d2500723e5594f3e7c70896ffeeef32b9c950ywan
258233d2500723e5594f3e7c70896ffeeef32b9c950ywan    adds    r3, r3, r6                  ; count += shift
259233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lsl     r5, r4, r6                  ; range <<= shift
260233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bmi     extra_count_lt_zero         ; if(count >= 0)
261233d2500723e5594f3e7c70896ffeeef32b9c950ywan
262233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub     r6, r6, r3                  ; offset= shift - count
263233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub     r4, r6, #1                  ; offset-1
264233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lsls    r4, r2, r4                  ; if((lowvalue<<(offset-1)) & 0x80000000 )
265233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bpl     extra_high_bit_not_set
266233d2500723e5594f3e7c70896ffeeef32b9c950ywan
267233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r4, [r0, #vp8_writer_pos]   ; x
268233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub     r4, r4, #1                  ; x = w->pos - 1
269233d2500723e5594f3e7c70896ffeeef32b9c950ywan    b       extra_zero_while_start
270233d2500723e5594f3e7c70896ffeeef32b9c950ywanextra_zero_while_loop
271233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov     r10, #0
272233d2500723e5594f3e7c70896ffeeef32b9c950ywan    strb    r10, [r7, r4]               ; w->buffer[x] =(unsigned char)0
273233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub     r4, r4, #1                  ; x--
274233d2500723e5594f3e7c70896ffeeef32b9c950ywanextra_zero_while_start
275233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cmp     r4, #0
276233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrge   r7, [r0, #vp8_writer_buffer]
277233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb    r11, [r7, r4]
278233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cmpge   r11, #0xff
279233d2500723e5594f3e7c70896ffeeef32b9c950ywan    beq     extra_zero_while_loop
280233d2500723e5594f3e7c70896ffeeef32b9c950ywan
281233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r7, [r0, #vp8_writer_buffer]
282233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb    r10, [r7, r4]
283233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r10, r10, #1
284233d2500723e5594f3e7c70896ffeeef32b9c950ywan    strb    r10, [r7, r4]
285233d2500723e5594f3e7c70896ffeeef32b9c950ywanextra_high_bit_not_set
286233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rsb     r4, r6, #24                 ; 24-offset
287233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r10, [r0, #vp8_writer_buffer]
288233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lsr     r7, r2, r4                  ; lowvalue >> (24-offset)
289233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r4, [r0, #vp8_writer_pos]
290233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lsl     r2, r2, r6                  ; lowvalue <<= offset
291233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov     r6, r3                      ; shift = count
292233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r11, r4, #1                 ; w->pos++
293233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bic     r2, r2, #0xff000000         ; lowvalue &= 0xffffff
294233d2500723e5594f3e7c70896ffeeef32b9c950ywan    str     r11, [r0, #vp8_writer_pos]
295233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub     r3, r3, #8                  ; count -= 8
296233d2500723e5594f3e7c70896ffeeef32b9c950ywan
297233d2500723e5594f3e7c70896ffeeef32b9c950ywan    VALIDATE_POS r10, r11               ; validate_buffer at pos
298233d2500723e5594f3e7c70896ffeeef32b9c950ywan
299233d2500723e5594f3e7c70896ffeeef32b9c950ywan    strb    r7, [r10, r4]               ; w->buffer[w->pos++]=(lowvalue >> (24-offset))
300233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r10, [sp, #4]               ; b->tree
301233d2500723e5594f3e7c70896ffeeef32b9c950ywanextra_count_lt_zero
302233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lsl     r2, r2, r6
303233d2500723e5594f3e7c70896ffeeef32b9c950ywan
304233d2500723e5594f3e7c70896ffeeef32b9c950ywan    subs    r8, r8, #1                  ; --n
305233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bne     extra_bits_loop             ; while (n)
306233d2500723e5594f3e7c70896ffeeef32b9c950ywan
307233d2500723e5594f3e7c70896ffeeef32b9c950ywanno_extra_bits
308233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     lr, [r1, #4]                ; e = p->Extra
309233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r4, r5, #1                  ; range + 1
310233d2500723e5594f3e7c70896ffeeef32b9c950ywan    tst     lr, #1
311233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lsr     r4, r4, #1                  ; split = (range + 1) >> 1
312233d2500723e5594f3e7c70896ffeeef32b9c950ywan    addne   r2, r2, r4                  ; lowvalue += split
313233d2500723e5594f3e7c70896ffeeef32b9c950ywan    subne   r4, r5, r4                  ; range = range-split
314233d2500723e5594f3e7c70896ffeeef32b9c950ywan    tst     r2, #0x80000000             ; lowvalue & 0x80000000
315233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lsl     r5, r4, #1                  ; range <<= 1
316233d2500723e5594f3e7c70896ffeeef32b9c950ywan    beq     end_high_bit_not_set
317233d2500723e5594f3e7c70896ffeeef32b9c950ywan
318233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r4, [r0, #vp8_writer_pos]
319233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov     r7, #0
320233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub     r4, r4, #1
321233d2500723e5594f3e7c70896ffeeef32b9c950ywan    b       end_zero_while_start
322233d2500723e5594f3e7c70896ffeeef32b9c950ywanend_zero_while_loop
323233d2500723e5594f3e7c70896ffeeef32b9c950ywan    strb    r7, [r6, r4]
324233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub     r4, r4, #1                  ; x--
325233d2500723e5594f3e7c70896ffeeef32b9c950ywanend_zero_while_start
326233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cmp     r4, #0
327233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrge   r6, [r0, #vp8_writer_buffer]
328233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb    r12, [r6, r4]
329233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cmpge   r12, #0xff
330233d2500723e5594f3e7c70896ffeeef32b9c950ywan    beq     end_zero_while_loop
331233d2500723e5594f3e7c70896ffeeef32b9c950ywan
332233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r6, [r0, #vp8_writer_buffer]
333233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb    r7, [r6, r4]
334233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r7, r7, #1
335233d2500723e5594f3e7c70896ffeeef32b9c950ywan    strb    r7, [r6, r4]
336233d2500723e5594f3e7c70896ffeeef32b9c950ywanend_high_bit_not_set
337233d2500723e5594f3e7c70896ffeeef32b9c950ywan    adds    r3, r3, #1                  ; ++count
338233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lsl     r2, r2, #1                  ; lowvalue  <<= 1
339233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bne     end_count_zero
340233d2500723e5594f3e7c70896ffeeef32b9c950ywan
341233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r4, [r0, #vp8_writer_pos]
342233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mvn     r3, #7                      ; count = -8
343233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r7, [r0, #vp8_writer_buffer]
344233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lsr     r6, r2, #24                 ; lowvalue >> 24
345233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r12, r4, #1                 ; w->pos++
346233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bic     r2, r2, #0xff000000         ; lowvalue &= 0xffffff
347233d2500723e5594f3e7c70896ffeeef32b9c950ywan    str     r12, [r0, #vp8_writer_pos]
348233d2500723e5594f3e7c70896ffeeef32b9c950ywan
349233d2500723e5594f3e7c70896ffeeef32b9c950ywan    VALIDATE_POS r7, r12                ; validate_buffer at pos
350233d2500723e5594f3e7c70896ffeeef32b9c950ywan
351233d2500723e5594f3e7c70896ffeeef32b9c950ywan    strb    r6, [r7, r4]
352233d2500723e5594f3e7c70896ffeeef32b9c950ywanend_count_zero
353233d2500723e5594f3e7c70896ffeeef32b9c950ywanskip_extra_bits
354233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r1, r1, #TOKENEXTRA_SZ      ; ++p
355233d2500723e5594f3e7c70896ffeeef32b9c950ywancheck_p_lt_stop
356233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r4, [sp, #0]                ; stop
357233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cmp     r1, r4                      ; while( p < stop)
358233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bcc     while_p_lt_stop
359233d2500723e5594f3e7c70896ffeeef32b9c950ywan
360233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r10, [sp, #20]              ; num_parts
361233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov     r1, #TOKENLIST_SZ
362233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mul     r1, r10, r1
363233d2500723e5594f3e7c70896ffeeef32b9c950ywan
364233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r6, [sp, #12]               ; mb_rows
365233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r7, [sp, #16]               ; tokenlist address
366233d2500723e5594f3e7c70896ffeeef32b9c950ywan    subs    r6, r6, r10
367233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r7, r7, r1                  ; next element in the array
368233d2500723e5594f3e7c70896ffeeef32b9c950ywan    str     r6, [sp, #12]
369233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bgt     mb_row_loop
370233d2500723e5594f3e7c70896ffeeef32b9c950ywan
371233d2500723e5594f3e7c70896ffeeef32b9c950ywanend_partition
372233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov     r12, #32
373233d2500723e5594f3e7c70896ffeeef32b9c950ywan
374233d2500723e5594f3e7c70896ffeeef32b9c950ywanstop_encode_loop
375233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub     r7, r5, #1                  ; range-1
376233d2500723e5594f3e7c70896ffeeef32b9c950ywan
377233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov     r4, r7, lsl #7              ; ((range-1) * 128)
378233d2500723e5594f3e7c70896ffeeef32b9c950ywan
379233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov     r7, #1
380233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r4, r7, r4, lsr #8          ; 1 + (((range-1) * 128) >> 8)
381233d2500723e5594f3e7c70896ffeeef32b9c950ywan
382233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Counting the leading zeros is used to normalize range.
383233d2500723e5594f3e7c70896ffeeef32b9c950ywan    clz     r6, r4
384233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub     r6, r6, #24                 ; shift
385233d2500723e5594f3e7c70896ffeeef32b9c950ywan
386233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; Flag is set on the sum of count.  This flag is used later
387233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ; to determine if count >= 0
388233d2500723e5594f3e7c70896ffeeef32b9c950ywan    adds    r3, r3, r6                  ; count += shift
389233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lsl     r5, r4, r6                  ; range <<= shift
390233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bmi     token_count_lt_zero_se      ; if(count >= 0)
391233d2500723e5594f3e7c70896ffeeef32b9c950ywan
392233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub     r6, r6, r3                  ; offset = shift - count
393233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub     r4, r6, #1                  ; offset-1
394233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lsls    r4, r2, r4                  ; if((lowvalue<<(offset-1)) & 0x80000000 )
395233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bpl     token_high_bit_not_set_se
396233d2500723e5594f3e7c70896ffeeef32b9c950ywan
397233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r4, [r0, #vp8_writer_pos]   ; x
398233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub     r4, r4, #1                  ; x = w->pos-1
399233d2500723e5594f3e7c70896ffeeef32b9c950ywan    b       token_zero_while_start_se
400233d2500723e5594f3e7c70896ffeeef32b9c950ywantoken_zero_while_loop_se
401233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov     r10, #0
402233d2500723e5594f3e7c70896ffeeef32b9c950ywan    strb    r10, [r7, r4]               ; w->buffer[x] =(unsigned char)0
403233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub     r4, r4, #1                  ; x--
404233d2500723e5594f3e7c70896ffeeef32b9c950ywantoken_zero_while_start_se
405233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cmp     r4, #0
406233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrge   r7, [r0, #vp8_writer_buffer]
407233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb    r11, [r7, r4]
408233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cmpge   r11, #0xff
409233d2500723e5594f3e7c70896ffeeef32b9c950ywan    beq     token_zero_while_loop_se
410233d2500723e5594f3e7c70896ffeeef32b9c950ywan
411233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r7, [r0, #vp8_writer_buffer]
412233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldrb    r10, [r7, r4]               ; w->buffer[x]
413233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r10, r10, #1
414233d2500723e5594f3e7c70896ffeeef32b9c950ywan    strb    r10, [r7, r4]               ; w->buffer[x] + 1
415233d2500723e5594f3e7c70896ffeeef32b9c950ywantoken_high_bit_not_set_se
416233d2500723e5594f3e7c70896ffeeef32b9c950ywan    rsb     r4, r6, #24                 ; 24-offset
417233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r10, [r0, #vp8_writer_buffer]
418233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lsr     r7, r2, r4                  ; lowvalue >> (24-offset)
419233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r4, [r0, #vp8_writer_pos]   ; w->pos
420233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lsl     r2, r2, r6                  ; lowvalue <<= offset
421233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov     r6, r3                      ; shift = count
422233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r11, r4, #1                 ; w->pos++
423233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bic     r2, r2, #0xff000000         ; lowvalue &= 0xffffff
424233d2500723e5594f3e7c70896ffeeef32b9c950ywan    str     r11, [r0, #vp8_writer_pos]
425233d2500723e5594f3e7c70896ffeeef32b9c950ywan    sub     r3, r3, #8                  ; count -= 8
426233d2500723e5594f3e7c70896ffeeef32b9c950ywan
427233d2500723e5594f3e7c70896ffeeef32b9c950ywan    VALIDATE_POS r10, r11               ; validate_buffer at pos
428233d2500723e5594f3e7c70896ffeeef32b9c950ywan
429233d2500723e5594f3e7c70896ffeeef32b9c950ywan    strb    r7, [r10, r4]               ; w->buffer[w->pos++]
430233d2500723e5594f3e7c70896ffeeef32b9c950ywan
431233d2500723e5594f3e7c70896ffeeef32b9c950ywantoken_count_lt_zero_se
432233d2500723e5594f3e7c70896ffeeef32b9c950ywan    lsl     r2, r2, r6                  ; lowvalue <<= shift
433233d2500723e5594f3e7c70896ffeeef32b9c950ywan
434233d2500723e5594f3e7c70896ffeeef32b9c950ywan    subs    r12, r12, #1
435233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bne     stop_encode_loop
436233d2500723e5594f3e7c70896ffeeef32b9c950ywan
437233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r4,  [r0, #vp8_writer_pos]  ; w->pos
438233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r12, [sp, #24]              ; ptr
439233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r12, r12, r4                ; ptr += w->pos
440233d2500723e5594f3e7c70896ffeeef32b9c950ywan    str     r12, [sp, #24]
441233d2500723e5594f3e7c70896ffeeef32b9c950ywan
442233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r11, [sp, #28]              ; i
443233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r10, [sp, #20]              ; num_parts
444233d2500723e5594f3e7c70896ffeeef32b9c950ywan
445233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r11, r11, #1                ; i++
446233d2500723e5594f3e7c70896ffeeef32b9c950ywan    str     r11, [sp, #28]
447233d2500723e5594f3e7c70896ffeeef32b9c950ywan
448233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ldr     r7, [sp, #32]               ; cpi->tp_list[i]
449233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mov     r1, #TOKENLIST_SZ
450233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     r7, r7, r1                  ; next element in cpi->tp_list
451233d2500723e5594f3e7c70896ffeeef32b9c950ywan    str     r7, [sp, #32]               ; cpi->tp_list[i+1]
452233d2500723e5594f3e7c70896ffeeef32b9c950ywan
453233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cmp     r10, r11
454233d2500723e5594f3e7c70896ffeeef32b9c950ywan    bgt     numparts_loop
455233d2500723e5594f3e7c70896ffeeef32b9c950ywan
456233d2500723e5594f3e7c70896ffeeef32b9c950ywan    add     sp, sp, #40
457233d2500723e5594f3e7c70896ffeeef32b9c950ywan    pop     {r4-r12, pc}
458233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ENDP
459233d2500723e5594f3e7c70896ffeeef32b9c950ywan
460233d2500723e5594f3e7c70896ffeeef32b9c950ywan_VP8_COMP_common_
461233d2500723e5594f3e7c70896ffeeef32b9c950ywan    DCD     vp8_comp_common
462233d2500723e5594f3e7c70896ffeeef32b9c950ywan_VP8_COMMON_MBrows_
463233d2500723e5594f3e7c70896ffeeef32b9c950ywan    DCD     vp8_common_mb_rows
464233d2500723e5594f3e7c70896ffeeef32b9c950ywan_VP8_COMP_tplist_
465233d2500723e5594f3e7c70896ffeeef32b9c950ywan    DCD     vp8_comp_tplist
466233d2500723e5594f3e7c70896ffeeef32b9c950ywan_VP8_COMP_bc_
467233d2500723e5594f3e7c70896ffeeef32b9c950ywan    DCD     vp8_comp_bc
468233d2500723e5594f3e7c70896ffeeef32b9c950ywan_vp8_writer_sz_
469233d2500723e5594f3e7c70896ffeeef32b9c950ywan    DCD     vp8_writer_sz
470233d2500723e5594f3e7c70896ffeeef32b9c950ywan
471233d2500723e5594f3e7c70896ffeeef32b9c950ywan    END
472