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@static void cor_h_vec_012(
17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@		Word16 h[],                           /* (i) scaled impulse response                 */
18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@		Word16 vec[],                         /* (i) scaled vector (/8) to correlate with h[] */
19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@		Word16 track,                         /* (i) track to use                            */
20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@		Word16 sign[],                        /* (i) sign vector                             */
21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@		Word16 rrixix[][NB_POS],              /* (i) correlation of h[x] with h[x]      */
22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@		Word16 cor_1[],                       /* (o) result of correlation (NB_POS elements) */
23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@		Word16 cor_2[]                        /* (o) result of correlation (NB_POS elements) */
24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@)
25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@r0 ---- h[]
26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@r1 ---- vec[]
27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@r2 ---- track
28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@r3 ---- sign[]
29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@r4 ---- rrixix[][NB_POS]
30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@r5 ---- cor_1[]
31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard@r6 ---- cor_2[]
32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard          .section  .text
35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	  .global  cor_h_vec_012_asm
36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardcor_h_vec_012_asm:
38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         STMFD         r13!, {r4 - r12, r14}
40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 LDR           r4, [r13, #40]                    @load rrixix[][NB_POS]
41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 ADD           r7, r4, r2, LSL #5                @r7 --- p0 = rrixix[track]
42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         MOV           r4, #0                            @i=0
43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 @r0 --- h[], r1 --- vec[],  r2 --- pos
45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 @r3 --- sign[], r4 --- i, r7 --- p0
46e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardLOOPi:
47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         MOV           r5, #0                            @L_sum1 = 0
48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         MOV           r6, #0                            @L_sum2 = 0
49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         ADD           r9, r1, r2, LSL #1                @p2 = &vec[pos]
50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         MOV           r10, r0                           @p1 = h
51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         RSB           r11, r2, #62                      @j=62-pos
52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
53e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardLOOPj1:
54b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	 LDRSH         r12, [r10], #2
55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 LDRSH         r8,  [r9], #2
56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 LDRSH         r14, [r9]
57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 SUBS          r11, r11, #1
58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         MLA           r5, r12, r8, r5
59b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard         MLA           r6, r12, r14, r6
60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 BGE           LOOPj1
61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 LDRSH         r12, [r10], #2                     @*p1++
63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 MOV           r6, r6, LSL #2                     @L_sum2 = (L_sum2 << 2)
64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         MLA           r5, r12, r14, r5
65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         MOV           r14, #0x8000
66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         MOV           r5, r5, LSL #2                     @L_sum1 = (L_sum1 << 2)
67b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard         ADD           r10, r6, r14
68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         ADD           r9, r5, r14
69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         MOV           r5, r9, ASR #16
70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         MOV           r6, r10, ASR #16
71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         ADD           r9, r3, r2, LSL #1                 @address of sign[pos]
72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         ADD           r8, r7, #32
73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         LDRSH         r10, [r9], #2                 	  @sign[pos]
74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 LDRSH         r11, [r9]                          @sign[pos + 1]
75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 MUL           r12, r5, r10
76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 MUL           r14, r6, r11
77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 MOV           r5, r12, ASR #15
78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 MOV           r6, r14, ASR #15
79b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	 LDR           r9,  [r13, #44]
80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 LDR           r12, [r13, #48]
81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         LDRSH         r10, [r7], #2                      @*p0++
82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 LDRSH         r11, [r8]                          @*p3++
83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         ADD           r9, r9, r4, LSL #1
84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 ADD           r12, r12, r4, LSL #1
85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 ADD           r5, r5, r10
86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 ADD           r6, r6, r11
87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 STRH          r5, [r9]
88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 STRH          r6, [r12]
89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         ADD           r2, r2, #4
91b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         MOV           r5, #0                            @L_sum1 = 0
93e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 MOV           r6, #0                            @L_sum2 = 0
94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 ADD           r9, r1, r2, LSL #1                @p2 = &vec[pos]
95e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 MOV           r10, r0                           @p1 = h
96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 RSB           r11, r2, #62                      @j=62-pos
97e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 ADD           r4, r4, #1                        @i++
98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
99e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardLOOPj2:
100b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	 LDRSH         r12, [r10], #2
101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 LDRSH         r8,  [r9], #2
102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 LDRSH         r14, [r9]
103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 SUBS          r11, r11, #1
104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         MLA           r5, r12, r8, r5
105b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard         MLA           r6, r12, r14, r6
106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 BGE           LOOPj2
107e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 LDRSH         r12, [r10], #2                     @*p1++
109e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 MOV           r6, r6, LSL #2                     @L_sum2 = (L_sum2 << 2)
110e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         MLA           r5, r12, r14, r5
111e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         MOV           r14, #0x8000
112e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         MOV           r5, r5, LSL #2                     @L_sum1 = (L_sum1 << 2)
113b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard         ADD           r10, r6, r14
114e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         ADD           r9, r5, r14
115e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
116e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         MOV           r5, r9, ASR #16
117e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         MOV           r6, r10, ASR #16
118e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         ADD           r9, r3, r2, LSL #1                 @address of sign[pos]
119e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         ADD           r8, r7, #32
120e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         LDRSH         r10, [r9], #2                 	  @sign[pos]
121e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 LDRSH         r11, [r9]                          @sign[pos + 1]
122e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 MUL           r12, r5, r10
123e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 MUL           r14, r6, r11
124e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 MOV           r5, r12, ASR #15
125e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 MOV           r6, r14, ASR #15
126b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	 LDR           r9,  [r13, #44]
127e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 LDR           r12, [r13, #48]
128e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         LDRSH         r10, [r7], #2                      @*p0++
129e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 LDRSH         r11, [r8]                          @*p3++
130e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         ADD           r9, r9, r4, LSL #1
131e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 ADD           r12, r12, r4, LSL #1
132e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 ADD           r5, r5, r10
133e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 ADD           r6, r6, r11
134e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 STRH          r5, [r9]
135e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 STRH          r6, [r12]
136e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 ADD           r4, r4, #1                         @i+1
137e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 ADD           r2, r2, #4                         @pos += STEP
138e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 CMP           r4, #16
139b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
140e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 BLT           LOOPi
141b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
142e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardthe_end:
143e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         LDMFD         r13!, {r4 - r12, r15}
144b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
145e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard         @ENDFUNC
1463f7149c1c8f211c9ef5eb6c4012f078d9d08387bChih-Hung Hsieh         .end
147b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
148b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
149b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard
150e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
151e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
152