| ; |
| ; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. |
| ; |
| ; Use of this source code is governed by a BSD-style license and patent |
| ; grant that can be found in the LICENSE file in the root of the source |
| ; tree. All contributing project authors may be found in the AUTHORS |
| ; file in the root of the source tree. |
| ; |
| |
| |
| EXPORT |vp8_decode_value_v6| |
| EXPORT |vp8dx_start_decode_v6| |
| EXPORT |vp8dx_stop_decode_v6| |
| EXPORT |vp8dx_decode_bool_v6| |
| |
| ARM |
| REQUIRE8 |
| PRESERVE8 |
| |
| INCLUDE vpx_asm_offsets.asm |
| |
| br RN r0 |
| prob RN r1 |
| bits RN r1 |
| AREA |.text|, CODE, READONLY ; name this block of code |
| |
| ; int z = 0; |
| ; int bit; |
| ; for ( bit=bits-1; bit>=0; bit-- ) |
| ; { |
| ; z |= (vp8dx_decode_bool(br, 0x80)<<bit); |
| ; } |
| ; return z; |
| |
| ;int vp8_decode_value_v6 ( BOOL_DECODER *br, int bits ) |
| |vp8_decode_value_v6| PROC |
| stmdb sp!, {r4 - r6, lr} |
| mov r4, br |
| mov r5, bits |
| mov r6, #0 |
| |
| subs r5, r5, #1 |
| bmi decode_value_exit |
| |
| decode_value_loop |
| mov prob, #0x80 |
| mov br, r4 |
| bl vp8dx_decode_bool_v6_internal ; needed for conversion to s file |
| orr r6, r6, r0, lsl r5 |
| subs r5, r5, #1 |
| bpl decode_value_loop |
| |
| decode_value_exit |
| mov r0, r6 |
| ldmia sp!, {r4 - r6, pc} |
| ENDP ; |vp8_decode_value_v6| |
| |
| |
| ;void vp8dx_start_decode_v6 ( BOOL_DECODER *br, unsigned char *source ) |
| |vp8dx_start_decode_v6| PROC |
| stmdb sp!, {r4 - r5, lr} |
| mov r2, #0 |
| mov r3, #255 |
| |
| str r2, [br, #bool_decoder_lowvalue] |
| str r3, [br, #bool_decoder_range] |
| str r1, [br, #bool_decoder_buffer] |
| |
| mov r3, #8 |
| mov r2, #4 |
| str r3, [br, #bool_decoder_count] |
| str r2, [br, #bool_decoder_pos] |
| |
| ldrb r2, [r1, #3] |
| ldrb r3, [r1, #2] |
| ldrb r4, [r1, #1] |
| ldrb r5, [r1] |
| |
| orr r1, r2, r3, lsl #8 |
| orr r1, r1, r4, lsl #16 |
| orr r1, r1, r5, lsl #24 |
| |
| str r1, [br, #bool_decoder_value] |
| |
| ldmia sp!, {r4 - r5, pc} |
| ENDP ; |vp8dx_start_decode_v6| |
| |
| |
| ;void vp8dx_stop_decode_v6 ( BOOL_DECODER *bc ); |
| |vp8dx_stop_decode_v6| PROC |
| mov pc, lr |
| ENDP ; |vp8dx_stop_decode_v6| |
| |
| |
| ; bigsplit RN r1 |
| ; buffer_v RN r1 |
| ; count_v RN r4 |
| ; range_v RN r2 |
| ; value_v RN r3 |
| ; pos_v RN r5 |
| ; split RN r6 |
| ; bit RN lr |
| ;int vp8dx_decode_bool_v6 ( BOOL_DECODER *br, int probability ) |
| |vp8dx_decode_bool_v6| PROC |
| vp8dx_decode_bool_v6_internal |
| stmdb sp!, {r4 - r6, lr} |
| |
| ldr r2, [br, #bool_decoder_range] |
| ldr r3, [br, #bool_decoder_value] |
| |
| mov r6, r2, lsl #8 |
| sub r6, r6, #256 ; split = 1 + (((range-1) * probability) >> 8) |
| mov r12, #1 |
| smlawb r6, r6, prob, r12 |
| |
| mov lr, #0 |
| subs r5, r3, r6, lsl #24 |
| |
| ;cmp r3, r1 |
| movhs lr, #1 |
| movhs r3, r5 |
| subhs r2, r2, r6 |
| movlo r2, r6 |
| |
| cmp r2, #0x80 |
| blt range_less_0x80 |
| ;strd r2, r3, [br, #bool_decoder_range] |
| str r2, [br, #bool_decoder_range] |
| str r3, [br, #bool_decoder_value] |
| mov r0, lr |
| ldmia sp!, {r4 - r6, pc} |
| |
| range_less_0x80 |
| ldr r5, [br, #bool_decoder_pos] |
| ldr r1, [br, #bool_decoder_buffer] |
| ldr r4, [br, #bool_decoder_count] |
| add r1, r1, r5 |
| |
| clz r12, r2 |
| sub r12, r12, #24 |
| subs r4, r4, r12 |
| ldrleb r6, [r1], #1 |
| mov r2, r2, lsl r12 |
| mov r3, r3, lsl r12 |
| addle r4, r4, #8 |
| rsble r12, r4, #8 |
| addle r5, r5, #1 |
| orrle r3, r3, r6, lsl r12 |
| |
| ;strd r2, r3, [br, #bool_decoder_range] |
| ;strd r4, r5, [br, #bool_decoder_count] |
| str r2, [br, #bool_decoder_range] |
| str r3, [br, #bool_decoder_value] |
| str r4, [br, #bool_decoder_count] |
| str r5, [br, #bool_decoder_pos] |
| |
| mov r0, lr |
| |
| ldmia sp!, {r4 - r6, pc} |
| ENDP ; |vp8dx_decode_bool_v6| |
| |
| END |