yading@10: /* yading@10: * Copyright (c) 2011 Mans Rullgard yading@10: * yading@10: * This file is part of Libav. yading@10: * yading@10: * Libav is free software; you can redistribute it and/or yading@10: * modify it under the terms of the GNU Lesser General Public yading@10: * License as published by the Free Software Foundation; either yading@10: * version 2.1 of the License, or (at your option) any later version. yading@10: * yading@10: * Libav is distributed in the hope that it will be useful, yading@10: * but WITHOUT ANY WARRANTY; without even the implied warranty of yading@10: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU yading@10: * Lesser General Public License for more details. yading@10: * yading@10: * You should have received a copy of the GNU Lesser General Public yading@10: * License along with Libav; if not, write to the Free Software yading@10: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA yading@10: */ yading@10: yading@10: #include "libavutil/arm/asm.S" yading@10: yading@10: function ff_ac3_bit_alloc_calc_bap_armv6, export=1 yading@10: ldr r12, [sp] yading@10: cmp r12, #-960 yading@10: beq 4f yading@10: push {r4-r11,lr} yading@10: add r5, sp, #40 yading@10: movrelx r4, X(ff_ac3_bin_to_band_tab), r11 yading@10: movrelx lr, X(ff_ac3_band_start_tab) yading@10: ldm r5, {r5-r7} yading@10: ldrb r4, [r4, r2] yading@10: add r1, r1, r2, lsl #1 @ psd + start yading@10: add r0, r0, r4, lsl #1 @ mask + band yading@10: add r4, r4, lr yading@10: add r7, r7, r2 @ bap + start yading@10: 1: yading@10: ldrsh r9, [r0], #2 @ mask[band] yading@10: mov r8, #0xff0 yading@10: sub r9, r9, r12 @ - snr_offset yading@10: ldrb r10, [r4, #1]! @ band_start_tab[++band] yading@10: subs r9, r9, r5 @ - floor yading@10: it lt yading@10: movlt r9, #0 yading@10: cmp r10, r3 @ - end yading@10: and r9, r9, r8, lsl #1 @ & 0x1fe0 yading@10: ite gt yading@10: subgt r8, r3, r2 yading@10: suble r8, r10, r2 yading@10: mov r2, r10 yading@10: add r9, r9, r5 @ + floor => m yading@10: tst r8, #1 yading@10: add r11, r7, r8 yading@10: bne 3f yading@10: b 5f yading@10: 2: yading@10: ldrsh r8, [r1], #2 yading@10: ldrsh lr, [r1], #2 yading@10: sub r8, r8, r9 yading@10: sub lr, lr, r9 yading@10: usat r8, #6, r8, asr #5 @ address yading@10: usat lr, #6, lr, asr #5 yading@10: ldrb r8, [r6, r8] @ bap_tab[address] yading@10: ldrb lr, [r6, lr] yading@10: strb r8, [r7], #1 @ bap[bin] yading@10: strb lr, [r7], #1 yading@10: 5: cmp r7, r11 yading@10: blo 2b yading@10: cmp r3, r10 yading@10: bgt 1b yading@10: pop {r4-r11,pc} yading@10: 3: yading@10: ldrsh r8, [r1], #2 @ psd[bin] yading@10: sub r8, r8, r9 @ - m yading@10: usat r8, #6, r8, asr #5 @ address yading@10: ldrb r8, [r6, r8] @ bap_tab[address] yading@10: strb r8, [r7], #1 @ bap[bin] yading@10: b 5b yading@10: 4: yading@10: ldr r0, [sp, #12] yading@10: mov r1, #0 yading@10: mov r2, #256 yading@10: b X(memset) yading@10: endfunc