yading@10: /* yading@10: * Copyright (c) 2012 Mans Rullgard yading@10: * yading@10: * This file is part of FFmpeg yading@10: * yading@10: * FFmpeg 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: * FFmpeg 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 FFmpeg; 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 flac_lpc_16_1_arm yading@10: ldr r12, [sp] yading@10: push {r4, lr} yading@10: ldr r1, [r1] yading@10: subs r12, r12, #2 yading@10: ldr lr, [r0], #4 yading@10: beq 2f yading@10: it lt yading@10: poplt {r4, pc} yading@10: 1: yading@10: mul r4, lr, r1 yading@10: ldm r0, {r2, lr} yading@10: add_sh r2, r2, r4, asr r3 yading@10: mul r4, r2, r1 yading@10: subs r12, r12, #2 yading@10: add_sh lr, lr, r4, asr r3 yading@10: stm r0!, {r2, lr} yading@10: bgt 1b yading@10: it lt yading@10: poplt {r4, pc} yading@10: 2: yading@10: mul r4, lr, r1 yading@10: ldr r2, [r0] yading@10: add_sh r2, r2, r4, asr r3 yading@10: str r2, [r0] yading@10: pop {r4, pc} yading@10: endfunc yading@10: yading@10: function flac_lpc_16_2_arm yading@10: ldr r12, [sp] yading@10: subs r12, r12, r2 yading@10: it le yading@10: bxle lr yading@10: yading@10: push {r4-r9, lr} yading@10: ldm r0!, {r6, r7} yading@10: ldm r1, {r8, r9} yading@10: subs r12, r12, #1 yading@10: beq 2f yading@10: 1: yading@10: mul r4, r6, r8 yading@10: mul r5, r7, r8 yading@10: mla r4, r7, r9, r4 yading@10: ldm r0, {r6, r7} yading@10: add_sh r6, r6, r4, asr r3 yading@10: mla r5, r6, r9, r5 yading@10: add_sh r7, r7, r5, asr r3 yading@10: stm r0!, {r6, r7} yading@10: subs r12, r12, #2 yading@10: bgt 1b yading@10: it lt yading@10: poplt {r4-r9, pc} yading@10: 2: yading@10: mul r4, r6, r8 yading@10: mla r4, r7, r9, r4 yading@10: ldr r5, [r0] yading@10: add_sh r5, r5, r4, asr r3 yading@10: str r5, [r0] yading@10: pop {r4-r9, pc} yading@10: endfunc yading@10: yading@10: function ff_flac_lpc_16_arm, export=1 yading@10: cmp r2, #2 yading@10: blt flac_lpc_16_1_arm yading@10: beq flac_lpc_16_2_arm yading@10: yading@10: ldr r12, [sp] yading@10: subs r12, r12, r2 yading@10: it le yading@10: bxle lr yading@10: yading@10: push {r4-r9, lr} yading@10: yading@10: subs r12, r12, #1 yading@10: beq 3f yading@10: 1: yading@10: sub lr, r2, #2 yading@10: mov r4, #0 yading@10: mov r5, #0 yading@10: yading@10: ldr r7, [r0], #4 yading@10: ldr r9, [r1], #4 yading@10: 2: yading@10: mla r4, r7, r9, r4 yading@10: ldm r0!, {r6, r7} yading@10: mla r5, r6, r9, r5 yading@10: ldm r1!, {r8, r9} yading@10: mla r4, r6, r8, r4 yading@10: subs lr, lr, #2 yading@10: mla r5, r7, r8, r5 yading@10: bgt 2b yading@10: blt 6f yading@10: yading@10: mla r4, r7, r9, r4 yading@10: ldr r7, [r0], #4 yading@10: mla r5, r7, r9, r5 yading@10: ldr r9, [r1], #4 yading@10: 6: yading@10: mla r4, r7, r9, r4 yading@10: ldm r0, {r6, r7} yading@10: add_sh r6, r6, r4, asr r3 yading@10: mla r5, r6, r9, r5 yading@10: add_sh r7, r7, r5, asr r3 yading@10: stm r0!, {r6, r7} yading@10: sub r0, r0, r2, lsl #2 yading@10: sub r1, r1, r2, lsl #2 yading@10: yading@10: subs r12, r12, #2 yading@10: bgt 1b yading@10: it lt yading@10: poplt {r4-r9, pc} yading@10: 3: yading@10: mov r4, #0 yading@10: 4: yading@10: ldr r5, [r1], #4 yading@10: ldr r6, [r0], #4 yading@10: mla r4, r5, r6, r4 yading@10: subs r2, r2, #1 yading@10: bgt 4b yading@10: ldr r5, [r0] yading@10: add_sh r5, r5, r4, asr r3 yading@10: str r5, [r0] yading@10: pop {r4-r9, pc} yading@10: endfunc