1 @/* 2 @ ** Copyright 2003-2010, VisualOn, Inc. 3 @ ** 4 @ ** Licensed under the Apache License, Version 2.0 (the "License"); 5 @ ** you may not use this file except in compliance with the License. 6 @ ** You may obtain a copy of the License at 7 @ ** 8 @ ** http://www.apache.org/licenses/LICENSE-2.0 9 @ ** 10 @ ** Unless required by applicable law or agreed to in writing, software 11 @ ** distributed under the License is distributed on an "AS IS" BASIS, 12 @ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 @ ** See the License for the specific language governing permissions and 14 @ ** limitations under the License. 15 @ */ 16 @ 17 @**********************************************************************/ 18 @void Filt_6k_7k( 19 @ Word16 signal[], /* input: signal */ 20 @ Word16 lg, /* input: length of input */ 21 @ Word16 mem[] /* in/out: memory (size=30) */ 22 @) 23 @*********************************************************************** 24 @ r0 --- signal[] 25 @ r1 --- lg 26 @ r2 --- mem[] 27 28 .section .text 29 .global Filt_6k_7k_asm 30 .extern fir_6k_7k 31 32 Filt_6k_7k_asm: 33 34 STMFD r13!, {r0 - r12, r14} 35 SUB r13, r13, #240 @ x[L_SUBFR16k + (L_FIR - 1)] 36 MOV r8, r0 @ copy signal[] address 37 MOV r5, r2 @ copy mem[] address 38 39 MOV r0, r2 40 MOV r1, r13 41 42 VLD1.S16 {D0, D1, D2, D3}, [r0]! 43 VLD1.S16 {D4, D5, D6, D7}, [r0]! 44 45 VST1.S16 {D0, D1, D2, D3}, [r1]! 46 VST1.S16 {D4, D5, D6}, [r1]! 47 VST1.S16 D7[0], [r1]! 48 VST1.S16 D7[1], [r1]! 49 50 51 52 ADR r3, Lable1 @ get fir_7k address 53 LDR r10, [r3] 54 ADD r10, r3 55 MOV r3, r8 @ change myMemCopy to Copy, due to Copy will change r3 content 56 ADD r6, r13, #60 @ get x[L_FIR - 1] address 57 MOV r7, r3 @ get signal[i] 58 @for (i = lg - 1@ i >= 0@ i--) 59 @{ 60 @ x[i + L_FIR - 1] = signal[i] >> 2@ 61 @} 62 VLD1.S16 {Q0, Q1}, [r7]! @ signal[0] ~ signal[15] 63 VLD1.S16 {Q2, Q3}, [r7]! @ signal[16] ~ signal[31] 64 VLD1.S16 {Q4, Q5}, [r7]! @ signal[32] ~ signal[47] 65 VLD1.S16 {Q6, Q7}, [r7]! @ signal[48] ~ signal[63] 66 VLD1.S16 {Q8, Q9}, [r7]! @ signal[64] ~ signal[79] 67 VSHR.S16 Q10, Q0, #2 68 VSHR.S16 Q11, Q1, #2 69 VSHR.S16 Q12, Q2, #2 70 VSHR.S16 Q13, Q3, #2 71 VST1.S16 {Q10, Q11}, [r6]! 72 VSHR.S16 Q0, Q4, #2 73 VSHR.S16 Q1, Q5, #2 74 VSHR.S16 Q10, Q6, #2 75 VSHR.S16 Q11, Q7, #2 76 VSHR.S16 Q2, Q8, #2 77 VSHR.S16 Q3, Q9, #2 78 VST1.S16 {Q12, Q13}, [r6]! 79 VST1.S16 {Q0, Q1}, [r6]! 80 VST1.S16 {Q10, Q11}, [r6]! 81 VST1.S16 {Q2, Q3}, [r6]! 82 83 MOV r12, r5 84 @STR r5, [sp, #-4] @ PUSH r5 to stack 85 @ not use registers: r4, r10, r12, r14, r5 86 MOV r4, r13 87 MOV r5, #0 @ i = 0 88 89 @ r4 --- x[i], r10 ---- fir_6k_7k 90 VLD1.S16 {Q0, Q1}, [r10]! @fir_6k_7k[0] ~ fir_6k_7k[15] 91 VLD1.S16 {Q2, Q3}, [r10]! @fir_6k_7k[16] ~ fir_6k_7k[31] 92 VMOV.S16 D7[3], r5 @set fir_6k_7K = 0 93 94 VLD1.S16 {Q4, Q5}, [r4]! @x[0] ~ x[15] 95 VLD1.S16 {Q6, Q7}, [r4]! @x[16] ~ X[31] 96 VLD1.S16 {Q8}, [r4]! 97 VMOV.S16 Q15, #0 98 99 LOOP_6K7K: 100 101 VMULL.S16 Q9,D8,D0[0] 102 VMULL.S16 Q10,D9,D1[0] 103 VMULL.S16 Q11,D9,D0[0] 104 VMULL.S16 Q12,D10,D1[0] 105 VEXT.8 Q4,Q4,Q5,#2 106 VMLAL.S16 Q9,D10,D2[0] 107 VMLAL.S16 Q10,D11,D3[0] 108 VMLAL.S16 Q11,D11,D2[0] 109 VMLAL.S16 Q12,D12,D3[0] 110 VEXT.8 Q5,Q5,Q6,#2 111 VMLAL.S16 Q9,D12,D4[0] 112 VMLAL.S16 Q10,D13,D5[0] 113 VMLAL.S16 Q11,D13,D4[0] 114 VMLAL.S16 Q12,D14,D5[0] 115 VEXT.8 Q6,Q6,Q7,#2 116 VMLAL.S16 Q9,D14,D6[0] 117 VMLAL.S16 Q10,D15,D7[0] 118 VMLAL.S16 Q11,D15,D6[0] 119 VMLAL.S16 Q12,D16,D7[0] 120 VEXT.8 Q7,Q7,Q8,#2 121 122 VMLAL.S16 Q9,D8,D0[1] 123 VMLAL.S16 Q10,D9,D1[1] 124 VEXT.8 Q8,Q8,Q15,#2 125 VMLAL.S16 Q11,D9,D0[1] 126 VMLAL.S16 Q12,D10,D1[1] 127 VEXT.8 Q4,Q4,Q5,#2 128 VMLAL.S16 Q9,D10,D2[1] 129 VMLAL.S16 Q10,D11,D3[1] 130 VMLAL.S16 Q11,D11,D2[1] 131 VMLAL.S16 Q12,D12,D3[1] 132 VEXT.8 Q5,Q5,Q6,#2 133 VMLAL.S16 Q9,D12,D4[1] 134 VMLAL.S16 Q10,D13,D5[1] 135 VMLAL.S16 Q11,D13,D4[1] 136 VMLAL.S16 Q12,D14,D5[1] 137 VEXT.8 Q6,Q6,Q7,#2 138 VMLAL.S16 Q9,D14,D6[1] 139 VMLAL.S16 Q10,D15,D7[1] 140 VMLAL.S16 Q11,D15,D6[1] 141 VMLAL.S16 Q12,D16,D7[1] 142 VEXT.8 Q7,Q7,Q8,#2 143 144 VMLAL.S16 Q9,D8,D0[2] 145 VMLAL.S16 Q10,D9,D1[2] 146 VEXT.8 Q8,Q8,Q15,#2 147 VMLAL.S16 Q11,D9,D0[2] 148 VMLAL.S16 Q12,D10,D1[2] 149 VEXT.8 Q4,Q4,Q5,#2 150 VMLAL.S16 Q9,D10,D2[2] 151 VMLAL.S16 Q10,D11,D3[2] 152 VMLAL.S16 Q11,D11,D2[2] 153 VMLAL.S16 Q12,D12,D3[2] 154 VEXT.8 Q5,Q5,Q6,#2 155 VMLAL.S16 Q9,D12,D4[2] 156 VMLAL.S16 Q10,D13,D5[2] 157 VMLAL.S16 Q11,D13,D4[2] 158 VMLAL.S16 Q12,D14,D5[2] 159 VEXT.8 Q6,Q6,Q7,#2 160 VMLAL.S16 Q9,D14,D6[2] 161 VMLAL.S16 Q10,D15,D7[2] 162 VMLAL.S16 Q11,D15,D6[2] 163 VMLAL.S16 Q12,D16,D7[2] 164 VEXT.8 Q7,Q7,Q8,#2 165 166 VMLAL.S16 Q9,D8,D0[3] 167 VMLAL.S16 Q10,D9,D1[3] 168 VEXT.8 Q8,Q8,Q15,#2 169 VMLAL.S16 Q11,D9,D0[3] 170 VMLAL.S16 Q12,D10,D1[3] 171 VEXT.8 Q4,Q4,Q5,#2 172 VMLAL.S16 Q9,D10,D2[3] 173 VMLAL.S16 Q10,D11,D3[3] 174 VMLAL.S16 Q11,D11,D2[3] 175 VMLAL.S16 Q12,D12,D3[3] 176 VEXT.8 Q5,Q5,Q6,#2 177 VMLAL.S16 Q9,D12,D4[3] 178 VMLAL.S16 Q10,D13,D5[3] 179 VMLAL.S16 Q11,D13,D4[3] 180 VMLAL.S16 Q12,D14,D5[3] 181 VEXT.8 Q6,Q6,Q7,#2 182 VMLAL.S16 Q9,D14,D6[3] 183 VMLAL.S16 Q10,D15,D7[3] 184 VMLAL.S16 Q11,D15,D6[3] 185 VMLAL.S16 Q12,D16,D7[3] 186 VEXT.8 Q7,Q7,Q8,#2 187 188 VMOV.S16 D8,D9 189 VEXT.8 Q8,Q8,Q15,#2 190 VMOV.S16 D9,D10 191 VADD.S32 Q9,Q9,Q10 192 VMOV.S16 D10,D11 193 VMOV.S16 D11,D12 194 VADD.S32 Q11,Q11,Q12 195 VMOV.S16 D12,D13 196 VQRSHRN.S32 D28,Q9,#15 197 VMOV.S16 D13,D14 198 VMOV.S16 D14,D15 199 VQRSHRN.S32 D29,Q11,#15 200 VMOV.S16 D15,D16 201 202 VLD1.S16 {Q8},[r4]! 203 ADD r5, r5, #8 204 CMP r5, #80 205 VST1.S16 {D28,D29},[r3]! 206 BLT LOOP_6K7K 207 208 ADD r0, r13, #160 @x + lg 209 MOV r1, r12 210 @LDR r1, [sp, #-4] @mem address 211 212 VLD1.S16 {D0, D1, D2, D3}, [r0]! 213 VLD1.S16 {D4, D5, D6, D7}, [r0]! 214 215 VST1.S16 {D0, D1, D2, D3}, [r1]! 216 VST1.S16 {D4, D5, D6}, [r1]! 217 VST1.S16 D7[0], [r1]! 218 VST1.S16 D7[1], [r1]! 219 220 Filt_6k_7k_end: 221 222 ADD r13, r13, #240 223 LDMFD r13!, {r0 - r12, r15} 224 225 Lable1: 226 .word fir_6k_7k-Lable1 227 @ENDFUNC 228 .END 229 230 231