1219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard@/*
2219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard@ ** Copyright 2003-2010, VisualOn, Inc.
3219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard@ **
4219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard@ ** Licensed under the Apache License, Version 2.0 (the "License");
5219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard@ ** you may not use this file except in compliance with the License.
6219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard@ ** You may obtain a copy of the License at
7219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard@ **
8219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard@ **     http://www.apache.org/licenses/LICENSE-2.0
9219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard@ **
10219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard@ ** Unless required by applicable law or agreed to in writing, software
11219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard@ ** distributed under the License is distributed on an "AS IS" BASIS,
12219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard@ ** See the License for the specific language governing permissions and
14219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard@ ** limitations under the License.
15219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard@ */
16219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
17219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard@**********************************************************************/
18219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard@void Filt_6k_7k(
19219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard@     Word16 signal[],                      /* input:  signal                  */
20219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard@     Word16 lg,                            /* input:  length of input         */
21219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard@     Word16 mem[]                          /* in/out: memory (size=30)        */
22219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard@)
23219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard@******************************************************************
24219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard@ r0    ---  signal[]
25219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard@ r1    ---  lg
26219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard@ r2    ---  mem[]
27219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
28219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          .section  .text
29219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          .global  Filt_6k_7k_asm
30219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          .extern  voAWB_Copy
31219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          .extern  fir_6k_7k
32219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
33219e2627f1e062c10645664b0d2470d4dfaf5083Mans RullgardFilt_6k_7k_asm:
34219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
35219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          STMFD   		r13!, {r4 - r12, r14}
36219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          SUB    		r13, r13, #240              @ x[L_SUBFR16k + (L_FIR - 1)]
37219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          MOV     		r8, r0                      @ copy signal[] address
38219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          MOV     		r4, r1                      @ copy lg address
39219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          MOV     		r5, r2                      @ copy mem[] address
40219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
41219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          MOV     		r1, r13
42219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          MOV     		r0, r2
43219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          MOV     		r2, #30                     @ L_FIR - 1
44219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          BL      		voAWB_Copy                   @ memcpy(x, mem, (L_FIR - 1)<<1)
45219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
46219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDR     		r10, Lable1                 @ get fir_7k address
47219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
48219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          MOV           	r14, #0
49219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          MOV                   r3, r8                      @ change myMemCopy to Copy, due to Copy will change r3 content
50219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          ADD     	    	r6, r13, #60                @ get x[L_FIR - 1] address
51219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          MOV           	r7, r3                      @ get signal[i]
52219e2627f1e062c10645664b0d2470d4dfaf5083Mans RullgardLOOP1:
53219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH         	r8,  [r7], #2
54219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH         	r9,  [r7], #2
55219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          MOV           	r8, r8, ASR #2
56219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          MOV           	r9, r9, ASR #2
57219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH         	r11, [r7], #2
58219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH         	r12, [r7], #2
59219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          MOV           	r11, r11, ASR #2
60219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          MOV           	r12, r12, ASR #2
61219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          STRH          	r8, [r6], #2
62219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          STRH          	r9, [r6], #2
63219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          STRH          	r11, [r6], #2
64219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          STRH          	r12, [r6], #2
65219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH         	r8,  [r7], #2
66219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH         	r9,  [r7], #2
67219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          MOV           	r8, r8, ASR #2
68219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          MOV           	r9, r9, ASR #2
69219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH         	r11, [r7], #2
70219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH         	r12, [r7], #2
71219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          MOV           	r11, r11, ASR #2
72219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          MOV           	r12, r12, ASR #2
73219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          STRH          	r8, [r6], #2
74219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          STRH          	r9, [r6], #2
75219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          STRH          	r11, [r6], #2
76219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          STRH          	r12, [r6], #2
77219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          ADD           	r14, r14, #8
78219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          CMP           	r14, #80
79219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          BLT           	LOOP1
80219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
81219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
82219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          STR     		r5, [sp, #-4]               @ PUSH  r5 to stack
83219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
84219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          @ not use registers: r4, r10, r12, r14, r5
85219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          MOV     		r4, r13
86219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          MOV     		r5, #0                      @ i = 0
87219e2627f1e062c10645664b0d2470d4dfaf5083Mans RullgardLOOP2:
88219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDR           	r0, [r10]
89219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
90219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH  	        r1, [r4]                   @ load x[i]
91219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH   	        r2, [r4, #60]              @ load x[i + 30]
92219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r6, [r4, #2]               @ load x[i + 1]
93219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r7, [r4, #58]              @ load x[i + 29]
94219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          ADD                   r1, r1, r2                 @ x[i] + x[i + 30]
95219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          ADD                   r6, r6, r7                 @ x[i + 1] + x[i + 29]
96219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r8, [r4, #4]               @ load x[i + 2]
97219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r9, [r4, #56]              @ load x[i + 28]
98219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
99219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          SMULBB                r14, r1, r0                @ (x[i] + x[i + 30]) * fir_7k[0]
100219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          ADD                   r8, r8, r9                 @ x[i + 2] + x[i + 28]
101219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          SMLABT                r14, r6, r0, r14           @ (x[i + 1] + x[i + 29]) * fir_7k[1]
102219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
103219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDR                   r0, [r10, #4]
104219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r1, [r4, #6]               @ load x[i+3]
105219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r2, [r4, #54]              @ load x[i+27]
106219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r6, [r4, #8]               @ load x[i+4]
107219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r7, [r4, #52]              @ load x[i+26]
108219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          ADD                   r1, r1, r2                 @ x[i+3] + x[i+27]
109219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          ADD                   r6, r6, r7                 @ x[i+4] + x[i+26]
110219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          SMLABB                r14, r8, r0, r14           @ (x[i + 2] + x[i + 28]) * fir_7k[2]
111219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r8, [r4, #10]              @ load x[i+5]
112219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r9, [r4, #50]              @ load x[i+25]
113219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          SMLABT                r14, r1, r0, r14           @ (x[i+3] + x[i+27]) * fir_7k[3]
114219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          ADD                   r8, r8, r9                 @ x[i+5] + x[i+25]
115219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
116219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDR                   r0, [r10, #8]
117219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r1, [r4, #12]              @ x[i+6]
118219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r2, [r4, #48]              @ x[i+24]
119219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          SMLABB                r14, r6, r0, r14           @ (x[i+4] + x[i+26]) * fir_7k[4]
120219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r6, [r4, #14]              @ x[i+7]
121219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r7, [r4, #46]              @ x[i+23]
122219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          SMLABT                r14, r8, r0, r14           @ (x[i+5] + x[i+25]) * fir_7k[5]
123219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDR                   r0, [r10, #12]
124219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          ADD                   r1, r1, r2                 @ (x[i+6] + x[i+24])
125219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          ADD                   r6, r6, r7                 @ (x[i+7] + x[i+23])
126219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          SMLABB                r14, r1, r0, r14           @ (x[i+6] + x[i+24]) * fir_7k[6]
127219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r8, [r4, #16]              @ x[i+8]
128219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r9, [r4, #44]              @ x[i+22]
129219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          SMLABT                r14, r6, r0, r14           @ (x[i+7] + x[i+23]) * fir_7k[7]
130219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDR                   r0, [r10, #16]
131219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r1, [r4, #18]              @ x[i+9]
132219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r2, [r4, #42]              @ x[i+21]
133219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r6, [r4, #20]              @ x[i+10]
134219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r7, [r4, #40]              @ x[i+20]
135219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          ADD                   r8, r8, r9                 @ (x[i+8] + x[i+22])
136219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          ADD                   r1, r1, r2                 @ (x[i+9] + x[i+21])
137219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          ADD                   r6, r6, r7                 @ (x[i+10] + x[i+20])
138219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          SMLABB                r14, r8, r0, r14           @ (x[i+8] + x[i+22]) * fir_7k[8]
139219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r8, [r4, #22]              @ x[i+11]
140219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r9, [r4, #38]              @ x[i+19]
141219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          SMLABT                r14, r1, r0, r14           @ (x[i+9] + x[i+21]) * fir_7k[9]
142219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDR                   r0, [r10, #20]
143219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r1, [r4, #24]              @ x[i+12]
144219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r2, [r4, #36]              @ x[i+18]
145219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          SMLABB                r14, r6, r0, r14           @ (x[i+10] + x[i+20]) * fir_7k[10]
146219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r6, [r4, #26]              @ x[i+13]
147219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          ADD                   r8, r8, r9                 @ (x[i+11] + x[i+19])
148219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r7, [r4, #34]              @ x[i+17]
149219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          SMLABT                r14, r8, r0, r14           @ (x[i+11] + x[i+19]) * fir_7k[11]
150219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDR                   r0, [r10, #24]
151219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          ADD                   r1, r1, r2                 @ x[i+12] + x[i+18]
152219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r8, [r4, #28]              @ x[i+14]
153219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          SMLABB                r14, r1, r0, r14           @ (x[i+12] + x[i+18]) * fir_7k[12]
154219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          ADD                   r6, r6, r7                 @ (x[i+13] + x[i+17])
155219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r9, [r4, #32]              @ x[i+16]
156219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          SMLABT                r14, r6, r0, r14           @ (x[i+13] + x[i+17]) * fir_7k[13]
157219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDR                   r0, [r10, #28]
158219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          ADD                   r8, r8, r9                 @ (x[i+14] + x[i+16])
159219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDRSH                 r1, [r4, #30]              @ x[i+15]
160219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          SMLABB                r14, r8, r0, r14           @ (x[i+14] + x[i+16]) * fir_7k[14]
161219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          SMLABT                r14, r1, r0, r14           @ x[i+15] * fir_7k[15]
162219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
163219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          ADD     		r5, r5, #1
164219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          ADD     		r14, r14, #0x4000
165219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          ADD     		r4, r4, #2
166219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          MOV     		r1, r14, ASR #15
167219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          CMP     		r5, #80
168219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          STRH    		r1, [r3], #2               @signal[i] = (L_tmp + 0x4000) >> 15
169219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          BLT     		LOOP2
170219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
171219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDR     		r1, [sp, #-4]               @mem address
172219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          ADD     		r0, r13, #160               @x + lg
173219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          MOV     		r2, #30
174219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          BL      		voAWB_Copy
175219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
176219e2627f1e062c10645664b0d2470d4dfaf5083Mans RullgardFilt_6k_7k_end:
177219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          ADD     		r13, r13, #240
178219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          LDMFD   		r13!, {r4 - r12, r15}
179219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
180219e2627f1e062c10645664b0d2470d4dfaf5083Mans RullgardLable1:
181219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          .word   		fir_6k_7k
182219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          @ENDFUNC
183219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard          .END
184219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
185219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
186