179f15823c34ae1e423108295e416213200bb280fAndreas Huber; 279f15823c34ae1e423108295e416213200bb280fAndreas Huber; Copyright (c) 2011 The WebM project authors. All Rights Reserved. 379f15823c34ae1e423108295e416213200bb280fAndreas Huber; 479f15823c34ae1e423108295e416213200bb280fAndreas Huber; Use of this source code is governed by a BSD-style license 579f15823c34ae1e423108295e416213200bb280fAndreas Huber; that can be found in the LICENSE file in the root of the source 679f15823c34ae1e423108295e416213200bb280fAndreas Huber; tree. An additional intellectual property rights grant can be found 779f15823c34ae1e423108295e416213200bb280fAndreas Huber; in the file PATENTS. All contributing project authors may 879f15823c34ae1e423108295e416213200bb280fAndreas Huber; be found in the AUTHORS file in the root of the source tree. 979f15823c34ae1e423108295e416213200bb280fAndreas Huber; 1079f15823c34ae1e423108295e416213200bb280fAndreas Huber 1179f15823c34ae1e423108295e416213200bb280fAndreas Huber 1279f15823c34ae1e423108295e416213200bb280fAndreas Huber EXPORT |vp8_fast_quantize_b_armv6| 1379f15823c34ae1e423108295e416213200bb280fAndreas Huber 1479f15823c34ae1e423108295e416213200bb280fAndreas Huber INCLUDE asm_enc_offsets.asm 1579f15823c34ae1e423108295e416213200bb280fAndreas Huber 1679f15823c34ae1e423108295e416213200bb280fAndreas Huber ARM 1779f15823c34ae1e423108295e416213200bb280fAndreas Huber REQUIRE8 1879f15823c34ae1e423108295e416213200bb280fAndreas Huber PRESERVE8 1979f15823c34ae1e423108295e416213200bb280fAndreas Huber 2079f15823c34ae1e423108295e416213200bb280fAndreas Huber AREA ||.text||, CODE, READONLY, ALIGN=2 2179f15823c34ae1e423108295e416213200bb280fAndreas Huber 2279f15823c34ae1e423108295e416213200bb280fAndreas Huber; r0 BLOCK *b 2379f15823c34ae1e423108295e416213200bb280fAndreas Huber; r1 BLOCKD *d 2479f15823c34ae1e423108295e416213200bb280fAndreas Huber|vp8_fast_quantize_b_armv6| PROC 2579f15823c34ae1e423108295e416213200bb280fAndreas Huber stmfd sp!, {r1, r4-r11, lr} 2679f15823c34ae1e423108295e416213200bb280fAndreas Huber 2779f15823c34ae1e423108295e416213200bb280fAndreas Huber ldr r3, [r0, #vp8_block_coeff] ; coeff 2879f15823c34ae1e423108295e416213200bb280fAndreas Huber ldr r4, [r0, #vp8_block_quant_fast] ; quant_fast 2979f15823c34ae1e423108295e416213200bb280fAndreas Huber ldr r5, [r0, #vp8_block_round] ; round 3079f15823c34ae1e423108295e416213200bb280fAndreas Huber ldr r6, [r1, #vp8_blockd_qcoeff] ; qcoeff 3179f15823c34ae1e423108295e416213200bb280fAndreas Huber ldr r7, [r1, #vp8_blockd_dqcoeff] ; dqcoeff 3279f15823c34ae1e423108295e416213200bb280fAndreas Huber ldr r8, [r1, #vp8_blockd_dequant] ; dequant 3379f15823c34ae1e423108295e416213200bb280fAndreas Huber 3479f15823c34ae1e423108295e416213200bb280fAndreas Huber ldr r2, loop_count ; loop_count=0x1000000. 'lsls' instruction 3579f15823c34ae1e423108295e416213200bb280fAndreas Huber ; is used to update the counter so that 3679f15823c34ae1e423108295e416213200bb280fAndreas Huber ; it can be used to mark nonzero 3779f15823c34ae1e423108295e416213200bb280fAndreas Huber ; quantized coefficient pairs. 3879f15823c34ae1e423108295e416213200bb280fAndreas Huber 3979f15823c34ae1e423108295e416213200bb280fAndreas Huber mov r1, #0 ; flags for quantized coeffs 4079f15823c34ae1e423108295e416213200bb280fAndreas Huber 4179f15823c34ae1e423108295e416213200bb280fAndreas Huber ; PART 1: quantization and dequantization loop 4279f15823c34ae1e423108295e416213200bb280fAndreas Huberloop 4379f15823c34ae1e423108295e416213200bb280fAndreas Huber ldr r9, [r3], #4 ; [z1 | z0] 4479f15823c34ae1e423108295e416213200bb280fAndreas Huber ldr r10, [r5], #4 ; [r1 | r0] 4579f15823c34ae1e423108295e416213200bb280fAndreas Huber ldr r11, [r4], #4 ; [q1 | q0] 4679f15823c34ae1e423108295e416213200bb280fAndreas Huber 4779f15823c34ae1e423108295e416213200bb280fAndreas Huber ssat16 lr, #1, r9 ; [sz1 | sz0] 4879f15823c34ae1e423108295e416213200bb280fAndreas Huber eor r9, r9, lr ; [z1 ^ sz1 | z0 ^ sz0] 4979f15823c34ae1e423108295e416213200bb280fAndreas Huber ssub16 r9, r9, lr ; x = (z ^ sz) - sz 5079f15823c34ae1e423108295e416213200bb280fAndreas Huber sadd16 r9, r9, r10 ; [x1+r1 | x0+r0] 5179f15823c34ae1e423108295e416213200bb280fAndreas Huber 5279f15823c34ae1e423108295e416213200bb280fAndreas Huber ldr r12, [r3], #4 ; [z3 | z2] 5379f15823c34ae1e423108295e416213200bb280fAndreas Huber 5479f15823c34ae1e423108295e416213200bb280fAndreas Huber smulbb r0, r9, r11 ; [(x0+r0)*q0] 5579f15823c34ae1e423108295e416213200bb280fAndreas Huber smultt r9, r9, r11 ; [(x1+r1)*q1] 5679f15823c34ae1e423108295e416213200bb280fAndreas Huber 5779f15823c34ae1e423108295e416213200bb280fAndreas Huber ldr r10, [r5], #4 ; [r3 | r2] 5879f15823c34ae1e423108295e416213200bb280fAndreas Huber 5979f15823c34ae1e423108295e416213200bb280fAndreas Huber ssat16 r11, #1, r12 ; [sz3 | sz2] 6079f15823c34ae1e423108295e416213200bb280fAndreas Huber eor r12, r12, r11 ; [z3 ^ sz3 | z2 ^ sz2] 6179f15823c34ae1e423108295e416213200bb280fAndreas Huber pkhtb r0, r9, r0, asr #16 ; [y1 | y0] 6279f15823c34ae1e423108295e416213200bb280fAndreas Huber ldr r9, [r4], #4 ; [q3 | q2] 6379f15823c34ae1e423108295e416213200bb280fAndreas Huber ssub16 r12, r12, r11 ; x = (z ^ sz) - sz 6479f15823c34ae1e423108295e416213200bb280fAndreas Huber 6579f15823c34ae1e423108295e416213200bb280fAndreas Huber sadd16 r12, r12, r10 ; [x3+r3 | x2+r2] 6679f15823c34ae1e423108295e416213200bb280fAndreas Huber 6779f15823c34ae1e423108295e416213200bb280fAndreas Huber eor r0, r0, lr ; [(y1 ^ sz1) | (y0 ^ sz0)] 6879f15823c34ae1e423108295e416213200bb280fAndreas Huber 6979f15823c34ae1e423108295e416213200bb280fAndreas Huber smulbb r10, r12, r9 ; [(x2+r2)*q2] 7079f15823c34ae1e423108295e416213200bb280fAndreas Huber smultt r12, r12, r9 ; [(x3+r3)*q3] 7179f15823c34ae1e423108295e416213200bb280fAndreas Huber 7279f15823c34ae1e423108295e416213200bb280fAndreas Huber ssub16 r0, r0, lr ; x = (y ^ sz) - sz 7379f15823c34ae1e423108295e416213200bb280fAndreas Huber 7479f15823c34ae1e423108295e416213200bb280fAndreas Huber cmp r0, #0 ; check if zero 7579f15823c34ae1e423108295e416213200bb280fAndreas Huber orrne r1, r1, r2, lsr #24 ; add flag for nonzero coeffs 7679f15823c34ae1e423108295e416213200bb280fAndreas Huber 7779f15823c34ae1e423108295e416213200bb280fAndreas Huber str r0, [r6], #4 ; *qcoeff++ = x 7879f15823c34ae1e423108295e416213200bb280fAndreas Huber ldr r9, [r8], #4 ; [dq1 | dq0] 7979f15823c34ae1e423108295e416213200bb280fAndreas Huber 8079f15823c34ae1e423108295e416213200bb280fAndreas Huber pkhtb r10, r12, r10, asr #16 ; [y3 | y2] 8179f15823c34ae1e423108295e416213200bb280fAndreas Huber eor r10, r10, r11 ; [(y3 ^ sz3) | (y2 ^ sz2)] 8279f15823c34ae1e423108295e416213200bb280fAndreas Huber ssub16 r10, r10, r11 ; x = (y ^ sz) - sz 8379f15823c34ae1e423108295e416213200bb280fAndreas Huber 8479f15823c34ae1e423108295e416213200bb280fAndreas Huber cmp r10, #0 ; check if zero 8579f15823c34ae1e423108295e416213200bb280fAndreas Huber orrne r1, r1, r2, lsr #23 ; add flag for nonzero coeffs 8679f15823c34ae1e423108295e416213200bb280fAndreas Huber 8779f15823c34ae1e423108295e416213200bb280fAndreas Huber str r10, [r6], #4 ; *qcoeff++ = x 8879f15823c34ae1e423108295e416213200bb280fAndreas Huber ldr r11, [r8], #4 ; [dq3 | dq2] 8979f15823c34ae1e423108295e416213200bb280fAndreas Huber 9079f15823c34ae1e423108295e416213200bb280fAndreas Huber smulbb r12, r0, r9 ; [x0*dq0] 9179f15823c34ae1e423108295e416213200bb280fAndreas Huber smultt r0, r0, r9 ; [x1*dq1] 9279f15823c34ae1e423108295e416213200bb280fAndreas Huber 9379f15823c34ae1e423108295e416213200bb280fAndreas Huber smulbb r9, r10, r11 ; [x2*dq2] 9479f15823c34ae1e423108295e416213200bb280fAndreas Huber smultt r10, r10, r11 ; [x3*dq3] 9579f15823c34ae1e423108295e416213200bb280fAndreas Huber 9679f15823c34ae1e423108295e416213200bb280fAndreas Huber lsls r2, r2, #2 ; update loop counter 9779f15823c34ae1e423108295e416213200bb280fAndreas Huber strh r12, [r7, #0] ; dqcoeff[0] = [x0*dq0] 9879f15823c34ae1e423108295e416213200bb280fAndreas Huber strh r0, [r7, #2] ; dqcoeff[1] = [x1*dq1] 9979f15823c34ae1e423108295e416213200bb280fAndreas Huber strh r9, [r7, #4] ; dqcoeff[2] = [x2*dq2] 10079f15823c34ae1e423108295e416213200bb280fAndreas Huber strh r10, [r7, #6] ; dqcoeff[3] = [x3*dq3] 10179f15823c34ae1e423108295e416213200bb280fAndreas Huber add r7, r7, #8 ; dqcoeff += 8 10279f15823c34ae1e423108295e416213200bb280fAndreas Huber bne loop 10379f15823c34ae1e423108295e416213200bb280fAndreas Huber 10479f15823c34ae1e423108295e416213200bb280fAndreas Huber ; PART 2: check position for eob... 10579f15823c34ae1e423108295e416213200bb280fAndreas Huber mov lr, #0 ; init eob 10679f15823c34ae1e423108295e416213200bb280fAndreas Huber cmp r1, #0 ; coeffs after quantization? 10779f15823c34ae1e423108295e416213200bb280fAndreas Huber ldr r11, [sp, #0] ; restore BLOCKD pointer 10879f15823c34ae1e423108295e416213200bb280fAndreas Huber beq end ; skip eob calculations if all zero 10979f15823c34ae1e423108295e416213200bb280fAndreas Huber 11079f15823c34ae1e423108295e416213200bb280fAndreas Huber ldr r0, [r11, #vp8_blockd_qcoeff] 11179f15823c34ae1e423108295e416213200bb280fAndreas Huber 11279f15823c34ae1e423108295e416213200bb280fAndreas Huber ; check shortcut for nonzero qcoeffs 11379f15823c34ae1e423108295e416213200bb280fAndreas Huber tst r1, #0x80 11479f15823c34ae1e423108295e416213200bb280fAndreas Huber bne quant_coeff_15_14 11579f15823c34ae1e423108295e416213200bb280fAndreas Huber tst r1, #0x20 11679f15823c34ae1e423108295e416213200bb280fAndreas Huber bne quant_coeff_13_11 11779f15823c34ae1e423108295e416213200bb280fAndreas Huber tst r1, #0x8 11879f15823c34ae1e423108295e416213200bb280fAndreas Huber bne quant_coeff_12_7 11979f15823c34ae1e423108295e416213200bb280fAndreas Huber tst r1, #0x40 12079f15823c34ae1e423108295e416213200bb280fAndreas Huber bne quant_coeff_10_9 12179f15823c34ae1e423108295e416213200bb280fAndreas Huber tst r1, #0x10 12279f15823c34ae1e423108295e416213200bb280fAndreas Huber bne quant_coeff_8_3 12379f15823c34ae1e423108295e416213200bb280fAndreas Huber tst r1, #0x2 12479f15823c34ae1e423108295e416213200bb280fAndreas Huber bne quant_coeff_6_5 12579f15823c34ae1e423108295e416213200bb280fAndreas Huber tst r1, #0x4 12679f15823c34ae1e423108295e416213200bb280fAndreas Huber bne quant_coeff_4_2 12779f15823c34ae1e423108295e416213200bb280fAndreas Huber b quant_coeff_1_0 12879f15823c34ae1e423108295e416213200bb280fAndreas Huber 12979f15823c34ae1e423108295e416213200bb280fAndreas Huberquant_coeff_15_14 13079f15823c34ae1e423108295e416213200bb280fAndreas Huber ldrh r2, [r0, #30] ; rc=15, i=15 13179f15823c34ae1e423108295e416213200bb280fAndreas Huber mov lr, #16 13279f15823c34ae1e423108295e416213200bb280fAndreas Huber cmp r2, #0 13379f15823c34ae1e423108295e416213200bb280fAndreas Huber bne end 13479f15823c34ae1e423108295e416213200bb280fAndreas Huber 13579f15823c34ae1e423108295e416213200bb280fAndreas Huber ldrh r3, [r0, #28] ; rc=14, i=14 13679f15823c34ae1e423108295e416213200bb280fAndreas Huber mov lr, #15 13779f15823c34ae1e423108295e416213200bb280fAndreas Huber cmp r3, #0 13879f15823c34ae1e423108295e416213200bb280fAndreas Huber bne end 13979f15823c34ae1e423108295e416213200bb280fAndreas Huber 14079f15823c34ae1e423108295e416213200bb280fAndreas Huberquant_coeff_13_11 14179f15823c34ae1e423108295e416213200bb280fAndreas Huber ldrh r2, [r0, #22] ; rc=11, i=13 14279f15823c34ae1e423108295e416213200bb280fAndreas Huber mov lr, #14 14379f15823c34ae1e423108295e416213200bb280fAndreas Huber cmp r2, #0 14479f15823c34ae1e423108295e416213200bb280fAndreas Huber bne end 14579f15823c34ae1e423108295e416213200bb280fAndreas Huber 14679f15823c34ae1e423108295e416213200bb280fAndreas Huberquant_coeff_12_7 14779f15823c34ae1e423108295e416213200bb280fAndreas Huber ldrh r3, [r0, #14] ; rc=7, i=12 14879f15823c34ae1e423108295e416213200bb280fAndreas Huber mov lr, #13 14979f15823c34ae1e423108295e416213200bb280fAndreas Huber cmp r3, #0 15079f15823c34ae1e423108295e416213200bb280fAndreas Huber bne end 15179f15823c34ae1e423108295e416213200bb280fAndreas Huber 15279f15823c34ae1e423108295e416213200bb280fAndreas Huber ldrh r2, [r0, #20] ; rc=10, i=11 15379f15823c34ae1e423108295e416213200bb280fAndreas Huber mov lr, #12 15479f15823c34ae1e423108295e416213200bb280fAndreas Huber cmp r2, #0 15579f15823c34ae1e423108295e416213200bb280fAndreas Huber bne end 15679f15823c34ae1e423108295e416213200bb280fAndreas Huber 15779f15823c34ae1e423108295e416213200bb280fAndreas Huberquant_coeff_10_9 15879f15823c34ae1e423108295e416213200bb280fAndreas Huber ldrh r3, [r0, #26] ; rc=13, i=10 15979f15823c34ae1e423108295e416213200bb280fAndreas Huber mov lr, #11 16079f15823c34ae1e423108295e416213200bb280fAndreas Huber cmp r3, #0 16179f15823c34ae1e423108295e416213200bb280fAndreas Huber bne end 16279f15823c34ae1e423108295e416213200bb280fAndreas Huber 16379f15823c34ae1e423108295e416213200bb280fAndreas Huber ldrh r2, [r0, #24] ; rc=12, i=9 16479f15823c34ae1e423108295e416213200bb280fAndreas Huber mov lr, #10 16579f15823c34ae1e423108295e416213200bb280fAndreas Huber cmp r2, #0 16679f15823c34ae1e423108295e416213200bb280fAndreas Huber bne end 16779f15823c34ae1e423108295e416213200bb280fAndreas Huber 16879f15823c34ae1e423108295e416213200bb280fAndreas Huberquant_coeff_8_3 16979f15823c34ae1e423108295e416213200bb280fAndreas Huber ldrh r3, [r0, #18] ; rc=9, i=8 17079f15823c34ae1e423108295e416213200bb280fAndreas Huber mov lr, #9 17179f15823c34ae1e423108295e416213200bb280fAndreas Huber cmp r3, #0 17279f15823c34ae1e423108295e416213200bb280fAndreas Huber bne end 17379f15823c34ae1e423108295e416213200bb280fAndreas Huber 17479f15823c34ae1e423108295e416213200bb280fAndreas Huber ldrh r2, [r0, #12] ; rc=6, i=7 17579f15823c34ae1e423108295e416213200bb280fAndreas Huber mov lr, #8 17679f15823c34ae1e423108295e416213200bb280fAndreas Huber cmp r2, #0 17779f15823c34ae1e423108295e416213200bb280fAndreas Huber bne end 17879f15823c34ae1e423108295e416213200bb280fAndreas Huber 17979f15823c34ae1e423108295e416213200bb280fAndreas Huberquant_coeff_6_5 18079f15823c34ae1e423108295e416213200bb280fAndreas Huber ldrh r3, [r0, #6] ; rc=3, i=6 18179f15823c34ae1e423108295e416213200bb280fAndreas Huber mov lr, #7 18279f15823c34ae1e423108295e416213200bb280fAndreas Huber cmp r3, #0 18379f15823c34ae1e423108295e416213200bb280fAndreas Huber bne end 18479f15823c34ae1e423108295e416213200bb280fAndreas Huber 18579f15823c34ae1e423108295e416213200bb280fAndreas Huber ldrh r2, [r0, #4] ; rc=2, i=5 18679f15823c34ae1e423108295e416213200bb280fAndreas Huber mov lr, #6 18779f15823c34ae1e423108295e416213200bb280fAndreas Huber cmp r2, #0 18879f15823c34ae1e423108295e416213200bb280fAndreas Huber bne end 18979f15823c34ae1e423108295e416213200bb280fAndreas Huber 19079f15823c34ae1e423108295e416213200bb280fAndreas Huberquant_coeff_4_2 19179f15823c34ae1e423108295e416213200bb280fAndreas Huber ldrh r3, [r0, #10] ; rc=5, i=4 19279f15823c34ae1e423108295e416213200bb280fAndreas Huber mov lr, #5 19379f15823c34ae1e423108295e416213200bb280fAndreas Huber cmp r3, #0 19479f15823c34ae1e423108295e416213200bb280fAndreas Huber bne end 19579f15823c34ae1e423108295e416213200bb280fAndreas Huber 19679f15823c34ae1e423108295e416213200bb280fAndreas Huber ldrh r2, [r0, #16] ; rc=8, i=3 19779f15823c34ae1e423108295e416213200bb280fAndreas Huber mov lr, #4 19879f15823c34ae1e423108295e416213200bb280fAndreas Huber cmp r2, #0 19979f15823c34ae1e423108295e416213200bb280fAndreas Huber bne end 20079f15823c34ae1e423108295e416213200bb280fAndreas Huber 20179f15823c34ae1e423108295e416213200bb280fAndreas Huber ldrh r3, [r0, #8] ; rc=4, i=2 20279f15823c34ae1e423108295e416213200bb280fAndreas Huber mov lr, #3 20379f15823c34ae1e423108295e416213200bb280fAndreas Huber cmp r3, #0 20479f15823c34ae1e423108295e416213200bb280fAndreas Huber bne end 20579f15823c34ae1e423108295e416213200bb280fAndreas Huber 20679f15823c34ae1e423108295e416213200bb280fAndreas Huberquant_coeff_1_0 20779f15823c34ae1e423108295e416213200bb280fAndreas Huber ldrh r2, [r0, #2] ; rc=1, i=1 20879f15823c34ae1e423108295e416213200bb280fAndreas Huber mov lr, #2 20979f15823c34ae1e423108295e416213200bb280fAndreas Huber cmp r2, #0 21079f15823c34ae1e423108295e416213200bb280fAndreas Huber bne end 21179f15823c34ae1e423108295e416213200bb280fAndreas Huber 21279f15823c34ae1e423108295e416213200bb280fAndreas Huber mov lr, #1 ; rc=0, i=0 21379f15823c34ae1e423108295e416213200bb280fAndreas Huber 21479f15823c34ae1e423108295e416213200bb280fAndreas Huberend 21579f15823c34ae1e423108295e416213200bb280fAndreas Huber str lr, [r11, #vp8_blockd_eob] 21679f15823c34ae1e423108295e416213200bb280fAndreas Huber ldmfd sp!, {r1, r4-r11, pc} 21779f15823c34ae1e423108295e416213200bb280fAndreas Huber 21879f15823c34ae1e423108295e416213200bb280fAndreas Huber ENDP 21979f15823c34ae1e423108295e416213200bb280fAndreas Huber 22079f15823c34ae1e423108295e416213200bb280fAndreas Huberloop_count 22179f15823c34ae1e423108295e416213200bb280fAndreas Huber DCD 0x1000000 22279f15823c34ae1e423108295e416213200bb280fAndreas Huber 22379f15823c34ae1e423108295e416213200bb280fAndreas Huber END 22479f15823c34ae1e423108295e416213200bb280fAndreas Huber 225