1/*
2 * Copyright (c) 2012 Mans Rullgard <mans@mansr.com>
3 *
4 * This file is part of FFmpeg
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21#include "libavutil/arm/asm.S"
22
23function flac_lpc_16_1_arm
24        ldr             r12, [sp]
25        push            {r4, lr}
26        ldr             r1,  [r1]
27        subs            r12, r12, #2
28        ldr             lr,  [r0], #4
29        beq             2f
30        it              lt
31        poplt           {r4, pc}
321:
33        mul             r4,  lr,  r1
34        ldm             r0,  {r2, lr}
35        add_sh          r2,  r2,  r4,  asr r3
36        mul             r4,  r2,  r1
37        subs            r12, r12, #2
38        add_sh          lr,  lr,  r4,  asr r3
39        stm             r0!, {r2, lr}
40        bgt             1b
41        it              lt
42        poplt           {r4, pc}
432:
44        mul             r4,  lr,  r1
45        ldr             r2,  [r0]
46        add_sh          r2,  r2,  r4,  asr r3
47        str             r2,  [r0]
48        pop             {r4, pc}
49endfunc
50
51function flac_lpc_16_2_arm
52        ldr             r12, [sp]
53        subs            r12, r12, r2
54        it              le
55        bxle            lr
56
57        push            {r4-r9, lr}
58        ldm             r0!, {r6, r7}
59        ldm             r1,  {r8, r9}
60        subs            r12, r12, #1
61        beq             2f
621:
63        mul             r4,  r6,  r8
64        mul             r5,  r7,  r8
65        mla             r4,  r7,  r9,  r4
66        ldm             r0,  {r6, r7}
67        add_sh          r6,  r6,  r4,  asr r3
68        mla             r5,  r6,  r9,  r5
69        add_sh          r7,  r7,  r5,  asr r3
70        stm             r0!, {r6, r7}
71        subs            r12, r12, #2
72        bgt             1b
73        it              lt
74        poplt           {r4-r9, pc}
752:
76        mul             r4,  r6,  r8
77        mla             r4,  r7,  r9,  r4
78        ldr             r5,  [r0]
79        add_sh          r5,  r5,  r4,  asr r3
80        str             r5,  [r0]
81        pop             {r4-r9, pc}
82endfunc
83
84function ff_flac_lpc_16_arm, export=1
85        cmp             r2,  #2
86        blt             flac_lpc_16_1_arm
87        beq             flac_lpc_16_2_arm
88
89        ldr             r12, [sp]
90        subs            r12, r12, r2
91        it              le
92        bxle            lr
93
94        push            {r4-r9, lr}
95
96        subs            r12, r12, #1
97        beq             3f
981:
99        sub             lr,  r2,  #2
100        mov             r4,  #0
101        mov             r5,  #0
102
103        ldr             r7,  [r0], #4
104        ldr             r9,  [r1], #4
1052:
106        mla             r4,  r7,  r9,  r4
107        ldm             r0!, {r6, r7}
108        mla             r5,  r6,  r9,  r5
109        ldm             r1!, {r8, r9}
110        mla             r4,  r6,  r8,  r4
111        subs            lr,  lr,  #2
112        mla             r5,  r7,  r8,  r5
113        bgt             2b
114        blt             6f
115
116        mla             r4,  r7,  r9,  r4
117        ldr             r7,  [r0], #4
118        mla             r5,  r7,  r9,  r5
119        ldr             r9,  [r1], #4
1206:
121        mla             r4,  r7,  r9,  r4
122        ldm             r0,  {r6, r7}
123        add_sh          r6,  r6,  r4,  asr r3
124        mla             r5,  r6,  r9,  r5
125        add_sh          r7,  r7,  r5,  asr r3
126        stm             r0!, {r6, r7}
127        sub             r0,  r0,  r2,  lsl #2
128        sub             r1,  r1,  r2,  lsl #2
129
130        subs            r12, r12, #2
131        bgt             1b
132        it              lt
133        poplt           {r4-r9, pc}
1343:
135        mov             r4,  #0
1364:
137        ldr             r5,  [r1], #4
138        ldr             r6,  [r0], #4
139        mla             r4,  r5,  r6,  r4
140        subs            r2,  r2,  #1
141        bgt             4b
142        ldr             r5,  [r0]
143        add_sh          r5,  r5,  r4,  asr r3
144        str             r5,  [r0]
145        pop             {r4-r9, pc}
146endfunc
147