190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; 2f71323e297a928af368937089d3ed71239786f86Andreas Huber; Copyright (c) 2010 The WebM project authors. All Rights Reserved. 390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; 4f71323e297a928af368937089d3ed71239786f86Andreas Huber; Use of this source code is governed by a BSD-style license 5f71323e297a928af368937089d3ed71239786f86Andreas Huber; that can be found in the LICENSE file in the root of the source 6f71323e297a928af368937089d3ed71239786f86Andreas Huber; tree. An additional intellectual property rights grant can be found 7f71323e297a928af368937089d3ed71239786f86Andreas Huber; in the file PATENTS. All contributing project authors may 8f71323e297a928af368937089d3ed71239786f86Andreas Huber; be found in the AUTHORS file in the root of the source tree. 990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; 1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber EXPORT |vp8cx_pack_mb_row_tokens_armv5| 1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1479f15823c34ae1e423108295e416213200bb280fAndreas Huber INCLUDE asm_enc_offsets.asm 1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ARM 1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber REQUIRE8 1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber PRESERVE8 1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber AREA |.text|, CODE, READONLY 2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; r0 VP8_COMP *cpi 2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; r1 vp8_writer *w 2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; r2 vp8_coef_encodings 2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; r3 vp8_extra_bits 2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; s0 vp8_coef_tree 2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 28538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber|vp8cx_pack_mb_row_tokens_armv5| PROC 2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber push {r4-r11, lr} 3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber sub sp, sp, #24 3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ; Compute address of cpi->common.mb_rows 3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r4, _VP8_COMP_common_ 3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r6, _VP8_COMMON_MBrows_ 3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber add r4, r0, r4 3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r5, [r4, r6] ; load up mb_rows 3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber str r2, [sp, #20] ; save vp8_coef_encodings 4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber str r5, [sp, #12] ; save mb_rows 4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber str r3, [sp, #8] ; save vp8_extra_bits 4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r4, _VP8_COMP_tplist_ 4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber add r4, r0, r4 4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r7, [r4, #0] ; dereference cpi->tp_list 4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mov r0, r1 ; keep same as other loops 4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r2, [r0, #vp8_writer_lowvalue] 5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r5, [r0, #vp8_writer_range] 5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r3, [r0, #vp8_writer_count] 5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubermb_row_loop 5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r1, [r7, #tokenlist_start] 5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r9, [r7, #tokenlist_stop] 5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber str r9, [sp, #0] ; save stop for later comparison 5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber str r7, [sp, #16] ; tokenlist address for next time 5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber b check_p_lt_stop 6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ; actuall work gets done here! 6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberwhile_p_lt_stop 6579f15823c34ae1e423108295e416213200bb280fAndreas Huber ldrb r6, [r1, #tokenextra_token] ; t 6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r4, [sp, #20] ; vp8_coef_encodings 6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mov lr, #0 6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber add r4, r4, r6, lsl #3 ; a = vp8_coef_encodings + t 6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r9, [r1, #tokenextra_context_tree] ; pp 7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7179f15823c34ae1e423108295e416213200bb280fAndreas Huber ldrb r7, [r1, #tokenextra_skip_eob_node] 7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r6, [r4, #vp8_token_value] ; v 7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r8, [r4, #vp8_token_len] ; n 7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ; vp8 specific skip_eob_node 7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cmp r7, #0 7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber movne lr, #2 ; i = 2 7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber subne r8, r8, #1 ; --n 8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber rsb r4, r8, #32 ; 32-n 8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r10, [sp, #60] ; vp8_coef_tree 8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ; v is kept in r12 during the token pack loop 85538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber lsl r12, r6, r4 ; r12 = v << 32 - n 8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; loop start 8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertoken_loop 8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldrb r4, [r9, lr, asr #1] ; pp [i>>1] 9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber sub r7, r5, #1 ; range-1 9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ; Decisions are made based on the bit value shifted 9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ; off of v, so set a flag here based on this. 9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ; This value is refered to as "bb" 95538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber lsls r12, r12, #1 ; bb = v >> n 9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mul r4, r4, r7 ; ((range-1) * pp[i>>1])) 9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ; bb can only be 0 or 1. So only execute this statement 9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ; if bb == 1, otherwise it will act like i + 0 10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber addcs lr, lr, #1 ; i + bb 10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mov r7, #1 10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldrsb lr, [r10, lr] ; i = vp8_coef_tree[i+bb] 10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber add r4, r7, r4, lsr #8 ; 1 + (((range-1) * pp[i>>1]) >> 8) 10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber addcs r2, r2, r4 ; if (bb) lowvalue += split 10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber subcs r4, r5, r4 ; if (bb) range = range-split 10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ; Counting the leading zeros is used to normalize range. 11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber clz r6, r4 11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber sub r6, r6, #24 ; shift 11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ; Flag is set on the sum of count. This flag is used later 11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ; to determine if count >= 0 11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber adds r3, r3, r6 ; count += shift 11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber lsl r5, r4, r6 ; range <<= shift 11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber bmi token_count_lt_zero ; if(count >= 0) 11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber sub r6, r6, r3 ; offset = shift - count 12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber sub r4, r6, #1 ; offset-1 12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber lsls r4, r2, r4 ; if((lowvalue<<(offset-1)) & 0x80000000 ) 12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber bpl token_high_bit_not_set 12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r4, [r0, #vp8_writer_pos] ; x 12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber sub r4, r4, #1 ; x = w->pos-1 12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber b token_zero_while_start 12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertoken_zero_while_loop 12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mov r10, #0 12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber strb r10, [r7, r4] ; w->buffer[x] =(unsigned char)0 13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber sub r4, r4, #1 ; x-- 13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertoken_zero_while_start 13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cmp r4, #0 13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldrge r7, [r0, #vp8_writer_buffer] 13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldrb r11, [r7, r4] 13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cmpge r11, #0xff 13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber beq token_zero_while_loop 13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r7, [r0, #vp8_writer_buffer] 13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldrb r10, [r7, r4] ; w->buffer[x] 14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber add r10, r10, #1 14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber strb r10, [r7, r4] ; w->buffer[x] + 1 14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertoken_high_bit_not_set 14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber rsb r4, r6, #24 ; 24-offset 14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r10, [r0, #vp8_writer_buffer] 14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber lsr r7, r2, r4 ; lowvalue >> (24-offset) 14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r4, [r0, #vp8_writer_pos] ; w->pos 14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber lsl r2, r2, r6 ; lowvalue <<= offset 14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mov r6, r3 ; shift = count 14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber add r11, r4, #1 ; w->pos++ 15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber bic r2, r2, #0xff000000 ; lowvalue &= 0xffffff 15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber str r11, [r0, #vp8_writer_pos] 15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber sub r3, r3, #8 ; count -= 8 15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber strb r7, [r10, r4] ; w->buffer[w->pos++] 15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ; r10 is used earlier in the loop, but r10 is used as 15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ; temp variable here. So after r10 is used, reload 15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ; vp8_coef_tree_dcd into r10 15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r10, [sp, #60] ; vp8_coef_tree 15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertoken_count_lt_zero 16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber lsl r2, r2, r6 ; lowvalue <<= shift 16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber subs r8, r8, #1 ; --n 16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber bne token_loop 16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 16679f15823c34ae1e423108295e416213200bb280fAndreas Huber ldrb r6, [r1, #tokenextra_token] ; t 16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r7, [sp, #8] ; vp8_extra_bits 16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ; Add t * sizeof (vp8_extra_bit_struct) to get the desired 16979f15823c34ae1e423108295e416213200bb280fAndreas Huber ; element. Here vp8_extra_bit_struct == 16 17079f15823c34ae1e423108295e416213200bb280fAndreas Huber add r12, r7, r6, lsl #4 ; b = vp8_extra_bits + t 17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 17290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r4, [r12, #vp8_extra_bit_struct_base_val] 17390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cmp r4, #0 17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber beq skip_extra_bits 17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber; if( b->base_val) 17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r8, [r12, #vp8_extra_bit_struct_len] ; L 17879f15823c34ae1e423108295e416213200bb280fAndreas Huber ldrsh lr, [r1, #tokenextra_extra] ; e = p->Extra 17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cmp r8, #0 ; if( L) 18090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber beq no_extra_bits 18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r9, [r12, #vp8_extra_bit_struct_prob] 18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber asr r7, lr, #1 ; v=e>>1 18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 18590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r10, [r12, #vp8_extra_bit_struct_tree] 18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber str r10, [sp, #4] ; b->tree 18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber rsb r4, r8, #32 189538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber lsl r12, r7, r4 19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mov lr, #0 ; i = 0 19290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextra_bits_loop 19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldrb r4, [r9, lr, asr #1] ; pp[i>>1] 19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber sub r7, r5, #1 ; range-1 196538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber lsls r12, r12, #1 ; v >> n 19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mul r4, r4, r7 ; (range-1) * pp[i>>1] 19890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber addcs lr, lr, #1 ; i + bb 19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 20090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mov r7, #1 20190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldrsb lr, [r10, lr] ; i = b->tree[i+bb] 20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber add r4, r7, r4, lsr #8 ; split = 1 + (((range-1) * pp[i>>1]) >> 8) 20390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber addcs r2, r2, r4 ; if (bb) lowvalue += split 20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber subcs r4, r5, r4 ; if (bb) range = range-split 20690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber clz r6, r4 20890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber sub r6, r6, #24 20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber adds r3, r3, r6 ; count += shift 21190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber lsl r5, r4, r6 ; range <<= shift 21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber bmi extra_count_lt_zero ; if(count >= 0) 21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 21490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber sub r6, r6, r3 ; offset= shift - count 21590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber sub r4, r6, #1 ; offset-1 21690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber lsls r4, r2, r4 ; if((lowvalue<<(offset-1)) & 0x80000000 ) 21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber bpl extra_high_bit_not_set 21890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 21990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r4, [r0, #vp8_writer_pos] ; x 22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber sub r4, r4, #1 ; x = w->pos - 1 22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber b extra_zero_while_start 22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextra_zero_while_loop 22390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mov r10, #0 22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber strb r10, [r7, r4] ; w->buffer[x] =(unsigned char)0 22590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber sub r4, r4, #1 ; x-- 22690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextra_zero_while_start 22790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cmp r4, #0 22890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldrge r7, [r0, #vp8_writer_buffer] 22990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldrb r11, [r7, r4] 23090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cmpge r11, #0xff 23190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber beq extra_zero_while_loop 23290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 23390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r7, [r0, #vp8_writer_buffer] 23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldrb r10, [r7, r4] 23590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber add r10, r10, #1 23690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber strb r10, [r7, r4] 23790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextra_high_bit_not_set 23890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber rsb r4, r6, #24 ; 24-offset 23990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r10, [r0, #vp8_writer_buffer] 24090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber lsr r7, r2, r4 ; lowvalue >> (24-offset) 24190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r4, [r0, #vp8_writer_pos] 24290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber lsl r2, r2, r6 ; lowvalue <<= offset 24390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mov r6, r3 ; shift = count 24490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber add r11, r4, #1 ; w->pos++ 24590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber bic r2, r2, #0xff000000 ; lowvalue &= 0xffffff 24690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber str r11, [r0, #vp8_writer_pos] 24790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber sub r3, r3, #8 ; count -= 8 24890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber strb r7, [r10, r4] ; w->buffer[w->pos++]=(lowvalue >> (24-offset)) 24990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r10, [sp, #4] ; b->tree 25090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextra_count_lt_zero 25190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber lsl r2, r2, r6 25290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 25390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber subs r8, r8, #1 ; --n 25490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber bne extra_bits_loop ; while (n) 25590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 25690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberno_extra_bits 25790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr lr, [r1, #4] ; e = p->Extra 25890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber add r4, r5, #1 ; range + 1 25990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber tst lr, #1 26090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber lsr r4, r4, #1 ; split = (range + 1) >> 1 26190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber addne r2, r2, r4 ; lowvalue += split 26290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber subne r4, r5, r4 ; range = range-split 26390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber tst r2, #0x80000000 ; lowvalue & 0x80000000 26490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber lsl r5, r4, #1 ; range <<= 1 26590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber beq end_high_bit_not_set 26690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 26790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r4, [r0, #vp8_writer_pos] 26890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mov r7, #0 26990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber sub r4, r4, #1 27090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber b end_zero_while_start 27190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberend_zero_while_loop 27290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber strb r7, [r6, r4] 27390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber sub r4, r4, #1 ; x-- 27490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberend_zero_while_start 27590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cmp r4, #0 27690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldrge r6, [r0, #vp8_writer_buffer] 27790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldrb r12, [r6, r4] 27890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cmpge r12, #0xff 27990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber beq end_zero_while_loop 28090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 28190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r6, [r0, #vp8_writer_buffer] 28290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldrb r7, [r6, r4] 28390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber add r7, r7, #1 28490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber strb r7, [r6, r4] 28590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberend_high_bit_not_set 28690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber adds r3, r3, #1 ; ++count 28790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber lsl r2, r2, #1 ; lowvalue <<= 1 28890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber bne end_count_zero 28990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 29090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r4, [r0, #vp8_writer_pos] 29190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mvn r3, #7 29290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r7, [r0, #vp8_writer_buffer] 29390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber lsr r6, r2, #24 ; lowvalue >> 24 29490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber add r12, r4, #1 ; w->pos++ 29590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber bic r2, r2, #0xff000000 ; lowvalue &= 0xffffff 29690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber str r12, [r0, #0x10] 29790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber strb r6, [r7, r4] 29890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberend_count_zero 29990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberskip_extra_bits 30090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber add r1, r1, #TOKENEXTRA_SZ ; ++p 30190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubercheck_p_lt_stop 30290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r4, [sp, #0] ; stop 30390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber cmp r1, r4 ; while( p < stop) 30490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber bcc while_p_lt_stop 30590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 30690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r6, [sp, #12] ; mb_rows 30790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ldr r7, [sp, #16] ; tokenlist address 30890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber subs r6, r6, #1 30990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber add r7, r7, #TOKENLIST_SZ ; next element in the array 31090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber str r6, [sp, #12] 31190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber bne mb_row_loop 31290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 31390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber str r2, [r0, #vp8_writer_lowvalue] 31490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber str r5, [r0, #vp8_writer_range] 31590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber str r3, [r0, #vp8_writer_count] 31690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber add sp, sp, #24 31790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pop {r4-r11, pc} 31890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ENDP 31990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 32090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber_VP8_COMP_common_ 32190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber DCD vp8_comp_common 32290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber_VP8_COMMON_MBrows_ 32390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber DCD vp8_common_mb_rows 32490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber_VP8_COMP_tplist_ 32590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber DCD vp8_comp_tplist 32690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 32790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber END 328