1956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@/*
2956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** Copyright 2003-2010, VisualOn, Inc.
3956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ **
4956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** Licensed under the Apache License, Version 2.0 (the "License");
5956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** you may not use this file except in compliance with the License.
6956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** You may obtain a copy of the License at
7956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ **
8956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ **     http://www.apache.org/licenses/LICENSE-2.0
9956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ **
10956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** Unless required by applicable law or agreed to in writing, software
11956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** distributed under the License is distributed on an "AS IS" BASIS,
12956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** See the License for the specific language governing permissions and
14956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ ** limitations under the License.
15956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ */
16956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@
17956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@*void Convolve (
18956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@*    Word16 x[],        /* (i)     : input vector                           */
19956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@*    Word16 h[],        /* (i)     : impulse response                       */
20956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@*    Word16 y[],        /* (o)     : output vector                          */
21956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@*    Word16 L           /* (i)     : vector size                            */
22956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@*)
23b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard@
24956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ r0 --- x[]
25956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ r1 --- h[]
26956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ r2 --- y[]
27956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong@ r3 --- L
28956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
29b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	.section  .text
30b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        .global   Convolve_asm
31956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
32956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongConvolve_asm:
33956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
34b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        STMFD          r13!, {r4 - r12, r14}
35b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        MOV            r3,  #0
36956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong	MOV            r11, #0x8000
37b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
38b676a05348e4c516fa8b57e33b10548e6142c3f8Mans RullgardLOOP:
39956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        @MOV            r8, #0                            @ s = 0
40956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        ADD            r4, r1, r3, LSL #1                @ tmpH address
41956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        ADD            r5, r3, #1                        @ i = n + 1
42956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        MOV            r6, r0
43956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        LDRSH          r9,  [r6], #2                     @ *tmpX++
44956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        LDRSH          r10, [r4]                         @ *tmpH--
45956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        SUB            r5, r5, #1
46b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        VMOV.S32       Q10, #0
47b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        MUL            r8,  r9, r10
48956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
49b676a05348e4c516fa8b57e33b10548e6142c3f8Mans RullgardLOOP1:
50956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        CMP            r5, #0
51956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        BLE            L1
52956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        SUB            r4, r4, #8
53956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        MOV            r9, r4
54b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        VLD1.S16       D0, [r6]!
55956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VLD1.S16       D1, [r9]!
56956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VREV64.16      D1, D1
57b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        SUBS           r5, r5, #4
58b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        VMLAL.S16      Q10, D0, D1
59b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        B              LOOP1
60b676a05348e4c516fa8b57e33b10548e6142c3f8Mans RullgardL1:
61956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VADD.S32       D20, D20, D21
62956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VPADD.S32      D20, D20, D20
63956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMOV.S32       r5, D20[0]
64956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        ADD            r5, r5, r8
65956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        ADD            r5, r11, r5, LSL #1
66956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        MOV            r5, r5, LSR #16                   @extract_h(s)
67956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        ADD            r3, r3, #1
68956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        STRH           r5, [r2], #2                      @y[n]
69956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
70956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
71956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        @MOV            r8, #0
72956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        ADD            r4, r1, r3, LSL #1                @tmpH address
73956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        ADD            r5, r3, #1
74956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        MOV            r6, r0
75956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        LDRSH          r9,  [r6], #2                     @ *tmpX++
76b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        LDRSH          r10, [r4], #-2
77956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        LDRSH          r12, [r6], #2
78956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        LDRSH          r14, [r4]
79956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
80956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        MUL            r8, r9, r10
81956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        SUB            r5, r5, #2
82956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        MLA            r8, r12, r14, r8
83b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
84956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMOV.S32       Q10, #0
85956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongLOOP2:
86956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        CMP            r5, #0
87956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        BLE            L2
88956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        SUB            r4, r4, #8
89956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        MOV            r9, r4
90b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        VLD1.S16       D0, [r6]!
91956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VLD1.S16       D1, [r9]!
92956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        SUBS           r5, r5, #4
93956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VREV64.16      D1, D1
94b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        VMLAL.S16      Q10, D0, D1
95956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        B              LOOP2
96956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongL2:
97956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VADD.S32       D20, D20, D21
98956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VPADD.S32      D20, D20, D20
99956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMOV.S32       r5, D20[0]
100956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        ADD            r8, r8, r5
101956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        ADD            r8, r11, r8, LSL #1
102956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        MOV            r8, r8, LSR #16                   @extract_h(s)
103b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        ADD            r3, r3, #1
104956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        STRH           r8, [r2], #2                      @y[n]
105956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
106956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
107956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        @MOV            r8, #0
108956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        ADD            r4, r1, r3, LSL #1
109956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        ADD            r5, r3, #1
110956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        MOV            r6, r0
111956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        LDRSH          r9,  [r6], #2
112956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        LDRSH          r10, [r4], #-2
113956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        LDRSH          r12, [r6], #2
114956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        LDRSH          r14, [r4], #-2
115956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        MUL            r8, r9, r10
116956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        LDRSH          r9,  [r6], #2
117956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        LDRSH          r10, [r4]
118b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        MLA            r8, r12, r14, r8
119956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        SUB            r5, r5, #3
120956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        MLA            r8, r9, r10, r8
121956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
122956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMOV.S32       Q10, #0
123956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongLOOP3:
124956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        CMP            r5, #0
125956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        BLE            L3
126956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        SUB            r4, r4, #8
127956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        MOV            r9, r4
128b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        VLD1.S16       D0, [r6]!
129956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VLD1.S16       D1, [r9]!
130956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VREV64.16      D1, D1
131956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        SUBS           r5, r5, #4
132b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        VMLAL.S16      Q10, D0, D1
133b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        B              LOOP3
134956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
135956c553ab0ce72f8074ad0fda2ffd66a0305700cJames DongL3:
136956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VADD.S32       D20, D20, D21
137956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VPADD.S32      D20, D20, D20
138956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMOV.S32       r5, D20[0]
139956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        ADD            r8, r8, r5
140956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        ADD            r8, r11, r8, LSL #1
141956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        MOV            r8, r8, LSR #16                   @extract_h(s)
142956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        ADD            r3, r3, #1
143956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        STRH           r8, [r2], #2                      @y[n]
144956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
145956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        ADD            r5, r3, #1                        @ i = n + 1
146956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        ADD            r4, r1, r5, LSL #1                @ tmpH address
147956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        MOV            r6, r0
148956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMOV.S32       Q10, #0
149b676a05348e4c516fa8b57e33b10548e6142c3f8Mans RullgardLOOP4:
150956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        CMP            r5, #0
151956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        BLE            L4
152956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        SUB            r4, r4, #8
153956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        MOV            r9, r4
154b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        VLD1.S16       D0, [r6]!
155956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VLD1.S16       D1, [r9]!
156956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VREV64.16      D1, D1
157b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        SUBS           r5, r5, #4
158b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        VMLAL.S16      Q10, D0, D1
159b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard        B              LOOP4
160b676a05348e4c516fa8b57e33b10548e6142c3f8Mans RullgardL4:
161956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VADD.S32       D20, D20, D21
162956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VPADD.S32      D20, D20, D20
163956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        VMOV.S32       r5,  D20[0]
164956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        ADD            r5, r11, r5, LSL #1
165956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        MOV            r5, r5, LSR #16                   @extract_h(s)
166956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        ADD            r3, r3, #1
167956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        STRH           r5, [r2], #2                      @y[n]
168b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
169956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        CMP            r3, #64
170956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        BLT            LOOP
171b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
172b676a05348e4c516fa8b57e33b10548e6142c3f8Mans RullgardConvolve_asm_end:
173b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
174956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        LDMFD      r13!, {r4 - r12, r15}
175b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
176956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        @ENDFUNC
177956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong        .END
178956c553ab0ce72f8074ad0fda2ffd66a0305700cJames Dong
179