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