OSDN Git Service

original
[gb-231r1-is01/Gingerbread_2.3.3_r1_IS01.git] / frameworks / base / media / libstagefright / codecs / amrwbenc / src / asm / ARMV5E / Syn_filt_32_opt.s
1 @/*\r
2 @ ** Copyright 2003-2010, VisualOn, Inc.\r
3 @ **\r
4 @ ** Licensed under the Apache License, Version 2.0 (the "License");\r
5 @ ** you may not use this file except in compliance with the License.\r
6 @ ** You may obtain a copy of the License at\r
7 @ **\r
8 @ **     http://www.apache.org/licenses/LICENSE-2.0\r
9 @ **\r
10 @ ** Unless required by applicable law or agreed to in writing, software\r
11 @ ** distributed under the License is distributed on an "AS IS" BASIS,\r
12 @ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13 @ ** See the License for the specific language governing permissions and\r
14 @ ** limitations under the License.\r
15 @ */\r
16 @\r
17 @void Syn_filt_32(\r
18 @     Word16 a[],                           /* (i) Q12 : a[m+1] prediction coefficients */\r
19 @     Word16 m,                             /* (i)     : order of LP filter             */\r
20 @     Word16 exc[],                         /* (i) Qnew: excitation (exc[i] >> Qnew)    */\r
21 @     Word16 Qnew,                          /* (i)     : exc scaling = 0(min) to 8(max) */\r
22 @     Word16 sig_hi[],                      /* (o) /16 : synthesis high                 */\r
23 @     Word16 sig_lo[],                      /* (o) /16 : synthesis low                  */\r
24 @     Word16 lg                             /* (i)     : size of filtering              */\r
25 @)\r
26 @***************************************************************\r
27 @\r
28 @ a[]      --- r0\r
29 @ m        --- r1\r
30 @ exc[]    --- r2\r
31 @ Qnew     --- r3\r
32 @ sig_hi[] --- r4\r
33 @ sig_lo[] --- r5\r
34 @ lg       --- r6\r
35 \r
36           .section  .text\r
37           .global  Syn_filt_32_asm\r
38 \r
39 Syn_filt_32_asm:\r
40 \r
41           STMFD         r13!, {r4 - r12, r14} \r
42           LDR           r4,  [r13, #40]                  @ get sig_hi[] address\r
43           LDR           r5,  [r13, #44]                  @ get sig_lo[] address\r
44 \r
45           LDRSH         r6,  [r0]                        @ load Aq[0]\r
46           ADD           r7,  r3, #4                      @ 4 + Q_new\r
47           MOV           r3, r6, ASR r7                   @ a0 = Aq[0] >> (4 + Q_new)\r
48 \r
49           LDR           r14, =0xffff\r
50           LDRSH         r6, [r0, #2]                     @ load Aq[1]\r
51           LDRSH         r7, [r0, #4]                     @ load Aq[2]\r
52           LDRSH         r8, [r0, #6]                     @ load Aq[3]\r
53           LDRSH         r9, [r0, #8]                     @ load Aq[4]\r
54           AND           r6, r6, r14\r
55           AND           r8, r8, r14\r
56           ORR           r10, r6, r7, LSL #16             @ Aq[2] -- Aq[1]\r
57           ORR           r11, r8, r9, LSL #16             @ Aq[4] -- Aq[3]\r
58           STR           r10, [r13, #-4]                  \r
59           STR           r11, [r13, #-8]\r
60 \r
61           LDRSH         r6, [r0, #10]                    @ load Aq[5]\r
62           LDRSH         r7, [r0, #12]                    @ load Aq[6]\r
63           LDRSH         r8, [r0, #14]                    @ load Aq[7]\r
64           LDRSH         r9, [r0, #16]                    @ load Aq[8]\r
65           AND           r6, r6, r14\r
66           AND           r8, r8, r14\r
67           ORR           r10, r6, r7, LSL #16             @ Aq[6] -- Aq[5]\r
68           ORR           r11, r8, r9, LSL #16             @ Aq[8] -- Aq[7]\r
69           STR           r10, [r13, #-12]\r
70           STR           r11, [r13, #-16]\r
71 \r
72           LDRSH         r6, [r0, #18]                    @ load Aq[9]\r
73           LDRSH         r7, [r0, #20]                    @ load Aq[10]\r
74           LDRSH         r8, [r0, #22]                    @ load Aq[11]\r
75           LDRSH         r9, [r0, #24]                    @ load Aq[12]\r
76           AND           r6, r6, r14 \r
77           AND           r8, r8, r14\r
78           ORR           r10, r6, r7, LSL #16             @ Aq[10] -- Aq[9]\r
79           ORR           r11, r8, r9, LSL #16             @ Aq[12] -- Aq[11]\r
80           STR           r10, [r13, #-20]\r
81           STR           r11, [r13, #-24]  \r
82 \r
83           LDRSH         r6, [r0, #26]                    @ load Aq[13]\r
84           LDRSH         r7, [r0, #28]                    @ load Aq[14]\r
85           LDRSH         r8, [r0, #30]                    @ load Aq[15]\r
86           LDRSH         r9, [r0, #32]                    @ load Aq[16]\r
87           AND           r6, r6, r14\r
88           AND           r8, r8, r14\r
89           ORR           r10, r6, r7, LSL #16             @ Aq[14] -- Aq[13]\r
90           ORR           r11, r8, r9, LSL #16             @ Aq[16] -- Aq[15]\r
91           STR           r10, [r13, #-28]\r
92           STR           r11, [r13, #-32]\r
93           \r
94           MOV           r8, #0                           @ i = 0\r
95               \r
96 LOOP:            \r
97           LDRSH         r6, [r5, #-2]                    @ load sig_lo[i-1]\r
98           LDRSH         r7, [r5, #-4]                    @ load sig_lo[i-2]\r
99 \r
100           LDR           r11, [r13, #-4]                  @ Aq[2] -- Aq[1]        \r
101           LDRSH         r9, [r5, #-6]                    @ load sig_lo[i-3]\r
102           LDRSH         r10, [r5, #-8]                   @ load sig_lo[i-4]\r
103 \r
104           SMULBB        r12, r6, r11                     @ sig_lo[i-1] * Aq[1]\r
105 \r
106           LDRSH         r6, [r5, #-10]                   @ load sig_lo[i-5]\r
107           SMLABT        r12, r7, r11, r12                @ sig_lo[i-2] * Aq[2]\r
108           LDR           r11, [r13, #-8]                  @ Aq[4] -- Aq[3]\r
109           LDRSH         r7, [r5, #-12]                   @ load sig_lo[i-6]\r
110           SMLABB        r12, r9, r11, r12                @ sig_lo[i-3] * Aq[3]\r
111           LDRSH         r9, [r5, #-14]                   @ load sig_lo[i-7]\r
112           SMLABT        r12, r10, r11, r12               @ sig_lo[i-4] * Aq[4]\r
113           LDR           r11, [r13, #-12]                 @ Aq[6] -- Aq[5]\r
114           LDRSH         r10, [r5, #-16]                  @ load sig_lo[i-8]\r
115           SMLABB        r12, r6, r11, r12                @ sig_lo[i-5] * Aq[5]\r
116           LDRSH         r6,  [r5, #-18]                  @ load sig_lo[i-9]\r
117           SMLABT        r12, r7, r11, r12                @ sig_lo[i-6] * Aq[6]\r
118           LDR           r11, [r13, #-16]                 @ Aq[8] -- Aq[7]\r
119           LDRSH         r7,  [r5, #-20]                  @ load sig_lo[i-10]\r
120           SMLABB        r12, r9, r11, r12                @ sig_lo[i-7] * Aq[7]\r
121           LDRSH         r9, [r5, #-22]                   @ load sig_lo[i-11]\r
122           SMLABT        r12, r10, r11, r12               @ sig_lo[i-8] * Aq[8]\r
123           LDR           r11, [r13, #-20]                 @ Aq[10] -- Aq[9]\r
124           LDRSH         r10,[r5, #-24]                   @ load sig_lo[i-12]\r
125           SMLABB        r12, r6, r11, r12                @ sig_lo[i-9] * Aq[9]\r
126           LDRSH         r6, [r5, #-26]                   @ load sig_lo[i-13]\r
127           SMLABT        r12, r7, r11, r12                @ sig_lo[i-10] * Aq[10]\r
128           LDR           r11, [r13, #-24]                 @ Aq[12] -- Aq[11]\r
129           LDRSH         r7, [r5, #-28]                   @ load sig_lo[i-14]\r
130           SMLABB        r12, r9, r11, r12                @ sig_lo[i-11] * Aq[11]\r
131           LDRSH         r9, [r5, #-30]                   @ load sig_lo[i-15]\r
132           SMLABT        r12, r10, r11, r12               @ sig_lo[i-12] * Aq[12]\r
133 \r
134           LDR           r11, [r13, #-28]                 @ Aq[14] -- Aq[13]\r
135           LDRSH         r10, [r5, #-32]                  @ load sig_lo[i-16]\r
136           SMLABB        r12, r6, r11, r12                @ sig_lo[i-13] * Aq[13]\r
137           SMLABT        r12, r7, r11, r12                @ sig_lo[i-14] * Aq[14]\r
138  \r
139           LDR           r11, [r13, #-32]                 @ Aq[16] -- Aq[15]\r
140           LDRSH         r6, [r2],#2                      @ load exc[i] \r
141           SMLABB        r12, r9, r11, r12                @ sig_lo[i-15] * Aq[15]\r
142           SMLABT        r12, r10, r11, r12               @ sig_lo[i-16] * Aq[16]\r
143           MUL           r7, r6, r3                       @ exc[i] * a0 \r
144           RSB           r14, r12, #0                     @ L_tmp\r
145           MOV           r14, r14, ASR #11                @ L_tmp >>= 11\r
146           ADD           r14, r14, r7, LSL #1             @ L_tmp += (exc[i] * a0) << 1\r
147 \r
148 \r
149           LDRSH         r6, [r4, #-2]                    @ load sig_hi[i-1]\r
150           LDRSH         r7, [r4, #-4]                    @ load sig_hi[i-2]\r
151 \r
152           LDR           r11, [r13, #-4]                  @ Aq[2] -- Aq[1]        \r
153           LDRSH         r9, [r4, #-6]                    @ load sig_hi[i-3]\r
154           LDRSH         r10, [r4, #-8]                   @ load sig_hi[i-4]\r
155           SMULBB        r12, r6, r11                     @ sig_hi[i-1] * Aq[1]\r
156           LDRSH         r6, [r4, #-10]                   @ load sig_hi[i-5]\r
157           SMLABT        r12, r7, r11, r12                @ sig_hi[i-2] * Aq[2]\r
158 \r
159           LDR           r11, [r13, #-8]                  @ Aq[4] -- Aq[3]\r
160           LDRSH         r7, [r4, #-12]                   @ load sig_hi[i-6]\r
161 \r
162           SMLABB        r12, r9, r11, r12                @ sig_hi[i-3] * Aq[3]\r
163           LDRSH         r9, [r4, #-14]                   @ load sig_hi[i-7]\r
164 \r
165           SMLABT        r12, r10, r11, r12               @ sig_hi[i-4] * Aq[4]\r
166 \r
167           LDR           r11, [r13, #-12]                 @ Aq[6] -- Aq[5]\r
168           LDRSH         r10, [r4, #-16]                  @ load sig_hi[i-8]\r
169 \r
170           SMLABB        r12, r6, r11, r12                @ sig_hi[i-5] * Aq[5]\r
171 \r
172           LDRSH         r6,  [r4, #-18]                  @ load sig_hi[i-9]\r
173           SMLABT        r12, r7, r11, r12                @ sig_hi[i-6] * Aq[6]\r
174 \r
175           LDR           r11, [r13, #-16]                 @ Aq[8] -- Aq[7]\r
176           LDRSH         r7,  [r4, #-20]                  @ load sig_hi[i-10]\r
177 \r
178           SMLABB        r12, r9, r11, r12                @ sig_hi[i-7] * Aq[7]\r
179 \r
180           LDRSH         r9, [r4, #-22]                   @ load sig_hi[i-11]\r
181 \r
182           SMLABT        r12, r10, r11, r12               @ sig_hi[i-8] * Aq[8]\r
183 \r
184           LDR           r11, [r13, #-20]                 @ Aq[10] -- Aq[9]\r
185           LDRSH         r10,[r4, #-24]                   @ load sig_hi[i-12]\r
186 \r
187           SMLABB        r12, r6, r11, r12                @ sig_hi[i-9] * Aq[9]\r
188           LDRSH         r6, [r4, #-26]                   @ load sig_hi[i-13]\r
189           SMLABT        r12, r7, r11, r12                @ sig_hi[i-10] * Aq[10]\r
190 \r
191           LDR           r11, [r13, #-24]                 @ Aq[12] -- Aq[11]\r
192           LDRSH         r7, [r4, #-28]                   @ load sig_hi[i-14]\r
193           SMLABB        r12, r9, r11, r12                @ sig_hi[i-11] * Aq[11]\r
194           LDRSH         r9, [r4, #-30]                   @ load sig_hi[i-15]\r
195           SMLABT        r12, r10, r11, r12               @ sig_hi[i-12] * Aq[12]\r
196 \r
197           LDR           r11, [r13, #-28]                 @ Aq[14] -- Aq[13]\r
198           LDRSH         r10, [r4, #-32]                  @ load sig_hi[i-16]\r
199           SMLABB        r12, r6, r11, r12                @ sig_hi[i-13] * Aq[13]\r
200           SMLABT        r12, r7, r11, r12                @ sig_hi[i-14] * Aq[14]\r
201  \r
202           LDR           r11, [r13, #-32]                 @ Aq[16] -- Aq[15]\r
203           SMLABB        r12, r9, r11, r12                @ sig_hi[i-15] * Aq[15]\r
204           SMLABT        r12, r10, r11, r12               @ sig_hi[i-16] * Aq[16]       \r
205           ADD           r6, r12, r12                     @ r12 << 1\r
206           SUB           r14, r14, r6                     \r
207           MOV           r14, r14, LSL #3                 @ L_tmp <<=3\r
208   \r
209           MOV           r7, r14, ASR #16                 @ L_tmp >> 16\r
210 \r
211           MOV           r14, r14, ASR #4                 @ L_tmp >>=4\r
212           STRH          r7, [r4], #2                         @ sig_hi[i] = L_tmp >> 16\r
213           SUB           r9, r14, r7, LSL #12             @ sig_lo[i] = L_tmp - (sig_hi[i] << 12)\r
214 \r
215           ADD           r8, r8, #1\r
216           STRH          r9, [r5], #2   \r
217           CMP           r8, #64\r
218           BLT           LOOP                            \r
219          \r
220 Syn_filt_32_end:\r
221                      \r
222           LDMFD             r13!, {r4 - r12, r15} \r
223           @ENDFUNC\r
224           .END\r
225  \r
226 \r