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