Filt_6k_7k_neon.s revision 41050cdb033641ddf26831d9272c0930f7b40a2d
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 32Filt_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 LDR r10, Lable1 @ get fir_7k address 53 MOV r3, r8 @ change myMemCopy to Copy, due to Copy will change r3 content 54 ADD r6, r13, #60 @ get x[L_FIR - 1] address 55 MOV r7, r3 @ get signal[i] 56 @for (i = lg - 1@ i >= 0@ i--) 57 @{ 58 @ x[i + L_FIR - 1] = signal[i] >> 2@ 59 @} 60 VLD1.S16 {Q0, Q1}, [r7]! @ signal[0] ~ signal[15] 61 VLD1.S16 {Q2, Q3}, [r7]! @ signal[16] ~ signal[31] 62 VLD1.S16 {Q4, Q5}, [r7]! @ signal[32] ~ signal[47] 63 VLD1.S16 {Q6, Q7}, [r7]! @ signal[48] ~ signal[63] 64 VLD1.S16 {Q8, Q9}, [r7]! @ signal[64] ~ signal[79] 65 VSHR.S16 Q10, Q0, #2 66 VSHR.S16 Q11, Q1, #2 67 VSHR.S16 Q12, Q2, #2 68 VSHR.S16 Q13, Q3, #2 69 VST1.S16 {Q10, Q11}, [r6]! 70 VSHR.S16 Q0, Q4, #2 71 VSHR.S16 Q1, Q5, #2 72 VSHR.S16 Q10, Q6, #2 73 VSHR.S16 Q11, Q7, #2 74 VSHR.S16 Q2, Q8, #2 75 VSHR.S16 Q3, Q9, #2 76 VST1.S16 {Q12, Q13}, [r6]! 77 VST1.S16 {Q0, Q1}, [r6]! 78 VST1.S16 {Q10, Q11}, [r6]! 79 VST1.S16 {Q2, Q3}, [r6]! 80 81 MOV r12, r5 82 @STR r5, [sp, #-4] @ PUSH r5 to stack 83 @ not use registers: r4, r10, r12, r14, r5 84 MOV r4, r13 85 MOV r5, #0 @ i = 0 86 87 @ r4 --- x[i], r10 ---- fir_6k_7k 88 VLD1.S16 {Q0, Q1}, [r10]! @fir_6k_7k[0] ~ fir_6k_7k[15] 89 VLD1.S16 {Q2, Q3}, [r10]! @fir_6k_7k[16] ~ fir_6k_7k[31] 90 VMOV.S16 D7[3], r5 @set fir_6k_7K = 0 91 92 VLD1.S16 {Q4, Q5}, [r4]! @x[0] ~ x[15] 93 VLD1.S16 {Q6, Q7}, [r4]! @x[16] ~ X[31] 94 VLD1.S16 {Q8}, [r4]! 95 VMOV.S16 Q15, #0 96 97LOOP_6K7K: 98 99 VMULL.S16 Q9,D8,D0[0] 100 VMULL.S16 Q10,D9,D1[0] 101 VMULL.S16 Q11,D9,D0[0] 102 VMULL.S16 Q12,D10,D1[0] 103 VEXT.8 Q4,Q4,Q5,#2 104 VMLAL.S16 Q9,D10,D2[0] 105 VMLAL.S16 Q10,D11,D3[0] 106 VMLAL.S16 Q11,D11,D2[0] 107 VMLAL.S16 Q12,D12,D3[0] 108 VEXT.8 Q5,Q5,Q6,#2 109 VMLAL.S16 Q9,D12,D4[0] 110 VMLAL.S16 Q10,D13,D5[0] 111 VMLAL.S16 Q11,D13,D4[0] 112 VMLAL.S16 Q12,D14,D5[0] 113 VEXT.8 Q6,Q6,Q7,#2 114 VMLAL.S16 Q9,D14,D6[0] 115 VMLAL.S16 Q10,D15,D7[0] 116 VMLAL.S16 Q11,D15,D6[0] 117 VMLAL.S16 Q12,D16,D7[0] 118 VEXT.8 Q7,Q7,Q8,#2 119 120 VMLAL.S16 Q9,D8,D0[1] 121 VMLAL.S16 Q10,D9,D1[1] 122 VEXT.8 Q8,Q8,Q15,#2 123 VMLAL.S16 Q11,D9,D0[1] 124 VMLAL.S16 Q12,D10,D1[1] 125 VEXT.8 Q4,Q4,Q5,#2 126 VMLAL.S16 Q9,D10,D2[1] 127 VMLAL.S16 Q10,D11,D3[1] 128 VMLAL.S16 Q11,D11,D2[1] 129 VMLAL.S16 Q12,D12,D3[1] 130 VEXT.8 Q5,Q5,Q6,#2 131 VMLAL.S16 Q9,D12,D4[1] 132 VMLAL.S16 Q10,D13,D5[1] 133 VMLAL.S16 Q11,D13,D4[1] 134 VMLAL.S16 Q12,D14,D5[1] 135 VEXT.8 Q6,Q6,Q7,#2 136 VMLAL.S16 Q9,D14,D6[1] 137 VMLAL.S16 Q10,D15,D7[1] 138 VMLAL.S16 Q11,D15,D6[1] 139 VMLAL.S16 Q12,D16,D7[1] 140 VEXT.8 Q7,Q7,Q8,#2 141 142 VMLAL.S16 Q9,D8,D0[2] 143 VMLAL.S16 Q10,D9,D1[2] 144 VEXT.8 Q8,Q8,Q15,#2 145 VMLAL.S16 Q11,D9,D0[2] 146 VMLAL.S16 Q12,D10,D1[2] 147 VEXT.8 Q4,Q4,Q5,#2 148 VMLAL.S16 Q9,D10,D2[2] 149 VMLAL.S16 Q10,D11,D3[2] 150 VMLAL.S16 Q11,D11,D2[2] 151 VMLAL.S16 Q12,D12,D3[2] 152 VEXT.8 Q5,Q5,Q6,#2 153 VMLAL.S16 Q9,D12,D4[2] 154 VMLAL.S16 Q10,D13,D5[2] 155 VMLAL.S16 Q11,D13,D4[2] 156 VMLAL.S16 Q12,D14,D5[2] 157 VEXT.8 Q6,Q6,Q7,#2 158 VMLAL.S16 Q9,D14,D6[2] 159 VMLAL.S16 Q10,D15,D7[2] 160 VMLAL.S16 Q11,D15,D6[2] 161 VMLAL.S16 Q12,D16,D7[2] 162 VEXT.8 Q7,Q7,Q8,#2 163 164 VMLAL.S16 Q9,D8,D0[3] 165 VMLAL.S16 Q10,D9,D1[3] 166 VEXT.8 Q8,Q8,Q15,#2 167 VMLAL.S16 Q11,D9,D0[3] 168 VMLAL.S16 Q12,D10,D1[3] 169 VEXT.8 Q4,Q4,Q5,#2 170 VMLAL.S16 Q9,D10,D2[3] 171 VMLAL.S16 Q10,D11,D3[3] 172 VMLAL.S16 Q11,D11,D2[3] 173 VMLAL.S16 Q12,D12,D3[3] 174 VEXT.8 Q5,Q5,Q6,#2 175 VMLAL.S16 Q9,D12,D4[3] 176 VMLAL.S16 Q10,D13,D5[3] 177 VMLAL.S16 Q11,D13,D4[3] 178 VMLAL.S16 Q12,D14,D5[3] 179 VEXT.8 Q6,Q6,Q7,#2 180 VMLAL.S16 Q9,D14,D6[3] 181 VMLAL.S16 Q10,D15,D7[3] 182 VMLAL.S16 Q11,D15,D6[3] 183 VMLAL.S16 Q12,D16,D7[3] 184 VEXT.8 Q7,Q7,Q8,#2 185 186 VMOV.S16 D8,D9 187 VEXT.8 Q8,Q8,Q15,#2 188 VMOV.S16 D9,D10 189 VADD.S32 Q9,Q9,Q10 190 VMOV.S16 D10,D11 191 VMOV.S16 D11,D12 192 VADD.S32 Q11,Q11,Q12 193 VMOV.S16 D12,D13 194 VQRSHRN.S32 D28,Q9,#15 195 VMOV.S16 D13,D14 196 VMOV.S16 D14,D15 197 VQRSHRN.S32 D29,Q11,#15 198 VMOV.S16 D15,D16 199 200 VLD1.S16 {Q8},[r4]! 201 ADD r5, r5, #8 202 CMP r5, #80 203 VST1.S16 {D28,D29},[r3]! 204 BLT LOOP_6K7K 205 206 ADD r0, r13, #160 @x + lg 207 MOV r1, r12 208 @LDR r1, [sp, #-4] @mem address 209 210 VLD1.S16 {D0, D1, D2, D3}, [r0]! 211 VLD1.S16 {D4, D5, D6, D7}, [r0]! 212 213 VST1.S16 {D0, D1, D2, D3}, [r1]! 214 VST1.S16 {D4, D5, D6}, [r1]! 215 VST1.S16 D7[0], [r1]! 216 VST1.S16 D7[1], [r1]! 217 218Filt_6k_7k_end: 219 220 ADD r13, r13, #240 221 LDMFD r13!, {r0 - r12, r15} 222 223Lable1: 224 .word fir_6k_7k 225 @ENDFUNC 226 .END 227 228 229