Home | History | Annotate | Download | only in ARMV7
      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